kpsul/bda/admin.py

144 lines
5.7 KiB
Python

# 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
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 nb_places(self, obj):
return len(obj.attribution_set.all())
nb_places.short_description = "Nombre de places"
def total(self, obj):
tot = obj.attributions.aggregate(total = Sum('price'))['total']
if tot: return u"%.02f" % tot
else: return u"0 €"
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@clipper.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*
Ces spectacles sont à régler avant le vendredi 19 Octobre, pendant les
heures de permanences du COF (tous les jours de la semaine entre 12h et
14h, et entre 18h et 20h). Des facilités de paiement sont bien évidemment
possibles (encaissement échelonné des chèques).
*Mode de retrait des places*
Pour l'Opéra de Paris, le théâtre de la Colline et le théâtre du Châtelet,
les places sont à retirer au COF le jour du paiement.
Pour les concerts Radio France, le théâtre des Champs-Élysées et la Salle
Pleyel, 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 Comédie Française, le théâtre de la Ville,
le théâtre de Chaillot et l'IRCAM, les places seront distribuées dans vos
casiers environ une semaine avant la représentation (un mail vous en
avertira).
Culturellement vôtre,
--
Le BdA"""
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 ("Places de spectacle (BdA du COF)", mail,
"bda@clipper.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')
admin.site.register(Spectacle)
admin.site.register(Salle)
admin.site.register(Participant, ParticipantAdmin)
admin.site.register(Attribution, AttributionAdmin)
admin.site.register(ChoixSpectacle, ChoixSpectacleAdmin)