diff --git a/apps/participation/forms.py b/apps/participation/forms.py index 121d49d..b75c1b8 100644 --- a/apps/participation/forms.py +++ b/apps/participation/forms.py @@ -12,7 +12,6 @@ from django.core.exceptions import ValidationError from django.core.validators import FileExtensionValidator from django.utils.translation import gettext_lazy as _ from pypdf import PdfFileReader - from registration.models import VolunteerRegistration from .models import Note, Participation, Passage, Pool, Solution, Synthesis, Team, Tournament diff --git a/apps/participation/management/commands/fix_matrix_channels.py b/apps/participation/management/commands/fix_matrix_channels.py index 9ae30c2..1cf99df 100644 --- a/apps/participation/management/commands/fix_matrix_channels.py +++ b/apps/participation/management/commands/fix_matrix_channels.py @@ -8,7 +8,7 @@ from django.core.management import BaseCommand from django.utils.http import urlencode from django.utils.translation import activate from participation.models import Team, Tournament -from registration.models import AdminRegistration, Registration, VolunteerRegistration +from registration.models import Registration, VolunteerRegistration from tfjm.matrix import Matrix, RoomPreset, RoomVisibility @@ -163,7 +163,7 @@ class Command(BaseCommand): self.stdout.write(f"Invite {volunteer} in #aide-jury-orgas...") # Admins are admins - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): self.stdout.write(f"Invite {admin} in #cno and #dev-bot...") await Matrix.invite("#cno:tfjm.org", f"@{admin.matrix_username}:tfjm.org") await Matrix.invite("#dev-bot:tfjm.org", f"@{admin.matrix_username}:tfjm.org") @@ -264,7 +264,7 @@ class Command(BaseCommand): await Matrix.set_room_avatar(f"#tirage-au-sort-{slug}:tfjm.org", avatar_uri) # Invite admins and give permissions - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): self.stdout.write(f"Invite {admin} in all channels of the tournament {name}...") await Matrix.invite(f"#annonces-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") await Matrix.invite(f"#flood-{slug}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") @@ -374,7 +374,7 @@ class Command(BaseCommand): "customwidget", "Tableau", str(pool)) # Invite admins and give permissions - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): await Matrix.invite(f"#poule-{slug}-{pool.id}{suffix}:tfjm.org", f"@{admin.matrix_username}:tfjm.org") await Matrix.invite(f"#poule-{slug}-{pool.id}{suffix}-jurys:tfjm.org", diff --git a/apps/participation/management/commands/fix_sympa_lists.py b/apps/participation/management/commands/fix_sympa_lists.py index 73abb90..4089a08 100644 --- a/apps/participation/management/commands/fix_sympa_lists.py +++ b/apps/participation/management/commands/fix_sympa_lists.py @@ -4,7 +4,7 @@ from django.core.management import BaseCommand from django.db.models import Q from participation.models import Team, Tournament -from registration.models import AdminRegistration, ParticipantRegistration, VolunteerRegistration +from registration.models import ParticipantRegistration, VolunteerRegistration from tfjm.lists import get_sympa_client @@ -71,5 +71,5 @@ class Command(BaseCommand): slug = jury_in.tournament.name.lower().replace(" ", "-") sympa.subscribe(volunteer.user.email, f"jurys-{slug}", True) - for admin in AdminRegistration.objects.all(): + for admin in VolunteerRegistration.objects.filter(admin=True).all(): sympa.subscribe(admin.user.email, "admins", True) diff --git a/apps/registration/admin.py b/apps/registration/admin.py index 04486cb..10ba861 100644 --- a/apps/registration/admin.py +++ b/apps/registration/admin.py @@ -5,12 +5,12 @@ from django.contrib import admin from django.contrib.admin import ModelAdmin from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicParentModelAdmin -from .models import AdminRegistration, CoachRegistration, Payment, Registration, StudentRegistration +from .models import CoachRegistration, Payment, Registration, StudentRegistration, VolunteerRegistration @admin.register(Registration) class RegistrationAdmin(PolymorphicParentModelAdmin): - child_models = (StudentRegistration, CoachRegistration, AdminRegistration,) + child_models = (StudentRegistration, CoachRegistration, VolunteerRegistration,) list_display = ("user", "type", "email_confirmed",) polymorphic_list = True @@ -25,8 +25,8 @@ class CoachRegistrationAdmin(PolymorphicChildModelAdmin): pass -@admin.register(AdminRegistration) -class AdminRegistrationAdmin(PolymorphicChildModelAdmin): +@admin.register(VolunteerRegistration) +class VolunteerRegistrationAdmin(PolymorphicChildModelAdmin): pass diff --git a/apps/registration/api/serializers.py b/apps/registration/api/serializers.py index 8f2c902..0c00600 100644 --- a/apps/registration/api/serializers.py +++ b/apps/registration/api/serializers.py @@ -4,16 +4,10 @@ from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer -from ..models import AdminRegistration, CoachRegistration, ParticipantRegistration, \ +from ..models import CoachRegistration, ParticipantRegistration, \ StudentRegistration, VolunteerRegistration -class AdminSerializer(serializers.ModelSerializer): - class Meta: - model = AdminRegistration - fields = '__all__' - - class CoachSerializer(serializers.ModelSerializer): class Meta: model = CoachRegistration @@ -40,7 +34,6 @@ class VolunteerSerializer(serializers.ModelSerializer): class RegistrationSerializer(PolymorphicSerializer): model_serializer_mapping = { - AdminRegistration: AdminSerializer, CoachRegistration: CoachSerializer, StudentRegistration: StudentSerializer, VolunteerRegistration: VolunteerSerializer, diff --git a/apps/registration/apps.py b/apps/registration/apps.py index e846ea5..9e5146f 100644 --- a/apps/registration/apps.py +++ b/apps/registration/apps.py @@ -20,4 +20,3 @@ class RegistrationConfig(AppConfig): post_save.connect(create_payment, "registration.Registration") post_save.connect(create_payment, "registration.StudentRegistration") post_save.connect(create_payment, "registration.CoachRegistration") - post_save.connect(create_payment, "registration.AdminRegistration") diff --git a/apps/registration/forms.py b/apps/registration/forms.py index e114842..a79ec76 100644 --- a/apps/registration/forms.py +++ b/apps/registration/forms.py @@ -8,7 +8,7 @@ from django.core.exceptions import ValidationError from django.forms import FileInput from django.utils.translation import gettext_lazy as _ -from .models import AdminRegistration, CoachRegistration, ParticipantRegistration, Payment, \ +from .models import CoachRegistration, ParticipantRegistration, Payment, \ StudentRegistration, VolunteerRegistration @@ -50,14 +50,6 @@ class AddOrganizerForm(forms.ModelForm): """ Signup form to registers volunteers """ - type = forms.ChoiceField( - label=lambda: _("role").capitalize(), - choices=lambda: [ - ("volunteer", _("volunteer").capitalize()), - ("admin", _("admin").capitalize()), - ], - initial="volunteer", - ) def clean_email(self): """ @@ -76,7 +68,7 @@ class AddOrganizerForm(forms.ModelForm): class Meta: model = User - fields = ('first_name', 'last_name', 'email', 'type',) + fields = ('first_name', 'last_name', 'email',) class UserForm(forms.ModelForm): @@ -192,16 +184,7 @@ class VolunteerRegistrationForm(forms.ModelForm): """ class Meta: model = VolunteerRegistration - fields = ('professional_activity', 'give_contact_to_animath', 'email_confirmed',) - - -class AdminRegistrationForm(forms.ModelForm): - """ - Admins can tell everything they want. - """ - class Meta: - model = AdminRegistration - fields = ('role', 'give_contact_to_animath', 'email_confirmed',) + fields = ('professional_activity', 'admin', 'give_contact_to_animath', 'email_confirmed',) class PaymentForm(forms.ModelForm): diff --git a/apps/registration/migrations/0004_volunteer_admin.py b/apps/registration/migrations/0004_volunteer_admin.py new file mode 100644 index 0000000..b26e132 --- /dev/null +++ b/apps/registration/migrations/0004_volunteer_admin.py @@ -0,0 +1,51 @@ +# Generated by Django 3.2.18 on 2023-02-19 22:13 +from django.contrib.contenttypes.models import ContentType +from django.db import migrations, models +from django.db.models import F + + +def merge_admins(apps, schema_editor): + AdminRegistration = apps.get_model('registration', 'AdminRegistration') + VolunteerRegistration = apps.get_model('registration', 'VolunteerRegistration') + db_alias = schema_editor.connection.alias + AdminRegistration.objects.using(db_alias).update(admin=True) + for admin in AdminRegistration.objects.all(): + admin.professional_activity = admin.role + admin.polymorphic_ctype_id = ContentType.objects.get_for_model(VolunteerRegistration).id + admin.save() + + +def separate_admins(apps, schema_editor): + AdminRegistration = apps.get_model('registration', 'AdminRegistration') + VolunteerRegistration = apps.get_model('registration', 'VolunteerRegistration') + for admin in VolunteerRegistration.objects.filter(admin=True).all(): + admin.delete() + AdminRegistration.objects.create(user=admin.user, + professional_activity=admin.professional_activity, + role=admin.professional_activity) + + +class Migration(migrations.Migration): + dependencies = [ + ('participation', '0003_alter_team_trigram'), + ('registration', '0003_alter_participantregistration_zip_code'), + ] + + operations = [ + migrations.AddField( + model_name='volunteerregistration', + name='admin', + field=models.BooleanField( + default=False, + help_text="An administrator has all rights. Please don't give this right to all juries and volunteers.", + verbose_name='administrator'), + ), + migrations.RunPython( + merge_admins, + separate_admins, + elidable=True, + ), + migrations.DeleteModel( + name='AdminRegistration', + ), + ] diff --git a/apps/registration/models.py b/apps/registration/models.py index 8bd9fb4..8c688c2 100644 --- a/apps/registration/models.py +++ b/apps/registration/models.py @@ -22,7 +22,7 @@ class Registration(PolymorphicModel): """ Registrations store extra content that are not asked in the User Model. This is specific to the role of the user, see StudentRegistration, - ClassRegistration or AdminRegistration.. + CoachRegistration or VolunteerRegistration. """ user = models.OneToOneField( "auth.User", @@ -79,7 +79,7 @@ class Registration(PolymorphicModel): @property def is_admin(self): - return isinstance(self, AdminRegistration) or self.user.is_superuser + return isinstance(self, VolunteerRegistration) and self.admin or self.user.is_superuser @property def is_volunteer(self): @@ -287,13 +287,19 @@ class VolunteerRegistration(Registration): verbose_name=_("professional activity"), ) + admin = models.BooleanField( + verbose_name=_("administrator"), + help_text=_("An administrator has all rights. Please don't give this right to all juries and volunteers."), + default=False, + ) + @property def interesting_tournaments(self) -> set: return set(self.organized_tournaments.all()).union(map(lambda pool: pool.tournament, self.jury_in.all())) @property def type(self): - return _('volunteer') + return _('admin') if self.is_admin else _('volunteer') @property def form_class(self): @@ -301,29 +307,6 @@ class VolunteerRegistration(Registration): return VolunteerRegistrationForm -class AdminRegistration(VolunteerRegistration): - """ - Specific registration for admins. - They have a field to justify they status. - """ - role = models.TextField( - verbose_name=_("role of the administrator"), - ) - - @property - def type(self): - return _("admin") - - @property - def form_class(self): - from registration.forms import AdminRegistrationForm - return AdminRegistrationForm - - class Meta: - verbose_name = _("admin registration") - verbose_name_plural = _("admin registrations") - - def get_scholarship_filename(instance, filename): return f"authorization/scholarship/scholarship_{instance.registration.pk}" diff --git a/apps/registration/signals.py b/apps/registration/signals.py index b8f6a12..ed4981d 100644 --- a/apps/registration/signals.py +++ b/apps/registration/signals.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from tfjm.lists import get_sympa_client -from .models import AdminRegistration, Payment, Registration +from .models import Payment, Registration, VolunteerRegistration def set_username(instance, **_): @@ -40,7 +40,7 @@ def create_admin_registration(instance, **_): ensure that an admin registration is created. """ if instance.is_superuser: - AdminRegistration.objects.get_or_create(user=instance) + VolunteerRegistration.objects.get_or_create(user=instance, admin=True) def create_payment(instance: Registration, **_): diff --git a/apps/registration/tables.py b/apps/registration/tables.py index 31e39c0..770279b 100644 --- a/apps/registration/tables.py +++ b/apps/registration/tables.py @@ -19,7 +19,7 @@ class RegistrationTable(tables.Table): ) def order_type(self, queryset, desc): - types = ["volunteerregistration__adminregistration", "volunteerregistration", "participantregistration"] + types = ["-volunteerregistration__admin", "volunteerregistration", "participantregistration"] return queryset.order_by(*(("-" if desc else "") + t for t in types)), True class Meta: diff --git a/apps/registration/templates/registration/user_detail.html b/apps/registration/templates/registration/user_detail.html index f977dd8..8dc7e5d 100644 --- a/apps/registration/templates/registration/user_detail.html +++ b/apps/registration/templates/registration/user_detail.html @@ -107,8 +107,8 @@