# -*- 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
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)
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:
{% if has_add_permission %}
<div class="object-tools">
{% block object-tools-items %}
- <a href="{% url 'export-seminar-revisions' %}" class="btn">
- <i class="icon-circle-arrow-down icon-black"></i>
- Exporter le relevé des temps de connexion
- </a>
<a href="{% url cl.opts|admin_urlname:'add' %}{% if is_popup %}?_popup=1{% endif %}" class="btn btn-success">
<i class="icon-plus-sign icon-white"></i>
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
<div id="user-hours">
- {{ user_timer|hours }}
+ {{ seminar.duration|hours }}
</div>
<div id="seminar-hours">
url(r'^users/by_course/(?P<id>.*)/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<path>.*)$', 'django.views.static.serve',
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):
return super(TestimonialKnowledgeView, self).dispatch(*args, **kwargs)
+# FIFPL
class TestimonialPaybackView(TestimonialView):
template_name = 'teleforma/seminar_testimonial_payback.html'
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)