From af71a5a28288f7fd6175ff3ed053aef83a1c3220 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 30 Sep 2020 17:14:54 +0200 Subject: [PATCH] Add objective ordering --- .../components/objective-groups/Objective.vue | 1 - .../migrations/0010_auto_20200930_1323.py | 23 +++++++ server/objectives/models.py | 3 + .../objectives/tests/test_objective_order.py | 66 +++++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 server/objectives/migrations/0010_auto_20200930_1323.py create mode 100644 server/objectives/tests/test_objective_order.py diff --git a/client/src/components/objective-groups/Objective.vue b/client/src/components/objective-groups/Objective.vue index ff0a720c..cc9a625e 100644 --- a/client/src/components/objective-groups/Objective.vue +++ b/client/src/components/objective-groups/Objective.vue @@ -20,7 +20,6 @@
{{ objective.text }}
- diff --git a/server/objectives/migrations/0010_auto_20200930_1323.py b/server/objectives/migrations/0010_auto_20200930_1323.py new file mode 100644 index 00000000..a37d4cee --- /dev/null +++ b/server/objectives/migrations/0010_auto_20200930_1323.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.14 on 2020-09-30 13:23 + +from django.db import migrations, models +import django.db.models.expressions + + +class Migration(migrations.Migration): + + dependencies = [ + ('objectives', '0009_auto_20200928_1547'), + ] + + operations = [ + migrations.AlterModelOptions( + name='objective', + options={'ordering': [django.db.models.expressions.OrderBy(django.db.models.expressions.F('owner'), nulls_first=True), django.db.models.expressions.OrderBy(django.db.models.expressions.F('order'), nulls_last=True)], 'verbose_name': 'Lernziel', 'verbose_name_plural': 'Lernziele'}, + ), + migrations.AddField( + model_name='objective', + name='order', + field=models.IntegerField(null=True), + ), + ] diff --git a/server/objectives/models.py b/server/objectives/models.py index c955566c..c01df65b 100644 --- a/server/objectives/models.py +++ b/server/objectives/models.py @@ -1,5 +1,6 @@ from django.contrib.auth import get_user_model from django.db import models +from django.db.models import F from books.models import Module from users.models import SchoolClass @@ -36,6 +37,7 @@ class Objective(models.Model): class Meta: verbose_name = 'Lernziel' verbose_name_plural = 'Lernziele' + ordering = [F('owner').asc(nulls_first=True), F('order').asc(nulls_last=True)] text = models.CharField('text', blank=True, null=False, max_length=255) group = models.ForeignKey(ObjectiveGroup, blank=False, null=False, on_delete=models.CASCADE, @@ -43,6 +45,7 @@ class Objective(models.Model): owner = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) hidden_for = models.ManyToManyField(SchoolClass, related_name='hidden_objectives', blank=True) visible_for = models.ManyToManyField(SchoolClass, related_name='visible_objectives', blank=True) + order = models.IntegerField(null=True) def __str__(self): return 'Objective {}-{}'.format(self.id, self.text) diff --git a/server/objectives/tests/test_objective_order.py b/server/objectives/tests/test_objective_order.py new file mode 100644 index 00000000..868cce5e --- /dev/null +++ b/server/objectives/tests/test_objective_order.py @@ -0,0 +1,66 @@ +from django.test import TestCase, RequestFactory +from graphene.test import Client +from graphql_relay import to_global_id + +from api.schema import schema +from api.utils import get_object, get_graphql_mutation +from books.models import ContentBlock, Chapter +from books.factories import ModuleFactory +from core.factories import UserFactory +from core.management.commands import create_teacher +from notes.factories import ChapterBookmarkFactory, ModuleBookmarkFactory +from objectives.factories import ObjectiveGroupFactory +from objectives.models import Objective +from users.models import User +from users.services import create_users + + +class ObjectiveOrderTestCase(TestCase): + def setUp(self): + create_users() + + self.user = user = User.objects.get(username='teacher') + + self.objective_group = ObjectiveGroupFactory(owner=None) + + + request = RequestFactory().get('/') + request.user = user + + self.client = Client(schema=schema, context_value=request) + + Objective.objects.create(owner=None, text='first', group=self.objective_group, order=0) + Objective.objects.create(owner=None, text='second', group=self.objective_group, order=1) + Objective.objects.create(owner=None, text='third', group=self.objective_group) + Objective.objects.create(owner=user, text='fourth', group=self.objective_group) + + def test_objective_order(self): + query = """ + query ObjectiveGroupQuery($id: ID!) { + objectiveGroup(id: $id) { + objectives { + edges { + node { + id + text + } + } + } + } + } + """ + + result = self.client.execute(query, variables={ + 'id': to_global_id('ObjectiveGroupNode', self.objective_group.pk) + }) + + self.assertIsNone(result.get('errors')) + objective_nodes = result.get('data').get('objectiveGroup').get('objectives').get('edges') + + objective1, objective2, objective3, objective4 = [node['node'] for node in objective_nodes] + + self.assertEqual(objective1.get('text'), 'first') + self.assertEqual(objective2.get('text'), 'second') + self.assertEqual(objective3.get('text'), 'third') + self.assertEqual(objective4.get('text'), 'fourth') +