admin.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import random
  2. from django.urls import reverse
  3. from django.utils.html import format_html, format_html_join
  4. from django.contrib import admin
  5. from .models import *
  6. from .forms import PersonChangeForm
  7. def random_color():
  8. r = lambda: random.randint(0,255)
  9. return '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
  10. @admin.register(Person)
  11. class PersonAdmin(admin.ModelAdmin):
  12. list_select_related = ('parent', 'group')
  13. list_display = ['name', 'get_partners', 'get_parent', 'birth_date', 'death_date', 'comment', 'color', 'group']
  14. list_editable = ['color']#, 'group']
  15. list_filter = ('group', 'birth_date')
  16. search_fields = ['name', 'parent__name', 'partners__name']
  17. ordering = ('group','name')
  18. filter_horizontal = ('partners',)
  19. def get_queryset(self, request):
  20. qs = super().get_queryset(request)
  21. return qs.prefetch_related('partners')
  22. def get_partners(self, obj):
  23. return format_html_join(', ', '<a href="{}">{}</a>', [(reverse("admin:stammbaum_person_change", args=[p.id]), p) for p in obj.partners.all()])
  24. get_partners.short_description = "Partner"
  25. def get_parent(self, obj):
  26. if obj.parent:
  27. return format_html('<a href="{}">{}</a>', reverse("admin:stammbaum_person_change", args=[obj.parent.id]), obj.parent)
  28. get_parent.short_description = "Eltern"
  29. def save_related(self, request, form, formsets, change):
  30. super(PersonAdmin, self).save_related(request, form, formsets, change)
  31. partners = form.instance.partners.all()
  32. if not form.instance.color and len(partners) > 0:
  33. color = random_color()
  34. for partner in partners:
  35. if partner.color:
  36. color = partner.color
  37. break
  38. form.instance.color = color
  39. form.instance.save()
  40. for partner in partners:
  41. print(partner)
  42. partner.color = form.instance.color
  43. partner.save()
  44. #form = PersonChangeForm
  45. @admin.register(Group)
  46. class GroupAdmin(admin.ModelAdmin):
  47. list_display = ['name', 'color']
  48. list_editable = ['name', 'color']
  49. list_display_links = None
  50. ordering = ('name',)