diff --git a/CPorBit/settings.py b/CPorBit/settings.py index 6febc96..8ff321d 100644 --- a/CPorBit/settings.py +++ b/CPorBit/settings.py @@ -200,3 +200,40 @@ ## Frontend domain (used for mails) DOMAIN = env.str('DOMAIN') SITE_NAME = env.str('SITE_NAME') + +# logger configuration + +import os + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +LOGGING = { + 'version': 1, + 'loggers': { + 'django': { + 'handlers': ['file', 'fileinfo'], + 'level': 'INFO', + 'propagate': True, + }, + }, + 'handlers': { + 'file': { + 'level': 'ERROR', + 'class': 'logging.FileHandler', + 'filename': os.path.join(BASE_DIR, 'logs', 'Errors.log'), + 'formatter': 'detailed', + }, + 'fileinfo': { + 'level': 'INFO', + 'class': 'logging.FileHandler', + 'filename': os.path.join(BASE_DIR, 'logs', 'Infos.log'), + 'formatter': 'detailed', + }, + }, + 'formatters': { + 'detailed': { + 'format': '\n{levelname} {asctime} {message}', + 'style': '{', + }, + } +} diff --git a/Dockerfile b/Dockerfile index 159bedb..d16058e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,9 @@ RUN apk add --no-cache \ libffi-dev \ musl-dev \ make \ - openblas-dev + openblas-dev \ + bash \ + dos2unix ENV BLAS=OPENBLAS \ LAPACK=OPENBLAS @@ -22,9 +24,20 @@ RUN pip install --no-cache-dir -r requirements.txt COPY . . -RUN chmod +x ./server.sh +COPY server.sh /app/server.sh -RUN ./server.sh +# Fix Windows line endings and make the script executable +RUN dos2unix /app/server.sh +RUN chmod +x /app/server.sh + +# Create staticfiles directory +RUN mkdir -p /app/staticfiles + +# Ensure logs directory and files exist +RUN mkdir -p /app/logs && touch /app/logs/Errors.log /app/logs/Infos.log + +# Run the script +RUN /bin/bash /app/server.sh EXPOSE 8000 diff --git a/docker-compose.yml b/docker-compose.yml index c16c192..ac50431 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: image: nginx:alpine container_name: proxy ports: - - "80:80" + - "8080:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./public/staticfiles:/staticfiles diff --git a/gamification_app/views.py b/gamification_app/views.py index 2303245..cfd1dfe 100644 --- a/gamification_app/views.py +++ b/gamification_app/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from re import sub from django.contrib.auth.models import User @@ -37,6 +40,9 @@ def get_user_score(request,username): except User.DoesNotExist: return Response({'message': 'User not found'} ,status=404) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting user score.'}) @api_view(['GET']) @@ -73,6 +79,9 @@ def get_user_stats(request, username): except User.DoesNotExist: return Response({'message': 'User not found'} ,status=404) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting user stats.'}) @api_view(['GET']) @@ -85,6 +94,9 @@ def get_user_strength(request, username): return Response(strengths[:5], status=200) except User.DoesNotExist: return Response({"message": "User not found"}, status=404) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting user strength.'}) @api_view(['GET']) @@ -97,6 +109,9 @@ def get_user_weakness(request, username): return Response(weaknesses[-5:], status=200) except User.DoesNotExist: return Response({"message": "User not found"}, status=404) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting user weakness.'}) @api_view(['GET']) @@ -117,3 +132,6 @@ def get_hardest_problem_solved(request, username): return Response(problem, status=200) except User.DoesNotExist: return Response({"message": "User not found"}, status=404) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting user hardest solved problem.'}) diff --git a/notification_app/views.py b/notification_app/views.py index 8389933..48f6ea1 100644 --- a/notification_app/views.py +++ b/notification_app/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from django.shortcuts import render from rest_framework import viewsets from rest_framework.decorators import action @@ -17,35 +20,55 @@ class NotificationViewSet(viewsets.ModelViewSet): allowed_methods = ['GET', 'PUT', 'DELETE'] def get_queryset(self): - notifications = Notification.objects.filter(user=self.request.user).order_by('-id') - self.unread = notifications.filter(is_read=False).count() - return notifications[:5] + try: + notifications = Notification.objects.filter(user=self.request.user).order_by('-id') + self.unread = notifications.filter(is_read=False).count() + return notifications[:5] + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting notification data.'}) def get_paginated_response(self, data): return self.paginator.get_paginated_response(data, self.unread) @action(detail=False, methods=['GET']) def all(self, request): - notifications = Notification.objects.filter(user=self.request.user) - serializer = NotificationSerializer(notifications, many=True) - return Response(serializer.data) + try: + notifications = Notification.objects.filter(user=self.request.user) + serializer = NotificationSerializer(notifications, many=True) + return Response(serializer.data) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting all notification data.'}) @action(detail=True, methods=['PUT']) def mark_as_read(self, request, pk=None): - if pk: - notification = Notification.objects.get(id=pk) - notification.is_read = True - notification.save() - return Response(status=200) + try: + if pk: + notification = Notification.objects.get(id=pk) + notification.is_read = True + notification.save() + return Response(status=200) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while marking notification as read.'}) @action(detail=False, methods=['PUT']) def mark_all_as_read(self, request): - notifications = Notification.objects.filter(user=self.request.user) - notifications.update(is_read=True) - return Response(status=200) + try: + notifications = Notification.objects.filter(user=self.request.user) + notifications.update(is_read=True) + return Response(status=200) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while marking all notification as read.'}) @action(detail=False, methods=['DELETE']) def clear_all(self, request): - notifications = Notification.objects.filter(user=self.request.user) - notifications.delete() - return Response(status=200) + try: + notifications = Notification.objects.filter(user=self.request.user) + notifications.delete() + return Response(status=200) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while clearing all notification.'}) diff --git a/problem_app/problem_urls/views.py b/problem_app/problem_urls/views.py index 2dd85b4..db8be30 100644 --- a/problem_app/problem_urls/views.py +++ b/problem_app/problem_urls/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from problem_app.models import AcceptedSubmission, Problem from problem_app.serializers.ProblemSerializer import (ProblemListSerializer, ProblemSerializer) @@ -16,61 +19,66 @@ def get_score(self, problem): return problem.get('score') def get(self, request): - orderby = request.GET.get('order') - tag = request.GET.get('tag') - score_from = request.GET.get('from') - score_to = request.GET.get('to') - problem_id = request.GET.get('id') - problem_name = request.GET.get('name') - limit = request.GET.get('limit') - - if problem_id is None: - problem_id = '' - if problem_name is None: - problem_name = '' - try: - score_min = int(score_from) - except: - score_min = 0 - try: - score_max = int(score_to) - except: - score_max = 4000 - - queryset = [] - - if tag: - queryset = Problem.objects.filter(cf_problem_id__contains = problem_id, cf_problem_name__contains = problem_name, tag__name=tag, score__range=(score_min, score_max)) - else: - queryset = Problem.objects.filter(cf_problem_id__contains = problem_id, cf_problem_name__contains = problem_name, score__range=(score_min, score_max)) - - serializer = ProblemListSerializer(queryset, many = True, context={'username': request.user.username}) - - problemlist = [] - - if orderby == 'SOLVED_ASC': - problemlist.extend(sorted(serializer.data, key=self.get_total_solved)) - elif orderby == 'SOLVED_DESC': - problemlist.extend(sorted(serializer.data, key=self.get_total_solved, reverse=True)) - elif orderby == 'SCORE_ASC': - problemlist.extend(sorted(serializer.data, key=self.get_score)) - elif orderby == 'SCORE_DESC': - problemlist.extend(sorted(serializer.data, key=self.get_score, reverse=True)) - else: - problemlist.extend(serializer.data) - - if limit: + orderby = request.GET.get('order') + tag = request.GET.get('tag') + score_from = request.GET.get('from') + score_to = request.GET.get('to') + problem_id = request.GET.get('id') + problem_name = request.GET.get('name') + limit = request.GET.get('limit') + + if problem_id is None: + problem_id = '' + if problem_name is None: + problem_name = '' + + try: + score_min = int(score_from) + except: + score_min = 0 try: - problemlist = problemlist[:int(limit)] + score_max = int(score_to) + except: + score_max = 4000 + + queryset = [] + + if tag: + queryset = Problem.objects.filter(cf_problem_id__contains = problem_id, cf_problem_name__contains = problem_name, tag__name=tag, score__range=(score_min, score_max)) + else: + queryset = Problem.objects.filter(cf_problem_id__contains = problem_id, cf_problem_name__contains = problem_name, score__range=(score_min, score_max)) - except Exception: - return Response({'error': 'Invalid limit'}, status=400) + serializer = ProblemListSerializer(queryset, many = True, context={'username': request.user.username}) - return Response({ - 'status': 'OK', - 'problems': problemlist - }) + problemlist = [] + + if orderby == 'SOLVED_ASC': + problemlist.extend(sorted(serializer.data, key=self.get_total_solved)) + elif orderby == 'SOLVED_DESC': + problemlist.extend(sorted(serializer.data, key=self.get_total_solved, reverse=True)) + elif orderby == 'SCORE_ASC': + problemlist.extend(sorted(serializer.data, key=self.get_score)) + elif orderby == 'SCORE_DESC': + problemlist.extend(sorted(serializer.data, key=self.get_score, reverse=True)) + else: + problemlist.extend(serializer.data) + + if limit: + try: + problemlist = problemlist[:int(limit)] + + except Exception as ex: + logger.exception(ex) + return Response({'error': 'Invalid limit'}, status=400) + + return Response({ + 'status': 'OK', + 'problems': problemlist + }) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting problem list.'}) class ProblemAV(APIView): @@ -78,16 +86,19 @@ class ProblemAV(APIView): def get(self, request, cf_problem_id): try: - queryset = Problem.objects.get(cf_problem_id = cf_problem_id) - except Exception as e: - print(e) - print('Problem not found') + try: + queryset = Problem.objects.get(cf_problem_id = cf_problem_id) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message': 'Problem not found' + }, status=404) + serializer = ProblemSerializer(queryset, context={'username': request.user.username}) return Response({ - 'status': 'FAILED', - 'message': 'Problem not found' - }, status=404) - serializer = ProblemSerializer(queryset, context={'username': request.user.username}) - return Response({ - 'status': 'OK', - 'problem': serializer.data - }) + 'status': 'OK', + 'problem': serializer.data + }) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting problem.'}) diff --git a/problem_app/serializers/ProblemSerializer.py b/problem_app/serializers/ProblemSerializer.py index 420b5d8..f776e9b 100644 --- a/problem_app/serializers/ProblemSerializer.py +++ b/problem_app/serializers/ProblemSerializer.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from rest_framework import serializers from user_app.models import (User) @@ -17,16 +20,16 @@ class Meta: def get_is_solved(self, object): try: user = User.objects.get(username = self.context.get('username')) - except Exception as e: - print(e) + except Exception as ex: + logger.exception(ex) return False return AcceptedSubmission.objects.filter(problem = object, user = user).exists() def get_total_solved(self, object): try: problem = Problem.objects.get(cf_problem_id = object.cf_problem_id) - except Exception as e: - print(e) + except Exception as ex: + logger.exception(ex) return 0 return AcceptedSubmission.objects.filter(problem=problem).count() @@ -54,8 +57,8 @@ def get_problem(self, object): def get_is_favourite(self, object): try: user = User.objects.get(username = self.context.get('username')) - except Exception as e: - print(e) + except Exception as ex: + logger.exception(ex) return False return Favorite.objects.filter(user = user, problem = object).exists() @@ -66,7 +69,7 @@ def get_is_suggested(self, object): def get_is_recommended(self, object): try: user = User.objects.get(username = self.context.get('username')) - except Exception as e: - print(e) + except Exception as ex: + logger.exception(ex) return False return Recommendation.objects.filter(user = user, problem = object).exists() \ No newline at end of file diff --git a/problem_app/services/updateallsubmission.py b/problem_app/services/updateallsubmission.py index bbd3635..44eb884 100644 --- a/problem_app/services/updateallsubmission.py +++ b/problem_app/services/updateallsubmission.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from datetime import datetime import requests @@ -31,149 +34,164 @@ def getSubmissionRating(responseRatingChange, submissiontime): def getACSubmission(cf_username): - response1 = requests.get("https://codeforces.com/api/user.rating?handle=" + cf_username) - - if response1.status_code != 200 or response1.json()['status'] != 'OK': + try: + response1 = requests.get("https://codeforces.com/api/user.rating?handle=" + cf_username) + + if response1.status_code != 200 or response1.json()['status'] != 'OK': + return dict({ + 'status': 'FAILED', + }) + + responseRatingChange = response1.json()['result'] + + response2 = requests.get("https://codeforces.com/api/user.status?handle="+ cf_username) + + if response2.status_code != 200 or response2.json()['status'] != 'OK': + return dict({ + 'status': 'FAILED', + }) + + responseSubmission = response2.json()['result'][::-1] + + ProblemSubmission = dict(dict()) + + for it in responseSubmission: + if it['verdict'] == 'OK' and 'contestId' in it and 'rating' in it['problem']: + problemID = str(it['problem']['contestId']) + it['problem']['index'] + if problemID not in ProblemSubmission: + ProblemSubmission[problemID] = { + 'submissionId': it['id'], + 'creationTimeSeconds': it['creationTimeSeconds'], + 'participantType': it['author']['participantType'], + 'currentrating': getSubmissionRating(responseRatingChange, it['creationTimeSeconds']), + 'problem': it['problem'] + } + return dict({ - 'status': 'FAILED', + 'status': 'OK', + 'submissions': ProblemSubmission, }) - - responseRatingChange = response1.json()['result'] - - response2 = requests.get("https://codeforces.com/api/user.status?handle="+ cf_username) - - if response2.status_code != 200 or response2.json()['status'] != 'OK': + except Exception as ex: + logger.exception(ex) return dict({ 'status': 'FAILED', }) - responseSubmission = response2.json()['result'][::-1] - - ProblemSubmission = dict(dict()) - - for it in responseSubmission: - if it['verdict'] == 'OK' and 'contestId' in it and 'rating' in it['problem']: - problemID = str(it['problem']['contestId']) + it['problem']['index'] - if problemID not in ProblemSubmission: - ProblemSubmission[problemID] = { - 'submissionId': it['id'], - 'creationTimeSeconds': it['creationTimeSeconds'], - 'participantType': it['author']['participantType'], - 'currentrating': getSubmissionRating(responseRatingChange, it['creationTimeSeconds']), - 'problem': it['problem'] - } - - return dict({ - 'status': 'OK', - 'submissions': ProblemSubmission, - }) - -def updateSubmission(user): - profilenow = Profile.objects.get(user=user) - - profilenow.is_updating = True - profilenow.timestamp_updatedsubmission = make_aware(datetime.now()) - profilenow.save() - - cf_username = profilenow.cf_handle - submissions = getACSubmission(cf_username) - - if submissions['status'] != 'OK': - print('CF request error') +def updateSubmission(user): + try: + profilenow = Profile.objects.get(user=user) + + profilenow.is_updating = True + profilenow.timestamp_updatedsubmission = make_aware(datetime.now()) + profilenow.save() + + cf_username = profilenow.cf_handle + submissions = getACSubmission(cf_username) + + if submissions['status'] != 'OK': + profilenow.is_updating = False + profilenow.save() + return dict({ + 'status' : 'FAILED', + 'message': 'CF request error' + }) + + updatedcount = 0 + + for key, value in submissions['submissions'].items(): + if updateProblem(value['problem']) == False: + continue + try: + problemnow = Problem.objects.get(cf_problem_id = key) + except Exception as ex: + logger.exception(ex) + continue + if AcceptedSubmission.objects.filter(problem = problemnow, user = user).exists(): + continue + + try: + new_submission = AcceptedSubmission( + problem = problemnow, + user = user, + cf_submission_id = value['submissionId'], + timestamp = make_aware(datetime.fromtimestamp(value['creationTimeSeconds'])), + participantType = value['participantType'], + current_rating = value['currentrating'] + ) + new_submission.save() + + for tag in problemnow.tag.all(): + userstat = UserStatistic.objects.filter(user=user).filter(tag=tag) + if userstat: + userstat[0].count += 1 + userstat[0].score += problemnow.score + userstat[0].save() + + else: + new_userstat = UserStatistic( + user = user, + tag = tag, + count = 1, + score = problemnow.score + ) + new_userstat.save() + + scoreboard = ScoreBoard.objects.get(user=user) + scoreboard.score += problemnow.score + scoreboard.save() + + except Exception as ex: + logger.exception(ex) + + updatedcount += 1 + + logger.info('Updated ' + str(updatedcount) + ' submissions for ' + user.username) + profilenow.is_updating = False profilenow.save() + return dict({ - 'status' : 'Failed', - 'message': 'CF request error' + 'Status': 'OK', + 'message': 'Submission update Complete of total ' + str(updatedcount) }) + except Exception as ex: + logger.exception(ex) + return dict({ + 'status': 'FAILED', + }) + - updatedcount = 0 - - for key, value in submissions['submissions'].items(): - if updateProblem(value['problem']) == False: - continue - try: - problemnow = Problem.objects.get(cf_problem_id = key) - except Exception as e: - print(e) - print('Problem not found') - continue - if AcceptedSubmission.objects.filter(problem = problemnow, user = user).exists(): - continue +def deleteSubmission(user): + try: + profilenow = Profile.objects.get(user=user) + + profilenow.is_updating = True + profilenow.timestamp_updatedsubmission = make_aware(datetime.now()) + profilenow.save() try: - new_submission = AcceptedSubmission( - problem = problemnow, - user = user, - cf_submission_id = value['submissionId'], - timestamp = make_aware(datetime.fromtimestamp(value['creationTimeSeconds'])), - participantType = value['participantType'], - current_rating = value['currentrating'] - ) - new_submission.save() - - for tag in problemnow.tag.all(): - userstat = UserStatistic.objects.filter(user=user).filter(tag=tag) - if userstat: - userstat[0].count += 1 - userstat[0].score += problemnow.score - userstat[0].save() - - else: - new_userstat = UserStatistic( - user = user, - tag = tag, - count = 1, - score = problemnow.score - ) - new_userstat.save() - - scoreboard = ScoreBoard.objects.get(user=user) - scoreboard.score += problemnow.score - scoreboard.save() - - except Exception as e: - print(e) - print('Submission not saved') - - updatedcount += 1 - - print('Updated ' + str(updatedcount) + ' submissions for ' + user.username) - - profilenow.is_updating = False - profilenow.save() - - return dict({ - 'Status': 'OK', - 'message': 'Submission update Complete of total ' + str(updatedcount) - }) - -def deleteSubmission(user): - profilenow = Profile.objects.get(user=user) - - profilenow.is_updating = True - profilenow.timestamp_updatedsubmission = make_aware(datetime.now()) - profilenow.save() - - try: - AcceptedSubmission.objects.filter(user = user).delete() - userstat = UserStatistic.objects.filter(user = user) - userstat.delete() - scoreboard = ScoreBoard.objects.get(user=user) - scoreboard.score = 0 - scoreboard.save() - - except Exception as e: - print(e) - print('Error deleting submission for ' + user.username) - - profilenow.is_updating = False - profilenow.save() - - print('Successfully Deleted all submission for user ' + user.username) - - return dict({ - 'Status': 'OK', - 'message': 'Deleted Submissions for ' + user.username - }) + AcceptedSubmission.objects.filter(user = user).delete() + userstat = UserStatistic.objects.filter(user = user) + userstat.delete() + scoreboard = ScoreBoard.objects.get(user=user) + scoreboard.score = 0 + scoreboard.save() + + except Exception as ex: + logger.exception(ex) + + profilenow.is_updating = False + profilenow.save() + + logger.info('Successfully Deleted all submission for user ' + user.username) + + return dict({ + 'Status': 'OK', + 'message': 'Deleted Submissions for ' + user.username + }) + except Exception as ex: + logger.exception(ex) + return dict({ + 'status': 'FAILED', + }) diff --git a/problem_app/services/updateproblem.py b/problem_app/services/updateproblem.py index e0ea778..385faad 100644 --- a/problem_app/services/updateproblem.py +++ b/problem_app/services/updateproblem.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from problem_app.models import (Tag, Problem) from datetime import datetime @@ -10,10 +13,9 @@ def addTag(tags): try: new_tag = Tag(name = tag_name) new_tag.save() - print('new tag added ' + tag_name) - except Exception as e: - print(e) - print('Error adding new tag ' + tag_name) + logger.info('new tag added ' + tag_name) + except Exception as ex: + logger.exception(ex) return False return True @@ -29,10 +31,9 @@ def addProblem(cf_problem): timestamp_updated = make_aware(datetime.now()) ) new_problem.save() - print('new problem added ' + str(cf_problem['contestId']) + cf_problem['index']) - except Exception as e: - print(e) - print('Error adding new problem') + logger.info('new problem added ' + str(cf_problem['contestId']) + cf_problem['index']) + except Exception as ex: + logger.exception(ex) return False return True @@ -40,9 +41,8 @@ def updateTags(cf_problem): problemId = str(cf_problem['contestId']) + cf_problem['index'] try: problemnow = Problem.objects.get(cf_problem_id = problemId) - except Exception as e: - print(e) - print('Error finding problem') + except Exception as ex: + logger.exception(ex) return False updated = False if problemnow.score != cf_problem['rating']: @@ -52,9 +52,8 @@ def updateTags(cf_problem): for it in cf_problem['tags']: try: tagnow = Tag.objects.get(name = it) - except Exception as e: - print(e) - print('Error finding tag') + except Exception as ex: + logger.exception(ex) continue if problemnow.tag.filter(id = tagnow.id).exists(): continue @@ -63,20 +62,24 @@ def updateTags(cf_problem): if updated: problemnow.timestamp_updated = make_aware(datetime.now()) problemnow.save() - print('Problem Updated ' + problemnow.cf_problem_id) + logger.info('Problem Updated ' + problemnow.cf_problem_id) return True def updateProblem(cf_problem): - problemId = str(cf_problem['contestId']) + cf_problem['index'] - - if addTag(cf_problem['tags']) == False: - return False - - if Problem.objects.filter(cf_problem_id = problemId).exists(): + try: + problemId = str(cf_problem['contestId']) + cf_problem['index'] + + if addTag(cf_problem['tags']) == False: + return False + + if Problem.objects.filter(cf_problem_id = problemId).exists(): + return updateTags(cf_problem) + + if addProblem(cf_problem) == False: + return False + return updateTags(cf_problem) - - if addProblem(cf_problem) == False: - return False - - return updateTags(cf_problem) \ No newline at end of file + except Exception as ex: + logger.exception(ex) + return False \ No newline at end of file diff --git a/problem_app/submission_urls/views.py b/problem_app/submission_urls/views.py index abc2b22..86cad44 100644 --- a/problem_app/submission_urls/views.py +++ b/problem_app/submission_urls/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + import _thread from problem_app.models import AcceptedSubmission, Problem @@ -14,72 +17,86 @@ class SubmissionAV(APIView): permission_classes = [IsAuthenticated] def get(self, request): - username = request.GET.get('user') - problemid = request.GET.get('problem') - limit = request.GET.get('limit') - - queryset = [] - if username and problemid: - try: - cnt = int(limit) - queryset = AcceptedSubmission.objects.filter(user__username = username, problem__cf_problem_id = problemid)[:cnt] - except: - queryset = AcceptedSubmission.objects.filter(user__username = username, problem__cf_problem_id = problemid) - elif username: - try: - cnt = int(limit) - queryset = AcceptedSubmission.objects.filter(user__username=username)[:cnt] - except: - queryset = AcceptedSubmission.objects.filter(user__username=username) - elif problemid: - try: - cnt = int(limit) - queryset = AcceptedSubmission.objects.filter(problem__cf_problem_id = problemid)[:cnt] - except: - queryset = AcceptedSubmission.objects.filter(problem__cf_problem_id = problemid) - else: - try: - cnt = int(limit) - queryset = AcceptedSubmission.objects.all()[:cnt] - except: - queryset = AcceptedSubmission.objects.all() + try: + username = request.GET.get('user') + problemid = request.GET.get('problem') + limit = request.GET.get('limit') - serializer = SubmissionSerializer(queryset, many = True) - - return Response({ - 'status': 'OK', - 'count': len(serializer.data), - 'submissions': serializer.data - }) + queryset = [] + if username and problemid: + try: + cnt = int(limit) + queryset = AcceptedSubmission.objects.filter(user__username = username, problem__cf_problem_id = problemid)[:cnt] + except: + queryset = AcceptedSubmission.objects.filter(user__username = username, problem__cf_problem_id = problemid) + elif username: + try: + cnt = int(limit) + queryset = AcceptedSubmission.objects.filter(user__username=username)[:cnt] + except: + queryset = AcceptedSubmission.objects.filter(user__username=username) + elif problemid: + try: + cnt = int(limit) + queryset = AcceptedSubmission.objects.filter(problem__cf_problem_id = problemid)[:cnt] + except: + queryset = AcceptedSubmission.objects.filter(problem__cf_problem_id = problemid) + else: + try: + cnt = int(limit) + queryset = AcceptedSubmission.objects.all()[:cnt] + except: + queryset = AcceptedSubmission.objects.all() + + serializer = SubmissionSerializer(queryset, many = True) + + return Response({ + 'status': 'OK', + 'count': len(serializer.data), + 'submissions': serializer.data + }) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED' + }) class UpdateSubmissionAV(APIView): permission_classes = [IsAuthenticated] def post(self, request): - usernow = request.user - try: - profilenow = Profile.objects.get(user = usernow) - except: - return Response({ - 'status' : 'FAILED', - 'message': 'profile not found', - }, status=404) - if profilenow.is_updating == True: - return Response({ - 'status' : 'FAILED', - 'message': 'update in progress', - }, status=400) - if not profilenow.cf_handle: + usernow = request.user + + try: + profilenow = Profile.objects.get(user = usernow) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message': 'profile not found', + }, status=404) + if profilenow.is_updating == True: + return Response({ + 'status' : 'FAILED', + 'message': 'update in progress', + }, status=400) + if not profilenow.cf_handle: + return Response({ + 'status' : 'FAILED', + 'message': 'no codeforces handle found', + }, status=404) + + _thread.start_new_thread(updateSubmission, (usernow,)) + + return Response(dict({ + 'status' : 'OK', + 'message': 'updating submissions', + })) + except Exception as ex: + logger.exception(ex) return Response({ - 'status' : 'FAILED', - 'message': 'no codeforces handle found', - }, status=404) - - _thread.start_new_thread(updateSubmission, (usernow,)) - - return Response(dict({ - 'status' : 'OK', - 'message': 'updating submissions', - })) + 'status' : 'FAILED', + 'message': 'An Error Occurred while updating submission', + }, status=500) \ No newline at end of file diff --git a/suggestion_app/favorite_urls/views.py b/suggestion_app/favorite_urls/views.py index 91f1d73..046d837 100644 --- a/suggestion_app/favorite_urls/views.py +++ b/suggestion_app/favorite_urls/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from datetime import datetime from django.utils.timezone import make_aware @@ -13,82 +16,103 @@ class FavoriteAV(APIView): permission_classes = [IsAuthenticated] def get(self, request): - usernow = request.user - limit = request.GET.get('limit') try: - queryset = [] - if limit is None: - queryset = Favorite.objects.filter(user=usernow) - else: - queryset = Favorite.objects.filter(user=usernow)[:int(limit)] - except Exception as e: - print(e) + usernow = request.user + limit = request.GET.get('limit') + try: + queryset = [] + if limit is None: + queryset = Favorite.objects.filter(user=usernow) + else: + queryset = Favorite.objects.filter(user=usernow)[:int(limit)] + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'problems': "Error in database query", + }, status=500) + + serializer = FavoriteSerializer(queryset, many=True) return Response({ - 'status': 'FAILED', - 'problems': "Error in database query", - }, status=500) - - serializer = FavoriteSerializer(queryset, many=True) - return Response({ - 'status': 'OK', - 'favorits': serializer.data, - }) + 'status': 'OK', + 'favorits': serializer.data, + }) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'problems': "Error occurred while getting favorite problems.", + }, status=500) def post(self, request): - usernow = request.user - problemid = request.data.get('cf_problem_id') - try: - problemnow = Problem.objects.get(cf_problem_id = problemid) - except Exception as e: - print(e) - return Response({ - 'status' : 'FAILED', - 'message' : 'Problem not found', - }, status=404) + usernow = request.user + problemid = request.data.get('cf_problem_id') + + try: + problemnow = Problem.objects.get(cf_problem_id = problemid) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem not found', + }, status=404) + + if Favorite.objects.filter(user = usernow, problem = problemnow).exists(): + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem already exists', + }) + + if Favorite.objects.filter(user = usernow).count() > 99: + return Response({ + 'status' : 'FAILED', + 'message' : 'Limit Reached, delete some favorites to add new favorite', + }) - if Favorite.objects.filter(user = usernow, problem = problemnow).exists(): - return Response({ - 'status' : 'FAILED', - 'message' : 'Problem already exists', - }) + newfav = Favorite( + user = usernow, + problem = problemnow, + timestamp = make_aware(datetime.now()) + ) + newfav.save() - if Favorite.objects.filter(user = usernow).count() > 99: return Response({ - 'status' : 'FAILED', - 'message' : 'Limit Reached, delete some favorites to add new favorite', + 'status': 'OK', + 'message': 'the problem ' + problemid + ' added favorite for ' + usernow.username, }) - - newfav = Favorite( - user = usernow, - problem = problemnow, - timestamp = make_aware(datetime.now()) - ) - newfav.save() - - return Response({ - 'status': 'OK', - 'message': 'the problem ' + problemid + ' added favorite for ' + usernow.username, - }) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'problems': "Error Occurred while adding favorite", + }, status=500) def delete(self, request): - usernow = request.user - problemid = request.data.get('cf_problem_id') - try: - favnow = Favorite.objects.get(user = usernow, problem__cf_problem_id = problemid) - except Exception as e: - print(e) + usernow = request.user + problemid = request.data.get('cf_problem_id') + + try: + favnow = Favorite.objects.get(user = usernow, problem__cf_problem_id = problemid) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem not found', + }, status=404) + + favnow.delete() + return Response({ - 'status' : 'FAILED', - 'message' : 'Problem not found', - }, status=404) - - favnow.delete() - - return Response({ - 'status': 'OK', - 'message': 'the problem ' + problemid + ' removed from favorite for ' + usernow.username, - }) + 'status': 'OK', + 'message': 'the problem ' + problemid + ' removed from favorite for ' + usernow.username, + }) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'problems': "Error Occurred while deleting favorite", + }, status=500) diff --git a/suggestion_app/recommend_urls/views.py b/suggestion_app/recommend_urls/views.py index 2a6e503..c279e57 100644 --- a/suggestion_app/recommend_urls/views.py +++ b/suggestion_app/recommend_urls/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from datetime import datetime from django.utils.timezone import make_aware @@ -16,54 +19,68 @@ class RecommendationAV(APIView): permission_classes = [IsAuthenticated] def get(self, request): - usernow = request.user - limit = request.GET.get('limit') - - queryset = [] try: - cnt = int(limit) - queryset = Recommendation.objects.filter(user=usernow)[:cnt] - except Exception as e: - queryset = Recommendation.objects.filter(user=usernow) + usernow = request.user + limit = request.GET.get('limit') + + queryset = [] + try: + cnt = int(limit) + queryset = Recommendation.objects.filter(user=usernow)[:cnt] + except Exception as ex: + logger.exception(ex) + queryset = Recommendation.objects.filter(user=usernow) + + serializers = RecommendationSerializer(queryset, many=True) - serializers = RecommendationSerializer(queryset, many=True) - - return Response({ - 'status': 'OK', - 'recommendations': serializers.data, - }) - + return Response({ + 'status': 'OK', + 'recommendations': serializers.data, + }) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message': 'Error ocurred while getting recomendations.', + }, status=500) def delete(self, request): - usernow = request.user - problemid = request.data.get('cf_problem_id') - - if problemid is None: + try: + usernow = request.user + problemid = request.data.get('cf_problem_id') + + if problemid is None: + return Response({ + 'status' : 'FAILED', + 'message' : 'No problem selected' + }, status=400) + + try: + recnow = Recommendation.objects.get(user = usernow, problem__cf_problem_id = problemid) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem not recommended', + }, status=404) + + if AcceptedSubmission.objects.filter(user = usernow, problem = recnow.problem).exists(): + recnow.delete() + return Response({ + 'status': 'OK', + 'message': 'the problem ' + problemid + ' removed from recommendation for ' + usernow.username, + }) + return Response({ 'status' : 'FAILED', - 'message' : 'No problem selected' + 'message' : 'Problem not solved', }, status=400) - - try: - recnow = Recommendation.objects.get(user = usernow, problem__cf_problem_id = problemid) - except Exception as e: - print(e) + except Exception as ex: + logger.exception(ex) return Response({ 'status' : 'FAILED', - 'message' : 'Problem not recommended', + 'message' : 'Error ocurred while deleting recomentation.', }, status=404) - - if AcceptedSubmission.objects.filter(user = usernow, problem = recnow.problem).exists(): - recnow.delete() - return Response({ - 'status': 'OK', - 'message': 'the problem ' + problemid + ' removed from recommendation for ' + usernow.username, - }) - - return Response({ - 'status' : 'FAILED', - 'message' : 'Problem not solved', - }, status=400) @@ -71,142 +88,164 @@ class RecommendAV(APIView): permission_classes = [IsAuthenticated] def get(self, request, username): - mentor = request.user - try: - mentee = User.objects.get(username=username) - except Exception as e: - print(e) + mentor = request.user + + try: + mentee = User.objects.get(username=username) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message' : 'Mentee Not Found', + }, status=404) + + if Mentee.objects.filter(mentor=mentor, mentee=mentee, status="CURRENT").exists() == False: + return Response({ + 'status' : 'FAILED', + 'message' : 'Not current Mentor' + }, status=403) + + limit = request.GET.get('limit') + + queryset = [] + try: + cnt = int(limit) + queryset = Recommendation.objects.filter(user=mentee)[:cnt] + except Exception as ex: + logger.exception(ex) + queryset = Recommendation.objects.filter(user=mentee) + + serializers = RecommendationSerializer(queryset, many=True) + return Response({ - 'status': 'FAILED', - 'message' : 'Mentee Not Found', - }, status=404) - - if Mentee.objects.filter(mentor=mentor, mentee=mentee, status="CURRENT").exists() == False: + 'status': 'OK', + 'recommendations': serializers.data, + }) + except Exception as ex: + logger.exception(ex) return Response({ 'status' : 'FAILED', - 'message' : 'Not current Mentor' - }, status=403) - - limit = request.GET.get('limit') - - queryset = [] - try: - cnt = int(limit) - queryset = Recommendation.objects.filter(user=mentee)[:cnt] - except: - queryset = Recommendation.objects.filter(user=mentee) - - serializers = RecommendationSerializer(queryset, many=True) - - return Response({ - 'status': 'OK', - 'recommendations': serializers.data, - }) + 'message' : 'Error ocurred while getting recommendations.' + }, status=500) def post(self, request, username): - mentor = request.user - try: - mentee = User.objects.get(username=username) - except Exception as e: - print(e) - return Response({ - 'status': 'FAILED', - 'message' : 'Mentee Not Found', - }) - - if Mentee.objects.filter(mentor=mentor, mentee=mentee, status="CURRENT").exists() == False: - return Response({ - 'status' : 'FAILED', - 'message' : 'Not current Mentor' - }, status=403) + mentor = request.user - problemid = request.data.get('cf_problem_id') - note = request.data.get('note') - - if problemid is None: - return Response({ - 'status' : 'FAILED', - 'message' : 'No problem selected' - }, status=400) + try: + mentee = User.objects.get(username=username) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message' : 'Mentee Not Found', + }) - try: - probnow = Problem.objects.get(cf_problem_id = problemid) - except Exception as e: - print(e) - return Response({ - 'status' : 'FAILED', - 'message' : 'Problem not found', - }, status=404) + if Mentee.objects.filter(mentor=mentor, mentee=mentee, status="CURRENT").exists() == False: + return Response({ + 'status' : 'FAILED', + 'message' : 'Not current Mentor' + }, status=403) + + problemid = request.data.get('cf_problem_id') + note = request.data.get('note') - if Recommendation.objects.filter(user = mentee, problem = probnow).exists(): - return Response({ - 'status' : 'FAILED', - 'message' : 'Problem Already Recommended', - }, status=400) + if problemid is None: + return Response({ + 'status' : 'FAILED', + 'message' : 'No problem selected' + }, status=400) + + try: + probnow = Problem.objects.get(cf_problem_id = problemid) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem not found', + }, status=404) + + if Recommendation.objects.filter(user = mentee, problem = probnow).exists(): + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem Already Recommended', + }, status=400) + + if Recommendation.objects.filter(user = mentee).count() > 99: + return Response({ + 'status' : 'FAILED', + 'message' : 'Limit Reached, delete some recommendations to add new recommendations', + }, status=400) - if Recommendation.objects.filter(user = mentee).count() > 99: + recnow = Recommendation( + user = mentee, + problem = probnow, + mentor = mentor, + note = note, + timestamp = make_aware(datetime.now()), + ) + recnow.save() + + return Response({ + 'status' : 'OK', + 'message' : 'Poblem ' + problemid + ' Recommeded to ' + mentee.username, + }) + except Exception as ex: + logger.exception(ex) return Response({ 'status' : 'FAILED', - 'message' : 'Limit Reached, delete some recommendations to add new recommendations', - }, status=400) - - recnow = Recommendation( - user = mentee, - problem = probnow, - mentor = mentor, - note = note, - timestamp = make_aware(datetime.now()), - ) - recnow.save() - - return Response({ - 'status' : 'OK', - 'message' : 'Poblem ' + problemid + ' Recommeded to ' + mentee.username, - }) + 'message' : 'Error ocurred while recommending problem.' + }, status=500) def delete(self, request, username): - mentor = request.user - try: - mentee = User.objects.get(username=username) - except Exception as e: - print(e) - return Response({ - 'status': 'FAILED', - 'message' : 'Mentee Not Found', - }, status=404) - - if Mentee.objects.filter(mentor=mentor, mentee=mentee, status="CURRENT").exists() == False: - return Response({ - 'status' : 'FAILED', - 'message' : 'Not current Mentor' - }, status=403) + mentor = request.user - problemid = request.data.get('cf_problem_id') - - if problemid is None: - return Response({ - 'status' : 'FAILED', - 'message' : 'No problem selected' - }, status=400) + try: + mentee = User.objects.get(username=username) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message' : 'Mentee Not Found', + }, status=404) + + if Mentee.objects.filter(mentor=mentor, mentee=mentee, status="CURRENT").exists() == False: + return Response({ + 'status' : 'FAILED', + 'message' : 'Not current Mentor' + }, status=403) + + problemid = request.data.get('cf_problem_id') + + if problemid is None: + return Response({ + 'status' : 'FAILED', + 'message' : 'No problem selected' + }, status=400) + + try: + recnow = Recommendation.objects.get(user = mentee, problem__cf_problem_id = problemid) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem not found', + }, status=404) + + recnow.delete() - try: - recnow = Recommendation.objects.get(user = mentee, problem__cf_problem_id = problemid) - except Exception as e: - print(e) + return Response({ + 'status' : 'OK', + 'message' : 'Problem ' + problemid + ' is removed from recommendations of ' + mentee.username, + }) + except Exception as ex: + logger.exception(ex) return Response({ 'status' : 'FAILED', - 'message' : 'Problem not found', - }, status=404) - - recnow.delete() - - return Response({ - 'status' : 'OK', - 'message' : 'Problem ' + problemid + ' is removed from recommendations of ' + mentee.username, - }) + 'message' : 'Error ocurred while deleting recommendation.' + }, status=500) \ No newline at end of file diff --git a/suggestion_app/services/generateSuggestion.py b/suggestion_app/services/generateSuggestion.py index f729b30..6969d14 100644 --- a/suggestion_app/services/generateSuggestion.py +++ b/suggestion_app/services/generateSuggestion.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + import requests import random import numpy as np @@ -15,8 +18,8 @@ def delete_suggestion(user): try: Suggestion.objects.filter(user=user).delete() - except Exception as e: - print(e) + except Exception as ex: + logger.exception(ex) return False return True @@ -33,7 +36,7 @@ def filter_suggestions(problems, rating): problem_map.append(problem) if not problem_data: - print("No problems found for KNN filtering.") + logger.info("No problems found for KNN filtering.") return [] # Convert to numpy array for KNN @@ -55,50 +58,54 @@ def filter_suggestions(problems, rating): def generate_new_suggestion(user): - if delete_suggestion(user) == False: - return False - try: - profilenow = Profile.objects.get(user=user) - except Exception as e: - print(e) - return False - cf_username = profilenow.cf_handle - - profilenow.is_updating = True - profilenow.save() - - response = requests.get("https://codeforces.com/api/user.info?handles=" + cf_username) - - if response.status_code != 200 or response.json()['status'] != 'OK': - profilenow.is_updating = False + if delete_suggestion(user) == False: + return False + + try: + profilenow = Profile.objects.get(user=user) + except Exception as e: + logger.exception(e) + return False + cf_username = profilenow.cf_handle + + profilenow.is_updating = True profilenow.save() - return False - - try: - rating = response.json()['result'][0]['rating'] - except Exception as e: - print(e) - rating = 1000 - - queryset = Problem.objects.filter(score__range=(rating - 200, rating + 400)).exclude(id__in = AcceptedSubmission.objects.filter(user=user).values('problem')) - - problems = filter_suggestions(queryset, rating) - - for problem in problems: - suggestion = Suggestion( - user=user, - problem=problem['problem'], - timestamp= make_aware(datetime.now()) - ) + + response = requests.get("https://codeforces.com/api/user.info?handles=" + cf_username) + + if response.status_code != 200 or response.json()['status'] != 'OK': + profilenow.is_updating = False + profilenow.save() + return False + try: - suggestion.save() + rating = response.json()['result'][0]['rating'] except Exception as e: - print(e) - - print('Suggestion Generated for ' + user.username) - - profilenow.is_updating = False - profilenow.save() - - return True + logger.exception(e) + rating = 1000 + + queryset = Problem.objects.filter(score__range=(rating - 200, rating + 400)).exclude(id__in = AcceptedSubmission.objects.filter(user=user).values('problem')) + + problems = filter_suggestions(queryset, rating) + + for problem in problems: + suggestion = Suggestion( + user=user, + problem=problem['problem'], + timestamp= make_aware(datetime.now()) + ) + try: + suggestion.save() + except Exception as e: + logger.exception(e) + + logger.info('Suggestion Generated for ' + user.username) + + profilenow.is_updating = False + profilenow.save() + + return True + except Exception as ex: + logger.exception(ex) + return False diff --git a/suggestion_app/suggestion_urls/views.py b/suggestion_app/suggestion_urls/views.py index 237f95b..3824705 100644 --- a/suggestion_app/suggestion_urls/views.py +++ b/suggestion_app/suggestion_urls/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + import _thread from problem_app.models import AcceptedSubmission @@ -15,95 +18,117 @@ class SuggestionAV(APIView): permission_classes = [IsAuthenticated] def get(self, request): - usernow = request.user - limit = request.GET.get('limit') - try: - profilenow = Profile.objects.get(user = usernow) - except Exception as e: - print(e) + usernow = request.user + limit = request.GET.get('limit') + + try: + profilenow = Profile.objects.get(user = usernow) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message': 'Profile not found', + }, status=404) + if profilenow.is_updating: + return Response({ + 'status': 'FAILED', + 'message': 'Updating Suggestion', + }, status=400) + + queryset = [] + try: + cnt = int(limit) + queryset = Suggestion.objects.filter(user=usernow)[:cnt] + except Exception as ex: + logger.exception(ex) + queryset = Suggestion.objects.filter(user=usernow) + + serializers = SuggestionSerializer(queryset, many=True) + return Response({ - 'status': 'FAILED', - 'message': 'Profile not found', - }, status=404) - if profilenow.is_updating: + 'status': 'OK', + 'count': len(serializers.data), + 'suggetions': serializers.data, + }) + except Exception as ex: + logger.exception(ex) return Response({ 'status': 'FAILED', - 'message': 'Updating Suggestion', - }, status=400) - - queryset = [] - try: - cnt = int(limit) - queryset = Suggestion.objects.filter(user=usernow)[:cnt] - except Exception as e: - queryset = Suggestion.objects.filter(user=usernow) - - serializers = SuggestionSerializer(queryset, many=True) - - return Response({ - 'status': 'OK', - 'count': len(serializers.data), - 'suggetions': serializers.data, - }) + 'message': 'Error ocurred while getting suggestion.', + }, status=500) def post(self, request): - usernow = request.user - try: - profilenow = Profile.objects.get(user=usernow) - except Exception as e: - print(e) - return Response({ - 'status': 'FAILED', - 'message': 'Profile not found', - }, status=404) + usernow = request.user - if profilenow.is_updating: + try: + profilenow = Profile.objects.get(user=usernow) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status': 'FAILED', + 'message': 'Profile not found', + }, status=404) + + if profilenow.is_updating: + return Response({ + 'status': 'FAILED', + 'message': 'Update in progress', + }, status=403) + + _thread.start_new_thread(generate_new_suggestion, (usernow,)) + + return Response({ + 'status': 'OK', + 'message': 'Genereting Suggestions', + }) + except Exception as ex: + logger.exception(ex) return Response({ 'status': 'FAILED', - 'message': 'Update in progress', - }, status=403) - - _thread.start_new_thread(generate_new_suggestion, (usernow,)) - - return Response({ - 'status': 'OK', - 'message': 'Genereting Suggestions', - }) + 'message': 'Error ocurred while generating suggestion.', + }, status=500) def delete(self, request): - usernow = request.user - problemid = request.data.get('cf_problem_id') - - if problemid is None: + try: + usernow = request.user + problemid = request.data.get('cf_problem_id') + + if problemid is None: + return Response({ + 'status' : 'FAILED', + 'message' : 'No problem selected' + }, status=400) + + try: + suggestnow = Suggestion.objects.get(user = usernow, problem__cf_problem_id = problemid) + except Exception as ex: + logger.exception(ex) + return Response({ + 'status' : 'FAILED', + 'message' : 'Problem not Suggested', + }, status=400) + + if AcceptedSubmission.objects.filter(user = usernow, problem = suggestnow.problem).exists(): + suggestnow.delete() + return Response({ + 'status': 'OK', + 'message': 'the problem ' + problemid + ' removed from Suggestion for ' + usernow.username, + }) + return Response({ 'status' : 'FAILED', - 'message' : 'No problem selected' - }, status=400) - - try: - suggestnow = Suggestion.objects.get(user = usernow, problem__cf_problem_id = problemid) - except Exception as e: - print(e) + 'message' : 'Problem not solved', + }, status=403) + except Exception as ex: + logger.exception(ex) return Response({ 'status' : 'FAILED', - 'message' : 'Problem not Suggested', + 'message' : 'Error ocurred while deleting suggestion.', }, status=400) - - if AcceptedSubmission.objects.filter(user = usernow, problem = suggestnow.problem).exists(): - suggestnow.delete() - return Response({ - 'status': 'OK', - 'message': 'the problem ' + problemid + ' removed from Suggestion for ' + usernow.username, - }) - - return Response({ - 'status' : 'FAILED', - 'message' : 'Problem not solved', - }, status=403) diff --git a/user_app/views.py b/user_app/views.py index e05ed81..ebf9602 100644 --- a/user_app/views.py +++ b/user_app/views.py @@ -1,3 +1,6 @@ +import logging +logger = logging.getLogger(__name__) + from django.contrib.auth.models import User from notification_app.models import Notification from problem_app.services.updateallsubmission import deleteSubmission @@ -22,20 +25,28 @@ class ProfileViewset(viewsets.ModelViewSet): allowed_methods = ('GET', 'POST', 'PUT', 'DELETE') def get_queryset(self): - username = self.request.GET.get('username') or self.request.user.username - user = User.objects.get(username=username) - return Profile.objects.filter(user=user) + try: + username = self.request.GET.get('username') or self.request.user.username + user = User.objects.get(username=username) + return Profile.objects.filter(user=user) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting profile data.'}) def update(self, request, *args, **kwargs): - profile = self.get_object() - serializer = self.get_serializer(profile, data=request.data) - serializer.is_valid(raise_exception=True) + try: + profile = self.get_object() + serializer = self.get_serializer(profile, data=request.data) + serializer.is_valid(raise_exception=True) - if serializer.validated_data['cf_handle'] != profile.cf_handle: - deleteSubmission(request.user) + if serializer.validated_data['cf_handle'] != profile.cf_handle: + deleteSubmission(request.user) - serializer.save() - return Response(serializer.data) + serializer.save() + return Response(serializer.data) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while updating profile.'}) class MenteeViewset(viewsets.ModelViewSet): @@ -43,14 +54,18 @@ class MenteeViewset(viewsets.ModelViewSet): permission_classes = (IsAuthenticatedOrReadOnly, IsMentorOrMenteeOrReadOnly) def get_queryset(self): - username = self.request.GET.get('username') or self.request.user.username - user = User.objects.get(username=username) - return Mentee.objects.filter(mentor=user, status='CURRENT') + try: + username = self.request.GET.get('username') or self.request.user.username + user = User.objects.get(username=username) + return Mentee.objects.filter(mentor=user, status='CURRENT') + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting data.'}) @action(detail=False, methods=['post']) def request_to_be_mentee(self, request): - mentee_username = request.data.get('mentee') try: + mentee_username = request.data.get('mentee') mentee = User.objects.get(username=mentee_username) user = request.user @@ -88,6 +103,9 @@ def request_to_be_mentee(self, request): except User.DoesNotExist: return Response(status=404, data={'message': 'User does not exist!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while requesting connections.'}) @action(detail=False, methods=['post']) @@ -130,170 +148,223 @@ def request_to_be_mentor(self, request): except User.DoesNotExist: return Response(status=404, data={'message': 'User does not exist!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while requesting connections.'}) @action(detail=False, methods=['get']) def get_current_mentor(self, request): - username = request.GET.get('username') or request.user.username - user = User.objects.get(username=username) - mentors = Mentee.objects.filter(mentee=user, status='CURRENT') - serialized = MenteeSerializer(mentors, many=True) - return Response(data=serialized.data, status=200) + try: + username = request.GET.get('username') or request.user.username + user = User.objects.get(username=username) + mentors = Mentee.objects.filter(mentee=user, status='CURRENT') + serialized = MenteeSerializer(mentors, many=True) + return Response(data=serialized.data, status=200) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting connections.'}) @action(detail=False, methods=['get']) def get_pending_requests(self, request): - if request.user.is_authenticated: - mentors = Mentee.objects.filter(mentee=request.user, status='REQUESTED_FROM_MENTEE') - mentees = Mentee.objects.filter(mentor=request.user, status='REQUESTED_FROM_MENTOR') - pending_list = mentors | mentees - serialized = MenteeSerializer(pending_list, many=True) - return Response(data=serialized.data, status=200) - - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + try: + if request.user.is_authenticated: + mentors = Mentee.objects.filter(mentee=request.user, status='REQUESTED_FROM_MENTEE') + mentees = Mentee.objects.filter(mentor=request.user, status='REQUESTED_FROM_MENTOR') + pending_list = mentors | mentees + serialized = MenteeSerializer(pending_list, many=True) + return Response(data=serialized.data, status=200) + + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting pending connection requests.'}) @action(detail=False, methods=['get']) def get_requests_to_be_mentor(self, request): - if request.user.is_authenticated: - mentors = Mentee.objects.filter(mentor=request.user, status='REQUESTED_FROM_MENTEE') - serialized = MenteeSerializer(mentors, many=True) - return Response(data=serialized.data, status=200) - - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + try: + if request.user.is_authenticated: + mentors = Mentee.objects.filter(mentor=request.user, status='REQUESTED_FROM_MENTEE') + serialized = MenteeSerializer(mentors, many=True) + return Response(data=serialized.data, status=200) + + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting connection requests.'}) @action(detail=False, methods=['get']) def get_requests_to_be_mentee(self, request): - if request.user.is_authenticated: - mentees = Mentee.objects.filter(mentee=request.user, status='REQUESTED_FROM_MENTOR') - serialized = MenteeSerializer(mentees, many=True) - return Response(data=serialized.data, status=200) - - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + try: + if request.user.is_authenticated: + mentees = Mentee.objects.filter(mentee=request.user, status='REQUESTED_FROM_MENTOR') + serialized = MenteeSerializer(mentees, many=True) + return Response(data=serialized.data, status=200) + + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting connection requests.'}) @action(detail=False, methods=['get']) def get_past_mentors(self, request): - if request.user.is_authenticated: - mentors = Mentee.objects.filter(mentee=request.user, status='FORMER') - serialized = MenteeSerializer(mentors, many=True) - return Response(data=serialized.data, status=200) + try: + if request.user.is_authenticated: + mentors = Mentee.objects.filter(mentee=request.user, status='FORMER') + serialized = MenteeSerializer(mentors, many=True) + return Response(data=serialized.data, status=200) - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting previous mentors.'}) @action(detail=False, methods=['get']) def get_past_mentees(self, request): - if request.user.is_authenticated: - mentees = Mentee.objects.filter(mentor=request.user, status='FORMER') - serialized = MenteeSerializer(mentees, many=True) - return Response(data=serialized.data, status=200) + try: + if request.user.is_authenticated: + mentees = Mentee.objects.filter(mentor=request.user, status='FORMER') + serialized = MenteeSerializer(mentees, many=True) + return Response(data=serialized.data, status=200) - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting previous mentees.'}) @action(detail=False, methods=['put'], url_path='accept_request/(?P[^/.]+)') def accept_request(self, request, request_id): - mentorship_request = Mentee.objects.filter(id=request_id) - if mentorship_request[0].status == 'REQUESTED_FROM_MENTOR' and mentorship_request[0].mentee == request.user: - notification = Notification.objects.create(user=mentorship_request[0].mentor, notification_type='Request Accepted') - notification.save() - mentorship_request.update(status='CURRENT') - elif mentorship_request[0].status == 'REQUESTED_FROM_MENTEE' and mentorship_request[0].mentor == request.user: - notification = Notification.objects.create(user=mentorship_request[0].mentee, notification_type='Request Accepted') - notification.save() - mentorship_request.update(status='CURRENT') - else: - return Response(status=403, data={'message': 'You do not have permission to accpet this request!'}) - return Response(status=200, data={'message': 'Request accepted successfully!'}) + try: + mentorship_request = Mentee.objects.filter(id=request_id) + if mentorship_request[0].status == 'REQUESTED_FROM_MENTOR' and mentorship_request[0].mentee == request.user: + notification = Notification.objects.create(user=mentorship_request[0].mentor, notification_type='Request Accepted') + notification.save() + mentorship_request.update(status='CURRENT') + elif mentorship_request[0].status == 'REQUESTED_FROM_MENTEE' and mentorship_request[0].mentor == request.user: + notification = Notification.objects.create(user=mentorship_request[0].mentee, notification_type='Request Accepted') + notification.save() + mentorship_request.update(status='CURRENT') + else: + return Response(status=403, data={'message': 'You do not have permission to accpet this request!'}) + return Response(status=200, data={'message': 'Request accepted successfully!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while accepting connection request.'}) @action(detail=False, methods=['put'], url_path='reject_request/(?P[^/.]+)') def reject_request(self, request, request_id): - mentorship_request = Mentee.objects.filter(id=request_id) - if mentorship_request[0].status == 'REQUESTED_FROM_MENTOR' and mentorship_request[0].mentee == request.user: - notification = Notification.objects.create(user=mentorship_request[0].mentor, notification_type='Request Rejected') - notification.save() - mentorship_request.delete() - elif mentorship_request[0].status == 'REQUESTED_FROM_MENTEE' and mentorship_request[0].mentor == request.user: - notification = Notification.objects.create(user=mentorship_request[0].mentee, notification_type='Request Rejected') - notification.save() - mentorship_request.delete() - else: - return Response(status=403, data={'message': 'You do not have permission to reject this request!'}) - return Response(status=200, data={'message': 'Request rejected successfully!'}) + try: + mentorship_request = Mentee.objects.filter(id=request_id) + if mentorship_request[0].status == 'REQUESTED_FROM_MENTOR' and mentorship_request[0].mentee == request.user: + notification = Notification.objects.create(user=mentorship_request[0].mentor, notification_type='Request Rejected') + notification.save() + mentorship_request.delete() + elif mentorship_request[0].status == 'REQUESTED_FROM_MENTEE' and mentorship_request[0].mentor == request.user: + notification = Notification.objects.create(user=mentorship_request[0].mentee, notification_type='Request Rejected') + notification.save() + mentorship_request.delete() + else: + return Response(status=403, data={'message': 'You do not have permission to reject this request!'}) + return Response(status=200, data={'message': 'Request rejected successfully!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while rejecting connection request.'}) @action(detail=False, methods=['get']) def is_connection_or_requested(self, request): - if request.user.is_authenticated: - username = request.GET.get('username') - try: - user = User.objects.get(username=username) + try: + if request.user.is_authenticated: + username = request.GET.get('username') + try: + user = User.objects.get(username=username) - request_list = Mentee.objects.filter(mentee=request.user, mentor=user) | Mentee.objects.filter(mentor=request.user, mentee=user) + request_list = Mentee.objects.filter(mentee=request.user, mentor=user) | Mentee.objects.filter(mentor=request.user, mentee=user) + + if request_list: + return Response(status=200, data={'status': request_list[0].status}) + else: + return Response(status=200, data={'status': 'NOT_CONNECTED'}) + + except User.DoesNotExist: + return Response(status=404, data={'message': 'User does not exist!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while checking connection.'}) + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while checking connection.'}) - if request_list: - return Response(status=200, data={'status': request_list[0].status}) - else: - return Response(status=200, data={'status': 'NOT_CONNECTED'}) - - except User.DoesNotExist: - return Response(status=404, data={'message': 'User does not exist!'}) - - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) @action(detail=False, methods=['post']) def close_connection(self, request): - if request.user.is_authenticated: - username = request.data.get('username') - try: - user = User.objects.get(username=username) - mentorships = Mentee.objects.filter(mentor=request.user, mentee=user, status='CURRENT') | Mentee.objects.filter(mentee=request.user, mentor=user, status='CURRENT') - - if mentorships: - mentorships[0].status = 'FORMER' - mentorships[0].save() - return Response(status=200, data={'message': 'Connection closed successfully!'}) - - else: - return Response(status=403, data={'message': 'Request failed!'}) - - except User.DoesNotExist: - return Response(status=404, data={'message': 'User does not exist!'}) + try: + if request.user.is_authenticated: + username = request.data.get('username') + try: + user = User.objects.get(username=username) + mentorships = Mentee.objects.filter(mentor=request.user, mentee=user, status='CURRENT') | Mentee.objects.filter(mentee=request.user, mentor=user, status='CURRENT') + + if mentorships: + mentorships[0].status = 'FORMER' + mentorships[0].save() + return Response(status=200, data={'message': 'Connection closed successfully!'}) + + else: + return Response(status=403, data={'message': 'Request failed!'}) + + except User.DoesNotExist: + return Response(status=404, data={'message': 'User does not exist!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while closing connection.'}) - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while closing connection.'}) @action(detail=False, methods=['post'], url_path='cancel_pending_request/(?P[^/.]+)') def cancel_pending_request(self, request, request_id): - if request.user.is_authenticated: - - mentorships = Mentee.objects.filter(id=request_id) + try: + if request.user.is_authenticated: + + mentorships = Mentee.objects.filter(id=request_id) - if mentorships[0].mentee == request.user and mentorships[0].status == 'REQUESTED_FROM_MENTEE': - mentorships[0].delete() - return Response(status=200, data={'message': 'Request cancelled successfully!'}) - - elif mentorships[0].mentor == request.user and mentorships[0].status == 'REQUESTED_FROM_MENTOR': - mentorships[0].delete() - return Response(status=200, data={'message': 'Request cancelled successfully!'}) - - else: - return Response(status=403, data={'message': 'Request failed!'}) + if mentorships[0].mentee == request.user and mentorships[0].status == 'REQUESTED_FROM_MENTEE': + mentorships[0].delete() + return Response(status=200, data={'message': 'Request cancelled successfully!'}) + + elif mentorships[0].mentor == request.user and mentorships[0].status == 'REQUESTED_FROM_MENTOR': + mentorships[0].delete() + return Response(status=200, data={'message': 'Request cancelled successfully!'}) + + else: + return Response(status=403, data={'message': 'Request failed!'}) - else: - return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + else: + return Response(status=401, data={'message': 'Authentication credentials were not provided.'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while cancelling pending request.'}) @api_view(['GET']) @@ -304,3 +375,6 @@ def get_user_info(request, username): return Response(data=CurrentUserSerializer(user).data, status=200) except User.DoesNotExist: return Response(status=404, data={'message': 'User does not exist!'}) + except Exception as ex: + logger.exception(ex) + return Response(status=500, data={'message': 'Some error occurred while getting user info.'})