diff --git a/server/registration/migrations/0002_auto_20191010_0905.py b/server/registration/migrations/0002_auto_20191010_0905.py new file mode 100644 index 00000000..d946fa2e --- /dev/null +++ b/server/registration/migrations/0002_auto_20191010_0905.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.6 on 2019-10-10 09:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('registration', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='licensetype', + name='key', + field=models.CharField(max_length=128, unique=True), + ), + ] diff --git a/server/registration/models.py b/server/registration/models.py index 36c833bd..20b9684e 100644 --- a/server/registration/models.py +++ b/server/registration/models.py @@ -18,7 +18,7 @@ class LicenseType(models.Model): name = models.CharField(_('License name'), max_length=255, blank=False, null=False) for_role = models.ForeignKey(Role, blank=False, null=False, on_delete=models.CASCADE) - key = models.CharField(max_length=128, blank=False, null=False) + key = models.CharField(max_length=128, blank=False, null=False, unique=True) active = models.BooleanField(_('License active'), default=False) description = models.TextField(_('Description'), default="") diff --git a/server/registration/mutations_public.py b/server/registration/mutations_public.py index 5616deb9..29d4debb 100644 --- a/server/registration/mutations_public.py +++ b/server/registration/mutations_public.py @@ -8,12 +8,11 @@ # Created on 2019-10-08 # @author: chrigu import graphene -from django.conf import settings from graphene import relay from registration.models import License from registration.serializers import RegistrationSerializer -from users.models import User, Role, UserRole +from users.models import User, Role, UserRole, SchoolClass from users.mutations import UpdateError, FieldError @@ -51,7 +50,9 @@ class Registration(relay.ClientIDMutation): if sb_license.license_type.is_teacher_license(): teacher_role = Role.objects.get(key=Role.objects.TEACHER_KEY) UserRole.objects.get_or_create(user=user, role=teacher_role) - # create class + default_class_name = SchoolClass.generate_default_group_name() + default_class = SchoolClass.objects.create(name=default_class_name) + user.school_classes.add(default_class) else: student_role = Role.objects.get(key=Role.objects.STUDENT_KEY) UserRole.objects.get_or_create(user=user, role=student_role) diff --git a/server/registration/tests/test_registration.py b/server/registration/tests/test_registration.py index 0da5dc36..0bc7aa63 100644 --- a/server/registration/tests/test_registration.py +++ b/server/registration/tests/test_registration.py @@ -15,10 +15,10 @@ from api.schema import schema from registration.factories import LicenseTypeFactory, LicenseFactory from registration.models import License from users.managers import RoleManager -from users.models import Role, User, UserRole +from users.models import Role, User, UserRole, SchoolClass -class PasswordResetTests(TestCase): +class RegistrationTests(TestCase): def setUp(self): self.teacher_role = Role.objects.create(key=Role.objects.TEACHER_KEY, name="Teacher Role") @@ -73,9 +73,15 @@ class PasswordResetTests(TestCase): def test_user_can_register_as_teacher(self): self._assert_user_registration(0, self.email, RoleManager.TEACHER_KEY) + school_classes = SchoolClass.objects.filter(name__startswith='Meine Gruppe') + self.assertEqual(len(school_classes), 0) result = self.make_register_mutation(self.first_name, self.last_name, self.email, self.teacher_license_type.key) self.assertTrue(result.get('data').get('registration').get('success')) self._assert_user_registration(1, self.email, RoleManager.TEACHER_KEY) + school_classes = SchoolClass.objects.filter(name__startswith='Meine Gruppe') + self.assertEqual(len(school_classes), 1) + user = User.objects.get(email=self.email) + self.assertTrue(school_classes[0].is_user_in_schoolclass(user)) def test_user_can_register_as_student(self): self._assert_user_registration(0, self.email, RoleManager.STUDENT_KEY) diff --git a/server/users/managers.py b/server/users/managers.py index 6a36884e..e20312cf 100644 --- a/server/users/managers.py +++ b/server/users/managers.py @@ -89,4 +89,3 @@ class UserManager(DjangoUserManager): user.set_password(self.model.objects.make_random_password()) user.save() return user - diff --git a/server/users/models.py b/server/users/models.py index e6e93eca..805ccaa3 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -1,3 +1,5 @@ +import re + from django.contrib.auth import get_user_model from django.contrib.auth.models import AbstractUser, Permission from django.core.exceptions import ObjectDoesNotExist @@ -72,6 +74,25 @@ class SchoolClass(models.Model): def __str__(self): return 'SchoolClass {}-{}'.format(self.id, self.name) + @classmethod + def generate_default_group_name(cls): + prefix = 'Meine Gruppe' + prefix_regex = r'Meine Gruppe (\d+)' + initial_default_group = '{} 1'.format(prefix) + my_group_filter = cls.objects.filter(name__startswith=prefix).order_by('-name') + + if len(my_group_filter) == 0: + return initial_default_group + + match = re.search(prefix_regex, my_group_filter[0].name) + + if not match: + return initial_default_group + + index = int(match.group(1)) + + return '{} {}'.format(prefix, index + 1) + def is_user_in_schoolclass(self, user): return user.is_superuser or user.school_classes.filter(pk=self.id).count() > 0 diff --git a/server/users/tests/test_my_school_classes.py b/server/users/tests/test_my_school_classes.py index 0499d622..762869e7 100644 --- a/server/users/tests/test_my_school_classes.py +++ b/server/users/tests/test_my_school_classes.py @@ -17,7 +17,7 @@ from django.contrib.auth import authenticate from users.factories import SchoolClassFactory -class PasswordUpdate(TestCase): +class MySchoolClasses(TestCase): def setUp(self): self.user = UserFactory(username='aschi') self.another_user = UserFactory(username='pesche') diff --git a/server/users/tests/test_school_classes.py b/server/users/tests/test_school_classes.py new file mode 100644 index 00000000..7e9d6535 --- /dev/null +++ b/server/users/tests/test_school_classes.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# ITerativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2019 ITerativ GmbH. All rights reserved. +# +# Created on 2019-10-10 +# @author: chrigu +from django.conf import settings +# -*- coding: utf-8 -*- +# +# ITerativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2019 ITerativ GmbH. All rights reserved. +# +# Created on 2019-04-09 +# @author: chrigu +from django.test import TestCase + +from users.models import SchoolClass + + +class SchoolClasses(TestCase): + + def setUp(self): + self.prefix = 'Meine Gruppe' + + def test_default_class_name_initial(self): + class_name = SchoolClass.generate_default_group_name() + self.assertEqual('{} 1'.format(self.prefix), class_name) + + def test_default_class_name_initial_with_similar_existing(self): + SchoolClass.objects.create(name='{} abc212'.format('Meine Gruppe')) + class_name = SchoolClass.generate_default_group_name() + self.assertEqual('{} 1'.format(self.prefix), class_name) + + def test_default_class_name_if_existing(self): + SchoolClass.objects.create(name='{} 1'.format('Meine Gruppe')) + SchoolClass.objects.create(name='{} 10'.format('Meine Gruppe')) + class_name = SchoolClass.generate_default_group_name() + self.assertEqual('{} 11'.format(self.prefix), class_name)