Update and finish admin autocompletes
This commit is contained in:
		
							parent
							
								
									6bdb55ab98
								
							
						
					
					
						commit
						09a11bdcea
					
				
					 2 changed files with 101 additions and 21 deletions
				
			
		|  | @ -29,7 +29,7 @@ admin.site.register(Skola, SkolaAdmin) | ||||||
| ### Resitel | ### Resitel | ||||||
| 
 | 
 | ||||||
| class ResitelAdmin(reversion.VersionAdmin): | class ResitelAdmin(reversion.VersionAdmin): | ||||||
|     form = autocomplete_light.modelform_factory(Resitel) |     form = autocomplete_light.modelform_factory(Resitel, autocomplete_fields=['skola'], fields=['skola']) | ||||||
|     fieldsets = [ |     fieldsets = [ | ||||||
|         (None,              {'fields': ['jmeno', 'prijmeni', 'user']}), |         (None,              {'fields': ['jmeno', 'prijmeni', 'user']}), | ||||||
|         (u'Škola',          {'fields': ['skola', 'rok_maturity']}), |         (u'Škola',          {'fields': ['skola', 'rok_maturity']}), | ||||||
|  | @ -59,6 +59,8 @@ admin.site.register(Cislo, CisloAdmin) | ||||||
| 
 | 
 | ||||||
| class CisloInline(admin.StackedInline): | class CisloInline(admin.StackedInline): | ||||||
|     model = Cislo |     model = Cislo | ||||||
|  |     fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne'] | ||||||
|  |     readonly_fields = ['cislo'] | ||||||
|     extra = 0 |     extra = 0 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -78,7 +80,7 @@ admin.site.register(Rocnik, RocnikAdmin) | ||||||
| ### PrilohaReseni | ### PrilohaReseni | ||||||
| 
 | 
 | ||||||
| class PrilohaReseniAdmin(reversion.VersionAdmin): | class PrilohaReseniAdmin(reversion.VersionAdmin): | ||||||
|     readonly_fields = ['timestamp'] |     readonly_fields = ['timestamp', 'reseni'] | ||||||
|     fieldsets = [ |     fieldsets = [ | ||||||
|         (None,              {'fields': ['reseni', 'soubor', 'timestamp']}), |         (None,              {'fields': ['reseni', 'soubor', 'timestamp']}), | ||||||
|         (u'Poznámky',       {'fields': ['poznamka']}), |         (u'Poznámky',       {'fields': ['poznamka']}), | ||||||
|  | @ -91,17 +93,20 @@ admin.site.register(PrilohaReseni, PrilohaReseniAdmin) | ||||||
| 
 | 
 | ||||||
| class PrilohaReseniInline(admin.StackedInline): | class PrilohaReseniInline(admin.StackedInline): | ||||||
|     model = PrilohaReseni |     model = PrilohaReseni | ||||||
|  |     fields = ['timestamp', 'soubor', 'poznamka'] | ||||||
|  |     readonly_fields = ['timestamp'] | ||||||
|     extra = 1 |     extra = 1 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### Reseni | ### Reseni | ||||||
| 
 | 
 | ||||||
| class ReseniAdmin(reversion.VersionAdmin): | class ReseniAdmin(reversion.VersionAdmin): | ||||||
|     readonly_fields = ['timestamp'] |     form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem'], fields=['problem']) | ||||||
|     fieldsets = [ |     fieldsets = [ | ||||||
|         (None,              {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}), |         (None,              {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}), | ||||||
|         (u'Poznámky',       {'fields': ['poznamka']}), |         (u'Poznámky',       {'fields': ['poznamka']}), | ||||||
|         ] |         ] | ||||||
|  |     readonly_fields = ['timestamp'] | ||||||
|     list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp'] |     list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp'] | ||||||
|     list_filter = ['body', 'timestamp', 'forma'] |     list_filter = ['body', 'timestamp', 'forma'] | ||||||
|     search_fields = [] |     search_fields = [] | ||||||
|  | @ -111,12 +116,14 @@ admin.site.register(Reseni, ReseniAdmin) | ||||||
| 
 | 
 | ||||||
| class ReseniInline(admin.TabularInline): | class ReseniInline(admin.TabularInline): | ||||||
|     model = Reseni |     model = Reseni | ||||||
|     readonly_fields = ['poznamka'] |     fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] | ||||||
|  |     readonly_fields = ['poznamka', 'resitel', 'timestamp', 'cislo_body', 'resitel', 'forma'] | ||||||
|     extra = 0 |     extra = 0 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### Problem | ### Problem | ||||||
| 
 | 
 | ||||||
|  | #TODO: Autocomplete autor/opravovatel | ||||||
| class ProblemAdminForm(forms.ModelForm): | class ProblemAdminForm(forms.ModelForm): | ||||||
|     text_problemu = forms.CharField(widget=CKEditorWidget()) |     text_problemu = forms.CharField(widget=CKEditorWidget()) | ||||||
|     text_problemu_org = forms.CharField(widget=CKEditorWidget()) |     text_problemu_org = forms.CharField(widget=CKEditorWidget()) | ||||||
|  | @ -126,15 +133,15 @@ class ProblemAdminForm(forms.ModelForm): | ||||||
| 
 | 
 | ||||||
| class ProblemAdmin(reversion.VersionAdmin): | class ProblemAdmin(reversion.VersionAdmin): | ||||||
|     form = ProblemAdminForm |     form = ProblemAdminForm | ||||||
| #    readonly_fields = ['autor'] |  | ||||||
|     fieldsets = [ |     fieldsets = [ | ||||||
|         (None,              {'fields': ['nazev', 'typ', 'stav', 'autor', 'body']}), |         (None,              {'fields': ['nazev', 'typ', 'stav', 'autor', 'zamereni', 'body', 'timestamp']}), | ||||||
|         (u'Vydání',         {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel']}), |         (u'Vydání',         {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel']}), | ||||||
|         (u'Texty',          {'fields': ['text_problemu', 'text_problemu_org']}), |         (u'Texty',          {'fields': ['text_problemu', 'text_problemu_org']}), | ||||||
|         ] |         ] | ||||||
|  |     readonly_fields = ['timestamp'] | ||||||
|     list_display = ['nazev', 'typ', 'kod', 'stav', 'autor', 'opravovatel', 'verejne', 'cislo_zadani'] |     list_display = ['nazev', 'typ', 'kod', 'stav', 'autor', 'opravovatel', 'verejne', 'cislo_zadani'] | ||||||
|     list_select_related = True |     list_select_related = True | ||||||
|     list_filter = ['typ', 'stav', 'autor', 'opravovatel'] |     list_filter = ['typ', 'stav', 'timestamp'] | ||||||
|     search_fields = ['nazev', 'kod', 'text_problemu_org', 'text_problemu'] |     search_fields = ['nazev', 'kod', 'text_problemu_org', 'text_problemu'] | ||||||
|     inlines = [ReseniInline] |     inlines = [ReseniInline] | ||||||
|     view_on_site = Problem.verejne_url |     view_on_site = Problem.verejne_url | ||||||
|  | @ -152,5 +159,6 @@ class SoustredeniAdmin(reversion.VersionAdmin): | ||||||
|     list_display = ['rocnik', 'misto', 'datum_zacatku', 'verejne'] |     list_display = ['rocnik', 'misto', 'datum_zacatku', 'verejne'] | ||||||
|     list_filter = ['rocnik'] |     list_filter = ['rocnik'] | ||||||
|     view_on_site = Soustredeni.verejne_url |     view_on_site = Soustredeni.verejne_url | ||||||
|  |     # TODO: UcastNaSoustredeni jako inline | ||||||
| 
 | 
 | ||||||
| admin.site.register(Soustredeni, SoustredeniAdmin) | admin.site.register(Soustredeni, SoustredeniAdmin) | ||||||
|  |  | ||||||
|  | @ -1,24 +1,96 @@ | ||||||
| import autocomplete_light | # -*- coding: utf-8 -*- | ||||||
| from models import Skola | 
 | ||||||
|  | import autocomplete_light | ||||||
|  | 
 | ||||||
|  | from models import Skola, Resitel, Problem | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class SkolaAutocomplete(autocomplete_light.AutocompleteModelBase): | ||||||
|  | 
 | ||||||
|  |     model = Skola | ||||||
|  | 
 | ||||||
|  |     search_fields=['nazev', 'mesto', 'ulice'] | ||||||
|  | 
 | ||||||
|  |     split_words = True | ||||||
|  | 
 | ||||||
|  |     limit_choices = 15 | ||||||
| 
 | 
 | ||||||
| # This will generate a PersonAutocomplete class |  | ||||||
| autocomplete_light.register(Skola, |  | ||||||
|     # Just like in ModelAdmin.search_fields |  | ||||||
|     search_fields=['nazev', 'mesto', 'ulice'], |  | ||||||
|     attrs={ |     attrs={ | ||||||
|         # This will set the input placeholder attribute: |         # This will set the input placeholder attribute: | ||||||
|         'placeholder': 'Skola', |         'placeholder': u'Škola', | ||||||
|         # This will set the yourlabs.Autocomplete.minimumCharacters |         # This will set the yourlabs.Autocomplete.minimumCharacters | ||||||
|         # options, the naming conversion is handled by jQuery |         # options, the naming conversion is handled by jQuery | ||||||
|         'data-autocomplete-minimum-characters': 1, |         'data-autocomplete-minimum-characters': 1, | ||||||
|     }, |     } | ||||||
|     # This will set the data-widget-maximum-values attribute on the | 
 | ||||||
|     # widget container element, and will be set to |     widget_attrs={ | ||||||
|     # yourlabs.Widget.maximumValues (jQuery handles the naming |         'data-widget-maximum-values': 15, | ||||||
|     # conversion). |         'class': 'modern-style', | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | autocomplete_light.register(SkolaAutocomplete) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ResitelAutocomplete(autocomplete_light.AutocompleteModelBase): | ||||||
|  | 
 | ||||||
|  |     model = Resitel | ||||||
|  |      | ||||||
|  |     search_fields=['jmeno', 'prijmeni'] | ||||||
|  | 
 | ||||||
|  |     split_words = False | ||||||
|  | 
 | ||||||
|  |     limit_choices = 15 | ||||||
|  | 
 | ||||||
|  |     def choice_label(self, resitel): | ||||||
|  |         return u"%s, %s (%s)" % (resitel.plne_jmeno(), resitel.mesto, resitel.rok_maturity) | ||||||
|  | 
 | ||||||
|  |     attrs={ | ||||||
|  |         # This will set the input placeholder attribute: | ||||||
|  |         'placeholder': u'Řešitel', | ||||||
|  |         # This will set the yourlabs.Autocomplete.minimumCharacters | ||||||
|  |         # options, the naming conversion is handled by jQuery | ||||||
|  |         'data-autocomplete-minimum-characters': 1, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     widget_attrs={ |     widget_attrs={ | ||||||
|         'data-widget-maximum-values': 15, |         'data-widget-maximum-values': 15, | ||||||
|         # Enable modern-style widget ! |         # Enable modern-style widget ! | ||||||
|         'class': 'modern-style', |         'class': 'modern-style', | ||||||
|     }, |     } | ||||||
| ) | 
 | ||||||
|  | autocomplete_light.register(ResitelAutocomplete) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ProblemAutocomplete(autocomplete_light.AutocompleteModelBase): | ||||||
|  | 
 | ||||||
|  |     model = Problem | ||||||
|  |      | ||||||
|  |     search_fields=['nazev'] | ||||||
|  | 
 | ||||||
|  |     split_words = False | ||||||
|  | 
 | ||||||
|  |     limit_choices = 10 | ||||||
|  | 
 | ||||||
|  |     def choice_label(self, p): | ||||||
|  |         if p.stav == Problem.STAV_ZADANY: | ||||||
|  |             return u"%s (%s, %s.%s)" % (p.nazev, p.typ, p.cislo_zadani.rocnik.rocnik, p.kod_v_rocniku()) | ||||||
|  |         else: | ||||||
|  |             return u"%s (%s, %s)" % (p.nazev, p.typ, p.stav) | ||||||
|  | 
 | ||||||
|  |     attrs={ | ||||||
|  |         # This will set the input placeholder attribute: | ||||||
|  |         'placeholder': u'Řešitel', | ||||||
|  |         # This will set the yourlabs.Autocomplete.minimumCharacters | ||||||
|  |         # options, the naming conversion is handled by jQuery | ||||||
|  |         'data-autocomplete-minimum-characters': 1, | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     widget_attrs={ | ||||||
|  |         'data-widget-maximum-values': 10, | ||||||
|  |         # Enable modern-style widget ! | ||||||
|  |         'class': 'modern-style', | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | autocomplete_light.register(ProblemAutocomplete) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Tomas Gavenciak
						Tomas Gavenciak