From e2f12577cd1ff365c2d85eea7515533ab45581f8 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 12 Sep 2024 13:21:06 +0200 Subject: [PATCH 1/2] Added a view, to get the list of open events for registration as json --- dav_events/models/event.py | 91 ++++++++++++++++++++++++++++++++++++++ dav_registration/urls.py | 1 + dav_registration/views.py | 25 +++++++++++ 3 files changed, 117 insertions(+) diff --git a/dav_events/models/event.py b/dav_events/models/event.py index 97fa65e..e53008a 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -527,3 +527,94 @@ class Event(models.Model): template_name = os.path.join('dav_events', 'event', 'default.html') template = get_template(template_name) return template.render(self.get_template_context()) + + def as_dict(self, json=True): + d = { + 'number': self.get_number(), + 'title': self.title, + 'description': self.description, + + 'mode': self.mode, + 'mode_display': self.get_mode_display(), + 'sport': self.sport, + 'sport_display': self.get_sport_display(), + 'level': self.level, + 'level_display': self.get_level_display(), + + 'first_day': self.first_day, + 'last_day': self.last_day, + 'alt_first_day': self.alt_first_day, + 'alt_last_day': self.alt_last_day, + + 'location': self.location, + 'basecamp': self.basecamp, + + 'meeting_time': self.meeting_time, + 'departure_time': self.departure_time, + 'departure_ride': self.departure_ride, + 'return_departure_time': self.return_departure_time, + 'return_arrival_time': self.return_arrival_time, + + 'requirements': self.requirements, + 'equipment': self.equipment, + + 'pre_meeting_1': self.pre_meeting_1, + 'pre_meeting_2': self.pre_meeting_2, + + 'trainer_fullname': self.get_trainer_full_name(), + 'trainer_firstname': self.trainer_firstname, + 'trainer_familyname': self.trainer_familyname, + 'trainer_email': self.trainer_email, + 'trainer_phone': self.trainer_phone, + 'trainer_2_fullname': self.trainer_2_fullname, + 'trainer_2_email': self.trainer_2_email, + 'trainer_2_phone': self.trainer_2_phone, + 'trainer_3_fullname': self.trainer_3_fullname, + 'trainer_3_email': self.trainer_3_email, + 'trainer_3_phone': self.trainer_3_phone, + + 'min_participants': self.min_participants, + 'max_participants': self.max_participants, + 'registration_required': self.registration_required, + 'registration_howto': self.registration_howto, + 'deadline': self.deadline, + 'registration_closed': self.registration_closed, + + 'charge': self.charge, + 'additional_costs': self.additional_costs, + + 'course_topic_1': self.course_topic_1, + 'course_topic_2': self.course_topic_2, + 'course_topic_3': self.course_topic_3, + 'course_topic_4': self.course_topic_4, + 'course_topic_5': self.course_topic_5, + 'course_topic_6': self.course_topic_6, + 'course_goal_1': self.course_goal_1, + 'course_goal_2': self.course_goal_2, + 'course_goal_3': self.course_goal_3, + 'course_goal_4': self.course_goal_4, + 'course_goal_5': self.course_goal_5, + 'course_goal_6': self.course_goal_6, + } + if json: + d['country'] = str(self.country) + d['country_display'] = self.get_country_display() + for field in ('transport', 'meeting_point', 'accommodation', 'meals'): + value = getattr(self, field) + d[field] = value + display_field_name = '%s_display' % field + if value == 'NONE': + d[display_field_name] = None + elif value == 'OTHER': + other = getattr(self, '%s_other' % field) + d[display_field_name] = other + else: + func = getattr(self, 'get_%s_display' % field) + d[display_field_name] = func() + else: + d['country'] = self.country + for field in ('transport', 'meeting_point', 'accommodation', 'meals'): + value = getattr(self, field) + d[field] = value + + return d \ No newline at end of file diff --git a/dav_registration/urls.py b/dav_registration/urls.py index 3051da5..89a31e4 100644 --- a/dav_registration/urls.py +++ b/dav_registration/urls.py @@ -11,4 +11,5 @@ urlpatterns = [ url(r'^event/(?P\d+)/registration', views.RegistrationView.as_view(), name='register'), url(r'^event/(?P\d+)/', views.EventDetailView.as_view(), name='event'), url(r'^event', views.EventListView.as_view(), name='events'), + url(r'^api/v1/event', views.EventListAsJSONView, name='api_events'), ] diff --git a/dav_registration/views.py b/dav_registration/views.py index 0f3d1ac..09755e9 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -4,6 +4,7 @@ import logging from django.apps import apps from django.contrib import messages from django.db.models import Q +from django.http import JsonResponse from django.urls import reverse_lazy from django.utils.translation import ugettext as _ from django.views import generic @@ -64,6 +65,30 @@ class EventListView(generic.ListView): return super().get(request, *args, **kwargs) +def EventListAsJSONView(request): + filter_cleaned = [] + if 'filter' in request.GET: + choices = SPORT_CHOICES.codes + LEVEL_CHOICES.codes + filter_input = request.GET['filter'].split(',') + filter_cleaned = list(set(filter_input) & set(choices)) + + today = datetime.date.today() + + filter_exp = Q(flags__status__code__in=('publishing', 'publishing_web', 'publishing_facebook', + 'published', 'published_web', 'published_facebook')) + filter_exp &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) + filter_exp &= Q(first_day__gte=today) + # filter_exp &= Q(registration_closed=False) + # filter_exp &= Q(deadline__isnull=True) | Q(deadline__gte=today) + if filter_cleaned: + filter_exp &= Q(sport__in=filter_cleaned) | Q(level__in=filter_cleaned) + + qs = Event.objects.filter(filter_exp).order_by('first_day', 'number').distinct() + data = [event.as_dict(json=True) for event in qs] + response = JsonResponse(data, safe=False) + return response + + class EventDetailView(generic.DetailView): model = Event template_name = 'dav_registration/event_detail.html' -- 2.52.0 From af3afc9f9a63247d9713b43850b55145e1ba1d07 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 12 Sep 2024 13:41:27 +0200 Subject: [PATCH 2/2] Added field registration_url to the json --- dav_events/models/event.py | 6 +++++- dav_registration/views.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dav_events/models/event.py b/dav_events/models/event.py index e53008a..eb4b550 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -528,8 +528,9 @@ class Event(models.Model): template = get_template(template_name) return template.render(self.get_template_context()) - def as_dict(self, json=True): + def as_dict(self, json=True, add_registration_url=False): d = { + 'id': self.id, 'number': self.get_number(), 'title': self.title, 'description': self.description, @@ -617,4 +618,7 @@ class Event(models.Model): value = getattr(self, field) d[field] = value + if add_registration_url: + d['registration_url'] = reverse('dav_registration:event', kwargs={'pk': self.pk}) + return d \ No newline at end of file diff --git a/dav_registration/views.py b/dav_registration/views.py index 09755e9..6e3f5cc 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -84,7 +84,7 @@ def EventListAsJSONView(request): filter_exp &= Q(sport__in=filter_cleaned) | Q(level__in=filter_cleaned) qs = Event.objects.filter(filter_exp).order_by('first_day', 'number').distinct() - data = [event.as_dict(json=True) for event in qs] + data = [event.as_dict(json=True, add_registration_url=True) for event in qs] response = JsonResponse(data, safe=False) return response -- 2.52.0