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