admin.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.shortcuts import render, get_object_or_404
  4. from django.contrib import admin
  5. from django.contrib import messages
  6. from django.contrib.auth.admin import UserAdmin
  7. from django.contrib.auth.models import Group
  8. from django.http import HttpResponseRedirect
  9. from django.conf.urls import url
  10. from django.db.models.query import QuerySet
  11. from django.core.urlresolvers import reverse
  12. from coin.members.models import Member, CryptoKey, LdapUser, MembershipFee
  13. from coin.members.membershipfee_filter import MembershipFeeFilter
  14. from coin.members.forms import MemberChangeForm, MemberCreationForm
  15. from coin.utils import delete_selected
  16. import autocomplete_light
  17. class CryptoKeyInline(admin.StackedInline):
  18. model = CryptoKey
  19. extra = 0
  20. class MembershipFeeInline(admin.TabularInline):
  21. model = MembershipFee
  22. extra = 0
  23. fields = ('start_date', 'end_date', 'amount', 'payment_method',
  24. 'reference', 'payment_date')
  25. class MemberAdmin(UserAdmin):
  26. list_display = ('id', 'status', 'username', 'first_name', 'last_name',
  27. 'nickname', 'organization_name', 'email',
  28. 'end_date_of_membership')
  29. list_display_links = ('id', 'username', 'first_name', 'last_name')
  30. list_filter = ('status', MembershipFeeFilter)
  31. search_fields = ['username', 'first_name', 'last_name', 'email']
  32. ordering = ('status', 'username')
  33. actions = [delete_selected, 'set_as_member', 'set_as_non_member',
  34. 'bulk_send_welcome_email', 'bulk_send_call_for_membership_fee_email']
  35. form = MemberChangeForm
  36. add_form = MemberCreationForm
  37. fieldsets = (
  38. ('Adhérent', {'fields': (
  39. ('status', 'resign_date'),
  40. 'type',
  41. ('first_name', 'last_name', 'nickname'),
  42. 'organization_name',
  43. 'comments')}),
  44. ('Coordonnées', {'fields': (
  45. 'email',
  46. ('home_phone_number', 'mobile_phone_number'),
  47. 'address',
  48. ('postal_code', 'city', 'country'))}),
  49. ('Authentification', {'fields': (
  50. ('username', 'password'))}),
  51. ('Permissions', {'fields': (
  52. ('is_active', 'is_staff', 'is_superuser'))}),
  53. (None, {'fields': ('date_last_call_for_membership_fees_email',)})
  54. )
  55. add_fieldsets = (
  56. ('Adhérent', {'fields': (
  57. 'status',
  58. 'type',
  59. ('first_name', 'last_name', 'nickname'),
  60. 'organization_name',
  61. 'comments')}),
  62. ('Coordonnées', {'fields': (
  63. 'email',
  64. ('home_phone_number', 'mobile_phone_number'),
  65. 'address',
  66. ('postal_code', 'city', 'country'))}),
  67. ('Authentification', {'fields': (
  68. ('username', 'password'),)}),
  69. ('Permissions', {'fields': (
  70. ('is_active', 'is_staff', 'is_superuser', 'date_joined'))})
  71. )
  72. radio_fields = {"type": admin.HORIZONTAL}
  73. save_on_top = True
  74. inlines = [CryptoKeyInline, MembershipFeeInline]
  75. def get_readonly_fields(self, request, obj=None):
  76. if obj:
  77. # Remove help_text for readonly field (can't do that in the Form
  78. # django seems to user help_text from model for readonly fields)
  79. username_field = [
  80. f for f in obj._meta.fields if f.name == 'username']
  81. username_field[0].help_text = ''
  82. return ['username', ]
  83. else:
  84. return []
  85. def set_as_member(self, request, queryset):
  86. rows_updated = queryset.update(status='member')
  87. self.message_user(
  88. request,
  89. '%d membre(s) définis comme adhérent(s).' % rows_updated)
  90. set_as_member.short_description = 'Définir comme adhérent'
  91. def set_as_non_member(self, request, queryset):
  92. rows_updated = queryset.update(status='not_member')
  93. self.message_user(
  94. request,
  95. '%d membre(s) définis comme non adhérent(s).' % rows_updated)
  96. set_as_non_member.short_description = "Définir comme non adhérent"
  97. def get_urls(self):
  98. """Custom admin urls"""
  99. urls = super(MemberAdmin, self).get_urls()
  100. my_urls = [
  101. url(r'^send_welcome_email/(?P<id>\d+)$',
  102. self.admin_site.admin_view(self.send_welcome_email),
  103. name='send_welcome_email'),
  104. ]
  105. return my_urls + urls
  106. def send_welcome_email(self, request, id, return_httpredirect=True):
  107. """
  108. Vue appelée lorsque l'admin souhaite envoyer l'email de bienvenue à un
  109. membre.
  110. """
  111. # TODO : Add better perm here
  112. if request.user.is_superuser:
  113. member = get_object_or_404(Member, pk=id)
  114. member.send_welcome_email()
  115. messages.success(request,
  116. 'Le courriel de bienvenue a été envoyé à %s' % member.email)
  117. else:
  118. messages.error(
  119. request, 'Vous n\'avez pas l\'autorisation d\'envoyer des '
  120. 'courriels de bienvenue.')
  121. if return_httpredirect:
  122. return HttpResponseRedirect(reverse('admin:members_member_changelist'))
  123. def bulk_send_welcome_email(self, request, queryset):
  124. """
  125. Action appelée lorsque l'admin souhaite envoyer un lot d'email de bienvenue
  126. depuis une sélection de membre dans la vue liste de l'admin
  127. """
  128. for member in queryset.all():
  129. self.send_welcome_email(
  130. request, member.id, return_httpredirect=False)
  131. messages.success(request,
  132. 'Le courriel de bienvenue a été envoyé à %d membre(s).' % queryset.count())
  133. bulk_send_welcome_email.short_description = "Envoyer le courriel de bienvenue"
  134. def bulk_send_call_for_membership_fee_email(self, request, queryset):
  135. # TODO : Add better perm here
  136. if not request.user.is_superuser:
  137. messages.error(
  138. request, 'Vous n\'avez pas l\'autorisation d\'envoyer des '
  139. 'courriels de relance.')
  140. return
  141. cpt_success = 0
  142. for member in queryset.all():
  143. if member.send_call_for_membership_fees_email():
  144. cpt_success += 1
  145. else:
  146. messages.warning(request,
  147. "Le courriel de relance de cotisation n\'a pas "
  148. "été envoyé à {member} ({email}) car il a déjà "
  149. "reçu une relance le {last_call_date}"\
  150. .format(member=member,
  151. email=member.email,
  152. last_call_date=member.date_last_call_for_membership_fees_email))
  153. if queryset.count() == 1 and cpt_success == 1:
  154. member = queryset.first()
  155. messages.success(request,
  156. "Le courriel de relance de cotisation a été "
  157. "envoyé à {member} ({email})"\
  158. .format(member=member, email=member.email))
  159. elif cpt_success>1:
  160. messages.success(request,
  161. "Le courriel de relance de cotisation a été "
  162. "envoyé à {cpt} membres"\
  163. .format(cpt=cpt_success))
  164. bulk_send_call_for_membership_fee_email.short_description = 'Envoyer le courriel de relance de cotisation'
  165. class MembershipFeeAdmin(admin.ModelAdmin):
  166. list_display = ('member', 'end_date', 'amount', 'payment_method',
  167. 'payment_date')
  168. form = autocomplete_light.modelform_factory(MembershipFee, fields='__all__')
  169. admin.site.register(Member, MemberAdmin)
  170. admin.site.register(MembershipFee, MembershipFeeAdmin)
  171. admin.site.unregister(Group)
  172. # admin.site.register(LdapUser, LdapUserAdmin)