admin.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. from django.contrib import admin
  2. from django.contrib.contenttypes.admin import GenericStackedInline, GenericTabularInline
  3. from django.db.models import Q
  4. from django.contrib.contenttypes.models import ContentType
  5. from django.contrib.auth.models import User as AuthUser
  6. from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
  7. from django.http import HttpResponseRedirect
  8. from django.utils.html import format_html, mark_safe
  9. from django.core.urlresolvers import reverse
  10. from .forms import UserCreationForm
  11. from .models import User, Corporation, Adhesion
  12. from accounts.models import Profile
  13. from services.models import Service
  14. ### Inlines
  15. class ProfileInline(admin.StackedInline):
  16. model = Profile
  17. def has_add_permission(self, request):
  18. return False
  19. def has_delete_permission(self, request, obj=None):
  20. return False
  21. class AdhesionInline(admin.StackedInline):
  22. model = Adhesion
  23. fields = ('id', 'active', 'notes',)
  24. def has_add_permission(self, request):
  25. return False
  26. def has_delete_permission(self, request, obj=None):
  27. return False
  28. class ServiceInline(admin.StackedInline):
  29. model = Service
  30. extra = 0
  31. show_change_link = True
  32. fields = ('service_type', 'label',)
  33. readonly_fields = ('service_type', 'label',)
  34. def has_add_permission(self, request):
  35. return False
  36. def has_delete_permission(self, request, obj=None):
  37. return False
  38. ### Filters
  39. class AdherentTypeFilter(admin.SimpleListFilter):
  40. title = 'type d’adhérent'
  41. parameter_name = 'type'
  42. def lookups(self, request, model_admin):
  43. return (
  44. ('physique', 'Personne physique'),
  45. ('morale', 'Personne morale'),
  46. )
  47. def queryset(self, request, queryset):
  48. if self.value() == 'physique':
  49. return queryset.filter(user__isnull=False)
  50. if self.value() == 'morale':
  51. return queryset.filter(corporation__isnull=False)
  52. ### Mixins
  53. class AdtSearchMixin:
  54. adhesion_search_field = 'id'
  55. def get_search_results(self, request, queryset, search_term):
  56. queryset, use_distinct = super().get_search_results(request, queryset, search_term)
  57. if search_term[:3] == 'ADT':
  58. try:
  59. adh_id = int(search_term[3:])
  60. except ValueError:
  61. pass
  62. else:
  63. queryset |= self.model.objects.filter(**{self.adhesion_search_field: adh_id})
  64. return queryset, use_distinct
  65. ### ModelAdmin
  66. class UserAdmin(AdtSearchMixin, AuthUserAdmin):
  67. list_display = AuthUserAdmin.list_display + ('get_adhesion_link',)
  68. list_select_related = ('profile', 'adhesion',)
  69. ordering = ('adhesion__id',)
  70. search_fields = AuthUserAdmin.search_fields \
  71. + ('profile__phone_number', 'profile__address', 'profile__notes',) \
  72. + ('=adhesion__id', 'adhesion__notes',)
  73. readonly_fields = ('get_adhesion_link',)
  74. adhesion_search_field = 'adhesion__id'
  75. def get_adhesion_id(self, user):
  76. return user.adhesion
  77. get_adhesion_id.short_description = 'Numéro d’adhérent'
  78. get_adhesion_id.admin_order_field = 'adhesion__id'
  79. get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link()
  80. get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description
  81. def get_inline_instances(self, request, obj=None):
  82. if obj:
  83. inlines = (ProfileInline, AdhesionInline,)
  84. else:
  85. inlines = ()
  86. return [inline(self.model, self.admin_site) for inline in inlines]
  87. def get_form(self, request, obj=None, **kwargs):
  88. if obj:
  89. return super().get_form(request, obj, **kwargs)
  90. else:
  91. return UserCreationForm
  92. def get_fieldsets(self, request, obj=None):
  93. if obj:
  94. fieldsets = (
  95. (AuthUserAdmin.fieldsets[1][0], {
  96. 'fields': ('get_adhesion_link',) + AuthUserAdmin.fieldsets[1][1]['fields'],
  97. }),
  98. ('Nom d’utilisateur et mot de passe', {
  99. 'classes': ('collapse',),
  100. 'fields': AuthUserAdmin.fieldsets[0][1]['fields'],
  101. }),
  102. (AuthUserAdmin.fieldsets[2][0], {
  103. 'classes': ('collapse',),
  104. 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups',), # removing user_permissions
  105. }),
  106. (AuthUserAdmin.fieldsets[3][0], {
  107. 'classes': ('collapse',),
  108. 'fields': AuthUserAdmin.fieldsets[3][1]['fields'],
  109. }),
  110. )
  111. else:
  112. fieldsets = (
  113. (None, {
  114. 'fields': ('first_name', 'last_name', 'username', 'email',),
  115. }),
  116. )
  117. return fieldsets
  118. def get_actions(self, request):
  119. actions = super().get_actions(request)
  120. if 'delete_selected' in actions:
  121. del actions['delete_selected']
  122. return actions
  123. def has_delete_permission(self, request, obj=None):
  124. return obj and not obj.adhesion
  125. class CorporationAdmin(AdtSearchMixin, admin.ModelAdmin):
  126. list_display = ('social_reason', 'get_adhesion_link',)
  127. list_select_related = ('adhesion',)
  128. ordering = ('adhesion__id',)
  129. search_fields = ('social_reason', 'description', 'email', 'phone_number', 'address', 'notes', 'adhesion__id', 'adhesion__notes',)
  130. readonly_fields = ('get_adhesion_link',)
  131. filter_horizontal = ('members',)
  132. adhesion_search_field = 'adhesion__id'
  133. def get_adhesion_id(self, corp):
  134. return corp.adhesion
  135. get_adhesion_id.short_description = 'Numéro d’adhérent'
  136. get_adhesion_id.admin_order_field = 'adhesion__id'
  137. get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link()
  138. get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description
  139. def get_inline_instances(self, request, obj=None):
  140. if obj:
  141. inlines = (AdhesionInline,)
  142. else:
  143. inlines = ()
  144. return [inline(self.model, self.admin_site) for inline in inlines]
  145. def get_actions(self, request):
  146. actions = super().get_actions(request)
  147. if 'delete_selected' in actions:
  148. del actions['delete_selected']
  149. return actions
  150. def get_fieldsets(self, request, obj=None):
  151. fieldsets = super().get_fieldsets(request, obj)
  152. # put adhesion id on top
  153. if obj:
  154. fields = fieldsets[0][1]['fields']
  155. fields.remove('get_adhesion_link')
  156. fieldsets = (
  157. (None, {
  158. 'fields': ['get_adhesion_link'] + fields,
  159. }),
  160. )
  161. return fieldsets
  162. def has_delete_permission(self, request, obj=None):
  163. return False
  164. class AdhesionAdmin(AdtSearchMixin, admin.ModelAdmin):
  165. list_display = ('get_id', 'type', 'get_adherent_link',)
  166. list_filter = (AdherentTypeFilter, 'active',)
  167. list_select_related = ('user', 'user__profile', 'corporation',)
  168. fields = ('id', 'type', 'get_adherent_link', 'get_membership_link', 'get_antennas_link',)
  169. readonly_fields = ('id', 'type', 'get_adherent_link', 'get_membership_link', 'get_antennas_link',)
  170. search_fields = ('=id', 'notes',) \
  171. + tuple(['user__%s' % f for f in UserAdmin.search_fields if 'adhesion' not in f]) \
  172. + tuple(['corporation__%s' % f for f in CorporationAdmin.search_fields if 'adhesion' not in f])
  173. inlines = (ServiceInline,)
  174. def get_id(self, obj):
  175. return 'ADT%d' % obj.id
  176. get_id.short_description = 'Numéro d’adhérent'
  177. get_id.admin_order_field = 'id'
  178. def get_membership_link(self, obj):
  179. return format_html(u'<a href="{}">{}</a>', obj.membership.get_absolute_url(), obj.membership)
  180. get_membership_link.short_description = 'Cotisation'
  181. def get_antennas_link(self, obj):
  182. return mark_safe('<br />'.join(map(lambda antenna: antenna.get_absolute_link(), obj.antenna_set.all())))
  183. get_antennas_link.short_description = 'Antennes'
  184. def get_actions(self, request):
  185. actions = super().get_actions(request)
  186. if 'delete_selected' in actions:
  187. del actions['delete_selected']
  188. return actions
  189. def has_add_permission(self, request):
  190. return False
  191. def has_delete_permission(self, request, obj=None):
  192. return False
  193. admin.site.unregister(AuthUser)
  194. admin.site.register(User, UserAdmin)
  195. admin.site.register(Corporation, CorporationAdmin)
  196. admin.site.register(Adhesion, AdhesionAdmin)