77from django .template .response import TemplateResponse
88from django .utils import timezone
99from django .utils .translation import gettext_lazy as _
10- from .models import Options
10+ from django .utils .html import format_html
11+ from django .db import models
12+ from django .conf import settings
13+ from adminlteui .widgets import AdminlteSelect , AdminlteSelectMultiple
14+ from treebeard .admin import TreeAdmin
15+ from treebeard .forms import movenodeform_factory
16+ from .models import Options , Menu
1117
1218
1319def get_option (option_name ):
@@ -20,7 +26,7 @@ def get_option(option_name):
2026
2127def handle_uploaded_file (f , file_name ):
2228 # save site_logo
23- with open ('media /' + file_name , 'wb+' ) as destination :
29+ with open (settings . MEDIA_ROOT + ' /' + file_name , 'wb+' ) as destination :
2430 for chunk in f .chunks ():
2531 destination .write (chunk )
2632
@@ -43,16 +49,19 @@ def get_image_box():
4349class GeneralOptionForm (forms .Form ):
4450 site_title = forms .CharField (label = _ ('Site Title' ),
4551 widget = widgets .AdminTextInputWidget (),
46- help_text = _ ("Text to put at the end of each page's tag title." ))
52+ help_text = _ (
53+ "Text to put at the end of each page's tag title." ))
4754 site_header = forms .CharField (label = _ ('Site Header' ),
4855 widget = widgets .AdminTextInputWidget (),
49- help_text = _ ("Text to put in base page's tag b." ))
56+ help_text = _ (
57+ "Text to put in base page's tag b." ))
5058 # index_title = forms.CharField(label=_('Index Title'),
5159 # widget=widgets.AdminTextInputWidget())
5260 site_logo = forms .ImageField (label = _ ('Site Logo' ),
5361 widget = forms .ClearableFileInput (),
5462 required = False ,
55- help_text = _ ("Transparent background picture is a good choice." ))
63+ help_text = _ (
64+ "Transparent background picture is a good choice." ))
5665 welcome_sign = forms .CharField (
5766 label = _ ('Welcome Sign' ),
5867 widget = widgets .AdminTextInputWidget (),
@@ -65,30 +74,41 @@ def save(self):
6574 if self .data .get ('site_logo-clear' ):
6675 obj = Options .objects .get (option_name = 'site_logo' )
6776 obj .delete ()
77+ self .changed_data .remove ('site_logo' )
6878
6979 for data_item in self .changed_data :
7080 try :
7181 obj = Options .objects .get (option_name = data_item )
7282
7383 if data_item == 'site_logo' :
84+ if not settings .MEDIA_ROOT or not settings .MEDIA_URL :
85+ self .errors [data_item ] = _ (
86+ 'site_logo depends on setting.MEDIA_URL and setting.MEDIA_ROOT.' )
87+ return False
7488 if not self .files .get (data_item ) or self .data .get (
7589 data_item ) == '' :
7690 continue
7791 handle_uploaded_file (self .files .get (data_item ),
7892 self .files .get (data_item ).name )
79- obj .option_value = 'media/' + self .files .get (
93+ obj .option_value = settings .MEDIA_URL .lstrip (
94+ '/' ) + self .files .get (
8095 data_item ).name
8196 else :
8297 if obj .option_value == self .data .get (data_item ):
8398 continue
8499 obj .option_value = self .data .get (data_item )
85100 except Options .DoesNotExist :
86101 if data_item == 'site_logo' :
102+ if not settings .MEDIA_ROOT or not settings .MEDIA_URL :
103+ self .errors [data_item ] = _ (
104+ 'site_logo depends on setting.MEDIA_URL and setting.MEDIA_ROOT.' )
105+ return False
87106 handle_uploaded_file (self .files .get (data_item ),
88107 self .files .get (data_item ).name )
89108 obj = Options .objects .create (
90109 option_name = data_item ,
91- option_value = 'media/' + self .files .get (
110+ option_value = settings .MEDIA_URL .lstrip (
111+ '/' ) + self .files .get (
92112 data_item ).name ,
93113 create_time = timezone .now ())
94114 else :
@@ -168,3 +188,26 @@ def general_option_view(self, request):
168188 context ['line' ] = form
169189 return TemplateResponse (request , 'adminlte/general_option.html' ,
170190 context )
191+
192+
193+ @admin .register (Menu )
194+ class MenuAdmin (TreeAdmin ):
195+ list_display = ('name' , 'position' , 'link_type' , 'link' ,
196+ 'content_type' , 'display_icon' ,
197+ 'valid' )
198+ list_filter = ('position' , 'link_type' , 'valid' )
199+ list_editable = ('valid' ,)
200+ form = movenodeform_factory (Menu )
201+ change_list_template = 'adminlte/menu_change_list.html'
202+ change_form_template = 'adminlte/menu_change_form.html'
203+ formfield_overrides = {
204+ models .ForeignKey : {'widget' : AdminlteSelect }
205+ }
206+
207+ def display_icon (self , obj ):
208+ if obj .icon :
209+ return format_html (
210+ '<i class="fa {}"></i> {}' .format (obj .icon , obj .icon ))
211+ return obj .icon
212+
213+ display_icon .short_description = _ ('Icon' )
0 commit comments