from django.contrib import admin from django.contrib.contenttypes.admin import GenericStackedInline, GenericTabularInline from django.db.models import Q from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import User as AuthUser from django.contrib.auth.admin import UserAdmin as AuthUserAdmin from django.http import HttpResponseRedirect from django.utils.html import format_html from django.core.urlresolvers import reverse from .forms import UserCreationForm from .models import User, Corporation, Adhesion from accounts.models import Profile from services.models import Service ### Inlines class ProfileInline(admin.StackedInline): model = Profile def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False class AdhesionInline(admin.StackedInline): model = Adhesion fields = ('id', 'active', 'notes',) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False class ServiceInline(admin.StackedInline): model = Service extra = 0 show_change_link = True fields = ('service_type', 'label',) readonly_fields = ('service_type', 'label',) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False ### Filters class AdherentTypeFilter(admin.SimpleListFilter): title = 'type d’adhérent' parameter_name = 'type' def lookups(self, request, model_admin): return ( ('physique', 'Personne physique'), ('morale', 'Personne morale'), ) def queryset(self, request, queryset): if self.value() == 'physique': return queryset.filter(user__isnull=False) if self.value() == 'morale': return queryset.filter(corporation__isnull=False) ### Mixins class AdtSearchMixin: adhesion_search_field = 'id' def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) if search_term[:3] == 'ADT': try: adh_id = int(search_term[3:]) except ValueError: pass else: queryset |= self.model.objects.filter(**{self.adhesion_search_field: adh_id}) return queryset, use_distinct ### ModelAdmin class UserAdmin(AdtSearchMixin, AuthUserAdmin): list_display = AuthUserAdmin.list_display + ('get_adhesion_link',) list_select_related = ('profile', 'adhesion',) ordering = ('adhesion__id',) search_fields = AuthUserAdmin.search_fields + ('=adhesion__id', 'adhesion__notes',) readonly_fields = ('get_adhesion_link',) adhesion_search_field = 'adhesion__id' def get_adhesion_id(self, user): return user.adhesion get_adhesion_id.short_description = 'Numéro d’adhérent' get_adhesion_id.admin_order_field = 'adhesion__id' get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link() get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description def get_inline_instances(self, request, obj=None): if obj: inlines = (ProfileInline, AdhesionInline,) else: inlines = () return [inline(self.model, self.admin_site) for inline in inlines] def get_form(self, request, obj=None, **kwargs): if obj: return super().get_form(request, obj, **kwargs) else: return UserCreationForm def get_fieldsets(self, request, obj=None): if obj: fieldsets = ( (AuthUserAdmin.fieldsets[1][0], { 'fields': ('get_adhesion_link',) + AuthUserAdmin.fieldsets[1][1]['fields'], }), ('Nom d’utilisateur et mot de passe', { 'classes': ('collapse',), 'fields': AuthUserAdmin.fieldsets[0][1]['fields'], }), (AuthUserAdmin.fieldsets[2][0], { 'classes': ('collapse',), 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups',), # removing user_permissions }), (AuthUserAdmin.fieldsets[3][0], { 'classes': ('collapse',), 'fields': AuthUserAdmin.fieldsets[3][1]['fields'], }), ) else: fieldsets = ( (None, { 'fields': ('first_name', 'last_name', 'username', 'email',), }), ) return fieldsets def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions def has_delete_permission(self, request, obj=None): return obj and not obj.adhesion class CorporationAdmin(AdtSearchMixin, admin.ModelAdmin): list_display = ('social_reason', 'get_adhesion_link',) list_select_related = ('adhesion',) ordering = ('adhesion__id',) search_fields = ('social_reason', 'description', 'email', 'phone_number', 'address', 'notes', 'adhesion__id', 'adhesion__notes',) readonly_fields = ('get_adhesion_link',) filter_horizontal = ('members',) adhesion_search_field = 'adhesion__id' def get_adhesion_id(self, corp): return corp.adhesion get_adhesion_id.short_description = 'Numéro d’adhérent' get_adhesion_id.admin_order_field = 'adhesion__id' get_adhesion_link = lambda self, corporation: corporation.adhesion.get_adhesion_link() get_adhesion_link.short_description = Adhesion.get_adhesion_link.short_description def get_inline_instances(self, request, obj=None): if obj: inlines = (AdhesionInline,) else: inlines = () return [inline(self.model, self.admin_site) for inline in inlines] def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions def get_fieldsets(self, request, obj=None): fieldsets = super().get_fieldsets(request, obj) # put adhesion id on top if obj: fields = fieldsets[0][1]['fields'] fields.remove('get_adhesion_link') fieldsets = ( (None, { 'fields': ['get_adhesion_link'] + fields, }), ) return fieldsets def has_delete_permission(self, request, obj=None): return False class AdhesionAdmin(AdtSearchMixin, admin.ModelAdmin): list_display = ('get_id', 'type', 'get_adherent_link',) list_filter = (AdherentTypeFilter, 'active',) list_select_related = ('user', 'user__profile', 'corporation',) fields = ('id', 'type', 'get_adherent_link', 'get_membership_link',) readonly_fields = ('id', 'type', 'get_adherent_link', 'get_membership_link',) search_fields = ('=id', 'notes',) \ + tuple(['user__%s' % f for f in UserAdmin.search_fields if '__' not in f]) \ + tuple(['corporation__%s' % f for f in CorporationAdmin.search_fields if '__' not in f]) inlines = (ServiceInline,) def get_id(self, obj): return 'ADT%d' % obj.id get_id.short_description = 'Numéro d’adhérent' get_id.admin_order_field = 'id' def get_membership_link(self, obj): return format_html(u'{}', obj.membership.get_absolute_url(), obj.membership) get_membership_link.short_description = 'Cotisation' def get_actions(self, request): actions = super().get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False admin.site.unregister(AuthUser) admin.site.register(User, UserAdmin) admin.site.register(Corporation, CorporationAdmin) admin.site.register(Adhesion, AdhesionAdmin)