diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index 980dd7eab3edc5416d91b3e199f6324251db0cd0..da700e752979feb22950d1ac2a32fa9b279e274d 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -121,10 +121,11 @@ class EditPersonForm(ExtensibleForm): return PersonAccountForm.clean(self) -class EditGroupForm(ExtensibleForm): +class EditGroupForm(SchoolYearRelatedExtensibleForm): """Form to edit an existing group in the frontend.""" layout = Layout( + Fieldset(_("School year"), "school_year"), Fieldset(_("Common data"), "name", "short_name", "group_type"), Fieldset(_("Persons"), "members", "owners", "parent_groups"), Fieldset(_("Additional fields"), "additional_fields"), @@ -169,7 +170,9 @@ class AnnouncementForm(ExtensibleForm): persons = forms.ModelMultipleChoiceField( Person.objects.all(), label=_("Persons"), required=False ) - groups = forms.ModelMultipleChoiceField(Group.objects.all(), label=_("Groups"), required=False) + groups = forms.ModelMultipleChoiceField( + queryset=Group.objects.for_current_school_year_or_all(), label=_("Groups"), required=False + ) layout = Layout( Fieldset( @@ -204,6 +207,8 @@ class AnnouncementForm(ExtensibleForm): super().__init__(*args, **kwargs) + self.fields["groups"].queryset = Group.objects.for_current_school_year_or_all() + def clean(self): data = super().clean() diff --git a/aleksis/core/migrations/0003_group_school_year.py b/aleksis/core/migrations/0003_group_school_year.py new file mode 100644 index 0000000000000000000000000000000000000000..e2e31959288a87ed29fb7e97f1c20751c67ecf9d --- /dev/null +++ b/aleksis/core/migrations/0003_group_school_year.py @@ -0,0 +1,43 @@ +# Generated by Django 3.0.6 on 2020-06-04 15:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0002_school_year'), + ] + + operations = [ + migrations.AlterModelManagers( + name='group', + managers=[ + ], + ), + migrations.AddField( + model_name='group', + name='school_year', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='core.SchoolYear', verbose_name='Linked school year'), + ), + migrations.AlterField( + model_name='group', + name='name', + field=models.CharField(max_length=255, verbose_name='Long name'), + ), + migrations.AlterField( + model_name='group', + name='short_name', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Short name'), + ), + migrations.AddConstraint( + model_name='group', + constraint=models.UniqueConstraint(fields=('school_year', 'name'), name='unique_school_year_name'), + ), + migrations.AddConstraint( + model_name='group', + constraint=models.UniqueConstraint(fields=('school_year', 'short_name'), + name='unique_school_year_short_name'), + ), + ] diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 5b0cbf720839240daad4edb2b708c734d8d45a0c..9818849d081bf86f52fc140c13ef23a89d631782 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -305,7 +305,7 @@ class AdditionalField(ExtensibleModel): verbose_name_plural = _("Addtitional fields for groups") -class Group(ExtensibleModel): +class Group(SchoolYearRelatedExtensibleModel): """Group model. Any kind of group of persons in a school, including, but not limited @@ -317,10 +317,16 @@ class Group(ExtensibleModel): verbose_name = _("Group") verbose_name_plural = _("Groups") permissions = (("assign_child_groups_to_groups", _("Can assign child groups to groups")),) + constraints = [ + models.UniqueConstraint(fields=["school_year", "name"], name="unique_school_year_name"), + models.UniqueConstraint( + fields=["school_year", "short_name"], name="unique_school_year_short_name" + ), + ] icon_ = "group" - name = models.CharField(verbose_name=_("Long name"), max_length=255, unique=True) + name = models.CharField(verbose_name=_("Long name"), max_length=255) short_name = models.CharField( verbose_name=_("Short name"), max_length=255, blank=True, null=True # noqa ) @@ -363,7 +369,10 @@ class Group(ExtensibleModel): return list(self.members.all()) + list(self.owners.all()) def __str__(self) -> str: - return f"{self.name} ({self.short_name})" + if self.school_year: + return f"{self.name} ({self.short_name}) ({self.school_year})" + else: + return f"{self.name} ({self.short_name})" def save(self, *args, **kwargs): super().save(*args, **kwargs) diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py index b6c8f3a157aa31e19808d86a703abfdb387e81b4..f8e269bf2d812f13af46b0c8f962c2e4813dabd4 100644 --- a/aleksis/core/tables.py +++ b/aleksis/core/tables.py @@ -40,6 +40,7 @@ class GroupsTable(tables.Table): name = tables.LinkColumn("group_by_id", args=[A("id")]) short_name = tables.LinkColumn("group_by_id", args=[A("id")]) + school_year = tables.Column() class GroupTypesTable(tables.Table):