Skip to content

Commit 8da5581

Browse files
authored
Banner messages (#382)
1 parent 1ceb6c6 commit 8da5581

File tree

4 files changed

+84
-7
lines changed

4 files changed

+84
-7
lines changed

cms/models.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,14 @@ class Meta:
141141
verbose_name='správa',
142142
help_text='Správa sa zobrazí v baneri. Správa musí byť stručná - jedna krátka veta.',
143143
max_length=200)
144-
page = models.ForeignKey(FlatPage, on_delete=models.CASCADE, null=True)
145-
event = models.ForeignKey(Event, on_delete=models.CASCADE, null=True)
146-
series = models.ForeignKey(Series, on_delete=models.CASCADE, null=True)
144+
page = models.ForeignKey(
145+
FlatPage, on_delete=models.CASCADE, null=True, blank=True)
146+
event = models.ForeignKey(
147+
Event, on_delete=models.CASCADE, null=True, blank=True)
148+
series = models.ForeignKey(
149+
Series, on_delete=models.CASCADE, null=True, blank=True)
147150
message_template = models.ForeignKey(
148-
MessageTemplate, on_delete=models.PROTECT, null=True)
151+
MessageTemplate, on_delete=models.PROTECT, null=True, blank=True)
149152

150153
def clean(self):
151154
try:

cms/views.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11

22

3+
from datetime import datetime
4+
5+
from django.utils.timezone import now
36
from rest_framework import viewsets
47
from rest_framework.decorators import action
58
from rest_framework.request import Request
@@ -10,6 +13,7 @@
1013
from cms.serializers import (InfoBannerSerializer, LogoSerializer,
1114
MenuItemShortSerializer,
1215
MessageTemplateSerializer, PostSerializer)
16+
from competition.models import Competition, Event, Series
1317

1418

1519
class MenuItemViewSet(viewsets.ReadOnlyModelViewSet):
@@ -62,6 +66,66 @@ class InfoBannerViewSet(viewsets.ModelViewSet):
6266
queryset = InfoBanner.objects.visible()
6367
filterset_fields = ['event', 'page', 'series']
6468

69+
def format_date(self, datetime_: datetime):
70+
return datetime_.strftime("%d.%m.%Y %H:%M")
71+
72+
@action(methods=['get'], detail=False, url_path=r'series-problems/(?P<series_id>\d+)')
73+
def series_problems(self, request, series_id: int) -> list[str]:
74+
series_messages = InfoBanner.objects.filter(series=series_id).all()
75+
messages = [message.render_message() for message in series_messages]
76+
series = Series.objects.get(pk=series_id)
77+
if series.complete:
78+
messages.append('Séria je uzavretá')
79+
elif series.can_submit:
80+
messages.append(
81+
f'Termín série: {self.format_date(series.deadline)}'
82+
)
83+
else:
84+
messages.append('Prebieha opravovanie')
85+
return Response(messages)
86+
87+
@action(methods=['get'], detail=False, url_path=r'series-results/(?P<series_id>\d+)')
88+
def series_results(self, request, series_id):
89+
series = Series.objects.get(pk=series_id)
90+
if not series.complete:
91+
return Response(['Poradie nie je uzavreté'])
92+
return Response([])
93+
94+
@action(methods=['get'], detail=False, url_path=r'competition/(?P<competition_id>\d+)')
95+
def event(self, request, competition_id: int) -> list[str]:
96+
competition = Competition.objects.get(pk=competition_id)
97+
try:
98+
event = Event.objects.filter(
99+
competition=competition_id, end__gte=now()).earliest('start')
100+
except Event.DoesNotExist:
101+
return Response([])
102+
event_messages = InfoBanner.objects.filter(event=event).all()
103+
messages = [message.render_message() for message in event_messages]
104+
105+
if event.registration_link is not None:
106+
if competition.competition_type.name == 'Seminár':
107+
if event.registration_link.start > now():
108+
messages.append(
109+
'Prihlasovanie na sústredenie bude spustené '
110+
f'{self.format_date(event.registration_link.start)}')
111+
elif event.registration_link.end > now():
112+
messages.append(
113+
'Prihlasovanie na sústredenie končí '
114+
f'{self.format_date(event.registration_link.end)}')
115+
else:
116+
if event.registration_link.start > now():
117+
messages.append(
118+
'Registrácia bude spustená '
119+
f'{self.format_date(event.registration_link.start)}')
120+
elif event.registration_link.end > now():
121+
messages.append(
122+
'Registrácia bude uzavretá '
123+
f'{self.format_date(event.registration_link.end)}')
124+
125+
else:
126+
messages.append('Registrácia ukončená')
127+
return Response(messages)
128+
65129

66130
class MessageTemplateViewSet(viewsets.ModelViewSet):
67131
"""Templaty správ pre info banner/posty"""

competition/admin.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
from competition.models import (Comment, Competition, Event, EventRegistration,
55
LateTag, Problem, ProblemCorrection,
6-
Publication, Semester, Series, Solution)
6+
Publication, RegistrationLink, Semester,
7+
Series, Solution)
78

89

910
@admin.register(Competition)
@@ -187,6 +188,15 @@ class EventRegistrationAdmin(admin.ModelAdmin):
187188
)
188189

189190

191+
@admin.register(RegistrationLink)
192+
class RegistrationLinkAdmin(admin.ModelAdmin):
193+
list_display = (
194+
'event',
195+
'start',
196+
'end'
197+
)
198+
199+
190200
@admin.register(ProblemCorrection)
191201
class ProblemCorrectionAdmin(admin.ModelAdmin):
192202
list_display = (

competition/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
from base.validators import school_year_validator
2020
from competition.exceptions import FreezingNotClosedResults
2121
from competition.querysets import ActiveQuerySet
22-
from competition.utils.school_year_manipulation import (
23-
get_school_year_end_by_date)
22+
from competition.utils.school_year_manipulation import \
23+
get_school_year_end_by_date
2424
from personal.models import Profile, School
2525
from user.models import User
2626

0 commit comments

Comments
 (0)