forked from DGNum/gestioCOF
181 lines
7.1 KiB
Python
181 lines
7.1 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, Count
|
||
|
from bda3.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:
|
||
|
mail = u"""Cher-e %s,
|
||
|
|
||
|
Tu t'es inscrit-e pour le troisième tirage au sort du BdA. Nous avons le regret
|
||
|
de t'annoncer que tu n'as pas obtenu de place.
|
||
|
|
||
|
Nous sommes bien conscients que le nombre de places mises en jeu était
|
||
|
très restreint, mais les premier et deuxième tirages au sort comprenaient
|
||
|
déjà un nombre exceptionnel de places, et nous dépendons des limites
|
||
|
fixées par les théâtres partenaires pour l'obtention de places à tarif réduit.
|
||
|
|
||
|
Le système de revente des places via les mails BdA-revente reste disponible,
|
||
|
alors surveille tes mails.
|
||
|
|
||
|
En vous souhaitant une bonne fin de journée,
|
||
|
--
|
||
|
Le Bureau des Arts
|
||
|
|
||
|
"""
|
||
|
name = member.user.get_full_name()
|
||
|
mail = mail % name
|
||
|
else:
|
||
|
mail = u"""Cher-e %s,
|
||
|
|
||
|
Tu t'es inscrit-e pour le troisième tirage au sort du BdA. Tu as été
|
||
|
sélectionné-e pour les spectacles suivants :
|
||
|
|
||
|
%s
|
||
|
|
||
|
Nous sommes bien conscients que le nombre de places mises en jeu était
|
||
|
très restreint, mais les premier et deuxième tirages au sort comprenaient
|
||
|
déjà un nombre exceptionnel de places, et nous dépendons des limites fixées
|
||
|
par les théâtres partenaires pour l'obtention de places à tarif réduit.
|
||
|
|
||
|
*Paiement*
|
||
|
L'intégralité de ces places de spectacles est à régler à partir du lundi
|
||
|
11 avril et AVANT le 16 avril, au bureau du COF pendant les
|
||
|
heures de permanences (du lundi au vendredi entre 12h et 14h, et entre 18h
|
||
|
et 20h). Si vous n'êtes pas disponible cette semaine, prévenez-nous par mail.
|
||
|
Attention : au-delà de cette date, les places pourront être remises en jeu.
|
||
|
|
||
|
*Mode de retrait des places*
|
||
|
Au moment du paiement, les places pour les spectacles de la Comédie-Française
|
||
|
et pour la Philarmonie vous seront remises.
|
||
|
|
||
|
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 reste disponible,
|
||
|
directement sur votre compte GestioCOF.
|
||
|
|
||
|
En vous souhaitant de très beaux spectacles,
|
||
|
--
|
||
|
Le Bureau des Arts
|
||
|
|
||
|
"""
|
||
|
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 ("[BdA] 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)
|