Add objective ordering
This commit is contained in:
parent
76b14e3cc8
commit
af71a5a282
|
|
@ -20,7 +20,6 @@
|
||||||
<div>
|
<div>
|
||||||
{{ objective.text }}
|
{{ objective.text }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import F
|
||||||
|
|
||||||
from books.models import Module
|
from books.models import Module
|
||||||
from users.models import SchoolClass
|
from users.models import SchoolClass
|
||||||
|
|
@ -36,6 +37,7 @@ class Objective(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'Lernziel'
|
verbose_name = 'Lernziel'
|
||||||
verbose_name_plural = 'Lernziele'
|
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)
|
text = models.CharField('text', blank=True, null=False, max_length=255)
|
||||||
group = models.ForeignKey(ObjectiveGroup, blank=False, null=False, on_delete=models.CASCADE,
|
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)
|
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)
|
hidden_for = models.ManyToManyField(SchoolClass, related_name='hidden_objectives', blank=True)
|
||||||
visible_for = models.ManyToManyField(SchoolClass, related_name='visible_objectives', blank=True)
|
visible_for = models.ManyToManyField(SchoolClass, related_name='visible_objectives', blank=True)
|
||||||
|
order = models.IntegerField(null=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return 'Objective {}-{}'.format(self.id, self.text)
|
return 'Objective {}-{}'.format(self.id, self.text)
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
||||||
Loading…
Reference in New Issue