From d59cc552f4ce9aa807fc5c65e4a7b8172bc5a69d Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:04:25 +0530 Subject: [PATCH 01/90] Added smtp values --- online_test/settings.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/online_test/settings.py b/online_test/settings.py index 3b89c28bf..286af96ef 100644 --- a/online_test/settings.py +++ b/online_test/settings.py @@ -84,11 +84,11 @@ default=os.path.join(BASE_DIR, 'db.sqlite3') ), # The following settings are not used with sqlite3: - 'USER': config('DB_USER', default=''), - 'PASSWORD': config('DB_PASSWORD', default=''), + 'USER': config('DB_USER', default='yaksh_user'), + 'PASSWORD': config('DB_PASSWORD', default='mysecretpassword'), # Empty for localhost through domain sockets or '1$ 'HOST': config('DB_HOST', default='localhost'), - 'PORT': config('DB_PORT', default=''), + 'PORT': config('DB_PORT', default='3306'), }, } @@ -122,20 +122,25 @@ STATIC_ROOT = 'yaksh/static/' + + + # Set this varable to if smtp-server is not allowing to send email. -EMAIL_USE_TLS = False +EMAIL_USE_TLS = True + +EMAIL_HOST = 'smtp.gmail.com' -EMAIL_HOST = 'your_email_host' +EMAIL_PORT = '587' -EMAIL_PORT = 'your_email_port' +EMAIL_HOST_USER = 'yakshcertificate@gmail.com' -EMAIL_HOST_USER = 'email_host_user' +EMAIL_HOST_PASSWORD = 'elite2019' -EMAIL_HOST_PASSWORD = 'email_host_password' +EMAIL_USE_SSL = False # Set EMAIL_BACKEND to 'django.core.mail.backends.smtp.EmailBackend' # in production -EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # SENDER_EMAIL, REPLY_EMAIL, PRODUCTION_URL, IS_DEVELOPMENT are used in email # verification. Set the variables accordingly to avoid errors in production From a094f02d3f3e40954260030d58be7015ef75bbe8 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:12:09 +0530 Subject: [PATCH 02/90] Created yaksh.tex for certificate --- yaksh.tex | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 yaksh.tex diff --git a/yaksh.tex b/yaksh.tex new file mode 100644 index 000000000..13f894f72 --- /dev/null +++ b/yaksh.tex @@ -0,0 +1,105 @@ + + +\documentclass[20pt, a4paper]{extarticle} + +\usepackage{extsizes} + +\usepackage[T1]{fontenc} + +\usepackage{amsmath} + +\usepackage{graphicx} + +\usepackage[margin=17mm,landscape]{geometry} + +\usepackage{times} + +\usepackage[onehalfspacing]{setspace} + +\usepackage{eso-pic} + +\usepackage{ragged2e} + +\setlength{\parindent}{0pt} + + + +\begin{document} + +\pagestyle{empty} + +\AddToShipoutPictureBG*{\includegraphics[width=\paperwidth, height=\paperheight]{certificate_images/certificate_bg.jpg}} + + + + + + + +\begin{minipage}{\linewidth} + + + +\hspace{18 cm} + +\includegraphics[scale = 0.7]{certificate_images/fossee_logo.png} + +\centering \large \bfseries + +{\Huge + +\vskip2cm \color{blue!50!black} \hspace{2cm} $\boldsymbol{\mathrm { Certificate \ Of\ Completion}}$ } + +\end{minipage} + + + +\vskip2.5cm + +\doublespacing + +\RaggedRight + +{ \normalsize + +\fontfamily{qcs}\selectfont + + + +\normalsize \emph{{\hspace{4cm} This is to certify that {\color {blue!50!black} \VAR{name} }has successfully completed a course on { \color{blue!50!black} \VAR{course}}. This course was offered by the {\color{red!50!black} FOSSEE Project, IIT Bombay,} funded by National Mission on Education through ICT, MHRD, Govt.of India. + +}}} + + + + + + + +\singlespacing + +\small + + + + + +\hspace{3 cm} + +\vskip1cm + +\begin{minipage}{0.2\linewidth} + +\centering + +\rule{5cm}{1pt}\\ + +Dr. XXXXX\\ + +\end{minipage}\hfill + + + + + +\end{document} From d50168bed6ee5533a75daf5bb22c55c47d4739cf Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:12:48 +0530 Subject: [PATCH 03/90] Rename .sampleenv to .env --- .sampleenv => .env | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .sampleenv => .env (100%) diff --git a/.sampleenv b/.env similarity index 100% rename from .sampleenv rename to .env From 2f648b78885914cf6cecfed25ebaf7e8802dee6c Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:13:40 +0530 Subject: [PATCH 04/90] Update .env --- .env | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.env b/.env index a31ec1fa0..45ff0fcb3 100644 --- a/.env +++ b/.env @@ -1,13 +1,13 @@ # Django settings SECRET_KEY=dUmMy_s3cR3t_k3y -#DB_ENGINE=mysql -#DB_NAME=yaksh -#DB_USER=root -#DB_PASSWORD=root +DB_ENGINE=mysql +DB_NAME=yaksh +DB_USER=yaksh_user +DB_PASSWORD=mysecretpassword #DB_HOST=yaksh-db -#DB_PORT=3306 +DB_PORT=3306 # Yaksh settings N_CODE_SERVERS=5 -#SERVER_POOL_PORT=53579 -#SERVER_HOST_NAME=http://yaksh-codeserver +SERVER_POOL_PORT=53579 +SERVER_HOST_NAME=http://yaksh-codeserver #SERVER_TIMEOUT=4 From 25aa575e7cd55e19819dad4f75dc6024e4bc5a1b Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:16:11 +0530 Subject: [PATCH 05/90] Created mail_certificate() --- yaksh/send_emails.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/yaksh/send_emails.py b/yaksh/send_emails.py index 061cb0eaf..1f532f082 100644 --- a/yaksh/send_emails.py +++ b/yaksh/send_emails.py @@ -11,7 +11,7 @@ # Django imports from django.utils.crypto import get_random_string from django.conf import settings -from django.core.mail import EmailMultiAlternatives, send_mail +from django.core.mail import EmailMultiAlternatives, send_mail,EmailMessage from django.core.files.storage import default_storage from django.core.files.base import ContentFile @@ -88,3 +88,12 @@ def send_bulk_mail(subject, email_body, recipients, attachments): Please contact {1}.""".format(exc_msg, settings.REPLY_EMAIL) return message +def mail_certificate(send_to): + email = EmailMessage('Certificate' , + 'Congrats!! You successfully completed the course', + settings.EMAIL_HOST_USER , + [send_to,], + ) + + email.attach_file('certificate.pdf') + email.send() From 023f7cccb9834af64d7e9c4516c9a343585b88c6 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:21:36 +0530 Subject: [PATCH 06/90] Added image certificate backgroung --- certificate_bg.jpg | Bin 0 -> 88768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 certificate_bg.jpg diff --git a/certificate_bg.jpg b/certificate_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b440343bc33769ab897d335e7b1ff75e0c19af5 GIT binary patch literal 88768 zcmeEuXIxXw-fa++DhLufM5T9WQly9q2#6Hv0ucde0@7Om1u2H!5s}_oq<4_sL3;1K zC)5Z5?#Ac%oO9m$ez^C3e9sM;>|gfY2{U`o%=)kOUz5x6%X!c(1zCAn5Ed2|=r!;M zx|{+%0byUecJ%}vIKcBd-u3G^IM)eqac|%e5fBj(5)cyJBqqCclbDp4knk48Ez;ZM zU@(}7gp!JaoQjMbOn&txSlGa4aIWKDzm89Slkg__|MlbY2Z$8!ItW(?8|xnE8Yvbw zDb{5R2m%6OT?cA=RpEa;u&x1hyn%~{Pe2HqP<9J+4GSCl8V>eVt%0*Wfa4$>((7b* z`J`{$RyD-EXG_liF+2s2@o`ZjSZx5wB=E-08=ruJl8Ty!nT3^&okLLQfv||E*psI+ zvU1Pl6<(@qXliNe=o%TDyfrm5x3G6`baHlab@Tb;>*pWv86FWC6&({B_a#0xEj=SM zD?2B*xTLhKyrQzIx~aLPwXMCQvuki@cw}^Jd}4B8acOyFb!~lP6SaSEcyxS%{&jlQ zE-VoCU(NcvW&fpJq(Hl_;oxB7;9j*0>zXrAut{;Q-{reOCasEVXnXq}|3^IX$KfeO zjrfcLYDn-Ky8!|UCcy<})K$}dx9tC{Vc!2wE&ID+|7_PJhzJ`CxOv#5ASuxK17ttE zpjOVZ`hj{Sw1L9SJ=9_bkx*KvyCzfrD$txjEaA*kW2gQ$%B11*yJmLM>Fi&N{hJcm z*vYAIHZ0BvbTD#G7M-#%70jqprn4CSOs>6`*2w#&W2wetyDVmrhk{QRXu{veSDP-| z?A$yP*-FB3+;IMJB1RYVoYE{kn|hvaXR_9=!3t(NU&q>B52+j!ayPCn{qpSY2WI8$ z6GTtar0KEF@CD)4P1nry*bBO^M3JdvZ&;-`9XHw~k4_5}6Wb}G2~L#{E%2aL1v=HaosjpLV&$IhP2( zFb|AJRa7(DKW2VP9U+l-*xVS%P zT+|RCcK`0H>LjCAL1Olb8q^~7W_8bVU;1i`DCtWKpm19deq#O~giJ%8O}=7bYUlTU z#IRPOyO?)~ZGb%Y|13C>kC@k)4_Em1!`QS^A{ge2GFsr?Yd(KoYgj1Q`I+ze4cm*( zlhyimtT>LXiQz%$7j&CPbIFg+vF0tM3kZ@#d^N;u6@H@ZMP9Ij8X9^O%9i{qMVYh@yIW%+sOzyJlOCZ)f$kT1K}$jirX&$C|-q z3s6c6Ns{5T+MzYGZ^|50JBGUt$HGH?w3An*rHAHq986Z}{bDT;uHIP7 z?(PLaIdS+8dGm{nrG5A@+QZ4AK9;v0DnK8a5j*I}Atf_X(tRO?F&3j=S@SEEACzA* zqB~J3U%_!Ca3AX>>lk|0x2-?E@+CxGuvp>X*`UG>Q;?kw@UH7T2`hH6dxOJaEN`>F zt%Rtl(D2pduxDT@0b6RFKo9Wx;ZMP8CD&Z@fzjr=>=~2|3I^)%6lT5uAX_yRIXtYO zkf4{o9c~+xD@2u7F1NsoZ{hi1jJx#Py-~%QZhyQSn#i#+@Ttd{z(u#4R-*^a?CGgs zElNCDeCSB~h2-WXD6~%dJl^ZA2j_fI^!@;f7^|z=|naYpDL&mcgd`L6Fu8 z^{gwGkptVqCwY69Akg_MrcR2RTr!TXb+I;R#`W|JM2KXEDb z>gv}A-zAmmJx!&4x{oxGE7ja~ZXpTK_4?po&a?Z?U_NKx>fqp+ zSMzMWFsdT>h=k6P3<`aweS2S)gg^p!MSe+{)Q2cHl{P�U^0y*qFr{7#tnEKXjkrU5i~ihW+9?k|Akc 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 z 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 LtJx%K{2BfiAOH~P literal 0 HcmV?d00001 From c6dff1011a30e1ff15008b9acbd7c6506beec3c5 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 19:22:35 +0530 Subject: [PATCH 07/90] Added Fossee logo --- fossee_logo.png | Bin 0 -> 12630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fossee_logo.png diff --git a/fossee_logo.png b/fossee_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d7bfda2138c0df390d4bf4e8e43efd836c2ef2 GIT binary patch literal 12630 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 Ef=l6KlmGw# literal 0 HcmV?d00001 From 42ff7159f43f2da8ac0b21b79621e8037e2a62e1 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 06:54:40 -0700 Subject: [PATCH 08/90] Update yaksh.tex --- yaksh.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yaksh.tex b/yaksh.tex index 13f894f72..896fe38f3 100644 --- a/yaksh.tex +++ b/yaksh.tex @@ -28,7 +28,7 @@ \pagestyle{empty} -\AddToShipoutPictureBG*{\includegraphics[width=\paperwidth, height=\paperheight]{certificate_images/certificate_bg.jpg}} +\AddToShipoutPictureBG*{\includegraphics[width=\paperwidth, height=\paperheight]{certificate_bg.jpg}} @@ -42,7 +42,7 @@ \hspace{18 cm} -\includegraphics[scale = 0.7]{certificate_images/fossee_logo.png} +\includegraphics[scale = 0.7]{fossee_logo.png} \centering \large \bfseries From 0efbede207bb4a48add162677a4d8d87f7d2e8a7 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 06:54:58 -0700 Subject: [PATCH 09/90] Update yaksh.tex From 9e001a95989590785695cfc81e8fbc7a5df0e0f2 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 07:00:42 -0700 Subject: [PATCH 10/90] Updated Coursestatus in views It sends the certificate to the user when the course is completed --- yaksh/views.py | 230 +++++++++++++------------------------------------ 1 file changed, 58 insertions(+), 172 deletions(-) diff --git a/yaksh/views.py b/yaksh/views.py index 01f5e4e84..fc12bb376 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1,9 +1,14 @@ import os import csv +import smtplib +import imghdr +from django.core.mail import send_mail,EmailMultiAlternatives +from email.message import EmailMessage +from django.core.mail import EmailMessage from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.contrib.auth import login, logout, authenticate from django.shortcuts import render, get_object_or_404, redirect -from django.template import Context, Template, loader +from django.template import Context, Template from django.http import Http404 from django.db.models import Max, Q, F from django.db import models @@ -23,13 +28,14 @@ import json from textwrap import dedent import zipfile -import markdown +from . import settings +from markdown import Markdown try: from StringIO import StringIO as string_io except ImportError: from io import BytesIO as string_io import re -# Local imports. + from yaksh.code_server import get_result as get_result_from_code_server from yaksh.models import ( Answer, AnswerPaper, AssignmentUpload, Course, FileUpload, FloatTestCase, @@ -37,8 +43,7 @@ QuestionPaper, QuestionSet, Quiz, Question, StandardTestCase, StdIOBasedTestCase, StringTestCase, TestCase, User, get_model_class, FIXTURES_DIR_PATH, MOD_GROUP_NAME, Lesson, LessonFile, - LearningUnit, LearningModule, CourseStatus, question_types, Post, Comment, - MicroManager + LearningUnit, LearningModule, CourseStatus, question_types, Post, Comment ) from yaksh.forms import ( UserRegisterForm, UserLoginForm, QuizForm, QuestionForm, @@ -51,11 +56,32 @@ from .settings import URL_ROOT from .file_utils import extract_files, is_csv from .send_emails import (send_user_mail, - generate_activation_key, send_bulk_mail) + generate_activation_key, send_bulk_mail,mail_certificate) from .decorators import email_verified, has_profile from .tasks import regrade_papers from notifications_plugin.models import Notification - +from django.shortcuts import render +from online_test.settings import EMAIL_HOST_USER,EMAIL_HOST_PASSWORD +from django.template.loader import get_template +from django.shortcuts import redirect +from django.http import HttpResponse +from yaksh.models import CourseStatus +from pdflatex import PDFLaTeX +import jinja2 +latex_jinja_env = jinja2.Environment( + block_start_string = '\BLOCK{' , + block_end_string = '}', + variable_start_string = '\VAR{' , + variable_end_string = '}', + comment_start_string = '\#{' , + comment_end_string = '}', + line_statement_prefix = '%-', + line_comment_prefix = '%#', + trim_blocks = True, + autoescape = False, + loader = jinja2.FileSystemLoader(os.path.abspath('.')) + ) +from django.contrib import messages def my_redirect(url): """An overridden redirect to deal with URL_ROOT-ing. See settings.py @@ -102,9 +128,7 @@ def add_as_moderator(users, group_name=MOD_GROUP_NAME): def get_html_text(md_text): """Takes markdown text and converts it to html""" - return markdown.markdown( - md_text, extensions=['tables', 'fenced_code'] - ) + return Markdown().convert(md_text) def formfield_callback(field): @@ -482,46 +506,6 @@ def user_login(request): return my_render_to_response(request, 'yaksh/login.html', context) -@login_required -@email_verified -def special_start(request, micromanager_id=None): - user = request.user - micromanager = get_object_or_404(MicroManager, pk=micromanager_id, - student=user) - course = micromanager.course - quiz = micromanager.quiz - module = course.get_learning_module(quiz) - quest_paper = get_object_or_404(QuestionPaper, quiz=quiz) - - if not course.is_enrolled(user): - msg = 'You are not enrolled in {0} course'.format(course.name) - return quizlist_user(request, msg=msg) - - if not micromanager.can_student_attempt(): - msg = 'Your special attempts are exhausted for {0}'.format( - quiz.description) - return quizlist_user(request, msg=msg) - - last_attempt = AnswerPaper.objects.get_user_last_attempt( - quest_paper, user, course.id) - - if last_attempt: - if last_attempt.is_attempt_inprogress(): - return show_question( - request, last_attempt.current_question(), last_attempt, - course_id=course.id, module_id=module.id, - previous_question=last_attempt.current_question() - ) - - attempt_num = micromanager.get_attempt_number() - ip = request.META['REMOTE_ADDR'] - new_paper = quest_paper.make_answerpaper(user, ip, attempt_num, course.id, - special=True) - micromanager.increment_attempts_utilised() - return show_question(request, new_paper.current_question(), new_paper, - course_id=course.id, module_id=module.id) - - @login_required @email_verified def start(request, questionpaper_id=None, attempt_num=None, course_id=None, @@ -684,7 +668,7 @@ def show_question(request, question, paper, error_message=None, request, msg, paper.attempt_number, paper.question_paper.id, course_id=course_id, module_id=module_id ) - if not quiz.active and not paper.is_special: + if not quiz.active: reason = 'The quiz has been deactivated!' return complete( request, reason, paper.attempt_number, paper.question_paper.id, @@ -862,7 +846,7 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None, previous_question=current_question) else: user_answer = request.POST.get('answer') - if not str(user_answer): + if not user_answer: msg = "Please submit a valid answer." return show_question( request, current_question, paper, notification=msg, @@ -1487,13 +1471,6 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): question_paper.save() question_paper.fixed_questions.add(*questions) messages.success(request, "Questions added successfully") - return redirect( - 'yaksh:designquestionpaper', - course_id=course_id, - quiz_id=quiz_id, - questionpaper_id=questionpaper_id - ) - else: messages.warning(request, "Please select atleast one question") @@ -1512,12 +1489,6 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): question_paper.save() question_paper.fixed_questions.remove(*question_ids) messages.success(request, "Questions removed successfully") - return redirect( - 'yaksh:designquestionpaper', - course_id=course_id, - quiz_id=quiz_id, - questionpaper_id=questionpaper_id - ) else: messages.warning(request, "Please select atleast one question") @@ -1532,12 +1503,6 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): random_set.questions.add(*random_ques) question_paper.random_questions.add(random_set) messages.success(request, "Questions removed successfully") - return redirect( - 'yaksh:designquestionpaper', - course_id=course_id, - quiz_id=quiz_id, - questionpaper_id=questionpaper_id - ) else: messages.warning(request, "Please select atleast one question") @@ -1546,12 +1511,6 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): if random_set_ids: question_paper.random_questions.remove(*random_set_ids) messages.success(request, "Questions removed successfully") - return redirect( - 'yaksh:designquestionpaper', - course_id=course_id, - quiz_id=quiz_id, - questionpaper_id=questionpaper_id - ) else: messages.warning(request, "Please select question set") @@ -1568,8 +1527,8 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): if questions: questions = _remove_already_present(questionpaper_id, questions) - question_paper.update_total_marks() - question_paper.save() + question_paper.update_total_marks() + question_paper.save() random_sets = question_paper.random_questions.all() fixed_questions = question_paper.get_ordered_questions() context = { @@ -1973,7 +1932,6 @@ def grade_user(request, quiz_id=None, user_id=None, attempt_number=None, 'comments_%d' % paper.question_paper.id, 'No comments') paper.save() messages.success(request, "Student data saved successfully") - course_status = CourseStatus.objects.filter( course_id=course.id, user_id=user.id) if course_status.exists(): @@ -2477,10 +2435,8 @@ def _read_user_csv(request, reader, course): messages.info(request, "{0} -- Missing Values".format(counter)) continue users = User.objects.filter(username=username) - if not users.exists(): - users = User.objects.filter(email=email) if users.exists(): - user = users.last() + user = users[0] if remove.strip().lower() == 'true': _remove_from_course(user, course) messages.info(request, "{0} -- {1} -- User rejected".format( @@ -3096,7 +3052,7 @@ def view_module(request, module_id, course_id, msg=None): " previous to {0}".format(learning_module.name) ) return course_modules(request, course_id, msg) - + learning_units = learning_module.get_learning_units() context['learning_units'] = learning_units context['learning_module'] = learning_module @@ -3106,6 +3062,24 @@ def view_module(request, module_id, course_id, msg=None): context['course'] = course context['state'] = "module" context['msg'] = msg + course_status = CourseStatus.objects.filter( + course_id=course.id, user_id=user.id) + print(user.get_full_name(), course , user.email) + #print(course_status.first().get_certificateStatus()) + if course.percent_completed(user, all_modules) == 100 and course_status.first().get_certificateStatus() == '': + template = latex_jinja_env.get_template('yaksh.tex') + document = template.render(name = user.get_full_name(), course = course) + with open('certificate.tex','w') as output: + output.write(document) + + os.system("pdflatex certificate.tex") + mail_certificate(user.email) + course_status.first().set_certificateStatus() + messages.success(request, 'Your course certificate sent to your registeres mail Id') + return redirect('/') + if course.percent_completed(user,all_modules) == 100 and course_status.first().get_certificateStatus() == 'True': + messages.warning(request, 'You have already recieved your certificate, kindly check your mail') + return redirect('/') return my_render_to_response(request, 'yaksh/show_video.html', context) @@ -3492,91 +3466,3 @@ def hide_comment(request, course_id, uuid): return redirect('yaksh:post_comments', course_id, post_uid) -@login_required -@email_verified -def allow_special_attempt(request, user_id, course_id, quiz_id): - user = request.user - - if not is_moderator(user): - raise Http404('You are not allowed to view this page') - - course = get_object_or_404(Course, pk=course_id) - if not course.is_creator(user) and not course.is_teacher(user): - raise Http404('This course does not belong to you') - - quiz = get_object_or_404(Quiz, pk=quiz_id) - student = get_object_or_404(User, pk=user_id) - - if not course.is_enrolled(student): - raise Http404('The student is not enrolled for this course') - - micromanager, created = MicroManager.objects.get_or_create( - course=course, student=student, quiz=quiz - ) - micromanager.manager = user - micromanager.save() - - if (not micromanager.is_special_attempt_required() or - micromanager.is_last_attempt_inprogress()): - name = student.get_full_name() - msg = '{} can attempt normally. No special attempt required!'.format( - name) - elif micromanager.can_student_attempt(): - msg = '{} already has a special attempt!'.format( - student.get_full_name()) - else: - micromanager.allow_special_attempt() - msg = 'A special attempt is provided to {}!'.format( - student.get_full_name()) - - messages.info(request, msg) - return my_redirect('/exam/manage/monitor/{0}/{1}/'.format(quiz_id, - course_id)) - - -@login_required -@email_verified -def revoke_special_attempt(request, micromanager_id): - user = request.user - - if not is_moderator(user): - raise Http404('You are not allowed to view this page') - - micromanager = get_object_or_404(MicroManager, pk=micromanager_id) - course = micromanager.course - if not course.is_creator(user) and not course.is_teacher(user): - raise Http404('This course does not belong to you') - micromanager.revoke_special_attempt() - msg = 'Revoked special attempt for {}'.format( - micromanager.student.get_full_name()) - messages.info(request, msg) - return my_redirect('/exam/manage/monitor/{0}/{1}/'.format( - micromanager.quiz.id, course.id)) - - -@login_required -@email_verified -def extend_time(request, paper_id): - user = request.user - - if not is_moderator(user): - raise Http404('You are not allowed to view this page') - - anspaper = get_object_or_404(AnswerPaper, pk=paper_id) - course = anspaper.course - if not course.is_creator(user) and not course.is_teacher(user): - raise Http404('This course does not belong to you') - - if request.method == "POST": - extra_time = request.POST.get('extra_time', None) - if extra_time is None: - msg = 'Please provide time' - else: - anspaper.set_extra_time(extra_time) - msg = 'Extra {0} minutes given to {1}'.format( - extra_time, anspaper.user.get_full_name()) - else: - msg = 'Bad Request' - messages.info(request, msg) - return my_redirect('/exam/manage/monitor/{0}/{1}/'.format( - anspaper.question_paper.quiz.id, course.id)) From 57dcf542b5b7362bafc718e4880ed3a7e958528c Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 07:30:19 -0700 Subject: [PATCH 11/90] Updated view_module in views --- yaksh/views.py | 209 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 193 insertions(+), 16 deletions(-) diff --git a/yaksh/views.py b/yaksh/views.py index fc12bb376..10e9304ae 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1,14 +1,9 @@ import os import csv -import smtplib -import imghdr -from django.core.mail import send_mail,EmailMultiAlternatives -from email.message import EmailMessage -from django.core.mail import EmailMessage from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.contrib.auth import login, logout, authenticate from django.shortcuts import render, get_object_or_404, redirect -from django.template import Context, Template +from django.template import Context, Template, loader from django.http import Http404 from django.db.models import Max, Q, F from django.db import models @@ -28,14 +23,13 @@ import json from textwrap import dedent import zipfile -from . import settings -from markdown import Markdown +import markdown try: from StringIO import StringIO as string_io except ImportError: from io import BytesIO as string_io import re - +# Local imports. from yaksh.code_server import get_result as get_result_from_code_server from yaksh.models import ( Answer, AnswerPaper, AssignmentUpload, Course, FileUpload, FloatTestCase, @@ -43,7 +37,8 @@ QuestionPaper, QuestionSet, Quiz, Question, StandardTestCase, StdIOBasedTestCase, StringTestCase, TestCase, User, get_model_class, FIXTURES_DIR_PATH, MOD_GROUP_NAME, Lesson, LessonFile, - LearningUnit, LearningModule, CourseStatus, question_types, Post, Comment + LearningUnit, LearningModule, CourseStatus, question_types, Post, Comment, + MicroManager ) from yaksh.forms import ( UserRegisterForm, UserLoginForm, QuizForm, QuestionForm, @@ -128,7 +123,9 @@ def add_as_moderator(users, group_name=MOD_GROUP_NAME): def get_html_text(md_text): """Takes markdown text and converts it to html""" - return Markdown().convert(md_text) + return markdown.markdown( + md_text, extensions=['tables', 'fenced_code'] + ) def formfield_callback(field): @@ -506,6 +503,46 @@ def user_login(request): return my_render_to_response(request, 'yaksh/login.html', context) +@login_required +@email_verified +def special_start(request, micromanager_id=None): + user = request.user + micromanager = get_object_or_404(MicroManager, pk=micromanager_id, + student=user) + course = micromanager.course + quiz = micromanager.quiz + module = course.get_learning_module(quiz) + quest_paper = get_object_or_404(QuestionPaper, quiz=quiz) + + if not course.is_enrolled(user): + msg = 'You are not enrolled in {0} course'.format(course.name) + return quizlist_user(request, msg=msg) + + if not micromanager.can_student_attempt(): + msg = 'Your special attempts are exhausted for {0}'.format( + quiz.description) + return quizlist_user(request, msg=msg) + + last_attempt = AnswerPaper.objects.get_user_last_attempt( + quest_paper, user, course.id) + + if last_attempt: + if last_attempt.is_attempt_inprogress(): + return show_question( + request, last_attempt.current_question(), last_attempt, + course_id=course.id, module_id=module.id, + previous_question=last_attempt.current_question() + ) + + attempt_num = micromanager.get_attempt_number() + ip = request.META['REMOTE_ADDR'] + new_paper = quest_paper.make_answerpaper(user, ip, attempt_num, course.id, + special=True) + micromanager.increment_attempts_utilised() + return show_question(request, new_paper.current_question(), new_paper, + course_id=course.id, module_id=module.id) + + @login_required @email_verified def start(request, questionpaper_id=None, attempt_num=None, course_id=None, @@ -668,7 +705,7 @@ def show_question(request, question, paper, error_message=None, request, msg, paper.attempt_number, paper.question_paper.id, course_id=course_id, module_id=module_id ) - if not quiz.active: + if not quiz.active and not paper.is_special: reason = 'The quiz has been deactivated!' return complete( request, reason, paper.attempt_number, paper.question_paper.id, @@ -846,7 +883,7 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None, previous_question=current_question) else: user_answer = request.POST.get('answer') - if not user_answer: + if not str(user_answer): msg = "Please submit a valid answer." return show_question( request, current_question, paper, notification=msg, @@ -1471,6 +1508,13 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): question_paper.save() question_paper.fixed_questions.add(*questions) messages.success(request, "Questions added successfully") + return redirect( + 'yaksh:designquestionpaper', + course_id=course_id, + quiz_id=quiz_id, + questionpaper_id=questionpaper_id + ) + else: messages.warning(request, "Please select atleast one question") @@ -1489,6 +1533,12 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): question_paper.save() question_paper.fixed_questions.remove(*question_ids) messages.success(request, "Questions removed successfully") + return redirect( + 'yaksh:designquestionpaper', + course_id=course_id, + quiz_id=quiz_id, + questionpaper_id=questionpaper_id + ) else: messages.warning(request, "Please select atleast one question") @@ -1503,6 +1553,12 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): random_set.questions.add(*random_ques) question_paper.random_questions.add(random_set) messages.success(request, "Questions removed successfully") + return redirect( + 'yaksh:designquestionpaper', + course_id=course_id, + quiz_id=quiz_id, + questionpaper_id=questionpaper_id + ) else: messages.warning(request, "Please select atleast one question") @@ -1511,6 +1567,12 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): if random_set_ids: question_paper.random_questions.remove(*random_set_ids) messages.success(request, "Questions removed successfully") + return redirect( + 'yaksh:designquestionpaper', + course_id=course_id, + quiz_id=quiz_id, + questionpaper_id=questionpaper_id + ) else: messages.warning(request, "Please select question set") @@ -1527,8 +1589,8 @@ def design_questionpaper(request, course_id, quiz_id, questionpaper_id=None): if questions: questions = _remove_already_present(questionpaper_id, questions) - question_paper.update_total_marks() - question_paper.save() + question_paper.update_total_marks() + question_paper.save() random_sets = question_paper.random_questions.all() fixed_questions = question_paper.get_ordered_questions() context = { @@ -1932,6 +1994,7 @@ def grade_user(request, quiz_id=None, user_id=None, attempt_number=None, 'comments_%d' % paper.question_paper.id, 'No comments') paper.save() messages.success(request, "Student data saved successfully") + course_status = CourseStatus.objects.filter( course_id=course.id, user_id=user.id) if course_status.exists(): @@ -2435,8 +2498,10 @@ def _read_user_csv(request, reader, course): messages.info(request, "{0} -- Missing Values".format(counter)) continue users = User.objects.filter(username=username) + if not users.exists(): + users = User.objects.filter(email=email) if users.exists(): - user = users[0] + user = users.last() if remove.strip().lower() == 'true': _remove_from_course(user, course) messages.info(request, "{0} -- {1} -- User rejected".format( @@ -3083,6 +3148,9 @@ def view_module(request, module_id, course_id, msg=None): return my_render_to_response(request, 'yaksh/show_video.html', context) + + + @login_required @email_verified def course_modules(request, course_id, msg=None): @@ -3466,3 +3534,112 @@ def hide_comment(request, course_id, uuid): return redirect('yaksh:post_comments', course_id, post_uid) +@login_required +@email_verified +def allow_special_attempt(request, user_id, course_id, quiz_id): + user = request.user + + if not is_moderator(user): + raise Http404('You are not allowed to view this page') + + course = get_object_or_404(Course, pk=course_id) + if not course.is_creator(user) and not course.is_teacher(user): + raise Http404('This course does not belong to you') + + quiz = get_object_or_404(Quiz, pk=quiz_id) + student = get_object_or_404(User, pk=user_id) + + if not course.is_enrolled(student): + raise Http404('The student is not enrolled for this course') + + micromanager, created = MicroManager.objects.get_or_create( + course=course, student=student, quiz=quiz + ) + micromanager.manager = user + micromanager.save() + + if (not micromanager.is_special_attempt_required() or + micromanager.is_last_attempt_inprogress()): + name = student.get_full_name() + msg = '{} can attempt normally. No special attempt required!'.format( + name) + elif micromanager.can_student_attempt(): + msg = '{} already has a special attempt!'.format( + student.get_full_name()) + else: + micromanager.allow_special_attempt() + msg = 'A special attempt is provided to {}!'.format( + student.get_full_name()) + + messages.info(request, msg) + return my_redirect('/exam/manage/monitor/{0}/{1}/'.format(quiz_id, + course_id)) + + +@login_required +@email_verified +def revoke_special_attempt(request, micromanager_id): + user = request.user + + if not is_moderator(user): + raise Http404('You are not allowed to view this page') + + micromanager = get_object_or_404(MicroManager, pk=micromanager_id) + course = micromanager.course + if not course.is_creator(user) and not course.is_teacher(user): + raise Http404('This course does not belong to you') + micromanager.revoke_special_attempt() + msg = 'Revoked special attempt for {}'.format( + micromanager.student.get_full_name()) + messages.info(request, msg) + return my_redirect('/exam/manage/monitor/{0}/{1}/'.format( + micromanager.quiz.id, course.id)) + + +@login_required +@email_verified +def extend_time(request, paper_id): + user = request.user + + if not is_moderator(user): + raise Http404('You are not allowed to view this page') + + anspaper = get_object_or_404(AnswerPaper, pk=paper_id) + course = anspaper.course + if not course.is_creator(user) and not course.is_teacher(user): + raise Http404('This course does not belong to you') + + if request.method == "POST": + extra_time = request.POST.get('extra_time', None) + if extra_time is None: + msg = 'Please provide time' + else: + anspaper.set_extra_time(extra_time) + msg = 'Extra {0} minutes given to {1}'.format( + extra_time, anspaper.user.get_full_name()) + else: + msg = 'Bad Request' + messages.info(request, msg) + return my_redirect('/exam/manage/monitor/{0}/{1}/'.format( + anspaper.question_paper.quiz.id, course.id)) + + + + + + + + + + + + + + + + + + + + + From 06e794934023fcb46f244c28d8bed2139179a1e5 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 07:41:52 -0700 Subject: [PATCH 12/90] Created column certificate in courseStatus Table Created get_certificateStatus and set_certificateStatus helps to know about the certificate status --- yaksh/models.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/yaksh/models.py b/yaksh/models.py index 84cad1e7e..64c9f97d1 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1184,6 +1184,7 @@ class CourseStatus(models.Model): grade = models.CharField(max_length=255, null=True, blank=True) percentage = models.FloatField(default=0.0) percent_completed = models.IntegerField(default=0) + certificate = models.CharField(max_length=255) def get_grade(self): return self.grade @@ -1200,6 +1201,13 @@ def set_grade(self): grade = grading_system.get_grade(self.percentage) self.grade = grade self.save() + def get_certificateStatus(self): + return self.certificate + + def set_certificateStatus(self): + self.certificate = True + self.save() + def calculate_percentage(self): quizzes = self.course.get_quizzes() From 9cb5d28f6fdab51f83d8a12f4b2b001fe7f008d6 Mon Sep 17 00:00:00 2001 From: WISE-ELITE-2K18 <71124262+WISE-ELITE-2K18@users.noreply.github.com> Date: Sun, 13 Sep 2020 07:46:21 -0700 Subject: [PATCH 13/90] Update course_modules.html --- yaksh/templates/yaksh/course_modules.html | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/yaksh/templates/yaksh/course_modules.html b/yaksh/templates/yaksh/course_modules.html index b80856224..bbe89d139 100644 --- a/yaksh/templates/yaksh/course_modules.html +++ b/yaksh/templates/yaksh/course_modules.html @@ -7,14 +7,14 @@

- {% if course.view_grade %} +
- Grade: {% if grade %} {{ grade }} {% else %} Will be available once the course is complete {% endif %} + Grade: {% if grade %} {{grade}} {% else %} Will be available once the course is complete {% endif %}
- {% endif %} + {% if msg %}