diff --git a/apiserver/apiserver/api/models.py b/apiserver/apiserver/api/models.py index 6881f2e..a3463e4 100644 --- a/apiserver/apiserver/api/models.py +++ b/apiserver/apiserver/api/models.py @@ -51,7 +51,7 @@ class Course(models.Model): class Session(models.Model): instructor = models.ForeignKey(User, related_name='teaching', blank=True, null=True, on_delete=models.SET_NULL) - course = models.ForeignKey(Course, blank=True, null=True, on_delete=models.SET_NULL) + course = models.ForeignKey(Course, related_name='sessions', blank=True, null=True, on_delete=models.SET_NULL) old_instructor = models.TextField(blank=True, null=True) datetime = models.DateTimeField(blank=True, null=True) @@ -59,7 +59,7 @@ class Session(models.Model): class Training(models.Model): user = models.ForeignKey(User, related_name='training', blank=True, null=True, on_delete=models.SET_NULL) - session = models.ForeignKey(Session, blank=True, null=True, on_delete=models.SET_NULL) + session = models.ForeignKey(Session, related_name='students', blank=True, null=True, on_delete=models.SET_NULL) member_id = models.IntegerField(blank=True, null=True) attendance_status = models.TextField(blank=True, null=True) diff --git a/apiserver/apiserver/api/serializers.py b/apiserver/apiserver/api/serializers.py index 88264a7..8d642f1 100644 --- a/apiserver/apiserver/api/serializers.py +++ b/apiserver/apiserver/api/serializers.py @@ -41,6 +41,40 @@ class TransactionSerializer(serializers.ModelSerializer): fields = '__all__' +class SessionDetailSerializer(serializers.ModelSerializer): + class Meta: + model = models.Training + exclude = ['user'] + +class SessionSerializer(serializers.ModelSerializer): + student_count = serializers.SerializerMethodField() + class Meta: + model = models.Session + fields = '__all__' + depth = 1 + def get_student_count(self, obj): + return len(obj.students.all()) + + +class CourseSerializer(serializers.ModelSerializer): + class Meta: + model = models.Course + fields = '__all__' + +class CourseDetailSerializer(serializers.ModelSerializer): + sessions = SessionSerializer(many=True) + + class Meta: + model = models.Course + fields = '__all__' + depth = 1 + +class AdminCourseSerializer(serializers.ModelSerializer): + class Meta: + model = models.Course + fields = '__all__' + + class RegistrationSerializer(RegisterSerializer): first_name = serializers.CharField(max_length=32) last_name = serializers.CharField(max_length=32) diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index 0fbf760..f3cf19e 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import User, Group +from django.db.models import Max from rest_framework import viewsets, views, permissions from rest_framework.response import Response from rest_auth.registration.views import RegisterView @@ -33,6 +34,33 @@ class MemberViewSet(viewsets.ModelViewSet): return serializers.MemberSerializer +class CourseViewSet(viewsets.ModelViewSet): + permission_classes = [AllowMetadata | permissions.IsAuthenticated] + queryset = models.Course.objects.annotate(date=Max('sessions__datetime')).order_by('-date') + + def get_serializer_class(self): + if self.action == 'retrieve': + return serializers.CourseDetailSerializer + else: + return serializers.CourseSerializer + + +class SessionViewSet(viewsets.ModelViewSet): + permission_classes = [AllowMetadata | permissions.IsAuthenticated] + + def get_queryset(self): + if self.action == 'list': + return models.Session.objects.order_by('-datetime')[:20] + else: + return models.Session.objects.all() + + def get_serializer_class(self): + #if self.action == 'retrieve': + # return serializers.CourseDetailSerializer + #else: + return serializers.SessionSerializer + + class MyUserView(views.APIView): permission_classes = [AllowMetadata | permissions.IsAuthenticated] diff --git a/apiserver/apiserver/settings.py b/apiserver/apiserver/settings.py index ab81e5a..23b1b6c 100644 --- a/apiserver/apiserver/settings.py +++ b/apiserver/apiserver/settings.py @@ -169,7 +169,7 @@ if DEBUG: REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', - 'PAGE_SIZE': 20, + 'PAGE_SIZE': 100, 'DEFAULT_RENDERER_CLASSES': DEFAULT_RENDERER_CLASSES, 'DEFAULT_AUTHENTICATION_CLASSES': DEFAULT_AUTHENTICATION_CLASSES, } diff --git a/apiserver/apiserver/urls.py b/apiserver/apiserver/urls.py index ba87740..cc87ad0 100644 --- a/apiserver/apiserver/urls.py +++ b/apiserver/apiserver/urls.py @@ -8,6 +8,8 @@ from .api import views router = routers.DefaultRouter() router.register(r'users', views.UserViewSet) router.register(r'members', views.MemberViewSet, basename='member') +router.register(r'courses', views.CourseViewSet, basename='course') +router.register(r'sessions', views.SessionViewSet, basename='session') #router.register(r'me', views.FullMemberView, basename='fullmember') #router.register(r'registration', views.RegistrationViewSet, basename='register')