From 4a08a4ef405e451db0a8251c05a193874b64cddb Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Mon, 1 Apr 2019 22:09:48 -0700 Subject: basic release editing --- python/fatcat_web/forms.py | 37 +++- python/fatcat_web/routes.py | 50 ++++- python/fatcat_web/templates/edit_macros.html | 36 ++++ python/fatcat_web/templates/release_create.html | 254 +----------------------- python/fatcat_web/templates/release_edit.html | 231 +++++++++++++++++++++ 5 files changed, 345 insertions(+), 263 deletions(-) create mode 100644 python/fatcat_web/templates/edit_macros.html create mode 100644 python/fatcat_web/templates/release_edit.html (limited to 'python') diff --git a/python/fatcat_web/forms.py b/python/fatcat_web/forms.py index baff62d7..632e36c6 100644 --- a/python/fatcat_web/forms.py +++ b/python/fatcat_web/forms.py @@ -6,7 +6,7 @@ but can't find one that is actually maintained. from flask_wtf import FlaskForm from wtforms import SelectField, DateField, StringField, IntegerField, \ - FormField, FieldList, validators + HiddenField, FormField, FieldList, validators from fatcat_client import ContainerEntity, CreatorEntity, FileEntity, \ ReleaseEntity, ReleaseContrib @@ -51,6 +51,7 @@ class ReleaseContribForm(FlaskForm): #given_name #creator_id (?) #orcid (for match?) + prev_index = HiddenField('prev_revision index', default=None) raw_name = StringField('Display Name', [validators.DataRequired()]) role = SelectField( @@ -108,7 +109,14 @@ class ReleaseEntityForm(EntityEditForm): """ ref = ReleaseEntityForm() for simple_attr in RELEASE_SIMPLE_ATTRS: - setattr(ref, simple_attr, getattr(re, simple_attr)) + a = getattr(ref, simple_attr) + a.data = getattr(re, simple_attr) + for i, c in enumerate(re.contribs): + rcf = ReleaseContribForm() + rcf.prev_index = i + rcf.role = c.role + rcf.raw_name = c.raw_name + ref.contribs.append_entry(rcf) return ref def to_entity(self): @@ -130,13 +138,26 @@ class ReleaseEntityForm(EntityEditForm): if a == '': a = None setattr(re, simple_attr, a) - # TODO: don't update authors unless necessary! - re.contribs = [] + # bunch of complexity here to preserve old contrib metadata (eg, + # affiliation and extra) not included in current forms + # TODO: this may be broken; either way needs tests + if re.contribs: + old_contribs = re.contribs.copy() + re.contribs = [] + else: + old_contribs = [] + re.contribs = [] for c in self.contribs: - re.contribs.append(ReleaseContrib( - role=c.role.data or None, - raw_name=c.raw_name.data or None, - )) + if c.prev_index.data not in ('', None): + rc = old_contribs[int(c.prev_index.data)] + rc.role = c.role.data or None + rc.raw_name = c.raw_name.data or None + else: + rc = ReleaseContrib( + role=c.role.data or None, + raw_name=c.raw_name.data or None, + ) + re.contribs.append(rc) if self.edit_description.data: re.edit_extra = dict(description=self.edit_description.data) diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py index eb62d338..118f402b 100644 --- a/python/fatcat_web/routes.py +++ b/python/fatcat_web/routes.py @@ -325,7 +325,7 @@ def release_create(): user_api = auth_api(session['api_token']) if form.editgroup_id.data: # TODO: error handling - eg = api.get_editgroup(form.editgroup_id.data) + eg = user_api.get_editgroup(form.editgroup_id.data) else: # if no editgroup, create one from description eg = user_api.create_editgroup( @@ -345,8 +345,9 @@ def release_create(): print("didn't validate...") elif len(form.contribs) == 0: form.contribs.append_entry() - # TODO: check for editgroup in session - editgroup_id = session.get('active_editgroup_id', None) + if not form.is_submitted(): + editgroup_id = session.get('active_editgroup_id', None) + form.editgroup_id.data = editgroup_id return render_template('release_create.html', form=form, editgroup_id=editgroup_id) @@ -363,13 +364,50 @@ def release_history(ident): entity=entity, history=history) -@app.route('/release//edit', methods=['GET']) -def release_edit_view(ident): +# XXX: figure out CSRF stuff for local dev +@login_required +@app.csrf.exempt +@app.route('/release//edit', methods=['GET', 'POST']) +def release_edit(ident): + # TODO: prev_rev interlock + # TODO: factor out editgroup active/creation stuff try: entity = api.get_release(ident) except ApiException as ae: abort(ae.status) - return render_template('entity_edit.html') + form = ReleaseEntityForm(csrf_enabled=False) # XXX: + if form.is_submitted(): + if form.validate_on_submit(): + # API on behalf of user + user_api = auth_api(session['api_token']) + if form.editgroup_id.data: + # TODO: error handling + eg = user_api.get_editgroup(form.editgroup_id.data) + else: + # if no editgroup, create one from description + eg = user_api.create_editgroup( + Editgroup(description=form.editgroup_description.data or None)) + # set this session editgroup_id + session['active_editgroup_id'] = eg.editgroup_id + print(eg.editgroup_id) # XXX: debug + flash('Started new editgroup {}' \ + .format(eg.editgroup_id, eg.editgroup_id)) + # all the tricky logic is in the update method + form.update_entity(entity) + edit = user_api.update_release(entity.ident, entity, + editgroup_id=eg.editgroup_id) + # redirect to release revision + # TODO: release_rev_view + return redirect('/release/{}'.format(edit.ident)) + elif form.errors: + print("user form errors (didn't validate): {}".format(form.errors)) + else: + form = ReleaseEntityForm.from_entity(entity) + if not form.is_submitted(): + editgroup_id = session.get('active_editgroup_id', None) + form.editgroup_id.data = editgroup_id + return render_template('release_edit.html', + form=form, editgroup_id=editgroup_id, entity=entity) @app.route('/release/', methods=['GET']) def release_view(ident): diff --git a/python/fatcat_web/templates/edit_macros.html b/python/fatcat_web/templates/edit_macros.html new file mode 100644 index 00000000..ad563066 --- /dev/null +++ b/python/fatcat_web/templates/edit_macros.html @@ -0,0 +1,36 @@ + +{% macro form_field_errors(field) -%} + {% if field.errors %} +
+ {% for err in field.errors %} + {{ err }} + {% endfor %} +
+ {% endif %} +{%- endmacro %} + +{% macro form_field_basic(field, div_classes="") -%} +
+ {{ field.label }} + {{ field() }} + {{ form_field_errors(field) }} +
+{%- endmacro %} + +{% macro form_field_inline(field, div_classes="") -%} +
+
+
+ {{ field.label }} +
+
+
+
+ {{ field() }} + {{ form_field_errors(field) }} +
+
+
+
+
+{%- endmacro %} diff --git a/python/fatcat_web/templates/release_create.html b/python/fatcat_web/templates/release_create.html index 7ede5dfd..5ea3470d 100644 --- a/python/fatcat_web/templates/release_create.html +++ b/python/fatcat_web/templates/release_create.html @@ -1,260 +1,16 @@ -{% extends "base.html" %} +{% extends "release_edit.html" %} -{% macro form_field_errors(field) -%} - {% if field.errors %} -
- {% for err in field.errors %} - {{ err }} - {% endfor %} -
- {% endif %} -{%- endmacro %} - -{% macro form_field_basic(field, div_classes="") -%} -
- {{ field.label }} - {{ field() }} - {{ form_field_errors(field) }} -
-{%- endmacro %} - -{% macro form_field_inline(field, div_classes="") -%} -
-
-
- {{ field.label }} -
-
-
-
- {{ field() }} - {{ form_field_errors(field) }} -
-
-
-
-
-{%- endmacro %} - -{% block body %} +{% block edit_form_prefix %}

Create New Release Entity

+
+{% endblock %} - - {{ form.hidden_tag() }} - -
-
-
-

Editgroup Meta

-
-
- {% if editgroup_id %} -

You have an editgroup in progress, and this edit will be included by - default. You can override this below. - {% else %} -

No existing editgroup is in progress (or at least, not is selected). - An existing ID can be pasted in, or if you leave that blank but give a - description, a new editgroup will be created for this edit. - {% endif %} - {{ form_field_inline(form.editgroup_id) }} - {{ form_field_inline(form.editgroup_description) }} -

-
- -
-

The Basics

-
-
-
-
- {{ form_field_basic(form.release_type, "required") }} - {{ form_field_basic(form.release_status) }} -
-
-
-
- - {{ form_field_inline(form.title, "required") }} - {{ form_field_inline(form.original_title) }} - {{ form_field_inline(form.work_id) }} - {{ form_field_inline(form.release_date) }} -
-
-
-
- {{ form_field_basic(form.language) }} - {{ form_field_basic(form.license_slug) }} -
-
-
-
- -
-

Contributors

-
- {% for cform in form.contribs %} -
-
- -
-
-
- {{ cform.role }} -
-
-
-
- {{ cform.raw_name}} -
-
-
- -
-
- {% endfor %} -
-
- -
- -
-

Identifers

-
- {{ form_field_inline(form.doi) }} - {{ form_field_inline(form.wikidata_qid) }} - {{ form_field_inline(form.isbn13) }} -
-
-
-
- {{ form_field_basic(form.pmid) }} - {{ form_field_basic(form.pmcid) }} -
-
-
-
- -
-

Container

-
- {{ form_field_inline(form.container_id) }} - {{ form_field_inline(form.publisher) }} -
-
-
-
-
- {{ form_field_basic(form.pages) }} - {{ form_field_basic(form.volume) }} - {{ form_field_basic(form.issue) }} -
-
-
-
- -

-

Submit

- {{ form_field_basic(form.edit_description) }} - This description will be attached to this specific action, not to the - editgroup as a whole. +{% block edit_form_suffix %}

-
-
{% endblock %} -{% block postscript %} - - -{% endblock %} diff --git a/python/fatcat_web/templates/release_edit.html b/python/fatcat_web/templates/release_edit.html new file mode 100644 index 00000000..867ae665 --- /dev/null +++ b/python/fatcat_web/templates/release_edit.html @@ -0,0 +1,231 @@ +{% import "edit_macros.html" as edit_macros %} +{% extends "base.html" %} + +{% block body %} +{% block edit_form_prefix %} +
+

Edit Release Entity

+ +
+{% endblock %} + {{ form.hidden_tag() }} + +
+
+
+

Editgroup Meta

+
+
+ {% if editgroup_id %} +

You have an editgroup in progress, and this edit will be included by + default. You can override this below. + {% else %} +

No existing editgroup is in progress (or at least, not is selected). + An existing ID can be pasted in, or if you leave that blank but give a + description, a new editgroup will be created for this edit. + {% endif %} + {{ edit_macros.form_field_inline(form.editgroup_id) }} + {{ edit_macros.form_field_inline(form.editgroup_description) }} +

+
+ +
+

The Basics

+
+
+
+
+ {{ edit_macros.form_field_basic(form.release_type, "required") }} + {{ edit_macros.form_field_basic(form.release_status) }} +
+
+
+
+ + {{ edit_macros.form_field_inline(form.title, "required") }} + {{ edit_macros.form_field_inline(form.original_title) }} + {{ edit_macros.form_field_inline(form.work_id) }} + {{ edit_macros.form_field_inline(form.release_date) }} +
+
+
+
+ {{ edit_macros.form_field_basic(form.language) }} + {{ edit_macros.form_field_basic(form.license_slug) }} +
+
+
+
+ +
+

Contributors

+
+ {% for cform in form.contribs %} +
+ {{ cform.hidden_tag() }} +
+ +
+
+
+ {{ cform.role() }} +
+
+
+
+ {{ cform.raw_name() }} +
+
+
+ +
+
+ {% endfor %} +
+
+ +
+ +
+

Identifers

+
+ {{ edit_macros.form_field_inline(form.doi) }} + {{ edit_macros.form_field_inline(form.wikidata_qid) }} + {{ edit_macros.form_field_inline(form.isbn13) }} +
+
+
+
+ {{ edit_macros.form_field_basic(form.pmid) }} + {{ edit_macros.form_field_basic(form.pmcid) }} +
+
+
+
+ +
+

Container

+
+ {{ edit_macros.form_field_inline(form.container_id) }} + {{ edit_macros.form_field_inline(form.publisher) }} +
+
+
+
+
+ {{ edit_macros.form_field_basic(form.pages) }} + {{ edit_macros.form_field_basic(form.volume) }} + {{ edit_macros.form_field_basic(form.issue) }} +
+
+
+
+ +

+

Submit

+ {{ edit_macros.form_field_basic(form.edit_description) }} + This description will be attached to this specific action, not to the + editgroup as a whole. +{% block edit_form_suffix %} +

+ +
+
+{% endblock %} +{% endblock %} + +{% block postscript %} + + +{% endblock %} -- cgit v1.2.3