admin.py 8.5 KB

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