Skip to content

Commit

Permalink
Fixed djangoindia#198 Created Attendee list API
Browse files Browse the repository at this point in the history
  • Loading branch information
Apalakimmortal committed Oct 20, 2024
1 parent 8fa8389 commit 3db9c15
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 11 deletions.
17 changes: 17 additions & 0 deletions backend/djangoindia/api/serializers/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,23 @@ class EventRegistrationSerializer(serializers.Serializer):
other_links = serializers.URLField(required=False, allow_blank=True)
rsvp = serializers.BooleanField(default=False)
include_in_attendee_list = serializers.BooleanField(default=False)
first_time_attendee = serializers.BooleanField(default= True)
attendee_type = serializers.ChoiceField(choices=EventRegistration.AttendeeType)

class EventAttendeeSerializer(serializers.ModelSerializer):
full_name = serializers.SerializerMethodField()

class Meta:
model = EventRegistration
fields = [
'full_name', 'professional_status', 'organization',
'linkedin', 'github', 'twitter', 'first_time_attendee',
'attendee_type'
]

def create(self, validated_data):
return EventRegistration.objects.create(**validated_data)

def get_full_name(self, obj):
return f"{obj.first_name} {obj.last_name}"

4 changes: 2 additions & 2 deletions backend/djangoindia/api/urls/event.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from django.urls import path

from djangoindia.api.views.event import EventAPIView
from djangoindia.api.views.event import EventAPIView,EventAttendeeViewSet
# URL conf
urlpatterns = [
path("events/", EventAPIView.as_view({"get":"list"}), name="list_events"),
path("events/<slug:slug>/", EventAPIView.as_view({"get":"retrieve","post":"post"}), name="get_event"),
path("events/<uuid:event_id>/attendees/", EventAttendeeViewSet.as_view({"get": "list"}), name="get_event_attendee"),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"Local: event","url":"c:\\Users\\apala\\OneDrive\\Desktop\\ContribDj\\djangoindia.org\\backend\\djangoindia\\api\\views\\event.py","tests":[{"id":1729355817490,"input":"","output":""}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"c:\\Users\\apala\\OneDrive\\Desktop\\ContribDj\\djangoindia.org\\backend\\djangoindia\\api\\views\\event.py","group":"local","local":true}
2 changes: 1 addition & 1 deletion backend/djangoindia/api/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from .event import EventAPIView
from .event import EventAPIView,EventAttendeeViewSet
from .communication import SubscriberAPIView, ContactUsAPIView
from .partner_and_sponsor import CommunityPartnerAndSponsorAPIView
30 changes: 29 additions & 1 deletion backend/djangoindia/api/views/event.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,46 @@
from django.shortcuts import get_object_or_404
from djangoindia.api.serializers.event import (
EventRegistrationSerializer,
EventSerializer,
EventLiteSerializer,
)
from djangoindia.bg_tasks.event_registration import registration_confirmation_email_task
from djangoindia.db.models import Event, EventRegistration,Volunteer, Sponsorship,CommunityPartner
from rest_framework import generics, status, viewsets
from rest_framework import generics, status, viewsets,mixins
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin
from rest_framework.response import Response

from djangoindia.constants import POST, PRIMARY_KEY_SHORT
from django.db.models import Prefetch
from django.utils import timezone

class EventAttendeeViewSet(
mixins.ListModelMixin,
viewsets.GenericViewSet
):
serializer_class = EventRegistrationSerializer

def get_queryset(self):
event_id = self.kwargs.get('event_id')
return EventRegistration.objects.filter(
event_id=event_id,
# include_in_attendee_list=True
).select_related('event').order_by('first_name', 'last_name')

def list(self, request, *args, **kwargs):
event_id = self.kwargs.get('event_id')
event = get_object_or_404(Event, id=event_id)
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)

response_data = {
'event_name': event.name,
'total_attendees': queryset.count(),
'first_time_attendees': queryset.filter(first_time_attendee=True).count(),
'attendees': serializer.data
}

return Response(response_data)
# Create your views here.
class EventAPIView(
viewsets.ModelViewSet
Expand Down
9 changes: 4 additions & 5 deletions backend/djangoindia/db/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,14 @@ class EventAdmin(admin.ModelAdmin):


class EventRegistrationResource(resources.ModelResource):

class Meta:
model = EventRegistration
@admin.register(EventRegistration)
class EventRegistrationAdmin(ImportExportModelAdmin):
list_display = ('event', 'first_name', 'email', 'created_at')
readonly_fields = ('created_at', 'updated_at')
list_filter = ('event__name',)
search_fields=['email','event__name','first_name','last_name',]
list_display = ('event', 'first_name', 'email', 'created_at','attendee_type','first_time_attendee')
readonly_fields = ('created_at', 'updated_at','first_time_attendee','attendee_type')
list_filter = ('event__name','attendee_type','first_time_attendee')
search_fields=['email','event__name','first_name','last_name','first_time_attendee','attendee_type']
actions = [send_email_to_selected_users]
resource_class = EventRegistrationResource

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 5.1.2 on 2024-10-16 18:42

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0010_communitypartner_event_max_seats_event_seats_left_and_more'),
]

operations = [
migrations.AddField(
model_name='eventregistration',
name='attendee_type',
field=models.CharField(choices=[('guest', 'Guest'), ('host', 'Host'), ('speaker', 'Speaker'), ('volunteer', 'Volunteer')], default='guest', max_length=10),
),
migrations.AddField(
model_name='eventregistration',
name='first_time_attendee',
field=models.BooleanField(default=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.1.2 on 2024-10-19 17:02

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0011_eventregistration_attendee_type_and_more'),
]

operations = [
migrations.AlterField(
model_name='eventregistration',
name='attendee_type',
field=models.CharField(choices=[('guest', 'Guest'), ('host', 'Host'), ('speaker', 'Speaker'), ('volunteer', 'Volunteer')], default='guest', max_length=20),
),
]
18 changes: 18 additions & 0 deletions backend/djangoindia/db/models/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ class Gender(models.TextChoices):
FEMALE = "female"
OTHER = "other"

class AttendeeType(models.TextChoices):
GUEST = "guest", "Guest"
HOST = "host", "Host"
SPEAKER = "speaker", "Speaker"
VOLUNTEER = "volunteer", "Volunteer"


event = models.ForeignKey(
"db.Event",
on_delete=models.CASCADE,
Expand All @@ -89,6 +96,14 @@ class Gender(models.TextChoices):
# TODO: imnplement this (RSVP mailing + RSVP submission link)
rsvp = models.BooleanField(default=False)


first_time_attendee = models.BooleanField(default=True)
attendee_type = models.CharField(
max_length=20,
choices=AttendeeType.choices,
default=AttendeeType.GUEST
)

class Meta:
constraints = [
models.UniqueConstraint(
Expand All @@ -99,6 +114,9 @@ class Meta:
def save(self, *args, **kwargs):
# This is a new registration
if self._state.adding:
user_has_registered_before = EventRegistration.objects.filter(email=self.email).exists()
self.first_time_attendee = not user_has_registered_before

if self.event.seats_left > 0:
self.event.seats_left -= 1
self.event.save()
Expand Down
2 changes: 1 addition & 1 deletion backend/djangoindia/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent.parent

DOCKERIZED = int(os.environ.get("DOCKERIZED", 0)) == 1
DOCKERIZED = (os.environ.get("DOCKERIZED", 0)) == 1

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
Expand Down
1 change: 0 additions & 1 deletion backend/djangoindia/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
SpectacularAPIView,
SpectacularSwaggerView,
)

urlpatterns = [
path(f"api/{settings.ADMIN_URL}", admin.site.urls),
path("api/v1/", include("djangoindia.api.urls")),
Expand Down

0 comments on commit 3db9c15

Please sign in to comment.