]> git.parisson.com Git - teleforma.git/commitdiff
Reintroduce quiz
authorYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 6 Dec 2022 12:42:23 +0000 (13:42 +0100)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 6 Dec 2022 12:42:23 +0000 (13:42 +0100)
app/settings.py
requirements.txt
teleforma/admin.py
teleforma/migrations/0021_course_quiz.py [new file with mode: 0644]
teleforma/models/core.py
teleforma/templates/quiz/question.html
teleforma/templates/quiz/result.html
teleforma/templates/teleforma/course_detail.html
teleforma/urls.py
teleforma/views/crfpa.py

index 97f8ef63258666175f644b7e53d3da2e33b5b12d..500ded2aa1151d94d5cf3e33fb6186748d1153d7 100644 (file)
@@ -199,6 +199,10 @@ INSTALLED_APPS = (
     'django_nvd3',
     'tinymce',
     'pdfannotator',
+    'quiz',
+    'multichoice',
+    'true_false',
+    'essay',
     'rest_framework',
     'rest_framework.authtoken',
 )
index 6ed6114c8c4b62bb847a9a4110569efc144dc83b..e07dfcf5c1b54caa087c603f7dbf129b5184f078 100644 (file)
@@ -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
+
index ac2439a4033defd0e2bf2160f0915154592a215b..ac879c77e217af670c9ad61dc371514359637964 100644 (file)
@@ -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 (file)
index 0000000..1c670d2
--- /dev/null
@@ -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'),
+        ),
+    ]
index acd643c0a2434024e91247c5c4a75c31d54fd5b4..a3100b88f79073b5998f39959b06de6a110a9ab2 100755 (executable)
@@ -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)
index 29733ebd67ba8eb25ea853fed2ad4b4d853b1b70..85e2553c40e669f532f12ff9dd2af09f65bf0b54 100644 (file)
@@ -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 %}
+<div class="desk_center">
 {% if previous.answers %}
 
   <p class="muted"><small>{% trans "The previous question" %}:</small></p>
@@ -77,6 +79,6 @@
 {% endif %}
 
 <hr>
-
+</div>
 
 {% endblock %}
index d5bb4d279be8eccc856021af8e2aa6da2611ef06..8313bbbf0c305df6bba310ee9e24a8a7bb193c13 100644 (file)
@@ -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 %}
+<div class="desk_center">
   {% if previous.answers %}
 
   <p class="muted"><small>{% trans "The previous question" %}:</small></p>
@@ -88,5 +88,5 @@
 
   {% endif %}
 
-
+</div>
 {% endblock %}
index 44793c31663670623a87746d36ccc62cbd36973f..0d33cd6cb450230ce2daede60ff1991949ce5025 100644 (file)
       {{ course.description }}{% endif %}
     </div>
 
-    {% if type.name == 'Quiz' %}
-    <div class="course_content">
-      {% if course.quiz.all %}
-      <table class="listing" width="100%">
-        <tbody>
-          {% for quiz in course.quiz.all %}
-          <td class="border-top"><a href="{% url 'quiz_start_page' slug=quiz.url %}">{{quiz.title}}</a></td>
-          <td class="border-top">{{quiz.description}}</td>
-          {% endfor %}
-        </tbody>
-      </table>
-      {% else %}
-      <p>Aucun quiz</p>
-      {% endif %}
-    </div>
-
-    {% 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 %}
 
   </div>
   {% endfor %}
     
   </div>
 
+  {% if course.quiz.all %}
+  <div class="course">
+    <div class="course_title">{{ course.title }} - Quiz</div>
+    <div class="course_content">
+      <table class="listing" width="100%">
+        <tbody>
+          {% for quiz in course.quiz.all %}
+          <td class="border-top"><a href="{% url 'teleforma-quiz' period.id quiz.url %}">{{quiz.title}}</a></td>
+          <td class="border-top">{{quiz.description}}</td>
+          {% endfor %}
+        </tbody>
+      </table>
+    </div>
+  </div>
+  {% endif %}
+
   <div class="course">
     <div class="course_title">{{ course.title }} - Corrections de copies{% if course.description %} -
       {{ course.description }}{% endif %}
index dfc2575df6b4ba0629c4a1bd0184d1dfbb21c69f..ec2bdef0f10cae6e7919c1db8b74dd42d8bb8942 100644 (file)
@@ -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<pk>.*)/view/$', document.view,
         name="teleforma-document-view"),
 
+    url(r'^desk/periods/(?P<period_id>.*)/quiz/(?P<quiz_name>[\w-]+)/$', QuizQuestionView.as_view(), name="teleforma-quiz"),
+
+
     url(r'^archives/annals/$', 
         AnnalsView.as_view(),
         name="teleforma-annals"),
index d3a9248fa6d49801bbb8a3665ab9c89a510775e4..05e779352fd0e02c6eb49eae81352f78ae77f30d 100644 (file)
@@ -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