From b0ab5d93393d191ffbc6e0c4b0cc3ebc2624fc27 Mon Sep 17 00:00:00 2001 From: prathamesh Date: Fri, 13 Nov 2020 15:34:22 +0530 Subject: Use QRcode to upload a file from any device --- yaksh/views.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index b3b1e02..63a41af 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -40,7 +40,8 @@ from yaksh.models import ( StdIOBasedTestCase, StringTestCase, TestCase, User, get_model_class, FIXTURES_DIR_PATH, MOD_GROUP_NAME, Lesson, LessonFile, LearningUnit, LearningModule, CourseStatus, question_types, Post, Comment, - Topic, TableOfContents, LessonQuizAnswer, MicroManager + Topic, TableOfContents, LessonQuizAnswer, MicroManager, QRcode, + QRcodeHandler ) from yaksh.forms import ( UserRegisterForm, UserLoginForm, QuizForm, QuestionForm, @@ -57,6 +58,7 @@ from .send_emails import (send_user_mail, from .decorators import email_verified, has_profile from .tasks import regrade_papers from notifications_plugin.models import Notification +import hashlib def my_redirect(url): @@ -671,6 +673,7 @@ def show_question(request, question, paper, error_message=None, quiz_type = 'Exam' can_skip = False assignment_files = [] + qrcode = [] if previous_question: delay_time = paper.time_left_on_question(previous_question) else: @@ -719,6 +722,13 @@ def show_question(request, question, paper, error_message=None, user=request.user, question_paper_id=paper.question_paper_id ) + handlers = QRcodeHandler.objects.filter(user=request.user, + question=question, + answerpaper=paper) + qrcode = None + if handlers.exists(): + handler = handlers.last() + qrcode = handler.qrcode_set.filter(active=True, used=False).last() files = FileUpload.objects.filter(question_id=question.id, hide=False) course = Course.objects.get(id=course_id) module = course.learning_module.get(id=module_id) @@ -739,6 +749,7 @@ def show_question(request, question, paper, error_message=None, 'quiz_type': quiz_type, 'all_modules': all_modules, 'assignment_files': assignment_files, + 'qrcode': qrcode, } answers = paper.get_previous_answers(question) if answers: @@ -4136,3 +4147,65 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids): messages.info(request, 'Updated successfully for user: {0}, question: {1}'.format( username, question.summary)) + + +@login_required +@email_verified +def generate_qrcode(request, answerpaper_id, question_id, module_id): + user = request.user + answerpaper = get_object_or_404(AnswerPaper, pk=answerpaper_id) + question = get_object_or_404(Question, pk=question_id) + + if not answerpaper.is_attempt_inprogress(): + pass + handler = QRcodeHandler.objects.get_or_create(user=user, question=question, + answerpaper=answerpaper)[0] + qrcode = handler.get_qrcode() + content = '{0}/exam/upload_file/{1}'.format(URL_ROOT, qrcode.short_key) + qrcode.generate_image(content) + qrcode.save() + return show_question(request, question, answerpaper, + course_id=answerpaper.course.id, module_id=module_id, + previous_question=question) + + +def upload_file(request, key): + qrcode = get_object_or_404(QRcode, short_key=key, active=True, used=False) + handler = qrcode.handler + context = {'question' : handler.question, 'key' : qrcode.short_key} + if not handler.can_use(): + context['success'] = True + context['msg'] = 'Sorry, test time up!' + return render(request, 'yaksh/upload_file.html', context) + if request.method == 'POST': + assignment_filename = request.FILES.getlist('assignment') + if not assignment_filename: + msg = 'Please upload assignment file' + context['msg'] = msg + return render(request, 'yaksh/upload_file.html', context) + for fname in assignment_filename: + fname._name = fname._name.replace(" ", "_") + assignment_files = AssignmentUpload.objects.filter( + assignmentQuestion=handler.question, + course_id=handler.answerpaper.course.id, + assignmentFile__icontains=fname, user=handler.user, + question_paper=handler.answerpaper.question_paper) + if assignment_files.exists(): + assign_file = assignment_files.first() + if os.path.exists(assign_file.assignmentFile.path): + os.remove(assign_file.assignmentFile.path) + assign_file.delete() + AssignmentUpload.objects.create(user=handler.user, + assignmentQuestion=handler.question, + course_id=handler.answerpaper.course.id, assignmentFile=fname, + question_paper=handler.answerpaper.question_paper) + qrcode.set_used() + qrcode.deactivate() + qrcode.save() + context['success'] = True + msg = "File Uploaded Successfully! Reload the (test)question "\ + "page to see the uploaded file" + context['msg'] = msg + return render(request, 'yaksh/upload_file.html', context) + return render(request, 'yaksh/upload_file.html', context) + -- cgit From 01efe49e230163d276c340a7de7317a949dde31a Mon Sep 17 00:00:00 2001 From: prathamesh Date: Fri, 4 Dec 2020 08:29:54 +0530 Subject: Add qrcode package to the requirements and fix PEP8 --- yaksh/views.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 63a41af..7ec6f0f 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -723,8 +723,8 @@ def show_question(request, question, paper, error_message=None, question_paper_id=paper.question_paper_id ) handlers = QRcodeHandler.objects.filter(user=request.user, - question=question, - answerpaper=paper) + question=question, + answerpaper=paper) qrcode = None if handlers.exists(): handler = handlers.last() @@ -4104,8 +4104,8 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids): username = row['username'] user = User.objects.filter(username=username).first() if user: - answerpapers = question_paper.answerpaper_set.filter(course=course, - user_id=user.id) + answerpapers = question_paper.answerpaper_set.filter( + course=course, user_id=user.id) else: messages.info(request, '{0} user not found!'.format(username)) continue @@ -4119,7 +4119,7 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids): question = Question.objects.filter(id=qid).first() if not question: messages.info(request, - '{0} is an invalid question id!'.format(qid)) + '{0} is an invalid question id!'.format(qid)) continue if qid in questions: answer = answers.filter(question_id=qid).last() @@ -4138,13 +4138,14 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids): answer.set_marks(float(row[key1])) except ValueError: messages.info(request, - '{0} invalid marks!'.format(row[key1])) + '{0} invalid marks!'.format(row[key1])) if key2 in reader.fieldnames: answer.set_comment(row[key2]) answer.save() answerpaper.update_marks(state='completed') answerpaper.save() - messages.info(request, + messages.info( + request, 'Updated successfully for user: {0}, question: {1}'.format( username, question.summary)) @@ -4172,7 +4173,7 @@ def generate_qrcode(request, answerpaper_id, question_id, module_id): def upload_file(request, key): qrcode = get_object_or_404(QRcode, short_key=key, active=True, used=False) handler = qrcode.handler - context = {'question' : handler.question, 'key' : qrcode.short_key} + context = {'question': handler.question, 'key': qrcode.short_key} if not handler.can_use(): context['success'] = True context['msg'] = 'Sorry, test time up!' @@ -4195,7 +4196,8 @@ def upload_file(request, key): if os.path.exists(assign_file.assignmentFile.path): os.remove(assign_file.assignmentFile.path) assign_file.delete() - AssignmentUpload.objects.create(user=handler.user, + AssignmentUpload.objects.create( + user=handler.user, assignmentQuestion=handler.question, course_id=handler.answerpaper.course.id, assignmentFile=fname, question_paper=handler.answerpaper.question_paper) @@ -4208,4 +4210,3 @@ def upload_file(request, key): context['msg'] = msg return render(request, 'yaksh/upload_file.html', context) return render(request, 'yaksh/upload_file.html', context) - -- cgit From f38664721ed117f445b27af839fe41898ed90a47 Mon Sep 17 00:00:00 2001 From: prathamesh Date: Wed, 24 Mar 2021 12:56:33 +0530 Subject: Modify QR code functionality, courtesy @adityacp --- yaksh/views.py | 58 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 28 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index f8af247..a93f6e0 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -4158,11 +4158,13 @@ def generate_qrcode(request, answerpaper_id, question_id, module_id): handler = QRcodeHandler.objects.get_or_create(user=user, question=question, answerpaper=answerpaper)[0] qrcode = handler.get_qrcode() - content = '{0}/exam/upload_file/{1}'.format(URL_ROOT, qrcode.short_key) + content = request.build_absolute_uri( + reverse("yaksh:upload_file", args=[qrcode.short_key]) + ) qrcode.generate_image(content) qrcode.save() return show_question(request, question, answerpaper, - course_id=answerpaper.course.id, module_id=module_id, + course_id=answerpaper.course_id, module_id=module_id, previous_question=question) @@ -4175,36 +4177,36 @@ def upload_file(request, key): context['msg'] = 'Sorry, test time up!' return render(request, 'yaksh/upload_file.html', context) if request.method == 'POST': - assignment_filename = request.FILES.getlist('assignment') - if not assignment_filename: + assign_files = [] + assignments = request.FILES + for i in range(len(assignments)): + assign_files.append(assignments[f"assignment[{i}]"]) + if not assign_files: msg = 'Please upload assignment file' context['msg'] = msg return render(request, 'yaksh/upload_file.html', context) - for fname in assignment_filename: + AssignmentUpload.objects.filter( + assignmentQuestion_id=handler.question_id, + answer_paper_id=handler.answerpaper_id + ).delete() + uploaded_files = [] + for fname in assign_files: fname._name = fname._name.replace(" ", "_") - assignment_files = AssignmentUpload.objects.filter( - assignmentQuestion=handler.question, - course_id=handler.answerpaper.course.id, - assignmentFile__icontains=fname, user=handler.user, - question_paper=handler.answerpaper.question_paper) - if assignment_files.exists(): - assign_file = assignment_files.first() - if os.path.exists(assign_file.assignmentFile.path): - os.remove(assign_file.assignmentFile.path) - assign_file.delete() - AssignmentUpload.objects.create( - user=handler.user, - assignmentQuestion=handler.question, - course_id=handler.answerpaper.course.id, assignmentFile=fname, - question_paper=handler.answerpaper.question_paper) - qrcode.set_used() - qrcode.deactivate() - qrcode.save() - context['success'] = True - msg = "File Uploaded Successfully! Reload the (test)question "\ - "page to see the uploaded file" - context['msg'] = msg - return render(request, 'yaksh/upload_file.html', context) + uploaded_files.append( + AssignmentUpload( + assignmentQuestion_id=handler.question_id, + assignmentFile=fname, + answer_paper_id=handler.answerpaper_id) + ) + AssignmentUpload.objects.bulk_create(uploaded_files) + qrcode.set_used() + qrcode.deactivate() + qrcode.save() + context['success'] = True + msg = "File Uploaded Successfully! Reload the (test)question "\ + "page to see the uploaded file" + context['msg'] = msg + return render(request, 'yaksh/upload_file.html', context) return render(request, 'yaksh/upload_file.html', context) -- cgit From 0d2046dfd7d9ce5e7da1d36b6cc26806001f49cc Mon Sep 17 00:00:00 2001 From: prathamesh Date: Wed, 24 Mar 2021 14:51:49 +0530 Subject: Add proper redirect to the QR code and check for existing active QR code. Also, the answerpaper status will be updated! --- yaksh/views.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index a93f6e0..d2aa319 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -4158,14 +4158,22 @@ def generate_qrcode(request, answerpaper_id, question_id, module_id): handler = QRcodeHandler.objects.get_or_create(user=user, question=question, answerpaper=answerpaper)[0] qrcode = handler.get_qrcode() - content = request.build_absolute_uri( - reverse("yaksh:upload_file", args=[qrcode.short_key]) + if not qrcode.is_qrcode_available(): + content = request.build_absolute_uri( + reverse("yaksh:upload_file", args=[qrcode.short_key]) + ) + qrcode.generate_image(content) + qrcode.save() + return redirect( + reverse( + 'yaksh:skip_question', + kwargs={'q_id': question_id, 'next_q': question_id, + 'attempt_num': answerpaper.attempt_number, + 'module_id': module_id, + 'questionpaper_id': answerpaper.question_paper.id, + 'course_id': answerpaper.course_id} + ) ) - qrcode.generate_image(content) - qrcode.save() - return show_question(request, question, answerpaper, - course_id=answerpaper.course_id, module_id=module_id, - previous_question=question) def upload_file(request, key): @@ -4199,6 +4207,15 @@ def upload_file(request, key): answer_paper_id=handler.answerpaper_id) ) AssignmentUpload.objects.bulk_create(uploaded_files) + user_answer = 'ASSIGNMENT UPLOADED' + new_answer = Answer( + question=handler.question, answer=user_answer, + correct=False, error=json.dumps([]) + ) + new_answer.save() + paper = handler.answerpaper + paper.answers.add(new_answer) + next_q = paper.add_completed_question(handler.question_id) qrcode.set_used() qrcode.deactivate() qrcode.save() -- cgit