admin.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. fields = ('name', 'parent', 'partners', 'birth_date', 'birth_town', 'death_date', 'death_town', 'comment', 'image', 'image_tag', 'color', 'group', )
  20. readonly_fields = ('image_tag',)
  21. def get_queryset(self, request):
  22. qs = super().get_queryset(request)
  23. return qs.prefetch_related('partners')
  24. def get_partners(self, obj):
  25. return format_html_join(', ', '<a href="{}">{}</a>', [(reverse("admin:stammbaum_person_change", args=[p.id]), p) for p in obj.partners.all()])
  26. get_partners.short_description = "Partner"
  27. def get_parent(self, obj):
  28. if obj.parent:
  29. return format_html('<a href="{}">{}</a>', reverse("admin:stammbaum_person_change", args=[obj.parent.id]), obj.parent)
  30. get_parent.short_description = "Eltern"
  31. def save_related(self, request, form, formsets, change):
  32. super(PersonAdmin, self).save_related(request, form, formsets, change)
  33. partners = form.instance.partners.all()
  34. if not form.instance.color and len(partners) > 0:
  35. color = random_color()
  36. for partner in partners:
  37. if partner.color:
  38. color = partner.color
  39. break
  40. form.instance.color = color
  41. form.instance.save()
  42. for partner in partners:
  43. print(partner)
  44. partner.color = form.instance.color
  45. partner.save()
  46. #form = PersonChangeForm
  47. @admin.register(Group)
  48. class GroupAdmin(admin.ModelAdmin):
  49. list_display = ['name', 'color']
  50. list_editable = ['name', 'color']
  51. list_display_links = None
  52. ordering = ('name',)