# coding: utf-8 from django.core.mail import send_mail from django.contrib.contenttypes.models import ContentType from django.contrib import admin from django.db.models import Sum, Count from bda.models import Spectacle, Salle, Participant, ChoixSpectacle, Attribution class ChoixSpectacleInline(admin.TabularInline): model = ChoixSpectacle sortable_field_name = "priority" class AttributionInline(admin.TabularInline): model = Attribution class ParticipantAdmin(admin.ModelAdmin): #inlines = [ChoixSpectacleInline] inlines = [AttributionInline] def queryset(self, request): return Participant.objects.annotate(nb_places = Count('attributions'), total = Sum('attributions__price')) def nb_places(self, obj): return obj.nb_places nb_places.admin_order_field = "nb_places" nb_places.short_description = "Nombre de places" def total(self, obj): tot = obj.total if tot: return u"%.02f €" % tot else: return u"0 €" total.admin_order_field = "total" total.short_description = "Total à payer" list_display = ("user", "nb_places", "total", "paid", "paymenttype") list_filter = ("paid",) search_fields = ('user__username', 'user__first_name', 'user__last_name') actions = ['send_attribs',] actions_on_bottom = True list_per_page = 400 def send_choices(self, request, queryset): for member in queryset.all(): choices = member.choixspectacle_set.order_by('priority').all() if len(choices) == 0: continue mail = u"""Cher(e) %s, Voici tes choix de spectacles tels que notre système les a enregistrés :\n\n""" % member.user.get_full_name() next_rank = 1 member_shows = {} for choice in choices: if choice.spectacle in member_shows: continue else: member_shows[choice.spectacle] = True extra = "" if choice.double: extra += u" ; deux places" if choice.autoquit: extra += u" ; désistement automatique" mail += u"- Choix %d : %s%s\n" % (next_rank, choice.spectacle, extra) next_rank += 1 mail += u"""\nSi cette liste est incorrecte, merci de nous contacter au plus vite (avant samedi 6 octobre 18h). Artistiquement, Le BdA""" send_mail ("Choix de spectacles (BdA du COF)", mail, "bda@ens.fr", [member.user.email], fail_silently = True) count = len(queryset.all()) if count == 1: message_bit = u"1 membre a" plural = "" else: message_bit = u"%d membres ont" % count plural = "s" self.message_user(request, u"%s été informé%s avec succès." % (message_bit, plural)) send_choices.short_description = u"Envoyer les choix par mail" def send_attribs(self, request, queryset): for member in queryset.all(): attribs = member.attributions.all() if len(attribs) == 0: continue mail = u"""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 à partir du jeudi 10 octobre et AVANT le mercredi 23 octobre, 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. *Mode de retrait des places* Au moment du paiement, une enveloppe vous sera remise, contenant les places pour l'Opéra de Paris, pour les premiers spectacles de la Comédie française, certains spectacles du Châtelet et du Théâtre de la Ville. Pour les concerts Radio France, le Théâtre des Champs-Élysées, le théâtre du Rond-Point, le théâtre de la Colline, le théâtre de l'Athénée, l'IRCAM, la Cité de la musique et le 104, le Studio-Théâtre de la Comédie française, les places seront nominatives et à retirer au théâtre le soir de la représentation au moins une demi-heure avant le début du spectacle. Pour le théâtre de l'Odéon, la salle Richelieu le théâtre du Vieux colombier de la Comédie française, certains spectacles du théâtre de la Ville et du théâtre de Châtelet ainsi que pour le théâtre de Chaillot, les places seront distribuées environ une semaine avant la représentation (un mail vous en avertira). 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 (Chloé, Emilie, Jaime, Maxime, Olivier) """ attribs_text = "" name = member.user.get_full_name() for attrib in attribs: attribs_text += u"- 1 place pour %s\n" % attrib mail = mail % (name, attribs_text) send_mail ("Résultats du tirage au sort", mail, "bda@ens.fr", [member.user.email], fail_silently = True) count = len(queryset.all()) if count == 1: message_bit = u"1 membre a" plural = "" else: message_bit = u"%d membres ont" % count plural = "s" self.message_user(request, u"%s été informé%s avec succès." % (message_bit, plural)) send_attribs.short_description = u"Envoyer les résultats par mail" class AttributionAdmin(admin.ModelAdmin): def paid(self, obj): return obj.participant.paid paid.short_description = 'A payé' paid.boolean = True list_display = ("id", "spectacle", "participant", "given", "paid") search_fields = ('spectacle__title', 'participant__user__username', 'participant__user__first_name', 'participant__user__last_name') import autocomplete_light class ChoixSpectacleAdmin(admin.ModelAdmin): form = autocomplete_light.modelform_factory(ChoixSpectacle) list_display = ("participant", "spectacle", "priority", "double", "autoquit") list_filter = ("double", "autoquit") search_fields = ('participant__user__username', 'participant__user__first_name', 'participant__user__last_name') class SpectacleAdmin(admin.ModelAdmin): model = Spectacle list_display = ("title", "date", "location", "slots", "price") list_filter = ("location",) search_fields = ("title", "location__name") admin.site.register(Spectacle, SpectacleAdmin) admin.site.register(Salle) admin.site.register(Participant, ParticipantAdmin) admin.site.register(Attribution, AttributionAdmin) admin.site.register(ChoixSpectacle, ChoixSpectacleAdmin)