forked from michaelchen-lab/LMS_Backend
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathviews.py
228 lines (176 loc) · 8.93 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
from rest_framework.decorators import api_view
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from rest_framework import permissions
from django.core.files.base import ContentFile
from core.models import Classroom, Task
from accounts.models import User
from student_core.models import Enroll
from core.serializers import *
from datetime import datetime
from core.utils import verify_classroom_participant
class StudentInitialViewSet(viewsets.ViewSet):
def list(self, request):
## Get student's initial tasks and submissions
print(request.user.user_type)
if request.user.user_type != 1:
return Response('User is not a student.', status.HTTP_403_FORBIDDEN)
classroom = Classroom.objects.get(code=request.query_params['code'])
profile = Enroll.objects.get(studentUserID=request.user.id, classroom=classroom)
announcements_queryset = classroom.announcement_set.all()
sections = ResourceSection.objects.filter(classroom=classroom)
resources = [{
"section": ResourceSectionSerializer(section).data,
"resources": ResourceSerializer(section.resource_set, many=True).data
} for section in sections]
task_queryset = classroom.task_set.filter(display=1)
submission_statuses_queryset = [task.submissionstatus_set.filter(student=request.user).first() for task in task_queryset]
submissions_queryset = [task.submission_set.filter(student=request.user).first() for task in task_queryset]
return Response({
'profile': StudentSerializer(profile).data,
'name': request.user.first_name,
'classroom': ClassroomSerializer(classroom).data,
'announcements': AnnouncementSerializer(announcements_queryset, many=True).data,
'resources': resources,
'tasks': TaskSerializer(task_queryset, many=True).data,
'submission_statuses': [SubmissionStatusSerializer(substatus).data for substatus in submission_statuses_queryset if substatus != None],
'submissions': [SubmissionSerializer(sub).data for sub in submissions_queryset if sub != None]
})
class GroupSubmissionViewSet(viewsets.ViewSet):
def create(self, request):
print(request.data)
if request.user.user_type != 1:
return Response('User is not a student.', status.HTTP_403_FORBIDDEN)
# list of students in the team
team_students_names = [name.strip() for name in request.data["team_students"].split(",")]
print(team_students_names)
team_students = User.objects.filter(first_name__in=team_students_names)
print(team_students)
task=Task.objects.get(id=request.data['task_id'])
for student in team_students:
sub = Submission(task=task, student=student)
if 'text' in request.data:
sub.text = request.data['text']
print(sub)
sub.save()
return Response("Success creating group", status.HTTP_201_CREATED)
class StudentSubmissionViewSet(viewsets.ViewSet):
def retrieve(self, request, **kwargs):
sub = Submission.objects.get(id=int(kwargs['pk']))
if request.user != sub.student:
return Response('Submission does not belong to student.', status.HTTP_403_FORBIDDEN)
return Response(SubmissionSerializer(sub).data)
def create(self, request):
if request.user.user_type != 1:
return Response('User is not a student.', status.HTTP_403_FORBIDDEN)
sub = Submission(task=Task.objects.get(id=request.data['task_id']), student=request.user)
if 'text' in request.data:
sub.text = request.data['text']
if 'image' in request.data:
image = request.data['image']
class_code = request.data['code']
filename = '{}_{}_{}.{}'.format(
class_code, request.data['task_id'],
request.user.id, image.name.split('.')[1]
)
print(filename)
sub.image.save(filename, ContentFile(image.read()))
sub.save()
# remove from submission status if exists
substatus = SubmissionStatus.objects.filter(task=sub.task, student=request.user).first()
if substatus:
substatus.delete()
substatus = SubmissionStatus(task=sub.task, student=request.user)
substatus.save()
return Response(SubmissionSerializer(sub).data)
def update(self, request, **kwargs):
if request.user.user_type != 1:
return Response('User is not a student.', status.HTTP_403_FORBIDDEN)
sub = Submission.objects.get(id=int(kwargs['pk']))
if sub.stars or sub.comments:
return Response('Submission has already been graded.', status.HTTP_403_FORBIDDEN)
if 'text' in request.data:
sub.text = request.data['text']
if 'image' in request.data:
image = request.data['image']
class_code = request.data['code']
filename = '{}_{}_{}.{}'.format(
class_code, request.data['task_id'],
request.user.id, image.name.split('.')[1]
)
sub.image.save(filename, ContentFile(image.read()))
sub.resubmitted_at = datetime.now()
sub.save()
return Response(SubmissionSerializer(sub).data)
class MyUserPermissions(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
# Allow get requests for all
if request.method == 'GET':
return True
return request.user == obj
class StudentSubmissionStatusViewSet(viewsets.ViewSet):
def create(self, request):
substatus = SubmissionStatus(
task=Task.objects.get(id=request.data['task_id']),
student=request.user, status=request.data['status']
)
substatus.save()
return Response(SubmissionStatusSerializer(substatus).data)
def update(self, request, **kwargs):
status = SubmissionStatus.objects.get(pk=int(kwargs['pk']))
status.status = request.data['status']
status.save()
return Response(SubmissionStatusSerializer(status).data)
# this fetches the resources files
class StudentResourceViewSet(viewsets.ViewSet):
def retrieve(self, request, **kwargs):
resource = Resource.objects.get(id=kwargs['pk'])
class_code = request.query_params['code']
if class_code != resource.section.classroom.code:
return Response('Student not part of this classroom.', status.HTTP_403_FORBIDDEN)
return Response(ResourceSerializer(resource).data)
class EnrollViewSet(viewsets.ViewSet):
# join a course
def create(self, request):
classroom = Classroom.objects.get(code=request.data['code'])
# checks if the student is already in the classroom
if Enroll.objects.filter(classroom=classroom, studentUserID=request.user).exists():
return Response('Student is already in the classroom.', status.HTTP_403_FORBIDDEN)
present_students = Enroll.objects.filter(classroom=classroom)
num_of_students = len(present_students)
if num_of_students == 0:
new_index = 1
else:
new_index = present_students[present_students.count()-1].studentIndex+1
classroom.student_indexes = classroom.student_indexes + [new_index]
classroom.save()
enroll = Enroll(classroom=classroom, studentUserID=request.user, studentIndex=new_index, score=0)
enroll.save()
return Response(EnrollSerializer(enroll).data, status=status.HTTP_201_CREATED)
# need to retrieve and list all classrooms the student is in
def list(self, request):
queryset = Enroll.objects.filter(studentUserID=request.user)
enrollments = EnrollSerializer(queryset, many=True)
return Response(enrollments.data)
#
def retrieve(self, request, **kwargs):
if request.user.user_type != 1:
return Response('User is not a student.', status.HTTP_403_FORBIDDEN)
verify_classroom_participant(kwargs['pk'], request.user)
enrolls = Enroll.objects.get(classroom=kwargs['pk'])
return Response(EnrollSerializer(enrolls).data)
class StudentPortfolioViewSet(viewsets.ViewSet):
def list(self, request, **kwargs):
student = request.user
submissions = Submission.objects.filter(student=student)
serializer = SubmissionSerializer(submissions, many=True)
return Response(serializer.data)
# this fetches the ranking of the students in the classroom
@api_view(['GET'])
def Leaderboard(request):
class_code = request.query_params['code']
classroom = Classroom.objects.get(code=class_code)
profile_instances = Enroll.objects.filter(classroom=classroom).order_by('-score')
profiles = StudentSerializer(profile_instances, many=True).data
return Response(profiles)