diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py index 76240edd640148eb9084e79489f30c7da2b26ed8..2e8b2e558e78c84ac83674840f0a3f8b2eb259c5 100644 --- a/aleksis/apps/alsijil/managers.py +++ b/aleksis/apps/alsijil/managers.py @@ -11,7 +11,7 @@ from django.utils.translation import gettext as _ from calendarweek import CalendarWeek from aleksis.apps.chronos.managers import DateRangeQuerySetMixin -from aleksis.core.managers import CurrentSiteManagerWithoutMigrations +from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations if TYPE_CHECKING: from aleksis.core.models import Group @@ -93,7 +93,7 @@ class RegisterObjectRelatedQuerySet(QuerySet): ) -class PersonalNoteManager(CurrentSiteManagerWithoutMigrations): +class PersonalNoteManager(AlekSISBaseManagerWithoutMigrations): """Manager adding specific methods to personal notes.""" def get_queryset(self): @@ -126,7 +126,7 @@ class PersonalNoteQuerySet(RegisterObjectRelatedQuerySet, QuerySet): ) -class LessonDocumentationManager(CurrentSiteManagerWithoutMigrations): +class LessonDocumentationManager(AlekSISBaseManagerWithoutMigrations): pass @@ -136,7 +136,7 @@ class LessonDocumentationQuerySet(RegisterObjectRelatedQuerySet, QuerySet): return self.filter(~Q(topic="") | ~Q(group_note="") | ~Q(homework="")) -class GroupRoleManager(CurrentSiteManagerWithoutMigrations): +class GroupRoleManager(AlekSISBaseManagerWithoutMigrations): pass @@ -160,7 +160,7 @@ class GroupRoleQuerySet(QuerySet): ) -class GroupRoleAssignmentManager(CurrentSiteManagerWithoutMigrations): +class GroupRoleAssignmentManager(AlekSISBaseManagerWithoutMigrations): pass diff --git a/aleksis/apps/alsijil/migrations/0001_initial.py b/aleksis/apps/alsijil/migrations/0001_initial.py index e49edfac8a4cdb1f2684c3f2667d3e1ef18de003..344efdac0df75135647a3093ee20b8d228570b22 100644 --- a/aleksis/apps/alsijil/migrations/0001_initial.py +++ b/aleksis/apps/alsijil/migrations/0001_initial.py @@ -1,9 +1,10 @@ # Generated by Django 3.0.6 on 2020-05-29 10:29 -import django.contrib.sites.managers import django.db.models.deletion from django.db import migrations, models +import aleksis.core.managers + import aleksis.apps.alsijil.models @@ -14,7 +15,6 @@ class Migration(migrations.Migration): dependencies = [ ("core", "0001_initial"), ("chronos", "0001_initial"), - ("sites", "0002_alter_domain_unique"), ] operations = [ @@ -60,22 +60,13 @@ class Migration(migrations.Migration): max_length=100, unique=True, verbose_name="Match expression" ), ), - ( - "site", - models.ForeignKey( - default=1, - editable=False, - on_delete=django.db.models.deletion.CASCADE, - to="sites.Site", - ), - ), ], options={ "verbose_name": "Personal note filter", "verbose_name_plural": "Personal note filters", "ordering": ["identifier"], }, - managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),], + managers=[("objects", aleksis.core.managers.AlekSISBaseManager()),], ), migrations.CreateModel( name="PersonalNote", @@ -116,15 +107,6 @@ class Migration(migrations.Migration): to="core.Person", ), ), - ( - "site", - models.ForeignKey( - default=1, - editable=False, - on_delete=django.db.models.deletion.CASCADE, - to="sites.Site", - ), - ), ], options={ "verbose_name": "Personal note", @@ -180,15 +162,6 @@ class Migration(migrations.Migration): to="chronos.LessonPeriod", ), ), - ( - "site", - models.ForeignKey( - default=1, - editable=False, - on_delete=django.db.models.deletion.CASCADE, - to="sites.Site", - ), - ), ], options={ "verbose_name": "Lesson documentation", diff --git a/aleksis/apps/alsijil/migrations/0002_excuse_type.py b/aleksis/apps/alsijil/migrations/0002_excuse_type.py index 395d2e323cb3396f434da5e0c3ebef768589331b..f480a7e4dc1f8739c7badd333e49423565f187cc 100644 --- a/aleksis/apps/alsijil/migrations/0002_excuse_type.py +++ b/aleksis/apps/alsijil/migrations/0002_excuse_type.py @@ -1,14 +1,14 @@ # Generated by Django 3.0.8 on 2020-07-10 10:46 -import django.contrib.sites.managers import django.db.models.deletion from django.db import migrations, models +import aleksis.core.managers + class Migration(migrations.Migration): dependencies = [ - ("sites", "0002_alter_domain_unique"), ("alsijil", "0001_initial"), ] @@ -41,22 +41,13 @@ class Migration(migrations.Migration): "name", models.CharField(max_length=255, unique=True, verbose_name="Name"), ), - ( - "site", - models.ForeignKey( - default=1, - editable=False, - on_delete=django.db.models.deletion.CASCADE, - to="sites.Site", - ), - ), ], options={ "verbose_name": "Excuse type", "verbose_name_plural": "Excuse types", "ordering": ["name"], }, - managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),], + managers=[("objects", aleksis.core.managers.AlekSISBaseManager()),], ), migrations.AddField( model_name="personalnote", diff --git a/aleksis/apps/alsijil/migrations/0003_extra_mark.py b/aleksis/apps/alsijil/migrations/0003_extra_mark.py index e0da8d97ef6b5ec1b1e45f9e6e6f976864907626..fb77fadf29a1058ef9091b903efd84bb7924a210 100644 --- a/aleksis/apps/alsijil/migrations/0003_extra_mark.py +++ b/aleksis/apps/alsijil/migrations/0003_extra_mark.py @@ -1,14 +1,14 @@ # Generated by Django 3.0.8 on 2020-07-12 12:43 -import django.contrib.sites.managers import django.db.models.deletion from django.db import migrations, models +import aleksis.core.managers + class Migration(migrations.Migration): dependencies = [ - ("sites", "0002_alter_domain_unique"), ("alsijil", "0002_excuse_type"), ] @@ -41,22 +41,13 @@ class Migration(migrations.Migration): "name", models.CharField(max_length=255, unique=True, verbose_name="Name"), ), - ( - "site", - models.ForeignKey( - default=1, - editable=False, - on_delete=django.db.models.deletion.CASCADE, - to="sites.Site", - ), - ), ], options={ "verbose_name": "Extra mark", "verbose_name_plural": "Extra marks", "ordering": ["short_name"], }, - managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),], + managers=[("objects", aleksis.core.managers.AlekSISBaseManager()),], ), migrations.AddField( model_name="personalnote", diff --git a/aleksis/apps/alsijil/migrations/0008_global_permissions.py b/aleksis/apps/alsijil/migrations/0008_global_permissions.py index a7d5ba1e39ef682dab13b242467621ebf8fd033d..bc4d56035d6acc92ce3610b038c042b2336e1654 100644 --- a/aleksis/apps/alsijil/migrations/0008_global_permissions.py +++ b/aleksis/apps/alsijil/migrations/0008_global_permissions.py @@ -1,8 +1,9 @@ # Generated by Django 3.1.5 on 2021-01-21 14:55 -import django.contrib.sites.managers from django.db import migrations, models +import aleksis.core.managers + class Migration(migrations.Migration): @@ -22,7 +23,7 @@ class Migration(migrations.Migration): 'managed': False, }, managers=[ - ('objects', django.contrib.sites.managers.CurrentSiteManager()), + ('objects', aleksis.core.managers.AlekSISBaseManager()), ], ), ] diff --git a/aleksis/apps/alsijil/migrations/0009_group_roles.py b/aleksis/apps/alsijil/migrations/0009_group_roles.py index 5bf3840bf7a4025db2ec5ef9211d4efa37aecff9..78f6f3666cb385a10e6d7101738e66b987fc68f2 100644 --- a/aleksis/apps/alsijil/migrations/0009_group_roles.py +++ b/aleksis/apps/alsijil/migrations/0009_group_roles.py @@ -11,7 +11,6 @@ class Migration(migrations.Migration): dependencies = [ ('core', '0009_default_dashboard'), - ('sites', '0002_alter_domain_unique'), ('alsijil', '0008_global_permissions'), ] @@ -24,7 +23,6 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=255, verbose_name='Name')), ('icon', models.CharField(blank=True, choices=(lambda: ICONS)(), max_length=50, verbose_name='Icon')), ('colour', colorfield.fields.ColorField(blank=True, default='', max_length=18, verbose_name='Colour')), - ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), ], options={ 'verbose_name': 'Group role', @@ -41,7 +39,6 @@ class Migration(migrations.Migration): ('groups', models.ManyToManyField(related_name='group_roles', to='core.Group', verbose_name='Groups')), ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_roles', to='core.person', verbose_name='Assigned person')), ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='alsijil.grouprole', verbose_name='Group role')), - ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), ], options={ 'verbose_name': 'Group role assignment', diff --git a/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py b/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py index f0459292f8d754f1eb98522661dd7b630bd5f69c..1c3bf9ec00c3d3242fd17cbc2ef60d1b097a4458 100644 --- a/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py +++ b/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py @@ -1,7 +1,6 @@ # Generated by Django 3.1.5 on 2021-01-10 15:48 import aleksis.apps.chronos.util.date -import django.contrib.sites.managers from django.db import migrations, models import django.db.models.deletion diff --git a/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py b/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py index ed4edc714dc1c9f7c5c82ca58d3edd6f1628891c..8eee63d2b57da80342e4949c4f416ffbf557bf86 100644 --- a/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py +++ b/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py @@ -20,23 +20,23 @@ class Migration(migrations.Migration): ), migrations.AddConstraint( model_name='excusetype', - constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_excuse_short_name'), + constraint=models.UniqueConstraint(fields=('short_name',), name='unique_excuse_short_name'), ), migrations.AddConstraint( model_name='excusetype', - constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_excuse_name'), + constraint=models.UniqueConstraint(fields=('name',), name='unique_excuse_name'), ), migrations.AddConstraint( model_name='extramark', - constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_mark_short_name'), + constraint=models.UniqueConstraint(fields=('short_name',), name='unique_mark_short_name'), ), migrations.AddConstraint( model_name='extramark', - constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_mark_name'), + constraint=models.UniqueConstraint(fields=('name',), name='unique_mark_name'), ), migrations.AddConstraint( model_name='grouprole', - constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_role_per_site'), + constraint=models.UniqueConstraint(fields=('name',), name='unique_role_per_site'), ), migrations.AddConstraint( model_name='lessondocumentation', diff --git a/aleksis/apps/alsijil/migrations/0018_add_managed_by_app_label.py b/aleksis/apps/alsijil/migrations/0018_add_managed_by_app_label.py new file mode 100644 index 0000000000000000000000000000000000000000..6dd931bdb1abcc253c9964cca778e146e49b56fc --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0018_add_managed_by_app_label.py @@ -0,0 +1,46 @@ +# Generated by Django 4.2.3 on 2023-07-27 14:08 + +import aleksis.core.managers +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0052_site_related_name'), + ('alsijil', '0017_rename_late_to_tardiness'), + ] + + operations = [ + migrations.AddField( + model_name='excusetype', + name='managed_by_app_label', + field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'), + ), + migrations.AddField( + model_name='extramark', + name='managed_by_app_label', + field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'), + ), + migrations.AddField( + model_name='grouprole', + name='managed_by_app_label', + field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'), + ), + migrations.AddField( + model_name='grouproleassignment', + name='managed_by_app_label', + field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'), + ), + migrations.AddField( + model_name='lessondocumentation', + name='managed_by_app_label', + field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'), + ), + migrations.AddField( + model_name='personalnote', + name='managed_by_app_label', + field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'), + ), + ] diff --git a/aleksis/apps/alsijil/migrations/0019_drop_sites.py b/aleksis/apps/alsijil/migrations/0019_drop_sites.py new file mode 100644 index 0000000000000000000000000000000000000000..f293977ae4625ebb6123530b181c57ad66850580 --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0019_drop_sites.py @@ -0,0 +1,85 @@ +# Generated by Django 4.2.9 on 2024-01-11 12:52 + +import colorfield.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('alsijil', '0018_add_managed_by_app_label'), + ] + + operations = [ + migrations.AlterModelOptions( + name='alsijilglobalpermissions', + options={'managed': False, 'permissions': (('view_lesson', 'Can view lesson overview'), ('view_week', 'Can view week overview'), ('view_full_register', 'Can view full register'), ('register_absence', 'Can register absence'), ('list_personal_note_filters', 'Can list all personal note filters'))}, + ), + migrations.AlterModelOptions( + name='grouprole', + options={'permissions': (('assign_group_role', 'Can assign group role'),), 'verbose_name': 'Group role', 'verbose_name_plural': 'Group roles'}, + ), + migrations.AlterModelManagers( + name='excusetype', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='extramark', + managers=[ + ], + ), + migrations.RemoveConstraint( + model_name='excusetype', + name='unique_excuse_short_name', + ), + migrations.RemoveConstraint( + model_name='excusetype', + name='unique_excuse_name', + ), + migrations.RemoveConstraint( + model_name='extramark', + name='unique_mark_short_name', + ), + migrations.RemoveConstraint( + model_name='extramark', + name='unique_mark_name', + ), + migrations.RemoveConstraint( + model_name='grouprole', + name='unique_role_per_site', + ), + ] + [ + migrations.RunSQL( + f"ALTER TABLE alsijil_{model_name} drop column if exists site_id;" + ) for model_name in + [ + "excusetype", + "personalnote", + "lessondocumentation", + "extramark", + "grouprole", + "grouproleassignment", + ] + ] + [ + migrations.AlterField( + model_name='excusetype', + name='count_as_absent', + field=models.BooleanField(default=True, help_text="If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report.", verbose_name='Count as absent'), + ), + migrations.AlterField( + model_name='grouprole', + name='colour', + field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Colour'), + ), + migrations.AlterField( + model_name='grouprole', + name='name', + field=models.CharField(max_length=255, unique=True, verbose_name='Name'), + ), + migrations.AlterField( + model_name='personalnote', + name='groups_of_person', + field=models.ManyToManyField(related_name='+', to='core.group'), + ), + ] diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index 9ffe57c86196479200e2f2d26f332a670ba7c3f1..17a2552567df74f80b4c7aecfcf5465f7dd0bc76 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -72,12 +72,6 @@ class ExcuseType(ExtensibleModel): ordering = ["name"] verbose_name = _("Excuse type") verbose_name_plural = _("Excuse types") - constraints = [ - models.UniqueConstraint( - fields=("site_id", "short_name"), name="unique_excuse_short_name" - ), - models.UniqueConstraint(fields=("site_id", "name"), name="unique_excuse_name"), - ] lesson_related_constraint_q = ( @@ -443,12 +437,6 @@ class ExtraMark(ExtensibleModel): ordering = ["short_name"] verbose_name = _("Extra mark") verbose_name_plural = _("Extra marks") - constraints = [ - models.UniqueConstraint( - fields=("site_id", "short_name"), name="unique_mark_short_name" - ), - models.UniqueConstraint(fields=("site_id", "name"), name="unique_mark_name"), - ] class GroupRole(ExtensibleModel): @@ -456,7 +444,7 @@ class GroupRole(ExtensibleModel): objects = GroupRoleManager.from_queryset(GroupRoleQuerySet)() - name = models.CharField(max_length=255, verbose_name=_("Name")) + name = models.CharField(max_length=255, verbose_name=_("Name"), unique=True) icon = models.CharField(max_length=50, blank=True, choices=ICONS, verbose_name=_("Icon")) colour = ColorField(blank=True, verbose_name=_("Colour")) @@ -466,9 +454,6 @@ class GroupRole(ExtensibleModel): class Meta: verbose_name = _("Group role") verbose_name_plural = _("Group roles") - constraints = [ - models.UniqueConstraint(fields=("site_id", "name"), name="unique_role_per_site"), - ] permissions = (("assign_group_role", _("Can assign group role")),) def get_absolute_url(self) -> str: diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html index 056bea93ca036f54869ad037f84b7575f3a2123d..e4e3960c8a1325acdca09ddcff95d958657d0f62 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html @@ -30,7 +30,7 @@ {% trans "Period" %} </a> </li> - {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %} + {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not SITE_PREFERENCES.alsijil__block_personal_notes_for_cancelled %} <li class="tab col"> <a href="#personal-notes"> <i class="material-icons iconify" data-icon="mdi:account-multiple-outline"></i> @@ -86,7 +86,7 @@ {% endwith %} {% endwith %} - {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %} + {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not SITE_PREFERENCES.alsijil__block_personal_notes_for_cancelled %} <div class="col s12 no-padding" id="personal-notes"> {% include "alsijil/partials/lesson/tabs/notes.html" %} </div> diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html index d8c8273092fee51086fac6b24599da95fef486d0..081f38c5321359ca92241c21ba1f9b1fc71aa926 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html @@ -100,7 +100,7 @@ <div class="col s12" id="week-overview"> {% for weekday, objects in regrouped_objects.items %} {% with weekdays|get_dict:objects.0.weekday as advanced_weekday %} - {% if advanced_weekday.holiday and not request.site.preferences.alsijil__allow_entries_in_holidays %} + {% if advanced_weekday.holiday and not SITE_PREFERENCES.alsijil__allow_entries_in_holidays %} <div class="card"> <div class="card-content"> <span class="card-title"> diff --git a/pyproject.toml b/pyproject.toml index 7472d80e44295737d87bb093b962dcc310c6f345..c19624053cb6d7c1c5779163f9cb66bda9bf9961 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "AlekSIS-App-Alsijil" -version = "3.0.1.dev0" +version = "4.0.dev0" packages = [ { include = "aleksis" } ] @@ -46,11 +46,12 @@ priority = "primary" name = "gitlab" url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple" priority = "supplemental" + [tool.poetry.dependencies] python = "^3.10" -aleksis-core = "^3.0" -aleksis-app-chronos = "^3.0" -aleksis-app-stoelindeling = { version = "^2.0", optional = true } +aleksis-core = "^4.0.0.dev2" +aleksis-app-chronos = "^4.0.0.dev0" +aleksis-app-stoelindeling = { version = "^3.0.dev1", optional = true } [tool.poetry.extras] seatingplans = ["aleksis-app-stoelindeling"]