From: Yoan Le Clanche Date: Fri, 4 Jan 2019 14:21:27 +0000 (+0100) Subject: Allow to filter revisions by date, change completion rules calculation, fix displayed... X-Git-Tag: 2.8.1-pro~200 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=c8f2f7316a9f06584952a58ae73fb184eb32f3e4;p=teleforma.git Allow to filter revisions by date, change completion rules calculation, fix displayed time on fifpl testimonial : https://trackers.pilotsystems.net/probarreau/0427 https://trackers.pilotsystems.net/probarreau/0428 https://trackers.pilotsystems.net/probarreau/0440 --- diff --git a/teleforma/admin.py b/teleforma/admin.py index afcc79e1..57c0b23a 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- +from telemeta.util.unicode import UnicodeWriter from teleforma.models import * from django.contrib import admin from django.contrib.auth.models import User from django.contrib.auth.admin import UserAdmin from longerusername.forms import UserCreationForm, UserChangeForm from django.contrib.contenttypes.generic import GenericInlineModelAdmin +from django.http import HttpResponse class ProfileInline(admin.StackedInline): model = Profile @@ -104,6 +106,59 @@ class AnswerAdmin(admin.ModelAdmin): class SeminarRevisionAdmin(admin.ModelAdmin): search_fields = ['user__username', 'seminar__title'] + date_hierarchy = 'date_modified' + + actions = ['export_seminar_revisions'] + + def export_seminar_revisions(self, request, queryset): + + def pretty_duration(delta): + seconds = delta.total_seconds() + hours = seconds // 3600 + minutes = (seconds % 3600) // 60 + seconds = seconds % 60 + duration = "%d heures %d minutes %d secondes" % (hours, minutes, seconds) + return duration + + response = HttpResponse(content_type='text/csv') + filename = "releve-revision" + response['Content-Disposition'] = 'attachment; filename="%s.csv"' % filename + + data = {} + for rev in queryset.order_by('-date'): + seminar_id = rev.seminar.id + if seminar_id not in data: + data[seminar_id] = {'title': rev.seminar.pretty_title.encode('utf-8'), 'users': {}} + + user = rev.user.email + if user not in data[seminar_id]['users']: + data[seminar_id]['users'][user] = [] + + if rev.date_modified: + data[seminar_id]['users'][user].append({'start': rev.date, 'end': rev.date_modified}) + + writer = UnicodeWriter(response, delimiter=";") + writer.writerow(["seminaire", "email", "duree total", "date debut", "date fin", "duree"]) + for seminar in data.keys(): + title = data[seminar]['title'] + users = data[seminar]['users'] + for user in users.keys(): + l = [title, user] + revs = users[user] + duration = datetime.timedelta() + for rev in revs: + diff = rev['end'] - rev['start'] if rev['end'] else datetime.timedelta() + if diff.total_seconds() < 0: + continue + l.append(str(rev['start'])) + l.append(str(rev['end'])) + l.append(pretty_duration(rev['end'] - rev['start']) if rev['end'] else 0) + duration += rev['end'] - rev['start'] if rev['end'] else datetime.timedelta() + l.insert(2, pretty_duration(duration)) + writer.writerow(l) + return response + + export_seminar_revisions.short_description = "Exporter le relevé des temps de connexion" admin.site.unregister(User) diff --git a/teleforma/context_processors.py b/teleforma/context_processors.py index 9d89bdbf..32383816 100644 --- a/teleforma/context_processors.py +++ b/teleforma/context_processors.py @@ -81,10 +81,9 @@ def seminar_progress(user, seminar, more=False): answer = Answer.objects.filter(question=question, status=3, user=user) if answer: answer = answer[0] - if answer and answer.validated and answer.treated: + if answer: progress += question.weight else: - # import pdb;pdb.set_trace() if answer and not answer.treated and not missing_step4 == '4': missing_step4 = '4.5' else: diff --git a/teleforma/templates/admin/teleforma/seminarrevision/change_list.html b/teleforma/templates/admin/teleforma/seminarrevision/change_list.html index f09bbbe4..338a81ad 100644 --- a/teleforma/templates/admin/teleforma/seminarrevision/change_list.html +++ b/teleforma/templates/admin/teleforma/seminarrevision/change_list.html @@ -63,10 +63,6 @@ {% if has_add_permission %}
{% block object-tools-items %} - -   - Exporter le relevé des temps de connexion -   {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} diff --git a/teleforma/templates/teleforma/seminar_testimonial_payback.html b/teleforma/templates/teleforma/seminar_testimonial_payback.html index e81782bd..0b331101 100644 --- a/teleforma/templates/teleforma/seminar_testimonial_payback.html +++ b/teleforma/templates/teleforma/seminar_testimonial_payback.html @@ -150,7 +150,7 @@
- {{ user_timer|hours }} + {{ seminar.duration|hours }}
diff --git a/teleforma/urls.py b/teleforma/urls.py index 58e1444e..cb065723 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -142,9 +142,6 @@ urlpatterns = patterns('', url(r'^users/by_course/(?P.*)/export/$', user_export.by_course, name="teleforma-course-users-export"), - # Seminar Revisions - url(r'^export_seminar_revisions/$', export_seminar_revisions, name="export-seminar-revisions"), - # CSS+Images (FIXME: for developement only) url(r'^teleforma/css/(?P.*)$', 'django.views.static.serve', diff --git a/teleforma/views/pro.py b/teleforma/views/pro.py index 12e0cd4d..a9c37378 100644 --- a/teleforma/views/pro.py +++ b/teleforma/views/pro.py @@ -115,55 +115,6 @@ def get_seminar_delta(user, seminar): delta = timer - datetime.timedelta(seconds=seminar.duration.as_seconds()) return delta.total_seconds() -def pretty_duration(delta): - seconds = delta.total_seconds() - hours = seconds // 3600 - minutes = (seconds % 3600) // 60 - seconds = seconds % 60 - duration = "%d heures %d minutes %d secondes" % (hours, minutes, seconds) - return duration - - -def export_seminar_revisions(request): - response = HttpResponse(content_type='text/csv') - filename = "releve-revision" - response['Content-Disposition'] = 'attachment; filename="%s.csv"' % filename - - revs = SeminarRevision.objects.all().order_by('-date') - data = {} - for rev in revs: - seminar_id = rev.seminar.id - if seminar_id not in data: - data[seminar_id] = {'title':rev.seminar.pretty_title.encode('utf-8'), 'users':{}} - - user = rev.user.email - if user not in data[seminar_id]['users']: - data[seminar_id]['users'][user] = [] - - if rev.date_modified: - data[seminar_id]['users'][user].append({'start':rev.date, 'end':rev.date_modified}) - - writer = UnicodeWriter(response, delimiter=";") - writer.writerow(["seminaire", "email", "duree total", "date debut", "date fin", "duree"]) - for seminar in data.keys(): - title = data[seminar]['title'] - users = data[seminar]['users'] - for user in users.keys(): - l = [title, user] - revs = users[user] - duration = datetime.timedelta() - for rev in revs: - diff = rev['end'] - rev['start'] if rev['end'] else datetime.timedelta() - if diff.total_seconds() < 0: - continue - l.append(str(rev['start'])) - l.append(str(rev['end'])) - l.append(pretty_duration(rev['end'] - rev['start']) if rev['end'] else 0) - duration += rev['end'] - rev['start'] if rev['end'] else datetime.timedelta() - l.insert(2, pretty_duration(duration)) - writer.writerow(l) - - return response class SeminarAccessMixin(object): @@ -874,6 +825,7 @@ class TestimonialKnowledgeView(TestimonialView): return super(TestimonialKnowledgeView, self).dispatch(*args, **kwargs) +# FIFPL class TestimonialPaybackView(TestimonialView): template_name = 'teleforma/seminar_testimonial_payback.html' @@ -885,8 +837,8 @@ class TestimonialPaybackView(TestimonialView): context['answers'] = Answer.objects.filter(question__in=seminar.question.all(), user=self.request.user, validated=True).order_by('question__rank') - user_timer = get_seminar_timer(self.request.user, seminar) - context['user_timer'] = user_timer.days * 24 + user_timer.seconds / 3600 + # user_timer = get_seminar_timer(self.request.user, seminar) + # context['user_timer'] = user_timer.days * 24 + user_timer.seconds / 3600 return context @method_decorator(login_required)