diff --git a/csss-site/src/about/views/rest_framework_views/__init__.py b/csss-site/src/about/views/rest_framework_views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/csss-site/src/about/views/rest_framework_views/term_view_set.py b/csss-site/src/about/views/rest_framework_views/term_view_set.py new file mode 100644 index 000000000..c9f1a4e28 --- /dev/null +++ b/csss-site/src/about/views/rest_framework_views/term_view_set.py @@ -0,0 +1,24 @@ +from rest_framework import serializers, viewsets +from rest_framework.response import Response + +from about.models import Term +from csss.views.rest_framework_views.pagination import StandardResultsSetPagination + + +class TermSerializer(serializers.ModelSerializer): + + class Meta: + model = Term + fields = '__all__' + + +class TermViewSet(viewsets.ModelViewSet): + serializer_class = TermSerializer + queryset = Term.objects.all().order_by('-term_number') + pagination_class = StandardResultsSetPagination + + def create(self, request, *args, **kwargs): + return Response("not yet implemented") + + def update(self, request, *args, **kwargs): + return Response("not yet implemented") diff --git a/csss-site/src/csss/settings.py b/csss-site/src/csss/settings.py index 1c057b234..43266f918 100755 --- a/csss-site/src/csss/settings.py +++ b/csss-site/src/csss/settings.py @@ -205,7 +205,8 @@ def env_getter(key) -> Optional[str]: 'bootstrap3', 'elections', 'django.contrib.sites', - 'django_cas_ng' + 'django_cas_ng', + 'rest_framework' ] MIDDLEWARE = [ @@ -216,6 +217,11 @@ def env_getter(key) -> Optional[str]: 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'corsheaders.middleware.CorsMiddleware' +] + +CORS_ORIGIN_WHITELIST = [ + 'https://sfucsss.org' ] if not DEBUG: diff --git a/csss-site/src/csss/urls.py b/csss-site/src/csss/urls.py index 9293de169..ebc2258e9 100755 --- a/csss-site/src/csss/urls.py +++ b/csss-site/src/csss/urls.py @@ -2,7 +2,10 @@ from django.conf.urls import url, include from django.conf.urls.static import static from django.contrib import admin +from rest_framework import routers +from about.views.rest_framework_views.term_view_set import TermViewSet +from elections.views.rest_framework_views.election_view_set import ElectionViewSet from .views import views from .views.crons.Constants import CRON_LOGS_BASE_URL_KEY, CRON_JOBS_BASE_URL_KEY from .views.crons.cron import cron @@ -10,6 +13,11 @@ from .views.errors import errors from .views.login import LoginView, LogoutView +router = routers.DefaultRouter() + +router.register('terms', TermViewSet) +router.register('elections', ElectionViewSet) + urlpatterns = [ url(r'^' + settings.URL_PATTERN + 'admin/', admin.site.urls), url(r'^' + settings.URL_PATTERN + 'about/', include('about.urls')), @@ -24,7 +32,7 @@ url(r'^errors', errors.index, name='errors'), url(r'^' + settings.URL_PATTERN + 'login', LoginView.as_view(), name='login'), url(r'^' + settings.URL_PATTERN + 'logout', LogoutView.as_view(), name='logout'), + url(r'^' + settings.URL_PATTERN + "api/", include((router.urls, 'api_app'))) ] - if settings.ENVIRONMENT == "LOCALHOST": urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/csss-site/src/csss/views/rest_framework_views/__init__.py b/csss-site/src/csss/views/rest_framework_views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/csss-site/src/csss/views/rest_framework_views/pagination.py b/csss-site/src/csss/views/rest_framework_views/pagination.py new file mode 100644 index 000000000..d7d031c1b --- /dev/null +++ b/csss-site/src/csss/views/rest_framework_views/pagination.py @@ -0,0 +1,19 @@ +from rest_framework.pagination import PageNumberPagination +from rest_framework.response import Response + + +class StandardResultsSetPagination(PageNumberPagination): + page_size = 25 + page_size_query_param = 'page_size' + max_page_size = 1000 + + def get_paginated_response(self, data): + return Response({ + 'links': { + 'next': self.get_next_link(), + 'previous': self.get_previous_link() + }, + 'count': self.page.paginator.count, + 'total_number_of_pages': self.page.paginator.num_pages, + 'results': data + }) diff --git a/csss-site/src/elections/views/rest_framework_views/__init__.py b/csss-site/src/elections/views/rest_framework_views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/csss-site/src/elections/views/rest_framework_views/election_view_set.py b/csss-site/src/elections/views/rest_framework_views/election_view_set.py new file mode 100644 index 000000000..b6e44170c --- /dev/null +++ b/csss-site/src/elections/views/rest_framework_views/election_view_set.py @@ -0,0 +1,24 @@ +from rest_framework import serializers, viewsets +from rest_framework.response import Response + +from csss.views.rest_framework_views.pagination import StandardResultsSetPagination +from elections.models import Election + + +class ElectionSerializer(serializers.ModelSerializer): + + class Meta: + model = Election + fields = '__all__' + + +class ElectionViewSet(viewsets.ModelViewSet): + serializer_class = ElectionSerializer + queryset = Election.objects.all().order_by('-date') + pagination_class = StandardResultsSetPagination + + def create(self, request, *args, **kwargs): + return Response("not yet implemented") + + def update(self, request, *args, **kwargs): + return Response("not yet implemented") diff --git a/requirements.txt b/requirements.txt index 1e4238423..b5368bae8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -69,4 +69,8 @@ git+https://github.com/gregbaker/django-cas-ng.git@4f4a82e07eb624ffa53446a4f6806 APScheduler==3.9.1.post1 # for election graphing -matplotlib==3.7.4 \ No newline at end of file +matplotlib==3.7.4 + +# for the openAPI that https://github.com/CSSS/csss-site-frontend needs +djangorestframework==3.13.0 +django-cors-headers==3.11.0 \ No newline at end of file