From 4d8556fe84116d842cb15a68a969fa7f851129fd Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Tue, 6 Dec 2022 13:42:23 +0100 Subject: [PATCH] Reintroduce quiz --- app/settings.py | 4 + requirements.txt | 2 + teleforma/admin.py | 8 ++ teleforma/migrations/0021_course_quiz.py | 19 ++++ teleforma/models/core.py | 6 +- teleforma/templates/quiz/question.html | 8 +- teleforma/templates/quiz/result.html | 8 +- .../templates/teleforma/course_detail.html | 34 ++++---- teleforma/urls.py | 5 +- teleforma/views/crfpa.py | 87 ++++++++++++++++++- 10 files changed, 151 insertions(+), 30 deletions(-) create mode 100644 teleforma/migrations/0021_course_quiz.py diff --git a/app/settings.py b/app/settings.py index 97f8ef63..500ded2a 100644 --- a/app/settings.py +++ b/app/settings.py @@ -199,6 +199,10 @@ INSTALLED_APPS = ( 'django_nvd3', 'tinymce', 'pdfannotator', + 'quiz', + 'multichoice', + 'true_false', + 'essay', 'rest_framework', 'rest_framework.authtoken', ) diff --git a/requirements.txt b/requirements.txt index 6ed6114c..e07dfcf5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,7 @@ django-nvd3==0.8.2 django-postman==4.2 django-tinymce==3.3.0 -e git+https://git.parisson.com/git/django-unique-session.git@master#egg=django-unique-session +-e git+https://github.com/pilot-systems/Django-Quiz.git@master#egg=django-quiz-app django-user-agents==0.4.0 django-recaptcha==2.0.6 jxmlease==1.0.3 @@ -35,3 +36,4 @@ daphne==3.0.2 pymemcache==3.4.4 django-debug-toolbar==3.2.1 uvicorn[standard]==0.18.1 + diff --git a/teleforma/admin.py b/teleforma/admin.py index ac2439a4..ac879c77 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -409,6 +409,7 @@ class HomeAdmin(admin.ModelAdmin): search_fields = ['periods__name', 'title', 'text'] list_display = ('title', 'enabled', 'modified_at') readonly_fields = ('modified_at',) + raw_id_fields = [ 'video',] def get_form(self, request, obj=None, **kwargs): form = super(HomeAdmin, self).get_form(request, obj, **kwargs) @@ -547,3 +548,10 @@ admin.site.register(AppointmentJury, AppointmentJuryAdmin) admin.site.register(Appointment, AppointmentAdmin) admin.site.register(ChatMessage, ChatMessageAdmin) admin.site.register(Notification, NotificationAdmin) + + +class SittingAdmin(admin.ModelAdmin): + pass + +from quiz.models import Sitting +admin.site.register(Sitting, SittingAdmin) \ No newline at end of file diff --git a/teleforma/migrations/0021_course_quiz.py b/teleforma/migrations/0021_course_quiz.py new file mode 100644 index 00000000..1c670d29 --- /dev/null +++ b/teleforma/migrations/0021_course_quiz.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-10-06 16:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('quiz', '__first__'), + ('teleforma', '0020_chatmessage_reply_to'), + ] + + operations = [ + migrations.AddField( + model_name='course', + name='quiz', + field=models.ManyToManyField(blank=True, null=True, to='quiz.Quiz', verbose_name='quiz'), + ), + ] diff --git a/teleforma/models/core.py b/teleforma/models/core.py index acd643c0..a3100b88 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -50,7 +50,7 @@ from django.forms.fields import FileField from django.template.defaultfilters import slugify from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ -# from quiz.models import Quiz +from quiz.models import Quiz from sorl.thumbnail import default as sorl_default from ..fields import ShortTextField @@ -248,8 +248,8 @@ class Course(models.Model): oral_1 = models.BooleanField(_('oral_1')) oral_2 = models.BooleanField(_('oral_2')) has_exam_scripts = models.BooleanField(_("copies d'examen"), default=True) - # quiz = models.ManyToManyField( - # Quiz, verbose_name=_('quiz'), blank=True, null=True) + quiz = models.ManyToManyField( + Quiz, verbose_name=_('quiz'), blank=True, null=True) # last professor which received a student message on automatic mode last_professor_sent = models.ForeignKey( 'Professor', blank=True, null=True, on_delete=models.SET_NULL) diff --git a/teleforma/templates/quiz/question.html b/teleforma/templates/quiz/question.html index 29733ebd..85e2553c 100644 --- a/teleforma/templates/quiz/question.html +++ b/teleforma/templates/quiz/question.html @@ -1,4 +1,4 @@ -{% extends "teleforma/base.html" %} +{% extends "teleforma/courses.html" %} {% load i18n%} {% load quiz_tags %} @@ -6,8 +6,10 @@ {% block title %} {{ quiz.title }} {% endblock %} {% block description %} {{ quiz.title }} - {{ quiz.description }} {% endblock %} -{% block content %} + +{% block course %} +
{% if previous.answers %}

{% trans "The previous question" %}:

@@ -77,6 +79,6 @@ {% endif %}
- +
{% endblock %} diff --git a/teleforma/templates/quiz/result.html b/teleforma/templates/quiz/result.html index d5bb4d27..8313bbbf 100644 --- a/teleforma/templates/quiz/result.html +++ b/teleforma/templates/quiz/result.html @@ -1,4 +1,4 @@ -{% extends "teleforma/base.html" %} +{% extends "teleforma/courses.html" %} {% load i18n %} {% load quiz_tags %} @@ -6,8 +6,8 @@ {% block title %} {{ quiz.title}} {% endblock %} {% block description %} {% trans "Exam Results for" %} {{ quiz.title }} {% endblock %} -{% block content %} - +{% block course %} +
{% if previous.answers %}

{% trans "The previous question" %}:

@@ -88,5 +88,5 @@ {% endif %} - +
{% endblock %} diff --git a/teleforma/templates/teleforma/course_detail.html b/teleforma/templates/teleforma/course_detail.html index 44793c31..0d33cd6c 100644 --- a/teleforma/templates/teleforma/course_detail.html +++ b/teleforma/templates/teleforma/course_detail.html @@ -34,23 +34,6 @@ {{ course.description }}{% endif %} - {% if type.name == 'Quiz' %} -
- {% if course.quiz.all %} - - - {% for quiz in course.quiz.all %} - - - {% endfor %} - -
{{quiz.title}}{{quiz.description}}
- {% else %} -

Aucun quiz

- {% endif %} -
- - {% else %} {% if show_media %} {% block conference %} {% include "teleforma/inc/conference_list.html" %} @@ -64,7 +47,6 @@ {% block document %} {% include "teleforma/inc/document_list.html" %} {% endblock %} - {% endif %} {% endfor %} @@ -79,6 +61,22 @@ + {% if course.quiz.all %} +
+
{{ course.title }} - Quiz
+
+ + + {% for quiz in course.quiz.all %} + + + {% endfor %} + +
{{quiz.title}}{{quiz.description}}
+
+
+ {% endif %} +
{{ course.title }} - Corrections de copies{% if course.description %} - {{ course.description }}{% endif %} diff --git a/teleforma/urls.py b/teleforma/urls.py index dfc2575d..ec2bdef0 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -61,7 +61,7 @@ from .views.crfpa import (AnnalsCourseView, AnnalsIEJView, AnnalsView, CorrectorRegistrationPDFView, CorrectorRegistrationPDFViewDownload, CRFPAProfileView, NewsItemCreate, NewsItemDelete, - NewsItemList, NewsItemUpdate, ReceiptPDFView, + NewsItemList, NewsItemUpdate, QuizQuestionView, ReceiptPDFView, ReceiptPDFViewDownload, RegistrationPDFView, RegistrationPDFViewDownload, UserAddView, UserCompleteView, UserLoginView, UsersExportView, @@ -177,6 +177,9 @@ urlpatterns = [ url(r'^desk/documents/(?P.*)/view/$', document.view, name="teleforma-document-view"), + url(r'^desk/periods/(?P.*)/quiz/(?P[\w-]+)/$', QuizQuestionView.as_view(), name="teleforma-quiz"), + + url(r'^archives/annals/$', AnnalsView.as_view(), name="teleforma-annals"), diff --git a/teleforma/views/crfpa.py b/teleforma/views/crfpa.py index d3a9248f..05e77935 100644 --- a/teleforma/views/crfpa.py +++ b/teleforma/views/crfpa.py @@ -58,6 +58,7 @@ from postman.forms import AnonymousWriteForm from postman.views import WriteView as PostmanWriteView from xlwt import Workbook from django.conf import settings +from quiz.views import QuizTake from ..decorators import access_required from ..forms import (CorrectorForm, NewsItemForm, UserForm, WriteForm, @@ -65,7 +66,7 @@ from ..forms import (CorrectorForm, NewsItemForm, UserForm, WriteForm, from ..models.core import Course, CourseType, Document, NamePaginator, Period from ..models.crfpa import (IEJ, Discount, NewsItem, Parameters, Payback, Payment, Profile, Student, Training, months_choices, payment_choices) -from ..views.core import (PDFTemplateResponseMixin, format_courses, +from ..views.core import (CourseAccessMixin, PDFTemplateResponseMixin, format_courses, get_courses, get_periods) from ..views.profile import ProfileView @@ -1156,3 +1157,87 @@ class CRFPAProfileView(ProfileView): payment = payment[0] return render(request, template, {'profile' : profile, 'usr': user, 'payment':payment}) + + +class QuizQuestionView(CourseAccessMixin, QuizTake): + + template_name = 'quiz/question.html' + + # def _init(self): + # pass + + # def get_context_data(self, **kwargs): + # context = super(QuizQuestionView, self).get_context_data(**kwargs) + # self._init() + # return context + + def get_form_kwargs(self): + kwargs = super(QuizTake, self).get_form_kwargs() + # import pdb;pdb.set_trace() + # self.sitting.get_first_question() + # print("get form kwargs") + # self.sitting.delete() + return dict(kwargs, question=self.question) + + def final_result_user(self): + + results = super().get_context_data() + results.update({ + 'quiz': self.quiz, + 'score': self.sitting.get_current_score, + 'max_score': self.sitting.get_max_score, + 'percent': self.sitting.get_percent_correct, + 'sitting': self.sitting, + # 'previous': self.previous, + }) + + self.sitting.mark_quiz_complete() + + if self.quiz.answers_at_end: + results['questions'] =\ + self.sitting.get_questions(with_answers=True) + results['incorrect_questions'] =\ + self.sitting.get_incorrect_questions + + if self.quiz.exam_paper is False: + self.sitting.delete() + + return render(self.request, 'quiz/result.html', results) + + # def final_result_user(self): + # self._init() + # user = self.get_user() + + # results = { + # 'quiz': self.quiz, + # 'score': self.sitting.get_current_score, + # 'max_score': self.sitting.get_max_score, + # 'percent': self.sitting.get_percent_correct, + # 'sitting': self.sitting, + # 'previous': self.previous, + # 'seminar': self.seminar, + # 'can_access': True + # } + + # self.sitting.mark_quiz_complete() + + # if self.quiz.answers_at_end: + # results['questions'] =\ + # self.sitting.get_questions(with_answers=True) + # results['incorrect_questions'] =\ + # self.sitting.get_incorrect_questions + + # if self.quiz.exam_paper is False: + # self.sitting.delete() + + # if self.sitting.get_percent_correct >= self.quiz.pass_mark: + # validation = QuizValidation( + # user=user, quiz=self.part.quiz, validated=True) + # validation.save() + # else: + # # revert part 1 validation + # for doc in self.part.docs_1.all(): + # doc.readers.remove(user) + # doc.save() + + # return render(self.request, 'quiz/result.html', results) \ No newline at end of file -- 2.39.5