From fe8f18ff78db31085f7264d6b10377241b26ad0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Thu, 22 Dec 2016 02:00:10 +0100 Subject: [PATCH 001/213] Utilise django_custommail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - On installe le package depuis le dépôt COF-Geek - On supprime tous les fichiers texte des mails - On charge dans la bdd les mails nécessaires au fonctionnement de GestioCOF - On supprime le modèle CustomMail obsolète de gestioncof --- bda/models.py | 179 ++++++++---------- bda/templates/bda/mails/buy-shotgun.txt | 6 - bda/templates/bda/mails/rappel.txt | 23 --- bda/templates/bda/mails/revente-loser.txt | 9 - bda/templates/bda/mails/revente-new.txt | 13 -- bda/templates/bda/mails/revente-seller.txt | 7 - bda/templates/bda/mails/revente-winner.txt | 7 - bda/templates/bda/mails/revente.txt | 12 -- bda/templates/bda/mails/shotgun.txt | 11 -- bda/views.py | 65 +++---- cof/settings_dev.py | 1 + gestioncof/admin.py | 7 +- gestioncof/models.py | 16 -- gestioncof/petits_cours_views.py | 26 +-- gestioncof/shared.py | 17 +- .../templates/petits-cours-mail-demandeur.txt | 17 -- .../templates/petits-cours-mail-eleve.txt | 28 --- gestioncof/views.py | 16 +- requirements.txt | 3 +- 19 files changed, 147 insertions(+), 316 deletions(-) delete mode 100644 bda/templates/bda/mails/buy-shotgun.txt delete mode 100644 bda/templates/bda/mails/rappel.txt delete mode 100644 bda/templates/bda/mails/revente-loser.txt delete mode 100644 bda/templates/bda/mails/revente-new.txt delete mode 100644 bda/templates/bda/mails/revente-seller.txt delete mode 100644 bda/templates/bda/mails/revente-winner.txt delete mode 100644 bda/templates/bda/mails/revente.txt delete mode 100644 bda/templates/bda/mails/shotgun.txt delete mode 100644 gestioncof/templates/petits-cours-mail-demandeur.txt delete mode 100644 gestioncof/templates/petits-cours-mail-eleve.txt diff --git a/bda/models.py b/bda/models.py index 85c7fa4d..b2dc1145 100644 --- a/bda/models.py +++ b/bda/models.py @@ -7,12 +7,11 @@ from __future__ import unicode_literals import calendar import random from datetime import timedelta +from custommail.utils import send_custom_mail, send_mass_custom_mail from django.contrib.sites.models import Site from django.db import models from django.contrib.auth.models import User -from django.template import loader -from django.core import mail from django.conf import settings from django.utils import timezone, formats from django.utils.encoding import python_2_unicode_compatible @@ -100,27 +99,24 @@ class Spectacle(models.Model): if member.id in members: members[member.id][1] = 2 else: - members[member.id] = [member.first_name, 1, member.email] - # Pour le BdA - members[0] = ['BdA', 1, 'bda@ens.fr'] - members[-1] = ['BdA', 2, 'bda@ens.fr'] + members[member.id] = [member, 1] + # FIXME : faire quelque chose de ça, un utilisateur bda_generic ? + # # Pour le BdA + # members[0] = ['BdA', 1, 'bda@ens.fr'] + # members[-1] = ['BdA', 2, 'bda@ens.fr'] # On écrit un mail personnalisé à chaque participant - mails_to_send = [] - mail_object = str(self) - for member in members.values(): - mail_body = loader.render_to_string('bda/mails/rappel.txt', { - 'name': member[0], - 'nb_attr': member[1], - 'show': self}) - mail_tot = mail.EmailMessage( - mail_object, mail_body, - settings.MAIL_DATA['rappels']['FROM'], [member[2]], - [], headers={ - 'Reply-To': settings.MAIL_DATA['rappels']['REPLYTO']}) - mails_to_send.append(mail_tot) - # On envoie les mails - connection = mail.get_connection() - connection.send_messages(mails_to_send) + mails_data = [ + ( + member[0].email, + {'member': member[0],'nb_attr': member[1], 'show': self} + ) + for member in members.values() + ] + send_mass_custom_mail( + 'bda-rappel', + mails_data, + from_email=settings.MAIL_DATA['rappels']['FROM'] + ) # On enregistre le fait que l'envoi a bien eu lieu self.rappel_sent = timezone.now() self.save() @@ -263,26 +259,28 @@ class SpectacleRevente(models.Model): verbose_name = "Revente" def send_notif(self): + """ + Envoie une notification pour indiquer la mise en vente d'une place sur + BdA-Revente à tous les intéressés. + """ inscrits = self.attribution.spectacle.subscribed.select_related('user') - - mails_to_send = [] - mail_object = "%s" % (self.attribution.spectacle) - for participant in inscrits: - mail_body = loader.render_to_string('bda/mails/revente.txt', { - 'user': participant.user, - 'spectacle': self.attribution.spectacle, - 'revente': self, - 'domain': Site.objects.get_current().domain}) - mail_tot = mail.EmailMessage( - mail_object, mail_body, - settings.MAIL_DATA['revente']['FROM'], - [participant.user.email], - [], headers={ - 'Reply-To': settings.MAIL_DATA['revente']['REPLYTO']}) - mails_to_send.append(mail_tot) - - connection = mail.get_connection() - connection.send_messages(mails_to_send) + mails_data = [ + ( + participant.user.email, + { + 'member': participant.user, + 'show': self.attribution.spectacle, + 'revente': self, + 'site': Site.objects.get_current() + } + ) + for participant in inscrits + ] + send_mass_custom_mail( + "bda-revente", + mails_data, + from_email=settings.MAIL_DATA['revente']['FROM'], + ) self.notif_sent = True self.save() @@ -292,25 +290,22 @@ class SpectacleRevente(models.Model): leur indiquer qu'il est désormais disponible au shotgun. """ inscrits = self.attribution.spectacle.subscribed.select_related('user') - - mails_to_send = [] - mail_object = "%s" % (self.attribution.spectacle) - for participant in inscrits: - mail_body = loader.render_to_string('bda/mails/shotgun.txt', { - 'user': participant.user, - 'spectacle': self.attribution.spectacle, - 'domain': Site.objects.get_current(), - 'mail': self.attribution.participant.user.email}) - mail_tot = mail.EmailMessage( - mail_object, mail_body, - settings.MAIL_DATA['revente']['FROM'], - [participant.user.email], - [], headers={ - 'Reply-To': settings.MAIL_DATA['revente']['REPLYTO']}) - mails_to_send.append(mail_tot) - - connection = mail.get_connection() - connection.send_messages(mails_to_send) + mails_data = [ + ( + participant.user.email, + { + 'member': participant.user, + 'show': self.attribution.spectacle, + 'site': Site.objects.get_current(), + } + ) + for participant in inscrits + ] + send_mass_custom_mail( + "bda-shotgun", + mails_data, + from_email=settings.MAIL_DATA['revente']['FROM'] + ) self.notif_sent = True self.save() @@ -325,51 +320,43 @@ class SpectacleRevente(models.Model): seller = self.seller if inscrits: - mails = [] - mail_subject = "BdA-Revente : {:s}".format(spectacle.title) - # Envoie un mail au gagnant et au vendeur winner = random.choice(inscrits) self.soldTo = winner context = { 'acheteur': winner.user, 'vendeur': seller.user, - 'spectacle': spectacle, + 'show': spectacle, } - mails.append(mail.EmailMessage( - mail_subject, - loader.render_to_string('bda/mails/revente-winner.txt', - context), - from_email=settings.MAIL_DATA['revente']['FROM'], - to=[winner.user.email], - reply_to=[seller.user.email], - )) - mails.append(mail.EmailMessage( - mail_subject, - loader.render_to_string('bda/mails/revente-seller.txt', - context), - from_email=settings.MAIL_DATA['revente']['FROM'], - to=[seller.user.email], - reply_to=[winner.user.email], - )) + send_custom_mail( + winner.user.email, + 'bda-revente-winner', + context=context, + from_email=settings.MAIL_DATA['revente']['FROM'] + ) + send_custom_mail( + seller.user.email, + 'bda-revente-seller', + context=context, + from_email=settings.MAIL_DATA['revente']['FROM'] + ) # Envoie un mail aux perdants - for inscrit in inscrits: - if inscrit == winner: - continue - - mail_body = loader.render_to_string( - 'bda/mails/revente-loser.txt', - {'acheteur': inscrit.user, - 'vendeur': seller.user, - 'spectacle': spectacle} + mails_data = [ + ( + inscrit.user.email, + { + 'acheteur': inscrit.user, + 'vendeur': seller.user, + 'show': spectacle + } ) - mails.append(mail.EmailMessage( - mail_subject, mail_body, - from_email=settings.MAIL_DATA['revente']['FROM'], - to=[inscrit.user.email], - reply_to=[settings.MAIL_DATA['revente']['REPLYTO']], - )) - mail.get_connection().send_messages(mails) + for inscrit in inscrits if inscrit == winner + ] + send_mass_custom_mail( + 'bda-revente-loser', + mails_data, + from_email=settings.MAIL_DATA['revente']['FROM'] + ) self.tirage_done = True self.save() diff --git a/bda/templates/bda/mails/buy-shotgun.txt b/bda/templates/bda/mails/buy-shotgun.txt deleted file mode 100644 index d7855143..00000000 --- a/bda/templates/bda/mails/buy-shotgun.txt +++ /dev/null @@ -1,6 +0,0 @@ -Bonjour {{ vendeur.first_name }} ! - -Je souhaiterais racheter ta place pour {{ spectacle.title }} le {{ spectacle.date }} ({{ spectacle.location }}) à {{ spectacle.price|floatformat:2 }}€. -Contacte-moi si tu es toujours intéressé·e ! - -{{ acheteur.get_full_name }} ({{ acheteur.email }}) diff --git a/bda/templates/bda/mails/rappel.txt b/bda/templates/bda/mails/rappel.txt deleted file mode 100644 index c6433f8a..00000000 --- a/bda/templates/bda/mails/rappel.txt +++ /dev/null @@ -1,23 +0,0 @@ -Bonjour {{ name }}, - -Nous te rappellons que tu as eu la chance d'obtenir {{ nb_attr|pluralize:"une place,deux places" }} -pour {{ show.title }}, le {{ show.date }} au {{ show.location }}. N'oublie pas de t'y rendre ! -{% if nb_attr == 2 %} -Tu as obtenu deux places pour ce spectacle. Nous te rappelons que -ces places sont strictement réservées aux personnes de moins de 28 ans. -{% endif %} -{% if show.listing %}Pour ce spectacle, tu as reçu des places sur -listing. Il te faudra donc te rendre 15 minutes en avance sur les lieux de la représentation -pour retirer {{ nb_attr|pluralize:"ta place,tes places" }}. -{% else %}Pour assister à ce spectacle, tu dois présenter les billets qui ont -été distribués au burô. -{% endif %} - -Si tu ne peux plus assister à cette représentation, tu peux -revendre ta place via BdA-revente, accessible directement sur -GestioCOF (lien "revendre une place du premier tirage" sur la page -d'accueil https://www.cof.ens.fr/gestion/). - -En te souhaitant un excellent spectacle, - -Le Bureau des Arts diff --git a/bda/templates/bda/mails/revente-loser.txt b/bda/templates/bda/mails/revente-loser.txt deleted file mode 100644 index 6b50944d..00000000 --- a/bda/templates/bda/mails/revente-loser.txt +++ /dev/null @@ -1,9 +0,0 @@ -Bonjour {{ acheteur.first_name }}, - -Tu t'étais inscrit-e pour la revente de la place de {{ vendeur.get_full_name }} -pour {{ spectacle.title }}. -Malheureusement, une autre personne a été tirée au sort pour racheter la place. -Tu pourras certainement retenter ta chance pour une autre revente ! - -À très bientôt, -Le Bureau des Arts diff --git a/bda/templates/bda/mails/revente-new.txt b/bda/templates/bda/mails/revente-new.txt deleted file mode 100644 index ffba3083..00000000 --- a/bda/templates/bda/mails/revente-new.txt +++ /dev/null @@ -1,13 +0,0 @@ -Bonjour {{ vendeur.first_name }}, - -Tu t’es bien inscrit-e pour la revente de {{ spectacle.title }}. - -{% with revente.expiration_time as time %} -Le tirage au sort entre tout-e-s les racheteuse-eur-s potentiel-le-s aura lieu -le {{ time|date:"DATE_FORMAT" }} à {{ time|time:"TIME_FORMAT" }} (dans {{time|timeuntil }}). -Si personne ne s’est inscrit pour racheter la place, celle-ci apparaitra parmi -les « Places disponibles immédiatement à la revente » sur GestioCOF. -{% endwith %} - -Bonne revente ! -Le Bureau des Arts diff --git a/bda/templates/bda/mails/revente-seller.txt b/bda/templates/bda/mails/revente-seller.txt deleted file mode 100644 index ec99b98b..00000000 --- a/bda/templates/bda/mails/revente-seller.txt +++ /dev/null @@ -1,7 +0,0 @@ -Bonjour {{ vendeur.first_name }}, - -La personne tirée au sort pour racheter ta place pour {{ spectacle.title }} est {{ acheteur.get_full_name }}. -Tu peux le/la contacter à l'adresse {{ acheteur.email }}, ou en répondant à ce mail. - -Chaleureusement, -Le BdA diff --git a/bda/templates/bda/mails/revente-winner.txt b/bda/templates/bda/mails/revente-winner.txt deleted file mode 100644 index 01ecfb86..00000000 --- a/bda/templates/bda/mails/revente-winner.txt +++ /dev/null @@ -1,7 +0,0 @@ -Bonjour {{ acheteur.first_name }}, - -Tu as été tiré-e au sort pour racheter une place pour {{ spectacle.title }} le {{ spectacle.date }} ({{ spectacle.location }}) à {{ spectacle.price|floatformat:2 }}€. -Tu peux contacter le/la vendeur-se à l'adresse {{ vendeur.email }}, ou en répondant à ce mail. - -Chaleureusement, -Le BdA diff --git a/bda/templates/bda/mails/revente.txt b/bda/templates/bda/mails/revente.txt deleted file mode 100644 index 397a58d8..00000000 --- a/bda/templates/bda/mails/revente.txt +++ /dev/null @@ -1,12 +0,0 @@ -Bonjour {{ user.first_name }} - -Une place pour le spectacle {{ spectacle.title }} ({{ spectacle.date }}) -a été postée sur BdA-Revente. - -Si ce spectacle t'intéresse toujours, merci de nous le signaler en cliquant -sur ce lien : http://{{ domain }}{% url "bda-revente-interested" revente.id %}. -Dans le cas où plusieurs personnes seraient intéressées, nous procèderons à -un tirage au sort le {{ revente.expiration_time_str }}. - -Chaleureusement, -Le BdA diff --git a/bda/templates/bda/mails/shotgun.txt b/bda/templates/bda/mails/shotgun.txt deleted file mode 100644 index 69bc704c..00000000 --- a/bda/templates/bda/mails/shotgun.txt +++ /dev/null @@ -1,11 +0,0 @@ -Bonjour {{ user.first_name }} - -Une place pour le spectacle {{ spectacle.title }} ({{ spectacle.date }}) -a été postée sur BdA-Revente. - -Puisque ce spectacle a lieu dans moins de 24h, il n'y a pas de tirage au sort pour -cette place : elle est disponible immédiatement à l'adresse -http://{{ domain }}{% url "bda-buy-revente" spectacle.id %}, à la disposition de tous. - -Chaleureusement, -Le BdA diff --git a/bda/views.py b/bda/views.py index 72fd5dd2..a0767c67 100644 --- a/bda/views.py +++ b/bda/views.py @@ -5,19 +5,19 @@ from __future__ import print_function from __future__ import unicode_literals import random +from custommail.utils import send_mass_custom_mail, send_custom_mail from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from django.db import models, transaction from django.db.models import Count, Q -from django.core import serializers, mail +from django.core import serializers from django.forms.models import inlineformset_factory from django.http import HttpResponseBadRequest, HttpResponseRedirect from django.core.urlresolvers import reverse from django.conf import settings import hashlib -from django.core.mail import send_mail from django.template import loader from django.utils import timezone from django.views.generic.list import ListView @@ -275,7 +275,7 @@ def revente(request, tirage_id): resellform = ResellForm(participant, request.POST, prefix='resell') annulform = AnnulForm(participant, prefix='annul') if resellform.is_valid(): - mails = [] + mails_data = [] attributions = resellform.cleaned_data["attributions"] with transaction.atomic(): for attribution in attributions: @@ -285,20 +285,18 @@ def revente(request, tirage_id): if not created: revente.seller = participant revente.date = timezone.now() - mail_subject = "BdA-Revente : {:s}".format(attribution.spectacle.title) - mail_body = loader.render_to_string('bda/mails/revente-new.txt', { + context = { 'vendeur': participant.user, - 'spectacle': attribution.spectacle, - 'revente': revente, - }) - mails.append(mail.EmailMessage( - mail_subject, mail_body, - from_email=settings.MAIL_DATA['revente']['FROM'], - to=[participant.user.email], - reply_to=[settings.MAIL_DATA['revente']['REPLYTO']], - )) + 'show': attribution.spectacle, + 'revente': revente + } + mails_data.append(participant.user.email, context) revente.save() - mail.get_connection().send_messages(mails) + send_mass_custom_mail( + 'bda-revente-new', + mails_data, + from_email=settings.MAIL_DATA['revente']['FROM'] + ) elif 'annul' in request.POST: annulform = AnnulForm(participant, request.POST, prefix='annul') @@ -453,15 +451,17 @@ def buy_revente(request, spectacle_id): revente = random.choice(reventes_shotgun) revente.soldTo = participant revente.save() - mail = loader.render_to_string('bda/mails/buy-shotgun.txt', { - 'spectacle': spectacle, + context = { + 'show': spectacle, 'acheteur': request.user, - 'vendeur': revente.seller.user, - }) - send_mail("BdA-Revente : %s" % spectacle.title, mail, - request.user.email, - [revente.seller.user.email], - fail_silently=False) + 'vendeur': revente.seller.user + } + send_custom_mail( + revente.seller.user.email, + 'bda-buy-shotgun', + context=context, + from_email='bda@ens.fr' + ) return render(request, "bda-success.html", {"seller": revente.attribution.participant.user, "spectacle": spectacle}) @@ -548,15 +548,16 @@ def unpaid(request, tirage_id): def send_rappel(request, spectacle_id): show = get_object_or_404(Spectacle, id=spectacle_id) # Mails d'exemples - fake_member = request.user - fake_member.nb_attr = 1 - exemple_mail_1place = loader.render_to_string('bda/mails/rappel.txt', { - 'member': fake_member, - 'show': show}) - fake_member.nb_attr = 2 - exemple_mail_2places = loader.render_to_string('bda/mails/rappel.txt', { - 'member': fake_member, - 'show': show}) + exemple_mail_1place = render_mail('bda-rappel', { + 'member': request.user, + 'show': show, + 'nb_attr': 1 + }) + exemple_mail_2place = render_mail('bda-rappel', { + 'member': request.user, + 'show': show, + 'nb_attr': 2 + }) # Contexte ctxt = {'show': show, 'exemple_mail_1place': exemple_mail_1place, diff --git a/cof/settings_dev.py b/cof/settings_dev.py index 610ae549..50027803 100644 --- a/cof/settings_dev.py +++ b/cof/settings_dev.py @@ -50,6 +50,7 @@ INSTALLED_APPS = ( 'kfet', 'channels', 'widget_tweaks', + 'custommail', ) MIDDLEWARE_CLASSES = ( diff --git a/gestioncof/admin.py b/gestioncof/admin.py index eb8ad6c0..a177c26c 100644 --- a/gestioncof/admin.py +++ b/gestioncof/admin.py @@ -8,7 +8,7 @@ from django import forms from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from gestioncof.models import SurveyQuestionAnswer, SurveyQuestion, \ - CofProfile, EventOption, EventOptionChoice, Event, Club, CustomMail, \ + CofProfile, EventOption, EventOptionChoice, Event, Club, \ Survey, EventCommentField, EventRegistration from gestioncof.petits_cours_models import PetitCoursDemande, \ PetitCoursSubject, PetitCoursAbility, PetitCoursAttribution, \ @@ -267,10 +267,6 @@ class PetitCoursDemandeAdmin(admin.ModelAdmin): search_fields = ('name', 'email', 'phone', 'lieu', 'remarques') -class CustomMailAdmin(admin.ModelAdmin): - search_fields = ('shortname', 'title') - - class ClubAdminForm(forms.ModelForm): def clean(self): cleaned_data = super(ClubAdminForm, self).clean() @@ -297,7 +293,6 @@ admin.site.unregister(User) admin.site.register(User, UserProfileAdmin) admin.site.register(CofProfile) admin.site.register(Club, ClubAdmin) -admin.site.register(CustomMail) admin.site.register(PetitCoursSubject) admin.site.register(PetitCoursAbility, PetitCoursAbilityAdmin) admin.site.register(PetitCoursAttribution, PetitCoursAttributionAdmin) diff --git a/gestioncof/models.py b/gestioncof/models.py index 19590aff..bafb9518 100644 --- a/gestioncof/models.py +++ b/gestioncof/models.py @@ -96,22 +96,6 @@ class Club(models.Model): return self.name -@python_2_unicode_compatible -class CustomMail(models.Model): - shortname = models.SlugField(max_length=50, blank=False) - title = models.CharField("Titre", max_length=200, blank=False) - content = models.TextField("Contenu", blank=False) - comments = models.TextField("Informations contextuelles sur le mail", - blank=True) - - class Meta: - verbose_name = "Mail personnalisable" - verbose_name_plural = "Mails personnalisables" - - def __str__(self): - return "%s: %s" % (self.shortname, self.title) - - @python_2_unicode_compatible class Event(models.Model): title = models.CharField("Titre", max_length=200) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 303cec2c..9474a087 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -4,9 +4,9 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals +from custommail.utils import send_custom_mail, render_mail + from django.shortcuts import render, get_object_or_404, redirect -from django.core import mail -from django.core.mail import EmailMessage from django.forms import ModelForm from django import forms from django.forms.models import inlineformset_factory, BaseInlineFormSet @@ -131,7 +131,7 @@ def _finalize_traitement(request, demande, proposals, proposed_for, proposed_for = proposed_for.items() attribdata = list(attribdata.items()) proposed_mails = _generate_eleve_email(demande, proposed_for) - mainmail = loader.render_to_string("petits-cours-mail-demandeur.txt", { + mainmail = render_mail("petits-cours-mail-demandeur", { "proposals": proposals, "unsatisfied": unsatisfied, "extra": @@ -155,14 +155,16 @@ def _finalize_traitement(request, demande, proposals, proposed_for, def _generate_eleve_email(demande, proposed_for): - proposed_mails = [] - for user, matieres in proposed_for: - msg = loader.render_to_string("petits-cours-mail-eleve.txt", { - "demande": demande, - "matieres": matieres - }) - proposed_mails.append((user, msg)) - return proposed_mails + return [ + ( + user, + render_mail('petit-cours-mail-eleve', { + "demande": demande, + "matieres": matieres + })[1] + ) + for user, matieres in proposed_for + ] def _traitement_other_preparing(request, demande): @@ -274,7 +276,7 @@ def _traitement_post(request, demande): proposals_list = proposals.items() proposed_for = proposed_for.items() proposed_mails = _generate_eleve_email(demande, proposed_for) - mainmail = loader.render_to_string("petits-cours-mail-demandeur.txt", { + mainmail = render_mail("petits-cours-mail-demandeur", { "proposals": proposals_list, "unsatisfied": unsatisfied, "extra": extra, diff --git a/gestioncof/shared.py b/gestioncof/shared.py index 8fe17d43..988b93ee 100644 --- a/gestioncof/shared.py +++ b/gestioncof/shared.py @@ -14,7 +14,7 @@ from django.db import connection from django.core.mail import send_mail from django.template import Template, Context -from gestioncof.models import CofProfile, CustomMail +from gestioncof.models import CofProfile User = get_user_model() @@ -99,18 +99,3 @@ def unlock_tables(*models): return row unlock_table = unlock_tables - - -def send_custom_mail(to, shortname, context=None, from_email="cof@ens.fr"): - if context is None: - context = {} - if isinstance(to, DjangoUser): - context["nom"] = to.get_full_name() - context["prenom"] = to.first_name - to = to.email - mail = CustomMail.objects.get(shortname=shortname) - template = Template(mail.content) - message = template.render(Context(context)) - send_mail(mail.title, message, - from_email, [to], - fail_silently=True) diff --git a/gestioncof/templates/petits-cours-mail-demandeur.txt b/gestioncof/templates/petits-cours-mail-demandeur.txt deleted file mode 100644 index 8c20834e..00000000 --- a/gestioncof/templates/petits-cours-mail-demandeur.txt +++ /dev/null @@ -1,17 +0,0 @@ -Bonjour, - -Je vous contacte au sujet de votre annonce passée sur le site du COF pour rentrer en contact avec un élève normalien pour des cours particuliers. Voici les coordonnées d'élèves qui sont motivés par de tels cours et correspondent aux critères que vous nous aviez transmis : - -{% for matiere, proposed in proposals %}¤ {{ matiere }} :{% for user in proposed %} - ¤ {{ user.get_full_name }}{% if user.profile.phone %}, {{ user.profile.phone }}{% endif %}{% if user.email %}, {{ user.email }}{% endif %}{% endfor %} - -{% endfor %}{% if unsatisfied %}Nous n'avons cependant pas pu trouver d'élève disponible pour des cours de {% for matiere in unsatisfied %}{% if forloop.counter0 > 0 %}, {% endif %}{{ matiere }}{% endfor %}. - -{% endif %}Si pour une raison ou une autre ces numéros ne suffisaient pas, n'hésitez pas à répondre à cet e-mail et je vous en ferai parvenir d'autres sans problème. -{% if extra|length > 0 %} -{{ extra|safe }} -{% endif %} -Cordialement, - --- -Le COF, BdE de l'ENS diff --git a/gestioncof/templates/petits-cours-mail-eleve.txt b/gestioncof/templates/petits-cours-mail-eleve.txt deleted file mode 100644 index f75fb33f..00000000 --- a/gestioncof/templates/petits-cours-mail-eleve.txt +++ /dev/null @@ -1,28 +0,0 @@ -Salut, - -Le COF a reçu une demande de petit cours qui te correspond. Tu es en haut de la liste d'attente donc on a transmis tes coordonnées, ainsi que celles de 2 autres qui correspondaient aussi (c'est la vie, on donne les numéros 3 par 3 pour que ce soit plus souple). Voici quelques infos sur l'annonce en question : - -¤ Nom : {{ demande.name }} - -¤ Période : {{ demande.quand }} - -¤ Fréquence : {{ demande.freq }} - -¤ Lieu (si préféré) : {{ demande.lieu }} - -¤ Niveau : {{ demande.get_niveau_display }} - -¤ Remarques diverses (désolé pour les balises HTML) : {{ demande.remarques }} - -{% if matieres|length > 1 %}¤ Matières : -{% for matiere in matieres %} ¤ {{ matiere }} -{% endfor %}{% else %}¤ Matière : {% for matiere in matieres %}{{ matiere }} -{% endfor %}{% endif %} -Voilà, cette personne te contactera peut-être sous peu, tu pourras voir les détails directement avec elle (prix, modalités, ...). Pour indication, 30 Euro/h semble être la moyenne. - -Si tu te rends compte qu'en fait tu ne peux pas/plus donner de cours en ce moment, ça serait cool que tu décoches la case "Recevoir des propositions de petits cours" sur GestioCOF. Ensuite dès que tu voudras réapparaître tu pourras recocher la case et tu seras à nouveau sur la liste. - -À bientôt, - --- -Le COF, pour les petits cours diff --git a/gestioncof/views.py b/gestioncof/views.py index 3bc8c2f9..e086b06c 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -8,6 +8,7 @@ import unicodecsv import uuid from datetime import timedelta from icalendar import Calendar, Event as Vevent +from custommail.utils import send_custom_mail from django.shortcuts import redirect, get_object_or_404, render from django.http import Http404, HttpResponse, HttpResponseForbidden @@ -24,7 +25,6 @@ from gestioncof.models import Event, EventRegistration, EventOption, \ EventOptionChoice from gestioncof.models import EventCommentField, EventCommentValue, \ CalendarSubscription -from gestioncof.shared import send_custom_mail from gestioncof.models import CofProfile, Clipper, Club from gestioncof.decorators import buro_required, cof_required from gestioncof.forms import UserProfileForm, EventStatusFilterForm, \ @@ -438,7 +438,11 @@ def registration(request): # Enregistrement du profil profile = profile_form.save() if profile.is_cof and not was_cof: - send_custom_mail(member, "bienvenue") + send_custom_mail( + member.email, "welcome", + context={'member': member}, + from_email='cof@ens.fr' + ) # Enregistrement des inscriptions aux événements for form in event_formset: if 'status' not in form.cleaned_data: @@ -470,8 +474,12 @@ def registration(request): registration=current_registration).content except EventCommentValue.DoesNotExist: comments = field.default - send_custom_mail(member, "mega", - {"remarques": comments}) + # FIXME : il faut faire quelque chose de propre ici, + # par exemple écrire un mail générique pour + # l'inscription aux événements et/ou donner la + # possibilité d'associer un mail aux événements + # send_custom_mail(member, "mega", + # {"remarques": comments}) # Enregistrement des inscriptions aux clubs member.clubs.clear() for club in clubs_form.cleaned_data['clubs']: diff --git a/requirements.txt b/requirements.txt index f7f6deca..d0d53283 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,7 +14,8 @@ django-bootstrap-form==3.2.1 asgiref==0.14.0 daphne==0.14.3 asgi-redis==0.14.0 -git+https://github.com/Aureplop/channels.git#egg=channel statistics==1.0.3.5 future==0.15.2 django-widget-tweaks==1.4.1 +git+https://github.com/Aureplop/channels.git#egg=channel +git+https://git.eleves.ens.fr/cof-geek/django_custommail.git#egg=django_custommail From 5f29caec3c5906cb35960fa6cb4838ed04434152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Thu, 22 Dec 2016 12:28:03 +0100 Subject: [PATCH 002/213] cleanup --- bda/forms.py | 1 - bda/models.py | 6 +-- bda/views.py | 67 ++++++++++++++++---------------- gestioncof/petits_cours_views.py | 33 +++++++--------- gestioncof/shared.py | 9 ++--- gestioncof/views.py | 30 +++++++------- 6 files changed, 67 insertions(+), 79 deletions(-) diff --git a/bda/forms.py b/bda/forms.py index 352914e4..e2a1961b 100644 --- a/bda/forms.py +++ b/bda/forms.py @@ -8,7 +8,6 @@ from datetime import timedelta from django import forms from django.forms.models import BaseInlineFormSet -from django.db.models import Q from django.utils import timezone from bda.models import Attribution, Spectacle diff --git a/bda/models.py b/bda/models.py index f67807c7..27c57d21 100644 --- a/bda/models.py +++ b/bda/models.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import calendar import random from datetime import timedelta @@ -108,7 +104,7 @@ class Spectacle(models.Model): mails_data = [ ( member[0].email, - {'member': member[0],'nb_attr': member[1], 'show': self} + {'member': member[0], 'nb_attr': member[1], 'show': self} ) for member in members.values() ] diff --git a/bda/views.py b/bda/views.py index 24b83c86..5355a45b 100644 --- a/bda/views.py +++ b/bda/views.py @@ -5,7 +5,13 @@ from __future__ import print_function from __future__ import unicode_literals import random -from custommail.utils import send_mass_custom_mail, send_custom_mail +import hashlib +import time +from datetime import timedelta + +from custommail.utils import ( + send_mass_custom_mail, send_custom_mail, render_mail +) from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required @@ -16,15 +22,10 @@ from django.forms.models import inlineformset_factory from django.http import HttpResponseBadRequest, HttpResponseRedirect from django.core.urlresolvers import reverse from django.conf import settings -import hashlib -from django.template import loader from django.utils import timezone from django.views.generic.list import ListView -import time -from datetime import timedelta - from gestioncof.decorators import cof_required, buro_required from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\ Tirage, SpectacleRevente @@ -230,8 +231,8 @@ def do_tirage(request, tirage_id): # À partir d'ici, le tirage devient effectif Attribution.objects.filter(spectacle__tirage=tirage_elt).delete() tirage_elt.tokens += "%s\n\"\"\"%s\"\"\"\n" % ( - timezone.now().strftime("%y-%m-%d %H:%M:%S"), - form.cleaned_data['token']) + timezone.now().strftime("%y-%m-%d %H:%M:%S"), + form.cleaned_data['token']) tirage_elt.enable_do_tirage = False tirage_elt.save() Attribution.objects.bulk_create([ @@ -354,15 +355,15 @@ def revente(request, tirage_id): annulform = AnnulForm(participant, prefix='annul') overdue = participant.attribution_set.filter( - spectacle__date__gte=timezone.now(), - revente__isnull=False, - revente__seller=participant, - revente__date__lte=timezone.now()-timedelta(hours=1)).filter( + spectacle__date__gte=timezone.now(), + revente__isnull=False, + revente__seller=participant, + revente__date__lte=timezone.now()-timedelta(hours=1)).filter( Q(revente__soldTo__isnull=True) | Q(revente__soldTo=participant)) sold = participant.attribution_set.filter( - spectacle__date__gte=timezone.now(), - revente__isnull=False, - revente__soldTo__isnull=False) + spectacle__date__gte=timezone.now(), + revente__isnull=False, + revente__soldTo__isnull=False) return render(request, "bda-revente.html", {'tirage': tirage, 'overdue': overdue, "sold": sold, @@ -372,7 +373,7 @@ def revente(request, tirage_id): @login_required def revente_interested(request, revente_id): revente = get_object_or_404(SpectacleRevente, id=revente_id) - participant, created = Participant.objects.get_or_create( + participant, _ = Participant.objects.get_or_create( user=request.user, tirage=revente.attribution.spectacle.tirage) if (timezone.now() < revente.date + timedelta(hours=1)) or revente.shotgun: return render(request, "bda-wrongtime.html", @@ -387,8 +388,8 @@ def revente_interested(request, revente_id): @login_required def list_revente(request, tirage_id): tirage = get_object_or_404(Tirage, id=tirage_id) - participant, created = Participant.objects.get_or_create( - user=request.user, tirage=tirage) + participant, _ = Participant.objects.get_or_create( + user=request.user, tirage=tirage) deja_revente = False success = False inscrit_revente = False @@ -400,7 +401,7 @@ def list_revente(request, tirage_id): participant.save() for spectacle in choices: qset = SpectacleRevente.objects.filter( - attribution__spectacle=spectacle) + attribution__spectacle=spectacle) if qset.filter(shotgun=True, soldTo__isnull=True).exists(): # Une place est disponible au shotgun, on suggère à # l'utilisateur d'aller la récupérer @@ -422,24 +423,24 @@ def list_revente(request, tirage_id): success = True else: form = InscriptionReventeForm( - tirage, - initial={'spectacles': participant.choicesrevente.all()}) + tirage, + initial={'spectacles': participant.choicesrevente.all()}) return render(request, "liste-reventes.html", {"form": form, - "deja_revente": deja_revente, "success": success, - "inscrit_revente": inscrit_revente}) + "deja_revente": deja_revente, "success": success, + "inscrit_revente": inscrit_revente}) @login_required def buy_revente(request, spectacle_id): spectacle = get_object_or_404(Spectacle, id=spectacle_id) tirage = spectacle.tirage - participant, created = Participant.objects.get_or_create( - user=request.user, tirage=tirage) + participant, _ = Participant.objects.get_or_create( + user=request.user, tirage=tirage) reventes = SpectacleRevente.objects.filter( - attribution__spectacle=spectacle, - soldTo__isnull=True) + attribution__spectacle=spectacle, + soldTo__isnull=True) # Si l'utilisateur veut racheter une place qu'il est en train de revendre, # on supprime la revente en question. @@ -482,13 +483,13 @@ def buy_revente(request, spectacle_id): def revente_shotgun(request, tirage_id): tirage = get_object_or_404(Tirage, id=tirage_id) spectacles = tirage.spectacle_set.filter( - date__gte=timezone.now()) + date__gte=timezone.now()) shotgun = [] for spectacle in spectacles: reventes = SpectacleRevente.objects.filter( - attribution__spectacle=spectacle, - shotgun=True, - soldTo__isnull=True) + attribution__spectacle=spectacle, + shotgun=True, + soldTo__isnull=True) if reventes.exists(): shotgun.append(spectacle) @@ -557,7 +558,7 @@ def send_rappel(request, spectacle_id): 'show': show, 'nb_attr': 1 }) - exemple_mail_2place = render_mail('bda-rappel', { + exemple_mail_2places = render_mail('bda-rappel', { 'member': request.user, 'show': show, 'nb_attr': 2 @@ -589,5 +590,5 @@ def descriptions_spectacles(request, tirage_id): shows_qs = shows_qs.filter(location__id=int(location_id)) except ValueError: return HttpResponseBadRequest( - "La variable GET 'location' doit contenir un entier") + "La variable GET 'location' doit contenir un entier") return render(request, 'descriptions.html', {'shows': shows_qs.all()}) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 9474a087..e42ed6ae 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -1,12 +1,14 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from datetime import datetime +import base64 +import json -from custommail.utils import send_custom_mail, render_mail +from custommail.utils import render_mail +from captcha.fields import ReCaptchaField from django.shortcuts import render, get_object_or_404, redirect +from django.core import mail from django.forms import ModelForm from django import forms from django.forms.models import inlineformset_factory, BaseInlineFormSet @@ -14,7 +16,6 @@ from django.contrib.auth.models import User from django.views.generic import ListView from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt -from django.template import loader from django.conf import settings from django.contrib.auth.decorators import login_required from django.db.models import Min @@ -26,12 +27,6 @@ from gestioncof.petits_cours_models import PetitCoursDemande, \ from gestioncof.decorators import buro_required from gestioncof.shared import lock_table, unlock_tables -from captcha.fields import ReCaptchaField - -from datetime import datetime -import base64 -import json - class DemandeListView(ListView): model = PetitCoursDemande @@ -148,7 +143,7 @@ def _finalize_traitement(request, demande, proposals, proposed_for, "mainmail": mainmail, "attribdata": base64.b64encode(json.dumps(attribdata) - .encode('utf_8')), + .encode('utf_8')), "redo": redo, "errors": errors, }) @@ -286,14 +281,14 @@ def _traitement_post(request, demande): replyto = settings.MAIL_DATA['petits_cours']['REPLYTO'] mails_to_send = [] for (user, msg) in proposed_mails: - msg = EmailMessage("Petits cours ENS par le COF", msg, - frommail, [user.email], - [bccaddress], headers={'Reply-To': replyto}) + msg = mail.EmailMessage("Petits cours ENS par le COF", msg, + frommail, [user.email], + [bccaddress], headers={'Reply-To': replyto}) mails_to_send.append(msg) - mails_to_send.append(EmailMessage("Cours particuliers ENS", mainmail, - frommail, [demande.email], - [bccaddress], - headers={'Reply-To': replyto})) + mails_to_send.append(mail.EmailMessage("Cours particuliers ENS", mainmail, + frommail, [demande.email], + [bccaddress], + headers={'Reply-To': replyto})) connection = mail.get_connection(fail_silently=True) connection.send_messages(mails_to_send) lock_table(PetitCoursAttributionCounter, PetitCoursAttribution, User) diff --git a/gestioncof/shared.py b/gestioncof/shared.py index 988b93ee..63aceae5 100644 --- a/gestioncof/shared.py +++ b/gestioncof/shared.py @@ -9,10 +9,7 @@ from django.conf import settings from django_cas_ng.backends import CASBackend from django_cas_ng.utils import get_cas_client from django.contrib.auth import get_user_model -from django.contrib.auth.models import User as DjangoUser from django.db import connection -from django.core.mail import send_mail -from django.template import Template, Context from gestioncof.models import CofProfile @@ -73,9 +70,9 @@ class COFCASBackend(CASBackend): def context_processor(request): '''Append extra data to the context of the given request''' data = { - "user": request.user, - "site": Site.objects.get_current(), - } + "user": request.user, + "site": Site.objects.get_current(), + } return data diff --git a/gestioncof/views.py b/gestioncof/views.py index e086b06c..62f55cc6 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -465,21 +465,21 @@ def registration(request): current_registration.paid = \ (form.cleaned_data['status'] == 'paid') current_registration.save() - if form.event.title == "Mega 15" and created_reg: - field = EventCommentField.objects.get( - event=form.event, name="Commentaires") - try: - comments = EventCommentValue.objects.get( - commentfield=field, - registration=current_registration).content - except EventCommentValue.DoesNotExist: - comments = field.default - # FIXME : il faut faire quelque chose de propre ici, - # par exemple écrire un mail générique pour - # l'inscription aux événements et/ou donner la - # possibilité d'associer un mail aux événements - # send_custom_mail(member, "mega", - # {"remarques": comments}) + # if form.event.title == "Mega 15" and created_reg: + # field = EventCommentField.objects.get( + # event=form.event, name="Commentaires") + # try: + # comments = EventCommentValue.objects.get( + # commentfield=field, + # registration=current_registration).content + # except EventCommentValue.DoesNotExist: + # comments = field.default + # FIXME : il faut faire quelque chose de propre ici, + # par exemple écrire un mail générique pour + # l'inscription aux événements et/ou donner la + # possibilité d'associer un mail aux événements + # send_custom_mail(member, "mega", + # {"remarques": comments}) # Enregistrement des inscriptions aux clubs member.clubs.clear() for club in clubs_form.cleaned_data['clubs']: From 298015285a5e4681658b9a9cfce18f0eb359035e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Thu, 22 Dec 2016 12:28:03 +0100 Subject: [PATCH 003/213] cleanup et nouvelle implem de custommail --- bda/forms.py | 1 - bda/models.py | 102 +++++++++++++------------------ bda/views.py | 85 +++++++++++++------------- gestioncof/petits_cours_views.py | 40 ++++++------ gestioncof/shared.py | 9 +-- gestioncof/views.py | 33 +++++----- 6 files changed, 120 insertions(+), 150 deletions(-) diff --git a/bda/forms.py b/bda/forms.py index 352914e4..e2a1961b 100644 --- a/bda/forms.py +++ b/bda/forms.py @@ -8,7 +8,6 @@ from datetime import timedelta from django import forms from django.forms.models import BaseInlineFormSet -from django.db.models import Q from django.utils import timezone from bda.models import Attribution, Spectacle diff --git a/bda/models.py b/bda/models.py index f67807c7..a14585ee 100644 --- a/bda/models.py +++ b/bda/models.py @@ -1,13 +1,9 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import calendar import random from datetime import timedelta -from custommail.utils import send_custom_mail, send_mass_custom_mail +from custommail.shortcuts import send_custom_mail, send_mass_custom_mail from django.contrib.sites.models import Site from django.db import models @@ -105,18 +101,14 @@ class Spectacle(models.Model): # members[0] = ['BdA', 1, 'bda@ens.fr'] # members[-1] = ['BdA', 2, 'bda@ens.fr'] # On écrit un mail personnalisé à chaque participant - mails_data = [ - ( - member[0].email, - {'member': member[0],'nb_attr': member[1], 'show': self} - ) + datatuple = [( + 'bda-rappel', + {'member': member[0], 'nb_attr': member[1], 'show': self}, + settings.MAIL_DATA['rappels']['FROM'], + [member[0].email]) for member in members.values() ] - send_mass_custom_mail( - 'bda-rappel', - mails_data, - from_email=settings.MAIL_DATA['rappels']['FROM'] - ) + send_mass_custom_mail(datatuple) # On enregistre le fait que l'envoi a bien eu lieu self.rappel_sent = timezone.now() self.save() @@ -252,23 +244,19 @@ class SpectacleRevente(models.Model): BdA-Revente à tous les intéressés. """ inscrits = self.attribution.spectacle.subscribed.select_related('user') - mails_data = [ - ( - participant.user.email, - { - 'member': participant.user, - 'show': self.attribution.spectacle, - 'revente': self, - 'site': Site.objects.get_current() - } - ) + datatuple = [( + 'bda-revente', + { + 'member': participant.user, + 'show': self.attribution.spectacle, + 'revente': self, + 'site': Site.objects.get_current() + }, + settings.MAIL_DATA['revente']['FROM'], + [participant.user.email]) for participant in inscrits ] - send_mass_custom_mail( - "bda-revente", - mails_data, - from_email=settings.MAIL_DATA['revente']['FROM'], - ) + send_mass_custom_mail(datatuple) self.notif_sent = True self.save() @@ -278,22 +266,18 @@ class SpectacleRevente(models.Model): leur indiquer qu'il est désormais disponible au shotgun. """ inscrits = self.attribution.spectacle.subscribed.select_related('user') - mails_data = [ - ( - participant.user.email, - { - 'member': participant.user, - 'show': self.attribution.spectacle, - 'site': Site.objects.get_current(), - } - ) + datatuple = [( + 'bda-shotgun', + { + 'member': participant.user, + 'show': self.attribution.spectacle, + 'site': Site.objects.get_current(), + }, + settings.MAIL_DATA['revente']['FROM'], + [participant.user.email]) for participant in inscrits ] - send_mass_custom_mail( - "bda-shotgun", - mails_data, - from_email=settings.MAIL_DATA['revente']['FROM'] - ) + send_mass_custom_mail(datatuple) self.notif_sent = True # Flag inutile, sauf si l'horloge interne merde self.tirage_done = True @@ -320,35 +304,31 @@ class SpectacleRevente(models.Model): 'show': spectacle, } send_custom_mail( - winner.user.email, 'bda-revente-winner', + [winner.user.email], context=context, from_email=settings.MAIL_DATA['revente']['FROM'] ) send_custom_mail( - seller.user.email, 'bda-revente-seller', + [seller.user.email], context=context, from_email=settings.MAIL_DATA['revente']['FROM'] ) # Envoie un mail aux perdants - mails_data = [ - ( - inscrit.user.email, - { - 'acheteur': inscrit.user, - 'vendeur': seller.user, - 'show': spectacle - } - ) - for inscrit in inscrits if inscrit == winner - ] - send_mass_custom_mail( + datatuple = [( 'bda-revente-loser', - mails_data, - from_email=settings.MAIL_DATA['revente']['FROM'] - ) + { + 'acheteur': inscrit.user, + 'vendeur': seller.user, + 'show': spectacle + }, + settings.MAIL_DATA['revente']['FROM'], + [inscrit.user.email]) + for inscrit in inscrits if inscrit != winner + ] + send_mass_custom_mail(datatuple) # Si personne ne veut de la place, elle part au shotgun else: self.shotgun = True diff --git a/bda/views.py b/bda/views.py index 24b83c86..4f0d717d 100644 --- a/bda/views.py +++ b/bda/views.py @@ -5,7 +5,13 @@ from __future__ import print_function from __future__ import unicode_literals import random -from custommail.utils import send_mass_custom_mail, send_custom_mail +import hashlib +import time +from datetime import timedelta + +from custommail.shortcuts import ( + send_mass_custom_mail, send_custom_mail, render_custom_mail +) from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required @@ -16,15 +22,10 @@ from django.forms.models import inlineformset_factory from django.http import HttpResponseBadRequest, HttpResponseRedirect from django.core.urlresolvers import reverse from django.conf import settings -import hashlib -from django.template import loader from django.utils import timezone from django.views.generic.list import ListView -import time -from datetime import timedelta - from gestioncof.decorators import cof_required, buro_required from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\ Tirage, SpectacleRevente @@ -230,8 +231,8 @@ def do_tirage(request, tirage_id): # À partir d'ici, le tirage devient effectif Attribution.objects.filter(spectacle__tirage=tirage_elt).delete() tirage_elt.tokens += "%s\n\"\"\"%s\"\"\"\n" % ( - timezone.now().strftime("%y-%m-%d %H:%M:%S"), - form.cleaned_data['token']) + timezone.now().strftime("%y-%m-%d %H:%M:%S"), + form.cleaned_data['token']) tirage_elt.enable_do_tirage = False tirage_elt.save() Attribution.objects.bulk_create([ @@ -276,7 +277,7 @@ def revente(request, tirage_id): resellform = ResellForm(participant, request.POST, prefix='resell') annulform = AnnulForm(participant, prefix='annul') if resellform.is_valid(): - mails_data = [] + datatuple = [] attributions = resellform.cleaned_data["attributions"] with transaction.atomic(): for attribution in attributions: @@ -296,13 +297,13 @@ def revente(request, tirage_id): 'show': attribution.spectacle, 'revente': revente } - mails_data.append(participant.user.email, context) + datatuple.append(( + 'bda-revente-new', context, + settings.MAIL_DATA['revente']['FROM'], + [participant.user.email] + )) revente.save() - send_mass_custom_mail( - 'bda-revente-new', - mails_data, - from_email=settings.MAIL_DATA['revente']['FROM'] - ) + send_mass_custom_mail(datatuple) # On annule une revente elif 'annul' in request.POST: annulform = AnnulForm(participant, request.POST, prefix='annul') @@ -354,15 +355,15 @@ def revente(request, tirage_id): annulform = AnnulForm(participant, prefix='annul') overdue = participant.attribution_set.filter( - spectacle__date__gte=timezone.now(), - revente__isnull=False, - revente__seller=participant, - revente__date__lte=timezone.now()-timedelta(hours=1)).filter( + spectacle__date__gte=timezone.now(), + revente__isnull=False, + revente__seller=participant, + revente__date__lte=timezone.now()-timedelta(hours=1)).filter( Q(revente__soldTo__isnull=True) | Q(revente__soldTo=participant)) sold = participant.attribution_set.filter( - spectacle__date__gte=timezone.now(), - revente__isnull=False, - revente__soldTo__isnull=False) + spectacle__date__gte=timezone.now(), + revente__isnull=False, + revente__soldTo__isnull=False) return render(request, "bda-revente.html", {'tirage': tirage, 'overdue': overdue, "sold": sold, @@ -372,7 +373,7 @@ def revente(request, tirage_id): @login_required def revente_interested(request, revente_id): revente = get_object_or_404(SpectacleRevente, id=revente_id) - participant, created = Participant.objects.get_or_create( + participant, _ = Participant.objects.get_or_create( user=request.user, tirage=revente.attribution.spectacle.tirage) if (timezone.now() < revente.date + timedelta(hours=1)) or revente.shotgun: return render(request, "bda-wrongtime.html", @@ -387,8 +388,8 @@ def revente_interested(request, revente_id): @login_required def list_revente(request, tirage_id): tirage = get_object_or_404(Tirage, id=tirage_id) - participant, created = Participant.objects.get_or_create( - user=request.user, tirage=tirage) + participant, _ = Participant.objects.get_or_create( + user=request.user, tirage=tirage) deja_revente = False success = False inscrit_revente = False @@ -400,7 +401,7 @@ def list_revente(request, tirage_id): participant.save() for spectacle in choices: qset = SpectacleRevente.objects.filter( - attribution__spectacle=spectacle) + attribution__spectacle=spectacle) if qset.filter(shotgun=True, soldTo__isnull=True).exists(): # Une place est disponible au shotgun, on suggère à # l'utilisateur d'aller la récupérer @@ -422,24 +423,24 @@ def list_revente(request, tirage_id): success = True else: form = InscriptionReventeForm( - tirage, - initial={'spectacles': participant.choicesrevente.all()}) + tirage, + initial={'spectacles': participant.choicesrevente.all()}) return render(request, "liste-reventes.html", {"form": form, - "deja_revente": deja_revente, "success": success, - "inscrit_revente": inscrit_revente}) + "deja_revente": deja_revente, "success": success, + "inscrit_revente": inscrit_revente}) @login_required def buy_revente(request, spectacle_id): spectacle = get_object_or_404(Spectacle, id=spectacle_id) tirage = spectacle.tirage - participant, created = Participant.objects.get_or_create( - user=request.user, tirage=tirage) + participant, _ = Participant.objects.get_or_create( + user=request.user, tirage=tirage) reventes = SpectacleRevente.objects.filter( - attribution__spectacle=spectacle, - soldTo__isnull=True) + attribution__spectacle=spectacle, + soldTo__isnull=True) # Si l'utilisateur veut racheter une place qu'il est en train de revendre, # on supprime la revente en question. @@ -464,8 +465,8 @@ def buy_revente(request, spectacle_id): 'vendeur': revente.seller.user } send_custom_mail( - revente.seller.user.email, 'bda-buy-shotgun', + [revente.seller.user.email], context=context, from_email='bda@ens.fr' ) @@ -482,13 +483,13 @@ def buy_revente(request, spectacle_id): def revente_shotgun(request, tirage_id): tirage = get_object_or_404(Tirage, id=tirage_id) spectacles = tirage.spectacle_set.filter( - date__gte=timezone.now()) + date__gte=timezone.now()) shotgun = [] for spectacle in spectacles: reventes = SpectacleRevente.objects.filter( - attribution__spectacle=spectacle, - shotgun=True, - soldTo__isnull=True) + attribution__spectacle=spectacle, + shotgun=True, + soldTo__isnull=True) if reventes.exists(): shotgun.append(spectacle) @@ -552,12 +553,12 @@ def unpaid(request, tirage_id): def send_rappel(request, spectacle_id): show = get_object_or_404(Spectacle, id=spectacle_id) # Mails d'exemples - exemple_mail_1place = render_mail('bda-rappel', { + exemple_mail_1place = render_custom_mail('bda-rappel', { 'member': request.user, 'show': show, 'nb_attr': 1 }) - exemple_mail_2place = render_mail('bda-rappel', { + exemple_mail_2places = render_custom_mail('bda-rappel', { 'member': request.user, 'show': show, 'nb_attr': 2 @@ -589,5 +590,5 @@ def descriptions_spectacles(request, tirage_id): shows_qs = shows_qs.filter(location__id=int(location_id)) except ValueError: return HttpResponseBadRequest( - "La variable GET 'location' doit contenir un entier") + "La variable GET 'location' doit contenir un entier") return render(request, 'descriptions.html', {'shows': shows_qs.all()}) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 9474a087..973db315 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - -from custommail.utils import send_custom_mail, render_mail +from datetime import datetime +import base64 +import json +from captcha.fields import ReCaptchaField +from custommail.shortcuts import render_custom_mail from django.shortcuts import render, get_object_or_404, redirect +from django.core import mail from django.forms import ModelForm from django import forms from django.forms.models import inlineformset_factory, BaseInlineFormSet @@ -14,7 +15,6 @@ from django.contrib.auth.models import User from django.views.generic import ListView from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt -from django.template import loader from django.conf import settings from django.contrib.auth.decorators import login_required from django.db.models import Min @@ -26,12 +26,6 @@ from gestioncof.petits_cours_models import PetitCoursDemande, \ from gestioncof.decorators import buro_required from gestioncof.shared import lock_table, unlock_tables -from captcha.fields import ReCaptchaField - -from datetime import datetime -import base64 -import json - class DemandeListView(ListView): model = PetitCoursDemande @@ -131,7 +125,7 @@ def _finalize_traitement(request, demande, proposals, proposed_for, proposed_for = proposed_for.items() attribdata = list(attribdata.items()) proposed_mails = _generate_eleve_email(demande, proposed_for) - mainmail = render_mail("petits-cours-mail-demandeur", { + mainmail = render_custom_mail("petits-cours-mail-demandeur", { "proposals": proposals, "unsatisfied": unsatisfied, "extra": @@ -148,7 +142,7 @@ def _finalize_traitement(request, demande, proposals, proposed_for, "mainmail": mainmail, "attribdata": base64.b64encode(json.dumps(attribdata) - .encode('utf_8')), + .encode('utf_8')), "redo": redo, "errors": errors, }) @@ -158,7 +152,7 @@ def _generate_eleve_email(demande, proposed_for): return [ ( user, - render_mail('petit-cours-mail-eleve', { + render_custom_mail('petit-cours-mail-eleve', { "demande": demande, "matieres": matieres })[1] @@ -276,7 +270,7 @@ def _traitement_post(request, demande): proposals_list = proposals.items() proposed_for = proposed_for.items() proposed_mails = _generate_eleve_email(demande, proposed_for) - mainmail = render_mail("petits-cours-mail-demandeur", { + mainmail = render_custom_mail("petits-cours-mail-demandeur", { "proposals": proposals_list, "unsatisfied": unsatisfied, "extra": extra, @@ -286,14 +280,14 @@ def _traitement_post(request, demande): replyto = settings.MAIL_DATA['petits_cours']['REPLYTO'] mails_to_send = [] for (user, msg) in proposed_mails: - msg = EmailMessage("Petits cours ENS par le COF", msg, - frommail, [user.email], - [bccaddress], headers={'Reply-To': replyto}) + msg = mail.EmailMessage("Petits cours ENS par le COF", msg, + frommail, [user.email], + [bccaddress], headers={'Reply-To': replyto}) mails_to_send.append(msg) - mails_to_send.append(EmailMessage("Cours particuliers ENS", mainmail, - frommail, [demande.email], - [bccaddress], - headers={'Reply-To': replyto})) + mails_to_send.append(mail.EmailMessage("Cours particuliers ENS", mainmail, + frommail, [demande.email], + [bccaddress], + headers={'Reply-To': replyto})) connection = mail.get_connection(fail_silently=True) connection.send_messages(mails_to_send) lock_table(PetitCoursAttributionCounter, PetitCoursAttribution, User) diff --git a/gestioncof/shared.py b/gestioncof/shared.py index 988b93ee..63aceae5 100644 --- a/gestioncof/shared.py +++ b/gestioncof/shared.py @@ -9,10 +9,7 @@ from django.conf import settings from django_cas_ng.backends import CASBackend from django_cas_ng.utils import get_cas_client from django.contrib.auth import get_user_model -from django.contrib.auth.models import User as DjangoUser from django.db import connection -from django.core.mail import send_mail -from django.template import Template, Context from gestioncof.models import CofProfile @@ -73,9 +70,9 @@ class COFCASBackend(CASBackend): def context_processor(request): '''Append extra data to the context of the given request''' data = { - "user": request.user, - "site": Site.objects.get_current(), - } + "user": request.user, + "site": Site.objects.get_current(), + } return data diff --git a/gestioncof/views.py b/gestioncof/views.py index e086b06c..3b27f915 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -8,7 +8,7 @@ import unicodecsv import uuid from datetime import timedelta from icalendar import Calendar, Event as Vevent -from custommail.utils import send_custom_mail +from custommail.shortcuts import send_custom_mail from django.shortcuts import redirect, get_object_or_404, render from django.http import Http404, HttpResponse, HttpResponseForbidden @@ -439,7 +439,7 @@ def registration(request): profile = profile_form.save() if profile.is_cof and not was_cof: send_custom_mail( - member.email, "welcome", + "welcome", [member.email], context={'member': member}, from_email='cof@ens.fr' ) @@ -465,21 +465,20 @@ def registration(request): current_registration.paid = \ (form.cleaned_data['status'] == 'paid') current_registration.save() - if form.event.title == "Mega 15" and created_reg: - field = EventCommentField.objects.get( - event=form.event, name="Commentaires") - try: - comments = EventCommentValue.objects.get( - commentfield=field, - registration=current_registration).content - except EventCommentValue.DoesNotExist: - comments = field.default - # FIXME : il faut faire quelque chose de propre ici, - # par exemple écrire un mail générique pour - # l'inscription aux événements et/ou donner la - # possibilité d'associer un mail aux événements - # send_custom_mail(member, "mega", - # {"remarques": comments}) + # if form.event.title == "Mega 15" and created_reg: + # field = EventCommentField.objects.get( + # event=form.event, name="Commentaires") + # try: + # comments = EventCommentValue.objects.get( + # commentfield=field, + # registration=current_registration).content + # except EventCommentValue.DoesNotExist: + # comments = field.default + # FIXME : il faut faire quelque chose de propre ici, + # par exemple écrire un mail générique pour + # l'inscription aux événements et/ou donner la + # possibilité d'associer un mail aux événements + # send_custom_mail(...) # Enregistrement des inscriptions aux clubs member.clubs.clear() for club in clubs_form.cleaned_data['clubs']: From b39806e171c393d1c398a79adc973a8c5c075203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Thu, 22 Dec 2016 20:59:38 +0100 Subject: [PATCH 004/213] Migration et chargement des emails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - La migration qui supprime le vieux modèle gestioncof.CustomMail est ajoutée - Les mails de GestioCOF sont dans un json qui est chargé par la commande `python manage.py syncmails` Voir l'aide de la commande pour plus 'information --- bda/admin.py | 77 +-- gestioncof/management/__init__.py | 0 gestioncof/management/commands/__init__.py | 0 gestioncof/management/commands/syncmails.py | 78 +++ gestioncof/management/data/custommail.json | 587 ++++++++++++++++++ .../migrations/0009_delete_custommail.py | 16 + 6 files changed, 694 insertions(+), 64 deletions(-) create mode 100644 gestioncof/management/__init__.py create mode 100644 gestioncof/management/commands/__init__.py create mode 100644 gestioncof/management/commands/syncmails.py create mode 100644 gestioncof/management/data/custommail.json create mode 100644 gestioncof/migrations/0009_delete_custommail.py diff --git a/bda/admin.py b/bda/admin.py index 0e9b683b..fc10c326 100644 --- a/bda/admin.py +++ b/bda/admin.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +import autocomplete_light +from datetime import timedelta +from custommail.shortcuts import send_mass_custom_mail -from django.core.mail import send_mail from django.contrib import admin from django.db.models import Sum, Count from django.template.defaultfilters import pluralize @@ -13,10 +12,6 @@ from django import forms from bda.models import Spectacle, Salle, Participant, ChoixSpectacle,\ Attribution, Tirage, Quote, CategorieSpectacle, SpectacleRevente -from datetime import timedelta - -import autocomplete_light - class ChoixSpectacleInline(admin.TabularInline): model = ChoixSpectacle @@ -72,66 +67,20 @@ class ParticipantAdmin(admin.ModelAdmin): readonly_fields = ("total",) def send_attribs(self, request, queryset): + datatuple = [] for member in queryset.all(): attribs = member.attributions.all() + context = {'member': member.user} + shortname = "" if len(attribs) == 0: - mail = """Cher-e %s, - -Tu t'es inscrit-e pour le tirage au sort du BdA. Malheureusement, tu n'as -obtenu aucune place. - -Nous proposons cependant de nombreuses offres hors-tirage tout au long de -l'année, et nous t'invitons à nous contacter si l'une d'entre elles -t'intéresse ! --- -Le Bureau des Arts - -""" - name = member.user.get_full_name() - mail = mail % name + shortname = "bda-attributions-decus" else: - mail = """Cher-e %s, - -Tu t'es inscrit-e pour le tirage au sort du BdA. Tu as été sélectionné-e -pour les spectacles suivants : - -%s - -*Paiement* -L'intégralité de ces places de spectacles est à régler dès maintenant et AVANT -le %s, au bureau du COF pendant les heures de permanences (du lundi au vendredi -entre 12h et 14h, et entre 18h et 20h). Des facilités de paiement sont bien -évidemment possibles : nous pouvons ne pas encaisser le chèque immédiatement, -ou bien découper votre paiement en deux fois. Pour ceux qui ne pourraient pas -venir payer au bureau, merci de nous contacter par mail. - -*Mode de retrait des places* -Au moment du paiement, certaines places vous seront remises directement, -d'autres seront à récupérer au cours de l'année, d'autres encore seront -nominatives et à retirer le soir même dans les theâtres correspondants. -Pour chaque spectacle, vous recevrez un mail quelques jours avant la -représentation vous indiquant le mode de retrait. - -Nous vous rappelons que l'obtention de places du BdA vous engage à -respecter les règles de fonctionnement : -http://www.cof.ens.fr/bda/?page_id=1370 -Le système de revente des places via les mails BdA-revente sera très -prochainement disponible, directement sur votre compte GestioCOF. - -En vous souhaitant de très beaux spectacles tout au long de l'année, --- -Le Bureau des Arts -""" - attribs_text = "" - name = member.user.get_full_name() - for attrib in attribs: - attribs_text += "- 1 place pour %s\n" % attrib - deadline = member.tirage.fermeture + timedelta(days=7) - mail = mail % (name, attribs_text, - deadline.strftime('%d %b %Y')) - send_mail("Résultats du tirage au sort", mail, - "bda@ens.fr", [member.user.email], - fail_silently=True) + shortname = "bda-attributions" + context['places'] = attribs + print(context) + datatuple.append((shortname, context, "bda@ens.fr", + [member.user.email])) + send_mass_custom_mail(datatuple) count = len(queryset.all()) if count == 1: message_bit = "1 membre a" diff --git a/gestioncof/management/__init__.py b/gestioncof/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gestioncof/management/commands/__init__.py b/gestioncof/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gestioncof/management/commands/syncmails.py b/gestioncof/management/commands/syncmails.py new file mode 100644 index 00000000..6ce1fd6e --- /dev/null +++ b/gestioncof/management/commands/syncmails.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +""" +Import des mails de GestioCOF dans la base de donnée +""" + +import json +import os +from custommail.models import VariableType, CustomMail, CustomMailVariable + +from django.core.management.base import BaseCommand +from django.contrib.contenttypes.models import ContentType + + +class Command(BaseCommand): + help = ("Va chercher les données mails de GestioCOF stocké au format json " + "dans /gestioncof/management/data/custommails.json. Le format des " + "données est celui donné par la commande :" + " `python manage.py dumpdata custommail --natural-foreign` " + "La bonne façon de mettre à jour ce fichier est donc de le " + "charger à l'aide de syncmails, le faire les modifications à " + "l'aide de l'interface administration et/ou du shell puis de le " + "remplacer par le nouveau résultat de la commande précédente.") + + def handle(self, *args, **options): + path = os.path.join( + os.path.dirname(os.path.dirname(__file__)), + 'data', 'custommail.json') + with open(path, 'r') as jsonfile: + mail_data = json.load(jsonfile) + + # On se souvient à quel objet correspond quel pk du json + assoc = {'types': {}, 'mails': {}} + status = {'synced': 0, 'unchanged': 0} + + for obj in mail_data: + model = obj['model'] + fields = obj['fields'] + + # Pour les trois types d'objets : + # - On récupère les objets référencés par les clefs étrangères + # - On crée l'objet si nécessaire + # - On le stocke éventuellement dans les deux dictionnaires définis + # plus haut + + # Variable types + if model == 'custommail.variabletype': + fields['inner1'] = assoc['types'].get(fields['inner1']) + fields['inner2'] = assoc['types'].get(fields['inner2']) + if fields['typ'] == 'model': + fields['content_type'] = ( + ContentType.objects + .get_by_natural_key(*fields['content_type']) + ) + var_type, _ = VariableType.objects.get_or_create(**fields) + assoc['types'][obj['pk']] = var_type + + # Custom mails + if model == 'custommail.custommail': + mail, created = CustomMail.objects.get_or_create(**fields) + assoc['mails'][obj['pk']] = mail + if created: + self.stdout.write( + 'SYNCED {:s}'.format(fields['shortname'])) + status['synced'] += 1 + else: + status['unchanged'] += 1 + + # Variables + if model == 'custommail.custommailvariable': + fields['custommail'] = assoc['mails'].get(fields['custommail']) + fields['typ'] = assoc['types'].get(fields['typ']) + CustomMailVariable.objects.get_or_create(**fields) + + # C'est agréable d'avoir le résultat affiché + self.stdout.write( + '{synced:d} mails synchronized {unchanged:d} unchanged' + .format(**status) + ) diff --git a/gestioncof/management/data/custommail.json b/gestioncof/management/data/custommail.json new file mode 100644 index 00000000..0f81744c --- /dev/null +++ b/gestioncof/management/data/custommail.json @@ -0,0 +1,587 @@ +[ +{ + "model": "custommail.variabletype", + "pk": 1, + "fields": { + "content_type": [ + "auth", + "user" + ], + "inner1": null, + "typ": "model", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 2, + "fields": { + "content_type": null, + "inner1": null, + "typ": "int", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 3, + "fields": { + "content_type": [ + "bda", + "spectacle" + ], + "inner1": null, + "typ": "model", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 4, + "fields": { + "content_type": [ + "bda", + "spectaclerevente" + ], + "inner1": null, + "typ": "model", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 5, + "fields": { + "content_type": [ + "sites", + "site" + ], + "inner1": null, + "typ": "model", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 6, + "fields": { + "content_type": [ + "gestioncof", + "petitcoursdemande" + ], + "inner1": null, + "typ": "model", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 7, + "fields": { + "content_type": null, + "inner1": null, + "typ": "list", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 8, + "fields": { + "content_type": null, + "inner1": 1, + "typ": "list", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 9, + "fields": { + "content_type": null, + "inner1": null, + "typ": "pair", + "inner2": 8 + } +}, +{ + "model": "custommail.variabletype", + "pk": 10, + "fields": { + "content_type": null, + "inner1": 9, + "typ": "list", + "inner2": null + } +}, +{ + "model": "custommail.variabletype", + "pk": 11, + "fields": { + "content_type": null, + "inner1": 3, + "typ": "list", + "inner2": null + } +}, +{ + "model": "custommail.custommail", + "pk": 1, + "fields": { + "shortname": "welcome", + "subject": "Bienvenue au COF", + "description": "Mail de bienvenue au COF envoy\u00e9 automatiquement \u00e0 l'inscription d'un nouveau membre", + "body": "Bonjour {{ member.first_name }} et bienvenue au COF !\r\n\r\nTu trouveras plein de trucs cool sur le site du COF : https://www.cof.ens.fr/ et notre page Facebook : https://www.facebook.com/cof.ulm\r\nEt n'oublie pas d'aller d\u00e9couvrir GestioCOF, la plateforme de gestion du COF !\r\nSi tu as des questions, tu peux nous envoyer un mail \u00e0 cof@ens.fr (on aime le spam), ou passer nous voir au Bur\u00f4 pr\u00e8s de la Cour\u00f4 du lundi au vendredi de 12h \u00e0 14h et de 18h \u00e0 20h.\r\n\r\nRetrouvez les \u00e9v\u00e8nements de rentr\u00e9e pour les conscrit.e.s et les vieux/vieilles organis\u00e9s par le COF et ses clubs ici : http://www.cof.ens.fr/depot/Rentree.pdf \r\n\r\nAmicalement,\r\n\r\nTon COF qui t'aime." + } +}, +{ + "model": "custommail.custommail", + "pk": 2, + "fields": { + "shortname": "bda-rappel", + "subject": "{{ show }}", + "description": "Mail de rappel pour les spectacles BdA", + "body": "Bonjour {{ member.first_name }},\r\n\r\nNous te rappellons que tu as eu la chance d'obtenir {{ nb_attr|pluralize:\"une place,deux places\" }}\r\npour {{ show.title }}, le {{ show.date }} au {{ show.location }}. N'oublie pas de t'y rendre !\r\n{% if nb_attr == 2 %}\r\nTu as obtenu deux places pour ce spectacle. Nous te rappelons que\r\nces places sont strictement r\u00e9serv\u00e9es aux personnes de moins de 28 ans.\r\n{% endif %}\r\n{% if show.listing %}Pour ce spectacle, tu as re\u00e7u des places sur\r\nlisting. Il te faudra donc te rendre 15 minutes en avance sur les lieux de la repr\u00e9sentation\r\npour retirer {{ nb_attr|pluralize:\"ta place,tes places\" }}.\r\n{% else %}Pour assister \u00e0 ce spectacle, tu dois pr\u00e9senter les billets qui ont\r\n\u00e9t\u00e9 distribu\u00e9s au bur\u00f4.\r\n{% endif %}\r\n\r\nSi tu ne peux plus assister \u00e0 cette repr\u00e9sentation, tu peux\r\nrevendre ta place via BdA-revente, accessible directement sur\r\nGestioCOF (lien \"revendre une place du premier tirage\" sur la page\r\nd'accueil https://www.cof.ens.fr/gestion/).\r\n\r\nEn te souhaitant un excellent spectacle,\r\n\r\nLe Bureau des Arts" + } +}, +{ + "model": "custommail.custommail", + "pk": 3, + "fields": { + "shortname": "bda-revente", + "subject": "{{ show }}", + "description": "Notification envoy\u00e9e \u00e0 toutes les personnes int\u00e9ress\u00e9es par un spectacle pour le signaler qu'une place vient d'\u00eatre mise en vente.", + "body": "Bonjour {{ member.first_name }}\r\n\r\nUne place pour le spectacle {{ show.title }} ({{ show.date }})\r\na \u00e9t\u00e9 post\u00e9e sur BdA-Revente.\r\n\r\nSi ce spectacle t'int\u00e9resse toujours, merci de nous le signaler en cliquant\r\nsur ce lien : http://{{ site }}{% url \"bda-revente-interested\" revente.id %}.\r\nDans le cas o\u00f9 plusieurs personnes seraient int\u00e9ress\u00e9es, nous proc\u00e8derons \u00e0\r\nun tirage au sort le {{ revente.date_tirage|date:\"DATE_FORMAT\" }}.\r\n\r\nChaleureusement,\r\nLe BdA" + } +}, +{ + "model": "custommail.custommail", + "pk": 4, + "fields": { + "shortname": "bda-shotgun", + "subject": "{{ show }}", + "description": "Notification signalant qu'une place est au shotgun aux personnes int\u00e9ress\u00e9es.", + "body": "Bonjour {{ member.first_name }}\r\n\r\nUne place pour le spectacle {{ show.title }} ({{ show.date }})\r\na \u00e9t\u00e9 post\u00e9e sur BdA-Revente.\r\n\r\nPuisque ce spectacle a lieu dans moins de 24h, il n'y a pas de tirage au sort pour\r\ncette place : elle est disponible imm\u00e9diatement \u00e0 l'adresse\r\nhttp://{{ site }}{% url \"bda-buy-revente\" show.id %}, \u00e0 la disposition de tous.\r\n\r\nChaleureusement,\r\nLe BdA" + } +}, +{ + "model": "custommail.custommail", + "pk": 5, + "fields": { + "shortname": "bda-revente-winner", + "subject": "BdA-Revente : {{ show.title }}", + "description": "Mail envoy\u00e9 au gagnant d'un tirage BdA-Revente", + "body": "Bonjour {{ acheteur.first_name }},\r\n\r\nTu as \u00e9t\u00e9 tir\u00e9-e au sort pour racheter une place pour {{ show.title }} le {{ show.date }} ({{ show.location }}) \u00e0 {{ show.price|floatformat:2 }}\u20ac.\r\nTu peux contacter le/la vendeur-se \u00e0 l'adresse {{ vendeur.email }}.\r\n\r\nChaleureusement,\r\nLe BdA" + } +}, +{ + "model": "custommail.custommail", + "pk": 6, + "fields": { + "shortname": "bda-revente-loser", + "subject": "BdA-Revente : {{ show.title }}", + "description": "Notification envoy\u00e9e aux perdants d'un tirage de revente.", + "body": "Bonjour {{ acheteur.first_name }},\r\n\r\nTu t'\u00e9tais inscrit-e pour la revente de la place de {{ vendeur.get_full_name }}\r\npour {{ show.title }}.\r\nMalheureusement, une autre personne a \u00e9t\u00e9 tir\u00e9e au sort pour racheter la place.\r\nTu pourras certainement retenter ta chance pour une autre revente !\r\n\r\n\u00c0 tr\u00e8s bient\u00f4t,\r\nLe Bureau des Arts" + } +}, +{ + "model": "custommail.custommail", + "pk": 7, + "fields": { + "shortname": "bda-revente-seller", + "subject": "BdA-Revente : {{ show.title }}", + "description": "Notification envoy\u00e9e au vendeur d'une place pour lui indiquer qu'elle vient d'\u00eatre attribu\u00e9e", + "body": "Bonjour {{ vendeur.first_name }},\r\n\r\nLa personne tir\u00e9e au sort pour racheter ta place pour {{ show.title }} est {{ acheteur.get_full_name }}.\r\nTu peux le/la contacter \u00e0 l'adresse {{ acheteur.email }}, ou en r\u00e9pondant \u00e0 ce mail.\r\n\r\nChaleureusement,\r\nLe BdA" + } +}, +{ + "model": "custommail.custommail", + "pk": 8, + "fields": { + "shortname": "bda-revente-new", + "subject": "BdA-Revente : {{ show.title }}", + "description": "Notification signalant au vendeur d'une place que sa mise en vente a bien eu lieu et lui donnant quelques informations compl\u00e9mentaires.", + "body": "Bonjour {{ vendeur.first_name }},\r\n\r\nTu t\u2019es bien inscrit-e pour la revente de {{ show.title }}.\r\n\r\n{% with revente.date_tirage as time %}\r\nLe tirage au sort entre tout-e-s les racheteuse-eur-s potentiel-le-s aura lieu\r\nle {{ time|date:\"DATE_FORMAT\" }} \u00e0 {{ time|time:\"TIME_FORMAT\" }} (dans {{time|timeuntil }}).\r\nSi personne ne s\u2019est inscrit pour racheter la place, celle-ci apparaitra parmi\r\nles \u00ab Places disponibles imm\u00e9diatement \u00e0 la revente \u00bb sur GestioCOF.\r\n{% endwith %}\r\n\r\nBonne revente !\r\nLe Bureau des Arts" + } +}, +{ + "model": "custommail.custommail", + "pk": 9, + "fields": { + "shortname": "bda-buy-shotgun", + "subject": "BdA-Revente : {{ show.title }}", + "description": "Mail envoy\u00e9 au revendeur lors d'un achat au shotgun.", + "body": "Bonjour {{ vendeur.first_name }} !\r\n\r\nJe souhaiterais racheter ta place pour {{ show.title }} le {{ show.date }} ({{ show.location }}) \u00e0 {{ show.price|floatformat:2 }}\u20ac.\r\nContacte-moi si tu es toujours int\u00e9ress\u00e9\u00b7e !\r\n\r\n{{ acheteur.get_full_name }} ({{ acheteur.email }})" + } +}, +{ + "model": "custommail.custommail", + "pk": 10, + "fields": { + "shortname": "petit-cours-mail-eleve", + "subject": "Petits cours ENS par le COF", + "description": "Mail envoy\u00e9 aux personnes dont ont a donn\u00e9 les contacts \u00e0 des demandeurs de petits cours", + "body": "Salut,\r\n\r\nLe COF a re\u00e7u une demande de petit cours qui te correspond. Tu es en haut de la liste d'attente donc on a transmis tes coordonn\u00e9es, ainsi que celles de 2 autres qui correspondaient aussi (c'est la vie, on donne les num\u00e9ros 3 par 3 pour que ce soit plus souple). Voici quelques infos sur l'annonce en question :\r\n\r\n\u00a4 Nom : {{ demande.name }}\r\n\r\n\u00a4 P\u00e9riode : {{ demande.quand }}\r\n\r\n\u00a4 Fr\u00e9quence : {{ demande.freq }}\r\n\r\n\u00a4 Lieu (si pr\u00e9f\u00e9r\u00e9) : {{ demande.lieu }}\r\n\r\n\u00a4 Niveau : {{ demande.get_niveau_display }}\r\n\r\n\u00a4 Remarques diverses (d\u00e9sol\u00e9 pour les balises HTML) : {{ demande.remarques }}\r\n\r\n{% if matieres|length > 1 %}\u00a4 Mati\u00e8res :\r\n{% for matiere in matieres %} \u00a4 {{ matiere }}\r\n{% endfor %}{% else %}\u00a4 Mati\u00e8re : {% for matiere in matieres %}{{ matiere }}\r\n{% endfor %}{% endif %}\r\nVoil\u00e0, cette personne te contactera peut-\u00eatre sous peu, tu pourras voir les d\u00e9tails directement avec elle (prix, modalit\u00e9s, ...). Pour indication, 30 Euro/h semble \u00eatre la moyenne.\r\n\r\nSi tu te rends compte qu'en fait tu ne peux pas/plus donner de cours en ce moment, \u00e7a serait cool que tu d\u00e9coches la case \"Recevoir des propositions de petits cours\" sur GestioCOF. Ensuite d\u00e8s que tu voudras r\u00e9appara\u00eetre tu pourras recocher la case et tu seras \u00e0 nouveau sur la liste.\r\n\r\n\u00c0 bient\u00f4t,\r\n\r\n--\r\nLe COF, pour les petits cours" + } +}, +{ + "model": "custommail.custommail", + "pk": 11, + "fields": { + "shortname": "petits-cours-mail-demandeur", + "subject": "Cours particuliers ENS", + "description": "Mail envoy\u00e9 aux personnent qui demandent des petits cours lorsque leur demande est trait\u00e9e.\r\n\r\n(Ne pas toucher \u00e0 {{ extra|safe }})", + "body": "Bonjour,\r\n\r\nJe vous contacte au sujet de votre annonce pass\u00e9e sur le site du COF pour rentrer en contact avec un \u00e9l\u00e8ve normalien pour des cours particuliers. Voici les coordonn\u00e9es d'\u00e9l\u00e8ves qui sont motiv\u00e9s par de tels cours et correspondent aux crit\u00e8res que vous nous aviez transmis :\r\n\r\n{% for matiere, proposed in proposals %}\u00a4 {{ matiere }} :{% for user in proposed %}\r\n \u00a4 {{ user.get_full_name }}{% if user.profile.phone %}, {{ user.profile.phone }}{% endif %}{% if user.email %}, {{ user.email }}{% endif %}{% endfor %}\r\n\r\n{% endfor %}{% if unsatisfied %}Nous n'avons cependant pas pu trouver d'\u00e9l\u00e8ve disponible pour des cours de {% for matiere in unsatisfied %}{% if forloop.counter0 > 0 %}, {% endif %}{{ matiere }}{% endfor %}.\r\n\r\n{% endif %}Si pour une raison ou une autre ces num\u00e9ros ne suffisaient pas, n'h\u00e9sitez pas \u00e0 r\u00e9pondre \u00e0 cet e-mail et je vous en ferai parvenir d'autres sans probl\u00e8me.\r\n{% if extra|length > 0 %}\r\n{{ extra|safe }}\r\n{% endif %}\r\nCordialement,\r\n\r\n--\r\nLe COF, BdE de l'ENS" + } +}, +{ + "model": "custommail.custommail", + "pk": 12, + "fields": { + "shortname": "bda-attributions", + "subject": "R\u00e9sultats du tirage au sort", + "description": "Mail annon\u00e7ant les r\u00e9sultats du tirage au sort du BdA aux gagnants d'une ou plusieurs places", + "body": "Cher-e {{ member.first_name }},\r\n\r\nTu t'es inscrit-e pour le tirage au sort du BdA. Tu as \u00e9t\u00e9 s\u00e9lectionn\u00e9-e\r\npour les spectacles suivants :\r\n{% for place in places %}\r\n- 1 place pour {{ place }}{% endfor %}\r\n\r\n*Paiement*\r\nL'int\u00e9gralit\u00e9 de ces places de spectacles est \u00e0 r\u00e9gler d\u00e8s maintenant et AVANT\r\nvendredi prochain, au bureau du COF pendant les heures de permanences (du lundi au vendredi\r\nentre 12h et 14h, et entre 18h et 20h). Des facilit\u00e9s de paiement sont bien\r\n\u00e9videmment possibles : nous pouvons ne pas encaisser le ch\u00e8que imm\u00e9diatement,\r\nou bien d\u00e9couper votre paiement en deux fois. Pour ceux qui ne pourraient pas\r\nvenir payer au bureau, merci de nous contacter par mail.\r\n\r\n*Mode de retrait des places*\r\nAu moment du paiement, certaines places vous seront remises directement,\r\nd'autres seront \u00e0 r\u00e9cup\u00e9rer au cours de l'ann\u00e9e, d'autres encore seront\r\nnominatives et \u00e0 retirer le soir m\u00eame dans les the\u00e2tres correspondants.\r\nPour chaque spectacle, vous recevrez un mail quelques jours avant la\r\nrepr\u00e9sentation vous indiquant le mode de retrait.\r\n\r\nNous vous rappelons que l'obtention de places du BdA vous engage \u00e0\r\nrespecter les r\u00e8gles de fonctionnement :\r\nhttp://www.cof.ens.fr/bda/?page_id=1370\r\nUn syst\u00e8me de revente des places via les mails BdA-revente disponible\r\ndirectement sur votre compte GestioCOF.\r\n\r\nEn vous souhaitant de tr\u00e8s beaux spectacles tout au long de l'ann\u00e9e,\r\n--\r\nLe Bureau des Arts" + } +}, +{ + "model": "custommail.custommail", + "pk": 13, + "fields": { + "shortname": "bda-attributions-decus", + "subject": "R\u00e9sultats du tirage au sort", + "description": "Mail annon\u00e7ant les r\u00e9sultats du tirage au sort du BdA aux personnes n'ayant pas obtenu de place", + "body": "Cher-e {{ member.first_name }},\r\n\r\nTu t'es inscrit-e pour le tirage au sort du BdA. Malheureusement, tu n'as\r\nobtenu aucune place.\r\n\r\nNous proposons cependant de nombreuses offres hors-tirage tout au long de\r\nl'ann\u00e9e, et nous t'invitons \u00e0 nous contacter si l'une d'entre elles\r\nt'int\u00e9resse !\r\n--\r\nLe Bureau des Arts" + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 1, + "fields": { + "name": "member", + "description": "Utilisateur de GestioCOF", + "custommail": 1, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 2, + "fields": { + "name": "member", + "description": "Utilisateur ayant eu une place pour ce spectacle", + "custommail": 2, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 3, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 2, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 4, + "fields": { + "name": "nb_attr", + "description": "Nombre de places obtenues", + "custommail": 2, + "typ": 2 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 5, + "fields": { + "name": "revente", + "description": "Revente mentionn\u00e9e dans le mail", + "custommail": 3, + "typ": 4 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 6, + "fields": { + "name": "member", + "description": "Personne int\u00e9ress\u00e9e par la place", + "custommail": 3, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 7, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 3, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 8, + "fields": { + "name": "site", + "description": "Site web (gestioCOF)", + "custommail": 3, + "typ": 5 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 9, + "fields": { + "name": "site", + "description": "Site web (gestioCOF)", + "custommail": 4, + "typ": 5 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 10, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 4, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 11, + "fields": { + "name": "member", + "description": "Personne int\u00e9ress\u00e9e par la place", + "custommail": 4, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 12, + "fields": { + "name": "acheteur", + "description": "Gagnant-e du tirage", + "custommail": 5, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 13, + "fields": { + "name": "vendeur", + "description": "Personne qui vend une place", + "custommail": 5, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 14, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 5, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 15, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 6, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 16, + "fields": { + "name": "vendeur", + "description": "Personne qui vend une place", + "custommail": 6, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 17, + "fields": { + "name": "acheteur", + "description": "Personne inscrite au tirage qui n'a pas eu la place", + "custommail": 6, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 18, + "fields": { + "name": "acheteur", + "description": "Gagnant-e du tirage", + "custommail": 7, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 19, + "fields": { + "name": "vendeur", + "description": "Personne qui vend une place", + "custommail": 7, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 20, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 7, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 21, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 8, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 22, + "fields": { + "name": "vendeur", + "description": "Personne qui vend la place", + "custommail": 8, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 23, + "fields": { + "name": "revente", + "description": "Revente mentionn\u00e9e dans le mail", + "custommail": 8, + "typ": 4 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 24, + "fields": { + "name": "vendeur", + "description": "Personne qui vend la place", + "custommail": 9, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 25, + "fields": { + "name": "show", + "description": "Spectacle", + "custommail": 9, + "typ": 3 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 26, + "fields": { + "name": "acheteur", + "description": "Personne qui prend la place au shotgun", + "custommail": 9, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 27, + "fields": { + "name": "demande", + "description": "Demande de petit cours", + "custommail": 10, + "typ": 6 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 28, + "fields": { + "name": "matieres", + "description": "Liste des mati\u00e8res concern\u00e9es par la demande", + "custommail": 10, + "typ": 7 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 29, + "fields": { + "name": "proposals", + "description": "Liste associant une liste d'enseignants \u00e0 chaque mati\u00e8re", + "custommail": 11, + "typ": 10 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 30, + "fields": { + "name": "unsatisfied", + "description": "Liste des mati\u00e8res pour lesquelles on n'a pas d'enseigant \u00e0 proposer", + "custommail": 11, + "typ": 7 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 31, + "fields": { + "name": "places", + "description": "Places de spectacle du participant", + "custommail": 12, + "typ": 11 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 32, + "fields": { + "name": "member", + "description": "Participant du tirage au sort", + "custommail": 12, + "typ": 1 + } +}, +{ + "model": "custommail.custommailvariable", + "pk": 33, + "fields": { + "name": "member", + "description": "Participant du tirage au sort", + "custommail": 13, + "typ": 1 + } +} +] diff --git a/gestioncof/migrations/0009_delete_custommail.py b/gestioncof/migrations/0009_delete_custommail.py new file mode 100644 index 00000000..60e374a3 --- /dev/null +++ b/gestioncof/migrations/0009_delete_custommail.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestioncof', '0008_py3'), + ] + + operations = [ + migrations.DeleteModel( + name='CustomMail', + ), + ] From 8bf2f715a46f37e18bed8fce728ad02f2b64caa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 23 Dec 2016 10:25:28 +0100 Subject: [PATCH 005/213] Correction de bugs et nettoyage --- bda/models.py | 39 +++++++++---------- bda/templates/{ => bda}/mails-rappel.html | 8 +++- bda/views.py | 4 +- gestioncof/petits_cours_views.py | 2 +- .../traitement_demande_petit_cours.html | 8 +++- 5 files changed, 34 insertions(+), 27 deletions(-) rename bda/templates/{ => bda}/mails-rappel.html (84%) diff --git a/bda/models.py b/bda/models.py index a14585ee..98ab622f 100644 --- a/bda/models.py +++ b/bda/models.py @@ -298,36 +298,35 @@ class SpectacleRevente(models.Model): # Envoie un mail au gagnant et au vendeur winner = random.choice(inscrits) self.soldTo = winner + datatuple = [] context = { 'acheteur': winner.user, 'vendeur': seller.user, 'show': spectacle, } - send_custom_mail( + datatuple.append(( 'bda-revente-winner', + context, + settings.MAIL_DATA['revente']['FROM'], [winner.user.email], - context=context, - from_email=settings.MAIL_DATA['revente']['FROM'] - ) - send_custom_mail( + )) + datatuple.append(( 'bda-revente-seller', - [seller.user.email], - context=context, - from_email=settings.MAIL_DATA['revente']['FROM'] - ) + context, + settings.MAIL_DATA['revente']['FROM'], + [seller.user.email] + )) # Envoie un mail aux perdants - datatuple = [( - 'bda-revente-loser', - { - 'acheteur': inscrit.user, - 'vendeur': seller.user, - 'show': spectacle - }, - settings.MAIL_DATA['revente']['FROM'], - [inscrit.user.email]) - for inscrit in inscrits if inscrit != winner - ] + for inscrit in inscrits: + if inscrit != winner: + context['acheteur'] = inscrit.user + datatuple.append(( + 'bda-revente-loser', + context, + settings.MAIL_DATA['revente']['FROM'], + [inscrit.user.email] + )) send_mass_custom_mail(datatuple) # Si personne ne veut de la place, elle part au shotgun else: diff --git a/bda/templates/mails-rappel.html b/bda/templates/bda/mails-rappel.html similarity index 84% rename from bda/templates/mails-rappel.html rename to bda/templates/bda/mails-rappel.html index 3fc15fa2..a2821e28 100644 --- a/bda/templates/mails-rappel.html +++ b/bda/templates/bda/mails-rappel.html @@ -28,8 +28,12 @@

Forme des mails


Une seule place

-
{{ exemple_mail_1place }}
+{% for part in exemple_mail_1place %} +
{{ part }}
+{% endfor %}
Deux places

-
{{ exemple_mail_2places }}
+{% for part in exemple_mail_2places %} +
{{ part }}
+{% endfor %} {% endblock %} diff --git a/bda/views.py b/bda/views.py index 4f0d717d..ad5fb490 100644 --- a/bda/views.py +++ b/bda/views.py @@ -466,7 +466,7 @@ def buy_revente(request, spectacle_id): } send_custom_mail( 'bda-buy-shotgun', - [revente.seller.user.email], + recipient_list=[revente.seller.user.email], context=context, from_email='bda@ens.fr' ) @@ -575,7 +575,7 @@ def send_rappel(request, spectacle_id): # Demande de confirmation else: ctxt['sent'] = False - return render(request, "mails-rappel.html", ctxt) + return render(request, "bda/mails-rappel.html", ctxt) def descriptions_spectacles(request, tirage_id): diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 973db315..18c715cf 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -155,7 +155,7 @@ def _generate_eleve_email(demande, proposed_for): render_custom_mail('petit-cours-mail-eleve', { "demande": demande, "matieres": matieres - })[1] + }) ) for user, matieres in proposed_for ] diff --git a/gestioncof/templates/traitement_demande_petit_cours.html b/gestioncof/templates/traitement_demande_petit_cours.html index d51f87b5..f533f0f1 100644 --- a/gestioncof/templates/traitement_demande_petit_cours.html +++ b/gestioncof/templates/traitement_demande_petit_cours.html @@ -30,10 +30,14 @@

Mails pour les membres proposés :

{% for proposeduser, mail in proposed_mails %}
Pour {{ proposeduser }}:
-
{{ mail }}
+ {% for part in mail %} +
{{ part }}
+ {% endfor %} {% endfor %}

Mail pour l'auteur de la demande :

-
{{ mainmail|safe }}
+ {% for part in mainmail %} +
{{ part|safe }}
+ {% endfor %} {% if redo %}{% endif %} From 74abd6c853eb5a9f0356e6a04b5d1d46cd147f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 23 Dec 2016 18:51:33 +0100 Subject: [PATCH 006/213] Fixe le comportement de syncmail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit syncmail ne devrait pas essayer de changer un email si un email du même shortname existe déjà. Ce n'était pas le cas auparavant --- gestioncof/management/commands/syncmails.py | 30 +++++++++++++-------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/gestioncof/management/commands/syncmails.py b/gestioncof/management/commands/syncmails.py index 6ce1fd6e..62936000 100644 --- a/gestioncof/management/commands/syncmails.py +++ b/gestioncof/management/commands/syncmails.py @@ -33,7 +33,6 @@ class Command(BaseCommand): status = {'synced': 0, 'unchanged': 0} for obj in mail_data: - model = obj['model'] fields = obj['fields'] # Pour les trois types d'objets : @@ -43,7 +42,7 @@ class Command(BaseCommand): # plus haut # Variable types - if model == 'custommail.variabletype': + if obj['model'] == 'custommail.variabletype': fields['inner1'] = assoc['types'].get(fields['inner1']) fields['inner2'] = assoc['types'].get(fields['inner2']) if fields['typ'] == 'model': @@ -55,21 +54,30 @@ class Command(BaseCommand): assoc['types'][obj['pk']] = var_type # Custom mails - if model == 'custommail.custommail': - mail, created = CustomMail.objects.get_or_create(**fields) - assoc['mails'][obj['pk']] = mail - if created: + if obj['model'] == 'custommail.custommail': + mail = None + try: + mail = CustomMail.objects.get( + shortname=fields['shortname']) + status['unchanged'] += 1 + except CustomMail.DoesNotExist: + mail = CustomMail.objects.create(**fields) + status['synced'] += 1 self.stdout.write( 'SYNCED {:s}'.format(fields['shortname'])) - status['synced'] += 1 - else: - status['unchanged'] += 1 + assoc['mails'][obj['pk']] = mail # Variables - if model == 'custommail.custommailvariable': + if obj['model'] == 'custommail.custommailvariable': fields['custommail'] = assoc['mails'].get(fields['custommail']) fields['typ'] = assoc['types'].get(fields['typ']) - CustomMailVariable.objects.get_or_create(**fields) + try: + CustomMailVariable.objects.get( + custommail=fields['custommail'], + name=fields['name'] + ) + except CustomMailVariable.DoesNotExist: + CustomMailVariable.objects.create(**fields) # C'est agréable d'avoir le résultat affiché self.stdout.write( From 9482ab441686e8cd106f4cfd97a7ee4f0df8e190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 23 Dec 2016 18:58:48 +0100 Subject: [PATCH 007/213] Update provisioning Il faut lancer `syncmails` au setup de GestioCOF --- provisioning/prepare_django.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/provisioning/prepare_django.sh b/provisioning/prepare_django.sh index c8c80d05..9cf584ee 100644 --- a/provisioning/prepare_django.sh +++ b/provisioning/prepare_django.sh @@ -3,5 +3,6 @@ source ~/venv/bin/activate python manage.py migrate +python manage.py syncmails python manage.py loaddata users root bda gestion sites python manage.py collectstatic --noinput From dd60c58bb8d75952073779f2c2c6cfd4db1782c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 24 Dec 2016 14:02:54 +0100 Subject: [PATCH 008/213] Follows the changes in custommail --- gestioncof/management/commands/syncmails.py | 14 ++-- gestioncof/management/data/custommail.json | 88 ++++++++++----------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/gestioncof/management/commands/syncmails.py b/gestioncof/management/commands/syncmails.py index 62936000..1d3dddb8 100644 --- a/gestioncof/management/commands/syncmails.py +++ b/gestioncof/management/commands/syncmails.py @@ -5,7 +5,7 @@ Import des mails de GestioCOF dans la base de donnée import json import os -from custommail.models import VariableType, CustomMail, CustomMailVariable +from custommail.models import Type, CustomMail, Variable from django.core.management.base import BaseCommand from django.contrib.contenttypes.models import ContentType @@ -45,12 +45,12 @@ class Command(BaseCommand): if obj['model'] == 'custommail.variabletype': fields['inner1'] = assoc['types'].get(fields['inner1']) fields['inner2'] = assoc['types'].get(fields['inner2']) - if fields['typ'] == 'model': + if fields['kind'] == 'model': fields['content_type'] = ( ContentType.objects .get_by_natural_key(*fields['content_type']) ) - var_type, _ = VariableType.objects.get_or_create(**fields) + var_type, _ = Type.objects.get_or_create(**fields) assoc['types'][obj['pk']] = var_type # Custom mails @@ -70,14 +70,14 @@ class Command(BaseCommand): # Variables if obj['model'] == 'custommail.custommailvariable': fields['custommail'] = assoc['mails'].get(fields['custommail']) - fields['typ'] = assoc['types'].get(fields['typ']) + fields['type'] = assoc['types'].get(fields['type']) try: - CustomMailVariable.objects.get( + Variable.objects.get( custommail=fields['custommail'], name=fields['name'] ) - except CustomMailVariable.DoesNotExist: - CustomMailVariable.objects.create(**fields) + except Variable.DoesNotExist: + Variable.objects.create(**fields) # C'est agréable d'avoir le résultat affiché self.stdout.write( diff --git a/gestioncof/management/data/custommail.json b/gestioncof/management/data/custommail.json index 0f81744c..9ee9b1ea 100644 --- a/gestioncof/management/data/custommail.json +++ b/gestioncof/management/data/custommail.json @@ -8,7 +8,7 @@ "user" ], "inner1": null, - "typ": "model", + "kind": "model", "inner2": null } }, @@ -18,7 +18,7 @@ "fields": { "content_type": null, "inner1": null, - "typ": "int", + "kind": "int", "inner2": null } }, @@ -31,7 +31,7 @@ "spectacle" ], "inner1": null, - "typ": "model", + "kind": "model", "inner2": null } }, @@ -44,7 +44,7 @@ "spectaclerevente" ], "inner1": null, - "typ": "model", + "kind": "model", "inner2": null } }, @@ -57,7 +57,7 @@ "site" ], "inner1": null, - "typ": "model", + "kind": "model", "inner2": null } }, @@ -70,7 +70,7 @@ "petitcoursdemande" ], "inner1": null, - "typ": "model", + "kind": "model", "inner2": null } }, @@ -80,7 +80,7 @@ "fields": { "content_type": null, "inner1": null, - "typ": "list", + "kind": "list", "inner2": null } }, @@ -90,7 +90,7 @@ "fields": { "content_type": null, "inner1": 1, - "typ": "list", + "kind": "list", "inner2": null } }, @@ -100,7 +100,7 @@ "fields": { "content_type": null, "inner1": null, - "typ": "pair", + "kind": "pair", "inner2": 8 } }, @@ -110,7 +110,7 @@ "fields": { "content_type": null, "inner1": 9, - "typ": "list", + "kind": "list", "inner2": null } }, @@ -120,7 +120,7 @@ "fields": { "content_type": null, "inner1": 3, - "typ": "list", + "kind": "list", "inner2": null } }, @@ -261,7 +261,7 @@ "name": "member", "description": "Utilisateur de GestioCOF", "custommail": 1, - "typ": 1 + "type": 1 } }, { @@ -271,7 +271,7 @@ "name": "member", "description": "Utilisateur ayant eu une place pour ce spectacle", "custommail": 2, - "typ": 1 + "type": 1 } }, { @@ -281,7 +281,7 @@ "name": "show", "description": "Spectacle", "custommail": 2, - "typ": 3 + "type": 3 } }, { @@ -291,7 +291,7 @@ "name": "nb_attr", "description": "Nombre de places obtenues", "custommail": 2, - "typ": 2 + "type": 2 } }, { @@ -301,7 +301,7 @@ "name": "revente", "description": "Revente mentionn\u00e9e dans le mail", "custommail": 3, - "typ": 4 + "type": 4 } }, { @@ -311,7 +311,7 @@ "name": "member", "description": "Personne int\u00e9ress\u00e9e par la place", "custommail": 3, - "typ": 1 + "type": 1 } }, { @@ -321,7 +321,7 @@ "name": "show", "description": "Spectacle", "custommail": 3, - "typ": 3 + "type": 3 } }, { @@ -331,7 +331,7 @@ "name": "site", "description": "Site web (gestioCOF)", "custommail": 3, - "typ": 5 + "type": 5 } }, { @@ -341,7 +341,7 @@ "name": "site", "description": "Site web (gestioCOF)", "custommail": 4, - "typ": 5 + "type": 5 } }, { @@ -351,7 +351,7 @@ "name": "show", "description": "Spectacle", "custommail": 4, - "typ": 3 + "type": 3 } }, { @@ -361,7 +361,7 @@ "name": "member", "description": "Personne int\u00e9ress\u00e9e par la place", "custommail": 4, - "typ": 1 + "type": 1 } }, { @@ -371,7 +371,7 @@ "name": "acheteur", "description": "Gagnant-e du tirage", "custommail": 5, - "typ": 1 + "type": 1 } }, { @@ -381,7 +381,7 @@ "name": "vendeur", "description": "Personne qui vend une place", "custommail": 5, - "typ": 1 + "type": 1 } }, { @@ -391,7 +391,7 @@ "name": "show", "description": "Spectacle", "custommail": 5, - "typ": 3 + "type": 3 } }, { @@ -401,7 +401,7 @@ "name": "show", "description": "Spectacle", "custommail": 6, - "typ": 3 + "type": 3 } }, { @@ -411,7 +411,7 @@ "name": "vendeur", "description": "Personne qui vend une place", "custommail": 6, - "typ": 1 + "type": 1 } }, { @@ -421,7 +421,7 @@ "name": "acheteur", "description": "Personne inscrite au tirage qui n'a pas eu la place", "custommail": 6, - "typ": 1 + "type": 1 } }, { @@ -431,7 +431,7 @@ "name": "acheteur", "description": "Gagnant-e du tirage", "custommail": 7, - "typ": 1 + "type": 1 } }, { @@ -441,7 +441,7 @@ "name": "vendeur", "description": "Personne qui vend une place", "custommail": 7, - "typ": 1 + "type": 1 } }, { @@ -451,7 +451,7 @@ "name": "show", "description": "Spectacle", "custommail": 7, - "typ": 3 + "type": 3 } }, { @@ -461,7 +461,7 @@ "name": "show", "description": "Spectacle", "custommail": 8, - "typ": 3 + "type": 3 } }, { @@ -471,7 +471,7 @@ "name": "vendeur", "description": "Personne qui vend la place", "custommail": 8, - "typ": 1 + "type": 1 } }, { @@ -481,7 +481,7 @@ "name": "revente", "description": "Revente mentionn\u00e9e dans le mail", "custommail": 8, - "typ": 4 + "type": 4 } }, { @@ -491,7 +491,7 @@ "name": "vendeur", "description": "Personne qui vend la place", "custommail": 9, - "typ": 1 + "type": 1 } }, { @@ -501,7 +501,7 @@ "name": "show", "description": "Spectacle", "custommail": 9, - "typ": 3 + "type": 3 } }, { @@ -511,7 +511,7 @@ "name": "acheteur", "description": "Personne qui prend la place au shotgun", "custommail": 9, - "typ": 1 + "type": 1 } }, { @@ -521,7 +521,7 @@ "name": "demande", "description": "Demande de petit cours", "custommail": 10, - "typ": 6 + "type": 6 } }, { @@ -531,7 +531,7 @@ "name": "matieres", "description": "Liste des mati\u00e8res concern\u00e9es par la demande", "custommail": 10, - "typ": 7 + "type": 7 } }, { @@ -541,7 +541,7 @@ "name": "proposals", "description": "Liste associant une liste d'enseignants \u00e0 chaque mati\u00e8re", "custommail": 11, - "typ": 10 + "type": 10 } }, { @@ -551,7 +551,7 @@ "name": "unsatisfied", "description": "Liste des mati\u00e8res pour lesquelles on n'a pas d'enseigant \u00e0 proposer", "custommail": 11, - "typ": 7 + "type": 7 } }, { @@ -561,7 +561,7 @@ "name": "places", "description": "Places de spectacle du participant", "custommail": 12, - "typ": 11 + "type": 11 } }, { @@ -571,7 +571,7 @@ "name": "member", "description": "Participant du tirage au sort", "custommail": 12, - "typ": 1 + "type": 1 } }, { @@ -581,7 +581,7 @@ "name": "member", "description": "Participant du tirage au sort", "custommail": 13, - "typ": 1 + "type": 1 } } ] From c72393d52158970bba69fceac39d9143181e2cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 24 Dec 2016 15:57:56 +0100 Subject: [PATCH 009/213] Update readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index db2cc93b..002c1253 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,9 @@ Il ne vous reste plus qu'à initialiser les modèles de Django avec la commande python manage.py migrate +Charger les mails indispensables au bon fonctionnement de GestioCOF : + + python manage.py syncmails Une base de donnée pré-remplie est disponible en lançant la commande : From 3c7558c853f62185e5d0d17b49d15f29279faeb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 25 Dec 2016 02:02:22 +0100 Subject: [PATCH 010/213] The end of Clipper GestioCOF fetches the clipper accounts from an LDAP database and doesn't need to store clippers in a table anymore. --- cof/settings_dev.py | 6 +- cof/urls.py | 7 +- gestioncof/autocomplete.py | 63 ++++++++------ gestioncof/migrations/0009_delete_clipper.py | 17 ++++ gestioncof/models.py | 13 --- gestioncof/templates/autocomplete_user.html | 2 +- gestioncof/templatetags/utils.py | 4 +- gestioncof/views.py | 23 ++--- kfet/autocomplete.py | 84 ++++++++++--------- .../kfet/account_create_autocomplete.html | 2 +- kfet/urls.py | 3 +- kfet/views.py | 22 +++-- requirements.txt | 1 + 13 files changed, 133 insertions(+), 114 deletions(-) create mode 100644 gestioncof/migrations/0009_delete_clipper.py diff --git a/cof/settings_dev.py b/cof/settings_dev.py index 610ae549..79e82c4c 100644 --- a/cof/settings_dev.py +++ b/cof/settings_dev.py @@ -9,10 +9,6 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.8/ref/settings/ """ -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os @@ -165,6 +161,8 @@ AUTHENTICATION_BACKENDS = ( 'gestioncof.shared.COFCASBackend', ) +# LDAP_SERVER_URL = 'ldaps://ldap.spi.ens.fr:636' + # EMAIL_HOST="nef.ens.fr" RECAPTCHA_PUBLIC_KEY = "DUMMY" diff --git a/cof/urls.py b/cof/urls.py index b4c4da3c..7ec728da 100644 --- a/cof/urls.py +++ b/cof/urls.py @@ -4,10 +4,6 @@ Fichier principal de configuration des urls du projet GestioCOF """ -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import autocomplete_light from django.conf import settings @@ -61,7 +57,8 @@ urlpatterns = [ name='password_change_done'), # Inscription d'un nouveau membre url(r'^registration$', gestioncof_views.registration), - url(r'^registration/clipper/(?P[\w-]+)$', + url(r'^registration/clipper/(?P[\w-]+)/' + r'(?P.*)$', gestioncof_views.registration_form2, name="clipper-registration"), url(r'^registration/user/(?P.+)$', gestioncof_views.registration_form2, name="user-registration"), diff --git a/gestioncof/autocomplete.py b/gestioncof/autocomplete.py index ed0a1e5a..738d484f 100644 --- a/gestioncof/autocomplete.py +++ b/gestioncof/autocomplete.py @@ -1,15 +1,14 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from ldap3 import Connection from django import shortcuts from django.http import Http404 from django.db.models import Q - from django.contrib.auth.models import User -from gestioncof.models import CofProfile, Clipper +from django.conf import settings + +from gestioncof.models import CofProfile from gestioncof.decorators import buro_required @@ -25,37 +24,49 @@ def autocomplete(request): queries = {} bits = q.split() + # Fetching data from User and CofProfile tables queries['members'] = CofProfile.objects.filter(Q(is_cof=True)) queries['users'] = User.objects.filter(Q(profile__is_cof=False)) - queries['clippers'] = Clipper.objects for bit in bits: queries['members'] = queries['members'].filter( - Q(user__first_name__icontains=bit) - | Q(user__last_name__icontains=bit) - | Q(user__username__icontains=bit) - | Q(login_clipper__icontains=bit)) + Q(user__first_name__icontains=bit) + | Q(user__last_name__icontains=bit) + | Q(user__username__icontains=bit) + | Q(login_clipper__icontains=bit)) queries['users'] = queries['users'].filter( - Q(first_name__icontains=bit) - | Q(last_name__icontains=bit) - | Q(username__icontains=bit)) - queries['clippers'] = queries['clippers'].filter( - Q(fullname__icontains=bit) - | Q(username__icontains=bit)) + Q(first_name__icontains=bit) + | Q(last_name__icontains=bit) + | Q(username__icontains=bit)) queries['members'] = queries['members'].distinct() queries['users'] = queries['users'].distinct() - usernames = list(queries['members'].values_list('login_clipper', - flat='True')) \ + + # Clearing redundancies + usernames = ( + list(queries['members'].values_list('login_clipper', flat='True')) + list(queries['users'].values_list('profile__login_clipper', flat='True')) - queries['clippers'] = queries['clippers'] \ - .exclude(username__in=usernames).distinct() - # add clippers + ) + # Fetching data from the SPI + if hasattr(settings, 'LDAP_SERVER_URL'): + # Fetching + ldap_query = '(|{:s})'.format(''.join( + ['(cn=*{:s}*)'.format(bit) for bit in bits] + )) + with Connection(settings.LDAP_SERVER_URL) as conn: + queries['clippers'] = conn.search( + 'dc=spi,dc=ens,dc=fr', query, + attributes=['uid', 'cn'] + ) + # Clearing redundancies + queries['clippers'] = [ + {'clipper': clipper.uid, 'fullname': clipper.cn} + for clipper in queries['clippers'] + if clipper.uid not in usernames + ] + + # Resulting data data.update(queries) - - options = 0 - for query in queries.values(): - options += len(query) - data['options'] = options + data['options'] = sum([len(query) for query in queries]) return shortcuts.render(request, "autocomplete_user.html", data) diff --git a/gestioncof/migrations/0009_delete_clipper.py b/gestioncof/migrations/0009_delete_clipper.py new file mode 100644 index 00000000..e537107b --- /dev/null +++ b/gestioncof/migrations/0009_delete_clipper.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestioncof', '0008_py3'), + ] + + operations = [ + migrations.DeleteModel( + name='Clipper', + ), + ] diff --git a/gestioncof/models.py b/gestioncof/models.py index 19590aff..fa9d943a 100644 --- a/gestioncof/models.py +++ b/gestioncof/models.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - from django.db import models from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ @@ -258,15 +254,6 @@ class SurveyAnswer(models.Model): self.survey.title) -@python_2_unicode_compatible -class Clipper(models.Model): - username = models.CharField("Identifiant", max_length=20) - fullname = models.CharField("Nom complet", max_length=200) - - def __str__(self): - return "Clipper %s" % self.username - - @python_2_unicode_compatible class CalendarSubscription(models.Model): token = models.UUIDField() diff --git a/gestioncof/templates/autocomplete_user.html b/gestioncof/templates/autocomplete_user.html index 26411eee..face824d 100644 --- a/gestioncof/templates/autocomplete_user.html +++ b/gestioncof/templates/autocomplete_user.html @@ -15,7 +15,7 @@ {% if clippers %}
  • Utilisateurs clipper
  • {% for clipper in clippers %}{% if forloop.counter < 5 %} -
  • {{ clipper|highlight_clipper:q }}
  • +
  • {{ clipper|highlight_clipper:q }}
  • {% elif forloop.counter == 5 %}
  • ...{% endif %}{% endfor %} {% endif %} diff --git a/gestioncof/templatetags/utils.py b/gestioncof/templatetags/utils.py index 16a1f4e3..90855165 100644 --- a/gestioncof/templatetags/utils.py +++ b/gestioncof/templatetags/utils.py @@ -43,7 +43,7 @@ def highlight_user(user, q): @register.filter def highlight_clipper(clipper, q): if clipper.fullname: - text = "%s (%s)" % (clipper.fullname, clipper.username) + text = "%s (%s)" % (clipper.fullname, clipper.clipper) else: - text = clipper.username + text = clipper.clipper return highlight_text(text, q) diff --git a/gestioncof/views.py b/gestioncof/views.py index 3bc8c2f9..9ed62682 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import unicodecsv import uuid from datetime import timedelta @@ -25,7 +21,7 @@ from gestioncof.models import Event, EventRegistration, EventOption, \ from gestioncof.models import EventCommentField, EventCommentValue, \ CalendarSubscription from gestioncof.shared import send_custom_mail -from gestioncof.models import CofProfile, Clipper, Club +from gestioncof.models import CofProfile, Club from gestioncof.decorators import buro_required, cof_required from gestioncof.forms import UserProfileForm, EventStatusFilterForm, \ SurveyForm, SurveyStatusFilterForm, RegistrationUserForm, \ @@ -321,11 +317,10 @@ def registration_set_ro_fields(user_form, profile_form): @buro_required -def registration_form2(request, login_clipper=None, username=None): +def registration_form2(request, login_clipper=None, username=None, fullname=None): events = Event.objects.filter(old=False).all() member = None if login_clipper: - clipper = get_object_or_404(Clipper, username=login_clipper) try: # check if the given user is already registered member = User.objects.get(username=login_clipper) username = member.username @@ -336,8 +331,8 @@ def registration_form2(request, login_clipper=None, username=None): user_form = RegistrationUserForm(initial={ 'username': login_clipper, 'email': "%s@clipper.ens.fr" % login_clipper}) - if clipper.fullname: - bits = clipper.fullname.split(" ") + if fullname: + bits = fullname.split(" ") user_form.fields['first_name'].initial = bits[0] if len(bits) > 1: user_form.fields['last_name'].initial = " ".join(bits[1:]) @@ -412,12 +407,12 @@ def registration(request): try: member = User.objects.get(username=username) user_form = RegistrationUserForm(request_dict, instance=member) - except User.DoesNotExist: - try: - clipper = Clipper.objects.get(username=username) - login_clipper = clipper.username - except Clipper.DoesNotExist: + if member.profile.login_clipper: + login_clipper = member.profile.login_clipper + else: user_form.force_long_username() + except User.DoesNotExist: + user_form.force_long_username() else: user_form.force_long_username() diff --git a/kfet/autocomplete.py b/kfet/autocomplete.py index 2a24a51e..b8b2e841 100644 --- a/kfet/autocomplete.py +++ b/kfet/autocomplete.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- -from __future__ import (absolute_import, division, - print_function, unicode_literals) -from builtins import * +import ldap3 from django.shortcuts import render from django.http import Http404 from django.db.models import Q -from gestioncof.models import User, Clipper +from django.conf import settings + +from gestioncof.models import User from kfet.decorators import teamkfet_required from kfet.models import Account @@ -25,58 +25,66 @@ def account_create(request): queries = {} search_words = q.split() + # Fetching data from User, CofProfile and Account tables queries['kfet'] = Account.objects queries['users_cof'] = User.objects.filter(Q(profile__is_cof = True)) queries['users_notcof'] = User.objects.filter(Q(profile__is_cof = False)) - queries['clippers'] = Clipper.objects for word in search_words: queries['kfet'] = queries['kfet'].filter( - Q(cofprofile__user__username__icontains = word) - | Q(cofprofile__user__first_name__icontains = word) - | Q(cofprofile__user__last_name__icontains = word) - ) + Q(cofprofile__user__username__icontains = word) + | Q(cofprofile__user__first_name__icontains = word) + | Q(cofprofile__user__last_name__icontains = word) + ) queries['users_cof'] = queries['users_cof'].filter( - Q(username__icontains = word) - | Q(first_name__icontains = word) - | Q(last_name__icontains = word) - ) + Q(username__icontains = word) + | Q(first_name__icontains = word) + | Q(last_name__icontains = word) + ) queries['users_notcof'] = queries['users_notcof'].filter( - Q(username__icontains = word) - | Q(first_name__icontains = word) - | Q(last_name__icontains = word) - ) - queries['clippers'] = queries['clippers'].filter( - Q(username__icontains = word) - | Q(fullname__icontains = word) - ) + Q(username__icontains = word) + | Q(first_name__icontains = word) + | Q(last_name__icontains = word) + ) + # Clearing redundancies queries['kfet'] = queries['kfet'].distinct() - - usernames = list( \ + usernames = list( queries['kfet'].values_list('cofprofile__user__username', flat=True)) + queries['kfet'] = [ + (account, account.cofprofile.user) + for account in queries['kfet'] + ] - queries['kfet'] = [ (account, account.cofprofile.user) \ - for account in queries['kfet'] ] - - queries['users_cof'] = \ + queries['users_cof'] = \ queries['users_cof'].exclude(username__in=usernames).distinct() - queries['users_notcof'] = \ + queries['users_notcof'] = \ queries['users_notcof'].exclude(username__in=usernames).distinct() - - usernames += list( \ + usernames += list( queries['users_cof'].values_list('username', flat=True)) - usernames += list( \ + usernames += list( queries['users_notcof'].values_list('username', flat=True)) - queries['clippers'] = \ - queries['clippers'].exclude(username__in=usernames).distinct() + # Fetching data from the SPI + if hasattr(settings, 'LDAP_SERVER_URL'): + # Fetching + ldap_query = '(|{:s})'.format(''.join( + ['(cn=*{:s}*)'.format(bit) for bit in bits] + )) + with Connection(settings.LDAP_SERVER_URL) as conn: + queries['clippers'] = conn.search( + 'dc=spi,dc=ens,dc=fr', ldap_query, + attributes=['uid', 'cn'] + ) + # Clearing redundancies + queries['clippers'] = [ + {'clipper': clipper.uid, 'fullname': clipper.cn} + for clipper in queries['clippers'] + if clipper.uid not in usernames + ] + # Resulting data data.update(queries) - - options = 0 - for query in queries.values(): - options += len(query) - data['options'] = options + data['options'] = sum([len(query) for query in queries]) return render(request, "kfet/account_create_autocomplete.html", data) diff --git a/kfet/templates/kfet/account_create_autocomplete.html b/kfet/templates/kfet/account_create_autocomplete.html index 1185c3a8..2f326801 100644 --- a/kfet/templates/kfet/account_create_autocomplete.html +++ b/kfet/templates/kfet/account_create_autocomplete.html @@ -36,7 +36,7 @@
  • Utilisateurs clipper
  • {% for clipper in clippers %}
  • - + {{ clipper|highlight_clipper:q }}
  • diff --git a/kfet/urls.py b/kfet/urls.py index 9b9ebf21..d54349d4 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -35,7 +35,8 @@ urlpatterns = [ name = 'kfet.account.create_special'), url(r'^accounts/new/user/(?P.+)$', views.account_create_ajax, name = 'kfet.account.create.fromuser'), - url(r'^accounts/new/clipper/(?P.+)$', views.account_create_ajax, + url(r'^accounts/new/clipper/(?P[\w-]+)/(?P.*)$', + views.account_create_ajax, name = 'kfet.account.create.fromclipper'), url(r'^accounts/new/empty$', views.account_create_ajax, name = 'kfet.account.create.empty'), diff --git a/kfet/views.py b/kfet/views.py index 3f1e1f4d..df7d5821 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -22,7 +22,7 @@ from django.db.models import F, Sum, Prefetch, Count, Func from django.db.models.functions import Coalesce from django.utils import timezone from django.utils.crypto import get_random_string -from gestioncof.models import CofProfile, Clipper +from gestioncof.models import CofProfile from kfet.decorators import teamkfet_required from kfet.models import (Account, Checkout, Article, Settings, AccountNegative, CheckoutStatement, GenericTeamToken, Supplier, SupplierArticle, Inventory, @@ -216,19 +216,20 @@ def account_form_set_readonly_fields(user_form, cof_form): cof_form.fields['login_clipper'].widget.attrs['readonly'] = True cof_form.fields['is_cof'].widget.attrs['disabled'] = True -def get_account_create_forms(request=None, username=None, login_clipper=None): +def get_account_create_forms(request=None, username=None, login_clipper=None, + fullname=None): user = None - clipper = None + clipper = False if login_clipper and (login_clipper == username or not username): # à partir d'un clipper # le user associé à ce clipper ne devrait pas encore exister - clipper = get_object_or_404(Clipper, username = login_clipper) + clipper = True try: # Vérification que clipper ne soit pas déjà dans User user = User.objects.get(username=login_clipper) # Ici, on nous a menti, le user existe déjà username = user.username - clipper = None + clipper = False except User.DoesNotExist: # Clipper (sans user déjà existant) @@ -236,9 +237,9 @@ def get_account_create_forms(request=None, username=None, login_clipper=None): user_initial = { 'username' : login_clipper, 'email' : "%s@clipper.ens.fr" % login_clipper} - if clipper.fullname: + if fullname: # Prefill du nom et prénom - names = clipper.fullname.split() + names = fullname.split() # Le premier, c'est le prénom user_initial['first_name'] = names[0] if len(names) > 1: @@ -302,8 +303,11 @@ def get_account_create_forms(request=None, username=None, login_clipper=None): @login_required @teamkfet_required -def account_create_ajax(request, username=None, login_clipper=None): - forms = get_account_create_forms(request=None, username=username, login_clipper=login_clipper) +def account_create_ajax(request, username=None, login_clipper=None, + fullname=None): + forms = get_account_create_forms( + request=None, username=username, login_clipper=login_clipper, + fullname=fullname) return render(request, "kfet/account_create_form.html", { 'account_form' : forms['account_form'], 'cof_form' : forms['cof_form'], diff --git a/requirements.txt b/requirements.txt index f7f6deca..6f7155e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,3 +18,4 @@ git+https://github.com/Aureplop/channels.git#egg=channel statistics==1.0.3.5 future==0.15.2 django-widget-tweaks==1.4.1 +ldap3 From 01ce9557847e1d8123ef7a0ecf776f52be5a949e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 25 Dec 2016 12:27:42 +0100 Subject: [PATCH 011/213] Fixes - Fixes bugs - Removes useless scripts --- gestioncof/autocomplete.py | 7 ++++--- kfet/autocomplete.py | 12 ++++++++++-- sync_clipper.py | 34 ---------------------------------- sync_clipper.sh | 2 -- 4 files changed, 14 insertions(+), 41 deletions(-) delete mode 100644 sync_clipper.py delete mode 100644 sync_clipper.sh diff --git a/gestioncof/autocomplete.py b/gestioncof/autocomplete.py index 738d484f..e8071e08 100644 --- a/gestioncof/autocomplete.py +++ b/gestioncof/autocomplete.py @@ -54,13 +54,14 @@ def autocomplete(request): ['(cn=*{:s}*)'.format(bit) for bit in bits] )) with Connection(settings.LDAP_SERVER_URL) as conn: - queries['clippers'] = conn.search( - 'dc=spi,dc=ens,dc=fr', query, + conn.search( + 'dc=spi,dc=ens,dc=fr', ldap_query, attributes=['uid', 'cn'] ) + queries['clippers'] = conn.entries # Clearing redundancies queries['clippers'] = [ - {'clipper': clipper.uid, 'fullname': clipper.cn} + Clipper(clipper.uid, clipper.cn) for clipper in queries['clippers'] if clipper.uid not in usernames ] diff --git a/kfet/autocomplete.py b/kfet/autocomplete.py index b8b2e841..31f36943 100644 --- a/kfet/autocomplete.py +++ b/kfet/autocomplete.py @@ -11,6 +11,13 @@ from gestioncof.models import User from kfet.decorators import teamkfet_required from kfet.models import Account + +class Clipper(object): + def __init__(self, clipper, fullname): + self.clipper = clipper + self.fullname = fullname + + @teamkfet_required def account_create(request): if "q" not in request.GET: @@ -72,13 +79,14 @@ def account_create(request): ['(cn=*{:s}*)'.format(bit) for bit in bits] )) with Connection(settings.LDAP_SERVER_URL) as conn: - queries['clippers'] = conn.search( + conn.search( 'dc=spi,dc=ens,dc=fr', ldap_query, attributes=['uid', 'cn'] ) + queries['clippers'] = conn.entries # Clearing redundancies queries['clippers'] = [ - {'clipper': clipper.uid, 'fullname': clipper.cn} + Clipper(clipper.uid, clipper.cn) for clipper in queries['clippers'] if clipper.uid not in usernames ] diff --git a/sync_clipper.py b/sync_clipper.py deleted file mode 100644 index d9620b2d..00000000 --- a/sync_clipper.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - -import os -import sys - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cof.settings") - - from gestioncof.models import Clipper - current = {} - print("[ FETCHING ]") - for clipper in Clipper.objects.all(): - current[clipper.username] = clipper - print("[ SYNCING ]") - for line in sys.stdin: - bits = line.split(":") - username = bits[0] - fullname = bits[4] - if username in current: - clipper = current[username] - if clipper.fullname != fullname: - clipper.fullname = fullname - clipper.save() - print("Updated", username) - else: - clipper = Clipper(username=username, fullname=fullname) - clipper.save() - print("Created", username) - print("[ DONE ]") diff --git a/sync_clipper.sh b/sync_clipper.sh deleted file mode 100644 index dc996d30..00000000 --- a/sync_clipper.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -ssh cof@sas.eleves.ens.fr ypcat passwd | python sync_clipper.py From cff4f176c064e527bed07b6a2e0151e3fee14048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 25 Dec 2016 12:29:53 +0100 Subject: [PATCH 012/213] typo --- gestioncof/autocomplete.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gestioncof/autocomplete.py b/gestioncof/autocomplete.py index e8071e08..cc6b49ee 100644 --- a/gestioncof/autocomplete.py +++ b/gestioncof/autocomplete.py @@ -12,6 +12,12 @@ from gestioncof.models import CofProfile from gestioncof.decorators import buro_required +class Clipper(object): + def __init__(self, clipper, fullname): + self.clipper = clipper + self.fullname = fullname + + @buro_required def autocomplete(request): if "q" not in request.GET: From c355c71fe57932ac5a5264f450271a88b1daf980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 6 Jan 2017 17:13:57 +0100 Subject: [PATCH 013/213] Completion starts only when we have 3 characters --- gestioncof/autocomplete_light_registry.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/gestioncof/autocomplete_light_registry.py b/gestioncof/autocomplete_light_registry.py index f2a2ca6e..2573df10 100644 --- a/gestioncof/autocomplete_light_registry.py +++ b/gestioncof/autocomplete_light_registry.py @@ -1,13 +1,10 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import autocomplete_light from django.contrib.auth.models import User autocomplete_light.register( User, search_fields=('username', 'first_name', 'last_name'), - autocomplete_js_attributes={'placeholder': 'membre...'}) + autocomplete_js_attributes={'placeholder': 'membre...'}, + widget_attrs={'data-widget-minimum-values': 3}) From 0d09bf62afedfb9ba78343ecab64715a79ac4669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 6 Jan 2017 17:26:35 +0100 Subject: [PATCH 014/213] Completion starts only when we have 3 characters And this time it works --- gestioncof/autocomplete_light_registry.py | 4 ++-- gestioncof/templates/registration.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gestioncof/autocomplete_light_registry.py b/gestioncof/autocomplete_light_registry.py index 2573df10..4c62d995 100644 --- a/gestioncof/autocomplete_light_registry.py +++ b/gestioncof/autocomplete_light_registry.py @@ -6,5 +6,5 @@ from django.contrib.auth.models import User autocomplete_light.register( User, search_fields=('username', 'first_name', 'last_name'), - autocomplete_js_attributes={'placeholder': 'membre...'}, - widget_attrs={'data-widget-minimum-values': 3}) + attrs={'placeholder': 'membre...'} +) diff --git a/gestioncof/templates/registration.html b/gestioncof/templates/registration.html index 4f15a4b7..c7f322e6 100644 --- a/gestioncof/templates/registration.html +++ b/gestioncof/templates/registration.html @@ -18,7 +18,7 @@ $(document).ready(function() { $('input#search_autocomplete').yourlabsAutocomplete({ url: '{% url 'gestioncof.autocomplete.autocomplete' %}', - minimumCharacters: 1, + minimumCharacters: 3, id: 'search_autocomplete', choiceSelector: 'li:has(a)', placeholder: "Chercher un utilisateur par nom, prénom ou identifiant clipper", From 4f66f161b076f5fa183e8b23f23afdd22465ee27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 6 Jan 2017 18:19:15 +0100 Subject: [PATCH 015/213] =?UTF-8?q?Rend=20la=20page=20=C3=A9tat=20des=20de?= =?UTF-8?q?mandes/ratios=20coh=C3=A9rente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Le nombre total de demandes affiché est désormais le nombre de places demandées et non le nombre de personnes ayant fait des demandes. Ainsi ce nombre correspond à la somme des totaux par spectacle affiché - Au passage, on déplace le template de cette vue dans un dossier plus adéquat et on ajoute une docstring sur la vue. --- bda/templates/{ => bda}/etat-places.html | 2 +- bda/views.py | 25 ++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) rename bda/templates/{ => bda}/etat-places.html (95%) diff --git a/bda/templates/etat-places.html b/bda/templates/bda/etat-places.html similarity index 95% rename from bda/templates/etat-places.html rename to bda/templates/bda/etat-places.html index 4aa72ba1..7fb579e6 100644 --- a/bda/templates/etat-places.html +++ b/bda/templates/bda/etat-places.html @@ -38,7 +38,7 @@ {% endfor %} - Total : {{ total }} demandes + Total : {{ total }} places demandées - - - + + {% endblock %} diff --git a/bda/templates/resume_inscription.html b/bda/templates/bda/resume-inscription-tirage.html similarity index 100% rename from bda/templates/resume_inscription.html rename to bda/templates/bda/resume-inscription-tirage.html diff --git a/bda/views.py b/bda/views.py index 6ae2b7cc..3c448f34 100644 --- a/bda/views.py +++ b/bda/views.py @@ -124,14 +124,14 @@ def inscription(request, tirage_id): tirage = get_object_or_404(Tirage, id=tirage_id) if timezone.now() < tirage.ouverture: error_desc = tirage.ouverture.strftime('Ouverture le %d %b %Y à %H:%M') - return render(request, 'resume_inscription.html', + return render(request, 'bda/resume-inscription-tirage.html', {"error_title": "Le tirage n'est pas encore ouvert !", "error_description": error_desc}) if timezone.now() > tirage.fermeture: participant, created = Participant.objects.get_or_create( user=request.user, tirage=tirage) choices = participant.choixspectacle_set.order_by("priority").all() - return render(request, "resume_inscription.html", + return render(request, "bda/resume-inscription-tirage.html", {"error_title": "C'est fini !", "error_description": "Tirage au sort dans la journée !", @@ -170,7 +170,7 @@ def inscription(request, tirage_id): total_price += choice.spectacle.price if choice.double: total_price += choice.spectacle.price - return render(request, "inscription-bda.html", + return render(request, "bda/inscription-tirage.html", {"formset": formset, "success": success, "total_price": total_price, From 1b82b2300a112c472758807ea709cc3f93769f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 8 Jan 2017 20:26:02 +0100 Subject: [PATCH 018/213] Typo et suppression de la py2 compat --- bda/models.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/bda/models.py b/bda/models.py index d1d4c2fd..f9087ac1 100644 --- a/bda/models.py +++ b/bda/models.py @@ -11,10 +11,8 @@ from django.template import loader from django.core import mail from django.conf import settings from django.utils import timezone, formats -from django.utils.encoding import python_2_unicode_compatible -@python_2_unicode_compatible class Tirage(models.Model): title = models.CharField("Titre", max_length=300) ouverture = models.DateTimeField("Date et heure d'ouverture du tirage") @@ -29,7 +27,6 @@ class Tirage(models.Model): timezone.template_localtime(self.fermeture))) -@python_2_unicode_compatible class Salle(models.Model): name = models.CharField("Nom", max_length=300) address = models.TextField("Adresse") @@ -38,7 +35,6 @@ class Salle(models.Model): return self.name -@python_2_unicode_compatible class CategorieSpectacle(models.Model): name = models.CharField('Nom', max_length=100, unique=True) @@ -137,7 +133,6 @@ PAYMENT_TYPES = ( ) -@python_2_unicode_compatible class Participant(models.Model): user = models.ForeignKey(User) choices = models.ManyToManyField(Spectacle, @@ -165,7 +160,6 @@ DOUBLE_CHOICES = ( ) -@python_2_unicode_compatible class ChoixSpectacle(models.Model): participant = models.ForeignKey(Participant) spectacle = models.ForeignKey(Spectacle, related_name="participants") @@ -184,7 +178,7 @@ class ChoixSpectacle(models.Model): def __str__(self): return "Vœux de %s pour %s" % ( - self.participant.user.get_full_name, + self.participant.user.get_full_name(), self.spectacle.title) class Meta: @@ -194,7 +188,6 @@ class ChoixSpectacle(models.Model): verbose_name_plural = "voeux" -@python_2_unicode_compatible class Attribution(models.Model): participant = models.ForeignKey(Participant) spectacle = models.ForeignKey(Spectacle, related_name="attribues") @@ -205,7 +198,6 @@ class Attribution(models.Model): self.spectacle.date) -@python_2_unicode_compatible class SpectacleRevente(models.Model): attribution = models.OneToOneField(Attribution, related_name="revente") From 84f9b80f095570e2ad9595c5e9a089170ed8bb74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 9 Jan 2017 16:41:49 +0100 Subject: [PATCH 019/213] On ne met pas root dans la fixture users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elle est chargée dans la BDD sur dev.cof… --- gestioncof/fixtures/users.json | 39 ---------------------------------- 1 file changed, 39 deletions(-) diff --git a/gestioncof/fixtures/users.json b/gestioncof/fixtures/users.json index 11fd1af3..eb29443a 100644 --- a/gestioncof/fixtures/users.json +++ b/gestioncof/fixtures/users.json @@ -1099,24 +1099,6 @@ }, "pk": 61 }, -{ - "model": "auth.user", - "fields": { - "username": "root", - "is_superuser": true, - "last_login": "2017-01-02T22:45:13.714Z", - "first_name": "super", - "email": "root@localhost", - "is_active": true, - "is_staff": true, - "groups": [], - "user_permissions": [], - "password": "pbkdf2_sha256$20000$VvciMymgIIWQ$rj76UrLl4uKZTzFqXY0un6lntjYADqiuXbWuNUJFpCE=", - "last_name": "user", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 62 -}, { "model": "auth.user", "fields": { @@ -4234,27 +4216,6 @@ }, "pk": 61 }, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 62, - "type_cotiz": "normalien", - "user": 62, - "comments": "Super utilisateur", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": true, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 62 -}, { "model": "gestioncof.cofprofile", "fields": { From 5fa0618ad32f6f9a1e1acb850f5ea91c7a915100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 10 Jan 2017 11:46:23 +0100 Subject: [PATCH 020/213] Message pour moldu Fixes #29 --- gestioncof/templates/utile_cof.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gestioncof/templates/utile_cof.html b/gestioncof/templates/utile_cof.html index 51180390..ebcedf45 100644 --- a/gestioncof/templates/utile_cof.html +++ b/gestioncof/templates/utile_cof.html @@ -17,4 +17,8 @@
  • Export des orgas uniquement
  • Export de tout le monde
  • + +

    Note : pour ouvrir les fichiers .csv avec Excell, il faut + passer par Fichier > Importer et sélectionner la + virgule comme séparateur.

    {% endblock %} From 3e96c982f9b47c3d9c1f9ef0b1a304e0a6221c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 10 Jan 2017 23:07:27 +0100 Subject: [PATCH 021/213] Fix urls in production --- bda/templates/bda/mails/revente.txt | 2 +- bda/templates/bda/mails/shotgun.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bda/templates/bda/mails/revente.txt b/bda/templates/bda/mails/revente.txt index 7efc02e5..476b10da 100644 --- a/bda/templates/bda/mails/revente.txt +++ b/bda/templates/bda/mails/revente.txt @@ -5,7 +5,7 @@ a été postée sur BdA-Revente. {% with revente.date_tirage as time %} Si ce spectacle t'intéresse toujours, merci de nous le signaler en cliquant -sur ce lien : http://{{ domain }}{% url "bda-revente-interested" revente.id %}. +sur ce lien : http://{{ domain }}/gestion{% url "bda-revente-interested" revente.id %}. Dans le cas où plusieurs personnes seraient intéressées, nous procèderons à un tirage au sort le {{ time|date:"DATE_FORMAT" }} à {{ time|time:"TIME_FORMAT" }} (dans {{time|timeuntil}}). {% endwith %} diff --git a/bda/templates/bda/mails/shotgun.txt b/bda/templates/bda/mails/shotgun.txt index 69bc704c..d4cd479f 100644 --- a/bda/templates/bda/mails/shotgun.txt +++ b/bda/templates/bda/mails/shotgun.txt @@ -5,7 +5,7 @@ a été postée sur BdA-Revente. Puisque ce spectacle a lieu dans moins de 24h, il n'y a pas de tirage au sort pour cette place : elle est disponible immédiatement à l'adresse -http://{{ domain }}{% url "bda-buy-revente" spectacle.id %}, à la disposition de tous. +http://{{ domain }}/gestion{% url "bda-buy-revente" spectacle.id %}, à la disposition de tous. Chaleureusement, Le BdA From cef40dff70ba882ad89343986b060b4954e4c87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 10 Jan 2017 23:26:11 +0100 Subject: [PATCH 022/213] Typo et renommage --- gestioncof/templates/{ => gestioncof}/utile_cof.html | 2 +- gestioncof/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename gestioncof/templates/{ => gestioncof}/utile_cof.html (98%) diff --git a/gestioncof/templates/utile_cof.html b/gestioncof/templates/gestioncof/utile_cof.html similarity index 98% rename from gestioncof/templates/utile_cof.html rename to gestioncof/templates/gestioncof/utile_cof.html index ebcedf45..ae024949 100644 --- a/gestioncof/templates/utile_cof.html +++ b/gestioncof/templates/gestioncof/utile_cof.html @@ -18,7 +18,7 @@
  • Export de tout le monde
  • -

    Note : pour ouvrir les fichiers .csv avec Excell, il faut +

    Note : pour ouvrir les fichiers .csv avec Excel, il faut passer par Fichier > Importer et sélectionner la virgule comme séparateur.

    {% endblock %} diff --git a/gestioncof/views.py b/gestioncof/views.py index 3bc8c2f9..1945f7f6 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -637,7 +637,7 @@ def export_mega(request): @buro_required def utile_cof(request): - return render(request, "utile_cof.html", {}) + return render(request, "gestioncof/utile_cof.html", {}) @buro_required From 045f3f58e56ebf6abeb026389779f470a7132aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 24 Jan 2017 20:34:53 +0100 Subject: [PATCH 023/213] =?UTF-8?q?Met=20`inscription-formset`=20=C3=A0a?= =?UTF-8?q?=20la=20bonne=20place?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bda/templates/{ => bda}/inscription-formset.html | 0 bda/templates/bda/inscription-tirage.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename bda/templates/{ => bda}/inscription-formset.html (100%) diff --git a/bda/templates/inscription-formset.html b/bda/templates/bda/inscription-formset.html similarity index 100% rename from bda/templates/inscription-formset.html rename to bda/templates/bda/inscription-formset.html diff --git a/bda/templates/bda/inscription-tirage.html b/bda/templates/bda/inscription-tirage.html index 2c54d44b..d43059e7 100644 --- a/bda/templates/bda/inscription-tirage.html +++ b/bda/templates/bda/inscription-tirage.html @@ -99,7 +99,7 @@ var django = { {% endif %}
    {% csrf_token %} - {% include "inscription-formset.html" %} + {% include "bda/inscription-formset.html" %}
    Prix total actuel : {{ total_price }}€
    From cf4a3ec64b3da6301b4a6d891921c29d377756b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 28 Jan 2017 19:46:56 +0100 Subject: [PATCH 024/213] Traitement des messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Les messages sont affichés à l'utilisateurs dans les vues de GestioCOF - On utilise une autre version de bootstrap et jquery (plus récent) Fixes #48 --- bda/templates/bda-participants.html | 2 -- bda/templates/bda/etat-places.html | 2 -- bda/templates/spectacle_list.html | 2 -- gestioncof/static/css/cof.css | 26 +++++++++++++++++++ gestioncof/templates/base.html | 12 ++++++--- gestioncof/templates/base_title.html | 2 +- .../{ => gestioncof}/base_header.html | 16 ++++++++++++ gestioncof/templates/home.html | 2 +- gestioncof/templates/registration.html | 1 - ...ment_demande_petit_cours_autre_niveau.html | 1 - 10 files changed, 53 insertions(+), 13 deletions(-) rename gestioncof/templates/{ => gestioncof}/base_header.html (60%) diff --git a/bda/templates/bda-participants.html b/bda/templates/bda-participants.html index 3efeccc3..f52e6b96 100644 --- a/bda/templates/bda-participants.html +++ b/bda/templates/bda-participants.html @@ -48,8 +48,6 @@ {% endfor %} - + {% block extra_head %}{% endblock %} diff --git a/gestioncof/templates/base_title.html b/gestioncof/templates/base_title.html index c52f29bb..2e9687dd 100644 --- a/gestioncof/templates/base_title.html +++ b/gestioncof/templates/base_title.html @@ -1,4 +1,4 @@ -{% extends "base_header.html" %} +{% extends "gestioncof/base_header.html" %} {% block interm_content %} diff --git a/gestioncof/templates/base_header.html b/gestioncof/templates/gestioncof/base_header.html similarity index 60% rename from gestioncof/templates/base_header.html rename to gestioncof/templates/gestioncof/base_header.html index baaa24b6..a7e29eb7 100644 --- a/gestioncof/templates/base_header.html +++ b/gestioncof/templates/gestioncof/base_header.html @@ -16,5 +16,21 @@

    {% if user.first_name %}{{ user.first_name }}{% else %}{{ user.username }}{% endif %}, {% if user.profile.is_cof %}au COF{% else %}non-COF{% endif %}

    +{% if messages %} + {% for message in messages %} +
    +
    +
    + + {% if 'safe' in message.tags %} + {{ message|safe }} + {% else %} + {{ message }} + {% endif %} +
    +
    +
    + {% endfor %} +{% endif %} {% block interm_content %}{% endblock %} {% endblock %} diff --git a/gestioncof/templates/home.html b/gestioncof/templates/home.html index c85cbbe1..3c0ec767 100644 --- a/gestioncof/templates/home.html +++ b/gestioncof/templates/home.html @@ -1,4 +1,4 @@ -{% extends "base_header.html" %} +{% extends "gestioncof/base_header.html" %} {% block homelink %} {% endblock %} diff --git a/gestioncof/templates/registration.html b/gestioncof/templates/registration.html index 4f15a4b7..0353b885 100644 --- a/gestioncof/templates/registration.html +++ b/gestioncof/templates/registration.html @@ -4,7 +4,6 @@ {% block page_size %}col-sm-8{% endblock %} {% block extra_head %} - {% endblock %} diff --git a/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html b/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html index f92be513..c2c7e734 100644 --- a/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html +++ b/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html @@ -16,7 +16,6 @@
    {% endif %} - {% if proposals %} {% csrf_token %} From 18b186929c849d39c0c5ee063fb6a782fbe14b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 30 Jan 2017 23:13:32 +0100 Subject: [PATCH 025/213] Dev data loaded using a django admin command - Sites, surveys, events and petits cours demands/subjects are still loaded from fixtures - The users and their subscriptions to petits cours are loaded using the `loaddevdata` command - The sub command `loadbdadevdata` is called by `loaddevdata` and populates the database with BdA related stuff : - 2 tirages - Show places - Shows - subscriptions --- bda/fixtures/bda.json | 7616 ----------------- bda/management/commands/loadbdadevdata.py | 99 + bda/management/data/locations.json | 26 + bda/management/data/shows.json | 100 + gestioncof/fixtures/gestion.json | 150 - gestioncof/fixtures/root.json | 41 - gestioncof/fixtures/users.json | 6361 -------------- gestioncof/management/base.py | 41 + gestioncof/management/commands/loaddevdata.py | 107 + gestioncof/management/data/gaulois.json | 368 + gestioncof/management/data/romains.json | 614 ++ provisioning/prepare_django.sh | 3 +- 12 files changed, 1357 insertions(+), 14169 deletions(-) delete mode 100644 bda/fixtures/bda.json create mode 100644 bda/management/commands/loadbdadevdata.py create mode 100644 bda/management/data/locations.json create mode 100644 bda/management/data/shows.json delete mode 100644 gestioncof/fixtures/root.json delete mode 100644 gestioncof/fixtures/users.json create mode 100644 gestioncof/management/base.py create mode 100644 gestioncof/management/commands/loaddevdata.py create mode 100644 gestioncof/management/data/gaulois.json create mode 100644 gestioncof/management/data/romains.json diff --git a/bda/fixtures/bda.json b/bda/fixtures/bda.json deleted file mode 100644 index bb9fd73d..00000000 --- a/bda/fixtures/bda.json +++ /dev/null @@ -1,7616 +0,0 @@ -[ -{ - "fields": { - "active": true, - "tokens": "", - "ouverture": "2016-06-14T10:00:00Z", - "fermeture": "2016-07-31T22:59:00Z", - "title": "Tirage de test 1" - }, - "model": "bda.tirage", - "pk": 1 -}, -{ - "fields": { - "active": true, - "tokens": "", - "ouverture": "2016-06-14T10:00:00Z", - "fermeture": "2016-09-01T22:59:00Z", - "title": "Tirage de test 2" - }, - "model": "bda.tirage", - "pk": 2 -}, -{ - "fields": { - "name": "Cour\u00f4", - "address": "45 rue d'Ulm, cour\u00f4" - }, - "model": "bda.salle", - "pk": 1 -}, -{ - "fields": { - "name": "K-F\u00eat", - "address": "45 rue d'Ulm, escalier C, niveau -1" - }, - "model": "bda.salle", - "pk": 2 -}, -{ - "fields": { - "name": "Th\u00e9\u00e2tre", - "address": "45 rue d'Ulm, escalier C, niveau -1" - }, - "model": "bda.salle", - "pk": 3 -}, -{ - "fields": { - "name": "Cours Pasteur", - "address": "45 rue d'Ulm, cours pasteur" - }, - "model": "bda.salle", - "pk": 4 -}, -{ - "fields": { - "name": "Salle des actes", - "address": "45 rue d'Ulm, escalier A, niveau 1" - }, - "model": "bda.salle", - "pk": 5 -}, -{ - "fields": { - "name": "Amphi Rataud", - "address": "45 rue d'Ulm, NIR, niveau PB" - }, - "model": "bda.salle", - "pk": 6 -}, -{ - "fields": { - "description": "Jazz / Funk", - "title": "Un super concert", - "price": 10.0, - "rappel_sent": null, - "location": 2, - "date": "2016-09-30T18:00:00Z", - "slots_description": "Debout", - "slots": 5, - "listing": false, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 1 -}, -{ - "fields": { - "description": "Homemade", - "title": "Une super pi\u00e8ce", - "price": 10.0, - "rappel_sent": null, - "location": 3, - "date": "2016-09-29T14:00:00Z", - "slots_description": "Assises", - "slots": 60, - "listing": true, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 2 -}, -{ - "fields": { - "description": "Plein air, soleil, bonne musique", - "title": "Concert pour la f\u00eate de la musique", - "price": 5.0, - "rappel_sent": null, - "location": 1, - "date": "2016-09-21T15:00:00Z", - "slots_description": "Debout, attention \u00e0 la fontaine", - "slots": 30, - "listing": false, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 3 -}, -{ - "fields": { - "description": "Sous le regard s\u00e9v\u00e8re de Louis Pasteur", - "title": "Op\u00e9ra sans d\u00e9cors", - "price": 5.0, - "rappel_sent": null, - "location": 4, - "date": "2016-10-06T19:00:00Z", - "slots_description": "Assis sur l'herbe", - "slots": 20, - "listing": false, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 4 -}, -{ - "fields": { - "description": "Buffet \u00e0 la fin", - "title": "Concert Trouv\u00e8re", - "price": 20.0, - "rappel_sent": null, - "location": 5, - "date": "2016-11-30T12:00:00Z", - "slots_description": "Assises", - "slots": 15, - "listing": false, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 5 -}, -{ - "fields": { - "description": "Vive les maths", - "title": "Dessin \u00e0 la craie sur tableau noir", - "price": 10.0, - "rappel_sent": null, - "location": 6, - "date": "2016-12-15T07:00:00Z", - "slots_description": "Assises, tablette pour prendre des notes", - "slots": 30, - "listing": true, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 6 -}, -{ - "fields": { - "description": "Une pi\u00e8ce \u00e0 un personnage", - "title": "D\u00e9cors, d\u00e9montage en musique", - "price": 0.0, - "rappel_sent": null, - "location": 3, - "date": "2016-12-26T07:00:00Z", - "slots_description": "Assises", - "slots": 20, - "listing": false, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 7 -}, -{ - "fields": { - "description": "Annulera, annulera pas\u00a0?", - "title": "La Nuit", - "price": 27.0, - "rappel_sent": null, - "location": 1, - "date": "2016-11-14T23:00:00Z", - "slots_description": "", - "slots": 1000, - "listing": true, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 8 -}, -{ - "fields": { - "description": "Le boum fait sa carte blanche", - "title": "Turbomix", - "price": 10.0, - "rappel_sent": null, - "location": 2, - "date": "2017-01-10T20:00:00Z", - "slots_description": "Debout les mains en l'air", - "slots": 20, - "listing": true, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 9 -}, -{ - "fields": { - "description": "Unique repr\u00e9sentation", - "title": "Carinettes et trombone", - "price": 15.0, - "rappel_sent": null, - "location": 5, - "date": "2017-01-02T14:00:00Z", - "slots_description": "Chaises ikea", - "slots": 10, - "listing": false, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 10 -}, -{ - "fields": { - "description": "Suivi d'une jam session", - "title": "Percussion sur rondins", - "price": 5.0, - "rappel_sent": null, - "location": 4, - "date": "2017-01-13T14:00:00Z", - "slots_description": "B\u00fbches", - "slots": 14, - "listing": true, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 11 -}, -{ - "fields": { - "description": "\u00c9preuve sportive et artistique", - "title": "Bassin aux ernests, nage libre", - "price": 5.0, - "rappel_sent": null, - "location": 1, - "date": "2016-11-17T09:00:00Z", - "slots_description": "Humides", - "slots": 10, - "listing": false, - "tirage": 1 - }, - "model": "bda.spectacle", - "pk": 12 -}, -{ - "fields": { - "description": "Sonore", - "title": "Chant du barde", - "price": 13.0, - "rappel_sent": null, - "location": 2, - "date": "2017-02-26T07:00:00Z", - "slots_description": "Ne venez pas", - "slots": 20, - "listing": false, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 13 -}, -{ - "fields": { - "description": "Cocorico", - "title": "Chant du coq", - "price": 4.0, - "rappel_sent": null, - "location": 1, - "date": "2016-12-17T04:00:00Z", - "slots_description": "bancs", - "slots": 15, - "listing": false, - "tirage": 2 - }, - "model": "bda.spectacle", - "pk": 14 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 1, - "paid": false - }, - "model": "bda.participant", - "pk": 1 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 1, - "paid": false - }, - "model": "bda.participant", - "pk": 2 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 2, - "paid": false - }, - "model": "bda.participant", - "pk": 3 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 2, - "paid": false - }, - "model": "bda.participant", - "pk": 4 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 3, - "paid": false - }, - "model": "bda.participant", - "pk": 5 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 3, - "paid": false - }, - "model": "bda.participant", - "pk": 6 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 4, - "paid": false - }, - "model": "bda.participant", - "pk": 7 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 4, - "paid": false - }, - "model": "bda.participant", - "pk": 8 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 5, - "paid": false - }, - "model": "bda.participant", - "pk": 9 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 5, - "paid": false - }, - "model": "bda.participant", - "pk": 10 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 6, - "paid": false - }, - "model": "bda.participant", - "pk": 11 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 6, - "paid": false - }, - "model": "bda.participant", - "pk": 12 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 7, - "paid": false - }, - "model": "bda.participant", - "pk": 13 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 7, - "paid": false - }, - "model": "bda.participant", - "pk": 14 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 8, - "paid": false - }, - "model": "bda.participant", - "pk": 15 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 8, - "paid": false - }, - "model": "bda.participant", - "pk": 16 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 9, - "paid": false - }, - "model": "bda.participant", - "pk": 17 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 9, - "paid": false - }, - "model": "bda.participant", - "pk": 18 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 10, - "paid": false - }, - "model": "bda.participant", - "pk": 19 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 10, - "paid": false - }, - "model": "bda.participant", - "pk": 20 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 11, - "paid": false - }, - "model": "bda.participant", - "pk": 21 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 11, - "paid": false - }, - "model": "bda.participant", - "pk": 22 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 12, - "paid": false - }, - "model": "bda.participant", - "pk": 23 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 12, - "paid": false - }, - "model": "bda.participant", - "pk": 24 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 13, - "paid": false - }, - "model": "bda.participant", - "pk": 25 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 13, - "paid": false - }, - "model": "bda.participant", - "pk": 26 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 14, - "paid": false - }, - "model": "bda.participant", - "pk": 27 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 14, - "paid": false - }, - "model": "bda.participant", - "pk": 28 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 15, - "paid": false - }, - "model": "bda.participant", - "pk": 29 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 15, - "paid": false - }, - "model": "bda.participant", - "pk": 30 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 16, - "paid": false - }, - "model": "bda.participant", - "pk": 31 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 16, - "paid": false - }, - "model": "bda.participant", - "pk": 32 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 17, - "paid": false - }, - "model": "bda.participant", - "pk": 33 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 17, - "paid": false - }, - "model": "bda.participant", - "pk": 34 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 18, - "paid": false - }, - "model": "bda.participant", - "pk": 35 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 18, - "paid": false - }, - "model": "bda.participant", - "pk": 36 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 19, - "paid": false - }, - "model": "bda.participant", - "pk": 37 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 19, - "paid": false - }, - "model": "bda.participant", - "pk": 38 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 20, - "paid": false - }, - "model": "bda.participant", - "pk": 39 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 20, - "paid": false - }, - "model": "bda.participant", - "pk": 40 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 21, - "paid": false - }, - "model": "bda.participant", - "pk": 41 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 21, - "paid": false - }, - "model": "bda.participant", - "pk": 42 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 22, - "paid": false - }, - "model": "bda.participant", - "pk": 43 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 22, - "paid": false - }, - "model": "bda.participant", - "pk": 44 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 23, - "paid": false - }, - "model": "bda.participant", - "pk": 45 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 23, - "paid": false - }, - "model": "bda.participant", - "pk": 46 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 24, - "paid": false - }, - "model": "bda.participant", - "pk": 47 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 24, - "paid": false - }, - "model": "bda.participant", - "pk": 48 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 25, - "paid": false - }, - "model": "bda.participant", - "pk": 49 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 25, - "paid": false - }, - "model": "bda.participant", - "pk": 50 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 26, - "paid": false - }, - "model": "bda.participant", - "pk": 51 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 26, - "paid": false - }, - "model": "bda.participant", - "pk": 52 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 27, - "paid": false - }, - "model": "bda.participant", - "pk": 53 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 27, - "paid": false - }, - "model": "bda.participant", - "pk": 54 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 28, - "paid": false - }, - "model": "bda.participant", - "pk": 55 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 28, - "paid": false - }, - "model": "bda.participant", - "pk": 56 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 29, - "paid": false - }, - "model": "bda.participant", - "pk": 57 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 29, - "paid": false - }, - "model": "bda.participant", - "pk": 58 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 30, - "paid": false - }, - "model": "bda.participant", - "pk": 59 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 30, - "paid": false - }, - "model": "bda.participant", - "pk": 60 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 31, - "paid": false - }, - "model": "bda.participant", - "pk": 61 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 31, - "paid": false - }, - "model": "bda.participant", - "pk": 62 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 32, - "paid": false - }, - "model": "bda.participant", - "pk": 63 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 32, - "paid": false - }, - "model": "bda.participant", - "pk": 64 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 33, - "paid": false - }, - "model": "bda.participant", - "pk": 65 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 33, - "paid": false - }, - "model": "bda.participant", - "pk": 66 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 34, - "paid": false - }, - "model": "bda.participant", - "pk": 67 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 34, - "paid": false - }, - "model": "bda.participant", - "pk": 68 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 35, - "paid": false - }, - "model": "bda.participant", - "pk": 69 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 35, - "paid": false - }, - "model": "bda.participant", - "pk": 70 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 36, - "paid": false - }, - "model": "bda.participant", - "pk": 71 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 36, - "paid": false - }, - "model": "bda.participant", - "pk": 72 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 37, - "paid": false - }, - "model": "bda.participant", - "pk": 73 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 37, - "paid": false - }, - "model": "bda.participant", - "pk": 74 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 38, - "paid": false - }, - "model": "bda.participant", - "pk": 75 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 38, - "paid": false - }, - "model": "bda.participant", - "pk": 76 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 39, - "paid": false - }, - "model": "bda.participant", - "pk": 77 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 39, - "paid": false - }, - "model": "bda.participant", - "pk": 78 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 40, - "paid": false - }, - "model": "bda.participant", - "pk": 79 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 40, - "paid": false - }, - "model": "bda.participant", - "pk": 80 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 41, - "paid": false - }, - "model": "bda.participant", - "pk": 81 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 41, - "paid": false - }, - "model": "bda.participant", - "pk": 82 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 42, - "paid": false - }, - "model": "bda.participant", - "pk": 83 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 42, - "paid": false - }, - "model": "bda.participant", - "pk": 84 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 43, - "paid": false - }, - "model": "bda.participant", - "pk": 85 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 43, - "paid": false - }, - "model": "bda.participant", - "pk": 86 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 44, - "paid": false - }, - "model": "bda.participant", - "pk": 87 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 44, - "paid": false - }, - "model": "bda.participant", - "pk": 88 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 45, - "paid": false - }, - "model": "bda.participant", - "pk": 89 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 45, - "paid": false - }, - "model": "bda.participant", - "pk": 90 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 46, - "paid": false - }, - "model": "bda.participant", - "pk": 91 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 46, - "paid": false - }, - "model": "bda.participant", - "pk": 92 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 47, - "paid": false - }, - "model": "bda.participant", - "pk": 93 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 47, - "paid": false - }, - "model": "bda.participant", - "pk": 94 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 48, - "paid": false - }, - "model": "bda.participant", - "pk": 95 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 48, - "paid": false - }, - "model": "bda.participant", - "pk": 96 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 49, - "paid": false - }, - "model": "bda.participant", - "pk": 97 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 49, - "paid": false - }, - "model": "bda.participant", - "pk": 98 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 50, - "paid": false - }, - "model": "bda.participant", - "pk": 99 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 50, - "paid": false - }, - "model": "bda.participant", - "pk": 100 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 51, - "paid": false - }, - "model": "bda.participant", - "pk": 101 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 51, - "paid": false - }, - "model": "bda.participant", - "pk": 102 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 52, - "paid": false - }, - "model": "bda.participant", - "pk": 103 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 52, - "paid": false - }, - "model": "bda.participant", - "pk": 104 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 53, - "paid": false - }, - "model": "bda.participant", - "pk": 105 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 53, - "paid": false - }, - "model": "bda.participant", - "pk": 106 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 54, - "paid": false - }, - "model": "bda.participant", - "pk": 107 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 54, - "paid": false - }, - "model": "bda.participant", - "pk": 108 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 55, - "paid": false - }, - "model": "bda.participant", - "pk": 109 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 55, - "paid": false - }, - "model": "bda.participant", - "pk": 110 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 56, - "paid": false - }, - "model": "bda.participant", - "pk": 111 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 56, - "paid": false - }, - "model": "bda.participant", - "pk": 112 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 57, - "paid": false - }, - "model": "bda.participant", - "pk": 113 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 57, - "paid": false - }, - "model": "bda.participant", - "pk": 114 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 58, - "paid": false - }, - "model": "bda.participant", - "pk": 115 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 58, - "paid": false - }, - "model": "bda.participant", - "pk": 116 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 59, - "paid": false - }, - "model": "bda.participant", - "pk": 117 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 59, - "paid": false - }, - "model": "bda.participant", - "pk": 118 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 60, - "paid": false - }, - "model": "bda.participant", - "pk": 119 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 60, - "paid": false - }, - "model": "bda.participant", - "pk": 120 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 1, - "user": 61, - "paid": false - }, - "model": "bda.participant", - "pk": 121 -}, -{ - "fields": { - "paymenttype": "", - "tirage": 2, - "user": 61, - "paid": false - }, - "model": "bda.participant", - "pk": 122 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 1, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 1 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 1, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 2 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 1, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 3 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 1, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 4 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 1, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 5 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 2, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 6 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 2, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 7 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 2, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 8 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 2, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 9 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 2, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 10 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 3, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 11 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 3, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 12 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 3, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 13 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 3, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 14 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 3, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 15 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 4, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 16 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 4, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 17 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 4, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 18 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 4, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 19 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 4, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 20 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 5, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 21 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 5, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 22 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 5, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 23 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 5, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 24 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 5, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 25 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 6, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 26 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 6, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 27 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 6, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 28 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 6, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 29 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 6, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 30 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 7, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 31 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 7, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 32 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 7, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 33 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 7, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 34 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 7, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 35 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 8, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 36 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 8, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 37 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 8, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 38 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 8, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 39 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 8, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 40 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 9, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 41 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 9, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 42 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 9, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 43 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 9, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 44 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 9, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 45 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 10, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 46 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 10, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 47 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 10, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 48 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 10, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 49 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 10, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 50 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 11, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 51 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 11, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 52 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 11, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 53 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 11, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 54 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 11, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 55 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 12, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 56 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 12, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 57 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 12, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 58 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 12, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 59 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 12, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 60 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 13, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 61 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 13, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 62 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 13, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 63 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 13, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 64 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 13, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 65 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 14, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 66 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 14, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 67 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 14, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 68 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 14, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 69 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 14, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 70 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 15, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 71 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 15, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 72 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 15, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 73 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 15, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 74 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 15, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 75 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 16, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 76 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 16, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 77 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 16, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 78 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 16, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 79 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 16, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 80 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 17, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 81 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 17, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 82 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 17, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 83 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 17, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 84 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 17, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 85 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 18, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 86 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 18, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 87 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 18, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 88 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 18, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 89 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 18, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 90 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 19, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 91 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 19, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 92 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 19, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 93 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 19, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 94 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 19, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 95 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 20, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 96 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 20, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 97 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 20, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 98 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 20, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 99 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 20, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 100 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 21, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 101 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 21, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 102 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 21, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 103 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 21, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 104 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 21, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 105 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 22, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 106 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 22, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 107 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 22, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 108 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 22, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 109 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 22, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 110 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 23, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 111 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 23, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 112 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 23, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 113 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 23, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 114 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 23, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 115 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 24, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 116 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 24, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 117 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 24, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 118 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 24, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 119 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 24, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 120 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 25, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 121 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 25, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 122 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 25, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 123 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 25, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 124 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 25, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 125 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 26, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 126 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 26, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 127 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 26, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 128 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 26, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 129 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 26, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 130 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 27, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 131 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 27, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 132 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 27, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 133 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 27, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 134 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 27, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 135 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 28, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 136 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 28, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 137 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 28, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 138 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 28, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 139 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 28, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 140 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 29, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 141 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 29, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 142 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 29, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 143 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 29, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 144 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 29, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 145 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 30, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 146 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 30, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 147 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 30, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 148 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 30, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 149 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 30, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 150 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 31, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 151 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 31, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 152 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 31, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 153 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 31, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 154 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 31, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 155 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 32, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 156 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 32, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 157 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 32, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 158 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 32, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 159 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 32, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 160 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 33, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 161 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 33, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 162 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 33, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 163 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 33, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 164 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 33, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 165 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 34, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 166 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 34, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 167 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 34, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 168 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 34, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 169 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 34, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 170 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 35, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 171 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 35, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 172 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 35, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 173 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 35, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 174 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 35, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 175 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 36, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 176 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 36, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 177 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 36, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 178 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 36, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 179 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 36, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 180 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 37, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 181 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 37, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 182 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 37, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 183 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 37, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 184 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 37, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 185 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 38, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 186 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 38, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 187 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 38, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 188 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 38, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 189 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 38, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 190 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 39, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 191 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 39, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 192 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 39, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 193 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 39, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 194 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 39, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 195 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 40, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 196 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 40, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 197 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 40, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 198 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 40, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 199 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 40, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 200 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 41, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 201 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 41, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 202 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 41, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 203 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 41, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 204 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 41, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 205 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 42, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 206 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 42, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 207 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 42, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 208 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 42, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 209 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 42, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 210 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 43, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 211 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 43, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 212 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 43, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 213 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 43, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 214 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 43, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 215 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 44, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 216 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 44, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 217 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 44, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 218 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 44, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 219 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 44, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 220 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 45, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 221 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 45, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 222 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 45, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 223 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 45, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 224 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 45, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 225 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 46, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 226 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 46, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 227 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 46, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 228 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 46, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 229 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 46, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 230 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 47, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 231 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 47, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 232 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 47, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 233 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 47, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 234 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 47, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 235 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 48, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 236 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 48, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 237 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 48, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 238 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 48, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 239 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 48, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 240 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 49, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 241 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 49, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 242 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 49, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 243 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 49, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 244 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 49, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 245 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 50, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 246 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 50, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 247 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 50, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 248 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 50, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 249 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 50, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 250 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 51, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 251 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 51, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 252 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 51, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 253 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 51, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 254 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 51, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 255 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 52, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 256 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 52, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 257 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 52, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 258 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 52, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 259 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 52, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 260 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 53, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 261 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 53, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 262 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 53, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 263 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 53, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 264 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 53, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 265 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 54, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 266 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 54, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 267 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 54, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 268 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 54, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 269 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 54, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 270 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 55, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 271 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 55, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 272 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 55, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 273 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 55, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 274 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 55, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 275 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 56, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 276 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 56, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 277 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 56, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 278 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 56, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 279 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 56, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 280 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 57, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 281 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 57, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 282 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 57, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 283 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 57, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 284 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 57, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 285 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 58, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 286 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 58, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 287 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 58, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 288 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 58, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 289 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 58, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 290 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 59, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 291 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 59, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 292 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 59, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 293 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 59, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 294 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 59, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 295 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 60, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 296 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 60, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 297 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 60, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 298 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 60, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 299 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 60, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 300 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 61, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 301 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 61, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 302 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 61, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 303 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 61, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 304 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 61, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 305 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 62, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 306 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 62, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 307 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 62, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 308 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 62, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 309 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 62, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 310 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 63, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 311 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 63, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 312 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 63, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 313 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 63, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 314 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 63, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 315 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 64, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 316 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 64, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 317 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 64, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 318 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 64, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 319 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 64, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 320 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 65, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 321 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 65, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 322 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 65, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 323 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 65, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 324 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 65, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 325 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 66, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 326 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 66, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 327 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 66, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 328 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 66, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 329 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 66, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 330 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 67, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 331 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 67, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 332 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 67, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 333 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 67, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 334 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 67, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 335 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 68, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 336 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 68, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 337 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 68, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 338 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 68, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 339 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 68, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 340 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 69, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 341 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 69, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 342 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 69, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 343 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 69, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 344 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 69, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 345 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 70, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 346 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 70, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 347 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 70, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 348 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 70, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 349 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 70, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 350 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 71, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 351 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 71, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 352 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 71, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 353 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 71, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 354 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 71, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 355 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 72, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 356 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 72, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 357 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 72, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 358 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 72, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 359 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 72, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 360 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 73, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 361 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 73, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 362 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 73, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 363 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 73, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 364 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 73, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 365 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 74, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 366 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 74, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 367 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 74, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 368 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 74, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 369 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 74, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 370 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 75, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 371 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 75, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 372 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 75, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 373 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 75, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 374 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 75, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 375 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 76, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 376 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 76, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 377 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 76, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 378 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 76, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 379 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 76, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 380 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 77, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 381 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 77, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 382 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 77, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 383 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 77, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 384 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 77, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 385 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 78, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 386 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 78, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 387 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 78, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 388 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 78, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 389 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 78, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 390 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 79, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 391 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 79, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 392 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 79, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 393 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 79, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 394 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 79, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 395 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 80, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 396 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 80, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 397 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 80, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 398 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 80, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 399 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 80, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 400 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 81, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 401 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 81, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 402 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 81, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 403 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 81, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 404 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 81, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 405 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 82, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 406 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 82, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 407 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 82, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 408 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 82, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 409 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 82, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 410 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 83, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 411 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 83, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 412 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 83, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 413 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 83, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 414 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 83, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 415 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 84, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 416 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 84, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 417 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 84, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 418 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 84, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 419 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 84, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 420 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 85, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 421 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 85, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 422 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 85, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 423 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 85, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 424 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 85, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 425 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 86, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 426 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 86, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 427 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 86, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 428 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 86, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 429 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 86, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 430 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 87, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 431 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 87, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 432 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 87, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 433 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 87, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 434 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 87, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 435 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 88, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 436 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 88, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 437 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 88, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 438 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 88, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 439 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 88, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 440 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 89, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 441 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 89, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 442 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 89, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 443 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 89, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 444 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 89, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 445 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 90, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 446 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 90, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 447 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 90, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 448 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 90, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 449 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 90, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 450 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 91, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 451 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 91, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 452 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 91, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 453 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 91, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 454 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 91, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 455 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 92, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 456 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 92, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 457 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 92, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 458 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 92, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 459 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 92, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 460 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 93, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 461 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 93, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 462 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 93, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 463 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 93, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 464 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 93, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 465 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 94, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 466 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 94, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 467 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 94, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 468 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 94, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 469 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 94, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 470 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 95, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 471 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 95, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 472 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 95, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 473 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 95, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 474 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 95, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 475 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 96, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 476 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 96, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 477 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 96, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 478 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 96, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 479 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 96, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 480 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 97, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 481 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 97, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 482 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 97, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 483 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 97, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 484 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 97, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 485 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 98, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 486 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 98, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 487 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 98, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 488 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 98, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 489 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 98, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 490 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 99, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 491 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 99, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 492 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 99, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 493 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 99, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 494 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 99, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 495 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 100, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 496 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 100, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 497 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 100, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 498 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 100, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 499 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 100, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 500 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 101, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 501 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 101, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 502 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 101, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 503 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 101, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 504 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 101, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 505 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 102, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 506 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 102, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 507 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 102, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 508 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 102, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 509 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 102, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 510 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 103, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 511 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 103, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 512 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 103, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 513 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 103, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 514 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 103, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 515 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 104, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 516 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 104, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 517 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 104, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 518 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 104, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 519 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 104, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 520 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 105, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 521 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 105, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 522 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 105, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 523 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 105, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 524 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 105, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 525 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 106, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 526 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 106, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 527 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 106, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 528 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 106, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 529 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 106, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 530 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 107, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 531 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 107, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 532 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 107, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 533 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 107, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 534 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 107, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 535 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 108, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 536 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 108, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 537 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 108, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 538 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 108, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 539 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 108, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 540 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 109, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 541 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 109, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 542 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 109, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 543 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 109, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 544 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 109, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 545 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 110, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 546 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 110, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 547 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 110, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 548 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 110, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 549 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 110, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 550 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 111, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 551 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 111, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 552 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 111, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 553 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 111, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 554 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 111, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 555 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 112, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 556 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 112, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 557 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 112, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 558 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 112, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 559 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 112, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 560 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 113, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 561 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 113, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 562 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 113, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 563 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 113, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 564 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 113, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 565 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 114, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 566 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 114, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 567 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 114, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 568 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 114, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 569 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 114, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 570 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 115, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 571 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 115, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 572 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 115, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 573 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 115, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 574 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 115, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 575 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 116, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 576 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 116, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 577 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 116, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 578 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 116, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 579 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 116, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 580 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 117, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 581 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 117, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 582 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 117, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 583 -}, -{ - "fields": { - "priority": 4, - "double_choice": "double", - "participant": 117, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 584 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 117, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 585 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 118, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 586 -}, -{ - "fields": { - "priority": 2, - "double_choice": "double", - "participant": 118, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 587 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 118, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 588 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 118, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 589 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 118, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 590 -}, -{ - "fields": { - "priority": 1, - "double_choice": "1", - "participant": 119, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 591 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 119, - "spectacle": 1 - }, - "model": "bda.choixspectacle", - "pk": 592 -}, -{ - "fields": { - "priority": 3, - "double_choice": "1", - "participant": 119, - "spectacle": 5 - }, - "model": "bda.choixspectacle", - "pk": 593 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 119, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 594 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 119, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 595 -}, -{ - "fields": { - "priority": 1, - "double_choice": "autoquit", - "participant": 120, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 596 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 120, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 597 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 120, - "spectacle": 9 - }, - "model": "bda.choixspectacle", - "pk": 598 -}, -{ - "fields": { - "priority": 4, - "double_choice": "autoquit", - "participant": 120, - "spectacle": 6 - }, - "model": "bda.choixspectacle", - "pk": 599 -}, -{ - "fields": { - "priority": 5, - "double_choice": "1", - "participant": 120, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 600 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 121, - "spectacle": 3 - }, - "model": "bda.choixspectacle", - "pk": 601 -}, -{ - "fields": { - "priority": 2, - "double_choice": "1", - "participant": 121, - "spectacle": 4 - }, - "model": "bda.choixspectacle", - "pk": 602 -}, -{ - "fields": { - "priority": 3, - "double_choice": "double", - "participant": 121, - "spectacle": 2 - }, - "model": "bda.choixspectacle", - "pk": 603 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 121, - "spectacle": 12 - }, - "model": "bda.choixspectacle", - "pk": 604 -}, -{ - "fields": { - "priority": 5, - "double_choice": "double", - "participant": 121, - "spectacle": 10 - }, - "model": "bda.choixspectacle", - "pk": 605 -}, -{ - "fields": { - "priority": 1, - "double_choice": "double", - "participant": 122, - "spectacle": 14 - }, - "model": "bda.choixspectacle", - "pk": 606 -}, -{ - "fields": { - "priority": 2, - "double_choice": "autoquit", - "participant": 122, - "spectacle": 7 - }, - "model": "bda.choixspectacle", - "pk": 607 -}, -{ - "fields": { - "priority": 3, - "double_choice": "autoquit", - "participant": 122, - "spectacle": 13 - }, - "model": "bda.choixspectacle", - "pk": 608 -}, -{ - "fields": { - "priority": 4, - "double_choice": "1", - "participant": 122, - "spectacle": 11 - }, - "model": "bda.choixspectacle", - "pk": 609 -}, -{ - "fields": { - "priority": 5, - "double_choice": "autoquit", - "participant": 122, - "spectacle": 8 - }, - "model": "bda.choixspectacle", - "pk": 610 -} -] diff --git a/bda/management/commands/loadbdadevdata.py b/bda/management/commands/loadbdadevdata.py new file mode 100644 index 00000000..999a53e9 --- /dev/null +++ b/bda/management/commands/loadbdadevdata.py @@ -0,0 +1,99 @@ +""" +Crée deux tirages de test et y inscrit les utilisateurs +""" + +import os +import random + +from django.utils import timezone +from django.contrib.auth.models import User + +from gestioncof.management.base import MyBaseCommand +from bda.models import Tirage, Spectacle, Salle, Participant, ChoixSpectacle + + +# Où sont stockés les fichiers json +DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), + 'data') + + +class Command(MyBaseCommand): + help = "Crée deux tirages de test et y inscrit les utilisateurs." + + def handle(self, *args, **options): + # --- + # Tirages + # --- + + Tirage.objects.all().delete() + Tirage.objects.bulk_create([ + Tirage( + title="Tirage de test 1", + ouverture=timezone.now()-timezone.timedelta(days=7), + fermeture=timezone.now() + ), + Tirage( + title="Tirage de test 2", + ouverture=timezone.now(), + fermeture=timezone.now()+timezone.timedelta(days=60) + ) + ]) + tirages = Tirage.objects.all() + + # --- + # Salles + # --- + + locations = self.from_json('locations.json', DATA_DIR, Salle) + + # --- + # Spectacles + # --- + + def show_callback(show): + show.tirage = random.choice(tirages) + show.listing = bool(random.randint(0, 1)) + show.date = ( + show.tirage.fermeture + + timezone.timedelta(days=random.randint(60, 90)) + ) + show.location = random.choice(locations) + return show + shows = self.from_json( + 'shows.json', DATA_DIR, Spectacle, show_callback + ) + + # --- + # Inscriptions + # --- + + self.stdout.write("Inscription des utilisateurs aux tirages") + ChoixSpectacle.objects.all().delete() + choices = [] + for user in User.objects.filter(profile__is_cof=True): + for tirage in tirages: + part, _ = Participant.objects.get_or_create( + user=user, + tirage=tirage + ) + shows = random.sample( + list(tirage.spectacle_set.all()), + tirage.spectacle_set.count() // 2 + ) + for (rank, show) in enumerate(shows): + choices.append(ChoixSpectacle( + participant=part, + spectacle=show, + priority=rank + 1, + double_choice=random.choice( + ['1', 'double', 'autoquit'] + ) + )) + ChoixSpectacle.objects.bulk_create(choices) + self.stdout.write("- {:d} inscriptions générées".format(len(choices))) + + # --- + # On lance le premier tirage + # --- + + pass diff --git a/bda/management/data/locations.json b/bda/management/data/locations.json new file mode 100644 index 00000000..7208409b --- /dev/null +++ b/bda/management/data/locations.json @@ -0,0 +1,26 @@ +[ +{ + "name": "Cour\u00f4", + "address": "45 rue d'Ulm, cour\u00f4" +}, +{ + "name": "K-F\u00eat", + "address": "45 rue d'Ulm, escalier C, niveau -1" +}, +{ + "name": "Th\u00e9\u00e2tre", + "address": "45 rue d'Ulm, escalier C, niveau -1" +}, +{ + "name": "Cours Pasteur", + "address": "45 rue d'Ulm, cours pasteur" +}, +{ + "name": "Salle des actes", + "address": "45 rue d'Ulm, escalier A, niveau 1" +}, +{ + "name": "Amphi Rataud", + "address": "45 rue d'Ulm, NIR, niveau PB" +} +] diff --git a/bda/management/data/shows.json b/bda/management/data/shows.json new file mode 100644 index 00000000..660f2de9 --- /dev/null +++ b/bda/management/data/shows.json @@ -0,0 +1,100 @@ +[ +{ + "description": "Jazz / Funk", + "title": "Un super concert", + "price": 10.0, + "slots_description": "Debout", + "slots": 5 +}, +{ + "description": "Homemade", + "title": "Une super pi\u00e8ce", + "price": 10.0, + "slots_description": "Assises", + "slots": 60 +}, +{ + "description": "Plein air, soleil, bonne musique", + "title": "Concert pour la f\u00eate de la musique", + "price": 5.0, + "slots_description": "Debout, attention \u00e0 la fontaine", + "slots": 30 +}, +{ + "description": "Sous le regard s\u00e9v\u00e8re de Louis Pasteur", + "title": "Op\u00e9ra sans d\u00e9cors", + "price": 5.0, + "slots_description": "Assis sur l'herbe", + "slots": 20 +}, +{ + "description": "Buffet \u00e0 la fin", + "title": "Concert Trouv\u00e8re", + "price": 20.0, + "slots_description": "Assises", + "slots": 15 +}, +{ + "description": "Vive les maths", + "title": "Dessin \u00e0 la craie sur tableau noir", + "price": 10.0, + "slots_description": "Assises, tablette pour prendre des notes", + "slots": 30 +}, +{ + "description": "Une pi\u00e8ce \u00e0 un personnage", + "title": "D\u00e9cors, d\u00e9montage en musique", + "price": 0.0, + "slots_description": "Assises", + "slots": 20 +}, +{ + "description": "Annulera, annulera pas\u00a0?", + "title": "La Nuit", + "price": 27.0, + "slots_description": "", + "slots": 1000 +}, +{ + "description": "Le boum fait sa carte blanche", + "title": "Turbomix", + "price": 10.0, + "slots_description": "Debout les mains en l'air", + "slots": 20 +}, +{ + "description": "Unique repr\u00e9sentation", + "title": "Carinettes et trombone", + "price": 15.0, + "slots_description": "Chaises ikea", + "slots": 10 +}, +{ + "description": "Suivi d'une jam session", + "title": "Percussion sur rondins", + "price": 5.0, + "slots_description": "B\u00fbches", + "slots": 14 +}, +{ + "description": "\u00c9preuve sportive et artistique", + "title": "Bassin aux ernests, nage libre", + "price": 5.0, + "slots_description": "Humides", + "slots": 10 +}, +{ + "description": "Sonore", + "title": "Chant du barde", + "price": 13.0, + "slots_description": "Ne venez pas", + "slots": 20 +}, +{ + "description": "Cocorico", + "title": "Chant du coq", + "price": 4.0, + "slots_description": "bancs", + "slots": 15 +} +] diff --git a/gestioncof/fixtures/gestion.json b/gestioncof/fixtures/gestion.json index 422c9c4e..ae6466f8 100644 --- a/gestioncof/fixtures/gestion.json +++ b/gestioncof/fixtures/gestion.json @@ -152,156 +152,6 @@ "model": "gestioncof.petitcourssubject", "pk": 4 }, -{ - "fields": { - "matiere": 1, - "niveau": "college", - "user": 11, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 1 -}, -{ - "fields": { - "matiere": 1, - "niveau": "lycee", - "user": 11, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 2 -}, -{ - "fields": { - "matiere": 1, - "niveau": "prepa1styear", - "user": 11, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 3 -}, -{ - "fields": { - "matiere": 1, - "niveau": "prepa2ndyear", - "user": 11, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 4 -}, -{ - "fields": { - "matiere": 1, - "niveau": "licence3", - "user": 11, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 5 -}, -{ - "fields": { - "matiere": 1, - "niveau": "prepa1styear", - "user": 43, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 6 -}, -{ - "fields": { - "matiere": 1, - "niveau": "prepa2ndyear", - "user": 43, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 7 -}, -{ - "fields": { - "matiere": 1, - "niveau": "licence3", - "user": 43, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 8 -}, -{ - "fields": { - "matiere": 2, - "niveau": "college", - "user": 43, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 9 -}, -{ - "fields": { - "matiere": 2, - "niveau": "lycee", - "user": 43, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 10 -}, -{ - "fields": { - "matiere": 3, - "niveau": "lycee", - "user": 48, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 11 -}, -{ - "fields": { - "matiere": 3, - "niveau": "prepa1styear", - "user": 48, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 12 -}, -{ - "fields": { - "matiere": 3, - "niveau": "prepa2ndyear", - "user": 48, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 13 -}, -{ - "fields": { - "matiere": 3, - "niveau": "licence3", - "user": 48, - "agrege": true - }, - "model": "gestioncof.petitcoursability", - "pk": 14 -}, -{ - "fields": { - "matiere": 4, - "niveau": "college", - "user": 10, - "agrege": false - }, - "model": "gestioncof.petitcoursability", - "pk": 15 -}, { "fields": { "traitee": false, diff --git a/gestioncof/fixtures/root.json b/gestioncof/fixtures/root.json deleted file mode 100644 index 07698dd9..00000000 --- a/gestioncof/fixtures/root.json +++ /dev/null @@ -1,41 +0,0 @@ -[ -{ - "fields": { - "username": "root", - "first_name": "super", - "last_name": "user", - "is_active": true, - "is_superuser": true, - "is_staff": true, - "last_login": null, - "groups": [], - "user_permissions": [], - "password": "pbkdf2_sha256$12000$yRpkPuayQ8De$h6bDe+Q4kMikzwEbLNw2I9/V/1/v3F3yLIjEZIFSHrY=", - "email": "root@localhost", - "date_joined": "2016-06-15T17:50:57Z" - }, - "model": "auth.user", - "pk": 62 -}, -{ - "fields": { - "departement": "", - "type_cotiz": "normalien", - "petits_cours_remarques": "", - "is_buro": true, - "is_cof": true, - "mailing_cof": true, - "comments": "Super utilisateur", - "login_clipper": "", - "phone": "", - "num": 62, - "mailing_bda_revente": true, - "user": 62, - "petits_cours_accept": false, - "mailing_bda": true, - "occupation": "1A" - }, - "model": "gestioncof.cofprofile", - "pk": 62 -} -] diff --git a/gestioncof/fixtures/users.json b/gestioncof/fixtures/users.json deleted file mode 100644 index eb29443a..00000000 --- a/gestioncof/fixtures/users.json +++ /dev/null @@ -1,6361 +0,0 @@ -[ -{ - "model": "auth.user", - "fields": { - "username": "Abraracourcix", - "is_superuser": false, - "last_login": "2017-01-02T23:36:16.596Z", - "first_name": "Abraracourcix", - "email": "Abraracourcix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [ - 1 - ], - "user_permissions": [], - "password": "pbkdf2_sha256$20000$sf6kk1dVD9Ab$WCyWkBEco6KuMy1ge7IJFHle6UmyC10VB+zPHrsfmck=", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 1 -}, -{ - "model": "auth.user", - "fields": { - "username": "Acidenitrix", - "is_superuser": false, - "last_login": null, - "first_name": "Acidenitrix", - "email": "Acidenitrix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!duNF8Yf2NRm6cnuWSyyXSp8f5RgihnWt2xK4IqFA", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 2 -}, -{ - "model": "auth.user", - "fields": { - "username": "Agecanonix", - "is_superuser": false, - "last_login": null, - "first_name": "Agecanonix", - "email": "Agecanonix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!Rr0thdxsa9FONDMb8nm344WLUtfNH4AqwWov6aIF", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 3 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alambix", - "is_superuser": false, - "last_login": null, - "first_name": "Alambix", - "email": "Alambix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!oJRF2t5SnX3uleZSSnjLVh7a9QIesFvNlHVLVEDQ", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 4 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amerix", - "is_superuser": false, - "last_login": null, - "first_name": "Amerix", - "email": "Amerix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!NpliH9Loudd5ueP94tOWUF9Ii3k4T4n9oyUqYL2W", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 5 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amnesix", - "is_superuser": false, - "last_login": null, - "first_name": "Amnesix", - "email": "Amnesix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!PUDFSYbngLM1giiG837K2bzn8S4v7PzVsLuBwihe", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 6 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aniline", - "is_superuser": false, - "last_login": null, - "first_name": "Aniline", - "email": "Aniline.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!38v1uqRLErnyQkUWRnDECpb7jc7IMaeyvbpW1tSW", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 7 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aplusbegalix", - "is_superuser": false, - "last_login": null, - "first_name": "Aplusbegalix", - "email": "Aplusbegalix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!rkeOwm7FdAel3AqNVVz3PyGmtYK3pWIvmH1tpMxg", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 8 -}, -{ - "model": "auth.user", - "fields": { - "username": "Archeopterix", - "is_superuser": false, - "last_login": null, - "first_name": "Archeopterix", - "email": "Archeopterix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!OngnIuRNjV3ZUAx8N3qkXdGI4dn4UoWdUPu5UqNt", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 9 -}, -{ - "model": "auth.user", - "fields": { - "username": "Assurancetourix", - "is_superuser": false, - "last_login": null, - "first_name": "Assurancetourix", - "email": "Assurancetourix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!f9xGNX3I9YngtJ9f2VkYn9WUpUBUHYu8mnjUrvm6", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 10 -}, -{ - "model": "auth.user", - "fields": { - "username": "Asterix", - "is_superuser": false, - "last_login": null, - "first_name": "Asterix", - "email": "Asterix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!Jg2iP0rinuDsF881ulT3LRl0p3RM8tvWTtmRO0xL", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 11 -}, -{ - "model": "auth.user", - "fields": { - "username": "Astronomix", - "is_superuser": false, - "last_login": null, - "first_name": "Astronomix", - "email": "Astronomix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!pGLaWR5o8UyPAwx5gWuBKyseYthOlvB8nlmuQACh", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 12 -}, -{ - "model": "auth.user", - "fields": { - "username": "Avoranfix", - "is_superuser": false, - "last_login": null, - "first_name": "Avoranfix", - "email": "Avoranfix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!eoMEmRkkrBPBZb4m3RcTix5QtciZ9DoLZf9moeMo", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 13 -}, -{ - "model": "auth.user", - "fields": { - "username": "Barometrix", - "is_superuser": false, - "last_login": null, - "first_name": "Barometrix", - "email": "Barometrix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!htuIVOgCYtBcLHZSwuJPO9YvZxCXT4Q2m6lcq4vc", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 14 -}, -{ - "model": "auth.user", - "fields": { - "username": "Beaufix", - "is_superuser": false, - "last_login": null, - "first_name": "Beaufix", - "email": "Beaufix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!ugNAJDhDmvhiyo9goNx07RRwmIUY26BBOur33FVO", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 15 -}, -{ - "model": "auth.user", - "fields": { - "username": "Berlix", - "is_superuser": false, - "last_login": null, - "first_name": "Berlix", - "email": "Berlix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!BsBLNNQ8mw01KSrqMui0IPcZs7fGvh2Fu6o1ANuG", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 16 -}, -{ - "model": "auth.user", - "fields": { - "username": "Bonemine", - "is_superuser": false, - "last_login": null, - "first_name": "Bonemine", - "email": "Bonemine.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!rbEMcQYsat8J9U70IPPQci4J7PivMbgadNodKEYa", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 17 -}, -{ - "model": "auth.user", - "fields": { - "username": "Boufiltre", - "is_superuser": false, - "last_login": null, - "first_name": "Boufiltre", - "email": "Boufiltre.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!5Bqj0MylhXDU5eUSHi57fObXHdSjB3U1vqwqzKJW", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 18 -}, -{ - "model": "auth.user", - "fields": { - "username": "Catedralgotix", - "is_superuser": false, - "last_login": null, - "first_name": "Catedralgotix", - "email": "Catedralgotix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!bUbBd2eiBhB1KQX5t09w5CtKX2UTbJMNi0j7j4H4", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 19 -}, -{ - "model": "auth.user", - "fields": { - "username": "CesarLabeldecadix", - "is_superuser": false, - "last_login": null, - "first_name": "CesarLabeldecadix", - "email": "CesarLabeldecadix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!SLAgrCEfHf6qCSXzgD80dMEiSBMmziUupy7IslED", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 20 -}, -{ - "model": "auth.user", - "fields": { - "username": "Cetautomatix", - "is_superuser": false, - "last_login": null, - "first_name": "Cetautomatix", - "email": "Cetautomatix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!lUYqMkSi0Dwl0xElnbzkPMemmFG1c7GOb74Hi030", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 21 -}, -{ - "model": "auth.user", - "fields": { - "username": "Cetyounix", - "is_superuser": false, - "last_login": null, - "first_name": "Cetyounix", - "email": "Cetyounix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!vXFkn6v33TQq4giVcdgePi7WKeJV0rfllIzduFXi", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 22 -}, -{ - "model": "auth.user", - "fields": { - "username": "Changeledix", - "is_superuser": false, - "last_login": null, - "first_name": "Changeledix", - "email": "Changeledix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!ySDEcy7fTfqdvL6xxrd4WL89D8KMvyY8nMEwH8yA", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 23 -}, -{ - "model": "auth.user", - "fields": { - "username": "Chanteclairix", - "is_superuser": false, - "last_login": null, - "first_name": "Chanteclairix", - "email": "Chanteclairix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!90WWD6RvE9cXT5hWwds1hzV7Cp6AXyQS2vUs4S9s", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 24 -}, -{ - "model": "auth.user", - "fields": { - "username": "Cicatrix", - "is_superuser": false, - "last_login": null, - "first_name": "Cicatrix", - "email": "Cicatrix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!4VF117L9OKVx0ezpiNB2c2kyx4oxeHpTRKxGozBV", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 25 -}, -{ - "model": "auth.user", - "fields": { - "username": "Comix", - "is_superuser": false, - "last_login": null, - "first_name": "Comix", - "email": "Comix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!CPec6kwZMVxaNTpFWCP6fK4tAlU2MHpTib0LKH5r", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 26 -}, -{ - "model": "auth.user", - "fields": { - "username": "Diagnostix", - "is_superuser": false, - "last_login": null, - "first_name": "Diagnostix", - "email": "Diagnostix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!1WKfAiEj2ckQD2zF34O545tHUAh6ixq69fhgFPaq", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 27 -}, -{ - "model": "auth.user", - "fields": { - "username": "Doublepolemix", - "is_superuser": false, - "last_login": null, - "first_name": "Doublepolemix", - "email": "Doublepolemix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!lZgNksvH93syhzFw9bTtUOPZQBGedULXN052TKpG", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 28 -}, -{ - "model": "auth.user", - "fields": { - "username": "Eponine", - "is_superuser": false, - "last_login": null, - "first_name": "Eponine", - "email": "Eponine.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!ll2lCGYVfLBi3ogsbIjVia5Yyq5lbuo5a47ibYO2", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 29 -}, -{ - "model": "auth.user", - "fields": { - "username": "Falbala", - "is_superuser": false, - "last_login": null, - "first_name": "Falbala", - "email": "Falbala.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!vv5xfnpipRSZ0FpEcoooSCfgzq1ufVnIOLj1Tjz9", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 30 -}, -{ - "model": "auth.user", - "fields": { - "username": "Fanzine", - "is_superuser": false, - "last_login": null, - "first_name": "Fanzine", - "email": "Fanzine.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!Pw2dGiNkKmoeNz84WRHGyVw0RmP0i8M4UD8BQLAf", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 31 -}, -{ - "model": "auth.user", - "fields": { - "username": "Gelatine", - "is_superuser": false, - "last_login": null, - "first_name": "Gelatine", - "email": "Gelatine.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!4l7FtUZbYNy2xUHVU2psfSka6TrvwQ68lx1ezo5r", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 32 -}, -{ - "model": "auth.user", - "fields": { - "username": "Goudurix", - "is_superuser": false, - "last_login": null, - "first_name": "Goudurix", - "email": "Goudurix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!3oLYAvg1fqui9sGQ8aZkyhEPZUku9Kmeo0oEKyAn", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 33 -}, -{ - "model": "auth.user", - "fields": { - "username": "Homeopatix", - "is_superuser": false, - "last_login": null, - "first_name": "Homeopatix", - "email": "Homeopatix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!7nxg5fYGqwt4uqqUgozs1n32VUIkv14MzVDJEjul", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 34 -}, -{ - "model": "auth.user", - "fields": { - "username": "Idefix", - "is_superuser": false, - "last_login": null, - "first_name": "Idefix", - "email": "Idefix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!c9f6vNfZAXylaIpopeWQpieSGm0aRufMNSDVF6KQ", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 35 -}, -{ - "model": "auth.user", - "fields": { - "username": "Ielosubmarine", - "is_superuser": false, - "last_login": null, - "first_name": "Ielosubmarine", - "email": "Ielosubmarine.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!OUrPtqag4d5FY9duktUMffx9ywviXzUpeKpRC74q", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 36 -}, -{ - "model": "auth.user", - "fields": { - "username": "Keskonrix", - "is_superuser": false, - "last_login": null, - "first_name": "Keskonrix", - "email": "Keskonrix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!vBjgP1v7IwiFfSY4f6A2N6Z3wYyip5bGU7jhas3D", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 37 -}, -{ - "model": "auth.user", - "fields": { - "username": "Lentix", - "is_superuser": false, - "last_login": null, - "first_name": "Lentix", - "email": "Lentix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!Hz6x0jtgazTnqs4T75JR46SZ7mGXe4jyw9mGHMUX", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 38 -}, -{ - "model": "auth.user", - "fields": { - "username": "Maestria", - "is_superuser": false, - "last_login": null, - "first_name": "Maestria", - "email": "Maestria.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!ghxdh9CinGSvONTpi0Xpszt72F22mk821Ig7dYXX", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 39 -}, -{ - "model": "auth.user", - "fields": { - "username": "MaitrePanix", - "is_superuser": false, - "last_login": null, - "first_name": "MaitrePanix", - "email": "MaitrePanix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!yBtiusmkHqStRq5q8CsBxGqXD9DbqMoTXRzNZxRQ", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 40 -}, -{ - "model": "auth.user", - "fields": { - "username": "MmeAgecanonix", - "is_superuser": false, - "last_login": null, - "first_name": "MmeAgecanonix", - "email": "MmeAgecanonix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!8JWFxbX14LC4yG7jZtTBYie4r4n4gvRDsQBJfX1H", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 41 -}, -{ - "model": "auth.user", - "fields": { - "username": "Moralelastix", - "is_superuser": false, - "last_login": null, - "first_name": "Moralelastix", - "email": "Moralelastix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!uHkkEgLU7mcGISbzcc0sZ3sj7WntZnt1sCNr5hwI", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 42 -}, -{ - "model": "auth.user", - "fields": { - "username": "Obelix", - "is_superuser": false, - "last_login": null, - "first_name": "Obelix", - "email": "Obelix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!1IFZ5VVxDheqCpsVZkWdceKOiE8zWtDIT6S7KyFx", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 43 -}, -{ - "model": "auth.user", - "fields": { - "username": "Obelodalix", - "is_superuser": false, - "last_login": null, - "first_name": "Obelodalix", - "email": "Obelodalix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!R31lxnRevzoy85oOcAf12aRXnGikuPAd5BFsJLaV", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 44 -}, -{ - "model": "auth.user", - "fields": { - "username": "Odalix", - "is_superuser": false, - "last_login": null, - "first_name": "Odalix", - "email": "Odalix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!2IJmAfR8vq2ONqwRjXQla4hOrDiyKg99cWgvHvZN", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 45 -}, -{ - "model": "auth.user", - "fields": { - "username": "Ordralfabetix", - "is_superuser": false, - "last_login": null, - "first_name": "Ordralfabetix", - "email": "Ordralfabetix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!3xUqCVOn2XUveibwBTyGprfJzqLCVlm1lFuZA7iq", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 46 -}, -{ - "model": "auth.user", - "fields": { - "username": "Orthopedix", - "is_superuser": false, - "last_login": null, - "first_name": "Orthopedix", - "email": "Orthopedix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!LoqbayscJAd0lC5lE9uve1hFBVtHLOEuC0syK52W", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 47 -}, -{ - "model": "auth.user", - "fields": { - "username": "Panoramix", - "is_superuser": false, - "last_login": null, - "first_name": "Panoramix", - "email": "Panoramix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!0RVNKf5GZf4bS8PpctlRCWsTBx011ws6gZHZl8ou", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 48 -}, -{ - "model": "auth.user", - "fields": { - "username": "Plaintcontrix", - "is_superuser": false, - "last_login": null, - "first_name": "Plaintcontrix", - "email": "Plaintcontrix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!8pGLvUgPa6XLI7bEZEyahwkKakkZquae5y1FBFiL", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 49 -}, -{ - "model": "auth.user", - "fields": { - "username": "Praline", - "is_superuser": false, - "last_login": null, - "first_name": "Praline", - "email": "Praline.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!amrhd9AtNZJ5aRpx6hcq03QjK2ttU2rfCeT0kLNe", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 50 -}, -{ - "model": "auth.user", - "fields": { - "username": "Prefix", - "is_superuser": false, - "last_login": null, - "first_name": "Prefix", - "email": "Prefix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!4HPIeDDpEusx4VjSINX4VYhwmzJAxHqMGW0YcgNN", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 51 -}, -{ - "model": "auth.user", - "fields": { - "username": "Prolix", - "is_superuser": false, - "last_login": null, - "first_name": "Prolix", - "email": "Prolix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!ZPl29iRZVBzRDZN1ZF08CTG8GiF9mvNdCzR7yYxe", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 52 -}, -{ - "model": "auth.user", - "fields": { - "username": "Pronostix", - "is_superuser": false, - "last_login": null, - "first_name": "Pronostix", - "email": "Pronostix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!rMlKerdOjY6fxDXbsYKhWnAUi7srUN94jYKHt93s", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 53 -}, -{ - "model": "auth.user", - "fields": { - "username": "Quatredeusix", - "is_superuser": false, - "last_login": null, - "first_name": "Quatredeusix", - "email": "Quatredeusix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!7zdXFTdA5mNQljet5nuX9EdqbmpBAcfHfcbeZez2", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 54 -}, -{ - "model": "auth.user", - "fields": { - "username": "Saingesix", - "is_superuser": false, - "last_login": null, - "first_name": "Saingesix", - "email": "Saingesix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!oljTcR9PcUEY2f4kqSTWY6fMTWgx8CyRb6qOokHX", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 55 -}, -{ - "model": "auth.user", - "fields": { - "username": "Segregationnix", - "is_superuser": false, - "last_login": null, - "first_name": "Segregationnix", - "email": "Segregationnix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!khSjZIuzYv2fbDPGCCL0bQcW6a3r7AOT2fsiP0vp", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 56 -}, -{ - "model": "auth.user", - "fields": { - "username": "Septantesix", - "is_superuser": false, - "last_login": null, - "first_name": "Septantesix", - "email": "Septantesix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!DceEC0jjxEvD6oRoJxFOt0LgIMF5XNdqVsSmd9ud", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 57 -}, -{ - "model": "auth.user", - "fields": { - "username": "Tournedix", - "is_superuser": false, - "last_login": null, - "first_name": "Tournedix", - "email": "Tournedix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!7GHjKTbx2WRxlXfax7KNpPea7783THBLA5KbSHS9", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 58 -}, -{ - "model": "auth.user", - "fields": { - "username": "Tragicomix", - "is_superuser": false, - "last_login": null, - "first_name": "Tragicomix", - "email": "Tragicomix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!SHKzPUbz2mtNDAXwF7WSlczAOs9P7G2JmerFPZbQ", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 59 -}, -{ - "model": "auth.user", - "fields": { - "username": "Coriza", - "is_superuser": false, - "last_login": null, - "first_name": "Coriza", - "email": "Coriza.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!GHxmhoRmcQsY7ZnQSkH1ICGZck58yHsHDFwhJ6q2", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 60 -}, -{ - "model": "auth.user", - "fields": { - "username": "Zerozerosix", - "is_superuser": false, - "last_login": null, - "first_name": "Zerozerosix", - "email": "Zerozerosix.gaulois@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "!b5lq3LOLGWHzPV4UgqXIZ0WtyIVoE2J5xIIadRr4", - "last_name": "Gaulois", - "date_joined": "2016-06-15T17:50:57Z" - }, - "pk": 61 -}, -{ - "model": "auth.user", - "fields": { - "username": "Abel", - "is_superuser": false, - "last_login": null, - "first_name": "Abel", - "email": "Abel.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.594Z" - }, - "pk": 63 -}, -{ - "model": "auth.user", - "fields": { - "username": "Abelardus", - "is_superuser": false, - "last_login": null, - "first_name": "Abelardus", - "email": "Abelardus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.594Z" - }, - "pk": 64 -}, -{ - "model": "auth.user", - "fields": { - "username": "Abrahamus", - "is_superuser": false, - "last_login": null, - "first_name": "Abrahamus", - "email": "Abrahamus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.603Z" - }, - "pk": 65 -}, -{ - "model": "auth.user", - "fields": { - "username": "Acacius", - "is_superuser": false, - "last_login": null, - "first_name": "Acacius", - "email": "Acacius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.610Z" - }, - "pk": 66 -}, -{ - "model": "auth.user", - "fields": { - "username": "Accius", - "is_superuser": false, - "last_login": null, - "first_name": "Accius", - "email": "Accius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.615Z" - }, - "pk": 67 -}, -{ - "model": "auth.user", - "fields": { - "username": "Achaicus", - "is_superuser": false, - "last_login": null, - "first_name": "Achaicus", - "email": "Achaicus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.622Z" - }, - "pk": 68 -}, -{ - "model": "auth.user", - "fields": { - "username": "Achill", - "is_superuser": false, - "last_login": null, - "first_name": "Achill", - "email": "Achill.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.628Z" - }, - "pk": 69 -}, -{ - "model": "auth.user", - "fields": { - "username": "Achilles", - "is_superuser": false, - "last_login": null, - "first_name": "Achilles", - "email": "Achilles.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.632Z" - }, - "pk": 70 -}, -{ - "model": "auth.user", - "fields": { - "username": "Achilleus", - "is_superuser": false, - "last_login": null, - "first_name": "Achilleus", - "email": "Achilleus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.635Z" - }, - "pk": 71 -}, -{ - "model": "auth.user", - "fields": { - "username": "Acrisius", - "is_superuser": false, - "last_login": null, - "first_name": "Acrisius", - "email": "Acrisius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.639Z" - }, - "pk": 72 -}, -{ - "model": "auth.user", - "fields": { - "username": "Actaeon", - "is_superuser": false, - "last_login": null, - "first_name": "Actaeon", - "email": "Actaeon.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.642Z" - }, - "pk": 73 -}, -{ - "model": "auth.user", - "fields": { - "username": "Acteon", - "is_superuser": false, - "last_login": null, - "first_name": "Acteon", - "email": "Acteon.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.646Z" - }, - "pk": 74 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adalricus", - "is_superuser": false, - "last_login": null, - "first_name": "Adalricus", - "email": "Adalricus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.649Z" - }, - "pk": 75 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adelfonsus", - "is_superuser": false, - "last_login": null, - "first_name": "Adelfonsus", - "email": "Adelfonsus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.652Z" - }, - "pk": 76 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adelphus", - "is_superuser": false, - "last_login": null, - "first_name": "Adelphus", - "email": "Adelphus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.655Z" - }, - "pk": 77 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adeodatus", - "is_superuser": false, - "last_login": null, - "first_name": "Adeodatus", - "email": "Adeodatus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.658Z" - }, - "pk": 78 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adolfus", - "is_superuser": false, - "last_login": null, - "first_name": "Adolfus", - "email": "Adolfus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.661Z" - }, - "pk": 79 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adolphus", - "is_superuser": false, - "last_login": null, - "first_name": "Adolphus", - "email": "Adolphus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.664Z" - }, - "pk": 80 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adrastus", - "is_superuser": false, - "last_login": null, - "first_name": "Adrastus", - "email": "Adrastus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.667Z" - }, - "pk": 81 -}, -{ - "model": "auth.user", - "fields": { - "username": "Adrianus", - "is_superuser": false, - "last_login": null, - "first_name": "Adrianus", - "email": "Adrianus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.670Z" - }, - "pk": 82 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6gidius", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6gidius", - "email": "\u00c6gidius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.673Z" - }, - "pk": 83 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6lia", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6lia", - "email": "\u00c6lia.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.676Z" - }, - "pk": 84 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6lianus", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6lianus", - "email": "\u00c6lianus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.679Z" - }, - "pk": 85 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6milianus", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6milianus", - "email": "\u00c6milianus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.682Z" - }, - "pk": 86 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6milius", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6milius", - "email": "\u00c6milius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.685Z" - }, - "pk": 87 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aeneas", - "is_superuser": false, - "last_login": null, - "first_name": "Aeneas", - "email": "Aeneas.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.688Z" - }, - "pk": 88 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6olus", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6olus", - "email": "\u00c6olus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.691Z" - }, - "pk": 89 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6schylus", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6schylus", - "email": "\u00c6schylus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.694Z" - }, - "pk": 90 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6son", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6son", - "email": "\u00c6son.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.697Z" - }, - "pk": 91 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6sop", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6sop", - "email": "\u00c6sop.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.700Z" - }, - "pk": 92 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6ther", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6ther", - "email": "\u00c6ther.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.703Z" - }, - "pk": 93 -}, -{ - "model": "auth.user", - "fields": { - "username": "\u00c6tius", - "is_superuser": false, - "last_login": null, - "first_name": "\u00c6tius", - "email": "\u00c6tius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.706Z" - }, - "pk": 94 -}, -{ - "model": "auth.user", - "fields": { - "username": "Agapetus", - "is_superuser": false, - "last_login": null, - "first_name": "Agapetus", - "email": "Agapetus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.709Z" - }, - "pk": 95 -}, -{ - "model": "auth.user", - "fields": { - "username": "Agapitus", - "is_superuser": false, - "last_login": null, - "first_name": "Agapitus", - "email": "Agapitus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.712Z" - }, - "pk": 96 -}, -{ - "model": "auth.user", - "fields": { - "username": "Agapius", - "is_superuser": false, - "last_login": null, - "first_name": "Agapius", - "email": "Agapius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.715Z" - }, - "pk": 97 -}, -{ - "model": "auth.user", - "fields": { - "username": "Agathangelus", - "is_superuser": false, - "last_login": null, - "first_name": "Agathangelus", - "email": "Agathangelus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.718Z" - }, - "pk": 98 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aigidius", - "is_superuser": false, - "last_login": null, - "first_name": "Aigidius", - "email": "Aigidius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.721Z" - }, - "pk": 99 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aiolus", - "is_superuser": false, - "last_login": null, - "first_name": "Aiolus", - "email": "Aiolus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.724Z" - }, - "pk": 100 -}, -{ - "model": "auth.user", - "fields": { - "username": "Ajax", - "is_superuser": false, - "last_login": null, - "first_name": "Ajax", - "email": "Ajax.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.727Z" - }, - "pk": 101 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alair", - "is_superuser": false, - "last_login": null, - "first_name": "Alair", - "email": "Alair.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.730Z" - }, - "pk": 102 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alaricus", - "is_superuser": false, - "last_login": null, - "first_name": "Alaricus", - "email": "Alaricus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.732Z" - }, - "pk": 103 -}, -{ - "model": "auth.user", - "fields": { - "username": "Albanus", - "is_superuser": false, - "last_login": null, - "first_name": "Albanus", - "email": "Albanus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.735Z" - }, - "pk": 104 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alberic", - "is_superuser": false, - "last_login": null, - "first_name": "Alberic", - "email": "Alberic.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.738Z" - }, - "pk": 105 -}, -{ - "model": "auth.user", - "fields": { - "username": "Albericus", - "is_superuser": false, - "last_login": null, - "first_name": "Albericus", - "email": "Albericus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.741Z" - }, - "pk": 106 -}, -{ - "model": "auth.user", - "fields": { - "username": "Albertus", - "is_superuser": false, - "last_login": null, - "first_name": "Albertus", - "email": "Albertus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.744Z" - }, - "pk": 107 -}, -{ - "model": "auth.user", - "fields": { - "username": "Albinus", - "is_superuser": false, - "last_login": null, - "first_name": "Albinus", - "email": "Albinus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.747Z" - }, - "pk": 108 -}, -{ - "model": "auth.user", - "fields": { - "username": "Albus", - "is_superuser": false, - "last_login": null, - "first_name": "Albus", - "email": "Albus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.750Z" - }, - "pk": 109 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alcaeus", - "is_superuser": false, - "last_login": null, - "first_name": "Alcaeus", - "email": "Alcaeus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.753Z" - }, - "pk": 110 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alcander", - "is_superuser": false, - "last_login": null, - "first_name": "Alcander", - "email": "Alcander.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.757Z" - }, - "pk": 111 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alcimus", - "is_superuser": false, - "last_login": null, - "first_name": "Alcimus", - "email": "Alcimus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.760Z" - }, - "pk": 112 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alcinder", - "is_superuser": false, - "last_login": null, - "first_name": "Alcinder", - "email": "Alcinder.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.763Z" - }, - "pk": 113 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alerio", - "is_superuser": false, - "last_login": null, - "first_name": "Alerio", - "email": "Alerio.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.766Z" - }, - "pk": 114 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alexandrus", - "is_superuser": false, - "last_login": null, - "first_name": "Alexandrus", - "email": "Alexandrus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.769Z" - }, - "pk": 115 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alexis", - "is_superuser": false, - "last_login": null, - "first_name": "Alexis", - "email": "Alexis.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.772Z" - }, - "pk": 116 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alexius", - "is_superuser": false, - "last_login": null, - "first_name": "Alexius", - "email": "Alexius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.775Z" - }, - "pk": 117 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alexus", - "is_superuser": false, - "last_login": null, - "first_name": "Alexus", - "email": "Alexus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.778Z" - }, - "pk": 118 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alfonsus", - "is_superuser": false, - "last_login": null, - "first_name": "Alfonsus", - "email": "Alfonsus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.780Z" - }, - "pk": 119 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alfredus", - "is_superuser": false, - "last_login": null, - "first_name": "Alfredus", - "email": "Alfredus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.783Z" - }, - "pk": 120 -}, -{ - "model": "auth.user", - "fields": { - "username": "Almericus", - "is_superuser": false, - "last_login": null, - "first_name": "Almericus", - "email": "Almericus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.786Z" - }, - "pk": 121 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aloisius", - "is_superuser": false, - "last_login": null, - "first_name": "Aloisius", - "email": "Aloisius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.789Z" - }, - "pk": 122 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aloysius", - "is_superuser": false, - "last_login": null, - "first_name": "Aloysius", - "email": "Aloysius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.792Z" - }, - "pk": 123 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alphaeus", - "is_superuser": false, - "last_login": null, - "first_name": "Alphaeus", - "email": "Alphaeus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.795Z" - }, - "pk": 124 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alpheaus", - "is_superuser": false, - "last_login": null, - "first_name": "Alpheaus", - "email": "Alpheaus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.798Z" - }, - "pk": 125 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alpheus", - "is_superuser": false, - "last_login": null, - "first_name": "Alpheus", - "email": "Alpheus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.801Z" - }, - "pk": 126 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alphoeus", - "is_superuser": false, - "last_login": null, - "first_name": "Alphoeus", - "email": "Alphoeus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.804Z" - }, - "pk": 127 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alphonsus", - "is_superuser": false, - "last_login": null, - "first_name": "Alphonsus", - "email": "Alphonsus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.807Z" - }, - "pk": 128 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alphonzus", - "is_superuser": false, - "last_login": null, - "first_name": "Alphonzus", - "email": "Alphonzus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.810Z" - }, - "pk": 129 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alvinius", - "is_superuser": false, - "last_login": null, - "first_name": "Alvinius", - "email": "Alvinius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.814Z" - }, - "pk": 130 -}, -{ - "model": "auth.user", - "fields": { - "username": "Alvredus", - "is_superuser": false, - "last_login": null, - "first_name": "Alvredus", - "email": "Alvredus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.816Z" - }, - "pk": 131 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amadeus", - "is_superuser": false, - "last_login": null, - "first_name": "Amadeus", - "email": "Amadeus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.819Z" - }, - "pk": 132 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amaliricus", - "is_superuser": false, - "last_login": null, - "first_name": "Amaliricus", - "email": "Amaliricus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.822Z" - }, - "pk": 133 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amandus", - "is_superuser": false, - "last_login": null, - "first_name": "Amandus", - "email": "Amandus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.825Z" - }, - "pk": 134 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amantius", - "is_superuser": false, - "last_login": null, - "first_name": "Amantius", - "email": "Amantius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.828Z" - }, - "pk": 135 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amarandus", - "is_superuser": false, - "last_login": null, - "first_name": "Amarandus", - "email": "Amarandus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.831Z" - }, - "pk": 136 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amaranthus", - "is_superuser": false, - "last_login": null, - "first_name": "Amaranthus", - "email": "Amaranthus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.834Z" - }, - "pk": 137 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amatus", - "is_superuser": false, - "last_login": null, - "first_name": "Amatus", - "email": "Amatus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.837Z" - }, - "pk": 138 -}, -{ - "model": "auth.user", - "fields": { - "username": "Ambrosianus", - "is_superuser": false, - "last_login": null, - "first_name": "Ambrosianus", - "email": "Ambrosianus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.840Z" - }, - "pk": 139 -}, -{ - "model": "auth.user", - "fields": { - "username": "Ambrosius", - "is_superuser": false, - "last_login": null, - "first_name": "Ambrosius", - "email": "Ambrosius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.844Z" - }, - "pk": 140 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amedeus", - "is_superuser": false, - "last_login": null, - "first_name": "Amedeus", - "email": "Amedeus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.847Z" - }, - "pk": 141 -}, -{ - "model": "auth.user", - "fields": { - "username": "Americus", - "is_superuser": false, - "last_login": null, - "first_name": "Americus", - "email": "Americus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.850Z" - }, - "pk": 142 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amlethus", - "is_superuser": false, - "last_login": null, - "first_name": "Amlethus", - "email": "Amlethus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.853Z" - }, - "pk": 143 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amletus", - "is_superuser": false, - "last_login": null, - "first_name": "Amletus", - "email": "Amletus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.855Z" - }, - "pk": 144 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amor", - "is_superuser": false, - "last_login": null, - "first_name": "Amor", - "email": "Amor.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.859Z" - }, - "pk": 145 -}, -{ - "model": "auth.user", - "fields": { - "username": "Ampelius", - "is_superuser": false, - "last_login": null, - "first_name": "Ampelius", - "email": "Ampelius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.861Z" - }, - "pk": 146 -}, -{ - "model": "auth.user", - "fields": { - "username": "Amphion", - "is_superuser": false, - "last_login": null, - "first_name": "Amphion", - "email": "Amphion.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.865Z" - }, - "pk": 147 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anacletus", - "is_superuser": false, - "last_login": null, - "first_name": "Anacletus", - "email": "Anacletus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.868Z" - }, - "pk": 148 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anastasius", - "is_superuser": false, - "last_login": null, - "first_name": "Anastasius", - "email": "Anastasius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.871Z" - }, - "pk": 149 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anastatius", - "is_superuser": false, - "last_login": null, - "first_name": "Anastatius", - "email": "Anastatius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.874Z" - }, - "pk": 150 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anastius", - "is_superuser": false, - "last_login": null, - "first_name": "Anastius", - "email": "Anastius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.877Z" - }, - "pk": 151 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anatolius", - "is_superuser": false, - "last_login": null, - "first_name": "Anatolius", - "email": "Anatolius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.880Z" - }, - "pk": 152 -}, -{ - "model": "auth.user", - "fields": { - "username": "Androcles", - "is_superuser": false, - "last_login": null, - "first_name": "Androcles", - "email": "Androcles.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.883Z" - }, - "pk": 153 -}, -{ - "model": "auth.user", - "fields": { - "username": "Andronicus", - "is_superuser": false, - "last_login": null, - "first_name": "Andronicus", - "email": "Andronicus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.886Z" - }, - "pk": 154 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anencletus", - "is_superuser": false, - "last_login": null, - "first_name": "Anencletus", - "email": "Anencletus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.889Z" - }, - "pk": 155 -}, -{ - "model": "auth.user", - "fields": { - "username": "Angelicus", - "is_superuser": false, - "last_login": null, - "first_name": "Angelicus", - "email": "Angelicus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.892Z" - }, - "pk": 156 -}, -{ - "model": "auth.user", - "fields": { - "username": "Angelus", - "is_superuser": false, - "last_login": null, - "first_name": "Angelus", - "email": "Angelus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.895Z" - }, - "pk": 157 -}, -{ - "model": "auth.user", - "fields": { - "username": "Anicetus", - "is_superuser": false, - "last_login": null, - "first_name": "Anicetus", - "email": "Anicetus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.898Z" - }, - "pk": 158 -}, -{ - "model": "auth.user", - "fields": { - "username": "Antigonus", - "is_superuser": false, - "last_login": null, - "first_name": "Antigonus", - "email": "Antigonus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.901Z" - }, - "pk": 159 -}, -{ - "model": "auth.user", - "fields": { - "username": "Antipater", - "is_superuser": false, - "last_login": null, - "first_name": "Antipater", - "email": "Antipater.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.904Z" - }, - "pk": 160 -}, -{ - "model": "auth.user", - "fields": { - "username": "Antoninus", - "is_superuser": false, - "last_login": null, - "first_name": "Antoninus", - "email": "Antoninus.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.907Z" - }, - "pk": 161 -}, -{ - "model": "auth.user", - "fields": { - "username": "Antonius", - "is_superuser": false, - "last_login": null, - "first_name": "Antonius", - "email": "Antonius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.910Z" - }, - "pk": 162 -}, -{ - "model": "auth.user", - "fields": { - "username": "Aphrodisius", - "is_superuser": false, - "last_login": null, - "first_name": "Aphrodisius", - "email": "Aphrodisius.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.913Z" - }, - "pk": 163 -}, -{ - "model": "auth.user", - "fields": { - "username": "Apollinaris", - "is_superuser": false, - "last_login": null, - "first_name": "Apollinaris", - "email": "Apollinaris.Romain@ens.fr", - "is_active": true, - "is_staff": false, - "groups": [], - "user_permissions": [], - "password": "", - "last_name": "Romain", - "date_joined": "2017-01-02T23:01:00.916Z" - }, - "pk": 164 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 1, - "type_cotiz": "normalien", - "user": 1, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 1 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 2, - "type_cotiz": "normalien", - "user": 2, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 2 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 3, - "type_cotiz": "normalien", - "user": 3, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 3 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 4, - "type_cotiz": "normalien", - "user": 4, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 4 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 5, - "type_cotiz": "normalien", - "user": 5, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 5 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 6, - "type_cotiz": "normalien", - "user": 6, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 6 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 7, - "type_cotiz": "normalien", - "user": 7, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 7 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 8, - "type_cotiz": "normalien", - "user": 8, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 8 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 9, - "type_cotiz": "normalien", - "user": 9, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 9 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 10, - "type_cotiz": "normalien", - "user": 10, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": true, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 10 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 11, - "type_cotiz": "normalien", - "user": 11, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": true, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 11 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 12, - "type_cotiz": "normalien", - "user": 12, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 12 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 13, - "type_cotiz": "normalien", - "user": 13, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 13 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 14, - "type_cotiz": "normalien", - "user": 14, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 14 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 15, - "type_cotiz": "normalien", - "user": 15, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 15 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 16, - "type_cotiz": "normalien", - "user": 16, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 16 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 17, - "type_cotiz": "normalien", - "user": 17, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 17 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 18, - "type_cotiz": "normalien", - "user": 18, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 18 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 19, - "type_cotiz": "normalien", - "user": 19, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 19 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 20, - "type_cotiz": "normalien", - "user": 20, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 20 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 21, - "type_cotiz": "normalien", - "user": 21, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 21 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 22, - "type_cotiz": "normalien", - "user": 22, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 22 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 23, - "type_cotiz": "normalien", - "user": 23, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 23 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 24, - "type_cotiz": "normalien", - "user": 24, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 24 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 25, - "type_cotiz": "normalien", - "user": 25, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 25 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 26, - "type_cotiz": "normalien", - "user": 26, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 26 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 27, - "type_cotiz": "normalien", - "user": 27, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 27 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 28, - "type_cotiz": "normalien", - "user": 28, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 28 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 29, - "type_cotiz": "normalien", - "user": 29, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 29 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 30, - "type_cotiz": "normalien", - "user": 30, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 30 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 31, - "type_cotiz": "normalien", - "user": 31, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 31 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 32, - "type_cotiz": "normalien", - "user": 32, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 32 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 33, - "type_cotiz": "normalien", - "user": 33, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 33 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 34, - "type_cotiz": "normalien", - "user": 34, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 34 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 35, - "type_cotiz": "normalien", - "user": 35, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 35 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 36, - "type_cotiz": "normalien", - "user": 36, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 36 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 37, - "type_cotiz": "normalien", - "user": 37, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 37 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 38, - "type_cotiz": "normalien", - "user": 38, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 38 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 39, - "type_cotiz": "normalien", - "user": 39, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 39 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 40, - "type_cotiz": "normalien", - "user": 40, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 40 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 41, - "type_cotiz": "normalien", - "user": 41, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 41 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 42, - "type_cotiz": "normalien", - "user": 42, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 42 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 43, - "type_cotiz": "normalien", - "user": 43, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": true, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 43 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 44, - "type_cotiz": "normalien", - "user": 44, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 44 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 45, - "type_cotiz": "normalien", - "user": 45, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 45 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 46, - "type_cotiz": "normalien", - "user": 46, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 46 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 47, - "type_cotiz": "normalien", - "user": 47, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 47 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 48, - "type_cotiz": "normalien", - "user": 48, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": true, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 48 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 49, - "type_cotiz": "normalien", - "user": 49, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 49 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 50, - "type_cotiz": "normalien", - "user": 50, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 50 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 51, - "type_cotiz": "normalien", - "user": 51, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 51 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 52, - "type_cotiz": "normalien", - "user": 52, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 52 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 53, - "type_cotiz": "normalien", - "user": 53, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 53 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 54, - "type_cotiz": "normalien", - "user": 54, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 54 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 55, - "type_cotiz": "normalien", - "user": 55, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 55 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 56, - "type_cotiz": "normalien", - "user": 56, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 56 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 57, - "type_cotiz": "normalien", - "user": 57, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 57 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 58, - "type_cotiz": "normalien", - "user": 58, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 58 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 59, - "type_cotiz": "normalien", - "user": 59, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 59 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 60, - "type_cotiz": "normalien", - "user": 60, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 60 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 61, - "type_cotiz": "normalien", - "user": 61, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": true, - "phone": "", - "departement": "", - "mailing_cof": true, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": true, - "occupation": "1A", - "mailing_bda_revente": true - }, - "pk": 61 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 63, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 63 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 64, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 64 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 65, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 65 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 66, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 66 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 67, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 67 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 68, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 68 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 69, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 69 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 70, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 70 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 71, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 71 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 72, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 72 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 73, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 73 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 74, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 74 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 75, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 75 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 76, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 76 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 77, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 77 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 78, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 78 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 79, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 79 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 80, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 80 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 81, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 81 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 82, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 82 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 83, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 83 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 84, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 84 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 85, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 85 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 86, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 86 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 87, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 87 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 88, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 88 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 89, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 89 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 90, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 90 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 91, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 91 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 92, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 92 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 93, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 93 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 94, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 94 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 95, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 95 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 96, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 96 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 97, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 97 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 98, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 98 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 99, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 99 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 100, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 100 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 101, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 101 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 102, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 102 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 103, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 103 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 104, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 104 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 105, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 105 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 106, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 106 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 107, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 107 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 108, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 108 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 109, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 109 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 110, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 110 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 111, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 111 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 112, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 112 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 113, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 113 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 114, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 114 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 115, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 115 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 116, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 116 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 117, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 117 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 118, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 118 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 119, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 119 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 120, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 120 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 121, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 121 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 122, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 122 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 123, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 123 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 124, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 124 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 125, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 125 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 126, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 126 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 127, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 127 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 128, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 128 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 129, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 129 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 130, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 130 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 131, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 131 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 132, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 132 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 133, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 133 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 134, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 134 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 135, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 135 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 136, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 136 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 137, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 137 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 138, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 138 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 139, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 139 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 140, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 140 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 141, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 141 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 142, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 142 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 143, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 143 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 144, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 144 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 145, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 145 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 146, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 146 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 147, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 147 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 148, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 148 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 149, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 149 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 150, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 150 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 151, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 151 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 152, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 152 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 153, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 153 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 154, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 154 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 155, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 155 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 156, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 156 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 157, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 157 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 158, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 158 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 159, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 159 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 160, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 160 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 161, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 161 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 162, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 162 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 163, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 163 -}, -{ - "model": "gestioncof.cofprofile", - "fields": { - "num": 0, - "type_cotiz": "normalien", - "user": 164, - "comments": "", - "petits_cours_remarques": "", - "mailing_bda": false, - "phone": "", - "departement": "", - "mailing_cof": false, - "petits_cours_accept": false, - "is_buro": false, - "login_clipper": "", - "is_cof": false, - "occupation": "1A", - "mailing_bda_revente": false - }, - "pk": 164 -} -] diff --git a/gestioncof/management/base.py b/gestioncof/management/base.py new file mode 100644 index 00000000..ab4d1a30 --- /dev/null +++ b/gestioncof/management/base.py @@ -0,0 +1,41 @@ +""" +Un mixin à utiliser avec BaseCommand pour charger des objets depuis un json +""" + +import os +import json + +from django.core.management.base import BaseCommand + + +class MyBaseCommand(BaseCommand): + """ + Ajoute une méthode ``from_json`` qui charge des objets à partir d'un json. + """ + + def from_json(self, filename, data_dir, klass, + callback=lambda obj: obj): + """ + Charge les objets contenus dans le fichier json référencé par + ``filename`` dans la base de donnée. La fonction callback est appelées + sur chaque objet avant enregistrement. + """ + self.stdout.write("Chargement de {:s}".format(filename)) + with open(os.path.join(data_dir, filename), 'r') as file: + descriptions = json.load(file) + objects = [] + nb_new = 0 + for description in descriptions: + qset = klass.objects.filter(**description) + try: + objects.append(qset.get()) + except klass.DoesNotExist: + obj = klass(**description) + obj = callback(obj) + obj.save() + objects.append(obj) + nb_new += 1 + self.stdout.write("- {:d} objets créés".format(nb_new)) + self.stdout.write("- {:d} objets gardés en l'état" + .format(len(objects)-nb_new)) + return objects diff --git a/gestioncof/management/commands/loaddevdata.py b/gestioncof/management/commands/loaddevdata.py new file mode 100644 index 00000000..cd1d03bd --- /dev/null +++ b/gestioncof/management/commands/loaddevdata.py @@ -0,0 +1,107 @@ +""" +Charge des données de test dans la BDD +- Utilisateurs +- Sondage +- Événement +- Petits cours +""" + + +import os +import random + +from django.contrib.auth.models import User +from django.core.management import call_command + +from gestioncof.management.base import MyBaseCommand +from gestioncof.petits_cours_models import ( + PetitCoursAbility, PetitCoursSubject, LEVELS_CHOICES, + PetitCoursAttributionCounter +) + +# Où sont stockés les fichiers json +DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), + 'data') + + +class Command(MyBaseCommand): + help = "Charge des données de test dans la BDD" + + def add_argument(self, parser): + """ + Permet de ne pas créer l'utilisateur "root". + """ + parser.add_argument( + '--no-root', + action='store_true', + dest='no-root', + default=False, + help='Ne crée pas l\'utilisateur "root"' + ) + + def handle(self, *args, **options): + # --- + # Utilisateurs + # --- + + # Gaulois + gaulois = self.from_json('gaulois.json', DATA_DIR, User) + for user in gaulois: + user.profile.is_cof = True + user.profile.save() + + # Romains + self.from_json('romains.json', DATA_DIR, User) + + # Root + no_root = options.get('no-root', False) + if not no_root: + self.stdout.write("Création de l'utilisateur root") + root, _ = User.objects.get_or_create( + username='root', + first_name='super', + last_name='user', + email='root@localhost') + root.set_password('root') + root.profile.is_cof = True + root.profile.is_buro = True + root.profile.save() + root.save() + + # --- + # Petits cours + # --- + + self.stdout.write("Inscriptions au système des petits cours") + levels = [id for (id, verbose) in LEVELS_CHOICES] + subjects = list(PetitCoursSubject.objects.all()) + nb_of_teachers = 0 + for user in gaulois: + if random.randint(0, 1): + nb_of_teachers += 1 + # L'utilisateur reçoit les demandes de petits cours + user.profile.petits_cours_accept = True + user.save() + # L'utilisateur est compétent dans une matière + subject = random.choice(subjects) + if not PetitCoursAbility.objects.filter( + user=user, + matiere=subject).exists(): + PetitCoursAbility.objects.create( + user=user, + matiere=subject, + niveau=random.choice(levels), + agrege=bool(random.randint(0, 1)) + ) + # On initialise son compteur d'attributions + PetitCoursAttributionCounter.objects.get_or_create( + user=user, + matiere=subject + ) + self.stdout.write("- {:d} inscriptions".format(nb_of_teachers)) + + # --- + # Le BdA + # --- + + call_command('loadbdadevdata') diff --git a/gestioncof/management/data/gaulois.json b/gestioncof/management/data/gaulois.json new file mode 100644 index 00000000..b562aef0 --- /dev/null +++ b/gestioncof/management/data/gaulois.json @@ -0,0 +1,368 @@ +[ + { + "username": "Abraracourcix", + "email": "Abraracourcix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Abraracourcix" + }, + { + "username": "Acidenitrix", + "email": "Acidenitrix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Acidenitrix" + }, + { + "username": "Agecanonix", + "email": "Agecanonix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Agecanonix" + }, + { + "username": "Alambix", + "email": "Alambix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Alambix" + }, + { + "username": "Amerix", + "email": "Amerix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Amerix" + }, + { + "username": "Amnesix", + "email": "Amnesix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Amnesix" + }, + { + "username": "Aniline", + "email": "Aniline.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Aniline" + }, + { + "username": "Aplusbegalix", + "email": "Aplusbegalix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Aplusbegalix" + }, + { + "username": "Archeopterix", + "email": "Archeopterix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Archeopterix" + }, + { + "username": "Assurancetourix", + "email": "Assurancetourix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Assurancetourix" + }, + { + "username": "Asterix", + "email": "Asterix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Asterix" + }, + { + "username": "Astronomix", + "email": "Astronomix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Astronomix" + }, + { + "username": "Avoranfix", + "email": "Avoranfix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Avoranfix" + }, + { + "username": "Barometrix", + "email": "Barometrix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Barometrix" + }, + { + "username": "Beaufix", + "email": "Beaufix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Beaufix" + }, + { + "username": "Berlix", + "email": "Berlix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Berlix" + }, + { + "username": "Bonemine", + "email": "Bonemine.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Bonemine" + }, + { + "username": "Boufiltre", + "email": "Boufiltre.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Boufiltre" + }, + { + "username": "Catedralgotix", + "email": "Catedralgotix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Catedralgotix" + }, + { + "username": "CesarLabeldecadix", + "email": "CesarLabeldecadix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "CesarLabeldecadix" + }, + { + "username": "Cetautomatix", + "email": "Cetautomatix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Cetautomatix" + }, + { + "username": "Cetyounix", + "email": "Cetyounix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Cetyounix" + }, + { + "username": "Changeledix", + "email": "Changeledix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Changeledix" + }, + { + "username": "Chanteclairix", + "email": "Chanteclairix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Chanteclairix" + }, + { + "username": "Cicatrix", + "email": "Cicatrix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Cicatrix" + }, + { + "username": "Comix", + "email": "Comix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Comix" + }, + { + "username": "Diagnostix", + "email": "Diagnostix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Diagnostix" + }, + { + "username": "Doublepolemix", + "email": "Doublepolemix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Doublepolemix" + }, + { + "username": "Eponine", + "email": "Eponine.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Eponine" + }, + { + "username": "Falbala", + "email": "Falbala.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Falbala" + }, + { + "username": "Fanzine", + "email": "Fanzine.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Fanzine" + }, + { + "username": "Gelatine", + "email": "Gelatine.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Gelatine" + }, + { + "username": "Goudurix", + "email": "Goudurix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Goudurix" + }, + { + "username": "Homeopatix", + "email": "Homeopatix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Homeopatix" + }, + { + "username": "Idefix", + "email": "Idefix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Idefix" + }, + { + "username": "Ielosubmarine", + "email": "Ielosubmarine.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Ielosubmarine" + }, + { + "username": "Keskonrix", + "email": "Keskonrix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Keskonrix" + }, + { + "username": "Lentix", + "email": "Lentix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Lentix" + }, + { + "username": "Maestria", + "email": "Maestria.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Maestria" + }, + { + "username": "MaitrePanix", + "email": "MaitrePanix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "MaitrePanix" + }, + { + "username": "MmeAgecanonix", + "email": "MmeAgecanonix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "MmeAgecanonix" + }, + { + "username": "Moralelastix", + "email": "Moralelastix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Moralelastix" + }, + { + "username": "Obelix", + "email": "Obelix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Obelix" + }, + { + "username": "Obelodalix", + "email": "Obelodalix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Obelodalix" + }, + { + "username": "Odalix", + "email": "Odalix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Odalix" + }, + { + "username": "Ordralfabetix", + "email": "Ordralfabetix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Ordralfabetix" + }, + { + "username": "Orthopedix", + "email": "Orthopedix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Orthopedix" + }, + { + "username": "Panoramix", + "email": "Panoramix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Panoramix" + }, + { + "username": "Plaintcontrix", + "email": "Plaintcontrix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Plaintcontrix" + }, + { + "username": "Praline", + "email": "Praline.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Praline" + }, + { + "username": "Prefix", + "email": "Prefix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Prefix" + }, + { + "username": "Prolix", + "email": "Prolix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Prolix" + }, + { + "username": "Pronostix", + "email": "Pronostix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Pronostix" + }, + { + "username": "Quatredeusix", + "email": "Quatredeusix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Quatredeusix" + }, + { + "username": "Saingesix", + "email": "Saingesix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Saingesix" + }, + { + "username": "Segregationnix", + "email": "Segregationnix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Segregationnix" + }, + { + "username": "Septantesix", + "email": "Septantesix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Septantesix" + }, + { + "username": "Tournedix", + "email": "Tournedix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Tournedix" + }, + { + "username": "Tragicomix", + "email": "Tragicomix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Tragicomix" + }, + { + "username": "Coriza", + "email": "Coriza.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Coriza" + }, + { + "username": "Zerozerosix", + "email": "Zerozerosix.gaulois@ens.fr", + "last_name": "Gaulois", + "first_name": "Zerozerosix" + } +] diff --git a/gestioncof/management/data/romains.json b/gestioncof/management/data/romains.json new file mode 100644 index 00000000..731603f9 --- /dev/null +++ b/gestioncof/management/data/romains.json @@ -0,0 +1,614 @@ +[ + { + "username": "Abel", + "email": "Abel.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Abel" + }, + { + "username": "Abelardus", + "email": "Abelardus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Abelardus" + }, + { + "username": "Abrahamus", + "email": "Abrahamus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Abrahamus" + }, + { + "username": "Acacius", + "email": "Acacius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Acacius" + }, + { + "username": "Accius", + "email": "Accius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Accius" + }, + { + "username": "Achaicus", + "email": "Achaicus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Achaicus" + }, + { + "username": "Achill", + "email": "Achill.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Achill" + }, + { + "username": "Achilles", + "email": "Achilles.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Achilles" + }, + { + "username": "Achilleus", + "email": "Achilleus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Achilleus" + }, + { + "username": "Acrisius", + "email": "Acrisius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Acrisius" + }, + { + "username": "Actaeon", + "email": "Actaeon.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Actaeon" + }, + { + "username": "Acteon", + "email": "Acteon.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Acteon" + }, + { + "username": "Adalricus", + "email": "Adalricus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adalricus" + }, + { + "username": "Adelfonsus", + "email": "Adelfonsus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adelfonsus" + }, + { + "username": "Adelphus", + "email": "Adelphus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adelphus" + }, + { + "username": "Adeodatus", + "email": "Adeodatus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adeodatus" + }, + { + "username": "Adolfus", + "email": "Adolfus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adolfus" + }, + { + "username": "Adolphus", + "email": "Adolphus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adolphus" + }, + { + "username": "Adrastus", + "email": "Adrastus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adrastus" + }, + { + "username": "Adrianus", + "email": "Adrianus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Adrianus" + }, + { + "username": "\u00c6gidius", + "email": "\u00c6gidius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6gidius" + }, + { + "username": "\u00c6lia", + "email": "\u00c6lia.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6lia" + }, + { + "username": "\u00c6lianus", + "email": "\u00c6lianus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6lianus" + }, + { + "username": "\u00c6milianus", + "email": "\u00c6milianus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6milianus" + }, + { + "username": "\u00c6milius", + "email": "\u00c6milius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6milius" + }, + { + "username": "Aeneas", + "email": "Aeneas.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Aeneas" + }, + { + "username": "\u00c6olus", + "email": "\u00c6olus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6olus" + }, + { + "username": "\u00c6schylus", + "email": "\u00c6schylus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6schylus" + }, + { + "username": "\u00c6son", + "email": "\u00c6son.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6son" + }, + { + "username": "\u00c6sop", + "email": "\u00c6sop.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6sop" + }, + { + "username": "\u00c6ther", + "email": "\u00c6ther.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6ther" + }, + { + "username": "\u00c6tius", + "email": "\u00c6tius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "\u00c6tius" + }, + { + "username": "Agapetus", + "email": "Agapetus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Agapetus" + }, + { + "username": "Agapitus", + "email": "Agapitus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Agapitus" + }, + { + "username": "Agapius", + "email": "Agapius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Agapius" + }, + { + "username": "Agathangelus", + "email": "Agathangelus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Agathangelus" + }, + { + "username": "Aigidius", + "email": "Aigidius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Aigidius" + }, + { + "username": "Aiolus", + "email": "Aiolus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Aiolus" + }, + { + "username": "Ajax", + "email": "Ajax.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Ajax" + }, + { + "username": "Alair", + "email": "Alair.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alair" + }, + { + "username": "Alaricus", + "email": "Alaricus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alaricus" + }, + { + "username": "Albanus", + "email": "Albanus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Albanus" + }, + { + "username": "Alberic", + "email": "Alberic.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alberic" + }, + { + "username": "Albericus", + "email": "Albericus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Albericus" + }, + { + "username": "Albertus", + "email": "Albertus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Albertus" + }, + { + "username": "Albinus", + "email": "Albinus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Albinus" + }, + { + "username": "Albus", + "email": "Albus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Albus" + }, + { + "username": "Alcaeus", + "email": "Alcaeus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alcaeus" + }, + { + "username": "Alcander", + "email": "Alcander.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alcander" + }, + { + "username": "Alcimus", + "email": "Alcimus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alcimus" + }, + { + "username": "Alcinder", + "email": "Alcinder.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alcinder" + }, + { + "username": "Alerio", + "email": "Alerio.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alerio" + }, + { + "username": "Alexandrus", + "email": "Alexandrus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alexandrus" + }, + { + "username": "Alexis", + "email": "Alexis.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alexis" + }, + { + "username": "Alexius", + "email": "Alexius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alexius" + }, + { + "username": "Alexus", + "email": "Alexus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alexus" + }, + { + "username": "Alfonsus", + "email": "Alfonsus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alfonsus" + }, + { + "username": "Alfredus", + "email": "Alfredus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alfredus" + }, + { + "username": "Almericus", + "email": "Almericus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Almericus" + }, + { + "username": "Aloisius", + "email": "Aloisius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Aloisius" + }, + { + "username": "Aloysius", + "email": "Aloysius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Aloysius" + }, + { + "username": "Alphaeus", + "email": "Alphaeus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alphaeus" + }, + { + "username": "Alpheaus", + "email": "Alpheaus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alpheaus" + }, + { + "username": "Alpheus", + "email": "Alpheus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alpheus" + }, + { + "username": "Alphoeus", + "email": "Alphoeus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alphoeus" + }, + { + "username": "Alphonsus", + "email": "Alphonsus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alphonsus" + }, + { + "username": "Alphonzus", + "email": "Alphonzus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alphonzus" + }, + { + "username": "Alvinius", + "email": "Alvinius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alvinius" + }, + { + "username": "Alvredus", + "email": "Alvredus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Alvredus" + }, + { + "username": "Amadeus", + "email": "Amadeus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amadeus" + }, + { + "username": "Amaliricus", + "email": "Amaliricus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amaliricus" + }, + { + "username": "Amandus", + "email": "Amandus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amandus" + }, + { + "username": "Amantius", + "email": "Amantius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amantius" + }, + { + "username": "Amarandus", + "email": "Amarandus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amarandus" + }, + { + "username": "Amaranthus", + "email": "Amaranthus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amaranthus" + }, + { + "username": "Amatus", + "email": "Amatus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amatus" + }, + { + "username": "Ambrosianus", + "email": "Ambrosianus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Ambrosianus" + }, + { + "username": "Ambrosius", + "email": "Ambrosius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Ambrosius" + }, + { + "username": "Amedeus", + "email": "Amedeus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amedeus" + }, + { + "username": "Americus", + "email": "Americus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Americus" + }, + { + "username": "Amlethus", + "email": "Amlethus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amlethus" + }, + { + "username": "Amletus", + "email": "Amletus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amletus" + }, + { + "username": "Amor", + "email": "Amor.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amor" + }, + { + "username": "Ampelius", + "email": "Ampelius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Ampelius" + }, + { + "username": "Amphion", + "email": "Amphion.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Amphion" + }, + { + "username": "Anacletus", + "email": "Anacletus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anacletus" + }, + { + "username": "Anastasius", + "email": "Anastasius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anastasius" + }, + { + "username": "Anastatius", + "email": "Anastatius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anastatius" + }, + { + "username": "Anastius", + "email": "Anastius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anastius" + }, + { + "username": "Anatolius", + "email": "Anatolius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anatolius" + }, + { + "username": "Androcles", + "email": "Androcles.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Androcles" + }, + { + "username": "Andronicus", + "email": "Andronicus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Andronicus" + }, + { + "username": "Anencletus", + "email": "Anencletus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anencletus" + }, + { + "username": "Angelicus", + "email": "Angelicus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Angelicus" + }, + { + "username": "Angelus", + "email": "Angelus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Angelus" + }, + { + "username": "Anicetus", + "email": "Anicetus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Anicetus" + }, + { + "username": "Antigonus", + "email": "Antigonus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Antigonus" + }, + { + "username": "Antipater", + "email": "Antipater.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Antipater" + }, + { + "username": "Antoninus", + "email": "Antoninus.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Antoninus" + }, + { + "username": "Antonius", + "email": "Antonius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Antonius" + }, + { + "username": "Aphrodisius", + "email": "Aphrodisius.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Aphrodisius" + }, + { + "username": "Apollinaris", + "email": "Apollinaris.Romain@ens.fr", + "last_name": "Romain", + "first_name": "Apollinaris" + } +] diff --git a/provisioning/prepare_django.sh b/provisioning/prepare_django.sh index c8c80d05..28066579 100644 --- a/provisioning/prepare_django.sh +++ b/provisioning/prepare_django.sh @@ -3,5 +3,6 @@ source ~/venv/bin/activate python manage.py migrate -python manage.py loaddata users root bda gestion sites +python manage.py loaddata gestion sites +python manage.py loaddevdata python manage.py collectstatic --noinput From ba88b94320194c9325f32c8cff2eb393c1c31a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 3 Feb 2017 17:07:50 +0100 Subject: [PATCH 026/213] Fixes and cleanup --- bda/management/commands/loadbdadevdata.py | 14 +- bda/views.py | 152 ++++++++++-------- gestioncof/management/commands/loaddevdata.py | 2 + 3 files changed, 98 insertions(+), 70 deletions(-) diff --git a/bda/management/commands/loadbdadevdata.py b/bda/management/commands/loadbdadevdata.py index 999a53e9..a8e3f298 100644 --- a/bda/management/commands/loadbdadevdata.py +++ b/bda/management/commands/loadbdadevdata.py @@ -10,6 +10,7 @@ from django.contrib.auth.models import User from gestioncof.management.base import MyBaseCommand from bda.models import Tirage, Spectacle, Salle, Participant, ChoixSpectacle +from bda.views import do_tirage # Où sont stockés les fichiers json @@ -30,12 +31,14 @@ class Command(MyBaseCommand): Tirage( title="Tirage de test 1", ouverture=timezone.now()-timezone.timedelta(days=7), - fermeture=timezone.now() + fermeture=timezone.now(), + active=True ), Tirage( title="Tirage de test 2", ouverture=timezone.now(), - fermeture=timezone.now()+timezone.timedelta(days=60) + fermeture=timezone.now()+timezone.timedelta(days=60), + active=True ) ]) tirages = Tirage.objects.all() @@ -51,6 +54,10 @@ class Command(MyBaseCommand): # --- def show_callback(show): + """ + Assigne un tirage, une date et un lieu à un spectacle et décide si + les places sont sur listing. + """ show.tirage = random.choice(tirages) show.listing = bool(random.randint(0, 1)) show.date = ( @@ -96,4 +103,5 @@ class Command(MyBaseCommand): # On lance le premier tirage # --- - pass + self.stdout.write("Lancement du premier tirage") + do_tirage(tirages[0], "dummy_token") diff --git a/bda/views.py b/bda/views.py index 3c448f34..1a864c7f 100644 --- a/bda/views.py +++ b/bda/views.py @@ -179,79 +179,96 @@ def inscription(request, tirage_id): "stateerror": stateerror}) -def do_tirage(request, tirage_id): - tirage_elt = get_object_or_404(Tirage, id=tirage_id) - form = TokenForm(request.POST) - if not form.is_valid(): - return tirage(request, tirage_id) +def do_tirage(tirage_elt, token): + """ + Fonction auxiliaire à la vue ``tirage`` qui lance effectivement le tirage + après qu'on a vérifié que c'est légitime et que le token donné en argument + est correct. + Rend les résultats + """ + # Initialisation du dictionnaire data qui va contenir les résultats start = time.time() - data = {} - shows = tirage_elt.spectacle_set.select_related().all() - members = tirage_elt.participant_set.all() - choices = ChoixSpectacle.objects.filter(spectacle__tirage=tirage_elt) \ - .order_by('participant', 'priority').select_related().all() - algo = Algorithm(shows, members, choices) - results = algo(form.cleaned_data["token"]) - total_slots = 0 - total_losers = 0 + data = { + 'shows': tirage_elt.spectacle_set.select_related().all(), + 'token': token, + 'members': tirage_elt.participant_set.all(), + 'total_slots': 0, + 'total_losers': 0, + 'total_sold': 0, + 'total_deficit': 0, + 'opera_deficit': 0, + } + + # On lance le tirage + choices = ( + ChoixSpectacle.objects + .filter(spectacle__tirage=tirage_elt) + .order_by('participant', 'priority') + .select_related().all() + ) + results = Algorithm(data['shows'], data['members'], choices)(token) + + # On compte les places attribuées et les déçus for (_, members, losers) in results: - total_slots += len(members) - total_losers += len(losers) - data["total_slots"] = total_slots - data["total_losers"] = total_losers - data["shows"] = shows - data["token"] = form.cleaned_data["token"] - data["members"] = members - data["results"] = results - total_sold = 0 - total_deficit = 0 - opera_deficit = 0 + data['total_slots'] += len(members) + data['total_losers'] += len(losers) + + # On calcule le déficit et les bénéfices pour le BdA + # FIXME: le traitement de l'opéra est sale for (show, members, _) in results: deficit = (show.slots - len(members)) * show.price - total_sold += show.slots * show.price + data['total_sold'] += show.slots * show.price if deficit >= 0: if "Opéra" in show.location.name: - opera_deficit += deficit - total_deficit += deficit - data["total_sold"] = total_sold - total_deficit - data["total_deficit"] = total_deficit - data["opera_deficit"] = opera_deficit + data['opera_deficit'] += deficit + data['total_deficit'] += deficit + data["total_sold"] -= data['total_deficit'] + + # Participant objects are not shared accross spectacle results, + # so assign a single object for each Participant id + members_uniq = {} + members2 = {} + for (show, members, _) in results: + for (member, _, _, _) in members: + if member.id not in members_uniq: + members_uniq[member.id] = member + members2[member] = [] + member.total = 0 + member = members_uniq[member.id] + members2[member].append(show) + member.total += show.price + members2 = members2.items() + data["members2"] = sorted(members2, key=lambda m: m[0].user.last_name) + + # --- + # À partir d'ici, le tirage devient effectif + # --- + + # On suppression les vieilles attributions, on sauvegarde le token et on + # désactive le tirage + Attribution.objects.filter(spectacle__tirage=tirage_elt).delete() + tirage_elt.tokens += '{:s}\n"""{:s}"""\n'.format( + timezone.now().strftime("%y-%m-%d %H:%M:%S"), + token) + tirage_elt.enable_do_tirage = False + tirage_elt.save() + + # On enregistre les nouvelles attributions + Attribution.objects.bulk_create([ + Attribution(spectacle=show, participant=member) + for show, members, _ in results + for member, _, _, _ in members + ]) + + # On inscrit à BdA-Revente ceux qui n'ont pas eu les places voulues + for (show, _, losers) in results: + for (loser, _, _, _) in losers: + loser.choicesrevente.add(show) + loser.save() + data["duration"] = time.time() - start - if request.user.is_authenticated(): - members2 = {} - # Participant objects are not shared accross spectacle results, - # so assign a single object for each Participant id - members_uniq = {} - for (show, members, _) in results: - for (member, _, _, _) in members: - if member.id not in members_uniq: - members_uniq[member.id] = member - members2[member] = [] - member.total = 0 - member = members_uniq[member.id] - members2[member].append(show) - member.total += show.price - members2 = members2.items() - data["members2"] = sorted(members2, key=lambda m: m[0].user.last_name) - # À partir d'ici, le tirage devient effectif - Attribution.objects.filter(spectacle__tirage=tirage_elt).delete() - tirage_elt.tokens += "%s\n\"\"\"%s\"\"\"\n" % ( - timezone.now().strftime("%y-%m-%d %H:%M:%S"), - form.cleaned_data['token']) - tirage_elt.enable_do_tirage = False - tirage_elt.save() - Attribution.objects.bulk_create([ - Attribution(spectacle=show, participant=member) - for show, members, _ in results - for member, _, _, _ in members]) - # On inscrit à BdA-Revente ceux qui n'ont pas eu les places voulues - for (show, _, losers) in results: - for (loser, _, _, _) in losers: - loser.choicesrevente.add(show) - loser.save() - return render(request, "bda-attrib-extra.html", data) - else: - return render(request, "bda-attrib.html", data) + data["results"] = results + return data @buro_required @@ -263,7 +280,8 @@ def tirage(request, tirage_id): if request.POST: form = TokenForm(request.POST) if form.is_valid(): - return do_tirage(request, tirage_id) + results = do_tirage(tirage_elt, form.cleaned_data['token']) + return render(request, "bda-attrib-extra.html", results) else: form = TokenForm() return render(request, "bda-token.html", {"form": form}) diff --git a/gestioncof/management/commands/loaddevdata.py b/gestioncof/management/commands/loaddevdata.py index cd1d03bd..8eb04fd2 100644 --- a/gestioncof/management/commands/loaddevdata.py +++ b/gestioncof/management/commands/loaddevdata.py @@ -63,6 +63,8 @@ class Command(MyBaseCommand): last_name='user', email='root@localhost') root.set_password('root') + root.is_staff = True + root.is_superuser = True root.profile.is_cof = True root.profile.is_buro = True root.profile.save() From 45856ca87234328ccbd48035e0965b54987aba2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 3 Feb 2017 17:29:33 +0100 Subject: [PATCH 027/213] update README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e7056f1e..478b3daf 100644 --- a/README.md +++ b/README.md @@ -171,9 +171,10 @@ Il ne vous reste plus qu'à initialiser les modèles de Django avec la commande python manage.py migrate -Une base de donnée pré-remplie est disponible en lançant la commande : +Une base de donnée pré-remplie est disponible en lançant les commandes : - python manage.py loaddata users root bda gestion sites accounts groups articles + python manage.py loaddata gestion sites accounts groups articles + python manage.py loaddevdata Vous êtes prêts à développer ! Lancer GestioCOF en faisant From d31b9f59abf66616f05dd37af8e8b1ace5c68620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 28 Jan 2017 19:46:56 +0100 Subject: [PATCH 028/213] Traitement des messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Les messages sont affichés à l'utilisateurs dans les vues de GestioCOF - On utilise une autre version de bootstrap et jquery (plus récent) Fixes #48 --- bda/templates/bda-participants.html | 2 - bda/templates/bda/etat-places.html | 2 - bda/templates/spectacle_list.html | 2 - gestioncof/static/css/cof.css | 57 +++++++++++++------ gestioncof/templates/base.html | 12 +++- gestioncof/templates/base_title.html | 2 +- .../{ => gestioncof}/base_header.html | 16 ++++++ gestioncof/templates/home.html | 2 +- gestioncof/templates/registration.html | 1 - ...ment_demande_petit_cours_autre_niveau.html | 1 - 10 files changed, 68 insertions(+), 29 deletions(-) rename gestioncof/templates/{ => gestioncof}/base_header.html (60%) diff --git a/bda/templates/bda-participants.html b/bda/templates/bda-participants.html index 3efeccc3..f52e6b96 100644 --- a/bda/templates/bda-participants.html +++ b/bda/templates/bda-participants.html @@ -48,8 +48,6 @@ {% endfor %} - + {% block extra_head %}{% endblock %} diff --git a/gestioncof/templates/base_title.html b/gestioncof/templates/base_title.html index c52f29bb..2e9687dd 100644 --- a/gestioncof/templates/base_title.html +++ b/gestioncof/templates/base_title.html @@ -1,4 +1,4 @@ -{% extends "base_header.html" %} +{% extends "gestioncof/base_header.html" %} {% block interm_content %} diff --git a/gestioncof/templates/base_header.html b/gestioncof/templates/gestioncof/base_header.html similarity index 60% rename from gestioncof/templates/base_header.html rename to gestioncof/templates/gestioncof/base_header.html index baaa24b6..a7e29eb7 100644 --- a/gestioncof/templates/base_header.html +++ b/gestioncof/templates/gestioncof/base_header.html @@ -16,5 +16,21 @@

    {% if user.first_name %}{{ user.first_name }}{% else %}{{ user.username }}{% endif %}, {% if user.profile.is_cof %}au COF{% else %}non-COF{% endif %}

    +{% if messages %} + {% for message in messages %} +
    +
    +
    + + {% if 'safe' in message.tags %} + {{ message|safe }} + {% else %} + {{ message }} + {% endif %} +
    +
    +
    + {% endfor %} +{% endif %} {% block interm_content %}{% endblock %} {% endblock %} diff --git a/gestioncof/templates/home.html b/gestioncof/templates/home.html index c85cbbe1..3c0ec767 100644 --- a/gestioncof/templates/home.html +++ b/gestioncof/templates/home.html @@ -1,4 +1,4 @@ -{% extends "base_header.html" %} +{% extends "gestioncof/base_header.html" %} {% block homelink %} {% endblock %} diff --git a/gestioncof/templates/registration.html b/gestioncof/templates/registration.html index 4f15a4b7..0353b885 100644 --- a/gestioncof/templates/registration.html +++ b/gestioncof/templates/registration.html @@ -4,7 +4,6 @@ {% block page_size %}col-sm-8{% endblock %} {% block extra_head %} - {% endblock %} diff --git a/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html b/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html index f92be513..c2c7e734 100644 --- a/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html +++ b/gestioncof/templates/traitement_demande_petit_cours_autre_niveau.html @@ -16,7 +16,6 @@ {% endif %} - {% if proposals %} {% csrf_token %} From 0666b5288f34c038e34c7472be2ddd1dce024491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 29 Jan 2017 16:24:07 +0100 Subject: [PATCH 029/213] Proper use of messages in survies --- .../templates/{ => gestioncof}/survey.html | 7 ------ gestioncof/views.py | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) rename gestioncof/templates/{ => gestioncof}/survey.html (69%) diff --git a/gestioncof/templates/survey.html b/gestioncof/templates/gestioncof/survey.html similarity index 69% rename from gestioncof/templates/survey.html rename to gestioncof/templates/gestioncof/survey.html index 4d836545..ccf447ef 100644 --- a/gestioncof/templates/survey.html +++ b/gestioncof/templates/gestioncof/survey.html @@ -5,13 +5,6 @@ {% block realcontent %}

    Sondage: {{ survey.title }}

    - {% if success %} - {% if deleted %} -

    Votre réponse a bien été supprimée !

    - {% else %} -

    Votre réponse a bien été enregistrée ! Vous pouvez cependant la modifier jusqu'à la fin du sondage.

    - {% endif %} - {% endif %} {% if survey.details %}

    {{ survey.details }}

    {% endif %} diff --git a/gestioncof/views.py b/gestioncof/views.py index 1945f7f6..2a59bd14 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - import unicodecsv import uuid from datetime import timedelta @@ -16,6 +12,7 @@ from django.contrib.auth.views import login as django_login_view from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.utils import timezone +from django.contrib import messages import django.utils.six as six from gestioncof.models import Survey, SurveyAnswer, SurveyQuestion, \ @@ -153,10 +150,21 @@ def survey(request, survey_id): except SurveyAnswer.DoesNotExist: current_answer = None form = SurveyForm(survey=survey) - return render(request, "survey.html", {"survey": survey, "form": form, - "success": success, - "deleted": deleted, - "current_answer": current_answer}) + # Messages + if success: + if deleted: + messages.success(request, + "Votre réponse a bien été supprimée") + else: + messages.success(request, + "Votre réponse a bien été enregistrée ! Vous " + "pouvez cependant la modifier jusqu'à la fin " + "du sondage.") + return render(request, "gestioncof/survey.html", { + "survey": survey, + "form": form, + "current_answer": current_answer + }) def get_event_form_choices(event, form): From 91fff8a11e3a2e960520562e7cd3db19a28c3d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 29 Jan 2017 17:13:01 +0100 Subject: [PATCH 030/213] Proper use of messages in BdA inscription --- bda/templates/bda/inscription-tirage.html | 8 +--- .../bda/resume-inscription-tirage.html | 2 - bda/views.py | 45 ++++++++++++++----- .../{ => gestioncof}/registration_post.html | 0 4 files changed, 34 insertions(+), 21 deletions(-) rename gestioncof/templates/{ => gestioncof}/registration_post.html (100%) diff --git a/bda/templates/bda/inscription-tirage.html b/bda/templates/bda/inscription-tirage.html index d43059e7..2e8cb6cf 100644 --- a/bda/templates/bda/inscription-tirage.html +++ b/bda/templates/bda/inscription-tirage.html @@ -91,12 +91,6 @@ var django = {

    Inscription au tirage au sort du BdA

    - {% if success %} -

    Votre inscription a été mise à jour avec succès !

    - {% endif %} - {% if stateerror %} -

    Impossible d'enregistrer vos modifications: vous avez apporté d'autres modifications entre temps

    - {% endif %} {% csrf_token %} {% include "bda/inscription-formset.html" %} @@ -113,7 +107,7 @@ var django = {

    - 1: cette liste de vœu est ordonnée (du plus important au moins important), pour ajuster la priorité vous pouvez déplacer chaque vœu.
    + 1: cette liste de vœux est ordonnée (du plus important au moins important), pour ajuster la priorité vous pouvez déplacer chaque vœu.

    diff --git a/bda/templates/bda/resume-inscription-tirage.html b/bda/templates/bda/resume-inscription-tirage.html index 2e0531ca..0ad7ec0e 100644 --- a/bda/templates/bda/resume-inscription-tirage.html +++ b/bda/templates/bda/resume-inscription-tirage.html @@ -1,8 +1,6 @@ {% extends "base_title.html" %} {% block realcontent %} -

    {{ error_title }}

    -

    {{ error_description }}

    {% if choices %}

    Vos vœux:

      diff --git a/bda/views.py b/bda/views.py index 3c448f34..ddd2fc90 100644 --- a/bda/views.py +++ b/bda/views.py @@ -8,6 +8,7 @@ from datetime import timedelta from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required +from django.contrib import messages from django.db import models, transaction from django.db.models import Count, Q, Sum from django.core import serializers, mail @@ -17,7 +18,7 @@ from django.core.urlresolvers import reverse from django.conf import settings from django.core.mail import send_mail from django.template import loader -from django.utils import timezone +from django.utils import timezone, formats from django.views.generic.list import ListView from gestioncof.decorators import cof_required, buro_required @@ -121,23 +122,37 @@ def places(request, tirage_id): @cof_required def inscription(request, tirage_id): + """ + Vue d'inscription à un tirage BdA. + - On vérifie qu'on se situe bien entre la date d'ouverture et la date de + fermeture des inscriptions. + - On vérifie que l'inscription n'a pas été modifiée entre le moment où le + client demande le formulaire et le moment où il soumet son inscription + (autre session par exemple). + """ tirage = get_object_or_404(Tirage, id=tirage_id) if timezone.now() < tirage.ouverture: - error_desc = tirage.ouverture.strftime('Ouverture le %d %b %Y à %H:%M') - return render(request, 'bda/resume-inscription-tirage.html', - {"error_title": "Le tirage n'est pas encore ouvert !", - "error_description": error_desc}) + # Le tirage n'est pas encore ouvert. + opening = formats.localize( + timezone.template_localtime(tirage.ouverture)) + messages.error(request, "Le tirage n'est pas encore ouvert : " + "ouverture le {:s}".format(opening)) + return render(request, 'bda/resume-inscription-tirage.html', {}) if timezone.now() > tirage.fermeture: + # Le tirage est fermé. participant, created = Participant.objects.get_or_create( user=request.user, tirage=tirage) choices = participant.choixspectacle_set.order_by("priority").all() + messages.error(request, + " C'est fini : tirage au sort dans la journée !") return render(request, "bda/resume-inscription-tirage.html", - {"error_title": "C'est fini !", - "error_description": - "Tirage au sort dans la journée !", - "choices": choices}) + {"choices": choices}) def formfield_callback(f, **kwargs): + """ + Fonction utilisée par inlineformset_factory ci dessous. + Restreint les spectacles proposés aux spectacles du bo tirage. + """ if f.name == "spectacle": kwargs['queryset'] = tirage.spectacle_set return f.formfield(**kwargs) @@ -170,13 +185,19 @@ def inscription(request, tirage_id): total_price += choice.spectacle.price if choice.double: total_price += choice.spectacle.price + # Messages + if success: + messages.success(request, "Votre inscription a été mise à jour avec " + "succès !") + if stateerror: + messages.error(request, "Impossible d'enregistrer vos modifications " + ": vous avez apporté d'autres modifications " + "entre temps.") return render(request, "bda/inscription-tirage.html", {"formset": formset, - "success": success, "total_price": total_price, "dbstate": dbstate, - 'tirage': tirage, - "stateerror": stateerror}) + 'tirage': tirage}) def do_tirage(request, tirage_id): diff --git a/gestioncof/templates/registration_post.html b/gestioncof/templates/gestioncof/registration_post.html similarity index 100% rename from gestioncof/templates/registration_post.html rename to gestioncof/templates/gestioncof/registration_post.html From efea92b5d22adc3fc2dc29f07ba62dbd44cec9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 29 Jan 2017 22:49:32 +0100 Subject: [PATCH 031/213] Proper use of messages in places --- bda/templates/{ => bda}/resume_places.html | 3 --- bda/views.py | 9 ++++++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename bda/templates/{ => bda}/resume_places.html (83%) diff --git a/bda/templates/resume_places.html b/bda/templates/bda/resume_places.html similarity index 83% rename from bda/templates/resume_places.html rename to bda/templates/bda/resume_places.html index 614a1656..3785169b 100644 --- a/bda/templates/resume_places.html +++ b/bda/templates/bda/resume_places.html @@ -2,9 +2,6 @@ {% block realcontent %}

      Places attribuées

      - {% if warning %} -

      Attention, vous avez reçu plusieurs places pour des spectacles différents à la même date !

      - {% endif %} {% if places %} {% for place in places %} diff --git a/bda/views.py b/bda/views.py index ddd2fc90..039e0ec7 100644 --- a/bda/views.py +++ b/bda/views.py @@ -112,12 +112,15 @@ def places(request, tirage_id): warning = True else: dates.append(date) - return render(request, "resume_places.html", + # On prévient l'utilisateur s'il a deux places à la même date + if warning: + messages.warning(request, "Attention, vous avez reçu des places pour " + "des spectacles différents à la même date.") + return render(request, "bda/resume_places.html", {"participant": participant, "places": filtered_places, "tirage": tirage, - "total": total, - "warning": warning}) + "total": total}) @cof_required From b12b5c938fc3765bdd8dff2a429f4e14099400ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 29 Jan 2017 23:05:59 +0100 Subject: [PATCH 032/213] Proper use of messages in inscription-reventes --- bda/templates/{ => bda}/liste-reventes.html | 9 --------- bda/views.py | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 15 deletions(-) rename bda/templates/{ => bda}/liste-reventes.html (72%) diff --git a/bda/templates/liste-reventes.html b/bda/templates/bda/liste-reventes.html similarity index 72% rename from bda/templates/liste-reventes.html rename to bda/templates/bda/liste-reventes.html index c0bf8ff0..fcf57345 100644 --- a/bda/templates/liste-reventes.html +++ b/bda/templates/bda/liste-reventes.html @@ -3,15 +3,6 @@ {% block realcontent %}

      Inscriptions pour BdA-Revente

      - {% if success %} -

      Ton inscription a bien été prise en compte !

      - {% endif %} - {% if deja_revente %} -

      Des reventes existent déjà pour certains de ces spectacles ; vérifie les places disponibles sans tirage !

      - {% elif inscrit_revente %} -

      Tu as été inscrit à une revente en cours pour ce spectacle !

      - {% endif %} -
      {% csrf_token %}
      diff --git a/bda/views.py b/bda/views.py index 039e0ec7..98d4c751 100644 --- a/bda/views.py +++ b/bda/views.py @@ -427,7 +427,7 @@ def list_revente(request, tirage_id): user=request.user, tirage=tirage) deja_revente = False success = False - inscrit_revente = False + inscrit_revente = [] if request.method == 'POST': form = InscriptionReventeForm(tirage, request.POST) if form.is_valid(): @@ -454,17 +454,24 @@ def list_revente(request, tirage_id): if min_resell is not None: min_resell.answered_mail.add(participant) min_resell.save() - inscrit_revente = True + inscrit_revente.append(spectacle) success = True else: form = InscriptionReventeForm( tirage, initial={'spectacles': participant.choicesrevente.all()}) + # Messages + if success: + messages.success(request, "Ton inscription a bien été prise en compte") + if deja_revente: + messages.info(request, "Des reventes existent déjà pour certains de " + "ces spectacles, vérifie les places " + "disponibles sans tirage !") + for spectacle in inscrit_revente: + messages.info(request, "Tu as été inscrit à une revente en cours pour " + "{!s}".format(spectacle)) - return render(request, "liste-reventes.html", - {"form": form, - "deja_revente": deja_revente, "success": success, - "inscrit_revente": inscrit_revente}) + return render(request, "bda/liste-reventes.html", {"form": form}) @login_required From 1fe1b94afc138e0e425f92fa384161de33567f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 30 Jan 2017 13:12:01 +0100 Subject: [PATCH 033/213] Proper use of messages in events --- gestioncof/templates/{ => gestioncof}/event.html | 3 --- gestioncof/views.py | 9 +++++++-- 2 files changed, 7 insertions(+), 5 deletions(-) rename gestioncof/templates/{ => gestioncof}/event.html (69%) diff --git a/gestioncof/templates/event.html b/gestioncof/templates/gestioncof/event.html similarity index 69% rename from gestioncof/templates/event.html rename to gestioncof/templates/gestioncof/event.html index cc7d96d0..52f893db 100644 --- a/gestioncof/templates/event.html +++ b/gestioncof/templates/gestioncof/event.html @@ -2,9 +2,6 @@ {% block realcontent %}

      Événement: {{ event.title }}

      - {% if success %} -

      Votre inscription a bien été enregistrée ! Vous pouvez cependant la modifier jusqu'à la fin des inscriptions.

      - {% endif %} {% if event.details %}

      {{ event.details }}

      {% endif %} diff --git a/gestioncof/views.py b/gestioncof/views.py index 2a59bd14..ea0de7c8 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -224,8 +224,13 @@ def event(request, event_id): current_choices=current_registration.options) except EventRegistration.DoesNotExist: form = EventForm(event=event) - return render(request, "event.html", - {"event": event, "form": form, "success": success}) + # Messages + if success: + messages.success(request, "Votre inscription a bien été enregistrée ! " + "Vous pouvez cependant la modifier jusqu'à " + "la fin des inscriptions.") + return render(request, "gestioncof/event.html", + {"event": event, "form": form}) def clean_post_for_status(initial): From b7ecac3db6a3cd29407485482be459c56bd2b2a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 30 Jan 2017 13:19:50 +0100 Subject: [PATCH 034/213] Proper use of messages in profile edit --- gestioncof/templates/{ => gestioncof}/profile.html | 3 --- gestioncof/views.py | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) rename gestioncof/templates/{ => gestioncof}/profile.html (89%) diff --git a/gestioncof/templates/profile.html b/gestioncof/templates/gestioncof/profile.html similarity index 89% rename from gestioncof/templates/profile.html rename to gestioncof/templates/gestioncof/profile.html index 7b185150..59358239 100644 --- a/gestioncof/templates/profile.html +++ b/gestioncof/templates/gestioncof/profile.html @@ -5,9 +5,6 @@ {% block realcontent %}

      Modifier mon profil

      - {% if success %} -

      Votre profil a été mis à jour avec succès !

      - {% endif %}
      {% csrf_token %} diff --git a/gestioncof/views.py b/gestioncof/views.py index ea0de7c8..32fd39a4 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -317,15 +317,15 @@ def survey_status(request, survey_id): @cof_required def profile(request): - success = False if request.method == "POST": form = UserProfileForm(request.POST, instance=request.user.profile) if form.is_valid(): form.save() - success = True + messages.success(request, + "Votre profil a été mis à jour avec succès !") else: form = UserProfileForm(instance=request.user.profile) - return render(request, "profile.html", {"form": form, "success": success}) + return render(request, "gestioncof/profile.html", {"form": form}) def registration_set_ro_fields(user_form, profile_form): From 51c0e2dabccd9a31e84dc91450be603caaffeae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 30 Jan 2017 13:36:51 +0100 Subject: [PATCH 035/213] proper use of messages in registration --- .../templates/gestioncof/registration_post.html | 4 ---- gestioncof/views.py | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/gestioncof/templates/gestioncof/registration_post.html b/gestioncof/templates/gestioncof/registration_post.html index ce2f3786..e96fa1e7 100644 --- a/gestioncof/templates/gestioncof/registration_post.html +++ b/gestioncof/templates/gestioncof/registration_post.html @@ -2,10 +2,6 @@ {% block realcontent %}

      Inscription d'un nouveau membre

      - {% if success %} -

      L'inscription de {{ member.first_name }} {{ member.last_name }} ({{ member.username }}) a été enregistrée avec succès. - {% if member.profile.is_cof %}Il est désormais membre du COF n°{{ member.profile.num }} !{% endif %}

      - {% endif %}
      {% include "registration_form.html" %}
      diff --git a/gestioncof/views.py b/gestioncof/views.py index 32fd39a4..3fdafd28 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -388,7 +388,7 @@ def registration_form2(request, login_clipper=None, username=None): profile_form = RegistrationProfileForm() event_formset = EventFormset(events=events, prefix='events') clubs_form = ClubsForm() - return render(request, "registration_form.html", + return render(request, "gestioncof/registration_form.html", {"member": member, "login_clipper": login_clipper, "user_form": user_form, "profile_form": profile_form, @@ -491,9 +491,17 @@ def registration(request): club.membres.add(member) club.save() success = True - return render(request, "registration_post.html", - {"success": success, - "user_form": user_form, + # Messages + if success: + msg = ("L'inscription de {:s} ({:s}) a été " + "enregistrées avec succès" + .format(member.get_full_name(), member.email)) + if member.profile.is_cof: + msg += "Il est désormais membre du COF n°{:d} !".format( + member.profile.num) + messages.success(request, msg, extra_tags='safe') + return render(request, "gestioncof/registration_post.html", + {"user_form": user_form, "profile_form": profile_form, "member": member, "login_clipper": login_clipper, From fd42563f7f9a40d3f230e562076782d66208478a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 30 Jan 2017 13:46:16 +0100 Subject: [PATCH 036/213] Proper use of messages in calendar subscription --- .../{ => gestioncof}/calendar_subscription.html | 8 -------- gestioncof/views.py | 12 +++++++----- 2 files changed, 7 insertions(+), 13 deletions(-) rename gestioncof/templates/{ => gestioncof}/calendar_subscription.html (88%) diff --git a/gestioncof/templates/calendar_subscription.html b/gestioncof/templates/gestioncof/calendar_subscription.html similarity index 88% rename from gestioncof/templates/calendar_subscription.html rename to gestioncof/templates/gestioncof/calendar_subscription.html index 5f0bc988..62e154ea 100644 --- a/gestioncof/templates/calendar_subscription.html +++ b/gestioncof/templates/gestioncof/calendar_subscription.html @@ -4,14 +4,6 @@

      Calendrier dynamique

      -{% if success %} -

      Calendrier mis à jour avec succès

      -{% endif %} - -{% if error %} -

      {{ error }}

      -{% endif %} -

      Ce formulaire vous permet de définir un calendrier dynamique compatible avec n'importe quel logiciel ou application d'agenda. Vous pouvez choisir de souscrire aux événements du COF et/ou aux spectacles BdA. diff --git a/gestioncof/views.py b/gestioncof/views.py index 3fdafd28..c67691cb 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -707,15 +707,17 @@ def calendar(request): subscription.token = uuid.uuid4() subscription.save() form.save_m2m() - return render(request, "calendar_subscription.html", + messages.success(request, + "Calendrier mis à jour avec succès.") + return render(request, "gestioncof/calendar_subscription.html", {'form': form, - 'success': True, 'token': str(subscription.token)}) else: - return render(request, "calendar_subscription.html", - {'form': form, 'error': "Formulaire incorrect"}) + messages.error(request, "Formulaire incorrect.") + return render(request, "gestioncof/calendar_subscription.html", + {'form': form}) else: - return render(request, "calendar_subscription.html", + return render(request, "gestioncof/calendar_subscription.html", {'form': CalendarForm(instance=instance), 'token': instance.token if instance else None}) From 8c34e2f83fe9f92a1ce882f8336bd1c1ea37b78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 30 Jan 2017 13:50:24 +0100 Subject: [PATCH 037/213] proper use of messages in petits cours --- gestioncof/petits_cours_views.py | 11 ++++------- .../traitement_demande.html} | 6 ------ 2 files changed, 4 insertions(+), 13 deletions(-) rename gestioncof/templates/{traitement_demande_petit_cours.html => petits_cours/traitement_demande.html} (90%) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index ee71d1a9..f4cafab0 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - from django.shortcuts import render, get_object_or_404, redirect from django.core import mail from django.core.mail import EmailMessage @@ -17,6 +13,7 @@ from django.views.decorators.csrf import csrf_exempt from django.template import loader from django.conf import settings from django.contrib.auth.decorators import login_required +from django.contrib import messages from django.db.models import Min from gestioncof.models import CofProfile @@ -29,7 +26,6 @@ from gestioncof.shared import lock_table, unlock_tables from captcha.fields import ReCaptchaField from datetime import datetime -import base64 import json @@ -139,7 +135,9 @@ def _finalize_traitement(request, demande, proposals, proposed_for, 'style="width:99%; height: 90px;">' '' }) - return render(request, "traitement_demande_petit_cours.html", + for error in errors: + messages.error(request, error) + return render(request, "petits_cours/traitement_demande.html", {"demande": demande, "unsatisfied": unsatisfied, "proposals": proposals, @@ -148,7 +146,6 @@ def _finalize_traitement(request, demande, proposals, proposed_for, "mainmail": mainmail, "attribdata": json.dumps(attribdata), "redo": redo, - "errors": errors, }) diff --git a/gestioncof/templates/traitement_demande_petit_cours.html b/gestioncof/templates/petits_cours/traitement_demande.html similarity index 90% rename from gestioncof/templates/traitement_demande_petit_cours.html rename to gestioncof/templates/petits_cours/traitement_demande.html index d51f87b5..6b43fbe6 100644 --- a/gestioncof/templates/traitement_demande_petit_cours.html +++ b/gestioncof/templates/petits_cours/traitement_demande.html @@ -4,12 +4,6 @@

      Traitement de la demande de petits cours {{ demande.id }}

      {% include "details_demande_petit_cours_infos.html" %}
      - {% if errors %} -
      - Attention: -
        {% for error in errors %}
      • {{ error }}
      • {% endfor %}
      -
      - {% endif %} {% if unsatisfied %}
      Attention: Impossible de trouver des propositions pour les matières suivantes: From 13da42b82393c0f087cfb5dec2f72ec7069be737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 3 Feb 2017 23:41:33 +0100 Subject: [PATCH 038/213] typo --- gestioncof/management/commands/loaddevdata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gestioncof/management/commands/loaddevdata.py b/gestioncof/management/commands/loaddevdata.py index 8eb04fd2..77bfc606 100644 --- a/gestioncof/management/commands/loaddevdata.py +++ b/gestioncof/management/commands/loaddevdata.py @@ -27,7 +27,7 @@ DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), class Command(MyBaseCommand): help = "Charge des données de test dans la BDD" - def add_argument(self, parser): + def add_arguments(self, parser): """ Permet de ne pas créer l'utilisateur "root". """ From f274c1e978fe1f6923cd826f012e4c2bb544d11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 4 Feb 2017 00:01:15 +0100 Subject: [PATCH 039/213] Un seul message pour la liste des inscriptions --- bda/views.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bda/views.py b/bda/views.py index 98d4c751..fe43a0cb 100644 --- a/bda/views.py +++ b/bda/views.py @@ -467,9 +467,13 @@ def list_revente(request, tirage_id): messages.info(request, "Des reventes existent déjà pour certains de " "ces spectacles, vérifie les places " "disponibles sans tirage !") - for spectacle in inscrit_revente: - messages.info(request, "Tu as été inscrit à une revente en cours pour " - "{!s}".format(spectacle)) + if inscrit_revente: + shows = map("
    1. {!s}
    2. ".format, inscrit_revente) + msg = ( + "Tu as été inscrit à des reventes en cours pour les spectacles " + "
        {:s}
      ".format('\n'.join(shows)) + ) + messages.info(request, msg, extra_tags="safe") return render(request, "bda/liste-reventes.html", {"form": form}) From 1e5c55a54020a8261f70ea125200c8a980fc9603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 4 Feb 2017 11:57:58 +0100 Subject: [PATCH 040/213] update readme --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e7056f1e..bba1e66c 100644 --- a/README.md +++ b/README.md @@ -84,29 +84,30 @@ visualiser la dernière version du code. Si vous optez pour une installation manuelle plutôt que d'utiliser Vagrant, il est fortement conseillé d'utiliser un environnement virtuel pour Python. -Il vous faudra installer mercurial, pip, les librairies de développement de -python, un client et un serveur MySQL ainsi qu'un serveur redis ; sous Debian et -dérivées (Ubuntu, ...) : +Il vous faudra installer pip, les librairies de développement de python, un +client et un serveur MySQL ainsi qu'un serveur redis ; sous Debian et dérivées +(Ubuntu, ...) : - sudo apt-get install mercurial python-pip python-dev libmysqlclient-dev - redis-server + sudo apt-get install python-pip python-dev libmysqlclient-dev redis-server Si vous décidez d'utiliser un environnement virtuel Python (virtualenv; fortement conseillé), déplacez-vous dans le dossier où est installé GestioCOF (le dossier où se trouve ce README), et créez-le maintenant : - virtualenv env + virtualenv env -p $(which python3) -Pour l'activer, il faut faire +L'option `-p` sert à préciser l'exécutable python à utiliser. Vous devez choisir +python3, si c'est la version de python par défaut sur votre système, ceci n'est +pas nécessaire. Pour l'activer, il faut faire . env/bin/activate dans le même dossier. -Vous pouvez maintenant installer les dépendances Python depuis les fichiers -`requirements.txt` et `requirements-devel.txt` : +Vous pouvez maintenant installer les dépendances Python depuis le fichier +`requirements-devel.txt` : - pip install -r requirements.txt -r requirements-devel.txt + pip install -r requirements-devel.txt Copiez le fichier `cof/settings_dev.py` dans `cof/settings.py`. From bb4e9dde4f0aa88f3fa6017e5e0f4b4662c080a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 5 Feb 2017 13:32:31 +0100 Subject: [PATCH 041/213] End of py2 support --- gestioncof/petits_cours_models.py | 11 +---------- gestioncof/petits_cours_views.py | 4 ---- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/gestioncof/petits_cours_models.py b/gestioncof/petits_cours_models.py index 4428b78c..7e4f4165 100644 --- a/gestioncof/petits_cours_models.py +++ b/gestioncof/petits_cours_models.py @@ -1,14 +1,10 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from functools import reduce from django.db import models from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ -from django.utils.encoding import python_2_unicode_compatible -from django.utils.six.moves import reduce def choices_length(choices): @@ -24,7 +20,6 @@ LEVELS_CHOICES = ( ) -@python_2_unicode_compatible class PetitCoursSubject(models.Model): name = models.CharField(_("Matière"), max_length=30) users = models.ManyToManyField(User, related_name="petits_cours_matieres", @@ -38,7 +33,6 @@ class PetitCoursSubject(models.Model): return self.name -@python_2_unicode_compatible class PetitCoursAbility(models.Model): user = models.ForeignKey(User) matiere = models.ForeignKey(PetitCoursSubject, verbose_name=_("Matière")) @@ -56,7 +50,6 @@ class PetitCoursAbility(models.Model): self.matiere, self.niveau) -@python_2_unicode_compatible class PetitCoursDemande(models.Model): name = models.CharField(_("Nom/prénom"), max_length=200) email = models.CharField(_("Adresse email"), max_length=300) @@ -103,7 +96,6 @@ class PetitCoursDemande(models.Model): self.created.strftime("%d %b %Y")) -@python_2_unicode_compatible class PetitCoursAttribution(models.Model): user = models.ForeignKey(User) demande = models.ForeignKey(PetitCoursDemande, verbose_name=_("Demande")) @@ -122,7 +114,6 @@ class PetitCoursAttribution(models.Model): % (self.demande.id, self.user.username, self.matiere) -@python_2_unicode_compatible class PetitCoursAttributionCounter(models.Model): user = models.ForeignKey(User) matiere = models.ForeignKey(PetitCoursSubject, verbose_name=_("Matiere")) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index ee71d1a9..40b0feb9 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - from django.shortcuts import render, get_object_or_404, redirect from django.core import mail from django.core.mail import EmailMessage From 2bc5f3d64666da1e004caa6aeda8b7c26a77fbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 5 Feb 2017 13:49:01 +0100 Subject: [PATCH 042/213] Style and PEP8 - Drop `%` in favour of `.format` which has a better specification - Remove a string concatenation - Remove the trailing slashes according to the PEP8: https://www.python.org/dev/peps/pep-0008/#maximum-line-length NB. We let some which will disappear in the next commit. - Remove an unused import and change the imports order --- gestioncof/petits_cours_models.py | 22 +++++++++------- gestioncof/petits_cours_views.py | 42 +++++++++++++++++-------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/gestioncof/petits_cours_models.py b/gestioncof/petits_cours_models.py index 7e4f4165..6d9dac82 100644 --- a/gestioncof/petits_cours_models.py +++ b/gestioncof/petits_cours_models.py @@ -46,8 +46,9 @@ class PetitCoursAbility(models.Model): verbose_name_plural = "Compétences des petits cours" def __str__(self): - return "%s - %s - %s" % (self.user.username, - self.matiere, self.niveau) + return "{:s} - {!s} - {:s}".format( + self.user.username, self.matiere, self.niveau + ) class PetitCoursDemande(models.Model): @@ -63,7 +64,7 @@ class PetitCoursDemande(models.Model): freq = models.CharField( _("Fréquence"), help_text=_("Indiquez ici la fréquence envisagée " - + "(hebdomadaire, 2 fois par semaine, ...)"), + "(hebdomadaire, 2 fois par semaine, ...)"), max_length=300, blank=True) lieu = models.CharField( _("Lieu (si préférence)"), @@ -92,8 +93,9 @@ class PetitCoursDemande(models.Model): verbose_name_plural = "Demandes de petits cours" def __str__(self): - return "Demande %d du %s" % (self.id, - self.created.strftime("%d %b %Y")) + return "Demande {:d} du {:s}".format( + self.id, self.created.strftime("%d %b %Y") + ) class PetitCoursAttribution(models.Model): @@ -110,8 +112,9 @@ class PetitCoursAttribution(models.Model): verbose_name_plural = "Attributions de petits cours" def __str__(self): - return "Attribution de la demande %d à %s pour %s" \ - % (self.demande.id, self.user.username, self.matiere) + return "Attribution de la demande {:d} à {:s} pour {!s}".format( + self.demande.id, self.user.username, self.matiere + ) class PetitCoursAttributionCounter(models.Model): @@ -124,5 +127,6 @@ class PetitCoursAttributionCounter(models.Model): verbose_name_plural = "Compteurs d'attributions de petits cours" def __str__(self): - return "%d demandes envoyées à %s pour %s" \ - % (self.count, self.user.username, self.matiere) + return "{:d} demandes envoyées à {:s} pour {!s}".format( + self.count, self.user.username, self.matiere + ) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 40b0feb9..f9a038a7 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +import json +from datetime import datetime + from django.shortcuts import render, get_object_or_404, redirect from django.core import mail from django.core.mail import EmailMessage @@ -16,18 +19,15 @@ from django.contrib.auth.decorators import login_required from django.db.models import Min from gestioncof.models import CofProfile -from gestioncof.petits_cours_models import PetitCoursDemande, \ - PetitCoursAttribution, PetitCoursAttributionCounter, PetitCoursAbility, \ - PetitCoursSubject +from gestioncof.petits_cours_models import ( + PetitCoursDemande, PetitCoursAttribution, PetitCoursAttributionCounter, + PetitCoursAbility, PetitCoursSubject +) from gestioncof.decorators import buro_required from gestioncof.shared import lock_table, unlock_tables from captcha.fields import ReCaptchaField -from datetime import datetime -import base64 -import json - class DemandeListView(ListView): model = PetitCoursDemande @@ -174,17 +174,19 @@ def _traitement_other_preparing(request, demande): proposals[matiere] = [] for choice_id in range(min(3, len(candidates))): choice = int( - request.POST["proposal-%d-%d" % (matiere.id, choice_id)]) + request.POST["proposal-{:d}-{:d}" + .format(matiere.id, choice_id)] + ) if choice == -1: continue if choice not in candidates: - errors.append("Choix invalide pour la proposition %d" - "en %s" % (choice_id + 1, matiere)) + errors.append("Choix invalide pour la proposition {:d}" + "en {!s}".format(choice_id + 1, matiere)) continue user = candidates[choice] if user in proposals[matiere]: - errors.append("La proposition %d en %s est un doublon" - % (choice_id + 1, matiere)) + errors.append("La proposition {:d} en {!s} est un doublon" + .format(choice_id + 1, matiere)) continue proposals[matiere].append(user) attribdata[matiere.id].append(user.id) @@ -193,12 +195,13 @@ def _traitement_other_preparing(request, demande): else: proposed_for[user].append(matiere) if not proposals[matiere]: - errors.append("Aucune proposition pour %s" % (matiere,)) + errors.append("Aucune proposition pour {!s}".format(matiere)) elif len(proposals[matiere]) < 3: - errors.append("Seulement %d proposition%s pour %s" - % (len(proposals[matiere]), - "s" if len(proposals[matiere]) > 1 else "", - matiere)) + errors.append("Seulement {:d} proposition{:s} pour {!s}" + .format( + len(proposals[matiere]), + "s" if len(proposals[matiere]) > 1 else "", + matiere)) else: unsatisfied.append(matiere) return _finalize_traitement(request, demande, proposals, proposed_for, @@ -350,8 +353,9 @@ def inscription(request): profile.save() lock_table(PetitCoursAttributionCounter, PetitCoursAbility, User, PetitCoursSubject) - abilities = PetitCoursAbility.objects \ - .filter(user=request.user).all() + abilities = ( + PetitCoursAbility.objects.filter(user=request.user).all() + ) for ability in abilities: _get_attrib_counter(ability.user, ability.matiere) unlock_tables() From 81681ad0e567e4565a3c4ed1e1a9f208ea153d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 5 Feb 2017 17:07:58 +0100 Subject: [PATCH 043/213] Turn 2 functions into class/objects methods - `_get_attrib_counter` become a classmethod of `PetitCoursAttributionCounter` - `_get_demande_candidates` become a method of `PetitCoursDemande` --- gestioncof/petits_cours_models.py | 46 ++++++++++++++++++++++++++++ gestioncof/petits_cours_views.py | 51 +++++++++---------------------- 2 files changed, 61 insertions(+), 36 deletions(-) diff --git a/gestioncof/petits_cours_models.py b/gestioncof/petits_cours_models.py index 6d9dac82..753e8674 100644 --- a/gestioncof/petits_cours_models.py +++ b/gestioncof/petits_cours_models.py @@ -3,6 +3,7 @@ from functools import reduce from django.db import models +from django.db.models import Min from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ @@ -88,6 +89,32 @@ class PetitCoursDemande(models.Model): blank=True, null=True) created = models.DateTimeField(_("Date de création"), auto_now_add=True) + def get_candidates(self, redo=False): + """ + Donne la liste des profs disponibles pour chaque matière de la demande. + - On ne donne que les agrégés si c'est demandé + - Si ``redo`` vaut ``True``, cela signifie qu'on retraite la demande et + il ne faut pas proposer à nouveau des noms qui ont déjà été proposés + """ + for matiere in self.matieres.all(): + candidates = PetitCoursAbility.objects.filter( + matiere=matiere, + niveau=self.niveau, + user__profile__is_cof=True, + user__profile__petits_cours_accept=True + ) + if self.agrege_requis: + candidates = candidates.filter(agrege=True) + if redo: + attrs = self.petitcoursattribution_set.filter(matiere=matiere) + already_proposed = [ + attr.user + for attr in attrs + ] + candidates = candidates.exclude(user__in=already_proposed) + candidates = candidates.order_by('?').select_related().all() + yield (matiere, candidates) + class Meta: verbose_name = "Demande de petits cours" verbose_name_plural = "Demandes de petits cours" @@ -122,6 +149,25 @@ class PetitCoursAttributionCounter(models.Model): matiere = models.ForeignKey(PetitCoursSubject, verbose_name=_("Matiere")) count = models.IntegerField("Nombre d'envois", default=0) + @classmethod + def get_uptodate(cls, user, matiere): + """ + Donne le compteur de l'utilisateur pour cette matière. Si le compteur + n'existe pas encore, il est initialisé avec le minimum des valeurs des + compteurs de tout le monde. + """ + counter, created = cls.objects.get_or_create( + user=user, matiere=matiere) + if created: + mincount = ( + cls.objects.filter(matiere=matiere).exclude(user=user) + .aggregate(Min('count')) + ['count__min'] + ) + counter.count = mincount + counter.save() + return counter + class Meta: verbose_name = "Compteur d'attribution de petits cours" verbose_name_plural = "Compteurs d'attributions de petits cours" diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index f9a038a7..68befaf7 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -16,7 +16,6 @@ from django.views.decorators.csrf import csrf_exempt from django.template import loader from django.conf import settings from django.contrib.auth.decorators import login_required -from django.db.models import Min from gestioncof.models import CofProfile from gestioncof.petits_cours_models import ( @@ -51,35 +50,6 @@ def details(request, demande_id): "attributions": attributions}) -def _get_attrib_counter(user, matiere): - counter, created = PetitCoursAttributionCounter \ - .objects.get_or_create(user=user, matiere=matiere) - if created: - mincount = PetitCoursAttributionCounter.objects \ - .filter(matiere=matiere).exclude(user=user).all() \ - .aggregate(Min('count')) - counter.count = mincount['count__min'] - counter.save() - return counter - - -def _get_demande_candidates(demande, redo=False): - for matiere in demande.matieres.all(): - candidates = PetitCoursAbility.objects.filter(matiere=matiere, - niveau=demande.niveau) - candidates = candidates.filter(user__profile__is_cof=True, - user__profile__petits_cours_accept=True) - if demande.agrege_requis: - candidates = candidates.filter(agrege=True) - if redo: - attributions = PetitCoursAttribution.objects \ - .filter(demande=demande, matiere=matiere).all() - for attrib in attributions: - candidates = candidates.exclude(user=attrib.user) - candidates = candidates.order_by('?').select_related().all() - yield (matiere, candidates) - - @buro_required def traitement(request, demande_id, redo=False): demande = get_object_or_404(PetitCoursDemande, id=demande_id) @@ -91,12 +61,15 @@ def traitement(request, demande_id, redo=False): proposed_for = {} unsatisfied = [] attribdata = {} - for matiere, candidates in _get_demande_candidates(demande, redo): + for matiere, candidates in demande.get_candidates(redo): if candidates: tuples = [] for candidate in candidates: user = candidate.user - tuples.append((candidate, _get_attrib_counter(user, matiere))) + tuples.append(( + candidate, + PetitCoursAttributionCounter.get_uptodate(user, matiere) + )) tuples = sorted(tuples, key=lambda c: c[1].count) candidates, _ = zip(*tuples) candidates = candidates[0:min(3, len(candidates))] @@ -166,7 +139,7 @@ def _traitement_other_preparing(request, demande): proposed_for = {} attribdata = {} errors = [] - for matiere, candidates in _get_demande_candidates(demande, redo): + for matiere, candidates in demande.get_candidates(redo): if candidates: candidates = dict([(candidate.user.id, candidate.user) for candidate in candidates]) @@ -218,12 +191,15 @@ def _traitement_other(request, demande, redo): proposed_for = {} unsatisfied = [] attribdata = {} - for matiere, candidates in _get_demande_candidates(demande, redo): + for matiere, candidates in demande.get_candidates(redo): if candidates: tuples = [] for candidate in candidates: user = candidate.user - tuples.append((candidate, _get_attrib_counter(user, matiere))) + tuples.append(( + candidate, + PetitCoursAttributionCounter.get_uptodate(user, matiere) + )) tuples = sorted(tuples, key=lambda c: c[1].count) candidates, _ = zip(*tuples) attribdata[matiere.id] = [] @@ -357,7 +333,10 @@ def inscription(request): PetitCoursAbility.objects.filter(user=request.user).all() ) for ability in abilities: - _get_attrib_counter(ability.user, ability.matiere) + PetitCoursAttributionCounter.get_uptodate( + ability.user, + ability.matiere + ) unlock_tables() success = True formset = MatieresFormSet(instance=request.user) From 9aa4782d5733b6c83cf1641a8cbcee76e4338ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 5 Feb 2017 17:10:51 +0100 Subject: [PATCH 044/213] Move petits-cours forms in another file --- gestioncof/petits_cours_forms.py | 54 ++++++++++++++++++++++++++++++++ gestioncof/petits_cours_views.py | 46 +-------------------------- 2 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 gestioncof/petits_cours_forms.py diff --git a/gestioncof/petits_cours_forms.py b/gestioncof/petits_cours_forms.py new file mode 100644 index 00000000..dfb7a263 --- /dev/null +++ b/gestioncof/petits_cours_forms.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +from captcha.fields import ReCaptchaField + +from django import forms +from django.forms import ModelForm +from django.forms.models import inlineformset_factory, BaseInlineFormSet +from django.contrib.auth.models import User + +from gestioncof.petits_cours_models import PetitCoursDemande, PetitCoursAbility + + +class BaseMatieresFormSet(BaseInlineFormSet): + def clean(self): + super(BaseMatieresFormSet, self).clean() + if any(self.errors): + # Don't bother validating the formset unless each form is + # valid on its own + return + matieres = [] + for i in range(0, self.total_form_count()): + form = self.forms[i] + if not form.cleaned_data: + continue + matiere = form.cleaned_data['matiere'] + niveau = form.cleaned_data['niveau'] + delete = form.cleaned_data['DELETE'] + if not delete and (matiere, niveau) in matieres: + raise forms.ValidationError( + "Vous ne pouvez pas vous inscrire deux fois pour la " + "même matiere avec le même niveau.") + matieres.append((matiere, niveau)) + + +class DemandeForm(ModelForm): + captcha = ReCaptchaField(attrs={'theme': 'clean', 'lang': 'fr'}) + + def __init__(self, *args, **kwargs): + super(DemandeForm, self).__init__(*args, **kwargs) + self.fields['matieres'].help_text = '' + + class Meta: + model = PetitCoursDemande + fields = ('name', 'email', 'phone', 'quand', 'freq', 'lieu', + 'matieres', 'agrege_requis', 'niveau', 'remarques') + widgets = {'matieres': forms.CheckboxSelectMultiple} + + +MatieresFormSet = inlineformset_factory( + User, + PetitCoursAbility, + fields=("matiere", "niveau", "agrege"), + formset=BaseMatieresFormSet +) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 68befaf7..ec32358d 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -6,9 +6,6 @@ from datetime import datetime from django.shortcuts import render, get_object_or_404, redirect from django.core import mail from django.core.mail import EmailMessage -from django.forms import ModelForm -from django import forms -from django.forms.models import inlineformset_factory, BaseInlineFormSet from django.contrib.auth.models import User from django.views.generic import ListView from django.utils.decorators import method_decorator @@ -22,11 +19,10 @@ from gestioncof.petits_cours_models import ( PetitCoursDemande, PetitCoursAttribution, PetitCoursAttributionCounter, PetitCoursAbility, PetitCoursSubject ) +from gestioncof.petits_cours_forms import DemandeForm, MatieresFormSet from gestioncof.decorators import buro_required from gestioncof.shared import lock_table, unlock_tables -from captcha.fields import ReCaptchaField - class DemandeListView(ListView): model = PetitCoursDemande @@ -288,37 +284,11 @@ def _traitement_post(request, demande): }) -class BaseMatieresFormSet(BaseInlineFormSet): - def clean(self): - super(BaseMatieresFormSet, self).clean() - if any(self.errors): - # Don't bother validating the formset unless each form is - # valid on its own - return - matieres = [] - for i in range(0, self.total_form_count()): - form = self.forms[i] - if not form.cleaned_data: - continue - matiere = form.cleaned_data['matiere'] - niveau = form.cleaned_data['niveau'] - delete = form.cleaned_data['DELETE'] - if not delete and (matiere, niveau) in matieres: - raise forms.ValidationError( - "Vous ne pouvez pas vous inscrire deux fois pour la " - "même matiere avec le même niveau.") - matieres.append((matiere, niveau)) - - @login_required def inscription(request): profile, created = CofProfile.objects.get_or_create(user=request.user) if not profile.is_cof: return redirect("cof-denied") - MatieresFormSet = inlineformset_factory(User, PetitCoursAbility, - fields=("matiere", "niveau", - "agrege",), - formset=BaseMatieresFormSet) success = False if request.method == "POST": formset = MatieresFormSet(request.POST, instance=request.user) @@ -348,20 +318,6 @@ def inscription(request): "remarques": profile.petits_cours_remarques}) -class DemandeForm(ModelForm): - captcha = ReCaptchaField(attrs={'theme': 'clean', 'lang': 'fr'}) - - def __init__(self, *args, **kwargs): - super(DemandeForm, self).__init__(*args, **kwargs) - self.fields['matieres'].help_text = '' - - class Meta: - model = PetitCoursDemande - fields = ('name', 'email', 'phone', 'quand', 'freq', 'lieu', - 'matieres', 'agrege_requis', 'niveau', 'remarques') - widgets = {'matieres': forms.CheckboxSelectMultiple} - - @csrf_exempt def demande(request): success = False From 45eb384cfd6c096d53e4b9e94ee96e15fff15800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sun, 5 Feb 2017 17:35:41 +0100 Subject: [PATCH 045/213] Use class-based views See #94 --- gestioncof/petits_cours_views.py | 21 ++++++++----------- .../details_demande_petit_cours.html | 14 ++++++------- gestioncof/urls.py | 14 ++++++------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index ec32358d..3228ccd1 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -7,8 +7,7 @@ from django.shortcuts import render, get_object_or_404, redirect from django.core import mail from django.core.mail import EmailMessage from django.contrib.auth.models import User -from django.views.generic import ListView -from django.utils.decorators import method_decorator +from django.views.generic import ListView, DetailView from django.views.decorators.csrf import csrf_exempt from django.template import loader from django.conf import settings @@ -32,18 +31,16 @@ class DemandeListView(ListView): def get_queryset(self): return PetitCoursDemande.objects.order_by('traitee', '-id').all() - @method_decorator(buro_required) - def dispatch(self, *args, **kwargs): - return super(DemandeListView, self).dispatch(*args, **kwargs) +class DemandeDetailView(DetailView): + model = PetitCoursDemande + template_name = "details_demande_petit_cours.html" -@buro_required -def details(request, demande_id): - demande = get_object_or_404(PetitCoursDemande, id=demande_id) - attributions = PetitCoursAttribution.objects.filter(demande=demande).all() - return render(request, "details_demande_petit_cours.html", - {"demande": demande, - "attributions": attributions}) + def get_context_data(self, **kwargs): + context = super(DemandeDetailView, self).get_context_data(**kwargs) + obj = context['object'] + context['attributions'] = obj.petitcoursattribution_set.all() + return context @buro_required diff --git a/gestioncof/templates/details_demande_petit_cours.html b/gestioncof/templates/details_demande_petit_cours.html index b51c0dc0..1a0ed240 100644 --- a/gestioncof/templates/details_demande_petit_cours.html +++ b/gestioncof/templates/details_demande_petit_cours.html @@ -8,10 +8,10 @@ {% include "details_demande_petit_cours_infos.html" %}
      - - {% if demande.traitee %} - - + + {% if object.traitee %} + + {% endif %}
      Traitée
      Traitée par {{ demande.traitee_par }}
      Traitée le {{ demande.processed }}
      Traitée
      Traitée par {{ object.traitee_par }}
      Traitée le {{ object.processed }}
      Attributions
        @@ -23,15 +23,15 @@
      - {% if demande.traitee %} + {% if object.traitee %}
      - +
      {% else %}
      -
      +
      diff --git a/gestioncof/urls.py b/gestioncof/urls.py index ad108005..9a562e7e 100644 --- a/gestioncof/urls.py +++ b/gestioncof/urls.py @@ -1,12 +1,9 @@ # -*- coding: utf-8 -*- -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals - from django.conf.urls import url -from gestioncof.petits_cours_views import DemandeListView +from gestioncof.petits_cours_views import DemandeListView, DemandeDetailView from gestioncof import views, petits_cours_views +from gestioncof.decorators import buro_required export_patterns = [ url(r'^members$', views.export_members), @@ -24,10 +21,11 @@ petitcours_patterns = [ name='petits-cours-demande'), url(r'^demande-raw$', petits_cours_views.demande_raw, name='petits-cours-demande-raw'), - url(r'^demandes$', DemandeListView.as_view(), + url(r'^demandes$', + buro_required(DemandeListView.as_view()), name='petits-cours-demandes-list'), - url(r'^demandes/(?P\d+)$', - petits_cours_views.details, + url(r'^demandes/(?P\d+)$', + buro_required(DemandeDetailView.as_view()), name='petits-cours-demande-details'), url(r'^demandes/(?P\d+)/traitement$', petits_cours_views.traitement, From 2013fec68bcd5f073dbf1ddb5367373fe61b4a55 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Tue, 7 Feb 2017 18:42:31 -0200 Subject: [PATCH 046/213] move fixtures --- kfet/{fixtures => management/data}/accounts.json | 0 kfet/{fixtures => management/data}/articles.json | 0 kfet/{fixtures => management/data}/groups.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename kfet/{fixtures => management/data}/accounts.json (100%) rename kfet/{fixtures => management/data}/articles.json (100%) rename kfet/{fixtures => management/data}/groups.json (100%) diff --git a/kfet/fixtures/accounts.json b/kfet/management/data/accounts.json similarity index 100% rename from kfet/fixtures/accounts.json rename to kfet/management/data/accounts.json diff --git a/kfet/fixtures/articles.json b/kfet/management/data/articles.json similarity index 100% rename from kfet/fixtures/articles.json rename to kfet/management/data/articles.json diff --git a/kfet/fixtures/groups.json b/kfet/management/data/groups.json similarity index 100% rename from kfet/fixtures/groups.json rename to kfet/management/data/groups.json From 8346dd65d1fd222577adb10277857d57b55dbc51 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Tue, 7 Feb 2017 23:22:31 -0200 Subject: [PATCH 047/213] dev data kfet --- gestioncof/management/commands/loaddevdata.py | 6 + .../data => fixtures}/articles.json | 0 kfet/management/commands/loadkfetdevdata.py | 123 ++ kfet/management/data/accounts.json | 1178 ----------------- kfet/management/data/groups.json | 98 -- 5 files changed, 129 insertions(+), 1276 deletions(-) rename kfet/{management/data => fixtures}/articles.json (100%) create mode 100644 kfet/management/commands/loadkfetdevdata.py delete mode 100644 kfet/management/data/accounts.json delete mode 100644 kfet/management/data/groups.json diff --git a/gestioncof/management/commands/loaddevdata.py b/gestioncof/management/commands/loaddevdata.py index 77bfc606..7358c695 100644 --- a/gestioncof/management/commands/loaddevdata.py +++ b/gestioncof/management/commands/loaddevdata.py @@ -107,3 +107,9 @@ class Command(MyBaseCommand): # --- call_command('loadbdadevdata') + + # --- + # La K-Fêt + # --- + + call_command('loadkfetdevdata') diff --git a/kfet/management/data/articles.json b/kfet/fixtures/articles.json similarity index 100% rename from kfet/management/data/articles.json rename to kfet/fixtures/articles.json diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py new file mode 100644 index 00000000..149bdd5e --- /dev/null +++ b/kfet/management/commands/loadkfetdevdata.py @@ -0,0 +1,123 @@ +""" +Crée des utilisateurs, des articles et des opérations aléatoires +""" + +import os +import random +from datetime import timedelta + +from django.utils import timezone +from django.contrib.auth.models import User, Group, Permission, ContentType + +from gestioncof.management.base import MyBaseCommand +from gestioncof.models import CofProfile +from kfet.models import Account, Article, OperationGroup, Operation, Transfer, \ + Checkout + +# Où sont stockés les fichiers json +DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), + 'data') + + +class Command(MyBaseCommand): + help = "Crée des utilisateurs, des articles et des opérations aléatoires" + + def handle(self, *args, **options): + # --- + # Groupes + # --- + + Group.objects.filter(name__icontains='K-Fêt').delete() + + group_chef = Group(name="K-Fêt César") + group_boy = Group(name="K-Fêt Légionnaire") + + group_chef.save() + group_boy.save() + + permissions_chef = Permission.objects.filter( + content_type__in=ContentType.objects.filter( + app_label='kfet')) + permissions_boy = Permission.objects.filter( + codename__in=['is_team', 'perform_deposit']) + + group_chef.permissions.add(*permissions_chef) + group_boy.permissions.add(*permissions_boy) + + # --- + # Comptes + # --- + + gaulois = CofProfile.objects.filter(user__last_name='Gaulois') + gaulois_trigramme = map('{:03d}'.format, range(50)) + + romains = CofProfile.objects.filter(user__last_name='Romain') + romains_trigramme = map(lambda x: str(100+x), range(50)) + + for (profile, trigramme) in zip(gaulois, gaulois_trigramme): + account, _ = Account.objects.get_or_create( + trigramme=trigramme, + cofprofile=profile + ) + + if profile.user.first_name == 'Abraracourcix': + profile.user.groups.add(group_chef) + + for (profile, trigramme) in zip(romains, romains_trigramme): + account, _ = Account.objects.get_or_create( + trigramme=trigramme, + cofprofile=profile + ) + + if random.random() > 0.75: + profile.user.groups.add(group_boy) + + # Compte liquide + + liq_user, _ = User.objects.get_or_create(username='liquide') + liq_profile, _ = CofProfile.objects.get_or_create(user=liq_user) + account = Account.objects.get_or_create(cofprofile=liq_profile, + trigramme='LIQ') + + # --- + # Opérations + # --- + + articles = Article.objects.all() + accounts = Account.objects.all() + checkout = Checkout.objects.all()[0] + + num_op = 100 + past_date = 3600*24*5 + + for i in range(num_op): + account = random.choice(accounts) + amount = 0 + at = timezone.now() - timedelta( + seconds=random.randint(0, past_date)) + + opegroup = OperationGroup( + on_acc=account, + checkout=checkout, + at=at, + is_cof=account.cofprofile.is_cof) + + opegroup.save() + + for j in range(random.randint(1, 4)): + # For now, all operations are purchases, w/o addcost + article = random.choice(articles) + nb = random.randint(1, 5) + + ope = Operation( + group=opegroup, + type=Operation.PURCHASE, + amount=-article.price*nb, + article=article, + article_nb=nb + ) + ope.save() + amount += ope.amount + + opegroup.amount = amount + opegroup.save() diff --git a/kfet/management/data/accounts.json b/kfet/management/data/accounts.json deleted file mode 100644 index 4d9255ca..00000000 --- a/kfet/management/data/accounts.json +++ /dev/null @@ -1,1178 +0,0 @@ -[ -{ - "pk": 1, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 1, - "created_at": "2017-01-02T23:13:49.236Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "000" - }, - "model": "kfet.account" -}, -{ - "pk": 2, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 2, - "created_at": "2017-01-02T23:13:49.242Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "001" - }, - "model": "kfet.account" -}, -{ - "pk": 3, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 3, - "created_at": "2017-01-02T23:13:49.245Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "002" - }, - "model": "kfet.account" -}, -{ - "pk": 4, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 4, - "created_at": "2017-01-02T23:13:49.250Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "003" - }, - "model": "kfet.account" -}, -{ - "pk": 5, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 5, - "created_at": "2017-01-02T23:13:49.253Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "004" - }, - "model": "kfet.account" -}, -{ - "pk": 6, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 6, - "created_at": "2017-01-02T23:13:49.256Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "005" - }, - "model": "kfet.account" -}, -{ - "pk": 7, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 7, - "created_at": "2017-01-02T23:13:49.258Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "006" - }, - "model": "kfet.account" -}, -{ - "pk": 8, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 8, - "created_at": "2017-01-02T23:13:49.259Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "007" - }, - "model": "kfet.account" -}, -{ - "pk": 9, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 9, - "created_at": "2017-01-02T23:13:49.261Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "008" - }, - "model": "kfet.account" -}, -{ - "pk": 10, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 10, - "created_at": "2017-01-02T23:13:49.262Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "009" - }, - "model": "kfet.account" -}, -{ - "pk": 11, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 11, - "created_at": "2017-01-02T23:13:49.264Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "010" - }, - "model": "kfet.account" -}, -{ - "pk": 12, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 12, - "created_at": "2017-01-02T23:13:49.265Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "011" - }, - "model": "kfet.account" -}, -{ - "pk": 13, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 13, - "created_at": "2017-01-02T23:13:49.266Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "012" - }, - "model": "kfet.account" -}, -{ - "pk": 14, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 14, - "created_at": "2017-01-02T23:13:49.267Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "013" - }, - "model": "kfet.account" -}, -{ - "pk": 15, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 15, - "created_at": "2017-01-02T23:13:49.268Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "014" - }, - "model": "kfet.account" -}, -{ - "pk": 16, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 16, - "created_at": "2017-01-02T23:13:49.269Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "015" - }, - "model": "kfet.account" -}, -{ - "pk": 17, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 17, - "created_at": "2017-01-02T23:13:49.270Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "016" - }, - "model": "kfet.account" -}, -{ - "pk": 18, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 18, - "created_at": "2017-01-02T23:13:49.271Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "017" - }, - "model": "kfet.account" -}, -{ - "pk": 19, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 19, - "created_at": "2017-01-02T23:13:49.272Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "018" - }, - "model": "kfet.account" -}, -{ - "pk": 20, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 20, - "created_at": "2017-01-02T23:13:49.273Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "019" - }, - "model": "kfet.account" -}, -{ - "pk": 21, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 21, - "created_at": "2017-01-02T23:13:49.274Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "020" - }, - "model": "kfet.account" -}, -{ - "pk": 22, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 22, - "created_at": "2017-01-02T23:13:49.274Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "021" - }, - "model": "kfet.account" -}, -{ - "pk": 23, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 23, - "created_at": "2017-01-02T23:13:49.275Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "022" - }, - "model": "kfet.account" -}, -{ - "pk": 24, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 24, - "created_at": "2017-01-02T23:13:49.276Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "023" - }, - "model": "kfet.account" -}, -{ - "pk": 25, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 25, - "created_at": "2017-01-02T23:13:49.277Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "024" - }, - "model": "kfet.account" -}, -{ - "pk": 26, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 26, - "created_at": "2017-01-02T23:13:49.296Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "025" - }, - "model": "kfet.account" -}, -{ - "pk": 27, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 27, - "created_at": "2017-01-02T23:13:49.297Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "026" - }, - "model": "kfet.account" -}, -{ - "pk": 28, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 28, - "created_at": "2017-01-02T23:13:49.298Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "027" - }, - "model": "kfet.account" -}, -{ - "pk": 29, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 29, - "created_at": "2017-01-02T23:13:49.299Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "028" - }, - "model": "kfet.account" -}, -{ - "pk": 30, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 30, - "created_at": "2017-01-02T23:13:49.300Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "029" - }, - "model": "kfet.account" -}, -{ - "pk": 31, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 31, - "created_at": "2017-01-02T23:13:49.301Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "030" - }, - "model": "kfet.account" -}, -{ - "pk": 32, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 32, - "created_at": "2017-01-02T23:13:49.302Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "031" - }, - "model": "kfet.account" -}, -{ - "pk": 33, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 33, - "created_at": "2017-01-02T23:13:49.302Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "032" - }, - "model": "kfet.account" -}, -{ - "pk": 34, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 34, - "created_at": "2017-01-02T23:13:49.303Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "033" - }, - "model": "kfet.account" -}, -{ - "pk": 35, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 35, - "created_at": "2017-01-02T23:13:49.304Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "034" - }, - "model": "kfet.account" -}, -{ - "pk": 36, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 36, - "created_at": "2017-01-02T23:13:49.305Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "035" - }, - "model": "kfet.account" -}, -{ - "pk": 37, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 37, - "created_at": "2017-01-02T23:13:49.306Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "036" - }, - "model": "kfet.account" -}, -{ - "pk": 38, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 38, - "created_at": "2017-01-02T23:13:49.307Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "037" - }, - "model": "kfet.account" -}, -{ - "pk": 39, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 39, - "created_at": "2017-01-02T23:13:49.307Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "038" - }, - "model": "kfet.account" -}, -{ - "pk": 40, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 40, - "created_at": "2017-01-02T23:13:49.308Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "039" - }, - "model": "kfet.account" -}, -{ - "pk": 41, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 64, - "created_at": "2017-01-02T23:21:11.760Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "100" - }, - "model": "kfet.account" -}, -{ - "pk": 42, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 65, - "created_at": "2017-01-02T23:21:11.766Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "101" - }, - "model": "kfet.account" -}, -{ - "pk": 43, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 66, - "created_at": "2017-01-02T23:21:11.768Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "102" - }, - "model": "kfet.account" -}, -{ - "pk": 44, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 67, - "created_at": "2017-01-02T23:21:11.769Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "103" - }, - "model": "kfet.account" -}, -{ - "pk": 45, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 68, - "created_at": "2017-01-02T23:21:11.770Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "104" - }, - "model": "kfet.account" -}, -{ - "pk": 46, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 69, - "created_at": "2017-01-02T23:21:11.771Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "105" - }, - "model": "kfet.account" -}, -{ - "pk": 47, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 70, - "created_at": "2017-01-02T23:21:11.773Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "106" - }, - "model": "kfet.account" -}, -{ - "pk": 48, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 71, - "created_at": "2017-01-02T23:21:11.775Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "107" - }, - "model": "kfet.account" -}, -{ - "pk": 49, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 72, - "created_at": "2017-01-02T23:21:11.776Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "108" - }, - "model": "kfet.account" -}, -{ - "pk": 50, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 73, - "created_at": "2017-01-02T23:21:11.777Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "109" - }, - "model": "kfet.account" -}, -{ - "pk": 51, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 74, - "created_at": "2017-01-02T23:21:11.778Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "110" - }, - "model": "kfet.account" -}, -{ - "pk": 52, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 75, - "created_at": "2017-01-02T23:21:11.779Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "111" - }, - "model": "kfet.account" -}, -{ - "pk": 53, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 76, - "created_at": "2017-01-02T23:21:11.780Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "112" - }, - "model": "kfet.account" -}, -{ - "pk": 54, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 77, - "created_at": "2017-01-02T23:21:11.781Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "113" - }, - "model": "kfet.account" -}, -{ - "pk": 55, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 78, - "created_at": "2017-01-02T23:21:11.783Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "114" - }, - "model": "kfet.account" -}, -{ - "pk": 56, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 79, - "created_at": "2017-01-02T23:21:11.784Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "115" - }, - "model": "kfet.account" -}, -{ - "pk": 57, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 80, - "created_at": "2017-01-02T23:21:11.785Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "116" - }, - "model": "kfet.account" -}, -{ - "pk": 58, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 81, - "created_at": "2017-01-02T23:21:11.786Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "117" - }, - "model": "kfet.account" -}, -{ - "pk": 59, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 82, - "created_at": "2017-01-02T23:21:11.787Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "118" - }, - "model": "kfet.account" -}, -{ - "pk": 60, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 83, - "created_at": "2017-01-02T23:21:11.788Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "119" - }, - "model": "kfet.account" -}, -{ - "pk": 61, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 84, - "created_at": "2017-01-02T23:21:11.789Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "120" - }, - "model": "kfet.account" -}, -{ - "pk": 62, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 85, - "created_at": "2017-01-02T23:21:11.790Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "121" - }, - "model": "kfet.account" -}, -{ - "pk": 63, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 86, - "created_at": "2017-01-02T23:21:11.791Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "122" - }, - "model": "kfet.account" -}, -{ - "pk": 64, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 87, - "created_at": "2017-01-02T23:21:11.792Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "123" - }, - "model": "kfet.account" -}, -{ - "pk": 65, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 88, - "created_at": "2017-01-02T23:21:11.793Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "124" - }, - "model": "kfet.account" -}, -{ - "pk": 66, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 89, - "created_at": "2017-01-02T23:21:11.794Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "125" - }, - "model": "kfet.account" -}, -{ - "pk": 67, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 90, - "created_at": "2017-01-02T23:21:11.795Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "126" - }, - "model": "kfet.account" -}, -{ - "pk": 68, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 91, - "created_at": "2017-01-02T23:21:11.796Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "127" - }, - "model": "kfet.account" -}, -{ - "pk": 69, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 92, - "created_at": "2017-01-02T23:21:11.797Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "128" - }, - "model": "kfet.account" -}, -{ - "pk": 70, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 93, - "created_at": "2017-01-02T23:21:11.798Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "129" - }, - "model": "kfet.account" -}, -{ - "pk": 71, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 94, - "created_at": "2017-01-02T23:21:11.799Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "130" - }, - "model": "kfet.account" -}, -{ - "pk": 72, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 95, - "created_at": "2017-01-02T23:21:11.800Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "131" - }, - "model": "kfet.account" -}, -{ - "pk": 73, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 96, - "created_at": "2017-01-02T23:21:11.801Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "132" - }, - "model": "kfet.account" -}, -{ - "pk": 74, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 97, - "created_at": "2017-01-02T23:21:11.802Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "133" - }, - "model": "kfet.account" -}, -{ - "pk": 75, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 98, - "created_at": "2017-01-02T23:21:11.803Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "134" - }, - "model": "kfet.account" -}, -{ - "pk": 76, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 99, - "created_at": "2017-01-02T23:21:11.804Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "135" - }, - "model": "kfet.account" -}, -{ - "pk": 77, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 100, - "created_at": "2017-01-02T23:21:11.805Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "136" - }, - "model": "kfet.account" -}, -{ - "pk": 78, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 101, - "created_at": "2017-01-02T23:21:11.806Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "137" - }, - "model": "kfet.account" -}, -{ - "pk": 79, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 102, - "created_at": "2017-01-02T23:21:11.807Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "138" - }, - "model": "kfet.account" -}, -{ - "pk": 80, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 103, - "created_at": "2017-01-02T23:21:11.807Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "139" - }, - "model": "kfet.account" -}, -{ - "pk": 81, - "fields": { - "nickname": "", - "password": null, - "cofprofile": 63, - "created_at": "2017-01-03T00:26:41.482Z", - "is_frozen": false, - "balance": "0.00", - "promo": 2016, - "trigramme": "LIQ" - }, - "model": "kfet.account" -}, -{ - "pk": 1, - "fields": { - "valid_to": "2999-12-31T23:00:00Z", - "name": "standard", - "balance": "0.00", - "is_protected": false, - "valid_from": "1921-01-03T00:00:00Z", - "created_by": 1 - }, - "model": "kfet.checkout" -}, -{ - "pk": 1, - "fields": { - "balance_new": "0.00", - "taken_200": 0, - "taken_005": 0, - "taken_500": 0, - "taken_2": 0, - "balance_old": "0.00", - "taken_20": 0, - "taken_5": 0, - "taken_02": 0, - "taken_10": 0, - "checkout": 1, - "taken_1": 0, - "not_count": false, - "taken_01": 0, - "by": 1, - "amount_error": "0.00", - "taken_05": 0, - "taken_cheque": "0.00", - "at": "2017-01-02T23:37:18.838Z", - "amount_taken": "0.00", - "taken_50": 0, - "taken_001": 0, - "taken_100": 0, - "taken_002": 0 - }, - "model": "kfet.checkoutstatement" -} -] diff --git a/kfet/management/data/groups.json b/kfet/management/data/groups.json deleted file mode 100644 index ddafcbd8..00000000 --- a/kfet/management/data/groups.json +++ /dev/null @@ -1,98 +0,0 @@ -[ -{ - "model": "auth.group", - "pk": 1, - "fields": { - "name": "K-F\u00eat chef", - "permissions": [ - 115, - 116, - 117, - 118, - 119, - 120, - 133, - 134, - 135, - 130, - 131, - 132, - 136, - 137, - 138, - 121, - 122, - 123, - 127, - 128, - 129, - 124, - 125, - 126, - 188, - 189, - 190, - 169, - 176, - 183, - 170, - 171, - 182, - 172, - 178, - 177, - 181, - 175, - 179, - 173, - 174, - 184, - 180, - 139, - 140, - 141, - 142, - 143, - 144, - 166, - 167, - 168, - 163, - 164, - 165, - 151, - 152, - 153, - 154, - 155, - 156, - 185, - 186, - 187, - 145, - 146, - 147, - 148, - 149, - 150, - 160, - 161, - 162, - 157, - 158, - 159 - ] - } -}, -{ - "model": "auth.group", - "pk": 2, - "fields": { - "name": "K-F\u00eat girl", - "permissions": [ - 172, - 173 - ] - } -} -] From bb78091cc5679226f0bc2e8bf986cafe0460c436 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Tue, 7 Feb 2017 23:59:49 -0200 Subject: [PATCH 048/213] checkout fixture --- kfet/fixtures/checkout.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 kfet/fixtures/checkout.json diff --git a/kfet/fixtures/checkout.json b/kfet/fixtures/checkout.json new file mode 100644 index 00000000..5d2c4705 --- /dev/null +++ b/kfet/fixtures/checkout.json @@ -0,0 +1 @@ +[{"fields": {"name": "Chaudron", "created_by": 101, "is_protected": false, "valid_from": "2017-02-06T23:00:00Z", "valid_to": "2018-08-30T22:00:00Z", "balance": "0.00"}, "model": "kfet.checkout", "pk": 1}] \ No newline at end of file From 066df73b625557eda412fd72ac810ac1e33304ce Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:11:38 -0200 Subject: [PATCH 049/213] add different operation types --- kfet/management/commands/loadkfetdevdata.py | 57 ++++++++++++++------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 149bdd5e..2096c5bf 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -52,12 +52,13 @@ class Command(MyBaseCommand): gaulois_trigramme = map('{:03d}'.format, range(50)) romains = CofProfile.objects.filter(user__last_name='Romain') - romains_trigramme = map(lambda x: str(100+x), range(50)) + romains_trigramme = map(lambda x: str(100+x), range(99)) for (profile, trigramme) in zip(gaulois, gaulois_trigramme): account, _ = Account.objects.get_or_create( trigramme=trigramme, - cofprofile=profile + cofprofile=profile, + defaults={'balance': random.randint(1, 999)/10} ) if profile.user.first_name == 'Abraracourcix': @@ -66,7 +67,8 @@ class Command(MyBaseCommand): for (profile, trigramme) in zip(romains, romains_trigramme): account, _ = Account.objects.get_or_create( trigramme=trigramme, - cofprofile=profile + cofprofile=profile, + defaults={'balance': random.randint(1, 999)/10} ) if random.random() > 0.75: @@ -76,22 +78,27 @@ class Command(MyBaseCommand): liq_user, _ = User.objects.get_or_create(username='liquide') liq_profile, _ = CofProfile.objects.get_or_create(user=liq_user) - account = Account.objects.get_or_create(cofprofile=liq_profile, - trigramme='LIQ') + liq_account = Account.objects.get_or_create(cofprofile=liq_profile, + trigramme='LIQ') # --- # Opérations # --- articles = Article.objects.all() - accounts = Account.objects.all() + accounts = Account.objects.exclude(trigramme='LIQ') checkout = Checkout.objects.all()[0] num_op = 100 - past_date = 3600*24*5 + # Operations are put uniformly over the span of a week + past_date = 3600*24*7 for i in range(num_op): - account = random.choice(accounts) + if random.random() > 0.25: + account = random.choice(accounts) + else: + account = liq_account + amount = 0 at = timezone.now() - timedelta( seconds=random.randint(0, past_date)) @@ -105,17 +112,31 @@ class Command(MyBaseCommand): opegroup.save() for j in range(random.randint(1, 4)): - # For now, all operations are purchases, w/o addcost - article = random.choice(articles) - nb = random.randint(1, 5) + typevar = random.random() + if typevar > 0.9 and account != liq_account: + ope = Operation( + group=opegroup, + type=Operation.DEPOSIT, + amount=random.randint(1, 99)/10, + ) + elif typevar > 0.8 and account != liq_account: + ope = Operation( + group=opegroup, + type=Operation.WITHDRAW, + amount=random.randint(1, 99)/10, + ) + else: + article = random.choice(articles) + nb = random.randint(1, 5) + + ope = Operation( + group=opegroup, + type=Operation.PURCHASE, + amount=-article.price*nb, + article=article, + article_nb=nb + ) - ope = Operation( - group=opegroup, - type=Operation.PURCHASE, - amount=-article.price*nb, - article=article, - article_nb=nb - ) ope.save() amount += ope.amount From 1062fd480fc08c4613873fadd3ddff3d1d9f51f7 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:11:48 -0200 Subject: [PATCH 050/213] update provisioning --- provisioning/prepare_django.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provisioning/prepare_django.sh b/provisioning/prepare_django.sh index 28066579..4ba74288 100644 --- a/provisioning/prepare_django.sh +++ b/provisioning/prepare_django.sh @@ -3,6 +3,6 @@ source ~/venv/bin/activate python manage.py migrate -python manage.py loaddata gestion sites +python manage.py loaddata gestion sites articles checkout python manage.py loaddevdata python manage.py collectstatic --noinput From 4e62eb0aee4e756aa8011c6b7a0ced66672bc7a0 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:26:56 -0200 Subject: [PATCH 051/213] create checkout dynamically --- kfet/fixtures/checkout.json | 1 - kfet/management/commands/loadkfetdevdata.py | 12 +++++++++++- provisioning/prepare_django.sh | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) delete mode 100644 kfet/fixtures/checkout.json diff --git a/kfet/fixtures/checkout.json b/kfet/fixtures/checkout.json deleted file mode 100644 index 5d2c4705..00000000 --- a/kfet/fixtures/checkout.json +++ /dev/null @@ -1 +0,0 @@ -[{"fields": {"name": "Chaudron", "created_by": 101, "is_protected": false, "valid_from": "2017-02-06T23:00:00Z", "valid_to": "2018-08-30T22:00:00Z", "balance": "0.00"}, "model": "kfet.checkout", "pk": 1}] \ No newline at end of file diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 2096c5bf..858e3c36 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -81,13 +81,23 @@ class Command(MyBaseCommand): liq_account = Account.objects.get_or_create(cofprofile=liq_profile, trigramme='LIQ') + # --- + # Caisse + # --- + + checkout = Checkout.objects.get_or_create( + created_by=Account.objects.get(username='Moralelastix'), + name='Chaudron', + valid_from=timezone.now(), + valid_to=timezone.now() + timedelta(years=1) + ) + # --- # Opérations # --- articles = Article.objects.all() accounts = Account.objects.exclude(trigramme='LIQ') - checkout = Checkout.objects.all()[0] num_op = 100 # Operations are put uniformly over the span of a week diff --git a/provisioning/prepare_django.sh b/provisioning/prepare_django.sh index 4ba74288..7e4051e1 100644 --- a/provisioning/prepare_django.sh +++ b/provisioning/prepare_django.sh @@ -3,6 +3,6 @@ source ~/venv/bin/activate python manage.py migrate -python manage.py loaddata gestion sites articles checkout +python manage.py loaddata gestion sites articles python manage.py loaddevdata python manage.py collectstatic --noinput From c6e84b8cb40a3d49a48550f51b736a82bd2ba2a9 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:29:40 -0200 Subject: [PATCH 052/213] bug --- kfet/management/commands/loadkfetdevdata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 858e3c36..9b25103a 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -86,7 +86,7 @@ class Command(MyBaseCommand): # --- checkout = Checkout.objects.get_or_create( - created_by=Account.objects.get(username='Moralelastix'), + created_by=Account.objects.get(trigramme='000'), name='Chaudron', valid_from=timezone.now(), valid_to=timezone.now() + timedelta(years=1) From 3b318cf623adfa35fd8938360344632b3b4e8cbc Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:31:10 -0200 Subject: [PATCH 053/213] correct timedelta --- kfet/management/commands/loadkfetdevdata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 9b25103a..14f72417 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -89,7 +89,7 @@ class Command(MyBaseCommand): created_by=Account.objects.get(trigramme='000'), name='Chaudron', valid_from=timezone.now(), - valid_to=timezone.now() + timedelta(years=1) + valid_to=timezone.now() + timedelta(days=365) ) # --- From b692b92f74e97eb01e67ddd49989f214de34afde Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:32:05 -0200 Subject: [PATCH 054/213] correct return value for get_or_create --- kfet/management/commands/loadkfetdevdata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 14f72417..58be66da 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -78,14 +78,14 @@ class Command(MyBaseCommand): liq_user, _ = User.objects.get_or_create(username='liquide') liq_profile, _ = CofProfile.objects.get_or_create(user=liq_user) - liq_account = Account.objects.get_or_create(cofprofile=liq_profile, - trigramme='LIQ') + liq_account, _ = Account.objects.get_or_create(cofprofile=liq_profile, + trigramme='LIQ') # --- # Caisse # --- - checkout = Checkout.objects.get_or_create( + checkout, _ = Checkout.objects.get_or_create( created_by=Account.objects.get(trigramme='000'), name='Chaudron', valid_from=timezone.now(), From 5ea9705528187f384f5ddd535283d026923d9141 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:38:27 -0200 Subject: [PATCH 055/213] use decimal --- kfet/management/commands/loadkfetdevdata.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 58be66da..8519be08 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -5,6 +5,7 @@ Crée des utilisateurs, des articles et des opérations aléatoires import os import random from datetime import timedelta +from decimal import Decimal from django.utils import timezone from django.contrib.auth.models import User, Group, Permission, ContentType @@ -109,7 +110,7 @@ class Command(MyBaseCommand): else: account = liq_account - amount = 0 + amount = Decimal('0') at = timezone.now() - timedelta( seconds=random.randint(0, past_date)) @@ -127,13 +128,13 @@ class Command(MyBaseCommand): ope = Operation( group=opegroup, type=Operation.DEPOSIT, - amount=random.randint(1, 99)/10, + amount=Decimal(random.randint(1, 99)/10,) ) elif typevar > 0.8 and account != liq_account: ope = Operation( group=opegroup, type=Operation.WITHDRAW, - amount=random.randint(1, 99)/10, + amount=Decimal(random.randint(1, 99)/10,) ) else: article = random.choice(articles) From 01dbf7293c146e99cc9cfa228faeaff4541b130f Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:38:59 -0200 Subject: [PATCH 056/213] withdrawals cost money --- kfet/management/commands/loadkfetdevdata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 8519be08..91a7dc7c 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -134,7 +134,7 @@ class Command(MyBaseCommand): ope = Operation( group=opegroup, type=Operation.WITHDRAW, - amount=Decimal(random.randint(1, 99)/10,) + amount=-Decimal(random.randint(1, 99)/10,) ) else: article = random.choice(articles) From 9ade88d0769fe0c4dfd7a492805243ab0cdda8d9 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 15:54:49 -0200 Subject: [PATCH 057/213] add stdout log --- kfet/management/commands/loadkfetdevdata.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 91a7dc7c..e857ebe8 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -49,31 +49,42 @@ class Command(MyBaseCommand): # Comptes # --- + self.stdout.write("Création des comptes K-Fêt") + gaulois = CofProfile.objects.filter(user__last_name='Gaulois') gaulois_trigramme = map('{:03d}'.format, range(50)) romains = CofProfile.objects.filter(user__last_name='Romain') romains_trigramme = map(lambda x: str(100+x), range(99)) + created_accounts = 0 + team_accounts = 0 + for (profile, trigramme) in zip(gaulois, gaulois_trigramme): - account, _ = Account.objects.get_or_create( + account, created = Account.objects.get_or_create( trigramme=trigramme, cofprofile=profile, defaults={'balance': random.randint(1, 999)/10} ) + created_accounts += int(created) if profile.user.first_name == 'Abraracourcix': profile.user.groups.add(group_chef) for (profile, trigramme) in zip(romains, romains_trigramme): - account, _ = Account.objects.get_or_create( + account, created = Account.objects.get_or_create( trigramme=trigramme, cofprofile=profile, defaults={'balance': random.randint(1, 999)/10} ) + created_accounts += int(created) - if random.random() > 0.75: + if random.random() > 0.75 and created: profile.user.groups.add(group_boy) + team_accounts += 1 + + self.stdout.write("- {:d} comptes créés, {:d} dans l'équipe K-Fêt" + .format(created_accounts, team_accounts)) # Compte liquide @@ -97,6 +108,8 @@ class Command(MyBaseCommand): # Opérations # --- + self.stdout.write("Génération d'opérations") + articles = Article.objects.all() accounts = Account.objects.exclude(trigramme='LIQ') From 46638bd6d867c5fee5952b0bc9fbda3c031beb90 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 21:08:00 -0200 Subject: [PATCH 058/213] fixes #85 --- gestioncof/forms.py | 6 +++--- .../templates/calendar_subscription.html | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/gestioncof/forms.py b/gestioncof/forms.py index 8a64825f..3a519a39 100644 --- a/gestioncof/forms.py +++ b/gestioncof/forms.py @@ -378,12 +378,12 @@ EventFormset = formset_factory(AdminEventForm, BaseEventRegistrationFormset) class CalendarForm(forms.ModelForm): subscribe_to_events = forms.BooleanField( initial=True, - label="Événements du COF.") + label="Événements du COF") subscribe_to_my_shows = forms.BooleanField( initial=True, - label="Les spectacles pour lesquels j'ai obtenu une place.") + label="Les spectacles pour lesquels j'ai obtenu une place") other_shows = forms.ModelMultipleChoiceField( - label="Spectacles supplémentaires.", + label="Spectacles supplémentaires", queryset=Spectacle.objects.filter(tirage__active=True), widget=forms.CheckboxSelectMultiple, required=False) diff --git a/gestioncof/templates/calendar_subscription.html b/gestioncof/templates/calendar_subscription.html index 5f0bc988..75f4dbea 100644 --- a/gestioncof/templates/calendar_subscription.html +++ b/gestioncof/templates/calendar_subscription.html @@ -1,4 +1,5 @@ {% extends "base_title.html" %} +{% load bootstrap %} {% block realcontent %} @@ -36,8 +37,21 @@ souscrire aux événements du COF et/ou aux spectacles BdA.
      {% csrf_token %} -{{ form.as_p }} - +{{ form | bootstrap }} +

      + + +

      + +
      + {% endblock %} From ca73dc27bb3e54288a08a5794a6db051e51cae6e Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 8 Feb 2017 21:13:02 -0200 Subject: [PATCH 059/213] move template --- gestioncof/templates/{ => gestioncof}/calendar_subscription.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename gestioncof/templates/{ => gestioncof}/calendar_subscription.html (100%) diff --git a/gestioncof/templates/calendar_subscription.html b/gestioncof/templates/gestioncof/calendar_subscription.html similarity index 100% rename from gestioncof/templates/calendar_subscription.html rename to gestioncof/templates/gestioncof/calendar_subscription.html From 8e7428a11e4002b40ad83ad1a046260d94dc6750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Thu, 9 Feb 2017 12:26:08 +0100 Subject: [PATCH 060/213] =?UTF-8?q?R=C3=A9percute=20le=20d=C3=A9placement?= =?UTF-8?q?=20du=20template=20dans=20les=20vues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestioncof/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gestioncof/views.py b/gestioncof/views.py index 1945f7f6..7c49559a 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -686,15 +686,15 @@ def calendar(request): subscription.token = uuid.uuid4() subscription.save() form.save_m2m() - return render(request, "calendar_subscription.html", + return render(request, "gestioncof/calendar_subscription.html", {'form': form, 'success': True, 'token': str(subscription.token)}) else: - return render(request, "calendar_subscription.html", + return render(request, "gestioncof/calendar_subscription.html", {'form': form, 'error': "Formulaire incorrect"}) else: - return render(request, "calendar_subscription.html", + return render(request, "gestioncof/calendar_subscription.html", {'form': CalendarForm(instance=instance), 'token': instance.token if instance else None}) From f7ec5ef9eea3eb4abbb7e4192db6b5e7da81264e Mon Sep 17 00:00:00 2001 From: Evarin Date: Fri, 10 Feb 2017 19:58:22 +0100 Subject: [PATCH 061/213] =?UTF-8?q?Grise=20les=20spectacles=20pass=C3=A9s?= =?UTF-8?q?=20dans=20la=20liste=20des=20spectacles=20pour=20le=20BdA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bda/models.py | 3 +++ bda/static/css/bda.css | 3 +++ bda/templates/spectacle_list.html | 8 ++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bda/models.py b/bda/models.py index f9087ac1..19e8b1f7 100644 --- a/bda/models.py +++ b/bda/models.py @@ -118,6 +118,9 @@ class Spectacle(models.Model): # On renvoie la liste des destinataires return members.values() + @property + def is_past(self): + return self.date < timezone.now() class Quote(models.Model): spectacle = models.ForeignKey(Spectacle) diff --git a/bda/static/css/bda.css b/bda/static/css/bda.css index d97bb954..4d6ecfbd 100644 --- a/bda/static/css/bda.css +++ b/bda/static/css/bda.css @@ -43,3 +43,6 @@ td { margin: 10px 0px; } +.spectacle-passe { + opacity:0.5; +} diff --git a/bda/templates/spectacle_list.html b/bda/templates/spectacle_list.html index c7456f6e..8d54aab9 100644 --- a/bda/templates/spectacle_list.html +++ b/bda/templates/spectacle_list.html @@ -1,6 +1,10 @@ {% extends "base_title.html" %} {% load staticfiles %} +{% block extra_head %} + +{% endblock %} + {% block realcontent %}

      {{tirage_name}}

      Liste des spectacles

      @@ -17,9 +21,9 @@ {% for spectacle in object_list %} - + {{ spectacle.title }} - {{ spectacle.date }} + {{ spectacle.date }} {{ spectacle.location }} {{ spectacle.price |floatformat }}€ From 399e5ca16d10f3f7afecaf77e30b5db5776c237d Mon Sep 17 00:00:00 2001 From: Evarin Date: Fri, 10 Feb 2017 20:42:54 +0100 Subject: [PATCH 062/213] Jolie mise en page pour les demandes de petit cours Closes #6 --- gestioncof/static/css/cof.css | 5 +++++ gestioncof/templates/demande-petit-cours-raw.html | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gestioncof/static/css/cof.css b/gestioncof/static/css/cof.css index b8f6e7f8..9b888c4f 100644 --- a/gestioncof/static/css/cof.css +++ b/gestioncof/static/css/cof.css @@ -1088,3 +1088,8 @@ tr.awesome{ color: white; padding: 20px; } + +.petitcours-raw { + padding:20px; + background:#fff; +} diff --git a/gestioncof/templates/demande-petit-cours-raw.html b/gestioncof/templates/demande-petit-cours-raw.html index c2fcf85a..f9bafd8e 100644 --- a/gestioncof/templates/demande-petit-cours-raw.html +++ b/gestioncof/templates/demande-petit-cours-raw.html @@ -1,11 +1,19 @@ +{% extends "base.html" %} + +{% load bootstrap %} + +{% block content %} +
      {% if success %}

      Votre demande a été enregistrée avec succès !

      {% else %}
      {% csrf_token %} - {{ form.as_table }} + {{ form | bootstrap }}
      {% endif %} +
      +{% endblock %} From 80d8cb6b7e712f1b29d44ee1c0868b68fbac3cb9 Mon Sep 17 00:00:00 2001 From: Evarin Date: Fri, 10 Feb 2017 23:47:49 +0100 Subject: [PATCH 063/213] =?UTF-8?q?Mise=20=C3=A0=20jour=20des=20d=C3=A9pen?= =?UTF-8?q?dances=20jquery-ui=20et=20jquery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Should fix #80 - à tester sur mobile (via dev.cof) --- bda/static/bda/js/jquery-1.6.2.min.js | 18 - .../bda/js/jquery-ui-1.8.15.custom.min.js | 347 ------------------ bda/templates/bda/inscription-tirage.html | 5 +- gestioncof/static/css/jquery-ui.min.css | 7 + gestioncof/static/js/jquery-ui.min.js | 13 + .../templates/inscription-petit-cours.html | 8 +- 6 files changed, 26 insertions(+), 372 deletions(-) delete mode 100644 bda/static/bda/js/jquery-1.6.2.min.js delete mode 100644 bda/static/bda/js/jquery-ui-1.8.15.custom.min.js create mode 100644 gestioncof/static/css/jquery-ui.min.css create mode 100644 gestioncof/static/js/jquery-ui.min.js diff --git a/bda/static/bda/js/jquery-1.6.2.min.js b/bda/static/bda/js/jquery-1.6.2.min.js deleted file mode 100644 index 48590ecb..00000000 --- a/bda/static/bda/js/jquery-1.6.2.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
      a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
      ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
      t
      ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
      ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/bda/static/bda/js/jquery-ui-1.8.15.custom.min.js b/bda/static/bda/js/jquery-ui-1.8.15.custom.min.js deleted file mode 100644 index fc39d245..00000000 --- a/bda/static/bda/js/jquery-ui-1.8.15.custom.min.js +++ /dev/null @@ -1,347 +0,0 @@ -/*! - * jQuery UI 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.15", -keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d= -this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, -"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart": -"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight, -outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a, -"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&& -a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= -false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); -;/* - * jQuery UI Position 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Position - */ -(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, -left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= -k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= -m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= -d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= -a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), -g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); -;/* - * jQuery UI Sortable 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Sortables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable"); -this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a=== -"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&& -!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top, -left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; -this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= -document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); -return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], -e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); -c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): -this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, -dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, -toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); -if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), -this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= -this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= -d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| -0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", -a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- -f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- -this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, -this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", -a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); -a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); -if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", -function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= -this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); -this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); -b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); -a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ -c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; -if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); -if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), -e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| -e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", -"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.15", -animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); -f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", -paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); -;/* - * jQuery UI Autocomplete 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.position.js - */ -(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.propAttr("readOnly"))){g= -false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= -a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; -this.menu=d("
        ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& -a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); -d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& -b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= -this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, -"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); -(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", --1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); -this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b, -this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| -this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| -this.first()?":last":":first"))},hasScroll:function(){return this.element.height()")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ -b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
        ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), -h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", -e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); -a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== -b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1; -d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== -f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
        ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
        ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, -function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", -handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, -originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", -f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): -[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); -if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): -e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= -this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- -b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.15",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), -create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), -height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); -b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
      • #{label}
      • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= -d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); -this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ -g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", -function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; -this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= --1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; -d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= -d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, -e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); -j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); -if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, -this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, -load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, -"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, -url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.15"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k'))}function N(a){return a.bind("mouseout", -function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); -b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.15"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv}, -setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g, -"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
        '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", -function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c== -"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker(): -d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a, -b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+= -1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ -2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b= -d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e= -a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a, -"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f== -a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input", -a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos= -d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b, -c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&& -d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+ -this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&& -a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth(): -0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a), -"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst= -null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, -_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): -0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"? -"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a); -this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a, -"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b== -"")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y", -RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear; -b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a));if(c=this._get(a,"onSelect")){e=this._formatDate(a);c.apply(a.input?a.input[0]:null,[e,a])}},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()== -""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999, -9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); -n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m, -g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&& -a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
        '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
        ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
        '+(/all|left/.test(t)&& -x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
        ';var z=j?'":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, -z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
        '+this._get(a,"weekHeader")+"
        '+this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+ -r.getDate()+"":''+r.getDate()+"")+"
        "+(l?""+(i[0]>0&&G==i[1]-1?'
        ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': -"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
        ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, -e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
        ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ -(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? -a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, -e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, -"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; -if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== -"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.15";window["DP_jQuery_"+B]=d})(jQuery); -; \ No newline at end of file diff --git a/bda/templates/bda/inscription-tirage.html b/bda/templates/bda/inscription-tirage.html index d43059e7..635aeaac 100644 --- a/bda/templates/bda/inscription-tirage.html +++ b/bda/templates/bda/inscription-tirage.html @@ -2,8 +2,9 @@ {% load staticfiles %} {% block extra_head %} - - + + + {% endblock %} diff --git a/gestioncof/static/css/jquery-ui.min.css b/gestioncof/static/css/jquery-ui.min.css new file mode 100644 index 00000000..acf8ac31 --- /dev/null +++ b/gestioncof/static/css/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2017-02-05 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/gestioncof/static/js/jquery-ui.min.js b/gestioncof/static/js/jquery-ui.min.js new file mode 100644 index 00000000..88ea758b --- /dev/null +++ b/gestioncof/static/js/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.12.1 - 2017-02-05 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("
        "))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(p.inline?p.dpDiv.parent()[0]:p.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
        ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
        "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c=!1;t(document).on("mouseup",function(){c=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!c){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),c=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,c=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("
        ").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0) +},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),h=t.pageX,l=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY=0;d--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(h-_),r=g>=Math.abs(l-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(h-m),r=g>=Math.abs(l-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&u(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var u=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&u(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=u(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
        ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
        "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
        "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0}; +t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),g&&(p-=l),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("
        "),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?l=!(c.left>r||o>c.right||c.top>h||a>c.bottom):"fit"===n.tolerance&&(l=c.left>o&&r>c.right&&c.top>a&&h>c.bottom),l?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons")) +},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("'; } + if ('account' in data['errors']) { + content += data['errors']['account']; + } return content; } diff --git a/kfet/views.py b/kfet/views.py index b6a3338a..823a205d 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1041,7 +1041,9 @@ def kpsul_perform_operations(request): operationgroup.comment = operationgroup.comment.strip() if not operationgroup.comment: data['errors']['need_comment'] = True - return JsonResponse(data, status=400) + + if data['errors']: + return JsonResponse(data, status=400) if stop or not request.user.has_perms(required_perms): missing_perms = get_missing_perms(required_perms, request.user) From 9c9ad21d735dd71a132054d1c247a5135473476e Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Fri, 31 Mar 2017 23:46:10 -0300 Subject: [PATCH 167/213] Add variable for article line --- kfet/templates/kfet/kpsul.html | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 9b45f1bf..b4a44492 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -1340,15 +1340,14 @@ $(document).ready(function() { } } for (var i=0; i= -5) { - articles_container.find('#data-article-'+article['id']) - .addClass('low-stock'); + article_line.addClass('low-stock'); } else { - articles_container.find('#data-article-'+article['id']) - .removeClass('low-stock'); + article_line.removeClass('low-stock'); } - articles_container.find('#data-article-'+article['id']+' .stock') + article_line.find('.stock') .text(article['stock']); var i = 0; From cf03fba1cc482a2ee0c8164e4e6d5b7e1544fc28 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Fri, 31 Mar 2017 23:54:38 -0300 Subject: [PATCH 168/213] Remove whitespace by using elif --- kfet/templates/kfet/form_field_snippet.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/templates/kfet/form_field_snippet.html b/kfet/templates/kfet/form_field_snippet.html index 34ebe58e..771e4185 100644 --- a/kfet/templates/kfet/form_field_snippet.html +++ b/kfet/templates/kfet/form_field_snippet.html @@ -6,7 +6,7 @@ {{ field|add_class:'form-control' }} {% if field.errors %} {{field.errors}} - {% else %} + {% elif field.help_text %} {{field.help_text}} {% endif %}
        From 063446efb542ca914e72987c80c2229f029466a1 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 00:32:09 -0300 Subject: [PATCH 169/213] Use columns for authentication and submit --- kfet/static/kfet/css/index.css | 4 ++++ kfet/templates/kfet/inventory_create.html | 18 +++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/kfet/static/kfet/css/index.css b/kfet/static/kfet/css/index.css index 643cd52f..5a82b5cf 100644 --- a/kfet/static/kfet/css/index.css +++ b/kfet/static/kfet/css/index.css @@ -32,6 +32,7 @@ textarea { .table { margin-bottom:0; + border-bottom:1px solid #ddd; } .table { @@ -230,6 +231,9 @@ textarea { height:28px; margin:3px 0px; } + .content-center .auth-form { + margin:15px; +} /* * Pages formulaires seuls diff --git a/kfet/templates/kfet/inventory_create.html b/kfet/templates/kfet/inventory_create.html index b8a1ac08..3ae3337e 100644 --- a/kfet/templates/kfet/inventory_create.html +++ b/kfet/templates/kfet/inventory_create.html @@ -61,17 +61,17 @@ {% endfor %} - {{ formset.management_form }} - {% if not perms.kfet.add_inventory %} - - - {% else %} - - {% endif %} - {% csrf_token %} - + {{ formset.management_form }} + {% if not perms.kfet.add_inventory %} +
        + {% include "kfet/form_authentication_snippet.html" %} +
        + {% endif %} + + {% csrf_token %} +
        From 8da832c1f7704b5bc0b935eaea2ddc3dcf023e39 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 00:36:39 -0300 Subject: [PATCH 170/213] Use nice authentication in orders too --- kfet/templates/kfet/order_create.html | 10 ++++++---- kfet/templates/kfet/order_to_inventory.html | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/kfet/templates/kfet/order_create.html b/kfet/templates/kfet/order_create.html index cbd84ba8..b419621b 100644 --- a/kfet/templates/kfet/order_create.html +++ b/kfet/templates/kfet/order_create.html @@ -65,11 +65,13 @@ {% endfor %} - {% if not perms.kfet.add_order %} - - {% endif %} {{ formset.management_form }} - + {% if not perms.kfet.add_inventory %} +
        + {% include "kfet/form_authentication_snippet.html" %} +
        + {% endif %} +
        diff --git a/kfet/templates/kfet/order_to_inventory.html b/kfet/templates/kfet/order_to_inventory.html index ab107065..ae7bc8af 100644 --- a/kfet/templates/kfet/order_to_inventory.html +++ b/kfet/templates/kfet/order_to_inventory.html @@ -41,11 +41,13 @@ {% endfor %} - {% if not perms.kfet.order_to_inventory %} - - {% endif %} {{ formset.management_form }} - + {% if not perms.kfet.add_inventory %} +
        + {% include "kfet/form_authentication_snippet.html" %} +
        + {% endif %} + From 271654b44792266fa0fe5950e6795051534bbb6b Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 08:47:09 -0300 Subject: [PATCH 171/213] No need for intermediate error reporting --- kfet/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/kfet/views.py b/kfet/views.py index f2ea1599..b4d1328b 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1018,7 +1018,6 @@ def kpsul_perform_operations(request): else: if operationgroup.on_acc.is_cash: data['errors']['account'] = 'LIQ' - return JsonResponse(data, status=400) if operation.type != Operation.EDIT: to_checkout_balance += operation.amount operationgroup.amount += operation.amount From e20ab2f352557c6ae33acd620e8b8f1e41fc3f3d Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 09:18:40 -0300 Subject: [PATCH 172/213] Use set delete() --- kfet/templates/kfet/inventory_create.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/templates/kfet/inventory_create.html b/kfet/templates/kfet/inventory_create.html index 3ae3337e..293bcd6b 100644 --- a/kfet/templates/kfet/inventory_create.html +++ b/kfet/templates/kfet/inventory_create.html @@ -117,7 +117,7 @@ $(document).ready(function() { } var id = $line.find('input[type="hidden"]').val(); - conflicts = conflicts.filter(item => item != id); + conflicts = conflicts.delete(id); } $('.finished input').change(function() { From 6797c92a1f86e88f33f0128cf05d731fee7b8704 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 09:35:37 -0300 Subject: [PATCH 173/213] Ok ok je me rends --- kfet/templates/kfet/form_field_snippet.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kfet/templates/kfet/form_field_snippet.html b/kfet/templates/kfet/form_field_snippet.html index 771e4185..0873a481 100644 --- a/kfet/templates/kfet/form_field_snippet.html +++ b/kfet/templates/kfet/form_field_snippet.html @@ -6,7 +6,8 @@ {{ field|add_class:'form-control' }} {% if field.errors %} {{field.errors}} - {% elif field.help_text %} + {% endif %} + {% if field.help_text %} {{field.help_text}} {% endif %} From bbb517fbd3323ecc97c1936105d65174d2d92cc0 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 10:37:40 -0300 Subject: [PATCH 174/213] Fix article stat display --- kfet/templates/kfet/article_read.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kfet/templates/kfet/article_read.html b/kfet/templates/kfet/article_read.html index d4219128..35b484a5 100644 --- a/kfet/templates/kfet/article_read.html +++ b/kfet/templates/kfet/article_read.html @@ -101,9 +101,8 @@ {% endblock %} From 6b8001db56e3dc209793a843e1eaf2c3e339ceb4 Mon Sep 17 00:00:00 2001 From: Hugo Roussille Date: Sat, 1 Apr 2017 16:34:17 +0200 Subject: [PATCH 175/213] Correction des messages d'erreur et de la gestion des exceptions --- bda/views.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/bda/views.py b/bda/views.py index dbb3f3c0..41e5d08b 100644 --- a/bda/views.py +++ b/bda/views.py @@ -22,7 +22,7 @@ from django.core.urlresolvers import reverse from django.conf import settings from django.utils import timezone, formats from django.views.generic.list import ListView - +from django.core.exceptions import ObjectDoesNotExist from gestioncof.decorators import cof_required, buro_required from bda.models import ( Spectacle, Participant, ChoixSpectacle, Attribution, Tirage, @@ -661,11 +661,17 @@ def catalogue(request, request_type): return JsonResponse(data_return, safe=False) if request_type == "details": # Dans ce cas on retourne une liste des catégories et des salles + tirage_id = request.GET.get('id', '') try: - tirage_id = request.GET.get('id', '') - tirage = get_object_or_404(Tirage, id=tirage_id) + tirage = Tirage.objects.get(id=tirage_id) + except ObjectDoesNotExist: + return HttpResponseBadRequest( + "Aucun tirage correspondant à l'id " + + tirage_id) except ValueError: - return HttpResponseBadRequest("Pas de tirage pour cet id") + return HttpResponseBadRequest( + "Mauvais format d'identifiant : " + + tirage_id) categories = list( CategorieSpectacle.objects.filter( spectacle__in=tirage.spectacle_set.all()) @@ -680,11 +686,13 @@ def catalogue(request, request_type): # Ici on retourne les descriptions correspondant à la catégorie et # à la salle spécifiées + tirage_id = request.GET.get('id', '') + categories = request.GET.get('category', '[0]') + locations = request.GET.get('location', '[0]') try: - tirage_id = request.GET.get('id', '') - category_id = json.loads(request.GET.get('category', '[0]')) - location_id = json.loads(request.GET.get('location', '[0]')) - tirage = get_object_or_404(Tirage, id=tirage_id) + category_id = json.loads(categories) + location_id = json.loads(locations) + tirage = Tirage.objects.get(id=tirage_id) shows_qs = tirage.spectacle_set if not(0 in category_id): @@ -693,10 +701,19 @@ def catalogue(request, request_type): if not(0 in location_id): shows_qs = shows_qs.filter( location__id__in=location_id) - except ValueError: + except ObjectDoesNotExist: return HttpResponseBadRequest( "Impossible de trouver des résultats correspondant " - "à ces caractéristiques") + "à ces caractéristiques : " + + "id = " + tirage_id + + ", catégories = " + categories + + ", salles = " + locations) + except ValueError: # Contient JSONDecodeError + return HttpResponseBadRequest( + "Impossible de parser les paramètres donnés : " + + "id = " + request.GET.get('id', '') + + ", catégories = " + request.GET.get('category', '[0]') + + ", salles = " + request.GET.get('location', '[0]')) # On convertit les descriptions à envoyer en une liste facilement # JSONifiable (il devrait y avoir un moyen plus efficace en From 66dd7848b855d04a1e8e8bd97a844caf5baec5ac Mon Sep 17 00:00:00 2001 From: Hugo Roussille Date: Sat, 1 Apr 2017 16:48:18 +0200 Subject: [PATCH 176/213] Correction du format de l'URL --- bda/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bda/urls.py b/bda/urls.py index 0af14b53..df660740 100644 --- a/bda/urls.py +++ b/bda/urls.py @@ -47,6 +47,6 @@ urlpatterns = [ url(r'^mails-rappel/(?P\d+)$', views.send_rappel), url(r'^descriptions/(?P\d+)$', views.descriptions_spectacles, name='bda-descriptions'), - url(r'^catalogue/(?P[a-z]*)$', views.catalogue, + url(r'^catalogue/(?P[a-z]+)$', views.catalogue, name='bda-catalogue'), ] From cce0411ee935fd0322003a2601192021be7f66a8 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 17:37:29 -0300 Subject: [PATCH 177/213] Merge both 0048 migrations --- kfet/migrations/0049_merge.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 kfet/migrations/0049_merge.py diff --git a/kfet/migrations/0049_merge.py b/kfet/migrations/0049_merge.py new file mode 100644 index 00000000..0ce9a525 --- /dev/null +++ b/kfet/migrations/0049_merge.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kfet', '0048_article_hidden'), + ('kfet', '0048_default_datetime'), + ] + + operations = [ + ] From 9cdf0640054dc0bf983aab276e5aaa98a2ec6f8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 1 Apr 2017 21:45:05 +0100 Subject: [PATCH 178/213] Handle incomplete values from the LDAP Sometime `uid` is not set in the objects fetched from the LDAP. This case has to be handled. Also, the `.uid` and `.cn` attributes of these objects in the python abstractions have a `.value` method which we should use. --- gestioncof/autocomplete.py | 14 ++++++++++---- kfet/autocomplete.py | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gestioncof/autocomplete.py b/gestioncof/autocomplete.py index a9abbad7..7a9c37d2 100644 --- a/gestioncof/autocomplete.py +++ b/gestioncof/autocomplete.py @@ -14,6 +14,10 @@ from gestioncof.decorators import buro_required class Clipper(object): def __init__(self, clipper, fullname): + if fullname is None: + fullname = "" + assert isinstance(clipper, str) + assert isinstance(fullname, str) self.clipper = clipper self.fullname = fullname @@ -62,17 +66,19 @@ def autocomplete(request): )) if ldap_query != "(&)": # If none of the bits were legal, we do not perform the query + entries = None with Connection(settings.LDAP_SERVER_URL) as conn: conn.search( 'dc=spi,dc=ens,dc=fr', ldap_query, attributes=['uid', 'cn'] ) - queries['clippers'] = conn.entries + entries = conn.entries # Clearing redundancies queries['clippers'] = [ - Clipper(clipper.uid, clipper.cn) - for clipper in queries['clippers'] - if str(clipper.uid) not in usernames + Clipper(entry.uid.value, entry.cn.value) + for entry in entries + if entry.uid.value is not None + and entry.uid.value not in usernames ] # Resulting data diff --git a/kfet/autocomplete.py b/kfet/autocomplete.py index bee99517..0ab2c8aa 100644 --- a/kfet/autocomplete.py +++ b/kfet/autocomplete.py @@ -13,6 +13,10 @@ from kfet.models import Account class Clipper(object): def __init__(self, clipper, fullname): + if fullname is None: + fullname = "" + assert isinstance(clipper, str) + assert isinstance(fullname, str) self.clipper = clipper self.fullname = fullname @@ -80,17 +84,19 @@ def account_create(request): )) if ldap_query != "(&)": # If none of the bits were legal, we do not perform the query + entries = None with Connection(settings.LDAP_SERVER_URL) as conn: conn.search( 'dc=spi,dc=ens,dc=fr', ldap_query, attributes=['uid', 'cn'] ) - queries['clippers'] = conn.entries + entries = conn.entries # Clearing redundancies queries['clippers'] = [ - Clipper(clipper.uid, clipper.cn) - for clipper in queries['clippers'] - if str(clipper.uid) not in usernames + Clipper(entry.uid.value, entry.cn.value) + for entry in entries + if entry.uid.value is not None + and entry.uid.value not in usernames ] # Resulting data From a793e9a2e754d5b6294f9cfdea3d80430c7ca8d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Sat, 1 Apr 2017 22:07:32 +0100 Subject: [PATCH 179/213] exclude empty strings from ldap results The uid attribute in a LDAP's entry cannot be an empty string. We need to get an actual identifier. --- gestioncof/autocomplete.py | 2 +- kfet/autocomplete.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gestioncof/autocomplete.py b/gestioncof/autocomplete.py index 7a9c37d2..3532525d 100644 --- a/gestioncof/autocomplete.py +++ b/gestioncof/autocomplete.py @@ -77,7 +77,7 @@ def autocomplete(request): queries['clippers'] = [ Clipper(entry.uid.value, entry.cn.value) for entry in entries - if entry.uid.value is not None + if entry.uid.value and entry.uid.value not in usernames ] diff --git a/kfet/autocomplete.py b/kfet/autocomplete.py index 0ab2c8aa..09057d4a 100644 --- a/kfet/autocomplete.py +++ b/kfet/autocomplete.py @@ -95,7 +95,7 @@ def account_create(request): queries['clippers'] = [ Clipper(entry.uid.value, entry.cn.value) for entry in entries - if entry.uid.value is not None + if entry.uid.value and entry.uid.value not in usernames ] From 91a057873d2f8f51ab939fc0d63ee94b45890de9 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 18:10:51 -0300 Subject: [PATCH 180/213] Merge migrations --- kfet/migrations/0049_remove_checkout.py | 38 ------------------------- kfet/migrations/0050_remove_checkout.py | 23 +++++++++++++++ 2 files changed, 23 insertions(+), 38 deletions(-) delete mode 100644 kfet/migrations/0049_remove_checkout.py create mode 100644 kfet/migrations/0050_remove_checkout.py diff --git a/kfet/migrations/0049_remove_checkout.py b/kfet/migrations/0049_remove_checkout.py deleted file mode 100644 index d2eae10c..00000000 --- a/kfet/migrations/0049_remove_checkout.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -def adapt_operation_types(apps, schema_editor): - Operation = apps.get_model("kfet", "Operation") - Operation.objects.filter( - is_checkout=False, - type__in=['withdraw', 'deposit']).update(type='edit') - - -def revert_operation_types(apps, schema_editor): - Operation = apps.get_model("kfet", "Operation") - edits = Operation.objects.filter(type='edit') - edits.filter(amount__gt=0).update(type='deposit') - edits.filter(amount__lte=0).update(type='withdraw') - - -class Migration(migrations.Migration): - - dependencies = [ - ('kfet', '0048_article_hidden'), - ] - - operations = [ - migrations.AlterField( - model_name='operation', - name='type', - field=models.CharField(choices=[('purchase', 'Achat'), ('deposit', 'Charge'), ('withdraw', 'Retrait'), ('initial', 'Initial'), ('edit', 'Édition')], max_length=8), - ), - migrations.RunPython(adapt_operation_types, revert_operation_types), - migrations.RemoveField( - model_name='operation', - name='is_checkout', - ), - ] diff --git a/kfet/migrations/0050_remove_checkout.py b/kfet/migrations/0050_remove_checkout.py new file mode 100644 index 00000000..f9c374ca --- /dev/null +++ b/kfet/migrations/0050_remove_checkout.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kfet', '0049_merge'), + ] + + operations = [ + migrations.RemoveField( + model_name='operation', + name='is_checkout', + ), + migrations.AlterField( + model_name='operation', + name='type', + field=models.CharField(choices=[('purchase', 'Achat'), ('deposit', 'Charge'), ('withdraw', 'Retrait'), ('initial', 'Initial'), ('edit', 'Édition')], max_length=8), + ), + ] From c9973cde75d9d33caf0a218b6e7aefe2706bf1e9 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sat, 1 Apr 2017 23:25:47 -0300 Subject: [PATCH 181/213] Help text for password length --- kfet/forms.py | 1 + 1 file changed, 1 insertion(+) diff --git a/kfet/forms.py b/kfet/forms.py index 5b56c63a..2418c840 100644 --- a/kfet/forms.py +++ b/kfet/forms.py @@ -75,6 +75,7 @@ class AccountRestrictForm(AccountForm): class AccountPwdForm(forms.Form): pwd1 = forms.CharField( label="Mot de passe K-Fêt", + help_text="Le mot de passe doit contenir au moins huit caractères", widget=forms.PasswordInput) pwd2 = forms.CharField( label="Confirmer le mot de passe", From 96597aa14693d7ca547769dfc33350d4813c84ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 05:17:26 +0200 Subject: [PATCH 182/213] clean some kfet templates --- kfet/templates/kfet/account_read.html | 45 ++++++++++++--------- kfet/templates/kfet/account_read_title.html | 5 --- kfet/templates/kfet/article_read.html | 32 ++++++++------- 3 files changed, 43 insertions(+), 39 deletions(-) delete mode 100644 kfet/templates/kfet/account_read_title.html diff --git a/kfet/templates/kfet/account_read.html b/kfet/templates/kfet/account_read.html index 50ab7f20..25e48926 100644 --- a/kfet/templates/kfet/account_read.html +++ b/kfet/templates/kfet/account_read.html @@ -13,12 +13,17 @@ {% if account.user == request.user %} - {% endif %} @@ -66,22 +71,22 @@ {% if account.user == request.user %}

        Statistiques

        -
        -
        -
        -

        Ma balance

        -
        -
        +
        +
        +
        +

        Ma balance

        +
        -
        -
        -
        -
        -

        Ma consommation

        -
        -
        +
        +
        +
        +
        +
        +

        Ma consommation

        +
        -
        +
        +
        {% endif %}
        diff --git a/kfet/templates/kfet/account_read_title.html b/kfet/templates/kfet/account_read_title.html deleted file mode 100644 index 6712ed77..00000000 --- a/kfet/templates/kfet/account_read_title.html +++ /dev/null @@ -1,5 +0,0 @@ -{% if account.user == request.user %} - Mon compte -{% else %} - Informations du compte {{ account.trigramme }} -{% endif %} diff --git a/kfet/templates/kfet/article_read.html b/kfet/templates/kfet/article_read.html index 35b484a5..a980cc75 100644 --- a/kfet/templates/kfet/article_read.html +++ b/kfet/templates/kfet/article_read.html @@ -1,6 +1,11 @@ {% extends 'kfet/base.html' %} {% load staticfiles %} +{% block extra_head %} + + +{% endblock %} + {% block title %}Informations sur l'article {{ article }}{% endblock %} {% block content-header-title %}Article - {{ article.name }}{% endblock %} @@ -82,27 +87,26 @@

        Statistiques

        -
        -
        -
        -

        Ventes de {{ article.name }}

        -
        -
        +
        +
        +
        +

        Ventes de {{ article.name }}

        +
        -
        +
        +
        {% endblock %} -{% block extra_head %} - - - {% endblock %} From e8fdd083aae2301240e6906355c2b14cbf295cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 05:34:34 +0200 Subject: [PATCH 183/213] delete unused class-views --- kfet/views.py | 37 +++---------------------------------- 1 file changed, 3 insertions(+), 34 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index 823a205d..14fc0b3b 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2034,43 +2034,12 @@ class JSONResponseMixin(object): return context -class JSONDetailView(JSONResponseMixin, - BaseDetailView): - """ - Returns a DetailView that renders a JSON - """ +class JSONDetailView(JSONResponseMixin, BaseDetailView): + """Returns a DetailView that renders a JSON.""" + def render_to_response(self, context): return self.render_to_json_response(context) -class HybridDetailView(JSONResponseMixin, - SingleObjectTemplateResponseMixin, - BaseDetailView): - """ - Returns a DetailView as an html page except if a JSON file is requested - by the GET method in which case it returns a JSON response. - """ - def render_to_response(self, context): - # Look for a 'format=json' GET argument - if self.request.GET.get('format') == 'json': - return self.render_to_json_response(context) - else: - return super(HybridDetailView, self).render_to_response(context) - - -class HybridListView(JSONResponseMixin, - MultipleObjectTemplateResponseMixin, - BaseListView): - """ - Returns a ListView as an html page except if a JSON file is requested - by the GET method in which case it returns a JSON response. - """ - def render_to_response(self, context): - # Look for a 'format=json' GET argument - if self.request.GET.get('format') == 'json': - return self.render_to_json_response(context) - else: - return super(HybridListView, self).render_to_response(context) - class ObjectResumeStat(JSONDetailView): """ From 78aa5df350a5344dda67f1c329011b399eaed06b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 12:55:44 +0200 Subject: [PATCH 184/213] fix template error --- kfet/templates/kfet/article_read.html | 1 - 1 file changed, 1 deletion(-) diff --git a/kfet/templates/kfet/article_read.html b/kfet/templates/kfet/article_read.html index a980cc75..9f2e7128 100644 --- a/kfet/templates/kfet/article_read.html +++ b/kfet/templates/kfet/article_read.html @@ -109,4 +109,3 @@ $(document).ready(function() { ); }); -{% endblock %} From f6022ecf7d4f8d48133123e90b619b7c9101bbda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 16:49:41 +0200 Subject: [PATCH 185/213] Add str to Transfer model + PEP8 this model --- kfet/models.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/kfet/models.py b/kfet/models.py index b4af61c1..18929c4b 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -476,24 +476,29 @@ class TransferGroup(models.Model): related_name = "+", blank = True, null = True, default = None) + class Transfer(models.Model): group = models.ForeignKey( - TransferGroup, on_delete = models.PROTECT, - related_name = "transfers") + TransferGroup, on_delete=models.PROTECT, + related_name="transfers") from_acc = models.ForeignKey( - Account, on_delete = models.PROTECT, - related_name = "transfers_from") + Account, on_delete=models.PROTECT, + related_name="transfers_from") to_acc = models.ForeignKey( - Account, on_delete = models.PROTECT, - related_name = "transfers_to") - amount = models.DecimalField(max_digits = 6, decimal_places = 2) + Account, on_delete=models.PROTECT, + related_name="transfers_to") + amount = models.DecimalField(max_digits=6, decimal_places=2) # Optional canceled_by = models.ForeignKey( - Account, on_delete = models.PROTECT, - null = True, blank = True, default = None, - related_name = "+") + Account, on_delete=models.PROTECT, + null=True, blank=True, default=None, + related_name="+") canceled_at = models.DateTimeField( - null = True, blank = True, default = None) + null=True, blank=True, default=None) + + def __str__(self): + return '{} -> {}: {}€'.format(self.from_acc, self.to_acc, self.amount) + class OperationGroup(models.Model): on_acc = models.ForeignKey( From 87b9db520f5c73be52d6a3e8841217b376544d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 17:03:20 +0200 Subject: [PATCH 186/213] Refactor py base stats and account balance stats New mixin: PkUrlMixin - use with SingleObjectMixin standard django mixin (used by DetailView...) - `get_object` use field declared in `pk_url_kwarg` to get... the object SingleResumeStat - clean (part of) py code AccountStatBalanceList - renamed from `AccountStatBalanceAll` - url modified - add permission checking (only the connected user can get balance stats manifest) - clean py code AccountStatBalance - cleaner filtering management - merge urls using this class - clean py code --- kfet/urls.py | 13 +-- kfet/views.py | 270 +++++++++++++++++++++++++------------------------- 2 files changed, 141 insertions(+), 142 deletions(-) diff --git a/kfet/urls.py b/kfet/urls.py index 94a9eaec..ddd40ce6 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -82,15 +82,12 @@ urlpatterns = [ views.AccountStatLastDay.as_view(), name = 'kfet.account.stat.last.day'), - url('^accounts/(?P.{3})/stat/balance/$', - views.AccountStatBalanceAll.as_view(), - name = 'kfet.account.stat.balance'), - url('^accounts/(?P.{3})/stat/balance/d/(?P\d*)/$', + url(r'^accounts/(?P.{3})/stat/balance/list$', + views.AccountStatBalanceList.as_view(), + name='kfet.account.stat.balance.list'), + url(r'^accounts/(?P.{3})/stat/balance$', views.AccountStatBalance.as_view(), - name = 'kfet.account.stat.balance.days'), - url('^accounts/(?P.{3})/stat/balance/anytime/$', - views.AccountStatBalance.as_view(), - name = 'kfet.account.stat.balance.anytime'), + name='kfet.account.stat.balance'), # ----- # Checkout urls diff --git a/kfet/views.py b/kfet/views.py index 14fc0b3b..b0c90083 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- +from urllib.parse import urlencode + from django.shortcuts import render, get_object_or_404, redirect from django.core.exceptions import PermissionDenied from django.core.cache import cache from django.views.generic import ListView, DetailView, TemplateView -from django.views.generic.list import BaseListView, MultipleObjectTemplateResponseMixin -from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResponseMixin -from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView +from django.views.generic.detail import BaseDetailView +from django.views.generic.edit import CreateView, UpdateView from django.core.urlresolvers import reverse, reverse_lazy from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin @@ -2041,49 +2042,46 @@ class JSONDetailView(JSONResponseMixin, BaseDetailView): return self.render_to_json_response(context) -class ObjectResumeStat(JSONDetailView): +class PkUrlMixin(object): + + def get_object(self, *args, **kwargs): + get_by = self.kwargs.get(self.pk_url_kwarg) + return get_object_or_404(self.model, **{self.pk_url_kwarg: get_by}) + + +class SingleResumeStat(JSONDetailView): """ Summarize all the stats of an object Handles JSONResponse + """ - context_object_name = '' id_prefix = '' - # nombre de vues à résumer - nb_stat = 2 - # Le combienième est celui par defaut ? - # (entre 0 et nb_stat-1) nb_default = 0 - stat_labels = ['stat_1', 'stat_2'] - stat_urls = ['url_1', 'url_2'] - # sert à renverser les urls - # utile de le surcharger quand l'url prend d'autres arguments que l'id - def get_object_url_kwargs(self, **kwargs): - return {'pk': self.object.id} - - def url_kwargs(self, **kwargs): - return [{}] * self.nb_stat + stats = [] + url_stat = None def get_context_data(self, **kwargs): # On n'hérite pas object_id = self.object.id - url_kwargs = self.url_kwargs() context = {} - stats = {} - for i in range(self.nb_stat): - stats[i] = { - 'label': self.stat_labels[i], - 'btn': "btn_%s_%d_%d" % (self.id_prefix, - object_id, - i), - 'url': reverse(self.stat_urls[i], - kwargs=dict( - self.get_object_url_kwargs(), - **url_kwargs[i] - ), - ), - } - prefix = "%s_%d" % (self.id_prefix, object_id) + stats = [] + prefix = '{}_{}'.format(self.id_prefix, object_id) + for i, stat_def in enumerate(self.stats): + url_pk = getattr(self.object, self.pk_url_kwarg) + url_params_d = stat_def.get('url_params', {}) + if len(url_params_d) > 0: + url_params = '?{}'.format(urlencode(url_params_d)) + else: + url_params = '' + stats.append({ + 'label': stat_def['label'], + 'btn': 'btn_{}_{}'.format(prefix, i), + 'url': '{url}{params}'.format( + url=reverse(self.url_stat, args=[url_pk]), + params=url_params, + ), + }) context['id_prefix'] = prefix context['content_id'] = "content_%s" % prefix context['stats'] = stats @@ -2100,39 +2098,47 @@ ID_PREFIX_ACC_BALANCE = "balance_acc" # Un résumé de toutes les vues ArticleStatBalance # REND DU JSON -class AccountStatBalanceAll(ObjectResumeStat): +class AccountStatBalanceList(PkUrlMixin, SingleResumeStat): model = Account context_object_name = 'account' - trigramme_url_kwarg = 'trigramme' + pk_url_kwarg = 'trigramme' + url_stat = 'kfet.account.stat.balance' id_prefix = ID_PREFIX_ACC_BALANCE - nb_stat = 5 + stats = [ + { + 'label': 'Tout le temps', + }, + { + 'label': '1 an', + 'url_params': {'last_days': 365}, + }, + { + 'label': '6 mois', + 'url_params': {'last_days': 183}, + }, + { + 'label': '3 mois', + 'url_params': {'last_days': 90}, + }, + { + 'label': '30 jours', + 'url_params': {'last_days': 30}, + }, + ] nb_default = 0 - stat_labels = ["Tout le temps", "1 an", "6 mois", "3 mois", "30 jours"] - stat_urls = ['kfet.account.stat.balance.anytime'] \ - + ['kfet.account.stat.balance.days'] * 4 - def get_object(self, **kwargs): - trigramme = self.kwargs.get(self.trigramme_url_kwarg) - return get_object_or_404(Account, trigramme=trigramme) - - def get_object_url_kwargs(self, **kwargs): - return {'trigramme': self.object.trigramme} - - def url_kwargs(self, **kwargs): - context_list = (super(AccountStatBalanceAll, self) - .url_kwargs(**kwargs)) - context_list[1] = {'nb_date': 365} - context_list[2] = {'nb_date': 183} - context_list[3] = {'nb_date': 90} - context_list[4] = {'nb_date': 30} - return context_list + def get_object(self, *args, **kwargs): + obj = super().get_object(*args, **kwargs) + if self.request.user != obj.user: + raise PermissionDenied + return obj @method_decorator(login_required) def dispatch(self, *args, **kwargs): - return super(AccountStatBalanceAll, self).dispatch(*args, **kwargs) + return super().dispatch(*args, **kwargs) -class AccountStatBalance(JSONDetailView): +class AccountStatBalance(PkUrlMixin, JSONDetailView): """ Returns a JSON containing the evolution a the personnal balance of a trigramme between timezone.now() and `nb_days` @@ -2141,44 +2147,38 @@ class AccountStatBalance(JSONDetailView): does not takes into account the balance offset """ model = Account - trigramme_url_kwarg = 'trigramme' - nb_date_url_kwargs = 'nb_date' + pk_url_kwarg = 'trigramme' context_object_name = 'account' - id_prefix = "" - def get_object(self, **kwargs): - trigramme = self.kwargs.get(self.trigramme_url_kwarg) - return get_object_or_404(Account, trigramme=trigramme) - - def get_changes_list(self, **kwargs): + def get_changes_list(self, last_days=None, begin_date=None, end_date=None): account = self.object - nb_date = self.kwargs.get(self.nb_date_url_kwargs, None) - end_date = this_morning() - if nb_date is None: - begin_date = timezone.datetime(year=1980, month=1, day=1) - anytime = True - else: - begin_date = this_morning() \ - - timezone.timedelta(days=int(nb_date)) - anytime = False - # On récupère les opérations + + # prepare filters + if end_date is None: + end_date = this_morning() + + if last_days is not None: + begin_date = end_date - timezone.timedelta(days=last_days) + + # prepare querysets # TODO: retirer les opgroup dont tous les op sont annulées - opgroups = list(OperationGroup.objects - .filter(on_acc=account) - .filter(at__gte=begin_date) - .filter(at__lte=end_date)) - # On récupère les transferts reçus - received_transfers = list(Transfer.objects - .filter(to_acc=account) - .filter(canceled_at=None) - .filter(group__at__gte=begin_date) - .filter(group__at__lte=end_date)) - # On récupère les transferts émis - emitted_transfers = list(Transfer.objects - .filter(from_acc=account) - .filter(canceled_at=None) - .filter(group__at__gte=begin_date) - .filter(group__at__lte=end_date)) + opegroups = OperationGroup.objects.filter(on_acc=account) + recv_transfers = Transfer.objects.filter(to_acc=account, + canceled_at=None) + sent_transfers = Transfer.objects.filter(from_acc=account, + canceled_at=None) + + # apply filters + if begin_date is not None: + opegroups = opegroups.filter(at__gte=begin_date) + recv_transfers = recv_transfers.filter(group__at__gte=begin_date) + sent_transfers = sent_transfers.filter(group__at__gte=begin_date) + + if end_date is not None: + opegroups = opegroups.filter(at__lte=end_date) + recv_transfers = recv_transfers.filter(group__at__lte=end_date) + sent_transfers = sent_transfers.filter(group__at__lte=end_date) + # On transforme tout ça en une liste de dictionnaires sous la forme # {'at': date, # 'amount': changement de la balance (négatif si diminue la balance, @@ -2188,72 +2188,74 @@ class AccountStatBalance(JSONDetailView): # sera mis à jour lors d'une # autre passe) # } - actions = [ - # Maintenant (à changer si on gère autre chose que now) - { + actions = [] + if begin_date is not None: + actions.append({ + 'at': begin_date.isoformat(), + 'amount': 0, + 'label': "début", + 'balance': 0, + }) + if end_date is not None: + actions.append({ 'at': end_date.isoformat(), - 'amout': 0, + 'amount': 0, 'label': "actuel", 'balance': 0, - } - ] + [ + }) + + actions += [ { - 'at': op.at.isoformat(), - 'amount': op.amount, - 'label': str(op), + 'at': ope_grp.at.isoformat(), + 'amount': ope_grp.amount, + 'label': str(ope_grp), 'balance': 0, - } for op in opgroups + } for ope_grp in opegroups ] + [ { 'at': tr.group.at.isoformat(), 'amount': tr.amount, - 'label': "%d€: %s -> %s" % (tr.amount, - tr.from_acc.trigramme, - tr.to_acc.trigramme), + 'label': str(tr), 'balance': 0, - } for tr in received_transfers + } for tr in recv_transfers ] + [ { 'at': tr.group.at.isoformat(), 'amount': -tr.amount, - 'label': "%d€: %s -> %s" % (tr.amount, - tr.from_acc.trigramme, - tr.to_acc.trigramme), + 'label': str(tr), 'balance': 0, - } for tr in emitted_transfers + } for tr in sent_transfers ] - if not anytime: - actions += [ - # Date de début : - { - 'at': begin_date.isoformat(), - 'amount': 0, - 'label': "début", - 'balance': 0, - } - ] # Maintenant on trie la liste des actions par ordre du plus récent # an plus ancien et on met à jour la balance actions = sorted(actions, key=lambda k: k['at'], reverse=True) actions[0]['balance'] = account.balance for i in range(len(actions)-1): - actions[i+1]['balance'] = actions[i]['balance'] \ - - actions[i+1]['amount'] + actions[i+1]['balance'] = \ + actions[i]['balance'] - actions[i+1]['amount'] return actions - def get_context_data(self, **kwargs): + def get_context_data(self, *args, **kwargs): context = {} - changes = self.get_changes_list() - nb_days = self.kwargs.get(self.nb_date_url_kwargs, None) - if nb_days is None: - nb_days_string = 'anytime' - else: - nb_days_string = str(int(nb_days)) - context['charts'] = [ { "color": "rgb(255, 99, 132)", - "label": "Balance", - "values": changes } ] + + last_days = self.request.GET.get('last_days', None) + if last_days is not None: + last_days = int(last_days) + begin_date = self.request.GET.get('begin_date', None) + end_date = self.request.GET.get('end_date', None) + + changes = self.get_changes_list( + last_days=last_days, + begin_date=begin_date, end_date=end_date, + ) + + context['charts'] = [{ + "color": "rgb(255, 99, 132)", + "label": "Balance", + "values": changes, + }] context['is_time_chart'] = True - context['min_date'] = changes[len(changes)-1]['at'] + context['min_date'] = changes[-1]['at'] context['max_date'] = changes[0]['at'] # TODO: offset return context @@ -2274,7 +2276,7 @@ ID_PREFIX_ACC_LAST_MONTHS = "last_months_acc" # Un résumé de toutes les vues ArticleStatLast # NE REND PAS DE JSON -class AccountStatLastAll(ObjectResumeStat): +class AccountStatLastAll(SingleResumeStat): model = Account context_object_name = 'account' trigramme_url_kwarg = 'trigramme' @@ -2419,7 +2421,7 @@ ID_PREFIX_ART_LAST_MONTHS = "last_months_art" # Un résumé de toutes les vues ArticleStatLast # NE REND PAS DE JSON -class ArticleStatLastAll(ObjectResumeStat): +class ArticleStatLastAll(SingleResumeStat): model = Article context_object_name = 'article' id_prefix = ID_PREFIX_ART_LAST From 1ee993e1e11a0318de6ae1251eb57e30655c3c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 17:14:36 +0200 Subject: [PATCH 187/213] Add permission check to AccountStatBalance Only connected user can get its balance data --- kfet/views.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kfet/views.py b/kfet/views.py index b0c90083..58413d80 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2260,6 +2260,12 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView): # TODO: offset return context + def get_object(self, *args, **kwargs): + obj = super().get_object(*args, **kwargs) + if self.request.user != obj.user: + raise PermissionDenied + return obj + @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(AccountStatBalance, self).dispatch(*args, **kwargs) From df7e935390aceea21e5afbc9be9ef80f4693f9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 17:16:05 +0200 Subject: [PATCH 188/213] Clean GET params in ajax calls - Use `data` arg of `$.getJSON` for `format` param - Delete `dictToArray` call on data returned by `SingleResumeStat` class view since this view now returns stats manifest as an array --- kfet/static/kfet/js/statistic.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kfet/static/kfet/js/statistic.js b/kfet/static/kfet/js/statistic.js index 7ab56f1d..e6cc6132 100644 --- a/kfet/static/kfet/js/statistic.js +++ b/kfet/static/kfet/js/statistic.js @@ -42,8 +42,7 @@ $(this).addClass("focus"); // loads data and shows it - $.getJSON(this.stats_target_url + "?format=json", - displayStats); + $.getJSON(this.stats_target_url, {format: 'json'}, displayStats); } function displayStats (data) { @@ -158,7 +157,7 @@ "aria-label": "select-period"}); var to_click; - var context = dictToArray(data.stats); + var context = data.stats; for (var i = 0; i < context.length; i++) { // creates the button @@ -191,7 +190,7 @@ // constructor (function () { - $.getJSON(url + "?format=json", initialize); + $.getJSON(url, {format: 'json'}, initialize); })(); }; })(jQuery); From 48721b7dcafe376aa6a4b3d6d153922fabf96963 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sun, 2 Apr 2017 17:54:13 -0300 Subject: [PATCH 189/213] Reduce graph size --- kfet/static/kfet/css/index.css | 1 + kfet/templates/kfet/account_read.html | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/kfet/static/kfet/css/index.css b/kfet/static/kfet/css/index.css index 563d3839..a65372da 100644 --- a/kfet/static/kfet/css/index.css +++ b/kfet/static/kfet/css/index.css @@ -105,6 +105,7 @@ textarea { .panel-md-margin{ background-color: white; + overflow:hidden; padding-left: 15px; padding-right: 15px; padding-bottom: 15px; diff --git a/kfet/templates/kfet/account_read.html b/kfet/templates/kfet/account_read.html index 50ab7f20..be27192e 100644 --- a/kfet/templates/kfet/account_read.html +++ b/kfet/templates/kfet/account_read.html @@ -70,7 +70,7 @@

        Ma balance

        -
        +
        @@ -78,7 +78,7 @@

        Ma consommation

        -
        +
        From 31261fd3761aa25be035d08127c2244d6c59a64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 2 Apr 2017 23:38:42 +0200 Subject: [PATCH 190/213] set height canvas graph & fix graph display --- kfet/static/kfet/js/statistic.js | 2 +- kfet/templates/kfet/account_read.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kfet/static/kfet/js/statistic.js b/kfet/static/kfet/js/statistic.js index e6cc6132..f6d21237 100644 --- a/kfet/static/kfet/js/statistic.js +++ b/kfet/static/kfet/js/statistic.js @@ -138,7 +138,7 @@ var prev_chart = content.children(); // creates a blank canvas element and attach it to the DOM - var canvas = $(""); + var canvas = $(""); content.append(canvas); // create the chart diff --git a/kfet/templates/kfet/account_read.html b/kfet/templates/kfet/account_read.html index 8333d0f0..449914f9 100644 --- a/kfet/templates/kfet/account_read.html +++ b/kfet/templates/kfet/account_read.html @@ -75,7 +75,7 @@ $(document).ready(function() {

        Ma balance

        -
        +
        @@ -83,7 +83,7 @@ $(document).ready(function() {

        Ma consommation

        -
        +
        From f585247224180840fb12825bbaa468006e0cd56a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 00:40:52 +0200 Subject: [PATCH 191/213] Refactor Account Operations stats MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit K-Fêt - Statistics New base class - StatScale - create scale, given chunk size (timedelta), start and end times - get labels of - get start and end datetimes of chunks DayStatScale: Scale whose chunks interval is 1 day WeekStatScale: same with 1 week MonthStatScale: same with 1 month AccountStatOperationList: manifest of operations stats of an account - renamed from AccountStatLastAll - updated according to SingleResumeStat AccountStatOperation: - renamed from AccountStatLast - remove scale logic with use of StatScale objects - used scale is given by `scale` and `scale_args` GET params - add filter on operations types with `types` GET param AccountStatLast(Day,Week,Month) are deleted ("merged" in AccountStatOperation) --- kfet/statistic.py | 149 +++++++++++++++++++++++------------- kfet/urls.py | 18 ++--- kfet/views.py | 191 ++++++++++++++++++++++------------------------ 3 files changed, 195 insertions(+), 163 deletions(-) diff --git a/kfet/statistic.py b/kfet/statistic.py index 09f9e935..5b5e297a 100644 --- a/kfet/statistic.py +++ b/kfet/statistic.py @@ -1,70 +1,117 @@ # -*- coding: utf-8 -*- + +from dateutil.relativedelta import relativedelta + from django.utils import timezone from django.db.models import Sum KFET_WAKES_UP_AT = 7 -# donne le nom des jours d'une liste de dates -# dans un dico ordonné -def daynames(dates): - names = {} - for i in dates: - names[i] = dates[i].strftime("%A") - return names + +def kfet_day(year, month, day, start_at=KFET_WAKES_UP_AT): + return timezone.datetime(year, month, day, hour=start_at) -# donne le nom des semaines une liste de dates -# dans un dico ordonné -def weeknames(dates): - names = {} - for i in dates: - names[i] = dates[i].strftime("Semaine %W") - return names +def to_kfet_day(dt, start_at=KFET_WAKES_UP_AT): + kfet_dt = kfet_day(year=dt.year, month=dt.month, day=dt.day) + if dt.hour < start_at: + kfet_dt -= timezone.timedelta(days=1) + return kfet_dt -# donne le nom des mois d'une liste de dates -# dans un dico ordonné -def monthnames(dates): - names = {} - for i in dates: - names[i] = dates[i].strftime("%B") - return names +class StatScale(object): + name = None + step = None + + def __init__(self, n_steps=0, begin=None, end=None, + last=False, std_chunk=True): + self.std_chunk = std_chunk + if last: + end = timezone.now() + + if begin is not None and n_steps != 0: + self.begin = self.get_from(begin) + self.end = self.do_step(self.begin, n_steps=n_steps) + elif end is not None and n_steps != 0: + self.end = self.get_from(end) + self.begin = self.do_step(self.end, n_steps=-n_steps) + elif begin is not None and end is not None: + self.begin = self.get_from(begin) + self.end = self.get_from(end) + else: + raise Exception('Two of these args must be specified: ' + 'n_steps, begin, end; ' + 'or use last and n_steps') + + self.datetimes = self.get_datetimes() + + @staticmethod + def by_name(name): + for cls in StatScale.__subclasses__(): + if cls.name == name: + return cls + raise Exception('scale %s not found' % name) + + def get_from(self, dt): + return self.std_chunk and self.get_chunk_start(dt) or dt + + def __getitem__(self, i): + return self.datetimes[i], self.datetimes[i+1] + + def __len__(self): + return len(self.datetimes) - 1 + + def do_step(self, dt, n_steps=1): + return dt + self.step * n_steps + + def get_datetimes(self): + datetimes = [self.begin] + tmp = self.begin + while tmp <= self.end: + tmp = self.do_step(tmp) + datetimes.append(tmp) + return datetimes + + def get_labels(self, label_fmt=None): + if label_fmt is None: + label_fmt = self.label_fmt + return [begin.strftime(label_fmt) for begin, end in self] + + @classmethod + def get_chunk_start(cls, dt): + dt_kfet = to_kfet_day(dt) + start = dt_kfet - cls.offset_to_chunk_start(dt_kfet) + return start -# rend les dates des nb derniers jours -# dans l'ordre chronologique -# aujourd'hui compris -# nb = 1 : rend hier -def lastdays(nb): - morning = this_morning() - days = {} - for i in range(1, nb+1): - days[i] = morning - timezone.timedelta(days=nb - i + 1) - return days +class DayStatScale(StatScale): + name = 'day' + step = timezone.timedelta(days=1) + label_fmt = '%A' + + @classmethod + def get_chunk_start(cls, dt): + return to_kfet_day(dt) -def lastweeks(nb): - monday_morning = this_monday_morning() - mondays = {} - for i in range(1, nb+1): - mondays[i] = monday_morning \ - - timezone.timedelta(days=7*(nb - i + 1)) - return mondays +class WeekStatScale(StatScale): + name = 'week' + step = timezone.timedelta(days=7) + label_fmt = 'Semaine %W' + + @classmethod + def offset_to_chunk_start(cls, dt): + return timezone.timedelta(days=dt.weekday()) -def lastmonths(nb): - first_month_day = this_first_month_day() - first_days = {} - this_year = first_month_day.year - this_month = first_month_day.month - for i in range(1, nb+1): - month = ((this_month - 1 - (nb - i)) % 12) + 1 - year = this_year + (nb - i) // 12 - first_days[i] = timezone.datetime(year=year, - month=month, - day=1, - hour=KFET_WAKES_UP_AT) - return first_days +class MonthStatScale(StatScale): + name = 'month' + step = relativedelta(months=1) + label_fmt = '%B' + + @classmethod + def get_chunk_start(cls, dt): + return to_kfet_day(dt).replace(day=1) def this_first_month_day(): diff --git a/kfet/urls.py b/kfet/urls.py index ddd40ce6..2eeef513 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -69,18 +69,12 @@ urlpatterns = [ name='kfet.account.negative'), # Account - Statistics - url('^accounts/(?P.{3})/stat/last/$', - views.AccountStatLastAll.as_view(), - name = 'kfet.account.stat.last'), - url('^accounts/(?P.{3})/stat/last/month/$', - views.AccountStatLastMonth.as_view(), - name = 'kfet.account.stat.last.month'), - url('^accounts/(?P.{3})/stat/last/week/$', - views.AccountStatLastWeek.as_view(), - name = 'kfet.account.stat.last.week'), - url('^accounts/(?P.{3})/stat/last/day/$', - views.AccountStatLastDay.as_view(), - name = 'kfet.account.stat.last.day'), + url('^accounts/(?P.{3})/stat/operations/list$', + views.AccountStatOperationList.as_view(), + name='kfet.account.stat.operation.list'), + url('^accounts/(?P.{3})/stat/operations$', + views.AccountStatOperation.as_view(), + name='kfet.account.stat.operation'), url(r'^accounts/(?P.{3})/stat/balance/list$', views.AccountStatBalanceList.as_view(), diff --git a/kfet/views.py b/kfet/views.py index 58413d80..0b62cd2e 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +import ast from urllib.parse import urlencode from django.shortcuts import render, get_object_or_404, redirect @@ -47,10 +48,10 @@ from decimal import Decimal import django_cas_ng import heapq import statistics -from .statistic import daynames, monthnames, weeknames, \ - lastdays, lastweeks, lastmonths, \ - this_morning, this_monday_morning, this_first_month_day, \ - tot_ventes +from kfet.statistic import DayStatScale, MonthStatScale, StatScale, WeekStatScale +from .statistic import ( + this_morning, this_monday_morning, this_first_month_day, tot_ventes, +) class Home(TemplateView): template_name = "kfet/home.html" @@ -2282,138 +2283,128 @@ ID_PREFIX_ACC_LAST_MONTHS = "last_months_acc" # Un résumé de toutes les vues ArticleStatLast # NE REND PAS DE JSON -class AccountStatLastAll(SingleResumeStat): +class AccountStatOperationList(PkUrlMixin, SingleResumeStat): model = Account context_object_name = 'account' - trigramme_url_kwarg = 'trigramme' + pk_url_kwarg = 'trigramme' id_prefix = ID_PREFIX_ACC_LAST - nb_stat = 3 nb_default = 2 - stat_labels = ["Derniers mois", "Dernières semaines", "Derniers jours"] - stat_urls = ['kfet.account.stat.last.month', - 'kfet.account.stat.last.week', - 'kfet.account.stat.last.day'] + stats = [ + { + 'label': 'Derniers mois', + 'url_params': dict( + types=[Operation.PURCHASE], + scale=MonthStatScale.name, + scale_args=dict( + last=True, + n_steps=7, + ), + ), + }, + { + 'label': 'Dernières semaines', + 'url_params': dict( + types=[Operation.PURCHASE], + last_days=49, + scale=WeekStatScale.name, + scale_args=dict( + last=True, + n_steps=7, + ), + ), + }, + { + 'label': 'Derniers jours', + 'url_params': dict( + types=[Operation.PURCHASE], + last_days=7, + scale=DayStatScale.name, + scale_args=dict( + last=True, + n_steps=7, + ), + ), + }, + ] + url_stat = 'kfet.account.stat.operation' - def get_object(self, **kwargs): - trigramme = self.kwargs.get(self.trigramme_url_kwarg) - return get_object_or_404(Account, trigramme=trigramme) - - def get_object_url_kwargs(self, **kwargs): - return {'trigramme': self.object.trigramme} + def get_object(self, *args, **kwargs): + obj = super().get_object(*args, **kwargs) + if self.request.user != obj.user: + raise PermissionDenied + return obj @method_decorator(login_required) def dispatch(self, *args, **kwargs): - return super(AccountStatLastAll, self).dispatch(*args, **kwargs) + return super().dispatch(*args, **kwargs) -class AccountStatLast(JSONDetailView): +class AccountStatOperation(PkUrlMixin, JSONDetailView): """ Returns a JSON containing the evolution a the personnal consommation of a trigramme at the diffent dates specified """ model = Account - trigramme_url_kwarg = 'trigramme' + pk_url_kwarg = 'trigramme' context_object_name = 'account' - end_date = timezone.now() id_prefix = "" - # doit rendre un dictionnaire des dates - # la première date correspond au début - # la dernière date est la fin de la dernière plage - def get_dates(self, **kwargs): - return {} - - # doit rendre un dictionnaire des labels - # le dernier label ne sera pas utilisé - def get_labels(self, **kwargs): - pass - - def get_object(self, **kwargs): - trigramme = self.kwargs.get(self.trigramme_url_kwarg) - return get_object_or_404(Account, trigramme=trigramme) - - def sort_operations(self, **kwargs): - # On récupère les dates - dates = self.get_dates() - # On ajoute la date de fin - extended_dates = dates.copy() - extended_dates[len(dates)+1] = self.end_date + def get_operations(self, types, scale): # On selectionne les opérations qui correspondent # à l'article en question et qui ne sont pas annulées # puis on choisi pour chaques intervalle les opérations # effectuées dans ces intervalles de temps all_operations = (Operation.objects - .filter(type='purchase') + .filter(type__in=types) .filter(group__on_acc=self.object) .filter(canceled_at=None) ) - operations = {} - for i in dates: - operations[i] = (all_operations - .filter(group__at__gte=extended_dates[i]) - .filter(group__at__lte=extended_dates[i+1]) - ) + operations = [] + for begin, end in scale: + operations.append(all_operations + .filter(group__at__gte=begin, + group__at__lte=end)) return operations def get_context_data(self, **kwargs): context = {} - nb_ventes = {} + + scale = self.request.GET.get('scale', None) + if scale is None: + scale = DayStatScale(n_steps=7, last=True) + else: + scale_cls = StatScale.by_name(scale) + scale_args = self.request.GET.get('scale_args', '{}') + scale = scale_cls(**ast.literal_eval(scale_args)) + print(scale.datetimes) + + types = self.request.GET.get('types', None) + if types is not None: + types = ast.literal_eval(types) + + operations = self.get_operations(types=types, scale=scale) # On récupère les labels des dates - context['labels'] = self.get_labels().copy() + context['labels'] = scale.get_labels() # On compte les opérations - operations = self.sort_operations() - for i in operations: - nb_ventes[i] = tot_ventes(operations[i]) - context['charts'] = [ { "color": "rgb(255, 99, 132)", - "label": "NB items achetés", - "values": nb_ventes } ] + nb_ventes = [] + for chunk in operations: + nb_ventes.append(tot_ventes(chunk)) + + context['labels'] = scale.get_labels() + context['charts'] = [{"color": "rgb(255, 99, 132)", + "label": "NB items achetés", + "values": nb_ventes}] return context + def get_object(self, *args, **kwargs): + obj = super().get_object(*args, **kwargs) + if self.request.user != obj.user: + raise PermissionDenied + return obj + @method_decorator(login_required) def dispatch(self, *args, **kwargs): - return super(AccountStatLast, self).dispatch(*args, **kwargs) - - -# Rend les achats pour ce compte des 7 derniers jours -# Aujourd'hui non compris -class AccountStatLastDay(AccountStatLast): - end_date = this_morning() - id_prefix = ID_PREFIX_ACC_LAST_DAYS - - def get_dates(self, **kwargs): - return lastdays(7) - - def get_labels(self, **kwargs): - days = lastdays(7) - return daynames(days) - - -# Rend les achats de ce compte des 7 dernières semaines -# La semaine en cours n'est pas comprise -class AccountStatLastWeek(AccountStatLast): - end_date = this_monday_morning() - id_prefix = ID_PREFIX_ACC_LAST_WEEKS - - def get_dates(self, **kwargs): - return lastweeks(7) - - def get_labels(self, **kwargs): - weeks = lastweeks(7) - return weeknames(weeks) - - -# Rend les achats de ce compte des 7 derniers mois -# Le mois en cours n'est pas compris -class AccountStatLastMonth(AccountStatLast): - end_date = this_monday_morning() - id_prefix = ID_PREFIX_ACC_LAST_MONTHS - - def get_dates(self, **kwargs): - return lastmonths(7) - - def get_labels(self, **kwargs): - months = lastmonths(7) - return monthnames(months) + return super().dispatch(*args, **kwargs) # ------------------------ From c01de558e1e1fd64006fe1559bcc968d9de42725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 03:12:52 +0200 Subject: [PATCH 192/213] Clean Article stats kfet.statistic - delete no longer used defs - new mixin - ScaleMixin - get scale args from GET params - chunkify querysets according to a scale Article stats - use SingleResumeStat for manifest - use ScaleMixin for sales - update urls - update permission required: teamkfet Account stats - update permission required: teamkfet - operations use ScaleMixin - fix manifests urls --- kfet/statistic.py | 93 ++++++++--- kfet/templates/kfet/account_read.html | 4 +- kfet/templates/kfet/article_read.html | 7 +- kfet/urls.py | 20 +-- kfet/views.py | 229 ++++++-------------------- 5 files changed, 132 insertions(+), 221 deletions(-) diff --git a/kfet/statistic.py b/kfet/statistic.py index 5b5e297a..8dd2e6d0 100644 --- a/kfet/statistic.py +++ b/kfet/statistic.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +import ast + from dateutil.relativedelta import relativedelta from django.utils import timezone @@ -50,7 +52,7 @@ class StatScale(object): for cls in StatScale.__subclasses__(): if cls.name == name: return cls - raise Exception('scale %s not found' % name) + return None def get_from(self, dt): return self.std_chunk and self.get_chunk_start(dt) or dt @@ -114,32 +116,38 @@ class MonthStatScale(StatScale): return to_kfet_day(dt).replace(day=1) -def this_first_month_day(): - now = timezone.now() - first_day = timezone.datetime(year=now.year, - month=now.month, - day=1, - hour=KFET_WAKES_UP_AT) - return first_day +def stat_manifest(scales_def=None, scale_args=None, **url_params): + if scales_def is None: + scales_def = [] + if scale_args is None: + scale_args = {} + return [ + dict( + label=label, + url_params=dict( + scale=cls.name, + scale_args=scale_args, + **url_params, + ), + ) + for label, cls in scales_def + ] -def this_monday_morning(): - now = timezone.now() - monday = now - timezone.timedelta(days=now.isoweekday()-1) - monday_morning = timezone.datetime(year=monday.year, - month=monday.month, - day=monday.day, - hour=KFET_WAKES_UP_AT) - return monday_morning - - -def this_morning(): - now = timezone.now() - morning = timezone.datetime(year=now.year, - month=now.month, - day=now.day, - hour=KFET_WAKES_UP_AT) - return morning +def last_stats_manifest(scales_def=None, scale_args=None, **url_params): + scales_def = [ + ('Derniers mois', MonthStatScale, ), + ('Dernières semaines', WeekStatScale, ), + ('Derniers jours', DayStatScale, ), + ] + if scale_args is None: + scale_args = {} + scale_args.update(dict( + last=True, + n_steps=7, + )) + return stat_manifest(scales_def=scales_def, scale_args=scale_args, + **url_params) # Étant donné un queryset d'operations @@ -147,3 +155,38 @@ def this_morning(): def tot_ventes(queryset): res = queryset.aggregate(Sum('article_nb'))['article_nb__sum'] return res and res or 0 + + +class ScaleMixin(object): + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + + scale_name = self.request.GET.get('scale', None) + scale_args = self.request.GET.get('scale_args', None) + + cls = StatScale.by_name(scale_name) + if cls is None: + scale = self.get_default_scale() + else: + scale_args = self.request.GET.get('scale_args', {}) + if isinstance(scale_args, str): + scale_args = ast.literal_eval(scale_args) + scale = cls(**scale_args) + + self.scale = scale + context['labels'] = scale.get_labels() + return context + + def get_default_scale(self): + return DayStatScale(n_steps=7, last=True) + + def chunkify_qs(self, qs, scale, field=None): + if field is None: + field = 'at' + begin_f = '{}__gte'.format(field) + end_f = '{}__lte'.format(field) + return [ + qs.filter(**{begin_f: begin, end_f: end}) + for begin, end in scale + ] diff --git a/kfet/templates/kfet/account_read.html b/kfet/templates/kfet/account_read.html index 449914f9..3c2ccbcd 100644 --- a/kfet/templates/kfet/account_read.html +++ b/kfet/templates/kfet/account_read.html @@ -17,11 +17,11 @@ + +{% endblock %} diff --git a/kfet/urls.py b/kfet/urls.py index 2eeef513..0ffeb84f 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -140,20 +140,14 @@ urlpatterns = [ # Article - Update url('^articles/(?P\d+)/edit$', teamkfet_required(views.ArticleUpdate.as_view()), - name = 'kfet.article.update'), + name='kfet.article.update'), # Article - Statistics - url('^articles/(?P\d+)/stat/last/$', - views.ArticleStatLastAll.as_view(), - name = 'kfet.article.stat.last'), - url('^articles/(?P\d+)/stat/last/month/$', - views.ArticleStatLastMonth.as_view(), - name = 'kfet.article.stat.last.month'), - url('^articles/(?P\d+)/stat/last/week/$', - views.ArticleStatLastWeek.as_view(), - name = 'kfet.article.stat.last.week'), - url('^articles/(?P\d+)/stat/last/day/$', - views.ArticleStatLastDay.as_view(), - name = 'kfet.article.stat.last.day'), + url(r'^articles/(?P\d+)/stat/sales/list$', + views.ArticleStatSalesList.as_view(), + name='kfet.article.stat.sales.list'), + url(r'^articles/(?P\d+)/stat/sales$', + views.ArticleStatSales.as_view(), + name='kfet.article.stat.sales'), # ----- # K-Psul urls diff --git a/kfet/views.py b/kfet/views.py index 0b62cd2e..3b50cc0a 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -48,10 +48,8 @@ from decimal import Decimal import django_cas_ng import heapq import statistics -from kfet.statistic import DayStatScale, MonthStatScale, StatScale, WeekStatScale -from .statistic import ( - this_morning, this_monday_morning, this_first_month_day, tot_ventes, -) +from kfet.statistic import ScaleMixin, last_stats_manifest, tot_ventes + class Home(TemplateView): template_name = "kfet/home.html" @@ -2155,10 +2153,8 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView): account = self.object # prepare filters - if end_date is None: - end_date = this_morning() - if last_days is not None: + end_date = timezone.now() begin_date = end_date - timezone.timedelta(days=last_days) # prepare querysets @@ -2289,43 +2285,7 @@ class AccountStatOperationList(PkUrlMixin, SingleResumeStat): pk_url_kwarg = 'trigramme' id_prefix = ID_PREFIX_ACC_LAST nb_default = 2 - stats = [ - { - 'label': 'Derniers mois', - 'url_params': dict( - types=[Operation.PURCHASE], - scale=MonthStatScale.name, - scale_args=dict( - last=True, - n_steps=7, - ), - ), - }, - { - 'label': 'Dernières semaines', - 'url_params': dict( - types=[Operation.PURCHASE], - last_days=49, - scale=WeekStatScale.name, - scale_args=dict( - last=True, - n_steps=7, - ), - ), - }, - { - 'label': 'Derniers jours', - 'url_params': dict( - types=[Operation.PURCHASE], - last_days=7, - scale=DayStatScale.name, - scale_args=dict( - last=True, - n_steps=7, - ), - ), - }, - ] + stats = last_stats_manifest(types=[Operation.PURCHASE]) url_stat = 'kfet.account.stat.operation' def get_object(self, *args, **kwargs): @@ -2339,7 +2299,7 @@ class AccountStatOperationList(PkUrlMixin, SingleResumeStat): return super().dispatch(*args, **kwargs) -class AccountStatOperation(PkUrlMixin, JSONDetailView): +class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView): """ Returns a JSON containing the evolution a the personnal consommation of a trigramme at the diffent dates specified @@ -2359,38 +2319,24 @@ class AccountStatOperation(PkUrlMixin, JSONDetailView): .filter(group__on_acc=self.object) .filter(canceled_at=None) ) - operations = [] - for begin, end in scale: - operations.append(all_operations - .filter(group__at__gte=begin, - group__at__lte=end)) - return operations + chunks = self.chunkify_qs(all_operations, scale, field='group__at') + return chunks - def get_context_data(self, **kwargs): - context = {} - - scale = self.request.GET.get('scale', None) - if scale is None: - scale = DayStatScale(n_steps=7, last=True) - else: - scale_cls = StatScale.by_name(scale) - scale_args = self.request.GET.get('scale_args', '{}') - scale = scale_cls(**ast.literal_eval(scale_args)) - print(scale.datetimes) + def get_context_data(self, *args, **kwargs): + old_ctx = super().get_context_data(*args, **kwargs) + context = {'labels': old_ctx['labels']} + scale = self.scale types = self.request.GET.get('types', None) if types is not None: types = ast.literal_eval(types) operations = self.get_operations(types=types, scale=scale) - # On récupère les labels des dates - context['labels'] = scale.get_labels() # On compte les opérations nb_ventes = [] for chunk in operations: nb_ventes.append(tot_ventes(chunk)) - context['labels'] = scale.get_labels() context['charts'] = [{"color": "rgb(255, 99, 132)", "label": "NB items achetés", "values": nb_ventes}] @@ -2418,141 +2364,66 @@ ID_PREFIX_ART_LAST_MONTHS = "last_months_art" # Un résumé de toutes les vues ArticleStatLast # NE REND PAS DE JSON -class ArticleStatLastAll(SingleResumeStat): +class ArticleStatSalesList(SingleResumeStat): model = Article context_object_name = 'article' id_prefix = ID_PREFIX_ART_LAST - nb_stat = 3 nb_default = 2 - stat_labels = ["Derniers mois", "Dernières semaines", "Derniers jours"] - stat_urls = ['kfet.article.stat.last.month', - 'kfet.article.stat.last.week', - 'kfet.article.stat.last.day'] + url_stat = 'kfet.article.stat.sales' + stats = last_stats_manifest() - @method_decorator(login_required) + @method_decorator(teamkfet_required) def dispatch(self, *args, **kwargs): - return super(ArticleStatLastAll, self).dispatch(*args, **kwargs) + return super().dispatch(*args, **kwargs) -class ArticleStatLast(JSONDetailView): +class ArticleStatSales(ScaleMixin, JSONDetailView): """ Returns a JSON containing the consommation of an article at the diffent dates precised """ model = Article context_object_name = 'article' - end_date = timezone.now() - id_prefix = "" - def render_to_response(self, context): - # Look for a 'format=json' GET argument - if self.request.GET.get('format') == 'json': - return self.render_to_json_response(context) - else: - return super(ArticleStatLast, self).render_to_response(context) + def get_context_data(self, *args, **kwargs): + old_ctx = super().get_context_data(*args, **kwargs) + context = {'labels': old_ctx['labels']} + scale = self.scale - # doit rendre un dictionnaire des dates - # la première date correspond au début - # la dernière date est la fin de la dernière plage - def get_dates(self, **kwargs): - pass - - # doit rendre un dictionnaire des labels - # le dernier label ne sera pas utilisé - def get_labels(self, **kwargs): - pass - - def get_context_data(self, **kwargs): - context = {} - # On récupère les labels des dates - context['labels'] = self.get_labels().copy() - # On récupère les dates - dates = self.get_dates() - # On ajoute la date de fin - extended_dates = dates.copy() - extended_dates[len(dates)+1] = self.end_date # On selectionne les opérations qui correspondent # à l'article en question et qui ne sont pas annulées # puis on choisi pour chaques intervalle les opérations # effectuées dans ces intervalles de temps - all_operations = (Operation.objects - .filter(type='purchase') - .filter(article=self.object) - .filter(canceled_at=None) - ) - operations = {} - for i in dates: - operations[i] = (all_operations - .filter(group__at__gte=extended_dates[i]) - .filter(group__at__lte=extended_dates[i+1]) - ) + all_operations = ( + Operation.objects + .filter(type=Operation.PURCHASE, + article=self.object, + canceled_at=None, + ) + ) + chunks = self.chunkify_qs(all_operations, scale, field='group__at') # On compte les opérations - nb_ventes = {} - nb_accounts = {} - nb_liq = {} - for i in operations: - nb_ventes[i] = tot_ventes(operations[i]) - nb_liq[i] = tot_ventes( - operations[i] - .filter(group__on_acc__trigramme='LIQ') - ) - nb_accounts[i] = tot_ventes( - operations[i] - .exclude(group__on_acc__trigramme='LIQ') - ) - context['charts'] = [ { "color": "rgb(255, 99, 132)", - "label": "Toutes consommations", - "values": nb_ventes }, - { "color": "rgb(54, 162, 235)", - "label": "LIQ", - "values": nb_liq }, - { "color": "rgb(255, 205, 86)", - "label": "Comptes K-Fêt", - "values": nb_accounts } ] + nb_ventes = [] + nb_accounts = [] + nb_liq = [] + for qs in chunks: + nb_ventes.append( + tot_ventes(qs)) + nb_liq.append( + tot_ventes(qs.filter(group__on_acc__trigramme='LIQ'))) + nb_accounts.append( + tot_ventes(qs.exclude(group__on_acc__trigramme='LIQ'))) + context['charts'] = [{"color": "rgb(255, 99, 132)", + "label": "Toutes consommations", + "values": nb_ventes}, + {"color": "rgb(54, 162, 235)", + "label": "LIQ", + "values": nb_liq}, + {"color": "rgb(255, 205, 86)", + "label": "Comptes K-Fêt", + "values": nb_accounts}] return context - @method_decorator(login_required) + @method_decorator(teamkfet_required) def dispatch(self, *args, **kwargs): - return super(ArticleStatLast, self).dispatch(*args, **kwargs) - - -# Rend les ventes des 7 derniers jours -# Aujourd'hui non compris -class ArticleStatLastDay(ArticleStatLast): - end_date = this_morning() - id_prefix = ID_PREFIX_ART_LAST_DAYS - - def get_dates(self, **kwargs): - return lastdays(7) - - def get_labels(self, **kwargs): - days = lastdays(7) - return daynames(days) - - -# Rend les ventes de 7 dernières semaines -# La semaine en cours n'est pas comprise -class ArticleStatLastWeek(ArticleStatLast): - end_date = this_monday_morning() - id_prefix = ID_PREFIX_ART_LAST_WEEKS - - def get_dates(self, **kwargs): - return lastweeks(7) - - def get_labels(self, **kwargs): - weeks = lastweeks(7) - return weeknames(weeks) - - -# Rend les ventes des 7 derniers mois -# Le mois en cours n'est pas compris -class ArticleStatLastMonth(ArticleStatLast): - end_date = this_monday_morning() - id_prefix = ID_PREFIX_ART_LAST_MONTHS - - def get_dates(self, **kwargs): - return lastmonths(7) - - def get_labels(self, **kwargs): - months = lastmonths(7) - return monthnames(months) + return super().dispatch(*args, **kwargs) From d97a7be8196800562b3c4a4bbd7e3e7ff8eb01b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 03:15:07 +0200 Subject: [PATCH 193/213] stats: fix begin of balances graphs - graph begin at first operation or later --- kfet/views.py | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index 3b50cc0a..fdcb3763 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2185,23 +2185,8 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView): # sera mis à jour lors d'une # autre passe) # } - actions = [] - if begin_date is not None: - actions.append({ - 'at': begin_date.isoformat(), - 'amount': 0, - 'label': "début", - 'balance': 0, - }) - if end_date is not None: - actions.append({ - 'at': end_date.isoformat(), - 'amount': 0, - 'label': "actuel", - 'balance': 0, - }) - actions += [ + actions = [ { 'at': ope_grp.at.isoformat(), 'amount': ope_grp.amount, From b3a9ad8a964dc3128b404316eb32e92698bc526a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 13:24:04 +0200 Subject: [PATCH 194/213] clean mixin --- kfet/statistic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/kfet/statistic.py b/kfet/statistic.py index 8dd2e6d0..2abb4fd8 100644 --- a/kfet/statistic.py +++ b/kfet/statistic.py @@ -163,7 +163,6 @@ class ScaleMixin(object): context = super().get_context_data(*args, **kwargs) scale_name = self.request.GET.get('scale', None) - scale_args = self.request.GET.get('scale_args', None) cls = StatScale.by_name(scale_name) if cls is None: From 1bb83ccdd70338455da0eecb269cfcda14275786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 15:10:53 +0200 Subject: [PATCH 195/213] simplify StatScale --- kfet/statistic.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/kfet/statistic.py b/kfet/statistic.py index 2abb4fd8..1db30d73 100644 --- a/kfet/statistic.py +++ b/kfet/statistic.py @@ -79,12 +79,6 @@ class StatScale(object): label_fmt = self.label_fmt return [begin.strftime(label_fmt) for begin, end in self] - @classmethod - def get_chunk_start(cls, dt): - dt_kfet = to_kfet_day(dt) - start = dt_kfet - cls.offset_to_chunk_start(dt_kfet) - return start - class DayStatScale(StatScale): name = 'day' @@ -102,8 +96,10 @@ class WeekStatScale(StatScale): label_fmt = 'Semaine %W' @classmethod - def offset_to_chunk_start(cls, dt): - return timezone.timedelta(days=dt.weekday()) + def get_chunk_start(cls, dt): + dt_kfet = to_kfet_day(dt) + offset = timezone.timedelta(days=dt_kfet.weekday()) + return dt_kfet - offset class MonthStatScale(StatScale): From 769c37634d1f9bfd320bd3e26cef4326be1d9d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 15:43:56 +0200 Subject: [PATCH 196/213] delete debug msg --- kfet/templates/kfet/article_read.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/kfet/templates/kfet/article_read.html b/kfet/templates/kfet/article_read.html index 1e0fb650..6fe025f6 100644 --- a/kfet/templates/kfet/article_read.html +++ b/kfet/templates/kfet/article_read.html @@ -102,12 +102,10 @@ From 87bc90ec8bd25ce0ce4a4a0415b2dd44ebdf6181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 16:07:31 +0200 Subject: [PATCH 197/213] Begin/end balance stat graph - Anytime begin at account creation datetime - Others doesn't take care of account creation - Add check to avoid to bug on actions list length --- kfet/views.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index fdcb3763..a82e5cea 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2186,7 +2186,22 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView): # autre passe) # } - actions = [ + actions = [] + + actions.append({ + 'at': (begin_date or account.created_at).isoformat(), + 'amount': 0, + 'label': 'début', + 'balance': 0, + }) + actions.append({ + 'at': (end_date or timezone.now()).isoformat(), + 'amount': 0, + 'label': 'fin', + 'balance': 0, + }) + + actions += [ { 'at': ope_grp.at.isoformat(), 'amount': ope_grp.amount, @@ -2210,11 +2225,12 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView): ] # Maintenant on trie la liste des actions par ordre du plus récent # an plus ancien et on met à jour la balance - actions = sorted(actions, key=lambda k: k['at'], reverse=True) - actions[0]['balance'] = account.balance - for i in range(len(actions)-1): - actions[i+1]['balance'] = \ - actions[i]['balance'] - actions[i+1]['amount'] + if len(actions) > 1: + actions = sorted(actions, key=lambda k: k['at'], reverse=True) + actions[0]['balance'] = account.balance + for i in range(len(actions)-1): + actions[i+1]['balance'] = \ + actions[i]['balance'] - actions[i+1]['amount'] return actions def get_context_data(self, *args, **kwargs): From b113a57b741bf05aa59ee554a73b1ce40f9aba45 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 3 Apr 2017 11:20:56 -0300 Subject: [PATCH 198/213] Fix update function --- kfet/templates/kfet/inventory_create.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kfet/templates/kfet/inventory_create.html b/kfet/templates/kfet/inventory_create.html index 293bcd6b..29bf2d3e 100644 --- a/kfet/templates/kfet/inventory_create.html +++ b/kfet/templates/kfet/inventory_create.html @@ -110,14 +110,14 @@ $(document).ready(function() { $line.find('.current_stock').text(old_stock + stock_diff); $line.find('.stock_diff').text(''); - if ($line.find('.stock_new input').val()) { + if ($line.find('.stock_new input').val() && stock_diff) { var old_misc = +$line.find('.misc input').val(); $line.find('.misc input').val(old_misc + stock_diff) .trigger('input'); } var id = $line.find('input[type="hidden"]').val(); - conflicts = conflicts.delete(id); + conflicts.delete(parseInt(id)); } $('.finished input').change(function() { From 40da3bc2995c2df5c464c21dccb2fe74e6be3180 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 3 Apr 2017 11:21:05 -0300 Subject: [PATCH 199/213] Listen on input --- kfet/templates/kfet/inventory_create.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/templates/kfet/inventory_create.html b/kfet/templates/kfet/inventory_create.html index 29bf2d3e..61792c6d 100644 --- a/kfet/templates/kfet/inventory_create.html +++ b/kfet/templates/kfet/inventory_create.html @@ -164,7 +164,7 @@ $(document).ready(function() { } } - $('#inventoryform').on("submit", function(e) { + $('input[type="submit"]').on("click", function(e) { e.preventDefault(); if (conflicts.size) { From 903da795ab3f7a5399a33cf221ea70d8b19880b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 16:53:28 +0200 Subject: [PATCH 200/213] clean kfet statistic.js - no longer dictToArray where it isn't necessary (because already an array) - fix chart height: - previous charts were causing bugs - height is fixed (even with window resizing) - clean whitespaces --- kfet/static/kfet/js/statistic.js | 37 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/kfet/static/kfet/js/statistic.js b/kfet/static/kfet/js/statistic.js index f6d21237..9593c9f7 100644 --- a/kfet/static/kfet/js/statistic.js +++ b/kfet/static/kfet/js/statistic.js @@ -1,10 +1,10 @@ (function($){ window.StatsGroup = function (url, target) { // a class to properly display statictics - + // url : points to an ObjectResumeStat that lists the options through JSON // target : element of the DOM where to put the stats - + var self = this; var element = $(target); var content = $("
        "); @@ -22,21 +22,21 @@ return array; } - function handleTimeChart (dict) { + function handleTimeChart (data) { // reads the balance data and put it into chartjs formatting - var data = dictToArray(dict, 0); + chart_data = new Array(); for (var i = 0; i < data.length; i++) { var source = data[i]; - data[i] = { x: new Date(source.at), + chart_data[i] = { x: new Date(source.at), y: source.balance, label: source.label } } - return data; + return chart_data; } - + function showStats () { // CALLBACK : called when a button is selected - + // shows the focus on the correct button buttons.find(".focus").removeClass("focus"); $(this).addClass("focus"); @@ -50,14 +50,14 @@ var chart_datasets = []; var charts = dictToArray(data.charts); - + // are the points indexed by timestamps? var is_time_chart = data.is_time_chart || false; // reads the charts data for (var i = 0; i < charts.length; i++) { var chart = charts[i]; - + // format the data var chart_data = is_time_chart ? handleTimeChart(chart.values) : dictToArray(chart.values, 1); @@ -77,6 +77,7 @@ var chart_options = { responsive: true, + maintainAspectRatio: false, tooltips: { mode: 'index', intersect: false, @@ -129,25 +130,25 @@ type: 'line', options: chart_options, data: { - labels: dictToArray(data.labels, 1), + labels: (data.labels || []).slice(1), datasets: chart_datasets, } }; // saves the previous charts to be destroyed var prev_chart = content.children(); - + + // clean + prev_chart.remove(); + // creates a blank canvas element and attach it to the DOM - var canvas = $(""); + var canvas = $(""); content.append(canvas); // create the chart var chart = new Chart(canvas, chart_model); - - // clean - prev_chart.remove(); } - + // initialize the interface function initialize (data) { // creates the bar with the buttons @@ -158,7 +159,7 @@ var to_click; var context = data.stats; - + for (var i = 0; i < context.length; i++) { // creates the button var btn_wrapper = $("
        ", From 6d2e150aa0f54832ac61f56115158510051c0460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 16:56:44 +0200 Subject: [PATCH 201/213] clean align --- kfet/static/kfet/js/statistic.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kfet/static/kfet/js/statistic.js b/kfet/static/kfet/js/statistic.js index 9593c9f7..f210c11d 100644 --- a/kfet/static/kfet/js/statistic.js +++ b/kfet/static/kfet/js/statistic.js @@ -27,9 +27,11 @@ chart_data = new Array(); for (var i = 0; i < data.length; i++) { var source = data[i]; - chart_data[i] = { x: new Date(source.at), - y: source.balance, - label: source.label } + chart_data[i] = { + x: new Date(source.at), + y: source.balance, + label: source.label, + } } return chart_data; } From 10d2b58fa7e01fa1ddbecc969b1aa1c460f8a3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 3 Apr 2017 17:06:32 +0200 Subject: [PATCH 202/213] clean some comments - fix: error if actions are empty in balance stats --- kfet/views.py | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index a82e5cea..17de388e 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2049,9 +2049,10 @@ class PkUrlMixin(object): class SingleResumeStat(JSONDetailView): - """ - Summarize all the stats of an object - Handles JSONResponse + """Manifest for a kind of a stat about an object. + + Returns JSON whose payload is an array containing descriptions of a stat: + url to retrieve data, label, ... """ id_prefix = '' @@ -2095,9 +2096,8 @@ class SingleResumeStat(JSONDetailView): ID_PREFIX_ACC_BALANCE = "balance_acc" -# Un résumé de toutes les vues ArticleStatBalance -# REND DU JSON class AccountStatBalanceList(PkUrlMixin, SingleResumeStat): + """Manifest for balance stats of an account.""" model = Account context_object_name = 'account' pk_url_kwarg = 'trigramme' @@ -2138,12 +2138,10 @@ class AccountStatBalanceList(PkUrlMixin, SingleResumeStat): class AccountStatBalance(PkUrlMixin, JSONDetailView): - """ - Returns a JSON containing the evolution a the personnal - balance of a trigramme between timezone.now() and `nb_days` - ago (specified to the view as an argument) - takes into account the Operations and the Transfers - does not takes into account the balance offset + """Datasets of balance of an account. + + Operations and Transfers are taken into account. + """ model = Account pk_url_kwarg = 'trigramme' @@ -2253,8 +2251,9 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView): "values": changes, }] context['is_time_chart'] = True - context['min_date'] = changes[-1]['at'] - context['max_date'] = changes[0]['at'] + if len(changes) > 0: + context['min_date'] = changes[-1]['at'] + context['max_date'] = changes[0]['at'] # TODO: offset return context @@ -2278,9 +2277,8 @@ ID_PREFIX_ACC_LAST_WEEKS = "last_weeks_acc" ID_PREFIX_ACC_LAST_MONTHS = "last_months_acc" -# Un résumé de toutes les vues ArticleStatLast -# NE REND PAS DE JSON class AccountStatOperationList(PkUrlMixin, SingleResumeStat): + """Manifest for operations stats of an account.""" model = Account context_object_name = 'account' pk_url_kwarg = 'trigramme' @@ -2301,10 +2299,7 @@ class AccountStatOperationList(PkUrlMixin, SingleResumeStat): class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView): - """ - Returns a JSON containing the evolution a the personnal - consommation of a trigramme at the diffent dates specified - """ + """Datasets of operations of an account.""" model = Account pk_url_kwarg = 'trigramme' context_object_name = 'account' @@ -2363,9 +2358,8 @@ ID_PREFIX_ART_LAST_WEEKS = "last_weeks_art" ID_PREFIX_ART_LAST_MONTHS = "last_months_art" -# Un résumé de toutes les vues ArticleStatLast -# NE REND PAS DE JSON class ArticleStatSalesList(SingleResumeStat): + """Manifest for sales stats of an article.""" model = Article context_object_name = 'article' id_prefix = ID_PREFIX_ART_LAST @@ -2379,10 +2373,7 @@ class ArticleStatSalesList(SingleResumeStat): class ArticleStatSales(ScaleMixin, JSONDetailView): - """ - Returns a JSON containing the consommation - of an article at the diffent dates precised - """ + """Datasets of sales of an article.""" model = Article context_object_name = 'article' From ad2c8537e3afb1524ab8d0caa257b8fc958da3dd Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 3 Apr 2017 15:50:18 -0300 Subject: [PATCH 203/213] Add Runpython (oops) --- kfet/migrations/0050_remove_checkout.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/kfet/migrations/0050_remove_checkout.py b/kfet/migrations/0050_remove_checkout.py index f9c374ca..b712c2d8 100644 --- a/kfet/migrations/0050_remove_checkout.py +++ b/kfet/migrations/0050_remove_checkout.py @@ -4,6 +4,20 @@ from __future__ import unicode_literals from django.db import migrations, models +def adapt_operation_types(apps, schema_editor): + Operation = apps.get_model("kfet", "Operation") + Operation.objects.filter( + is_checkout=False, + type__in=['withdraw', 'deposit']).update(type='edit') + + +def revert_operation_types(apps, schema_editor): + Operation = apps.get_model("kfet", "Operation") + edits = Operation.objects.filter(type='edit') + edits.filter(amount__gt=0).update(type='deposit') + edits.filter(amount__lte=0).update(type='withdraw') + + class Migration(migrations.Migration): dependencies = [ @@ -11,13 +25,14 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RemoveField( - model_name='operation', - name='is_checkout', - ), migrations.AlterField( model_name='operation', name='type', field=models.CharField(choices=[('purchase', 'Achat'), ('deposit', 'Charge'), ('withdraw', 'Retrait'), ('initial', 'Initial'), ('edit', 'Édition')], max_length=8), ), + migrations.RunPython(adapt_operation_types, revert_operation_types), + migrations.RemoveField( + model_name='operation', + name='is_checkout', + ), ] From 5607d7c9a419e4fbe23426bc626f8f8887401907 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 3 Apr 2017 15:54:02 -0300 Subject: [PATCH 204/213] Migration pour `kfet_forms` --- kfet/migrations/0051_verbose_names.py | 210 ++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 kfet/migrations/0051_verbose_names.py diff --git a/kfet/migrations/0051_verbose_names.py b/kfet/migrations/0051_verbose_names.py new file mode 100644 index 00000000..ae407fac --- /dev/null +++ b/kfet/migrations/0051_verbose_names.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('kfet', '0050_remove_checkout'), + ] + + operations = [ + migrations.AlterField( + model_name='account', + name='is_frozen', + field=models.BooleanField(default=False, verbose_name='est gelé'), + ), + migrations.AlterField( + model_name='account', + name='nickname', + field=models.CharField(default='', max_length=255, verbose_name='surnom(s)', blank=True), + ), + migrations.AlterField( + model_name='accountnegative', + name='authz_overdraft_amount', + field=models.DecimalField(max_digits=6, blank=True, default=None, null=True, verbose_name='négatif autorisé', decimal_places=2), + ), + migrations.AlterField( + model_name='accountnegative', + name='authz_overdraft_until', + field=models.DateTimeField(default=None, null=True, verbose_name='expiration du négatif', blank=True), + ), + migrations.AlterField( + model_name='accountnegative', + name='balance_offset', + field=models.DecimalField(blank=True, max_digits=6, help_text="Montant non compris dans l'autorisation de négatif", default=None, null=True, verbose_name='décalage de balance', decimal_places=2), + ), + migrations.AlterField( + model_name='accountnegative', + name='comment', + field=models.CharField(blank=True, max_length=255, verbose_name='commentaire'), + ), + migrations.AlterField( + model_name='article', + name='box_capacity', + field=models.PositiveSmallIntegerField(default=None, null=True, verbose_name='capacité du contenant', blank=True), + ), + migrations.AlterField( + model_name='article', + name='box_type', + field=models.CharField(blank=True, max_length=7, choices=[('caisse', 'caisse'), ('carton', 'carton'), ('palette', 'palette'), ('fût', 'fût')], default=None, null=True, verbose_name='type de contenant'), + ), + migrations.AlterField( + model_name='article', + name='category', + field=models.ForeignKey(related_name='articles', to='kfet.ArticleCategory', on_delete=django.db.models.deletion.PROTECT, verbose_name='catégorie'), + ), + migrations.AlterField( + model_name='article', + name='hidden', + field=models.BooleanField(default=False, verbose_name='caché', help_text='Si oui, ne sera pas affiché au public ; par exemple sur la carte.'), + ), + migrations.AlterField( + model_name='article', + name='is_sold', + field=models.BooleanField(default=True, verbose_name='en vente'), + ), + migrations.AlterField( + model_name='article', + name='name', + field=models.CharField(max_length=45, verbose_name='nom'), + ), + migrations.AlterField( + model_name='article', + name='price', + field=models.DecimalField(default=0, verbose_name='prix', decimal_places=2, max_digits=6), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='amount_error', + field=models.DecimalField(max_digits=6, verbose_name="montant de l'erreur", decimal_places=2), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='amount_taken', + field=models.DecimalField(max_digits=6, verbose_name='montant pris', decimal_places=2), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='balance_new', + field=models.DecimalField(max_digits=6, verbose_name='nouvelle balance', decimal_places=2), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='balance_old', + field=models.DecimalField(max_digits=6, verbose_name='ancienne balance', decimal_places=2), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='not_count', + field=models.BooleanField(default=False, verbose_name='caisse non comptée'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_001', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 1¢'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_002', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 2¢'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_005', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 5¢'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_01', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 10¢'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_02', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 20¢'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_05', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 50¢'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_1', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 1€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_10', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 10€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_100', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 100€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_2', + field=models.PositiveSmallIntegerField(default=0, verbose_name='pièces de 2€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_20', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 20€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_200', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 200€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_5', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 5€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_50', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 50€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_500', + field=models.PositiveSmallIntegerField(default=0, verbose_name='billets de 500€'), + ), + migrations.AlterField( + model_name='checkoutstatement', + name='taken_cheque', + field=models.DecimalField(default=0, verbose_name='montant des chèques', decimal_places=2, max_digits=6), + ), + migrations.AlterField( + model_name='supplier', + name='address', + field=models.TextField(verbose_name='adresse'), + ), + migrations.AlterField( + model_name='supplier', + name='comment', + field=models.TextField(verbose_name='commentaire'), + ), + migrations.AlterField( + model_name='supplier', + name='email', + field=models.EmailField(max_length=254, verbose_name='adresse mail'), + ), + migrations.AlterField( + model_name='supplier', + name='name', + field=models.CharField(max_length=45, verbose_name='nom'), + ), + migrations.AlterField( + model_name='supplier', + name='phone', + field=models.CharField(max_length=10, verbose_name='téléphone'), + ), + ] From 32474a6865d233df90be46f19cd783446c37f3b4 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 3 Apr 2017 16:03:22 -0300 Subject: [PATCH 205/213] Don't update input when unchecking --- kfet/templates/kfet/inventory_create.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kfet/templates/kfet/inventory_create.html b/kfet/templates/kfet/inventory_create.html index 61792c6d..1098f1f8 100644 --- a/kfet/templates/kfet/inventory_create.html +++ b/kfet/templates/kfet/inventory_create.html @@ -101,7 +101,7 @@ $(document).ready(function() { * Remove warning and update stock */ - function update_stock($line) { + function update_stock($line, update_count) { $line.removeClass('inventory_modified'); $line.find('.inventory_update').hide(); @@ -110,7 +110,7 @@ $(document).ready(function() { $line.find('.current_stock').text(old_stock + stock_diff); $line.find('.stock_diff').text(''); - if ($line.find('.stock_new input').val() && stock_diff) { + if ($line.find('.stock_new input').val() && update_count) { var old_misc = +$line.find('.misc input').val(); $line.find('.misc input').val(old_misc + stock_diff) .trigger('input'); @@ -122,12 +122,12 @@ $(document).ready(function() { $('.finished input').change(function() { var $line = $(this).closest('tr'); - update_stock($line); + update_stock($line, false); }); $('.inventory_update button').click(function() { var $line = $(this).closest('tr'); - update_stock($line); + update_stock($line, true); }); From 51acb4e00aae09ed8e7ab7536c92c65ef380e3a9 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 3 Apr 2017 16:05:18 -0300 Subject: [PATCH 206/213] Use new WS class --- kfet/templates/kfet/inventory_create.html | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/kfet/templates/kfet/inventory_create.html b/kfet/templates/kfet/inventory_create.html index 1098f1f8..d8109f8e 100644 --- a/kfet/templates/kfet/inventory_create.html +++ b/kfet/templates/kfet/inventory_create.html @@ -80,6 +80,8 @@ $(document).ready(function() { 'use strict'; + var conflicts = new Set(); + /** * Autofill new stock from other inputs */ @@ -135,15 +137,7 @@ $(document).ready(function() { * Websocket */ - var conflicts = new Set(); - var websocket_msg_default = {'articles':[]} - - var websocket_protocol = window.location.protocol == 'https:' ? 'wss' : 'ws'; - var location_host = window.location.host; - var location_url = window.location.pathname.startsWith('/gestion/') ? location_host + '/gestion' : location_host; - var socket = new ReconnectingWebSocket(websocket_protocol+"://" + location_url + "/ws/k-fet/k-psul/"); - socket.onmessage = function(e) { - var data = $.extend({}, websocket_msg_default, JSON.parse(e.data)); + OperationWebSocket.add_handler(function(data) { for (let article of data['articles']) { var $line = $('input[value="'+article.id+'"]').parent(); if ($line.find('.finished input').is(":checked")) { @@ -162,7 +156,7 @@ $(document).ready(function() { $line.find('.current_stock').text(article.stock); } } - } + }); $('input[type="submit"]').on("click", function(e) { e.preventDefault(); From f13d1072c70fc7ff9bbb9409911fad19445ab7af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 3 Apr 2017 22:55:54 +0100 Subject: [PATCH 207/213] Add simple tests for the stat views We check that we can get all the stats views with the appropriate permissions. --- cof/urls.py | 2 +- kfet/tests.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/cof/urls.py b/cof/urls.py index 7ec728da..06b1087a 100644 --- a/cof/urls.py +++ b/cof/urls.py @@ -84,7 +84,7 @@ urlpatterns = [ url(r'^k-fet/', include('kfet.urls')), ] -if settings.DEBUG: +if 'debug_toolbar' in settings.INSTALLED_APPS: import debug_toolbar urlpatterns += [ url(r'^__debug__/', include(debug_toolbar.urls)), diff --git a/kfet/tests.py b/kfet/tests.py index 5bea7afa..ffca7a44 100644 --- a/kfet/tests.py +++ b/kfet/tests.py @@ -1,5 +1,70 @@ # -*- coding: utf-8 -*- -from django.test import TestCase +from unittest.mock import patch -# Écrire les tests ici +from django.test import TestCase, Client +from django.contrib.auth.models import User, Permission + +from .models import Account, Article, ArticleCategory + + +class TestStats(TestCase): + @patch('kfet.signals.messages') + def test_user_stats(self, mock_messages): + """ + Checks that we can get the stat-related pages without any problem. + """ + # We setup two users and an article. Only the first user is part of the + # team. + user = User.objects.create(username="Foobar") + user.set_password("foobar") + user.save() + Account.objects.create(trigramme="FOO", cofprofile=user.profile) + perm = Permission.objects.get(codename="is_team") + user.user_permissions.add(perm) + + user2 = User.objects.create(username="Barfoo") + user2.set_password("barfoo") + user2.save() + Account.objects.create(trigramme="BAR", cofprofile=user2.profile) + + article = Article.objects.create( + name="article", + category=ArticleCategory.objects.create(name="C") + ) + + # Each user have its own client + client = Client() + client.login(username="Foobar", password="foobar") + client2 = Client() + client2.login(username="Barfoo", password="barfoo") + + # 1. FOO should be able to get these pages but BAR receives a Forbidden + # response + user_urls = [ + "/k-fet/accounts/FOO/stat/operations/list", + "/k-fet/accounts/FOO/stat/operations?{}".format( + '&'.join(["scale=day", + "types=['purchase']", + "scale_args={'n_steps':+7,+'last':+True}", + "format=json"])), + "/k-fet/accounts/FOO/stat/balance/list", + "/k-fet/accounts/FOO/stat/balance?format=json" + ] + for url in user_urls: + resp = client.get(url) + self.assertEqual(200, resp.status_code) + resp2 = client2.get(url) + self.assertEqual(403, resp2.status_code) + + # 2. FOO is a member of the team and can get these pages but BAR + # receives a Redirect response + articles_urls = [ + "/k-fet/articles/{}/stat/sales/list".format(article.pk), + "/k-fet/articles/{}/stat/sales".format(article.pk) + ] + for url in articles_urls: + resp = client.get(url) + self.assertEqual(200, resp.status_code) + resp2 = client2.get(url) + self.assertEqual(302, resp2.status_code) From df467767f441f55b193ac9a146b97660bf55db55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 4 Apr 2017 01:29:19 +0200 Subject: [PATCH 208/213] fix default GET param 'types' on operations stats --- kfet/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kfet/views.py b/kfet/views.py index 17de388e..8f5cdb3a 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2324,7 +2324,9 @@ class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView): scale = self.scale types = self.request.GET.get('types', None) - if types is not None: + if types is None: + types = [] + else: types = ast.literal_eval(types) operations = self.get_operations(types=types, scale=scale) From 7989a07b5f61d7f4acb5165811b5c4765e43934f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 4 Apr 2017 01:36:19 +0200 Subject: [PATCH 209/213] cleaner fix --- kfet/views.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index 8f5cdb3a..69126634 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2305,16 +2305,17 @@ class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView): context_object_name = 'account' id_prefix = "" - def get_operations(self, types, scale): + def get_operations(self, scale, types=None): # On selectionne les opérations qui correspondent # à l'article en question et qui ne sont pas annulées # puis on choisi pour chaques intervalle les opérations # effectuées dans ces intervalles de temps all_operations = (Operation.objects - .filter(type__in=types) .filter(group__on_acc=self.object) .filter(canceled_at=None) ) + if types is not None: + all_operations = all_operations.filter(type__in==types) chunks = self.chunkify_qs(all_operations, scale, field='group__at') return chunks @@ -2324,9 +2325,7 @@ class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView): scale = self.scale types = self.request.GET.get('types', None) - if types is None: - types = [] - else: + if types is not None: types = ast.literal_eval(types) operations = self.get_operations(types=types, scale=scale) From 278459e80f2b478a958cdebe263936c466332649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 4 Apr 2017 11:05:49 +0200 Subject: [PATCH 210/213] typo....... --- kfet/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/views.py b/kfet/views.py index 69126634..fe174588 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -2315,7 +2315,7 @@ class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView): .filter(canceled_at=None) ) if types is not None: - all_operations = all_operations.filter(type__in==types) + all_operations = all_operations.filter(type__in=types) chunks = self.chunkify_qs(all_operations, scale, field='group__at') return chunks From 885e40fd05da9e9d9cd44645a3e7c4c332196841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 4 Apr 2017 18:11:15 +0200 Subject: [PATCH 211/213] cleaner scales - References to `Stat` in `Scale` objects are deleted (because scales are independent of stats) - KFET_WAKES_UP_AT is now a time object insted of an hour - Proper use of date, datetime, timedelta, etc (django.utils.timezone provides neither datetime nor timedelta) --- kfet/statistic.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/kfet/statistic.py b/kfet/statistic.py index 1db30d73..4ae17959 100644 --- a/kfet/statistic.py +++ b/kfet/statistic.py @@ -1,27 +1,29 @@ # -*- coding: utf-8 -*- import ast +from datetime import date, datetime, time, timedelta from dateutil.relativedelta import relativedelta from django.utils import timezone from django.db.models import Sum -KFET_WAKES_UP_AT = 7 +KFET_WAKES_UP_AT = time(7, 0) def kfet_day(year, month, day, start_at=KFET_WAKES_UP_AT): - return timezone.datetime(year, month, day, hour=start_at) + """datetime wrapper with time offset.""" + return datetime.combine(date(year, month, day), start_at) def to_kfet_day(dt, start_at=KFET_WAKES_UP_AT): kfet_dt = kfet_day(year=dt.year, month=dt.month, day=dt.day) - if dt.hour < start_at: - kfet_dt -= timezone.timedelta(days=1) + if dt.time() < start_at: + kfet_dt -= timedelta(days=1) return kfet_dt -class StatScale(object): +class Scale(object): name = None step = None @@ -49,7 +51,7 @@ class StatScale(object): @staticmethod def by_name(name): - for cls in StatScale.__subclasses__(): + for cls in Scale.__subclasses__(): if cls.name == name: return cls return None @@ -80,9 +82,9 @@ class StatScale(object): return [begin.strftime(label_fmt) for begin, end in self] -class DayStatScale(StatScale): +class DayScale(Scale): name = 'day' - step = timezone.timedelta(days=1) + step = timedelta(days=1) label_fmt = '%A' @classmethod @@ -90,19 +92,19 @@ class DayStatScale(StatScale): return to_kfet_day(dt) -class WeekStatScale(StatScale): +class WeekScale(Scale): name = 'week' - step = timezone.timedelta(days=7) + step = timedelta(days=7) label_fmt = 'Semaine %W' @classmethod def get_chunk_start(cls, dt): dt_kfet = to_kfet_day(dt) - offset = timezone.timedelta(days=dt_kfet.weekday()) + offset = timedelta(days=dt_kfet.weekday()) return dt_kfet - offset -class MonthStatScale(StatScale): +class MonthScale(Scale): name = 'month' step = relativedelta(months=1) label_fmt = '%B' @@ -132,9 +134,9 @@ def stat_manifest(scales_def=None, scale_args=None, **url_params): def last_stats_manifest(scales_def=None, scale_args=None, **url_params): scales_def = [ - ('Derniers mois', MonthStatScale, ), - ('Dernières semaines', WeekStatScale, ), - ('Derniers jours', DayStatScale, ), + ('Derniers mois', MonthScale, ), + ('Dernières semaines', WeekScale, ), + ('Derniers jours', DayScale, ), ] if scale_args is None: scale_args = {} @@ -160,7 +162,7 @@ class ScaleMixin(object): scale_name = self.request.GET.get('scale', None) - cls = StatScale.by_name(scale_name) + cls = Scale.by_name(scale_name) if cls is None: scale = self.get_default_scale() else: @@ -174,7 +176,7 @@ class ScaleMixin(object): return context def get_default_scale(self): - return DayStatScale(n_steps=7, last=True) + return DayScale(n_steps=7, last=True) def chunkify_qs(self, qs, scale, field=None): if field is None: From dc07b072aba5808f9da497558d7c8a4224afd4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 4 Apr 2017 20:12:21 +0200 Subject: [PATCH 212/213] Flatten scale args in GET params of stats urls - get_scale_args method of ScaleMixin retrieves useful GET params for Scale object instanciation (by default from request.GET) - it takes into account the type of the scale arg - prefix used for GET param can be modified in stats_manifest funcs and ScaleMixin --- kfet/statistic.py | 87 +++++++++++++++++++++++++++++++++++------------ requirements.txt | 1 + 2 files changed, 67 insertions(+), 21 deletions(-) diff --git a/kfet/statistic.py b/kfet/statistic.py index 4ae17959..fe948f73 100644 --- a/kfet/statistic.py +++ b/kfet/statistic.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -import ast from datetime import date, datetime, time, timedelta from dateutil.relativedelta import relativedelta +from dateutil.parser import parse as dateutil_parse from django.utils import timezone from django.db.models import Sum @@ -114,25 +114,29 @@ class MonthScale(Scale): return to_kfet_day(dt).replace(day=1) -def stat_manifest(scales_def=None, scale_args=None, **url_params): +def stat_manifest(scales_def=None, scale_args=None, scale_prefix=None, + **other_url_params): + if scale_prefix is None: + scale_prefix = 'scale_' if scales_def is None: scales_def = [] if scale_args is None: scale_args = {} - return [ - dict( + manifest = [] + for label, cls in scales_def: + url_params = {scale_prefix+'name': cls.name} + url_params.update({scale_prefix+key: value + for key, value in scale_args.items()}) + url_params.update(other_url_params) + manifest.append(dict( label=label, - url_params=dict( - scale=cls.name, - scale_args=scale_args, - **url_params, - ), - ) - for label, cls in scales_def - ] + url_params=url_params, + )) + return manifest -def last_stats_manifest(scales_def=None, scale_args=None, **url_params): +def last_stats_manifest(scales_def=None, scale_args=None, scale_prefix=None, + **url_params): scales_def = [ ('Derniers mois', MonthScale, ), ('Dernières semaines', WeekScale, ), @@ -145,7 +149,7 @@ def last_stats_manifest(scales_def=None, scale_args=None, **url_params): n_steps=7, )) return stat_manifest(scales_def=scales_def, scale_args=scale_args, - **url_params) + scale_prefix=scale_prefix, **url_params) # Étant donné un queryset d'operations @@ -156,20 +160,61 @@ def tot_ventes(queryset): class ScaleMixin(object): + scale_args_prefix = 'scale_' + + def get_scale_args(self, params=None, prefix=None): + """Retrieve scale args from params. + + Should search the same args of Scale constructor. + + Args: + params (dict, optional): Scale args are searched in this. + Default to GET params of request. + prefix (str, optional): Appended at the begin of scale args names. + Default to `self.scale_args_prefix`. + + """ + if params is None: + params = self.request.GET + if prefix is None: + prefix = self.scale_args_prefix + + scale_args = {} + + name = params.get(prefix+'name', None) + if name is not None: + scale_args['name'] = name + + n_steps = params.get(prefix+'n_steps', None) + if n_steps is not None: + scale_args['n_steps'] = int(n_steps) + + begin = params.get(prefix+'begin', None) + if begin is not None: + scale_args['begin'] = dateutil_parse(begin) + + end = params.get(prefix+'send', None) + if end is not None: + scale_args['end'] = dateutil_parse(end) + + last = params.get(prefix+'last', None) + if last is not None: + scale_args['last'] = ( + last in ['true', 'True', '1'] and True or False) + + return scale_args def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) - scale_name = self.request.GET.get('scale', None) + scale_args = self.get_scale_args() + scale_name = scale_args.pop('name', None) + scale_cls = Scale.by_name(scale_name) - cls = Scale.by_name(scale_name) - if cls is None: + if scale_cls is None: scale = self.get_default_scale() else: - scale_args = self.request.GET.get('scale_args', {}) - if isinstance(scale_args, str): - scale_args = ast.literal_eval(scale_args) - scale = cls(**scale_args) + scale = scale_cls(**scale_args) self.scale = scale context['labels'] = scale.get_labels() diff --git a/requirements.txt b/requirements.txt index 06f6c46e..ce081588 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,3 +20,4 @@ django-widget-tweaks==1.4.1 git+https://git.eleves.ens.fr/cof-geek/django_custommail.git#egg=django_custommail ldap3 git+https://github.com/Aureplop/channels.git#egg=channels +python-dateutil From 85ba44c23172e086de68787b2c3d00007c016705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 4 Apr 2017 16:32:46 +0100 Subject: [PATCH 213/213] Tests the redirection using the appropriate method --- kfet/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kfet/tests.py b/kfet/tests.py index ffca7a44..991b2545 100644 --- a/kfet/tests.py +++ b/kfet/tests.py @@ -66,5 +66,5 @@ class TestStats(TestCase): for url in articles_urls: resp = client.get(url) self.assertEqual(200, resp.status_code) - resp2 = client2.get(url) - self.assertEqual(302, resp2.status_code) + resp2 = client2.get(url, follow=True) + self.assertRedirects(resp2, "/")