diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..90a8ee3 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../../../:\Users\ilvsl\evgen-app\evg-app-back\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/evg-app-back.iml b/.idea/evg-app-back.iml new file mode 100644 index 0000000..fc2d476 --- /dev/null +++ b/.idea/evg-app-back.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..844fbd2 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9d5365a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6533fd5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "C:\\Users\\ilvsl\\AppData\\Local\\Microsoft\\WindowsApps\\python.exe" +} \ No newline at end of file diff --git a/evgenApp/__pycache__/__init__.cpython-37.pyc b/evgenApp/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..b27fd28 Binary files /dev/null and b/evgenApp/__pycache__/__init__.cpython-37.pyc differ diff --git a/evgenApp/__pycache__/schema.cpython-37.pyc b/evgenApp/__pycache__/schema.cpython-37.pyc new file mode 100644 index 0000000..782f0d6 Binary files /dev/null and b/evgenApp/__pycache__/schema.cpython-37.pyc differ diff --git a/evgenApp/__pycache__/settings.cpython-37.pyc b/evgenApp/__pycache__/settings.cpython-37.pyc new file mode 100644 index 0000000..28e9ca8 Binary files /dev/null and b/evgenApp/__pycache__/settings.cpython-37.pyc differ diff --git a/evgenApp/__pycache__/urls.cpython-37.pyc b/evgenApp/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000..14a7ae6 Binary files /dev/null and b/evgenApp/__pycache__/urls.cpython-37.pyc differ diff --git a/evgenApp/__pycache__/wsgi.cpython-37.pyc b/evgenApp/__pycache__/wsgi.cpython-37.pyc new file mode 100644 index 0000000..c02eb4e Binary files /dev/null and b/evgenApp/__pycache__/wsgi.cpython-37.pyc differ diff --git a/evgenApp/schema.py b/evgenApp/schema.py index 67e2ae2..83a5b64 100644 --- a/evgenApp/schema.py +++ b/evgenApp/schema.py @@ -1,11 +1,15 @@ import graphene import users.schema import organisations.schema +import lessons.schema +import hyperlinks.schema -class Query(users.schema.Query, organisations.schema.Query, graphene.ObjectType): +class Query(users.schema.Query, organisations.schema.Query, + lessons.schema.Query, hyperlinks.schema.Query, graphene.ObjectType): pass -class Mutation(users.schema.Mutation, organisations.schema.Mutation, graphene.ObjectType): +class Mutation(users.schema.Mutation, organisations.schema.Mutation, + lessons.schema.Mutation, hyperlinks.schema.Mutation, graphene.ObjectType): pass diff --git a/evgenApp/settings.py b/evgenApp/settings.py index e32828a..584783f 100644 --- a/evgenApp/settings.py +++ b/evgenApp/settings.py @@ -39,9 +39,11 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django_filters', 'users', 'organisations', - 'lessons' + 'lessons', + 'hyperlinks' ] GRAPHENE = { 'SCHEMA': 'evgenApp.schema.schema', diff --git a/hyperlinks/__init__.py b/hyperlinks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hyperlinks/__pycache__/__init__.cpython-37.pyc b/hyperlinks/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..e88e80a Binary files /dev/null and b/hyperlinks/__pycache__/__init__.cpython-37.pyc differ diff --git a/hyperlinks/__pycache__/admin.cpython-37.pyc b/hyperlinks/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000..87221ba Binary files /dev/null and b/hyperlinks/__pycache__/admin.cpython-37.pyc differ diff --git a/hyperlinks/__pycache__/models.cpython-37.pyc b/hyperlinks/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..e0997a5 Binary files /dev/null and b/hyperlinks/__pycache__/models.cpython-37.pyc differ diff --git a/hyperlinks/__pycache__/schema.cpython-37.pyc b/hyperlinks/__pycache__/schema.cpython-37.pyc new file mode 100644 index 0000000..f81d2bd Binary files /dev/null and b/hyperlinks/__pycache__/schema.cpython-37.pyc differ diff --git a/hyperlinks/admin.py b/hyperlinks/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/hyperlinks/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/hyperlinks/apps.py b/hyperlinks/apps.py new file mode 100644 index 0000000..d481633 --- /dev/null +++ b/hyperlinks/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class HyperlinksConfig(AppConfig): + name = 'hyperlinks' diff --git a/hyperlinks/migrations/0001_initial.py b/hyperlinks/migrations/0001_initial.py new file mode 100644 index 0000000..9c41cdb --- /dev/null +++ b/hyperlinks/migrations/0001_initial.py @@ -0,0 +1,26 @@ +# Generated by Django 3.1.5 on 2021-01-20 17:35 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('organisations', '0005_auto_20210120_1944'), + ] + + operations = [ + migrations.CreateModel( + name='HyperLink', + fields=[ + ('link', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('child', models.OneToOneField(blank=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.child')), + ('organ', models.OneToOneField(blank=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.organisator')), + ('teacher', models.OneToOneField(blank=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.teacher')), + ], + ), + ] diff --git a/hyperlinks/migrations/0002_auto_20210120_2119.py b/hyperlinks/migrations/0002_auto_20210120_2119.py new file mode 100644 index 0000000..f639ea2 --- /dev/null +++ b/hyperlinks/migrations/0002_auto_20210120_2119.py @@ -0,0 +1,30 @@ +# Generated by Django 3.1.5 on 2021-01-20 18:19 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organisations', '0005_auto_20210120_1944'), + ('hyperlinks', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='hyperlink', + name='child', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.child'), + ), + migrations.AlterField( + model_name='hyperlink', + name='organ', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.organisator'), + ), + migrations.AlterField( + model_name='hyperlink', + name='teacher', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.teacher'), + ), + ] diff --git a/hyperlinks/migrations/__init__.py b/hyperlinks/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hyperlinks/migrations/__pycache__/0001_initial.cpython-37.pyc b/hyperlinks/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000..c27901a Binary files /dev/null and b/hyperlinks/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/hyperlinks/migrations/__pycache__/0002_auto_20210120_2119.cpython-37.pyc b/hyperlinks/migrations/__pycache__/0002_auto_20210120_2119.cpython-37.pyc new file mode 100644 index 0000000..dfc4c3f Binary files /dev/null and b/hyperlinks/migrations/__pycache__/0002_auto_20210120_2119.cpython-37.pyc differ diff --git a/hyperlinks/migrations/__pycache__/__init__.cpython-37.pyc b/hyperlinks/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..0c4dcd4 Binary files /dev/null and b/hyperlinks/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/hyperlinks/models.py b/hyperlinks/models.py new file mode 100644 index 0000000..b0772ea --- /dev/null +++ b/hyperlinks/models.py @@ -0,0 +1,30 @@ +from django.db import models + +from organisations.models import Organisator, Child, Teacher + +import uuid + +from django.dispatch import receiver +from django.db.models.signals import post_save + +class HyperLink(models.Model): + link = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=False) + teacher = models.OneToOneField(Teacher, null=True, on_delete=models.CASCADE, unique=False) + child = models.OneToOneField(Child, null=True, on_delete=models.CASCADE, unique=False) + organ = models.OneToOneField(Organisator, null=True, on_delete=models.CASCADE, unique=False) + +@receiver(signal=post_save, sender=Organisator) +def org_recieve(sender, instance, **kwargs): + HyperLink.objects.create(organ=instance) + + + +@receiver(signal=post_save, sender=Child) +def child_recieve(sender, instance, **kwargs): + HyperLink.objects.create(child=instance) + + + +@receiver(signal=post_save, sender=Teacher) +def teacher_recieve(sender, instance, **kwargs): + HyperLink.objects.create(teacher=instance) diff --git a/hyperlinks/schema.py b/hyperlinks/schema.py new file mode 100644 index 0000000..bc32342 --- /dev/null +++ b/hyperlinks/schema.py @@ -0,0 +1,51 @@ +import graphene +import graphene_django +from organisations.gqlTypes import TeacherType +from .models import HyperLink + +from graphene import relay +from django.contrib.auth.models import User + +class HyperLinkType(graphene_django.DjangoObjectType): + class Meta: + model = HyperLink + + + +class getProfile(graphene.Mutation): + class Arguments: + profile_token = graphene.ID() + user_id = graphene.ID() + + id = graphene.ID() + user_type = graphene.String() + + def mutate(self, info, profile_token, user_id): + user_type = "" + user = User.objects.get(id=user_id) + print(HyperLink.objects.all()) + hl = HyperLink.objects.get(link=profile_token) + print(hl, "hl") + model = hl.teacher or hl.child or hl.organ + if hl.teacher: user_type = "teacher" + if hl.child: user_type = "child" + if hl.organ: user_type = "organ" + print(model, "profile") + model.delete() + model.profile = user.profile + model.save() + return getProfile(id=model.id, user_type = user_type) + + +class Mutation(graphene.ObjectType): + get_profile = getProfile.Field() + +class Query(graphene.ObjectType): + hyper_links = graphene.Field(graphene.List(HyperLinkType)) + + def resolve_hyper_links(self, info): + return HyperLink.objects.all() + + + +schema = graphene.Schema(query=Query, mutation=Mutation) \ No newline at end of file diff --git a/hyperlinks/tests.py b/hyperlinks/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/hyperlinks/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/hyperlinks/views.py b/hyperlinks/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/hyperlinks/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/lessons/__pycache__/__init__.cpython-37.pyc b/lessons/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..7c19e63 Binary files /dev/null and b/lessons/__pycache__/__init__.cpython-37.pyc differ diff --git a/lessons/__pycache__/__init__.cpython-39.pyc b/lessons/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..680571b Binary files /dev/null and b/lessons/__pycache__/__init__.cpython-39.pyc differ diff --git a/lessons/__pycache__/admin.cpython-37.pyc b/lessons/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000..aaa75e3 Binary files /dev/null and b/lessons/__pycache__/admin.cpython-37.pyc differ diff --git a/lessons/__pycache__/models.cpython-37.pyc b/lessons/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..9684f73 Binary files /dev/null and b/lessons/__pycache__/models.cpython-37.pyc differ diff --git a/lessons/__pycache__/models.cpython-39.pyc b/lessons/__pycache__/models.cpython-39.pyc new file mode 100644 index 0000000..2e1ba2e Binary files /dev/null and b/lessons/__pycache__/models.cpython-39.pyc differ diff --git a/lessons/__pycache__/schema.cpython-37.pyc b/lessons/__pycache__/schema.cpython-37.pyc new file mode 100644 index 0000000..3e1d34c Binary files /dev/null and b/lessons/__pycache__/schema.cpython-37.pyc differ diff --git a/lessons/db_functions.py b/lessons/db_functions.py index 16c97d0..0466b2a 100644 --- a/lessons/db_functions.py +++ b/lessons/db_functions.py @@ -18,4 +18,10 @@ def removeTeacherFromClass(classLocal, teacher): classLocal.teachers.remove(teacher) def addLessonToClass(classLocal): - Lesson \ No newline at end of file + Lesson.objects.create(type_lesson=classLocal) + +def addTestToLesson(lesson, deadline, name): + Tests.objects.create(name=name, deadline=deadline, lesson=lesson) + +def addTaskToTest(test, theory, practise, mark): + Task.objects.create(theory=theory, practise=practise, test=test, number=mark) \ No newline at end of file diff --git a/lessons/migrations/0003_auto_20210113_2224.py b/lessons/migrations/0003_auto_20210113_2224.py new file mode 100644 index 0000000..489da99 --- /dev/null +++ b/lessons/migrations/0003_auto_20210113_2224.py @@ -0,0 +1,22 @@ +# Generated by Django 3.1.5 on 2021-01-13 19:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lessons', '0002_auto_20210109_1220'), + ] + + operations = [ + migrations.RemoveField( + model_name='task', + name='type', + ), + migrations.AddField( + model_name='task', + name='types', + field=models.ManyToManyField(to='lessons.Type'), + ), + ] diff --git a/lessons/migrations/0004_answer_completed.py b/lessons/migrations/0004_answer_completed.py new file mode 100644 index 0000000..ab1334f --- /dev/null +++ b/lessons/migrations/0004_answer_completed.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2021-01-13 20:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lessons', '0003_auto_20210113_2224'), + ] + + operations = [ + migrations.AddField( + model_name='answer', + name='completed', + field=models.BooleanField(default=False), + ), + ] diff --git a/lessons/migrations/0005_auto_20210117_1752.py b/lessons/migrations/0005_auto_20210117_1752.py new file mode 100644 index 0000000..08be77e --- /dev/null +++ b/lessons/migrations/0005_auto_20210117_1752.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.5 on 2021-01-17 14:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lessons', '0004_answer_completed'), + ] + + operations = [ + migrations.AddField( + model_name='answer', + name='score', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='task', + name='max_score', + field=models.IntegerField(default=0), + ), + ] diff --git a/lessons/migrations/0006_auto_20210117_2008.py b/lessons/migrations/0006_auto_20210117_2008.py new file mode 100644 index 0000000..eb57052 --- /dev/null +++ b/lessons/migrations/0006_auto_20210117_2008.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.5 on 2021-01-17 17:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lessons', '0005_auto_20210117_1752'), + ] + + operations = [ + migrations.AddField( + model_name='lesson', + name='descr', + field=models.TextField(default=''), + ), + migrations.AddField( + model_name='lesson', + name='name', + field=models.TextField(default=''), + ), + ] diff --git a/lessons/migrations/__pycache__/0001_initial.cpython-37.pyc b/lessons/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000..70f812a Binary files /dev/null and b/lessons/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/lessons/migrations/__pycache__/0002_auto_20210109_1220.cpython-37.pyc b/lessons/migrations/__pycache__/0002_auto_20210109_1220.cpython-37.pyc new file mode 100644 index 0000000..44cfe0d Binary files /dev/null and b/lessons/migrations/__pycache__/0002_auto_20210109_1220.cpython-37.pyc differ diff --git a/lessons/migrations/__pycache__/0003_auto_20210113_2224.cpython-37.pyc b/lessons/migrations/__pycache__/0003_auto_20210113_2224.cpython-37.pyc new file mode 100644 index 0000000..d0de32f Binary files /dev/null and b/lessons/migrations/__pycache__/0003_auto_20210113_2224.cpython-37.pyc differ diff --git a/lessons/migrations/__pycache__/0004_answer_completed.cpython-37.pyc b/lessons/migrations/__pycache__/0004_answer_completed.cpython-37.pyc new file mode 100644 index 0000000..99d4fc0 Binary files /dev/null and b/lessons/migrations/__pycache__/0004_answer_completed.cpython-37.pyc differ diff --git a/lessons/migrations/__pycache__/0005_auto_20210117_1752.cpython-37.pyc b/lessons/migrations/__pycache__/0005_auto_20210117_1752.cpython-37.pyc new file mode 100644 index 0000000..5c051e7 Binary files /dev/null and b/lessons/migrations/__pycache__/0005_auto_20210117_1752.cpython-37.pyc differ diff --git a/lessons/migrations/__pycache__/0006_auto_20210117_2008.cpython-37.pyc b/lessons/migrations/__pycache__/0006_auto_20210117_2008.cpython-37.pyc new file mode 100644 index 0000000..248be89 Binary files /dev/null and b/lessons/migrations/__pycache__/0006_auto_20210117_2008.cpython-37.pyc differ diff --git a/lessons/migrations/__pycache__/__init__.cpython-37.pyc b/lessons/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..8a59067 Binary files /dev/null and b/lessons/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/lessons/models.py b/lessons/models.py index cdde3d3..2a6ee51 100644 --- a/lessons/models.py +++ b/lessons/models.py @@ -22,6 +22,8 @@ class SubjectClassLocal(models.Model): class Lesson(models.Model): type_lesson = models.ForeignKey(SubjectClassLocal, on_delete=models.CASCADE) + name = models.TextField(default="") + descr = models.TextField(default="") class Materials(models.Model): @@ -41,8 +43,9 @@ class Task(models.Model): theory = models.TextField() practise = models.TextField() test = models.ForeignKey(Tests, on_delete=models.CASCADE) - type = models.ForeignKey(Type, on_delete=models.PROTECT) + types = models.ManyToManyField(Type) number = models.IntegerField() + max_score = models.IntegerField(default=0) @@ -59,10 +62,13 @@ class Answer(models.Model): sheet = models.ForeignKey(AnswerSheet, on_delete=models.CASCADE) content = models.TextField() number = models.IntegerField() + completed = models.BooleanField(default=False) + score = models.IntegerField(default=0) @receiver(post_save, sender=Tests) -def _post_save_receiver(sender, instance, created, **kwargs): +def _post_save_receiver_(sender, instance, created, **kwargs): + print(created, instance, instance.lesson.type_lesson.group.child_set.all()) if created: for child in instance.lesson.type_lesson.group.child_set.all(): AnswerSheet.objects.create(child=child, completed=False, test=instance) @@ -71,4 +77,4 @@ def _post_save_receiver(sender, instance, created, **kwargs): def _post_save_receiver(sender, instance, created, **kwargs): if created: for child in instance.test.lesson.type_lesson.group.child_set.all(): - Answer.objects.create(number=instance.number, sheet=child.answer_sheet_set.all().filter(test=instance.test)[0], content="") \ No newline at end of file + Answer.objects.create(number=instance.number, sheet=child.answersheet_set.all().filter(test=instance.test)[0], content="") \ No newline at end of file diff --git a/lessons/schema.py b/lessons/schema.py new file mode 100644 index 0000000..6587c73 --- /dev/null +++ b/lessons/schema.py @@ -0,0 +1,467 @@ +import graphene +import graphene_django + +from .models import Subject, Lesson, SubjectClassLocal, Tests, Task, AnswerSheet, Answer +from organisations.gqlTypes import ChildType, TeacherType + +from organisations.models import Organisation, Group, Child, Teacher + +from graphene import relay +from graphene_django.filter import DjangoFilterConnectionField +from users.models import Profile + +from django.db.models import Model + + +class AnswerType(graphene_django.DjangoObjectType): + class Meta: + model = Answer + interfaces = (relay.Node,) + filter_fields = { + "sheet" : ("exact",), + } + pk = graphene.Int() + + def resolve_pk(self, info): return self.pk + +class AnswerSheetType(graphene_django.DjangoObjectType): + class Meta: + model = AnswerSheet + interfaces = (relay.Node,) + filter_fields = { + "test" : ("exact",), + "child": ("exact",) + } + + +class TaskType(graphene_django.DjangoObjectType): + class Meta: + model = Task + interfaces = (relay.Node,) + filter_fields = { + "test": ("exact",), + "types": ("contains",) + } + pk = graphene.Int() + + def resolve_pk(self, info): + return self.pk + + +class TestsType(graphene_django.DjangoObjectType): + class Meta: + model = Tests + interfaces = (relay.Node,) + filter_fields = { + "name": ("exact", "contains"), + "lesson": ("exact",) + } + pk = graphene.Int() + + def resolve_pk(self, info): + return self.id + + + +class SubjectType(graphene_django.DjangoObjectType): + class Meta: + model=Subject + interfaces = (relay.Node,) + + filter_fields = { + "name" : ("exact", "contains",), + "organisation" : ("exact",), + "teachers_give" : ("contains",) + } + pk = graphene.Int() + + def resolve_pk(self, info): return self.pk + + +class LessonType(graphene_django.DjangoObjectType): + class Meta: + model=Lesson + interfaces = (relay.Node,) + filter_fields = { + "name": ["exact", "contains"], + "descr": ["exact", "contains"] + } + pk = graphene.Int() + + def resolve(self, info): + return self.pk + + +class LocalSubjectType(graphene_django.DjangoObjectType): + class Meta: + model=SubjectClassLocal + interfaces = (relay.Node,) + filter_fields = { + "name": ("exact", "contains"), + "id": ("exact",), + "group": ("exact",) + } + pk = graphene.Int() + + def resolve_pk(self, info): + return self.pk + +class CreateLesson(graphene.Mutation): + class Arguments: + name = graphene.String() + descr = graphene.String() + subject = graphene.ID() + + ok = graphene.Boolean() + + def mutate(self, info, name, descr, subject): + Lesson.objects.create(name=name, descr=descr, type_lesson= + SubjectClassLocal.objects.get(pk=subject)) + return CreateLesson(ok=True) + +class UpdateLessonRegistration(graphene.Mutation): + class Arguments: + id = graphene.ID() + descr = graphene.String() + name = graphene.String() + ok = graphene.Boolean() + + def mutate(self, info, id, descr=None, name=None): + lesson = Lesson.objects.get(id=id) or None + if lesson == None: return UpdateLessonRegistration(ok=False) + descr_upd = lesson.descr + name_upd = lesson.name + if descr != None: descr_upd = descr + if name != None: name_upd = name + lesson.descr = descr_upd + lesson.name = name_upd + lesson.save() + return UpdateLessonRegistration(ok=True) + + +class DeleteLesson(graphene.Mutation): + class Arguments: + id = graphene.ID() + ok = graphene.Boolean() + + def mutate(self, info, id): + lesson = Lesson.objects.get(id=id) + if lesson == None: return DeleteLesson(ok=False) + lesson.delete() + return DeleteLesson(ok=True) + +import datetime #fix +class CreateTest(graphene.Mutation): + class Arguments: + lesson_id = graphene.ID() + name = graphene.String() + deadline = graphene.Date() + + test = graphene.Field(TestsType) + + def mutate(self, info, lesson_id, name, deadline=None): + lesson = Lesson.objects.get(id=lesson_id) + t = Tests.objects.create(name=name, lesson=lesson, deadline=datetime.datetime.now()) + return CreateTest(test=t) + +class updateTestRegistration(graphene.Mutation): + class Arguments: + test_id = graphene.ID() + name = graphene.String() + deadline = graphene.Date() + test = graphene.Field(TestsType) + + def mutate(self, info, test_id, name=None, deadline=None): + test = Tests.objects.get(id=test_id) + name_changed = test.name + deadline_changed = test.deadline + if name != None: name_changed = name + if deadline != None : deadline_changed = deadline + test.name = name_changed + test.deadline = deadline_changed + return updateTestRegistration(test) +from collections.abc import Mapping + +class deleteTest(graphene.Mutation): + class Arguments: + test_id = graphene.ID() + ok = graphene.Boolean() + + def mutate(self, info, test_id): + test = Tests.objects.get(id=test_id) + test.delete() + return deleteTest(ok=True) + + +def createModel(model, fields): + return model.objects.create(**fields) + +def updateModel(model:Model, instance:Model, fields:Mapping): + print(fields) + updated_fields = {} + for key, value in fields.items(): + updated_fields.update({key: value[0] or value[1]}) + print(updated_fields) + for key, value in updated_fields.items(): + setattr(instance, key, value) + instance.save() + return instance + +def deleteModel(model:Model): + model.delete() + + +class createTask(graphene.Mutation): + class Arguments: + test_id = graphene.ID() + theory = graphene.String() + practise = graphene.String() + number = graphene.Int() + max_score = graphene.Int() + + task = graphene.Field(TaskType) + + def mutate(self, info, test_id, theory, practise, number, max_score): + m = createModel(model=Task, fields = { + "test": Tests.objects.get(id=test_id), + "theory": theory, + "practise": practise, + "number": number, + "max_score": max_score + }) + return createTask(task=m) + +class updateTask(graphene.Mutation): + class Arguments: + task_id = graphene.ID() + theory = graphene.String() + practise = graphene.String() + number = graphene.Int() + max_score = graphene.Int() + task = graphene.Field(TaskType) + + def mutate(self, info, task_id, theory=None, practise=None, number=None, max_score=None): + task = Task.objects.get(id=task_id) + m = updateModel(Task, task, { + "theory": [theory, task.theory], + "practise": [practise, task.practise], + "number": [number, task.number], + "max_score": [max_score, task.max_score] + }) + return updateTask(task=m) + + +class deleteTask(graphene.Mutation): + class Arguments: + task_id = graphene.ID() + + ok = graphene.Boolean() + def mutate(self, info, task_id): + deleteModel(Task.objects.get(id=task_id)) + return deleteTask(ok=True) + +class addChildToGroup(graphene.Mutation): + class Arguments: + group_id = graphene.ID() + child_id = graphene.ID() + + child = graphene.Field(ChildType) + + def mutate(self, info, group_id, child_id): + group = Group.objects.get(id=group_id) + child = Child.objects.get(id=child_id) + child.groups.add(group) + child.save() + return addChildToGroup(child=child) + +class addChildToOrg(graphene.Mutation): + class Arguments: + org_id = graphene.ID() + child_id = graphene.ID() + name = graphene.String() + surname = graphene.String() + midname = graphene.String() + + child = graphene.Field(ChildType) + + def mutate(self, info, org_id, child_id, name, surname, midname): + user = Profile.objects.get(id=child_id) + org = Organisation.objects.get(id=org_id) + + child = Child.objects.create(profile=user, org=org, name=name or "", + surname = surname or "", midname = midname or "") + return addChildToOrg(child=child) + +class CreateSubjectClass(graphene.Mutation): + class Arguments: + group_id = graphene.ID() + subject_id = graphene.ID() + name = graphene.String() + + subject_class = graphene.Field(LocalSubjectType) + + def mutate(self, info, group_id, subject_id, name): + group = Group.objects.get(id=group_id) + subject = Subject.objects.get(id=subject_id) + local_subject = SubjectClassLocal.objects.create(name=name, + group=group, subject=subject) + return CreateSubjectClass(subject_class=local_subject) + + +class CreateSubject(graphene.Mutation): + class Arguments: + org_id = graphene.ID() + name = graphene.String() + + subject = graphene.Field(SubjectType) + + def mutate(self, info, org_id, name): + org = Organisation.objects.get(id=org_id) + subject = Subject.objects.create(name=name, organisation=org) + return CreateSubject(subject) + +class UpdateSubjectReg(graphene.Mutation): + class Arguments: + subject_id = graphene.ID() + name = graphene.String() + + subject = graphene.Field(SubjectType) + + def mutate(self, info, subject_id, name): + subject = Subject.objects.get(id=subject_id) + subject.name = name or subject.name + subject.save() + return UpdateSubjectReg(subject=subject) + +class DeleteSubject(graphene.Mutation): + class Arguments: + subject_id = graphene.ID() + + ok = graphene.Boolean() + + def mutate(self, info, subject_id): + subject = Subject.objects.get(id=subject_id) + subject.delete() + return DeleteSubject(ok=True) + + +class UpdateSubjectLocalReg(graphene.Mutation): + class Arguments: + subject_local_id = graphene.ID() + name = graphene.String() + + subject_local = graphene.Field(LocalSubjectType) + + def mutate(self, info, subject_local_id, name): + subject = SubjectClassLocal.objects.get(id=subject_local_id) + subject.name = name or subject.name + subject.save() + return UpdateSubjectLocalReg(subject_local=subject) + + +class DeleteSubjectLocal(graphene.Mutation): + class Arguments: + subject_local_id = graphene.ID() + + ok = graphene.Boolean() + + def mutate(self, info, subject_local_id): + SubjectClassLocal.objects.get(id=subject_local_id).delete() + return DeleteSubjectLocal(ok=True) + + +class AddSubjectToTeacher(graphene.Mutation): + class Arguments: + subject_id = graphene.ID() + teacher_id = graphene.ID() + teacher = graphene.Field(TeacherType) + + def mutate(self, info, subject_id, teacher_id): + teacher = Teacher.objects.get(id=teacher_id) + subject= Subject.objects.get(id=subject_id) + + subject.teachers_give.add(teacher) + subject.save() + return AddSubjectToTeacher(teacher=teacher) + + +class RemoveSubjectFromTeacher(graphene.Mutation): + class Arguments: + subject_id = graphene.ID() + teacher_id = graphene.ID() + teacher = graphene.Field(TeacherType) + + def mutate(self, info, subject_id, teacher_id): + subject = Subject.objects.get(id=subject_id) + subject.teachers_give.all().filter(id=teacher_id)[0].delete() + return RemoveSubjectFromTeacher(teacher=Teacher.objects.get(id=teacher_id)) + + +class AnswerQuestion(graphene.Mutation): + class Arguments: + answer_table_id = graphene.ID() + answer = graphene.String() + + answer = graphene.Field(AnswerType) + + def mutate(self, info, answer_table_id, answer): + answerT = Answer.objects.get(id=answer_table_id) + answerT.content = answer + answerT.completed = True + answerT.save() + return AnswerQuestion(answer=answerT) + + +class Mutation(graphene.ObjectType): + create_lesson = CreateLesson.Field() + update_lesson_registration = UpdateLessonRegistration.Field() + delete_lesson = DeleteLesson.Field() + + create_test = CreateTest.Field() + update_test_registration = updateTestRegistration.Field() + delete_test = deleteTest.Field() + + create_task = createTask.Field() + update_task = updateTask.Field() + delete_task = deleteTask.Field() + + add_child_to_group = addChildToGroup.Field() + add_child_to_org = addChildToOrg.Field() + + create_subject_class = CreateSubjectClass.Field() + update_subject_class = UpdateSubjectLocalReg.Field() + delete_subject_class = DeleteSubjectLocal.Field() + + create_subject = CreateSubject.Field() + update_subject = UpdateSubjectReg.Field() + delete_subject = DeleteSubject.Field() + + add_subject_to_teacher = AddSubjectToTeacher.Field() + remove_subject_from_teacher = RemoveSubjectFromTeacher.Field() + + answer_question = AnswerQuestion.Field() + +class Query(graphene.ObjectType): + + all_test = DjangoFilterConnectionField(TestsType) + test = relay.Node.Field(TestsType) + + all_subject = DjangoFilterConnectionField(SubjectType) + subject = relay.Node.Field(SubjectType) + + task = relay.Node.Field(TaskType) + all_task = DjangoFilterConnectionField(TaskType) + + answer_sheet = relay.Node.Field(AnswerSheetType) + all_answer_sheet = DjangoFilterConnectionField(AnswerSheetType) + + answer = relay.Node.Field(AnswerType) + all_answer = DjangoFilterConnectionField(AnswerType) + + all_lessons = DjangoFilterConnectionField(LessonType) + lessons = relay.Node.Field(LessonType) + + subject_class = relay.Node.Field(LocalSubjectType) + subject_classes = DjangoFilterConnectionField(LocalSubjectType) + +schema = graphene.Schema(query=Query) \ No newline at end of file diff --git a/organisations/__pycache__/__init__.cpython-37.pyc b/organisations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..5ef8da7 Binary files /dev/null and b/organisations/__pycache__/__init__.cpython-37.pyc differ diff --git a/organisations/__pycache__/admin.cpython-37.pyc b/organisations/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000..eeaeeb8 Binary files /dev/null and b/organisations/__pycache__/admin.cpython-37.pyc differ diff --git a/organisations/__pycache__/gqlTypes.cpython-37.pyc b/organisations/__pycache__/gqlTypes.cpython-37.pyc new file mode 100644 index 0000000..b764f7a Binary files /dev/null and b/organisations/__pycache__/gqlTypes.cpython-37.pyc differ diff --git a/organisations/__pycache__/mixins.cpython-37.pyc b/organisations/__pycache__/mixins.cpython-37.pyc new file mode 100644 index 0000000..1643667 Binary files /dev/null and b/organisations/__pycache__/mixins.cpython-37.pyc differ diff --git a/organisations/__pycache__/models.cpython-37.pyc b/organisations/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..4c42d4d Binary files /dev/null and b/organisations/__pycache__/models.cpython-37.pyc differ diff --git a/organisations/__pycache__/mutation.cpython-37.pyc b/organisations/__pycache__/mutation.cpython-37.pyc new file mode 100644 index 0000000..cd5abaf Binary files /dev/null and b/organisations/__pycache__/mutation.cpython-37.pyc differ diff --git a/organisations/__pycache__/query.cpython-37.pyc b/organisations/__pycache__/query.cpython-37.pyc new file mode 100644 index 0000000..75dc8c7 Binary files /dev/null and b/organisations/__pycache__/query.cpython-37.pyc differ diff --git a/organisations/__pycache__/schema.cpython-37.pyc b/organisations/__pycache__/schema.cpython-37.pyc new file mode 100644 index 0000000..d4cc68b Binary files /dev/null and b/organisations/__pycache__/schema.cpython-37.pyc differ diff --git a/organisations/gqlTypes.py b/organisations/gqlTypes.py index bf88052..d14c971 100644 --- a/organisations/gqlTypes.py +++ b/organisations/gqlTypes.py @@ -1,27 +1,82 @@ import graphene_django -from .models import Organisation, Role, Group, Teacher, Child +from .models import Organisation, Role, Group, Teacher, Child, Organisator +from graphene import relay +import graphene print(Teacher, Child) +class OrganisatorType(graphene_django.DjangoObjectType): + class Meta: + model = Organisator + interfaces = (relay.Node,) + filter_fields = { + "name": ("exact", "contains"), + "surname": ("exact", "contains"), + "midname": ("exact", "contains"), + "org" : ("exact",), + "profile" : ("exact",), + "groups" : ("contains",) + } + class OrganisationType(graphene_django.DjangoObjectType): class Meta: model = Organisation + interfaces = (relay.Node,) + filter_fields = { + "name" : ("exact", "contains",), + } class RoleType(graphene_django.DjangoObjectType): class Meta: model = Role -class GroupType(graphene_django.DjangoObjectType): - class Meta: - model = Group - - class TeacherType(graphene_django.DjangoObjectType): class Meta: model = Teacher + interfaces = (relay.Node,) + + filter_fields = { + "name": ("exact", "contains"), + "surname": ("exact", "contains"), + "midname": ("exact", "contains"), + "org" : ("exact",), + "profile" : ("exact",), + "groups" : ("contains",) + } + pk = graphene.Int() + + def resolve_pk(self, info): return self.pk class ChildType(graphene_django.DjangoObjectType): class Meta: - model = Child \ No newline at end of file + model = Child + + interfaces = (relay.Node,) + + filter_fields = { + "name": ("exact", "contains"), + "surname": ("exact", "contains"), + "midname": ("exact", "contains"), + "org" : ("exact",), + "profile" : ("exact",), + "groups" : ("contains",) + } + pk = graphene.Int() + + def resolve_pk(self, info): return self.pk + + +class GroupType(graphene_django.DjangoObjectType): + class Meta: + model = Group + interfaces = (relay.Node,) + + filter_fields = { + "name" : ("exact", "contains"), + } + pk = graphene.Int() + + def resolve(self, info): + return self.pk \ No newline at end of file diff --git a/organisations/migrations/0005_auto_20210120_1944.py b/organisations/migrations/0005_auto_20210120_1944.py new file mode 100644 index 0000000..7b93a00 --- /dev/null +++ b/organisations/migrations/0005_auto_20210120_1944.py @@ -0,0 +1,37 @@ +# Generated by Django 3.1.5 on 2021-01-20 16:44 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ('organisations', '0004_auto_20210108_2013'), + ] + + operations = [ + migrations.AlterField( + model_name='child', + name='profile', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='users.profile'), + ), + migrations.AlterField( + model_name='teacher', + name='profile', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='users.profile'), + ), + migrations.CreateModel( + name='Organisator', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=150)), + ('surname', models.CharField(blank=True, max_length=150)), + ('midname', models.CharField(blank=True, max_length=150)), + ('groups', models.ManyToManyField(to='organisations.Group')), + ('org', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='organisations.organisation')), + ('profile', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='users.profile')), + ], + ), + ] diff --git a/organisations/migrations/__pycache__/0001_initial.cpython-37.pyc b/organisations/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000..323b83a Binary files /dev/null and b/organisations/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/organisations/migrations/__pycache__/0002_auto_20210107_2139.cpython-37.pyc b/organisations/migrations/__pycache__/0002_auto_20210107_2139.cpython-37.pyc new file mode 100644 index 0000000..9a92657 Binary files /dev/null and b/organisations/migrations/__pycache__/0002_auto_20210107_2139.cpython-37.pyc differ diff --git a/organisations/migrations/__pycache__/0003_auto_20210107_2142.cpython-37.pyc b/organisations/migrations/__pycache__/0003_auto_20210107_2142.cpython-37.pyc new file mode 100644 index 0000000..77641e5 Binary files /dev/null and b/organisations/migrations/__pycache__/0003_auto_20210107_2142.cpython-37.pyc differ diff --git a/organisations/migrations/__pycache__/0004_auto_20210108_2013.cpython-37.pyc b/organisations/migrations/__pycache__/0004_auto_20210108_2013.cpython-37.pyc new file mode 100644 index 0000000..a894a4d Binary files /dev/null and b/organisations/migrations/__pycache__/0004_auto_20210108_2013.cpython-37.pyc differ diff --git a/organisations/migrations/__pycache__/0005_auto_20210120_1944.cpython-37.pyc b/organisations/migrations/__pycache__/0005_auto_20210120_1944.cpython-37.pyc new file mode 100644 index 0000000..1b65e47 Binary files /dev/null and b/organisations/migrations/__pycache__/0005_auto_20210120_1944.cpython-37.pyc differ diff --git a/organisations/migrations/__pycache__/__init__.cpython-37.pyc b/organisations/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..33174b8 Binary files /dev/null and b/organisations/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/organisations/mixins.py b/organisations/mixins.py new file mode 100644 index 0000000..0935ba3 --- /dev/null +++ b/organisations/mixins.py @@ -0,0 +1,67 @@ +import graphene +from .models import Organisation, Group +from django.contrib.auth.models import User + +class RegModelToOrg(graphene.Mutation): + model = "" + + class Arguments: + user_id = graphene.ID() + org_id = graphene.ID() + name = graphene.String(required=False) + surname = graphene.String(required=False) + midname = graphene.String(required=False) + modelType = graphene.Field(graphene.Int()) + + + @classmethod + def mutate(self, root, info, **kwargs): + surname = kwargs.get("surname", "") + name = kwargs.get("name", "") + midname = kwargs.get("midname", "") + org_id = kwargs.get("org_id", "") + user_id = kwargs.get("user_id", "") + print(self.model, "model") + profile = User.objects.get(id=user_id).profile + print(kwargs, self) + org = Organisation.objects.get(id=org_id) + print(self, info) + instance = self.model.objects.create( + org=org, profile=profile, + name=name or "", surname=surname or "", midname = midname or "") + return RegModelToOrg(modelType=instance) + + +class RegModelGroup(graphene.Mutation): + model = "" + modelType = graphene.Field(graphene.Int()) + class Arguments: + group_id = graphene.ID() + user_id = graphene.ID() + + + @classmethod + def mutate(self, root, info, group_id, user_id): + group = Group.objects.get(id=group_id) + user = self.model.objects.get(id=user_id) + user.groups.add(group) + user.save() + return RegModelGroup(modelType=user) + + +class DeleteModelGroup(graphene.Mutation): + model = "" + modelType = graphene.Field(graphene.Int()) + + class Arguments: + group_id = graphene.ID() + model_id = graphene.ID() + + + @classmethod + def mutate(self, root, info, group_id, model_id): + model = self.model.objects.get(id=model_id) + + model.groups.all().filter(id=group_id)[0].delete() + + return DeleteModelGroup(modelType=model) diff --git a/organisations/models.py b/organisations/models.py index ab3a051..ebda39d 100644 --- a/organisations/models.py +++ b/organisations/models.py @@ -28,16 +28,24 @@ class Group(models.Model): class Teacher(models.Model): org = models.ForeignKey(Organisation, models.CASCADE, blank=True) - profile = models.ForeignKey(Profile, models.CASCADE) + profile = models.ForeignKey(Profile, models.CASCADE, blank=True) groups = models.ManyToManyField(Group) name = models.CharField(max_length=150, blank=True) surname = models.CharField(max_length=150, blank=True) midname = models.CharField(max_length=150, blank=True) class Child(models.Model): - profile = models.ForeignKey(Profile, models.CASCADE) + profile = models.ForeignKey(Profile, models.CASCADE, blank=True) org = models.ForeignKey(Organisation, models.CASCADE, blank=True) groups = models.ManyToManyField(Group) name = models.CharField(max_length=150, blank=True) surname = models.CharField(max_length=150, blank=True) - midname = models.CharField(max_length=150, blank=True) \ No newline at end of file + midname = models.CharField(max_length=150, blank=True) + +class Organisator(models.Model): + profile = models.ForeignKey(Profile, models.CASCADE, blank=True) + org = models.ForeignKey(Organisation, models.CASCADE, blank=True) + groups = models.ManyToManyField(Group) + name = models.CharField(max_length=150, blank=True) + surname = models.CharField(max_length=150, blank=True) + midname = models.CharField(max_length=150, blank=True) diff --git a/organisations/mutation.py b/organisations/mutation.py index 7f9602c..98523d4 100644 --- a/organisations/mutation.py +++ b/organisations/mutation.py @@ -1,9 +1,15 @@ import graphene -from .gqlTypes import OrganisationType, RoleType, GroupType -from .models import Organisation, Role, Group, Teacher, Child +from .gqlTypes import OrganisationType, RoleType, ChildType, TeacherType, GroupType, OrganisatorType +from .models import Organisation, Role, Group, Teacher, Child, Organisator +from lessons.models import SubjectClassLocal from users.schema import UserType +from graphene import relay + +from django.contrib.auth.models import User + +from .mixins import RegModelToOrg, RegModelGroup, DeleteModelGroup class CreateGroup(graphene.Mutation): class Arguments: @@ -25,25 +31,6 @@ class CreateOrg(graphene.Mutation): def mutate(self, info, name, **kwargs): return CreateOrg(Org=Organisation.objects.create(name=name)) -class RegUserOrg(graphene.Mutation): - class Arguments: - token = graphene.String() - orgName = graphene.String() - isTeacher = graphene.Boolean() - name = graphene.String(required=False) - surname = graphene.String(required=False) - midname = graphene.String(required=False) - - ok = graphene.Boolean() - - def mutate(self, info, token, orgName, isTeacher, **kwargs): - org = Organisation.objects.get(name=orgName) - if isTeacher: - t = Teacher.objects.create(profile=info.context.user.profile, org=org) - else: - t = Child.objects.create(profile=info.context.user.profile, org=org) - return RegUserOrg(ok=True) - class AddGroupToOrg(graphene.Mutation): @@ -57,20 +44,30 @@ class AddGroupToOrg(graphene.Mutation): return AddGroupToOrg(group=group) -class RegUserGroup(graphene.Mutation): - class Arguments: - token = graphene.String() - orgName = graphene.String() - groupName = graphene.String() - is_teacher = graphene.Boolean() - user = graphene.Field(UserType) - def mutate(self, info, token, orgName, groupName, is_teacher, **kwargs): - group = Organisation.objects.get(name=orgName).group_set.all().filter(name=groupName)[0] - if is_teacher: - info.context.user.profile.teacher_set.all().filter(org__name=orgName)[0].groups.add(group) - else: - info.context.user.profile.child_set.all().filter(org__name=orgName)[0].groups.add(group) - return RegUserGroup(info.context.user) + +class RegTeacherToOrg(RegModelToOrg): + model = Teacher + modelType = graphene.Field(TeacherType) + +class RegChildToOrg(RegModelToOrg): + model = Child + modelType =graphene.Field(ChildType) + + +class RegOrganisatorToOrg(RegModelToOrg): + model = Organisator + modelType = graphene.Field(OrganisatorType) + + +class RegChildGroup(RegModelGroup): + model = Child + modelType = graphene.Field(ChildType) + + +class DeleteChildGroup(DeleteModelGroup): + model = Child + modelType = graphene.Field(ChildType) + class DeleteGroup(graphene.Mutation): class Arguments: @@ -80,32 +77,49 @@ class DeleteGroup(graphene.Mutation): def mutate(self, info, orgName, groupName, **kwargs): Organisation.objects.find(name=orgName).objects.groups.all().filter(name=groupName)[0].delete() -class DeleteUserFromGroup(graphene.Mutation): - class Arguments: - orgName = graphene.String() - groupName = graphene.String() - token = graphene.String() - is_teacher = graphene.Boolean() - user = graphene.Field(UserType) - def mutate(self, info, orgName, groupName, token, is_teacher, **kwargs): - if is_teacher: - group = info.context.user.profile.teacher_set.all().filter(org__name=orgName)[0].groups.all().filter(name=groupName)[0] - org = info.context.user.profile.teacher_set.all().filter(org__name=orgName)[0] - print(group, org) - org.groups.remove(group) - return DeleteuserFromGroup(info.context.user) - else: - group = info.context.user.profile.child_set.all().filter(org__name=orgName)[0].groups.all().filter(name=groupName)[0] - org = info.context.user.profile.child_set.all().filter(org__name=orgName)[0] - print(group, org) - org.groups.remove(group) +class RegTeacherClass(graphene.Mutation): + class Arguments: + teacher_id = graphene.ID() + class_id = graphene.ID() + + teacher = graphene.Field(TeacherType) + + def mutate(self, info, teacher_id, class_id): + teacher = Teacher.objects.get(id=teacher_id) + class_ = SubjectClassLocal.objects.get(id=class_id) + + class_.teachers.add(teacher) + class_.save() + return RegTeacherClass(teacher=teacher) + + +class DeleteTeacherClass(graphene.Mutation): + class Arguments: + teacher_id = graphene.ID() + class_id = graphene.ID() + + teacher = graphene.Field(TeacherType) + + def mutate(self, info, teacher_id, class_id): + class_ = SubjectClassLocal.objects.get(id=class_id) + class_.teachers.filter(id=teacher_id)[0].remove() + return DeleteTeacherClass(teacher=Teacher.objects.get(id=teacher_id)) class Mutation(graphene.ObjectType): create_org = CreateOrg.Field() - reg_user_org = RegUserOrg.Field() create_group = CreateGroup.Field() - reg_user_to_group = RegUserGroup.Field() add_group_to_org = AddGroupToOrg.Field() delete_group = DeleteGroup.Field() - delete_user_from_group = DeleteUserFromGroup.Field() \ No newline at end of file + + reg_teacher_org = RegTeacherToOrg.Field() + reg_child_org = RegChildToOrg.Field() + + reg_child_group = RegChildGroup.Field() + + delete_child_group = DeleteChildGroup.Field() + + reg_teacher_class = RegTeacherClass.Field() + delete_teacher_class = DeleteTeacherClass.Field() + + reg_organisator_to_org = RegOrganisatorToOrg.Field() \ No newline at end of file diff --git a/organisations/query.py b/organisations/query.py index 41736e2..4adefd7 100644 --- a/organisations/query.py +++ b/organisations/query.py @@ -1,15 +1,26 @@ import graphene -from .gqlTypes import OrganisationType, RoleType +from .gqlTypes import OrganisationType, RoleType, TeacherType, ChildType, GroupType from .models import Organisation, Role +from graphene import relay +from graphene_django.filter import DjangoFilterConnectionField class Query(graphene.ObjectType): - organisations = graphene.Field(graphene.List(OrganisationType)) roles = graphene.Field(graphene.List(RoleType)) - def resolve_organisations(self, info, **kwargs): - return Organisation.objects.all() + organisations = DjangoFilterConnectionField(OrganisationType) + organisation = relay.Node.Field(OrganisationType) + + teachers = DjangoFilterConnectionField(TeacherType) + teacher = relay.Node.Field(TeacherType) + + children = DjangoFilterConnectionField(ChildType) + child = relay.Node.Field(ChildType) + + group = relay.Node.Field(GroupType) + groups = DjangoFilterConnectionField(GroupType) + def resolve_roles(self, info, **kwargs): return Role.objects.all() \ No newline at end of file diff --git a/users/__pycache__/__init__.cpython-37.pyc b/users/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..075bead Binary files /dev/null and b/users/__pycache__/__init__.cpython-37.pyc differ diff --git a/users/__pycache__/admin.cpython-37.pyc b/users/__pycache__/admin.cpython-37.pyc new file mode 100644 index 0000000..d4fd226 Binary files /dev/null and b/users/__pycache__/admin.cpython-37.pyc differ diff --git a/users/__pycache__/models.cpython-37.pyc b/users/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..0739b21 Binary files /dev/null and b/users/__pycache__/models.cpython-37.pyc differ diff --git a/users/__pycache__/schema.cpython-37.pyc b/users/__pycache__/schema.cpython-37.pyc new file mode 100644 index 0000000..48e75c6 Binary files /dev/null and b/users/__pycache__/schema.cpython-37.pyc differ diff --git a/users/migrations/__pycache__/0001_initial.cpython-37.pyc b/users/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000..a70ce18 Binary files /dev/null and b/users/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/users/migrations/__pycache__/__init__.cpython-37.pyc b/users/migrations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..071127e Binary files /dev/null and b/users/migrations/__pycache__/__init__.cpython-37.pyc differ diff --git a/users/schema.py b/users/schema.py index e57530e..44c26bb 100644 --- a/users/schema.py +++ b/users/schema.py @@ -7,13 +7,29 @@ from django.contrib.auth.models import User from .models import Profile +from graphene import relay + +from graphene_django.filter import DjangoFilterConnectionField + class UserType(graphene_django.DjangoObjectType): class Meta: model = User + pk = graphene.Int() + + def resolve_pk(self, info): + return self.pk class ProfileType(graphene_django.DjangoObjectType): class Meta: model = Profile + interfaces = (relay.Node,) + filter_fields = { + "user__username" : ("exact","contains") + } + pk = graphene.Int() + + def resolve_pk(self, info): + return self.pk class RegisterUserInput(graphene.InputObjectType): username = graphene.String() @@ -36,7 +52,8 @@ class Mutation(graphene.ObjectType): class Query(graphene.ObjectType): hello = graphene.Field(graphene.String, token=graphene.String(required=True)) user_info = graphene.Field(UserType, token=graphene.String(required=True)) - user_profile = graphene.Field(ProfileType, token=graphene.String(required=True)) + profile = relay.Node.Field(ProfileType) + all_profiles = DjangoFilterConnectionField(ProfileType) def resolve_hello(self, info, **kwargs): print(info.context.user.id) @@ -44,8 +61,5 @@ class Query(graphene.ObjectType): def resolve_user_info(self, info, **kwargs): return info.context.user - - def resolve_user_profile(self, info, **kwargs): - return info.context.user.profile schema = graphene.Schema(query=Query, mutation=Mutation) \ No newline at end of file