From a05f3a852dcceea97d304d6e7c4095701f7d25a8 Mon Sep 17 00:00:00 2001 From: joyanna27 Date: Mon, 1 Dec 2025 20:17:23 +0530 Subject: [PATCH] feat(execom): added campus execom management with role assignment --- api/campus_execom_views.py | 38 ++++++++++++++++++++++++++++++++++++++ api/urls.py | 4 +++- db/organization.py | 11 +++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 api/campus_execom_views.py diff --git a/api/campus_execom_views.py b/api/campus_execom_views.py new file mode 100644 index 000000000..4b4384401 --- /dev/null +++ b/api/campus_execom_views.py @@ -0,0 +1,38 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from db.organization import CampusExecom, Organization +from db.user import User +import uuid + +class CampusExecomView(APIView): + + # 1. VIEW EXECOM MEMBERS (GET) + def get(self, request, campus_id): + members = CampusExecom.objects.filter(campus_id=campus_id).values( + 'id', 'user__first_name', 'user__last_name', 'role', 'user__email' + ) + return Response({'data': list(members)}) + + # 2. ADD MEMBER (POST) + def post(self, request, campus_id): + user_id = request.data.get('user_id') + role = request.data.get('role') + + if not user_id or not role: + return Response({'message': 'User ID and Role are required'}, status=400) + + if CampusExecom.objects.filter(campus_id=campus_id, user_id=user_id).exists(): + return Response({'message': 'User is already in Execom'}, status=400) + + CampusExecom.objects.create( + id=str(uuid.uuid4()), + user_id=user_id, + campus_id=campus_id, + role=role + ) + return Response({'message': 'Member added successfully'}) + + # 3. REMOVE MEMBER (DELETE) + def delete(self, request, campus_id, uid): + CampusExecom.objects.filter(id=uid).delete() + return Response({'message': 'Member removed successfully'}) \ No newline at end of file diff --git a/api/urls.py b/api/urls.py index 47286c11a..0b04e51ea 100644 --- a/api/urls.py +++ b/api/urls.py @@ -1,6 +1,6 @@ import debug_toolbar from django.urls import path, include - +from.campus_execom_views import CampusExecomView # app_name will help us do a reverse look-up latter. urlpatterns = [ path('register/', include('api.register.urls')), @@ -16,4 +16,6 @@ path('launchpad/', include('api.launchpad.urls')), path('donate/', include('api.donate.urls')), path("__debug__/", include(debug_toolbar.urls)), + path('campus//execom/',CampusExecomView.as_view()), + path('campus//execom//',CampusExecomView.as_view()), ] diff --git a/db/organization.py b/db/organization.py index 690dbf364..76ae39e58 100644 --- a/db/organization.py +++ b/db/organization.py @@ -236,3 +236,14 @@ class UnverifiedOrganization(models.Model): class Meta: managed = False db_table = 'unverified_organization' + + +class CampusExecom(models.Model): + id = models.CharField(primary_key=True, max_length=36, default=uuid.uuid4) + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='campus_execom_roles') + campus = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='execom_members') + role = models.CharField(max_length=100) + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + db_table = 'campus_execom'