'django_nvd3',
'tinymce',
'pdfannotator',
+ 'quiz',
+ 'multichoice',
+ 'true_false',
+ 'essay',
'rest_framework',
'rest_framework.authtoken',
)
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
pymemcache==3.4.4
django-debug-toolbar==3.2.1
uvicorn[standard]==0.18.1
+
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)
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
--- /dev/null
+# 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'),
+ ),
+ ]
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
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)
-{% extends "teleforma/base.html" %}
+{% extends "teleforma/courses.html" %}
{% load i18n%}
{% load quiz_tags %}
{% 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>
{% endif %}
<hr>
-
+</div>
{% endblock %}
-{% extends "teleforma/base.html" %}
+{% extends "teleforma/courses.html" %}
{% load i18n %}
{% load quiz_tags %}
{% 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>
{% endif %}
-
+</div>
{% endblock %}
{{ 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" %}
{% 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 %}
CorrectorRegistrationPDFView,
CorrectorRegistrationPDFViewDownload,
CRFPAProfileView, NewsItemCreate, NewsItemDelete,
- NewsItemList, NewsItemUpdate, ReceiptPDFView,
+ NewsItemList, NewsItemUpdate, QuizQuestionView, ReceiptPDFView,
ReceiptPDFViewDownload, RegistrationPDFView,
RegistrationPDFViewDownload, UserAddView,
UserCompleteView, UserLoginView, UsersExportView,
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"),
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,
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
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