diff --git a/certificate_images/certificate_bg.jpg b/certificate_images/certificate_bg.jpg new file mode 100644 index 000000000..3b440343b Binary files /dev/null and b/certificate_images/certificate_bg.jpg differ diff --git a/certificate_images/fossee_logo.png b/certificate_images/fossee_logo.png new file mode 100644 index 000000000..a4d7bfda2 Binary files /dev/null and b/certificate_images/fossee_logo.png differ diff --git a/requirements/requirements-common.txt b/requirements/requirements-common.txt index b9901aeec..b1133b970 100644 --- a/requirements/requirements-common.txt +++ b/requirements/requirements-common.txt @@ -18,3 +18,5 @@ django-celery-results==1.2.1 djangorestframework==3.11.0 django-cors-headers==3.1.0 Pillow +pdflatex +jinja2 \ No newline at end of file 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} diff --git a/yaksh/models.py b/yaksh/models.py index 84cad1e7e..52540fb33 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.BooleanField(default=False) def get_grade(self): return self.grade @@ -1201,6 +1202,13 @@ def set_grade(self): 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() if self.is_course_complete() and quizzes: diff --git a/yaksh/send_emails.py b/yaksh/send_emails.py index 061cb0eaf..6889959bb 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() diff --git a/yaksh/templates/yaksh/course_modules.html b/yaksh/templates/yaksh/course_modules.html index b80856224..2f1dce3bd 100644 --- a/yaksh/templates/yaksh/course_modules.html +++ b/yaksh/templates/yaksh/course_modules.html @@ -67,7 +67,7 @@ {% get_module_status user module course as module_status %} {% if module_status == "completed" %}
- View + Get Certificate
{% elif module_status == "inprogress" %}
diff --git a/yaksh/templates/yaksh/quizzes_user.html b/yaksh/templates/yaksh/quizzes_user.html index e28cb69e9..b625357dd 100644 --- a/yaksh/templates/yaksh/quizzes_user.html +++ b/yaksh/templates/yaksh/quizzes_user.html @@ -75,7 +75,11 @@

{{title}}

Request Rejected {% elif user in course.data.students.all %} - {% if course.completion_percentage > 0 %} + {% if course.completion_percentage == 100 %} + + Completed + + {% elif course.completion_percentage > 0 %} Continue @@ -168,4 +172,3 @@

{{title}}

{% endblock %} - diff --git a/yaksh/views.py b/yaksh/views.py index 01f5e4e84..c2210f2ba 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -51,10 +51,33 @@ 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 +from django.contrib import messages +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('.'))) def my_redirect(url): @@ -492,19 +515,15 @@ def special_start(request, micromanager_id=None): 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( @@ -512,7 +531,6 @@ def special_start(request, micromanager_id=None): 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, @@ -1965,7 +1983,7 @@ def grade_user(request, quiz_id=None, user_id=None, attempt_number=None, for paper in papers: for question, answers in paper.get_question_answers().items(): marks = float(request.POST.get('q%d_marks' % question.id, 0)) - answer = answers[-1]['answer'] + answer = answers[0]['answer'] answer.set_marks(marks) answer.save() paper.update_marks() @@ -3106,6 +3124,26 @@ 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) + if course.percent_completed(user, all_modules) == 100: + if course_status.first().get_certificateStatus() is False: + template = latex_jinja_env.get_template('yaksh.tex') + full_name = user.get_full_name() + document = template.render(name=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() + msg = 'Your course certificate sent to your registeres mail Id' + messages.success(request, msg) + return redirect('/') + else: + msg = 'You already recieved certificate, kindly check your mail' + messages.warning(request, msg) + return redirect('/') return my_render_to_response(request, 'yaksh/show_video.html', context)