diff --git a/rdmo/management/assets/js/components/edit/EditTask.js b/rdmo/management/assets/js/components/edit/EditTask.js index 2057562628..5caef31548 100644 --- a/rdmo/management/assets/js/components/edit/EditTask.js +++ b/rdmo/management/assets/js/components/edit/EditTask.js @@ -76,14 +76,18 @@ const EditTask = ({ config, task, elements, elementActions}) => { rows={4} onChange={updateTask} />
{gettext('Task')}{': '}
-
+
+
{{ view.title }} diff --git a/rdmo/projects/views/project.py b/rdmo/projects/views/project.py index 6bbe56fbd5..934b724cfa 100644 --- a/rdmo/projects/views/project.py +++ b/rdmo/projects/views/project.py @@ -157,7 +157,10 @@ def get_context_data(self, **kwargs): context['memberships'] = memberships.order_by('user__last_name', '-project__level') context['integrations'] = integrations.order_by('provider_key', '-project__level') context['providers'] = get_plugins('PROJECT_ISSUE_PROVIDERS') - context['issues'] = [issue for issue in project.issues.all() if issue.resolve(values)] + context['issues'] = [ + issue for issue in project.issues.order_by('-status', 'task__order', 'task__uri') if issue.resolve(values) + ] + context['views'] = project.views.order_by('order', 'uri') context['snapshots'] = project.snapshots.all() context['invites'] = project.invites.all() context['membership'] = Membership.objects.filter(project=project, user=self.request.user).first() diff --git a/rdmo/tasks/imports.py b/rdmo/tasks/imports.py index 7631d1be44..2f9ef7dca8 100644 --- a/rdmo/tasks/imports.py +++ b/rdmo/tasks/imports.py @@ -25,6 +25,8 @@ def import_task(element, save=False, user=None): set_common_fields(task, element) + task.order = element.get('order') or 0 + set_lang_field(task, 'title', element) set_lang_field(task, 'text', element) diff --git a/rdmo/tasks/migrations/0036_task_order.py b/rdmo/tasks/migrations/0036_task_order.py new file mode 100644 index 0000000000..868c80706f --- /dev/null +++ b/rdmo/tasks/migrations/0036_task_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0035_uri_path'), + ] + + operations = [ + migrations.AddField( + model_name='task', + name='order', + field=models.IntegerField(default=0, help_text='The position of this task in lists.', verbose_name='Order'), + ), + ] diff --git a/rdmo/tasks/models.py b/rdmo/tasks/models.py index eef1a0c682..0e44a3d528 100644 --- a/rdmo/tasks/models.py +++ b/rdmo/tasks/models.py @@ -42,6 +42,11 @@ class Task(TranslationMixin, models.Model): verbose_name=_('Locked'), help_text=_('Designates whether this task can be changed.') ) + order = models.IntegerField( + default=0, + verbose_name=_('Order'), + help_text=_('The position of this task in lists.') + ) catalogs = models.ManyToManyField( Catalog, blank=True, verbose_name=_('Catalogs'), diff --git a/rdmo/tasks/renderers/mixins.py b/rdmo/tasks/renderers/mixins.py index 48e879c50c..adb6d1cc9c 100644 --- a/rdmo/tasks/renderers/mixins.py +++ b/rdmo/tasks/renderers/mixins.py @@ -11,6 +11,7 @@ def render_task(self, xml, task): self.render_text_element(xml, 'uri_prefix', {}, task['uri_prefix']) self.render_text_element(xml, 'uri_path', {}, task['uri_path']) self.render_text_element(xml, 'dc:comment', {}, task['comment']) + self.render_text_element(xml, 'order', {}, task['order']) for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'title', {'lang': lang_code}, task['title_%s' % lang_code]) diff --git a/rdmo/tasks/serializers/export.py b/rdmo/tasks/serializers/export.py index 7de22136d8..8aa3a327a1 100644 --- a/rdmo/tasks/serializers/export.py +++ b/rdmo/tasks/serializers/export.py @@ -20,6 +20,7 @@ class Meta: 'uri_prefix', 'uri_path', 'comment', + 'order', 'start_attribute', 'end_attribute', 'days_before', diff --git a/rdmo/tasks/serializers/v1.py b/rdmo/tasks/serializers/v1.py index cebd38a415..424c0db487 100644 --- a/rdmo/tasks/serializers/v1.py +++ b/rdmo/tasks/serializers/v1.py @@ -21,6 +21,8 @@ class TaskSerializer(TranslationSerializerMixin, ElementModelSerializerMixin, warning = serializers.SerializerMethodField() read_only = serializers.SerializerMethodField() + condition_uris = serializers.SerializerMethodField() + projects_count = serializers.IntegerField(read_only=True) class Meta: @@ -33,6 +35,7 @@ class Meta: 'uri_path', 'comment', 'locked', + 'order', 'available', 'catalogs', 'sites', @@ -47,6 +50,7 @@ class Meta: 'text', 'warning', 'read_only', + 'condition_uris', 'projects_count', ) trans_fields = ( @@ -61,6 +65,9 @@ class Meta: 'title', ) + def get_condition_uris(self, obj): + return [condition.uri for condition in obj.conditions.all()] + class TaskIndexSerializer(serializers.ModelSerializer): diff --git a/rdmo/views/imports.py b/rdmo/views/imports.py index 7c09061035..ce7a778cc2 100644 --- a/rdmo/views/imports.py +++ b/rdmo/views/imports.py @@ -18,6 +18,7 @@ def import_view(element, save=False, user=None): set_common_fields(view, element) + view.order = element.get('order') or 0 view.template = element.get('template') set_lang_field(view, 'title', element) diff --git a/rdmo/views/migrations/0029_view_order.py b/rdmo/views/migrations/0029_view_order.py new file mode 100644 index 0000000000..84fc690d19 --- /dev/null +++ b/rdmo/views/migrations/0029_view_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('views', '0028_uri_path'), + ] + + operations = [ + migrations.AddField( + model_name='view', + name='order', + field=models.IntegerField(default=0, help_text='The position of this view in lists.', verbose_name='Order'), + ), + ] diff --git a/rdmo/views/models.py b/rdmo/views/models.py index 4f8561b7fd..2a22b9b61f 100644 --- a/rdmo/views/models.py +++ b/rdmo/views/models.py @@ -43,6 +43,11 @@ class View(models.Model, TranslationMixin): verbose_name=_('Locked'), help_text=_('Designates whether this view can be changed.') ) + order = models.IntegerField( + default=0, + verbose_name=_('Order'), + help_text=_('The position of this view in lists.') + ) catalogs = models.ManyToManyField( Catalog, blank=True, verbose_name=_('Catalogs'), diff --git a/rdmo/views/renderers/mixins.py b/rdmo/views/renderers/mixins.py index 31971975d1..f6ee263d70 100644 --- a/rdmo/views/renderers/mixins.py +++ b/rdmo/views/renderers/mixins.py @@ -11,6 +11,7 @@ def render_view(self, xml, view): self.render_text_element(xml, 'uri_prefix', {}, view['uri_prefix']) self.render_text_element(xml, 'uri_path', {}, view['uri_path']) self.render_text_element(xml, 'dc:comment', {}, view['comment']) + self.render_text_element(xml, 'order', {}, view['order']) for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'title', {'lang': lang_code}, view['title_%s' % lang_code]) diff --git a/rdmo/views/serializers/export.py b/rdmo/views/serializers/export.py index 3dc6b6ebf3..d8d2527472 100644 --- a/rdmo/views/serializers/export.py +++ b/rdmo/views/serializers/export.py @@ -16,6 +16,7 @@ class Meta: 'uri_prefix', 'uri_path', 'comment', + 'order', 'catalogs', 'template' ) diff --git a/rdmo/views/serializers/v1.py b/rdmo/views/serializers/v1.py index 5862537a29..6b07fe63de 100644 --- a/rdmo/views/serializers/v1.py +++ b/rdmo/views/serializers/v1.py @@ -46,6 +46,7 @@ class Meta: 'uri_path', 'comment', 'locked', + 'order', 'available', 'catalogs', 'sites', |