1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import random
- from django import forms
- from django.urls import reverse
- from django.utils.html import format_html, format_html_join
- from django.contrib import admin
- from .models import Group, Person
- from .forms import PersonAdminForm
- def random_color():
- r = lambda: random.randint(0,255)
- return '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
- @admin.register(Person)
- class PersonAdmin(admin.ModelAdmin):
- list_select_related = ('parent', 'group')
- list_display = ['name', 'get_partners', 'get_parent', 'birth_date', 'death_date', 'comment', 'color', 'group']
- list_editable = ['color']
- list_filter = ('group', 'birth_date')
- search_fields = ['name', 'birth_date', 'birth_town', 'death_date', 'death_town', 'comment']
- ordering = ('group','name')
- filter_horizontal = ('partners',)
- fields = ('name', 'parent', 'partners', 'children', 'birth_date', 'birth_town', 'death_date', 'death_town', 'comment', 'image', 'image_tag', 'color', 'group')
- readonly_fields = ('image_tag', 'children')
- def get_queryset(self, request):
- qs = super().get_queryset(request)
- return qs.prefetch_related('partners')
- def get_partners(self, obj):
- return format_html_join(', ', '<a href="{}">{}</a>', [(reverse("admin:stammbaum_person_change", args=[p.id]), p) for p in obj.partners.all()])
- get_partners.short_description = "Partner"
- def get_parent(self, obj):
- if obj.parent:
- return format_html('<a href="{}">{}</a>', reverse("admin:stammbaum_person_change", args=[obj.parent.id]), obj.parent)
- get_parent.short_description = "Eltern"
- def children(self, obj):
- return format_html_join(', ', '<a href="{}">{}</a>', [(reverse("admin:stammbaum_person_change", args=[p.id]), p) for p in Person.objects.filter(parent=obj)])
- def save_related(self, request, form, formsets, change):
- super(PersonAdmin, self).save_related(request, form, formsets, change)
- partners = form.instance.partners.all()
- if not form.instance.color and len(partners) > 0:
- color = random_color()
- for partner in partners:
- if partner.color:
- color = partner.color
- break
- form.instance.color = color
- form.instance.save()
-
- for partner in partners:
- print(partner)
- partner.color = form.instance.color
- partner.save()
- form = PersonAdminForm
- @admin.register(Group)
- class GroupAdmin(admin.ModelAdmin):
- list_display = ['name', 'color']
- list_editable = ['name', 'color']
- list_display_links = None
- ordering = ('name',)
|