diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql index 5814088f6211ae52373776001ad52749e9452696..8444f9e35af335080026b221424fda598068c6fc 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql +++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql @@ -37,7 +37,7 @@ query documentationsForCoursebook( id name } - lessonEvent { + amends { id amends { id diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue index 5c6cb5f5c0ed9170736e2fbf6dcd73a81bab917a..ad214b49da74fcab14fd39f456b9e24e2e620c47 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue @@ -78,13 +78,13 @@ export default { }, methods: { updateStatus() { - if (this.documentation?.lessonEvent.cancelled) { + if (this.documentation?.amends.cancelled) { this.currentStatusName = "cancelled"; } else if (this.documentation.topic) { this.currentStatusName = "available"; } else if (DateTime.now() > this.documentationDateTimeEnd) { this.currentStatusName = "missing"; - } else if (this.documentation?.lessonEvent.amends) { + } else if (this.documentation?.amends.amends) { this.currentStatusName = "substitution"; } else if ( DateTime.now() > this.documentationDateTimeStart && diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue index a07172dc5834feb68eeab69cd522774c52279256..09a04bcb67c6ae618fa0b1546a0171af30323885 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue @@ -41,11 +41,10 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue"; /> <subject-chip v-if=" - documentation?.lessonEvent?.amends?.subject && - documentation.lessonEvent.amends.subject.id !== - documentation.subject.id + documentation?.amends?.amends?.subject && + documentation.amends.amends.subject.id !== documentation.subject.id " - :subject="documentation.lessonEvent.amends.subject" + :subject="documentation.amends.amends.subject" v-bind="compact ? dialogActivator.attrs : {}" v-on="compact ? dialogActivator.on : {}" class="text-decoration-line-through" @@ -102,10 +101,10 @@ export default { }, amendedTeachers() { if ( - this.documentation?.lessonEvent?.amends?.teachers && - this.documentation.lessonEvent.amends.teachers.length + this.documentation?.amends?.amends?.teachers && + this.documentation.amends.amends.teachers.length ) { - return this.documentation.lessonEvent.amends.teachers.filter( + return this.documentation.amends.amends.teachers.filter( (at) => !this.documentation.teachers.includes((t) => t.id === at.id), ); } diff --git a/aleksis/apps/alsijil/migrations/0020_add_documentation_and_participation.py b/aleksis/apps/alsijil/migrations/0020_add_documentation_and_participation.py deleted file mode 100644 index 4d910b912e038f5e65f2ba9e5b0947e52297f199..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/migrations/0020_add_documentation_and_participation.py +++ /dev/null @@ -1,148 +0,0 @@ -# Generated by Django 4.2.4 on 2023-08-13 14:53 - -import aleksis.apps.alsijil.models -import aleksis.core.managers -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("chronos", "0016_lessonevent"), - ("core", "0052_site_related_name"), - ("cursus", "0001_initial"), - ("alsijil", "0019_drop_sites"), - ] - - operations = [ - migrations.CreateModel( - name="Documentation", - fields=[ - ( - "calendarevent_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="core.calendarevent", - ), - ), - ( - "topic", - models.CharField(blank=True, max_length=255, verbose_name="Lesson topic"), - ), - ("homework", models.CharField(blank=True, max_length=255, verbose_name="Homework")), - ( - "group_note", - models.CharField(blank=True, max_length=255, verbose_name="Group note"), - ), - ( - "course", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="documentations", - to="cursus.course", - ), - ), - ( - "lesson_event", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="documentation", - to="chronos.lessonevent", - ), - ), - ( - "subject", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="+", - to="cursus.subject", - ), - ), - ], - options={ - "verbose_name": "Documentation", - "verbose_name_plural": "Documentations", - }, - bases=("core.calendarevent",), - ), - migrations.CreateModel( - name="Participation", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name="ID" - ), - ), - ( - "managed_by_app_label", - models.CharField( - blank=True, - editable=False, - max_length=255, - verbose_name="App label of app responsible for managing this instance", - ), - ), - ("extended_data", models.JSONField(default=dict, editable=False)), - ("remarks", models.CharField(blank=True, max_length=255)), - ( - "documentation", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="participations", - to="alsijil.documentation", - ), - ), - ( - "extra_marks", - models.ManyToManyField( - blank=True, to="alsijil.extramark", verbose_name="Extra marks" - ), - ), - ("groups_of_person", models.ManyToManyField(related_name="+", to="core.group")), - ( - "person", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="participations", - to="core.person", - ), - ), - ], - options={ - "verbose_name": "Participation note", - "verbose_name_plural": "Participation notes", - "ordering": ["documentation", "person__last_name", "person__first_name"], - }, - bases=(aleksis.apps.alsijil.models.RegisterObjectRelatedMixin, models.Model), - managers=[ - ("objects", aleksis.core.managers.AlekSISBaseManager()), - ], - ), - migrations.AddConstraint( - model_name="participation", - constraint=models.UniqueConstraint( - fields=("documentation", "person"), name="unique_participation_per_documentation" - ), - ), - migrations.AddConstraint( - model_name="documentation", - constraint=models.CheckConstraint( - check=models.Q( - ("course__isnull", True), ("lesson_event__isnull", True), _negated=True - ), - name="either_course_or_lesson_event", - ), - ), - ] diff --git a/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py b/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..e83ef5e2205280af85df6b5674caf32e10152ee9 --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py @@ -0,0 +1,92 @@ +# Generated by Django 4.2.10 on 2024-04-18 14:48 + +import colorfield.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0061_remove_group_additional_fields'), + ('kolego', '0003_refactor_absence'), + ('cursus', '0003_drop_site'), + ('alsijil', '0019_drop_sites'), + ] + + operations = [ + migrations.CreateModel( + name='Documentation', + fields=[ + ('calendarevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent')), + ('topic', models.CharField(blank=True, max_length=255, verbose_name='Lesson Topic')), + ('homework', models.CharField(blank=True, max_length=255, verbose_name='Homework')), + ('group_note', models.CharField(blank=True, max_length=255, verbose_name='Group Note')), + ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentations', to='cursus.course', verbose_name='Course')), + ('subject', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='cursus.subject', verbose_name='Subject')), + ('teachers', models.ManyToManyField(blank=True, null=True, related_name='documentations_as_teacher', to='core.person', verbose_name='Teachers')), + ], + options={ + 'verbose_name': 'Documentation', + 'verbose_name_plural': 'Documentations', + }, + bases=('core.calendarevent',), + ), + migrations.AddField( + model_name='extramark', + name='colour_bg', + field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Background colour'), + ), + migrations.AddField( + model_name='extramark', + name='colour_fg', + field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Foreground colour'), + ), + migrations.AddField( + model_name='extramark', + name='show_in_coursebook', + field=models.BooleanField(default=True, verbose_name='Show in coursebook'), + ), + migrations.CreateModel( + name='ParticipationStatus', + fields=[ + ('calendarevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent')), + ('absent', models.BooleanField(verbose_name='Absent')), + ('absence_reason', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='kolego.absencereason', verbose_name='Absence Reason')), + ('base_absence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='absences', to='kolego.absence', verbose_name='Base Absence')), + ('groups_of_person', models.ManyToManyField(related_name='+', to='core.group', verbose_name='Groups of Person')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='core.person', verbose_name='Person')), + ('related_documentation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='alsijil.documentation', verbose_name='Documentation')), + ], + options={ + 'verbose_name': 'Participation Status', + 'verbose_name_plural': 'Participation Status', + 'ordering': ['related_documentation', 'person__last_name', 'person__first_name'], + }, + bases=('core.calendarevent',), + ), + migrations.CreateModel( + name='NewPersonalNote', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')), + ('extended_data', models.JSONField(default=dict, editable=False)), + ('note', models.TextField(blank=True, verbose_name='Note')), + ('documentation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='personal_notes', to='alsijil.documentation', verbose_name='Documentation')), + ('extra_mark', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='alsijil.extramark', verbose_name='Extra Mark')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='new_personal_notes', to='core.person', verbose_name='Person')), + ], + options={ + 'verbose_name': 'Personal Note', + 'verbose_name_plural': 'Personal Notes', + }, + ), + migrations.AddConstraint( + model_name='participationstatus', + constraint=models.UniqueConstraint(fields=('related_documentation', 'person'), name='unique_participation_status_per_documentation'), + ), + migrations.AddConstraint( + model_name='newpersonalnote', + constraint=models.CheckConstraint(check=models.Q(models.Q(('note', ''), _negated=True), ('extra_mark__isnull', False), _connector='OR'), name='unique_absence_per_documentation'), + ), + ] diff --git a/aleksis/apps/alsijil/migrations/0021_participationstatus.py b/aleksis/apps/alsijil/migrations/0021_participationstatus.py deleted file mode 100644 index 5f3a7225f0301609a424aed6354bde13f97b086a..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/migrations/0021_participationstatus.py +++ /dev/null @@ -1,113 +0,0 @@ -# Generated by Django 4.2.9 on 2024-01-11 20:43 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('cursus', '0001_initial'), - ('core', '0052_site_related_name'), - ('chronos', '0016_lessonevent'), - ('kolego', '0003_refactor_absence'), - ('alsijil', '0020_add_documentation_and_participation'), - ] - - operations = [ - migrations.CreateModel( - name='NewPersonalNote', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')), - ('extended_data', models.JSONField(default=dict, editable=False)), - ('note', models.TextField(blank=True, verbose_name='Note')), - ], - options={ - 'verbose_name': 'Personal Note', - 'verbose_name_plural': 'Personal Notes', - }, - ), - migrations.CreateModel( - name='ParticipationStatus', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')), - ('extended_data', models.JSONField(default=dict, editable=False)), - ('absent', models.BooleanField(verbose_name='Absent')), - ('absence_reason', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='kolego.absencereason', verbose_name='Absence Reason')), - ('base_absence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='absences', to='kolego.absence', verbose_name='Base Absence')), - ], - options={ - 'verbose_name': 'Participation Status', - 'verbose_name_plural': 'Participation Status', - 'ordering': ['documentation', 'person__last_name', 'person__first_name'], - }, - ), - migrations.AlterField( - model_name='documentation', - name='course', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentations', to='cursus.course', verbose_name='Course'), - ), - migrations.AlterField( - model_name='documentation', - name='group_note', - field=models.CharField(blank=True, max_length=255, verbose_name='Group Note'), - ), - migrations.AlterField( - model_name='documentation', - name='lesson_event', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentation', to='chronos.lessonevent', verbose_name='Lesson Event'), - ), - migrations.AlterField( - model_name='documentation', - name='subject', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='cursus.subject', verbose_name='Subject'), - ), - migrations.AlterField( - model_name='documentation', - name='topic', - field=models.CharField(blank=True, max_length=255, verbose_name='Lesson Topic'), - ), - migrations.DeleteModel( - name='Participation', - ), - migrations.AddField( - model_name='participationstatus', - name='documentation', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='alsijil.documentation', verbose_name='Documentation'), - ), - migrations.AddField( - model_name='participationstatus', - name='groups_of_person', - field=models.ManyToManyField(related_name='+', to='core.group', verbose_name='Groups of Person'), - ), - migrations.AddField( - model_name='participationstatus', - name='person', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='core.person', verbose_name='Person'), - ), - migrations.AddField( - model_name='newpersonalnote', - name='documentation', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='personal_notes', to='alsijil.documentation', verbose_name='Documentation'), - ), - migrations.AddField( - model_name='newpersonalnote', - name='extra_mark', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='alsijil.extramark', verbose_name='Extra Mark'), - ), - migrations.AddField( - model_name='newpersonalnote', - name='person', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='new_personal_notes', to='core.person', verbose_name='Person'), - ), - migrations.AddConstraint( - model_name='participationstatus', - constraint=models.UniqueConstraint(fields=('documentation', 'person'), name='unique_participation_status_per_documentation'), - ), - migrations.AddConstraint( - model_name='newpersonalnote', - constraint=models.CheckConstraint(check=models.Q(models.Q(('note', ''), _negated=True), ('extra_mark__isnull', False), _connector='OR'), name='unique_absence_per_documentation'), - ), - ] diff --git a/aleksis/apps/alsijil/migrations/0022_documentation_teachers.py b/aleksis/apps/alsijil/migrations/0022_documentation_teachers.py deleted file mode 100644 index 8e6c30bd98de76e717727c92c9d0d8735791514b..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/migrations/0022_documentation_teachers.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.2.9 on 2024-03-16 00:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("core", "0061_remove_group_additional_fields"), - ("alsijil", "0021_participationstatus"), - ] - - operations = [ - migrations.AddField( - model_name="documentation", - name="teachers", - field=models.ManyToManyField( - blank=True, - null=True, - related_name="documentations_as_teacher", - to="core.person", - verbose_name="Teachers", - ), - ), - ] diff --git a/aleksis/apps/alsijil/migrations/0023_extramark_colour_bg_extramark_colour_fg_and_more.py b/aleksis/apps/alsijil/migrations/0023_extramark_colour_bg_extramark_colour_fg_and_more.py deleted file mode 100644 index e47867577007ee4d853863ba2dfab157235f6068..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/migrations/0023_extramark_colour_bg_extramark_colour_fg_and_more.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 4.2.9 on 2024-03-16 01:05 - -import colorfield.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("alsijil", "0022_documentation_teachers"), - ] - - operations = [ - migrations.AddField( - model_name="extramark", - name="colour_bg", - field=colorfield.fields.ColorField( - blank=True, - default="", - image_field=None, - max_length=25, - samples=None, - verbose_name="Background colour", - ), - ), - migrations.AddField( - model_name="extramark", - name="colour_fg", - field=colorfield.fields.ColorField( - blank=True, - default="", - image_field=None, - max_length=25, - samples=None, - verbose_name="Foreground colour", - ), - ), - migrations.AddField( - model_name="extramark", - name="show_in_coursebook", - field=models.BooleanField(default=True, verbose_name="Show in coursebook"), - ), - ] diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index 32cbe12f4971b2676e119807367bc718504d0524..332c428fa7eff2095dc3ec83eb013ee759bab42b 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -467,15 +467,6 @@ class Documentation(CalendarEvent): verbose_name=_("Course"), ) - lesson_event = models.ForeignKey( - LessonEvent, - models.PROTECT, - related_name="documentation", - blank=True, - null=True, - verbose_name=_("Lesson Event"), - ) - subject = models.ForeignKey( Subject, models.PROTECT, related_name="+", blank=True, null=True, verbose_name=_("Subject") ) @@ -495,17 +486,17 @@ class Documentation(CalendarEvent): def get_subject(self) -> str: if self.subject: return self.subject - if self.lesson_event: - if self.lesson_event.subject: - return self.lesson_event.subject - if self.lesson_event.course: - return self.lesson_event.course.subject + if self.amends: + if self.amends.subject: + return self.amends.subject + if self.amends.course: + return self.amends.course.subject if self.course: return self.course.subject def get_groups(self) -> QuerySet[Group]: - if self.lesson_event: - return self.lesson_event.actual_groups + if self.amends: + return self.amends.actual_groups if self.course: return self.course.groups.all() @@ -520,12 +511,8 @@ class Documentation(CalendarEvent): class Meta: verbose_name = _("Documentation") verbose_name_plural = _("Documentations") - constraints = [ - models.CheckConstraint( - check=~Q(course__isnull=True, lesson_event__isnull=True), - name="either_course_or_lesson_event", - ), - ] + # should check if object has either course or amends, + # which is not possible via constraint, because amends is not local to Documentation @classmethod def get_for_coursebook( @@ -571,7 +558,7 @@ class Documentation(CalendarEvent): continue event_reference_obj = event["REFERENCE_OBJECT"] - existing_documentations = event_reference_obj.documentation.filter( + existing_documentations = event_reference_obj.amended_by.filter( datetime_start=event["DTSTART"].dt, datetime_end=event["DTEND"].dt, ) @@ -598,7 +585,7 @@ class Documentation(CalendarEvent): docs.append( cls( pk=f"DUMMY;{event_reference_obj.id};{event['DTSTART'].dt.isoformat()};{event['DTEND'].dt.isoformat()}", - lesson_event=event_reference_obj, + amends=event_reference_obj, course=course, subject=subject, datetime_start=event["DTSTART"].dt, @@ -609,7 +596,7 @@ class Documentation(CalendarEvent): return docs -class ParticipationStatus(ExtensibleModel): +class ParticipationStatus(CalendarEvent): """A participation or absence record about a single person. Used in the class register to note participation or absence of a student @@ -625,7 +612,7 @@ class ParticipationStatus(ExtensibleModel): "core.Group", related_name="+", verbose_name=_("Groups of Person") ) - documentation = models.ForeignKey( + related_documentation = models.ForeignKey( Documentation, models.CASCADE, related_name="participations", @@ -648,19 +635,19 @@ class ParticipationStatus(ExtensibleModel): ) def __str__(self) -> str: - return f"{self.documentation}, {self.person}" + return f"{self.related_documentation}, {self.person}" class Meta: verbose_name = _("Participation Status") verbose_name_plural = _("Participation Status") ordering = [ - "documentation", + "related_documentation", "person__last_name", "person__first_name", ] constraints = [ models.UniqueConstraint( - fields=("documentation", "person"), + fields=("related_documentation", "person"), name="unique_participation_status_per_documentation", ), ] diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py index d762a9874e9ad85f98de86a2adff2fdd4af388fd..aae1b70603f0b0e5c738d81467d31f3844f13a86 100644 --- a/aleksis/apps/alsijil/schema/__init__.py +++ b/aleksis/apps/alsijil/schema/__init__.py @@ -39,7 +39,7 @@ class Query(graphene.ObjectType): def resolve_documentations_by_course_id(root, info, course_id, **kwargs): documentations = Documentation.objects.filter( - Q(course__pk=course_id) | Q(lesson_event__course__pk=course_id) + Q(course__pk=course_id) | Q(amends__course__pk=course_id) ) return documentations diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py index 52b92549ffe5a6baba40a2c8976bcd7ab0d9dd56..3225db34e7c146c4eadcf34efcc11936f5df7311 100644 --- a/aleksis/apps/alsijil/schema/documentation.py +++ b/aleksis/apps/alsijil/schema/documentation.py @@ -10,6 +10,7 @@ from reversion import create_revision, set_comment, set_user from aleksis.apps.alsijil.util.predicates import can_edit_documentation, is_in_allowed_time_range from aleksis.apps.chronos.models import LessonEvent +from aleksis.apps.chronos.schema import LessonEventType from aleksis.apps.cursus.models import Subject from aleksis.apps.cursus.schema import CourseType, SubjectType from aleksis.core.models import Person @@ -28,7 +29,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp fields = ( "id", "course", - "lesson_event", + "amends", "subject", "topic", "homework", @@ -45,6 +46,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp } course = graphene.Field(CourseType, required=False) + amends = graphene.Field(lambda: LessonEventType, required=False) subject = graphene.Field(SubjectType, required=False) future_notice = graphene.Boolean(required=False) @@ -55,12 +57,12 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp def resolve_teachers(root: Documentation, info, **kwargs): if not str(root.pk).startswith("DUMMY") and hasattr(root, "teachers"): return root.teachers - elif root.lesson_event.amends: - if root.lesson_event.teachers: - return root.lesson_event.teachers + elif root.amends.amends: + if root.amends.teachers: + return root.amends.teachers else: - return root.lesson_event.amends.teachers - return root.lesson_event.teachers + return root.amends.amends.teachers + return root.amends.teachers @staticmethod def resolve_future_notice(root: Documentation, info, **kwargs): @@ -148,7 +150,7 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation): obj = Documentation.objects.create( datetime_start=datetime_start, datetime_end=datetime_end, - lesson_event=lesson_event, + amends=lesson_event, course=course, subject=subject, topic=doc.topic or "", diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py index 33bda1e7d5a586ff759eaf83f4b231ed43bf08c5..fe7746948d807f3afede2a8fd3a11b41358965f5 100644 --- a/aleksis/apps/alsijil/util/predicates.py +++ b/aleksis/apps/alsijil/util/predicates.py @@ -390,13 +390,10 @@ def is_documentation_teacher(user: User, obj: Documentation): if obj: if not str(obj.pk).startswith("DUMMY") and hasattr(obj, "teachers"): teachers = obj.teachers - elif obj.lesson_event.amends: - if obj.lesson_event.teachers: - teachers = obj.lesson_event.teachers - else: - teachers = obj.lesson_event.amends.teachers + elif obj.amends.amends: + teachers = obj.amends.teachers if obj.amends.teachers else obj.amends.amends.teachers else: - teachers = obj.lesson_event.teachers + teachers = obj.amends.teachers return user.person in teachers.all() return False @@ -407,11 +404,11 @@ def can_view_documentation(user: User, obj: Documentation): if obj: if is_documentation_teacher(user, obj): return True - if obj.lesson_event: + if obj.amends: return ( - is_lesson_event_teacher(user, obj.lesson_event) - | is_lesson_event_member(user, obj.lesson_event) - | is_lesson_event_group_owner(user, obj.lesson_event) + is_lesson_event_teacher(user, obj.amends) + | is_lesson_event_member(user, obj.amends) + | is_lesson_event_group_owner(user, obj.amends) ) if obj.course: return is_course_teacher(user, obj.course) @@ -425,7 +422,7 @@ def can_view_any_documentation(user: User): return Documentation.objects.filter( Q(teachers=user.person) - | Q(lesson_event__in=allowed_lesson_events) + | Q(amends__in=allowed_lesson_events) | Q(course__teachers=user.person) ).exists() @@ -436,9 +433,9 @@ def can_edit_documentation(user: User, obj: Documentation): if obj: if is_documentation_teacher(user, obj): return True - if obj.lesson_event: - return is_lesson_event_teacher(user, obj.lesson_event) | is_lesson_event_group_owner( - user, obj.lesson_event + if obj.amends: + return is_lesson_event_teacher(user, obj.amends) | is_lesson_event_group_owner( + user, obj.amends ) return False