Merge pull request 'Lepsi Delani Orgu' (!35) from lepsi-delani-orgu into master
Reviewed-on: #35
This commit is contained in:
		
						commit
						cda00bbc4c
					
				
					 2 changed files with 77 additions and 4 deletions
				
			
		|  | @ -1,7 +1,9 @@ | ||||||
| from django.contrib import admin | from django.contrib import admin | ||||||
| from django.contrib.auth.models import Group | from django.contrib.auth.models import Group | ||||||
| from django_reverse_admin import ReverseModelAdmin | from django_reverse_admin import ReverseModelAdmin | ||||||
|  | from django.contrib.messages import WARNING, ERROR, SUCCESS | ||||||
| import seminar.models as m | import seminar.models as m | ||||||
|  | from datetime import datetime | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @admin.register(m.Osoba) | @admin.register(m.Osoba) | ||||||
|  | @ -20,16 +22,24 @@ class OsobaAdmin(admin.ModelAdmin): | ||||||
| 
 | 
 | ||||||
| 	def udelej_orgem(self,request,queryset): | 	def udelej_orgem(self,request,queryset): | ||||||
| 		org_group = Group.objects.get(name='org') | 		org_group = Group.objects.get(name='org') | ||||||
| 		print(queryset) | 		uspesne_vytvoreni_orgove = 0 | ||||||
| 		for o in queryset: | 		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 | ||||||
|  | 				self.message_user(request, f"Osoba {o} už je org, přeskakuji.", level=WARNING) | ||||||
|  | 				continue | ||||||
| 			user = o.user | 			user = o.user | ||||||
| 			print(user) | 			if user is None: | ||||||
|  | 				self.message_user(request, f"Osoba {o} nemá uživatele! Přeskakuji.", level=ERROR) | ||||||
|  | 				continue | ||||||
| 			user.groups.add(org_group) | 			user.groups.add(org_group) | ||||||
| 			user.is_staff = True | 			user.is_staff = True | ||||||
| 			user.save() | 			user.save() | ||||||
| 			org = m.Organizator.objects.create(osoba=o) | 			org = m.Organizator.objects.create(osoba=o, organizuje_od=datetime.now()) | ||||||
| 			org.save() | 			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): | class OsobaInline(admin.TabularInline): | ||||||
| 	model = m.Osoba | 	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