Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c236c6641 | |||
| 91b3809d61 | |||
| f918551971 | |||
| 149c95311f | |||
| 858f077bd4 | |||
| e46daa8f99 | |||
| e3320b2034 | |||
| 8991863fb1 | |||
| 54f120c9ba | |||
| 816c05bebd | |||
| 710370e903 |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2015 Fabio Caccamo - fabio.caccamo@gmail.com
|
Copyright (c) 2016 Fabio Caccamo - fabio.caccamo@gmail.com
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ django-admin-interface is a modern **flat admin interface customizable by the ad
|
|||||||
You can use the builtin **django-theme** or create your own and **customize** **title, logo and colors**.
|
You can use the builtin **django-theme** or create your own and **customize** **title, logo and colors**.
|
||||||
|
|
||||||
##Requirements
|
##Requirements
|
||||||
- Python 2.6, Python 2.7
|
- Python 2.6, Python 2.7, Python 3.4
|
||||||
- Django 1.6.5 through Django 1.8.4
|
- Django 1.6.5 through Django 1.9
|
||||||
|
|
||||||
##Installation
|
##Installation
|
||||||
- Run `pip install django-admin-interface`
|
- Run `pip install django-admin-interface`
|
||||||
@@ -13,9 +13,9 @@ You can use the builtin **django-theme** or create your own and **customize** **
|
|||||||
```python
|
```python
|
||||||
INSTALLED_APPS = (
|
INSTALLED_APPS = (
|
||||||
#...
|
#...
|
||||||
|
'admin_interface',
|
||||||
'flat',
|
'flat',
|
||||||
'colorfield',
|
'colorfield',
|
||||||
'admin_interface',
|
|
||||||
#...
|
#...
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
#...
|
#...
|
||||||
@@ -45,7 +45,7 @@ INSTALLED_APPS = (
|
|||||||
##License
|
##License
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2015 Fabio Caccamo - fabio.caccamo@gmail.com
|
Copyright (c) 2016 Fabio Caccamo - fabio.caccamo@gmail.com
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ from admin_interface.models import Theme
|
|||||||
|
|
||||||
|
|
||||||
class ThemeAdmin(admin.ModelAdmin):
|
class ThemeAdmin(admin.ModelAdmin):
|
||||||
|
|
||||||
list_display = ('name', 'active', )
|
list_display = ('name', 'active', )
|
||||||
list_editable = ('active', )
|
list_editable = ('active', )
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, {
|
(None, {
|
||||||
'classes': ('wide', ),
|
'classes': ('wide', ),
|
||||||
@@ -48,8 +48,8 @@ class ThemeAdmin(admin.ModelAdmin):
|
|||||||
'fields': ('list_filter_dropdown', )
|
'fields': ('list_filter_dropdown', )
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
save_on_top = True
|
save_on_top = True
|
||||||
|
|
||||||
admin.site.register(Theme, ThemeAdmin)
|
admin.site.register(Theme, ThemeAdmin)
|
||||||
|
|
||||||
|
|||||||
@@ -3,16 +3,14 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
from django.db.models.signals import post_migrate
|
from django.db.models.signals import post_migrate
|
||||||
|
|
||||||
from admin_interface.models import Theme
|
|
||||||
|
|
||||||
|
|
||||||
class AdminInterfaceConfig(AppConfig):
|
class AdminInterfaceConfig(AppConfig):
|
||||||
|
|
||||||
name = 'admin_interface'
|
name = 'admin_interface'
|
||||||
verbose_name = 'Admin Interface'
|
verbose_name = 'Admin Interface'
|
||||||
|
|
||||||
def ready(self):
|
def ready(self):
|
||||||
|
|
||||||
|
from admin_interface.models import Theme
|
||||||
post_migrate.connect(Theme.post_migrate_handler, sender = self)
|
post_migrate.connect(Theme.post_migrate_handler, sender = self)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+32
-32
@@ -10,101 +10,101 @@ import os
|
|||||||
|
|
||||||
|
|
||||||
class Theme(models.Model):
|
class Theme(models.Model):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def post_migrate_handler(sender, **kwargs):
|
def post_migrate_handler(sender, **kwargs):
|
||||||
Theme.get_or_create_default_theme()
|
Theme.get_or_create_default_theme()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def post_delete_handler(instance, **kwargs):
|
def post_delete_handler(instance, **kwargs):
|
||||||
Theme.get_or_create_default_theme()
|
Theme.get_or_create_default_theme()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def post_save_handler(instance, created, **kwargs):
|
def post_save_handler(instance, created, **kwargs):
|
||||||
instance.set_active(instance.active)
|
instance.set_active(instance.active)
|
||||||
Theme.get_or_create_default_theme()
|
Theme.get_or_create_default_theme()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_or_create_default_theme():
|
def get_or_create_default_theme():
|
||||||
|
|
||||||
obj_active = (True if len(list(Theme.objects.filter(active = True))) == 0 else False)
|
obj_active = (True if len(list(Theme.objects.filter(active = True))) == 0 else False)
|
||||||
obj, obj_created = Theme.objects.get_or_create(pk = '1', defaults = { 'active':obj_active })
|
obj, obj_created = Theme.objects.get_or_create(pk = '1', defaults = { 'active':obj_active })
|
||||||
|
|
||||||
if not obj.logo:
|
if not obj.logo:
|
||||||
obj.set_default_logo()
|
obj.set_default_logo()
|
||||||
|
|
||||||
if not obj_created and obj_active:
|
if not obj_created and obj_active:
|
||||||
obj.set_active(True)
|
obj.set_active(True)
|
||||||
|
|
||||||
return (obj, obj_created, )
|
return (obj, obj_created, )
|
||||||
|
|
||||||
name = models.CharField( max_length = 50, default = 'Django' )
|
name = models.CharField( max_length = 50, default = 'Django' )
|
||||||
active = models.BooleanField( default = True )
|
active = models.BooleanField( default = True )
|
||||||
|
|
||||||
title = models.CharField( max_length = 50, default = 'Django administration', blank = True )
|
title = models.CharField( max_length = 50, default = 'Django administration', blank = True )
|
||||||
title_visible = models.BooleanField( default = True, verbose_name = 'visible' )
|
title_visible = models.BooleanField( default = True, verbose_name = 'visible' )
|
||||||
|
|
||||||
logo = models.FileField( upload_to = 'admin-interface/logo/', blank = True )
|
logo = models.FileField( upload_to = 'admin-interface/logo/', blank = True )
|
||||||
logo_visible = models.BooleanField( default = True, verbose_name = 'visible' )
|
logo_visible = models.BooleanField( default = True, verbose_name = 'visible' )
|
||||||
|
|
||||||
css_header_background_color = ColorField( blank = True, default = '#0C4B33', help_text = '#0C4B33', verbose_name = 'background color' )
|
css_header_background_color = ColorField( blank = True, default = '#0C4B33', help_text = '#0C4B33', verbose_name = 'background color' )
|
||||||
css_header_title_color = ColorField( blank = True, default = '#F5DD5D', help_text = '#F5DD5D', verbose_name = 'title color' )
|
css_header_title_color = ColorField( blank = True, default = '#F5DD5D', help_text = '#F5DD5D', verbose_name = 'title color' )
|
||||||
css_header_text_color = ColorField( blank = True, default = '#44B78B', help_text = '#44B78B', verbose_name = 'text color' )
|
css_header_text_color = ColorField( blank = True, default = '#44B78B', help_text = '#44B78B', verbose_name = 'text color' )
|
||||||
css_header_link_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'link color' )
|
css_header_link_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'link color' )
|
||||||
css_header_link_hover_color = ColorField( blank = True, default = '#C9F0DD', help_text = '#C9F0DD', verbose_name = 'link hover color' )
|
css_header_link_hover_color = ColorField( blank = True, default = '#C9F0DD', help_text = '#C9F0DD', verbose_name = 'link hover color' )
|
||||||
|
|
||||||
css_module_background_color = ColorField( blank = True, default = '#44B78B', help_text = '#44B78B', verbose_name = 'background color' )
|
css_module_background_color = ColorField( blank = True, default = '#44B78B', help_text = '#44B78B', verbose_name = 'background color' )
|
||||||
css_module_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
css_module_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
||||||
css_module_link_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'link color' )
|
css_module_link_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'link color' )
|
||||||
css_module_link_hover_color = ColorField( blank = True, default = '#C9F0DD', help_text = '#C9F0DD', verbose_name = 'link hover color' )
|
css_module_link_hover_color = ColorField( blank = True, default = '#C9F0DD', help_text = '#C9F0DD', verbose_name = 'link hover color' )
|
||||||
css_module_rounded_corners = models.BooleanField( default = True, verbose_name = 'rounded corners' )
|
css_module_rounded_corners = models.BooleanField( default = True, verbose_name = 'rounded corners' )
|
||||||
|
|
||||||
css_generic_link_color = ColorField( blank = True, default = '#0C3C26', help_text = '#0C3C26', verbose_name = 'link color' )
|
css_generic_link_color = ColorField( blank = True, default = '#0C3C26', help_text = '#0C3C26', verbose_name = 'link color' )
|
||||||
css_generic_link_hover_color = ColorField( blank = True, default = '#156641', help_text = '#156641', verbose_name = 'link hover color' )
|
css_generic_link_hover_color = ColorField( blank = True, default = '#156641', help_text = '#156641', verbose_name = 'link hover color' )
|
||||||
|
|
||||||
css_save_button_background_color = ColorField( blank = True, default = '#0C4B33', help_text = '#0C4B33', verbose_name = 'background color' )
|
css_save_button_background_color = ColorField( blank = True, default = '#0C4B33', help_text = '#0C4B33', verbose_name = 'background color' )
|
||||||
css_save_button_background_hover_color = ColorField( blank = True, default = '#0C3C26', help_text = '#0C3C26', verbose_name = 'background hover color' )
|
css_save_button_background_hover_color = ColorField( blank = True, default = '#0C3C26', help_text = '#0C3C26', verbose_name = 'background hover color' )
|
||||||
css_save_button_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
css_save_button_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
||||||
|
|
||||||
css_delete_button_background_color = ColorField( blank = True, default = '#BA2121', help_text = '#BA2121', verbose_name = 'background color' )
|
css_delete_button_background_color = ColorField( blank = True, default = '#BA2121', help_text = '#BA2121', verbose_name = 'background color' )
|
||||||
css_delete_button_background_hover_color = ColorField( blank = True, default = '#A41515', help_text = '#A41515', verbose_name = 'background hover color' )
|
css_delete_button_background_hover_color = ColorField( blank = True, default = '#A41515', help_text = '#A41515', verbose_name = 'background hover color' )
|
||||||
css_delete_button_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
css_delete_button_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
||||||
|
|
||||||
css = models.TextField( blank = True )
|
css = models.TextField( blank = True )
|
||||||
|
|
||||||
list_filter_dropdown = models.BooleanField( default = False )
|
list_filter_dropdown = models.BooleanField( default = False )
|
||||||
|
|
||||||
|
|
||||||
def set_active(self, value):
|
def set_active(self, value):
|
||||||
|
|
||||||
if value:
|
if value:
|
||||||
Theme.objects.exclude(pk = self.pk).update(active = False)
|
Theme.objects.exclude(pk = self.pk).update(active = False)
|
||||||
Theme.objects.filter(pk = self.pk).update(active = True)
|
Theme.objects.filter(pk = self.pk).update(active = True)
|
||||||
else:
|
else:
|
||||||
Theme.objects.filter(pk = self.pk).update(active = False)
|
Theme.objects.filter(pk = self.pk).update(active = False)
|
||||||
|
|
||||||
def set_default_logo(self):
|
def set_default_logo(self):
|
||||||
|
|
||||||
logo_path = os.path.normpath(os.path.dirname(__file__) + '/data/logo-django.svg')
|
logo_path = os.path.normpath(os.path.dirname(__file__) + '/data/logo-django.svg')
|
||||||
logo_file = open(logo_path)
|
logo_file = open(logo_path)
|
||||||
|
|
||||||
self.logo = File(logo_file)
|
self.logo = File(logo_file)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
logo_file.close()
|
logo_file.close()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
||||||
app_label = 'admin_interface'
|
app_label = 'admin_interface'
|
||||||
|
|
||||||
verbose_name = 'Theme'
|
verbose_name = 'Theme'
|
||||||
verbose_name_plural = 'Themes'
|
verbose_name_plural = 'Themes'
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
|
|
||||||
return unicode(u'%s' % (self.name, ))
|
return unicode(u'%s' % (self.name, ))
|
||||||
|
|
||||||
|
|
||||||
post_delete.connect(Theme.post_delete_handler, sender = Theme)
|
post_delete.connect(Theme.post_delete_handler, sender = Theme)
|
||||||
post_save.connect(Theme.post_save_handler, sender = Theme)
|
post_save.connect(Theme.post_save_handler, sender = Theme)
|
||||||
|
|
||||||
|
|||||||
@@ -220,9 +220,22 @@
|
|||||||
min-width:320px !important;
|
min-width:320px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login #content {
|
||||||
|
padding:0px 30px 10px 30px !important;
|
||||||
|
}
|
||||||
|
|
||||||
/* same lateral padding as in logged view */
|
/* same lateral padding as in logged view */
|
||||||
.login #header {
|
.login #header {
|
||||||
padding:10px 25px !important;
|
padding:15px 30px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login #branding h1 {
|
||||||
|
margin-right:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login #branding h1 img.logo {
|
||||||
|
max-width:100%;
|
||||||
|
margin-right:0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* login button right aligned */
|
/* login button right aligned */
|
||||||
@@ -407,6 +420,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* sorl-thumbnail - improved AdminImageMixin widget layout */
|
||||||
|
|
||||||
|
a.thumbnail + input[type="checkbox"] {
|
||||||
|
margin:10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ckeditor + light theme - https://github.com/Ikimea/ckeditor-light-theme */
|
/* ckeditor + light theme - https://github.com/Ikimea/ckeditor-light-theme */
|
||||||
|
|
||||||
.cke_inner, .cke_wysiwyg_frame {
|
.cke_inner, .cke_wysiwyg_frame {
|
||||||
|
|||||||
@@ -10,16 +10,15 @@ register = template.Library()
|
|||||||
|
|
||||||
@register.assignment_tag(takes_context = True)
|
@register.assignment_tag(takes_context = True)
|
||||||
def get_admin_interface_theme(context):
|
def get_admin_interface_theme(context):
|
||||||
|
|
||||||
obj_qs = Theme.objects.filter(active = True)[:1]
|
obj_qs = Theme.objects.filter(active = True)[:1]
|
||||||
obj_ls = list(obj_qs)
|
obj_ls = list(obj_qs)
|
||||||
obj = None
|
obj = None
|
||||||
|
|
||||||
if len(obj_ls):
|
if len(obj_ls):
|
||||||
obj = obj_ls[0]
|
obj = obj_ls[0]
|
||||||
else:
|
else:
|
||||||
obj = Theme.get_or_create_default_theme()
|
obj = Theme.get_or_create_default_theme()
|
||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
__version__ = '0.1.3'
|
__version__ = '0.1.5'
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ setup(
|
|||||||
keywords=['django', 'admin', 'interface', 'ui', 'flat', 'theme', 'custom'],
|
keywords=['django', 'admin', 'interface', 'ui', 'flat', 'theme', 'custom'],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
'django-colorfield==0.1.10',
|
'django-colorfield==0.1.10',
|
||||||
'django-flat-theme==1.1.2'
|
'django-flat-theme==1.1.3'
|
||||||
],
|
],
|
||||||
classifiers=[]
|
classifiers=[]
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user