From ba81ce2215e3811ad7f325eaf74572f28de9ba68 Mon Sep 17 00:00:00 2001 From: Lorenz Padberg Date: Wed, 25 May 2022 15:40:54 +0200 Subject: [PATCH] added content structure to the circle api fields --- server/vbv_lernwelt/learnpath/models.py | 30 +++++++++++- .../vbv_lernwelt/learnpath/tests/test_api.py | 47 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 server/vbv_lernwelt/learnpath/tests/test_api.py diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index 84dd3c67..bbd4f161 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -9,6 +9,7 @@ from wagtail.api import APIField from vbv_lernwelt.learnpath.models_competences import * from vbv_lernwelt.learnpath.models_learning_unit_content import WebBasedTrainingBlock, VideoBlock from grapple.helpers import register_query_field +from collections import OrderedDict import graphene from grapple.models import ( @@ -100,9 +101,35 @@ class Circle(Page, Orderable): api_fields = [ APIField('title'), APIField('description'), - APIField('learning_sequences'), + APIField('topic'), + APIField('content_structure'), ] + @property + def content_structure(self): + learning_sequences = LearningSequence.objects.filter(circle_id=self.id).values() + learning_packages = LearningPackage.objects.filter(learning_sequence__circle_id=self.id).values() + learning_units = LearningUnit.objects.filter(learning_package__learning_sequence__circle_id=self.id).values('learning_package_id', 'title') + + content = OrderedDict() + content['learning_sequences'] = [] + + for learning_sequence in learning_sequences: + this_learning_packages = [] + related_learning_packages = [lp for lp in learning_packages if lp['learning_sequence_id'] == learning_sequence['id']] + for learning_package in related_learning_packages: + related_learning_units = [lu for lu in learning_units if + lu['learning_package_id'] == learning_package['id']] + this_learning_units = [learning_unit for learning_unit in related_learning_units] + learning_package['learning_units'] = this_learning_units + this_learning_packages.append(learning_package) + learning_sequence['learning_packages'] = this_learning_packages + content['learning_sequences'].append(learning_sequence) + + return content + + + def full_clean(self, *args, **kwargs): self.slug = find_available_slug(Circle, slugify(self.title, allow_unicode=True)) @@ -149,6 +176,7 @@ class LearningSequence(Orderable): ] + class Meta: verbose_name = "Learning Sequence" diff --git a/server/vbv_lernwelt/learnpath/tests/test_api.py b/server/vbv_lernwelt/learnpath/tests/test_api.py new file mode 100644 index 00000000..05f08641 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/tests/test_api.py @@ -0,0 +1,47 @@ +from django.test import TestCase + +from rest_framework.test import APITestCase + +from vbv_lernwelt.core.admin import User +from vbv_lernwelt.core.create_default_users import create_default_users +from vbv_lernwelt.learnpath.models import LearningPath, Circle +from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path +from vbv_lernwelt.learnpath.tests.test_create_default_learning_path import create_locales_for_wagtail + + +class TestRetrieveLearingPathContents(APITestCase): + @classmethod + def setUpClass(cls) -> None: + super(TestRetrieveLearingPathContents, cls).setUpClass() + create_locales_for_wagtail() + create_default_learning_path() + create_default_users() + + def setUp(self) -> None: + qs = LearningPath.objects.filter(title="Versicherungsvermittler/in") + self.credentials = { + 'username': 'admin', + 'password': 'admin'} + + user = User.objects.get(username='admin') + self.client.force_authenticate(user=user) + self.client.post('/login/', self.credentials, follow=True) + + def test_get_circle(self): + circle = Circle.objects.get(slug='analyse') + response = self.client.get(f'/wagtailapi/v2/pages/{circle.id}/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data['title'], 'Analyse') + + def test_get_circle_has_learning_sequences(self): + circle = Circle.objects.get(slug='analyse') + response = self.client.get(f'/wagtailapi/v2/pages/{circle.id}/') + self.assertTrue(len(response.data['learning_sequences']) > 2) + self.assertEqual(response.data['learning_sequences'][0]['title'], 'Starten') + + + def test_get_circle_has_learning_sequences_learningpackages(self): + circle = Circle.objects.get(slug='analyse') + response = self.client.get(f'/wagtailapi/v2/pages/{circle.id}/') + self.assertTrue(len(response.data['learning_sequences'][0]['learnging_packages']) > 1) + self.assertTrue(response.data['learning_sequences'][0]['learnging_packages'][0]['title'])