GeezerVison is showing github.com — Email API · codeclassroom/codeclassroom@69fec29
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: api/urls.py +5-2Lines changed: 5 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 8 | 8 | AssignmentList, AssignmentCreate, AssignmentDetail, | 9 | 9 | QuestionList, QuestionCreate, QuestionDetail, | 10 | 10 | SubmissionCreate, SubmissionList, SubmissionDetail, | 11 | | - PlagiarismView, JudgeCode | | 11 | + PlagiarismView, JudgeCode, | | 12 | + FeedBackView, ReportQuesiton | 12 | 13 | ) | 13 | 14 |
| 14 | 15 |
| | 56 | 57 | # Utility URLs | 57 | 58 | path('judge', JudgeCode.as_view(), name='code-judge'), | 58 | 59 | path('codesim/', PlagiarismView.as_view(), | 59 | | - name='plagiarism-detector') | | 60 | + name='plagiarism-detector'), | | 61 | + path('email/feedback', FeedBackView.as_view(), name='feedback'), | | 62 | + path('email/report', ReportQuesiton.as_view(), name='report-question') | 60 | 63 |
| 61 | 64 | ] |
Collapse file Copy file name to clipboardExpand all lines: api/views.py +33-1Lines changed: 33 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
| 17 | 17 | ClassroomCreateSerializer, ClassroomJoincodeSerializer, ClassroomSerializer, | 18 | 18 | AssignmentSerializer, | 19 | 19 | QuestionSerializer, | 20 | | - SolutionSerializer, JudgeSerializer | | 20 | + SolutionSerializer, JudgeSerializer, | | 21 | + FeedBackEmailSerializer, ReportQuestionSerializer | 21 | 22 | ) | 22 | 23 | from utilities.judge import run_code, submit_code | 23 | 24 | from utilities.codesim import codesim | | 25 | +from utilities.email import feedback ,report | 24 | 26 |
| 25 | 27 |
| 26 | 28 | @api_view(['GET']) | @@ -289,3 +291,33 @@ def post(self, request): | 289 | 291 | {"detail": "Assignment Does Not Exist"}, | 290 | 292 | status=status.HTTP_404_NOT_FOUND | 291 | 293 | ) | | 294 | + | | 295 | + | | 296 | +class FeedBackView(generics.CreateAPIView): | | 297 | + """Feedback for CodeClassroom Website""" | | 298 | + serializer_class = FeedBackEmailSerializer | | 299 | + permission_classes = [AllowAny] | | 300 | + | | 301 | + def post(self, request): | | 302 | + email_status = feedback(request.data["email"], request.data["message"]) | | 303 | + if email_status: | | 304 | + return Response( | | 305 | + {"detail": "Thanks for your feedback"}, | | 306 | + status=status.HTTP_202_ACCEPTED | | 307 | + ) | | 308 | + else: | | 309 | + return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) | | 310 | + | | 311 | + | | 312 | +class ReportQuesiton(generics.CreateAPIView): | | 313 | + serializer_class = ReportQuestionSerializer | | 314 | + | | 315 | + def post(self, request): | | 316 | + report_status = report(request.data["question"], request.data["message"]) | | 317 | + if report_status: | | 318 | + return Response( | | 319 | + {"detail": "Thanks for your feedback"}, | | 320 | + status=status.HTTP_202_ACCEPTED | | 321 | + ) | | 322 | + else: | | 323 | + return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) |
Collapse file Copy file name to clipboardExpand all lines: app/serializers.py +11-1Lines changed: 11 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -141,4 +141,14 @@ class JudgeSerializer(serializers.Serializer): | 141 | 141 | code = serializers.CharField(required=True) | 142 | 142 | language = serializers.CharField(required=True) | 143 | 143 | question = serializers.IntegerField(required=False) | 144 | | - testcases = serializers.CharField(required=False) | | 144 | + testcases = serializers.CharField(required=False) | | 145 | + | | 146 | + | | 147 | +class FeedBackEmailSerializer(serializers.Serializer): | | 148 | + email = serializers.EmailField(required=False) | | 149 | + message = serializers.CharField(required=True) | | 150 | + | | 151 | + | | 152 | +class ReportQuestionSerializer(serializers.Serializer): | | 153 | + question = serializers.IntegerField() | | 154 | + message = serializers.CharField(required=True) |
Collapse file Copy file name to clipboardExpand all lines: codeclassroom/settings.py +19Lines changed: 19 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 104 | 104 | ] | 105 | 105 |
| 106 | 106 |
| | 107 | +# Email Settings | | 108 | + | | 109 | +EMAIL_USE_LOCALTIME = True | | 110 | + | | 111 | +if DEBUG: | | 112 | + EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' | | 113 | +else: | | 114 | + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' | | 115 | + EMAIL_HOST = 'smtp.gmail.com' | | 116 | + EMAIL_USE_TLS = True | | 117 | + EMAIL_PORT = 587 | | 118 | + EMAIL_HOST_USER = os.environ["user_email"] | | 119 | + EMAIL_HOST_PASSWORD = os.environ["user_pass"] | | 120 | + | | 121 | + | 107 | 122 | # Internationalization | 108 | 123 | # https://docs.djangoproject.com/en/2.2/topics/i18n/ | 109 | 124 |
| | 117 | 132 |
| 118 | 133 | USE_TZ = True | 119 | 134 |
| | 135 | +TIME_FORMAT = [ | | 136 | + '%I:%M %p', # 6:22 PM | | 137 | + '%I %p' # 6 PM | | 138 | +] | 120 | 139 |
| 121 | 140 | # Static files (CSS, JavaScript, Images) | 122 | 141 | # https://docs.djangoproject.com/en/2.2/howto/static-files/ | |
Collapse file Copy file name to clipboard +50Lines changed: 50 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +from django.core.mail import send_mail | | 2 | +from app.models import ( | | 3 | + Professor, Question, Assignment, | | 4 | + Classroom, User | | 5 | +) | | 6 | + | | 7 | + | | 8 | + | | 9 | + | | 10 | +def feedback(email, message): | | 11 | + send_mail( | | 12 | + 'User FeedBack', | | 13 | + message, | | 14 | + email, | | 15 | + [TO_EMAIL], | | 16 | + fail_silently=False, | | 17 | + ) | | 18 | + return True | | 19 | + | | 20 | + | | 21 | +def report(question, message): | | 22 | + assignment = Question.objects.filter(pk=question).values('assignment')[0] | | 23 | + classroom = Assignment.objects.filter( | | 24 | + pk=assignment['assignment']).values('classroom')[0] | | 25 | + professor = Classroom.objects.filter( | | 26 | + pk=classroom['classroom']).values('professor')[0] | | 27 | + user = Professor.objects.filter( | | 28 | + pk=professor['professor']).values('user_id')[0] | | 29 | + user_email = User.objects.get(pk=user["user_id"]).email | | 30 | + | | 31 | + question_title = Question.objects.get(pk=question).title | | 32 | + print(question_title) | | 33 | + | | 34 | + full_message = """ | | 35 | + Question titled "{question_title}" has been reported by a user. | | 36 | + FeedBack: | | 37 | + {message}""".format( | | 38 | + question_title=question_title, | | 39 | + message=message | | 40 | + ) | | 41 | + | | 42 | + send_mail( | | 43 | + 'Reported Question', | | 44 | + full_message, | | 45 | + TO_EMAIL, | | 46 | + [user_email], | | 47 | + fail_silently=False, | | 48 | + ) | | 49 | + | | 50 | + return True |
|