Lepsi Delani Orgu #35
2 changed files with 77 additions and 4 deletions
|
@ -1,7 +1,9 @@
|
|||
from django.contrib import admin
|
||||
from django.contrib.auth.models import Group
|
||||
from django_reverse_admin import ReverseModelAdmin
|
||||
from django.contrib.messages import WARNING, ERROR, SUCCESS
|
||||
import seminar.models as m
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
@admin.register(m.Osoba)
|
||||
|
@ -20,16 +22,24 @@ class OsobaAdmin(admin.ModelAdmin):
|
|||
|
||||
def udelej_orgem(self,request,queryset):
|
||||
org_group = Group.objects.get(name='org')
|
||||
ledoian marked this conversation as resolved
|
||||
print(queryset)
|
||||
uspesne_vytvoreni_orgove = 0
|
||||
for o in queryset:
|
||||
if m.Organizator.objects.filter(osoba=o).exists():
|
||||
# Ref: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user
|
||||
ledoian
commented
Tady to taky může spadnout. Teda, asi je správně, že to spadne, ale mělo by to padat řízeně. (Je potřeba nastudovat, jak z těchto funkcí vracet použitelné chyby.) Tady to taky může spadnout. Teda, asi je správně, že to spadne, ale mělo by to padat řízeně. (Je potřeba nastudovat, jak z těchto funkcí vracet použitelné chyby.)
ledoian
commented
Už by to mělo vracet fancy hlášky, snad. Už by to mělo vracet fancy hlášky, snad.
|
||||
self.message_user(request, f"Osoba {o} už je org, přeskakuji.", level=WARNING)
|
||||
continue
|
||||
user = o.user
|
||||
print(user)
|
||||
if user is None:
|
||||
self.message_user(request, f"Osoba {o} nemá uživatele! Přeskakuji.", level=ERROR)
|
||||
ledoian marked this conversation as resolved
Outdated
ledoian
commented
s/j v/j z v/ s/j v/j z v/
|
||||
continue
|
||||
user.groups.add(org_group)
|
||||
user.is_staff = True
|
||||
user.save()
|
||||
org = m.Organizator.objects.create(osoba=o)
|
||||
org = m.Organizator.objects.create(osoba=o, organizuje_od=datetime.now())
|
||||
org.save()
|
||||
udelej_orgem.short_description = "Udělej vybraných osob organizátory"
|
||||
uspesne_vytvoreni_orgove += 1
|
||||
self.message_user(request, f'Úspěšně vytvořeno {uspesne_vytvoreni_orgove} orgů.', level=SUCCESS)
|
||||
udelej_orgem.short_description = "Udělej z vybraných osob organizátory"
|
||||
|
||||
class OsobaInline(admin.TabularInline):
|
||||
model = m.Osoba
|
||||
|
|
63
personalni/tests.py
Normal file
63
personalni/tests.py
Normal file
|
@ -0,0 +1,63 @@
|
|||
from django.test import TestCase, RequestFactory
|
||||
|
||||
from django.contrib.auth.models import User, Group
|
||||
from django.contrib.admin.sites import AdminSite
|
||||
from personalni.admin import OsobaAdmin
|
||||
# Tohle bude peklo, až jednou ty modely fakt rozstřelíme… Možná vyrobit various.all_models, které půjdou importovat jako m? :-)
|
||||
import seminar.models as m
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class DelaniOrguTest(TestCase):
|
||||
def setUp(self):
|
||||
# Admin musí mít instanci
|
||||
# Ref: https://www.argpar.se/posts/programming/testing-django-admin/
|
||||
adm_site = AdminSite()
|
||||
self.admin = OsobaAdmin(m.Osoba, adm_site)
|
||||
|
||||
from django.contrib.messages.storage.cookie import CookieStorage
|
||||
self.request = RequestFactory().get('/admin')
|
||||
self.request._messages = CookieStorage(self.request)
|
||||
|
||||
self.org_group = Group.objects.get(name='org')
|
||||
|
||||
novy_user = User.objects.create(username='osoba')
|
||||
self.nova_osoba = m.Osoba.objects.create(
|
||||
jmeno='Milada',
|
||||
prijmeni='Von Kolej',
|
||||
user = novy_user,
|
||||
# Snad nic dalšího nepotřebujeme, kdyžtak se doplní…
|
||||
)
|
||||
stary_user = User.objects.create(username='stary_user')
|
||||
stara_osoba = m.Osoba.objects.create(user=stary_user)
|
||||
self.stary_org = m.Organizator.objects.create(osoba=stara_osoba)
|
||||
|
||||
def test_pridani_orga(self):
|
||||
# Nejdřív to není org…
|
||||
self.assertFalse(m.Organizator.objects.filter(osoba=self.nova_osoba).exists())
|
||||
self.assertNotIn(self.org_group, self.nova_osoba.user.groups.all())
|
||||
self.assertFalse(self.nova_osoba.user.has_perm('auth.org'))
|
||||
self.assertFalse(self.nova_osoba.user.is_staff)
|
||||
|
||||
# Pak orga uděláme…
|
||||
qs = m.Osoba.objects.filter(id=self.nova_osoba.id)
|
||||
self.admin.udelej_orgem(self.request, qs)
|
||||
|
||||
# A pak už to org má být.
|
||||
self.nova_osoba.refresh_from_db()
|
||||
self.assertTrue(self.nova_osoba.user.is_staff)
|
||||
# FIXME: V db nejsou práva. Nový org je sice ve skupině "org", ale ta nemá právo "auth.org"
|
||||
# Očekávané řešení: dodat fixture, která to přidá.
|
||||
#self.assertTrue(self.nova_osoba.user.has_perm('auth.org'))
|
||||
self.assertIn(self.org_group, self.nova_osoba.user.groups.all())
|
||||
self.assertTrue(m.Organizator.objects.filter(osoba=self.nova_osoba).exists())
|
||||
novy_org = m.Organizator.objects.get(osoba=self.nova_osoba)
|
||||
self.assertIsNotNone(novy_org.organizuje_od)
|
||||
|
||||
def test_pridani_stareho_orga(self):
|
||||
self.admin.udelej_orgem(self.request, m.Osoba.objects.filter(id=self.stary_org.osoba.id)) # Ugly
|
||||
# Když to spadne, tak jsem se to dozvěděl, takže už nepotřebuju nic kontrolovat.
|
||||
# Jestli to funguje správně má řešit jiný test.
|
||||
|
||||
|
Loading…
Reference in a new issue
Tenhle print tu být taky nemusí…