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')
+