147 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.contrib import admin
 | |
| from django.contrib import messages
 | |
| from reversion.admin import VersionAdmin
 | |
| from django.utils.safestring import mark_safe
 | |
| from django.utils.html import escape
 | |
| 
 | |
| from .models import Prednaska, Seznam, Znalost
 | |
| from soustredeni.models import Soustredeni
 | |
| 
 | |
| 
 | |
| class Seznam_PrednaskaInline(admin.TabularInline):
 | |
| 	"""
 | |
| 		:py:class:`Inline <django.contrib.admin.TabularInline>` pro :py:class:`prednasky.admin.SeznamAdmin` zobrazující :py:class:`Přednášky <prednasky.models.Prednaska>`
 | |
| 		v adminu :py:class:`Seznamu <prednasky.models.Seznam>`.
 | |
| 	"""
 | |
| 	model = Prednaska.seznamy.through
 | |
| 	extra = 0
 | |
| 
 | |
| 	def prednaska__nazev(self, obj):
 | |
| 		return mark_safe(
 | |
| 			u"<a href='/admin/prednasky/prednaska/{}'>{}</a>".format(
 | |
| 				obj.prednaska.id,
 | |
| 				escape(obj.prednaska.nazev)
 | |
| 			)
 | |
| 		)
 | |
| 
 | |
| 	def prednaska__popis(self, obj):
 | |
| 		return mark_safe(
 | |
| 			u"<div style='width: 200px'>{}</div>".format(
 | |
| 				escape(obj.prednaska.popis)
 | |
| 			)
 | |
| 		)
 | |
| 
 | |
| 	def prednaska__anotace(self, obj):
 | |
| 		return obj.prednaska.anotace
 | |
| 
 | |
| 	def prednaska__org(self, obj):
 | |
| 		return obj.prednaska.org
 | |
| 
 | |
| 	def prednaska__obor(self, obj):
 | |
| 		return obj.prednaska.obor
 | |
| 
 | |
| 	prednaska__nazev.short_description = u'Přednáška'
 | |
| 	prednaska__popis.short_description = u'Popis pro orgy'
 | |
| 	prednaska__anotace.short_description = u'Anotace'
 | |
| 	prednaska__org.short_description = u'Org'
 | |
| 	prednaska__obor.short_description = u'Obor'
 | |
| 
 | |
| 	readonly_fields = [
 | |
| 		'prednaska__nazev',
 | |
| 		'prednaska__obor',
 | |
| 		'prednaska__org',
 | |
| 		'prednaska__popis',
 | |
| 		'prednaska__anotace',
 | |
| 	]
 | |
| 	exclude = ['prednaska']
 | |
| 
 | |
| 	def has_add_permission(self, req, obj): return False
 | |
| 
 | |
| 
 | |
| class Seznam_ZnalostInline(admin.TabularInline):
 | |
| 	"""
 | |
| 		:py:class:`Inline <django.contrib.admin.TabularInline>` pro :py:class:`prednasky.admin.SeznamAdmin` zobrazující :py:class:`Znalosti <prednasky.models.Znalost>`
 | |
| 		v adminu :py:class:`Seznamu <prednasky.models.Seznam>`.
 | |
| 	"""
 | |
| 	model = Znalost.seznamy.through
 | |
| 	extra = 0
 | |
| 
 | |
| 	def znalost__nazev(self, obj):
 | |
| 		return mark_safe(
 | |
| 			f"<a href='/admin/prednasky/znalost/{obj.znalost.id}'>{obj.znalost.nazev}</a>"
 | |
| 		)
 | |
| 
 | |
| 	def znalost__text(self, obj):
 | |
| 		return mark_safe(
 | |
| 			f"<div style='width: 200px'>{escape(obj.znalost.text)}</div>"
 | |
| 		)
 | |
| 
 | |
| 	znalost__nazev.short_description = u'Přednáška'
 | |
| 	znalost__text.short_description = u'Popis pro orgy'
 | |
| 
 | |
| 	readonly_fields = [
 | |
| 		'znalost__nazev',
 | |
| 		'znalost__text',
 | |
| 	]
 | |
| 	exclude = ['znalost']
 | |
| 
 | |
| 	def has_add_permission(self, req, obj): return False
 | |
| 
 | |
| 
 | |
| class SeznamAdmin(VersionAdmin):
 | |
| 	""" Admin pro :py:class:`Seznam <prednasky.models.Seznam>` """
 | |
| 	list_display = ['soustredeni', 'stav']
 | |
| 	inlines = [Seznam_PrednaskaInline, Seznam_ZnalostInline]
 | |
| 
 | |
| admin.site.register(Seznam, SeznamAdmin)
 | |
| 
 | |
| 
 | |
| class PrednaskaAdmin(VersionAdmin):
 | |
| 	""" Admin pro :py:class:`Přednášku <prednasky.models.Prednaska>` """
 | |
| 	list_display = ['nazev', 'org', 'obor']
 | |
| 	list_filter = ['org', 'obor']
 | |
| 	search_fields = ['nazev']
 | |
| 	filter_horizontal = ('seznamy', )
 | |
| 
 | |
| 	actions = ['move_to_soustredeni']
 | |
| 
 | |
| 	def move_to_soustredeni(self, request, queryset):
 | |
| 		""" Přidá dané přednášky do seznamu, o kterém se právě hlasuje """
 | |
| 		sous = Soustredeni.objects.first()
 | |
| 		seznam = Seznam.objects.filter(soustredeni=sous, stav=Seznam.Stav.NAVRH)
 | |
| 		if len(seznam) == 0:
 | |
| 			self.message_user(
 | |
| 				request,
 | |
| 				u"Není definován seznam pro aktuální soustředění, "
 | |
| 				u"nic se neprovedlo",
 | |
| 				messages.ERROR
 | |
| 			)
 | |
| 			return
 | |
| 		seznam = seznam[0]
 | |
| 		for prednaska in queryset:
 | |
| 			prednaska.seznamy.add(seznam)
 | |
| 			prednaska.save()
 | |
| 
 | |
| 		self.message_user(
 | |
| 			request,
 | |
| 			u"Vybrané přednášky ({}) přidány jako návrhy na nejbližší "
 | |
| 			u"soustředění".format(len(queryset))
 | |
| 		)
 | |
| 
 | |
| 	move_to_soustredeni.short_description = (
 | |
| 		u"Přidat přednášky do návrhu na nejbližší soustředění"
 | |
| 	)
 | |
| 
 | |
| 
 | |
| admin.site.register(Prednaska, PrednaskaAdmin)
 | |
| 
 | |
| 
 | |
| class ZnalostAdmin(PrednaskaAdmin): # Trochu hack, ať nemusím vypisovat všechno znovu
 | |
| 	"""
 | |
| 		Admin pro :py:class:`Znalost <prednasky.models.Znalost>`
 | |
| 		TODO předělat, aby nedědila z :py:class:`prednasky.admin.PrednaskaAdmin`, ale společné věci byly zvlášť
 | |
| 	"""
 | |
| 	list_display = ("__str__",)
 | |
| 	list_filter = ()
 | |
| 
 | |
| admin.site.register(Znalost, ZnalostAdmin)
 |