diff --git a/src/api/serializers.py b/src/api/serializers.py index 087a3fc22b3d6710493193198cc3394d31874d75..ac19fd91ecf768c599b909d875f1ddd9c119dbc3 100644 --- a/src/api/serializers.py +++ b/src/api/serializers.py @@ -114,10 +114,14 @@ class ConferenceSerializer(HubModelSerializer): 'is_public', 'start', 'end', + 'registration_start', 'registration_deadline', 'tracks', ] - staff_only_fields = ['is_public'] + staff_only_fields = [ + 'is_public', + 'publication_date', + ] class ConferenceTrackSerializer(HubModelSerializer): diff --git a/src/backoffice/views/assemblies.py b/src/backoffice/views/assemblies.py index 44fc93eceba29b9c60a4b2d5d429c9242a6b9bc6..b2ca54024d054b3679937bb6d482162fceadd89a 100644 --- a/src/backoffice/views/assemblies.py +++ b/src/backoffice/views/assemblies.py @@ -6,7 +6,7 @@ from rest_framework.authtoken.models import Token from django.conf import settings from django.contrib import messages from django.core.exceptions import PermissionDenied -from django.http import Http404, HttpResponse +from django.http import Http404, HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils import timezone @@ -20,7 +20,7 @@ from django.views.generic.edit import CreateView, FormView, UpdateView from core.integrations import BigBlueButton, Hangar, IntegrationError, WorkAdventure from core.models.assemblies import Assembly, AssemblyLink, AssemblyMember -from core.models.conference import ConferenceExportCache +from core.models.conference import ConferenceExportCache, ConferenceMember from core.models.events import Event from core.models.rooms import Room, RoomLink from core.models.sso import Application @@ -57,6 +57,13 @@ class CreateAssemblyView(ConferenceLoginRequiredMixin, CreateView): require_conference_open = True template_name = 'backoffice/assembly_create.html' + def dispatch(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + member = ConferenceMember.objects.get(conference=self.conference, user=request.user) + if (member.is_staff and member.has_perm('core.assembly_team')) or self.conference.is_open: + return super().dispatch(request, *args, **kwargs) + + raise PermissionDenied + def get_context_data(self, *args, **kwargs): return { **super().get_context_data(*args, **kwargs), diff --git a/src/core/locale/de/LC_MESSAGES/django.po b/src/core/locale/de/LC_MESSAGES/django.po index df12d0bb9b1cc503b37d429dfcbd065ffb39c56b..6ab69f2a63e0abac805fc2a150ce71e84b5a4b05 100644 --- a/src/core/locale/de/LC_MESSAGES/django.po +++ b/src/core/locale/de/LC_MESSAGES/django.po @@ -673,6 +673,12 @@ msgstr "Konferenz öffentlich anzeigen" msgid "Conference__is_public" msgstr "veröffentlicht" +msgid "Conference__registration_start__help" +msgstr "Start der Registrierung für Assemblies." + +msgid "Conference__registration_start" +msgstr "Registrierungsstart" + msgid "Conference__registration_deadline__help" msgstr "" diff --git a/src/core/locale/en/LC_MESSAGES/django.po b/src/core/locale/en/LC_MESSAGES/django.po index e6cc0f624812b918b8bf935c680f9aa8ca254e04..d6ff37c1671277eb264cab8e52e803c4a14ff235 100644 --- a/src/core/locale/en/LC_MESSAGES/django.po +++ b/src/core/locale/en/LC_MESSAGES/django.po @@ -673,6 +673,12 @@ msgstr "show this conference publically" msgid "Conference__is_public" msgstr "is public" +msgid "Conference__registration_start__help" +msgstr "from this point in time registration will be available" + +msgid "Conference__registration_start" +msgstr "registration start" + msgid "Conference__registration_deadline__help" msgstr "until this point in time registration will be available" diff --git a/src/core/migrations/0150_conference_registration_start.py b/src/core/migrations/0150_conference_registration_start.py new file mode 100644 index 0000000000000000000000000000000000000000..b35627657f640b2b105ad851b673b30fa8b6a9c9 --- /dev/null +++ b/src/core/migrations/0150_conference_registration_start.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.2 on 2024-10-19 18:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0149_alter_event_additional_data"), + ] + + operations = [ + migrations.AddField( + model_name="conference", + name="registration_start", + field=models.DateTimeField( + blank=True, + help_text="Conference__registration_start__help", + null=True, + verbose_name="Conference__registration_start", + ), + ), + ] diff --git a/src/core/models/conference.py b/src/core/models/conference.py index f604e69bc59a3a580d1b017482b6b523361bbb75..c65edfe5ebe18fc1b04ed6f96d0d4ea2ca50ca16 100644 --- a/src/core/models/conference.py +++ b/src/core/models/conference.py @@ -230,6 +230,9 @@ class Conference(models.Model): name = models.CharField(max_length=200, help_text=_('Conference__name__help'), verbose_name=_('Conference__name')) is_public = models.BooleanField(default=False, help_text=_('Conference__is_public__help'), verbose_name=_('Conference__is_public')) + registration_start = models.DateTimeField( + blank=True, null=True, help_text=_('Conference__registration_start__help'), verbose_name=_('Conference__registration_start') + ) registration_deadline = models.DateTimeField( blank=True, null=True, help_text=_('Conference__registration_deadline__help'), verbose_name=_('Conference__registration_deadline') ) @@ -360,7 +363,11 @@ class Conference(models.Model): @cached_property def is_open(self): - return self.is_public and (self.registration_deadline is None or self.registration_deadline > timezone.now()) + return ( + self.is_public + and (self.registration_start is None or self.registration_start < timezone.now()) + and (self.registration_deadline is None or self.registration_deadline > timezone.now()) + ) @cached_property def is_running(self):