From: Yoan Le Clanche Date: Thu, 6 Jan 2022 17:20:14 +0000 (+0100) Subject: Cleanup and small fixes X-Git-Tag: 2.8.1-pro~135 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=500440bb5828474be1173fbd47a1d51ce45cb062;p=teleforma.git Cleanup and small fixes --- diff --git a/app/settings.py b/app/settings.py index 216f7615..63825f73 100644 --- a/app/settings.py +++ b/app/settings.py @@ -18,7 +18,7 @@ TEMPLATE_DEBUG = DEBUG RECOVERY = True # disable to debug websocket and improve performance -DEBUG_TOOLBAR = False +DEBUG_TOOLBAR = True BASE_DIR = os.path.dirname(os.path.dirname(__file__)) @@ -185,8 +185,8 @@ INSTALLED_APPS = ( 'jsonrpc', 'sorl.thumbnail', 'django_extensions', - 'dj_pagination', 'postman', + 'dj_pagination', # 'markup_mixin', 'notes', # 'timezones', @@ -199,6 +199,7 @@ INSTALLED_APPS = ( 'multichoice', 'true_false', 'essay', + ) diff --git a/teleforma/management/commands/teleforma-message-all-seminar-users.py b/teleforma/management/commands/teleforma-message-all-seminar-users.py index c299d881..546b124b 100644 --- a/teleforma/management/commands/teleforma-message-all-seminar-users.py +++ b/teleforma/management/commands/teleforma-message-all-seminar-users.py @@ -1,20 +1,15 @@ from optparse import make_option from django.conf import settings -from django.core.management.base import BaseCommand, CommandError +from django.contrib.sites.models import Site +from django.core.management.base import BaseCommand from django.contrib.auth.models import User -from django.contrib.auth.forms import PasswordResetForm -from django.contrib.auth.tokens import default_token_generator -from django.template.defaultfilters import slugify from django.template.loader import render_to_string -from django.core.mail import send_mail, mail_admins from django.utils import translation +from postman.models import Message from teleforma.views.pro import get_seminar_delta -from teleforma.models import * -import logging import datetime -from postman.models import * -from postman.utils import email_visitor, notify_user +from postman.utils import notify_user from teleforma.context_processors import seminar_validated @@ -72,5 +67,6 @@ class Command(BaseCommand): mess.save() if not settings.DEBUG: - notify_user(mess, 'acceptance') + site = Site.objects.all()[0] + notify_user(mess, 'acceptance', site) # diff --git a/teleforma/models/core.py b/teleforma/models/core.py index 0943e50c..99f05e59 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -624,6 +624,12 @@ class Media(MediaBase): url = sorl_default.backend.get_thumbnail(self.poster_file, geometry).url return url + # TODO : return appropriate value + # probably need to store it in a field + @property + def approx_duration(self): + return Duration(seconds=100) + class Meta(MetaCore): db_table = app_label + '_' + 'media' ordering = ['rank'] diff --git a/teleforma/models/pro.py b/teleforma/models/pro.py index 0f9c618b..32a2e0ef 100644 --- a/teleforma/models/pro.py +++ b/teleforma/models/pro.py @@ -258,8 +258,8 @@ class Answer(models.Model): question = models.ForeignKey(Question, related_name="answer", verbose_name=_('question'), on_delete=models.CASCADE) answer = models.TextField(_('answer')) status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=2) - treated = models.BooleanField(_('treated')) - validated = models.BooleanField(_('validated')) + treated = models.BooleanField(_('treated'), default=False) + validated = models.BooleanField(_('validated'), default=False) date_submitted = models.DateTimeField(_('date submitted'), auto_now=True, null=True) date_validated = models.DateTimeField(_('date validated'), null=True) date_added = models.DateTimeField(_('date added'), auto_now_add=True, null=True) diff --git a/teleforma/templates/postman/base_folder.html b/teleforma/templates/postman/base_folder.html index 7426226b..d3b183c8 100644 --- a/teleforma/templates/postman/base_folder.html +++ b/teleforma/templates/postman/base_folder.html @@ -20,6 +20,7 @@ {% if pm_messages %} +
{% autopaginate pm_messages %}{% paginate %}
diff --git a/teleforma/templates/teleforma/inc/answer_list.html b/teleforma/templates/teleforma/inc/answer_list.html index 5e227a02..bd8a8e4f 100644 --- a/teleforma/templates/teleforma/inc/answer_list.html +++ b/teleforma/templates/teleforma/inc/answer_list.html @@ -1,10 +1,11 @@ {% load i18n %} -{% load teleforma_tags %} -{% load pagination_tags %} +{% load teleforma_tags pagination_tags %} -{% autopaginate object_list 8 %} +{% autopaginate object_list %} {% paginate %} +{{ object_list.count }} +
diff --git a/teleforma/templatetags/teleforma_tags.py b/teleforma/templatetags/teleforma_tags.py index 84414bc0..7d47c916 100644 --- a/teleforma/templatetags/teleforma_tags.py +++ b/teleforma/templatetags/teleforma_tags.py @@ -251,7 +251,7 @@ def quiz_validated(seminar, user): def summary(text, N): t = text[:N] if not ' ' in t: - t = text[:N/2] + t = text[:int(N/2)] return t + '...' @register.filter diff --git a/teleforma/urls.py b/teleforma/urls.py index adc4a5a0..32eaed73 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -45,13 +45,12 @@ from django.contrib.auth.views import (LoginView, LogoutView, PasswordResetView) from django.views import static from teleforma.views.core import ConferenceRecordView, ConferenceView, CourseView, HelpView, MediaTranscodedView, MediaView, join_webclass -from teleforma.views.crfpa import UserLoginView, UsersCourseView, UsersIejView, UsersTrainingView, UsersView, UsersXLSExport +from teleforma.views.crfpa import UserLoginView, UsersCourseView, UsersIejView, UsersTrainingView, UsersView from teleforma.views.pro import AnswerDetailView, AnswerDetailViewTest, AnswerView, AnswersPendingView, AnswersTreatedView, QuizQuestionView, SeminarDocumentDownloadView, SeminarDocumentView, SeminarMediaView, SeminarView, SeminarsView, TestimonialDownloadView, TestimonialKnowledgeView, TestimonialListView, TestimonialPaybackView, TestimonialView, evaluation_form_detail, webclass_bbb_webhook from teleforma.views.profile import ProfileView from teleforma.views.home import HomeView htdocs_forma = os.path.dirname(__file__) + '/static/teleforma/' -user_export = UsersXLSExport() profile_view = ProfileView() media = MediaView() home_view = HomeView() @@ -134,11 +133,11 @@ urlpatterns = [ # Questions - url(r'^desk/seminars/(?P.*)/questions/(?P.*)/$', AnswerView.as_view(), + url(r'^desk/seminars/(?P.*)/questions/(?P\d+)/$', AnswerView.as_view(), name="teleforma-question-answer"), url(r'^desk/answers_pending/$', AnswersPendingView.as_view(), name="teleforma-answers-pending"), url(r'^desk/answers_treated/$', AnswersTreatedView.as_view(), name="teleforma-answers-treated"), - url(r'^desk/answers/(?P.*)/$', AnswerDetailView.as_view(), name="teleforma-answer-detail"), + url(r'^desk/answers/(?P\d+)/$', AnswerDetailView.as_view(), name="teleforma-answer-detail"), # Evaluations url(r'^forms/', include('forms_builder.forms.urls')), @@ -165,18 +164,18 @@ urlpatterns = [ url(r'^users/(?P[A-Za-z0-9@+._-]+)/profile/$', profile_view.profile_detail, name="teleforma-profile-detail"), url(r'^users/(?P.*)/login/$', UserLoginView.as_view(), name="teleforma-user-login"), - url(r'^users/all/export/$', user_export.all, name="teleforma-users-xls-export"), + # url(r'^users/all/export/$', user_export.all, name="teleforma-users-xls-export"), url(r'^users/by_training/(\w+)/$', UsersTrainingView.as_view(), name="teleforma-training-users"), - url(r'^users/by_training/(?P.*)/export/$', user_export.by_training, - name="teleforma-training-users-export"), + # url(r'^users/by_training/(?P.*)/export/$', user_export.by_training, + # name="teleforma-training-users-export"), url(r'^users/by_iej/(\w+)/$', UsersIejView.as_view(), name="teleforma-iej-users"), - url(r'^users/by_iej/(?P.*)/export/$', user_export.by_iej, name="teleforma-iej-users-export"), + # url(r'^users/by_iej/(?P.*)/export/$', user_export.by_iej, name="teleforma-iej-users-export"), url(r'^users/by_course/(\w+)/$', UsersCourseView.as_view(), name="teleforma-course-users"), - url(r'^users/by_course/(?P.*)/export/$', user_export.by_course, - name="teleforma-course-users-export"), + # url(r'^users/by_course/(?P.*)/export/$', user_export.by_course, + # name="teleforma-course-users-export"), # CSS+Images (FIXME: for developement only) diff --git a/teleforma/views/crfpa.py b/teleforma/views/crfpa.py index 78ac0a07..6029d796 100644 --- a/teleforma/views/crfpa.py +++ b/teleforma/views/crfpa.py @@ -32,8 +32,16 @@ # # Authors: Guillaume Pellerin - -from teleforma.views.core import * +from django.contrib.auth import get_backends, login +from django.contrib.auth.decorators import login_required, permission_required +from django.contrib.auth.models import User +from django.core.paginator import InvalidPage +from django.shortcuts import redirect +from django.utils.decorators import method_decorator +from django.views.generic.base import View +from django.views.generic.list import ListView +from teleforma.models.core import Course, CourseType, NamePaginator +from teleforma.models.crfpa import IEJ, Training def format_crfpa_courses(courses, course=None, queryset=None, types=None, admin=False): @@ -41,11 +49,11 @@ def format_crfpa_courses(courses, course=None, queryset=None, types=None, admin= for c in queryset: if c and (c.code != 'X' or admin == True): courses.append({'course': c, 'types': types.all(), - 'date': c.date_modified, 'number': c.number}) + 'date': c.date_modified, 'number': c.number}) elif course: if course.code != 'X' or admin == True: courses.append({'course': course, 'types': types.all(), - 'date': course.date_modified, 'number': course.number}) + 'date': course.date_modified, 'number': course.number}) return courses @@ -61,43 +69,46 @@ def get_crfpa_courses(user, date_order=False, num_order=False): if professor: professor = user.professor.get() courses = format_crfpa_courses(courses, queryset=professor.courses.all(), - types=CourseType.objects.all()) + types=CourseType.objects.all()) elif student: student = user.student.get() - s_courses = {student.procedure:student.training.procedure, - student.written_speciality:student.training.written_speciality, - student.oral_speciality:student.training.oral_speciality, - student.oral_1:student.training.oral_1, - student.oral_2:student.training.oral_2, - student.options:student.training.options, - } + s_courses = {student.procedure: student.training.procedure, + student.written_speciality: student.training.written_speciality, + student.oral_speciality: student.training.oral_speciality, + student.oral_1: student.training.oral_1, + student.oral_2: student.training.oral_2, + student.options: student.training.options, + } for course in s_courses: courses = format_crfpa_courses(courses, course=course, - types=s_courses[course]) + types=s_courses[course]) synthesis_note = student.training.synthesis_note if synthesis_note: courses = format_crfpa_courses(courses, - queryset=Course.objects.filter(synthesis_note=True), - types=synthesis_note) + queryset=Course.objects.filter( + synthesis_note=True), + types=synthesis_note) obligation = student.training.obligation if obligation: courses = format_crfpa_courses(courses, - queryset=Course.objects.filter(obligation=True), - types=obligation) + queryset=Course.objects.filter( + obligation=True), + types=obligation) magistral = student.training.magistral if magistral: courses = format_crfpa_courses(courses, - queryset=Course.objects.filter(magistral=True), - types=magistral) + queryset=Course.objects.filter( + magistral=True), + types=magistral) elif user.is_staff or user.is_superuser: courses = format_crfpa_courses(courses, queryset=Course.objects.all(), - types=CourseType.objects, admin=True) + types=CourseType.objects, admin=True) else: courses = None @@ -112,7 +123,7 @@ def get_crfpa_courses(user, date_order=False, num_order=False): class UsersView(ListView): model = User - template_name='teleforma/users.html' + template_name = 'teleforma/users.html' context_object_name = 'users' #paginate_by = 12 @@ -124,7 +135,8 @@ class UsersView(ListView): context['trainings'] = Training.objects.all() context['iejs'] = IEJ.objects.all() context['courses'] = Course.objects.all() - paginator = NamePaginator(self.object_list, on="last_name", per_page=10) + paginator = NamePaginator( + self.object_list, on="last_name", per_page=10) try: page = int(self.request.GET.get('page', '1')) except ValueError: @@ -147,7 +159,8 @@ class UserLoginView(View): def get(self, request, id): user = User.objects.get(id=id) backend = get_backends()[0] - user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) + user.backend = "%s.%s" % ( + backend.__module__, backend.__class__.__name__) login(self.request, user) return redirect('teleforma-desk') @@ -171,6 +184,7 @@ class UsersTrainingView(UsersView): def dispatch(self, *args, **kwargs): return super(UsersTrainingView, self).dispatch(*args, **kwargs) + class UsersIejView(UsersView): def get_queryset(self): @@ -186,6 +200,7 @@ class UsersIejView(UsersView): def dispatch(self, *args, **kwargs): return super(UsersIejView, self).dispatch(*args, **kwargs) + class UsersCourseView(UsersView): def get_queryset(self): @@ -201,120 +216,9 @@ class UsersCourseView(UsersView): def dispatch(self, *args, **kwargs): return super(UsersCourseView, self).dispatch(*args, **kwargs) + def get_course_code(obj): if obj: return str(obj.code) else: return '' - -class UsersXLSExport(object): - - first_row = 2 - - def export_user(self, counter, user): - student = Student.objects.filter(user=user) - if student: - student = Student.objects.get(user=user) - row = self.sheet.row(counter + self.first_row) - row.write(0, user.last_name) - row.write(1, user.first_name) - row.write(9, user.email) - row.write(2, str(student.iej)) - code = student.training.code - if student.platform_only: - code = 'I - ' + code - row.write(3, str(code)) - row.write(4, get_course_code(student.procedure)) - row.write(5, get_course_code(student.written_speciality)) - row.write(6, get_course_code(student.oral_speciality)) - row.write(7, get_course_code(student.oral_1)) - row.write(8, get_course_code(student.oral_2)) - - profile = Profile.objects.filter(user=user) - if profile: - profile = Profile.objects.get(user=user) - row.write(10, profile.address) - row.write(11, profile.postal_code) - row.write(12, profile.city) - row.write(13, profile.telephone) - row.write(14, user.date_joined.strftime("%d/%m/%Y")) - return counter + 1 - else: - return counter - - @method_decorator(permission_required('is_staff')) - def export(self, request): - self.users = self.users.order_by('last_name') - self.book = Workbook() - self.sheet = self.book.add_sheet('Etudiants') - - row = self.sheet.row(0) - cols = [{'name':'NOM', 'width':5000}, - {'name':'PRENOM', 'width':5000}, - {'name':'IEJ', 'width':2500}, - {'name':'FORMATION', 'width':6000}, - {'name':'PROC', 'width':2500}, - {'name':'Ecrit Spe', 'width':3000}, - {'name':'Oral Spe', 'width':3000}, - {'name':'ORAL 1', 'width':3000}, - {'name':'ORAL 2', 'width':3000}, - {'name':'MAIL', 'width':7500}, - {'name':'ADRESSE', 'width':7500}, - {'name':'CP', 'width':2500}, - {'name':'VILLE', 'width':5000}, - {'name':'TEL', 'width':5000}, - {'name':"Date d'inscription", 'width':5000} - ] - i = 0 - for col in cols: - row.write(i, col['name']) - self.sheet.col(i).width = col['width'] - i += 1 - - counter = 0 - for user in self.users: - counter = self.export_user(counter, user) - response = HttpResponse(mimetype="application/vnd.ms-excel") - response['Content-Disposition'] = 'attachment; filename=users.xls' - self.book.save(response) - return response - - @method_decorator(permission_required('is_staff')) - def all(self, request): - self.users = User.objects.all() - return self.export(request) - - @method_decorator(permission_required('is_staff')) - def by_training(self, request, id): - training = Training.objects.filter(id=id) - self.users = User.objects.filter(student__training__in=training) - return self.export(request) - - @method_decorator(permission_required('is_staff')) - def by_iej(self, request, id): - iej = IEJ.objects.filter(id=id) - self.users = User.objects.filter(student__iej__in=iej) - return self.export(request) - - @method_decorator(permission_required('is_staff')) - def by_course(self, request, id): - course = Course.objects.filter(id=id) - self.users = User.objects.filter(student__training__courses__in=course) - return self.export(request) - - @method_decorator(login_required) - def profile_detail(self, request, username, template='teleforma/profile_detail.html'): - user = User.objects.get(username=username) - try: - profile = user.get_profile() - except: - profile = None - student = user.student.all() - payment = None - if student and (user.username == request.user.username or request.user.is_superuser): - student = user.student.get() - payment = student.payments.order_by('-id').all() - if payment: - payment = payment[0] - - return render(request, template, {'profile' : profile, 'usr': user, 'payment':payment})