From e8209a89e99b2825236d797938153eb801242ce8 Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Wed, 7 Oct 2020 11:00:59 +0100 Subject: [PATCH 1/7] #1851 adds drag and drop ordering for review form elements --- src/review/models.py | 3 ++ src/review/urls.py | 3 ++ src/review/views.py | 27 ++++++++++- src/templates/admin/core/kanban.html | 2 +- .../admin/elements/review/element_form.html | 4 +- .../review/manager/edit_review_form.html | 48 ++++++++++++++----- src/utils/shared.py | 17 +++++++ 7 files changed, 89 insertions(+), 15 deletions(-) diff --git a/src/review/models.py b/src/review/models.py index 59503667eb..6f482d3d9e 100755 --- a/src/review/models.py +++ b/src/review/models.py @@ -206,6 +206,9 @@ class ReviewFormElement(models.Model): 'to the author automatically, if false it will' 'be hidden to the author by default.') + class Meta: + ordering = ('order', 'name') + def __str__(self): return "Element: {0} ({1})".format(self.name, self.kind) diff --git a/src/review/urls.py b/src/review/urls.py index c01ae37b07..b67e207b41 100755 --- a/src/review/urls.py +++ b/src/review/urls.py @@ -122,6 +122,9 @@ url(r'^manager/form/(?P\d+)/preview/$', views.preview_form, name='preview_form'), + url(r'^manager/form/(?P\d+)/order_elements/$', + views.order_review_elements, + name='order_review_elements'), url(r'^manager/form/(?P\d+)/element/(?P\d+)/$', views.edit_review_form, name='edit_review_form_element'), diff --git a/src/review/views.py b/src/review/views.py index 9c45c130f2..34cdcd8647 100755 --- a/src/review/views.py +++ b/src/review/views.py @@ -14,9 +14,9 @@ from django.utils import timezone from django.http import Http404 from django.core.exceptions import PermissionDenied -from django.contrib.admin.views.decorators import staff_member_required from django.conf import settings from django.views.decorators.http import require_POST +from django.http import HttpResponse from core import models as core_models, files, forms as core_forms from events import logic as event_logic @@ -30,6 +30,7 @@ ) from submission import models as submission_models, forms as submission_forms from utils import models as util_models, ithenticate +from utils import shared @senior_editor_user_required @@ -2153,6 +2154,30 @@ def preview_form(request, form_id): return render(request, template, context) +@require_POST +@senior_editor_user_required +def order_review_elements(request, form_id): + """ + Reorders Review Form elements. + :param request: HttpRequest object + :param form_id: ReviewForm PK + """ + form = get_object_or_404( + models.ReviewForm, + pk=form_id, + journal=request.journal, + ) + + shared.set_order( + form.elements.all(), + 'order', + request.POST.getlist('element[]'), + ) + + return HttpResponse('Ok') + + + @reviewer_user_for_assignment_required def hypothesis_review(request, assignment_id): """ diff --git a/src/templates/admin/core/kanban.html b/src/templates/admin/core/kanban.html index ec592d5410..1d9bab5411 100644 --- a/src/templates/admin/core/kanban.html +++ b/src/templates/admin/core/kanban.html @@ -1,5 +1,5 @@ {% extends "admin/core/base.html" %} -{% load static from staticfiles %} +`{% load static from staticfiles %}` {% load article %} {% load dict %} diff --git a/src/templates/admin/elements/review/element_form.html b/src/templates/admin/elements/review/element_form.html index c1047567ff..0803f0de29 100644 --- a/src/templates/admin/elements/review/element_form.html +++ b/src/templates/admin/elements/review/element_form.html @@ -15,7 +15,7 @@

{% if modal %} Edit Element{% else %} - + \ No newline at end of file diff --git a/src/templates/admin/review/manager/edit_review_form.html b/src/templates/admin/review/manager/edit_review_form.html index 7b19b13c84..b22860a124 100644 --- a/src/templates/admin/review/manager/edit_review_form.html +++ b/src/templates/admin/review/manager/edit_review_form.html @@ -1,5 +1,6 @@ {% extends "admin/core/base.html" %} {% load foundation %} +{% load static from staticfiles %} {% block title %}Review Forms{% endblock title %} {% block title-section %}Review Forms{% endblock %} @@ -22,20 +23,26 @@

Form's Elements

Add Element
-
    +
    {% csrf_token %} - {% for element in edit_form.elements.all %} -
  • - {{ element.name }} -
    - - -
    -
  • - {% endfor %} +
      + {% for element in edit_form.elements.all %} +
    • +   + {{ element.name }} +
      + + +
      +
    • + {% endfor %} +
    -
+
@@ -62,5 +69,24 @@

Edit Form Detail

{% block js %} {% if modal %} {% include "admin/elements/open_modal.html" with target=modal %} + {% else %} + + + {% endif %} + {% endblock %} \ No newline at end of file diff --git a/src/utils/shared.py b/src/utils/shared.py index 7fe19f2016..facb0ea364 100755 --- a/src/utils/shared.py +++ b/src/utils/shared.py @@ -69,3 +69,20 @@ def yes_or_no(question): return True if reply[0] == 'n': return False + + +def set_order(objects, order_attr_name, pk_list): + """ + A generic implementation of model object ordering. + :param: objects: a queryset or list of model objects + :param: order_attr_name: string the model object's order attr name + :param: pk_list: list of object PKs in order + """ + ids = [int(_id) for _id in pk_list] + + for _object in objects: + order = ids.index(_object.pk) + setattr(_object, order_attr_name, order) + _object.save() + + return objects From b9b9eee547482f2a050d383f0d09e39caaa7e497 Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Wed, 7 Oct 2020 11:02:58 +0100 Subject: [PATCH 2/7] #1851 adds meta migration --- .../migrations/0008_auto_20201007_1002.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/review/migrations/0008_auto_20201007_1002.py diff --git a/src/review/migrations/0008_auto_20201007_1002.py b/src/review/migrations/0008_auto_20201007_1002.py new file mode 100644 index 0000000000..35edb5999f --- /dev/null +++ b/src/review/migrations/0008_auto_20201007_1002.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-10-07 10:02 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('review', '0007_null_help_text'), + ] + + operations = [ + migrations.AlterModelOptions( + name='reviewformelement', + options={'ordering': ('order', 'name')}, + ), + ] From d649e818a5896f16e43eb62bd2836c5adc10ac71 Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Wed, 7 Oct 2020 11:05:17 +0100 Subject: [PATCH 3/7] #1851 moves utils.shared import to line above --- src/review/views.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/review/views.py b/src/review/views.py index 34cdcd8647..2151944a5e 100755 --- a/src/review/views.py +++ b/src/review/views.py @@ -29,8 +29,7 @@ section_editor_draft_decisions, article_stage_review_required ) from submission import models as submission_models, forms as submission_forms -from utils import models as util_models, ithenticate -from utils import shared +from utils import models as util_models, ithenticate, shared @senior_editor_user_required From ac3dc2448cd057a6511735a3c425cfc0a85568fa Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Wed, 7 Oct 2020 11:12:18 +0100 Subject: [PATCH 4/7] #1851 added generic sortable template. --- src/templates/admin/elements/sortable.html | 17 ++++++++++++++++ .../review/manager/edit_review_form.html | 20 ++----------------- 2 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 src/templates/admin/elements/sortable.html diff --git a/src/templates/admin/elements/sortable.html b/src/templates/admin/elements/sortable.html new file mode 100644 index 0000000000..12adf786ef --- /dev/null +++ b/src/templates/admin/elements/sortable.html @@ -0,0 +1,17 @@ +{% load static from staticfiles %} + + + + \ No newline at end of file diff --git a/src/templates/admin/review/manager/edit_review_form.html b/src/templates/admin/review/manager/edit_review_form.html index b22860a124..419cd3bf43 100644 --- a/src/templates/admin/review/manager/edit_review_form.html +++ b/src/templates/admin/review/manager/edit_review_form.html @@ -1,6 +1,5 @@ {% extends "admin/core/base.html" %} {% load foundation %} -{% load static from staticfiles %} {% block title %}Review Forms{% endblock title %} {% block title-section %}Review Forms{% endblock %} @@ -70,23 +69,8 @@

Edit Form Detail

{% if modal %} {% include "admin/elements/open_modal.html" with target=modal %} {% else %} - - - + {% url 'order_review_elements' edit_form.pk as sort_url %} + {% include "admin/elements/sortable.html" with sort_url=sort_url %} {% endif %} {% endblock %} \ No newline at end of file From ca1364c8865031d6f2c256797e7240a70850648e Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Thu, 8 Oct 2020 12:42:52 +0100 Subject: [PATCH 5/7] #1851 remove backticks --- src/templates/admin/core/kanban.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/admin/core/kanban.html b/src/templates/admin/core/kanban.html index 1d9bab5411..ec592d5410 100644 --- a/src/templates/admin/core/kanban.html +++ b/src/templates/admin/core/kanban.html @@ -1,5 +1,5 @@ {% extends "admin/core/base.html" %} -`{% load static from staticfiles %}` +{% load static from staticfiles %} {% load article %} {% load dict %} From 818a82d03445b47c0187c5a1f8e30ac075f5206b Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Thu, 8 Oct 2020 12:44:07 +0100 Subject: [PATCH 6/7] #1851 PEP8-ify utils.shared.set_order --- src/utils/shared.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/utils/shared.py b/src/utils/shared.py index facb0ea364..6a81038eb5 100755 --- a/src/utils/shared.py +++ b/src/utils/shared.py @@ -78,11 +78,11 @@ def set_order(objects, order_attr_name, pk_list): :param: order_attr_name: string the model object's order attr name :param: pk_list: list of object PKs in order """ - ids = [int(_id) for _id in pk_list] + ids = [int(id_) for id_ in pk_list] - for _object in objects: - order = ids.index(_object.pk) - setattr(_object, order_attr_name, order) - _object.save() + for object_ in objects: + order = ids.index(object_.pk) + setattr(object_, order_attr_name, order) + object_.save() return objects From e8920fee323fb808319c1f22e2d5b70671046504 Mon Sep 17 00:00:00 2001 From: Andy Byers Date: Thu, 8 Oct 2020 13:09:50 +0100 Subject: [PATCH 7/7] #1851 regenerated migration --- ...uto_20201007_1002.py => 0009_review_form_element_order.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/review/migrations/{0008_auto_20201007_1002.py => 0009_review_form_element_order.py} (77%) diff --git a/src/review/migrations/0008_auto_20201007_1002.py b/src/review/migrations/0009_review_form_element_order.py similarity index 77% rename from src/review/migrations/0008_auto_20201007_1002.py rename to src/review/migrations/0009_review_form_element_order.py index 35edb5999f..92cc772b6c 100644 --- a/src/review/migrations/0008_auto_20201007_1002.py +++ b/src/review/migrations/0009_review_form_element_order.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2020-10-07 10:02 +# Generated by Django 1.11.29 on 2020-10-08 12:08 from __future__ import unicode_literals from django.db import migrations @@ -8,7 +8,7 @@ class Migration(migrations.Migration): dependencies = [ - ('review', '0007_null_help_text'), + ('review', '0008_reviewform_deleted'), ] operations = [