diff --git a/apiserver/apiserver/api/models.py b/apiserver/apiserver/api/models.py index da39e45..1781c61 100644 --- a/apiserver/apiserver/api/models.py +++ b/apiserver/apiserver/api/models.py @@ -6,7 +6,7 @@ from django.utils.timezone import now from . import old_models class Member(models.Model): - user = models.OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL) + user = models.OneToOneField(User, related_name='member', blank=True, null=True, on_delete=models.SET_NULL) old_email = models.CharField(max_length=254, blank=True, null=True) photo_large = models.CharField(max_length=64, blank=True, null=True) photo_medium = models.CharField(max_length=64, blank=True, null=True) @@ -69,6 +69,7 @@ class Session(models.Model): instructor = models.ForeignKey(User, related_name='teaching', 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) + is_cancelled = models.BooleanField(default=False) old_instructor = models.TextField(blank=True, null=True) datetime = models.DateTimeField(blank=True, null=True) cost = models.DecimalField(max_digits=5, decimal_places=2) diff --git a/apiserver/apiserver/api/serializers.py b/apiserver/apiserver/api/serializers.py index 47d6bd5..90810df 100644 --- a/apiserver/apiserver/api/serializers.py +++ b/apiserver/apiserver/api/serializers.py @@ -225,19 +225,27 @@ 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() + course_name = serializers.SerializerMethodField() + instructor_name = serializers.SerializerMethodField() + datetime = serializers.DateTimeField() + instructor = serializers.PrimaryKeyRelatedField(queryset=models.User.objects.all()) + course = serializers.PrimaryKeyRelatedField(queryset=models.Course.objects.all()) class Meta: model = models.Session fields = '__all__' - depth = 1 def get_student_count(self, obj): return len(obj.students.all()) + def get_course_name(self, obj): + return obj.course.name + def get_instructor_name(self, obj): + if obj.instructor and hasattr(obj.instructor, 'member'): + name = '{} {}'.format(obj.instructor.member.preferred_name, obj.instructor.member.last_name[0]) + else: + name = 'Unknown' + return obj.old_instructor or name class SessionListSerializer(SessionSerializer): class Meta: @@ -245,6 +253,7 @@ class SessionListSerializer(SessionSerializer): fields = '__all__' + class CourseSerializer(serializers.ModelSerializer): name = serializers.CharField() class Meta: diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index e3e4b1a..061d35c 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -140,8 +140,9 @@ class CourseViewSet(Base, List, Retrieve, Create, Update): return serializers.CourseDetailSerializer -class SessionViewSet(viewsets.ModelViewSet): - permission_classes = [AllowMetadata | IsAuthenticated] +class SessionViewSet(Base, List, Retrieve, Create, Update): + permission_classes = [AllowMetadata | IsAuthenticated, IsAdminOrReadOnly | IsInstructorOrReadOnly] + serializer_class = serializers.SessionSerializer def get_queryset(self): if self.action == 'list': @@ -149,12 +150,6 @@ class SessionViewSet(viewsets.ModelViewSet): else: return models.Session.objects.all() - def get_serializer_class(self): - #if self.action == 'retrieve': - # return serializers.CourseDetailSerializer - #else: - return serializers.SessionSerializer - class UserView(views.APIView): permission_classes = [AllowMetadata | IsAuthenticated] diff --git a/webclient/src/Classes.js b/webclient/src/Classes.js index 2da3be1..bc5505e 100644 --- a/webclient/src/Classes.js +++ b/webclient/src/Classes.js @@ -9,9 +9,6 @@ import { NotFound, PleaseLogin } from './Misc.js'; function ClassTable(props) { const { classes } = props; - const getInstructor = (session) => - session.instructor ? session.instructor.first_name : session.old_instructor; - return ( @@ -29,14 +26,14 @@ function ClassTable(props) { {classes.length ? classes.map((x, i) => - {x.course.name} + {x.course_name} {moment.utc(x.datetime).format('ll')} {moment.utc(x.datetime).format('LT')} - {getInstructor(x)} + {x.instructor_name} {x.cost === '0.00' ? 'Free' : '$'+x.cost} {x.student_count} @@ -103,9 +100,6 @@ export function ClassDetail(props) { }); }, []); - const getInstructor = (session) => - session.instructor ? session.instructor.first_name : session.old_instructor; - return ( {!error ? @@ -118,8 +112,8 @@ export function ClassDetail(props) { Name: - - {clazz.course.name} + + {clazz.course_name} @@ -137,7 +131,7 @@ export function ClassDetail(props) { Instructor: - {getInstructor(clazz)} + {clazz.instructor_name} Cost: