Compare commits

...

16 Commits

Author SHA1 Message Date
Fabio Caccamo 165a8e4572 Updated version 2017-05-19 12:59:19 +02:00
Fabio Caccamo a6df45a571 Improved responsive m2m selector, ckeditor and sorl-thumbnail widgets 2017-05-19 12:59:02 +02:00
Fabio Caccamo b24c6010d2 Updated version 2017-05-18 10:56:19 +02:00
Fabio Caccamo bb2dd77646 Fixed django-storages compatibility - #16 2017-05-18 10:56:06 +02:00
Fabio Caccamo 60f451d073 Updated version 2017-05-16 18:39:12 +02:00
Fabio Caccamo 4c182157eb Moved css to external files and added .admin-interface body class 2017-05-16 18:38:59 +02:00
Fabio Caccamo dd9de6ba42 Rendered admin logo width and height attributes only if available 2017-05-16 18:38:06 +02:00
Fabio Caccamo a09e13fb00 Fixed default theme logo reset if the logo exists 2017-05-16 18:36:39 +02:00
Fabio Caccamo c3cf8e4d10 Updated version 2017-05-11 16:55:32 +02:00
Fabio Caccamo a6ae4230f6 Improved scripts and styles order 2017-05-11 16:54:43 +02:00
Fabio Caccamo 07dc59747d Changed static files template tag 2017-05-11 16:54:14 +02:00
Fabio Caccamo 690d28dd8c Improved admin title generation 2017-05-11 16:53:19 +02:00
Fabio Caccamo 8db8528542 Fixed magnific-popup initialization error in admin pages without jquery 2017-05-11 16:52:34 +02:00
Fabio Caccamo cfac48db5d Enforced default theme logo creation 2017-05-11 12:07:35 +02:00
Fabio Caccamo f20d64c99f Updated README [ci skip] 2017-05-04 18:59:38 +02:00
Fabio Caccamo 4cf01aa1df Updated README [ci skip] 2017-05-04 18:52:03 +02:00
14 changed files with 962 additions and 618 deletions
+15 -2
View File
@@ -7,7 +7,13 @@
# django-admin-interface
django-admin-interface is a modern **responsive flat admin interface customizable by the admin itself**.
You can use the builtin **django-theme** or create your own and **customize** **title, logo and colors**.
## Features
- Beautiful default **django-theme**
- Themes management and customization *(you can **customize admin title, logo and colors**)*
- Responsive
- List filter dropdown *(optional)*
- **`NEW`** **Related modal** *(instead of the old popup window, optional)*
- Style optimizations for: `django-ckeditor`, `django-modeltranslation`, `sorl-thumbnail`
## Requirements
- Python 2.7, 3.4, 3.5, 3.6
@@ -28,10 +34,17 @@ INSTALLED_APPS = (
#...
)
```
- Run ``python manage.py migrate`` *(add ``--fake-initial`` if you are upgrading from 0.1.0 version)*
- Run ``python manage.py migrate``
- Run ``python manage.py collectstatic``
- Restart your application server
#### Upgrade
- Run `pip install django-admin-interface --upgrade`
- Run ``python manage.py migrate`` *(add ``--fake-initial`` if you are upgrading from 0.1.0 version)*
- Run ``python manage.py collectstatic --clear``
- Restart your application server
## Screenshots
###### Admin login
![django-admin-interface_login](https://cloud.githubusercontent.com/assets/1035294/11240233/55c8d4ba-8df1-11e5-9568-00fdc987ede8.gif)
+12 -3
View File
@@ -35,8 +35,7 @@ class Theme(models.Model):
if not default_obj_created and default_obj_active:
default_obj.set_active()
if not default_obj.logo:
default_obj.set_default_logo()
default_obj.set_default_logo()
obj = objs_active_qs.last()
objs_active_count = objs_active_qs.count()
@@ -46,7 +45,6 @@ class Theme(models.Model):
return obj
name = models.CharField( max_length = 50, default = 'Django' )
active = models.BooleanField( default = True )
@@ -109,12 +107,23 @@ class Theme(models.Model):
def set_default_logo(self):
if self.logo:
# django-storages compatibility
try:
if os.path.isfile(self.logo.path):
return
except NotImplementedError:
return
logo_filename = 'logo-django.svg'
logo_path = os.path.normpath(os.path.dirname(__file__) + '/data/' + logo_filename)
logo_file = open(logo_path)
self.logo = File(logo_file, logo_filename)
post_save.disconnect(Theme.post_save_handler, sender = Theme)
self.save()
post_save.connect(Theme.post_save_handler, sender = Theme)
logo_file.close()
@@ -13,7 +13,10 @@
factory(django.jQuery);
} else {
// Browser globals
factory(window.jQuery || window.Zepto);
var $ = (window.jQuery || window.Zepto);
if( $ ){
factory($);
}
}
}(function ($) {
+26 -611
View File
@@ -1,639 +1,54 @@
{% extends "admin/base.html" %}
{% load i18n staticfiles admin_interface_tags %}
{% extends 'admin/base.html' %}
{% load i18n static admin_interface_tags %}
{% block title %}
{% get_admin_interface_theme as theme %}
{% if theme.title %}{% trans theme.title %}{% else %}{% trans 'Django administration' %}{% endif %}
{% if title %}{{ title }} | {% endif %}{% if theme.title %}{% trans theme.title %}{% else %}{{ site_title|default:_('Django administration') }}{% endif %}
{% endblock %}
{% block extrastyle %}
{% get_admin_interface_theme as theme %}
<style type="text/css">
#header {
height:auto;
min-height:40px;
background:{{ theme.css_header_background_color }};
color:{{ theme.css_header_text_color }};
}
#header #user-tools a {
color:{{ theme.css_header_link_color }};
}
#header #user-tools a:hover,
#header #user-tools a:active {
color:{{ theme.css_header_link_hover_color }};
border-bottom-color:rgba(255, 255, 255, 0.5);
}
#branding h1 img.logo {
max-height:100px;
margin-top:10px;
margin-bottom:10px;
margin-right:15px;
}
#branding h1 {
color:{{ theme.css_header_title_color }};
}
#branding h1 img+span {
white-space:nowrap;
}
.module h2,
.module caption,
.module.filtered h2 {
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
.module a.section:link,
.module a.section:visited {
color:{{ theme.css_module_link_color }};
}
.module a.section:active,
.module a.section:hover {
color:{{ theme.css_module_link_hover_color }};
}
div.breadcrumbs {
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
div.breadcrumbs a {
color:{{ theme.css_module_link_color }};
}
div.breadcrumbs a:active,
div.breadcrumbs a:focus,
div.breadcrumbs a:hover {
color:{{ theme.css_module_link_hover_color }} !important;
}
fieldset.collapse {
border: 1px solid transparent;
}
fieldset.collapse.collapsed a.collapse-toggle {
color:{{ theme.css_generic_link_color }} !important;
font-weight: bold;
text-transform: lowercase;
}
fieldset.collapse.collapsed a.collapse-toggle:hover,
fieldset.collapse.collapsed a.collapse-toggle:active {
color:{{ theme.css_generic_link_hover_color }} !important;
}
fieldset.collapse a.collapse-toggle {
color:{{ theme.css_module_link_color }} !important;
font-weight: bold;
text-transform: lowercase;
}
fieldset.collapse a.collapse-toggle:hover,
fieldset.collapse a.collapse-toggle:active {
color:{{ theme.css_module_link_hover_color }} !important;
}
.inline-group h2 {
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
.selector-chosen h2 {
background:{{ theme.css_module_background_color }} !important;
color:{{ theme.css_module_text_color }} !important;
}
a:link, a:visited {
color:{{ theme.css_generic_link_color }};
}
a:hover {
color:{{ theme.css_generic_link_hover_color }};
}
.button, input[type=submit], input[type=button], .submit-row input, a.button {
background:{{ theme.css_save_button_background_color }};
color:{{ theme.css_save_button_text_color }};
}
.button:active, input[type=submit]:active, input[type=button]:active,
.button:focus, input[type=submit]:focus, input[type=button]:focus,
.button:hover, input[type=submit]:hover, input[type=button]:hover {
background:{{ theme.css_save_button_background_hover_color }};
color:{{ theme.css_save_button_text_color }};
outline: none;
}
.button.default, input[type=submit].default, .submit-row input.default {
background:{{ theme.css_save_button_background_color }};
color:{{ theme.css_save_button_text_color }};
outline: none;
}
.button.default:active, input[type=submit].default:active,
.button.default:focus, input[type=submit].default:focus,
.button.default:hover, input[type=submit].default:hover {
background:{{ theme.css_save_button_background_hover_color }};
color:{{ theme.css_save_button_text_color }};
outline: none;
}
.submit-row a.deletelink:link,
.submit-row a.deletelink:visited {
background:{{ theme.css_delete_button_background_color }};
color:{{ theme.css_delete_button_text_color }};
}
.submit-row a.deletelink:hover {
background:{{ theme.css_delete_button_background_hover_color }} !important;
color:{{ theme.css_delete_button_text_color }};
}
/*
#changelist table tbody tr.selected {
background-color:#FFFFCC;
}
*/
#changelist .paginator {
margin-top:-1px !important; /* merge 2 borders into 1 */
line-height:42px;
}
.paginator a,
.paginator a:link,
.paginator a:visited,
.paginator .this-page {
padding:7px 12px !important;
{% if theme.css_module_rounded_corners %}border-radius:4px;{% endif %}
}
.paginator a,
.paginator a:link,
.paginator a:visited {
background-color:#ffffff !important;
color:{{ theme.css_generic_link_color }} !important;
}
.paginator a:hover,
.paginator a:active {
background-color:#f8f8f8 !important;
color:{{ theme.css_generic_link_hover_color }} !important;
}
.paginator .this-page {
background-color:{{ theme.css_module_background_color }} !important;
color:{{ theme.css_module_link_color }} !important;
}
.paginator a,
.paginator .this-page {
margin-left:0px;
}
.paginator .this-page,
.paginator a.end {
margin-right:25px;
}
.paginator .this-page + a:not(.showall) {
margin-left:-25px !important;
}
body .paginator a.showall,
body .paginator a.showall:link,
body .paginator a.showall:visited {
margin-left:20px;
color:{{ theme.css_generic_link_color }} !important;
}
body .paginator a.showall:hover,
body .paginator a.showall:active {
color:{{ theme.css_generic_link_hover_color }} !important;
}
/* OTHER FIXES */
/* reduced width */
.login #container {
width:320px !important;
min-width:320px !important;
}
.login #content {
padding:10px 30px 10px 30px !important;
}
/* same lateral padding as in logged view */
.login #header {
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 #header #branding h1 img+span {
display:block;
}
/* login button right aligned */
.login .submit-row {
padding-left:0 !important;
text-align:right !important;
}
/* top-right buttons color on hover -> just a lighten grey */
.object-tools a:focus,
.object-tools a:hover,
.object-tools li:focus a,
.object-tools li:hover a {
background-color:#AAAAAA;
}
/* fix help text icon on newline */
.inline-group thead th {
white-space:nowrap;
}
.inline-group thead th img {
vertical-align: -2px;
margin-left: 5px;
}
form .form-row p.file-upload > a {
margin-right:10px;
}
form .form-row p.file-upload .clearable-file-input {
display:inline-block;
}
form .wide p.help {
padding-left:10px !important;
}
form .aligned.wide p.help,
form .aligned.wide ul.error-list,
form .aligned.wide ul.errorlist {
margin-left: 200px;
}
form .aligned.wide div.help {
margin-left: 210px;
}
textarea.tinymce ~ p.help {
margin-top:5px !important;
}
.aligned p.file-upload {
display:table;
}
/* begin fix issue #13 - Datetime widget broken in long inlines */
p.datetime {
white-space:nowrap;
}
/* end fix */
/* begin fix lateral padding to align text with field labels */
.module h2,
.dashboard .module caption,
.module.filtered h2,
.inline-group h2 {
padding-left:10px;
padding-right:10px;
}
/* end fix */
/* begin fix issue #11 - Inline border bottom should not be rounded */
.module h2,
.dashboard .module caption,
.module.filtered h2 {
{% if theme.css_module_rounded_corners %}
border-radius:4px;
{% endif %}
}
.inline-group h2 {
{% if theme.css_module_rounded_corners %}
border-bottom-left-radius:0;
border-bottom-right-radius:0;
{% endif %}
}
/* end fix */
.module.filtered h2 {
border-bottom-left-radius:0;
border-bottom-right-radius:0;
}
.module.filtered #changelist-filter {
border-bottom-left-radius:4px;
border-bottom-right-radius:4px;
}
.module.filtered #changelist-filter h2 {
font-size: 11px;
padding: 10px 15px;
}
.module.filtered #changelist-filter select {
background-color:#ffffff;
}
.module.filtered #changelist-filter li.selected a,
.module.filtered #changelist-filter li.selected a:hover {
color: {{ theme.css_generic_link_color }};
}
#content-related {
{% if theme.css_module_rounded_corners %}
border-radius:4px;
{% endif %}
}
/* selector chooseall / clearall color on hover -> just a lighten grey */
a.selector-chooseall:hover, a.selector-clearall:hover {
color:#888888 !important;
}
.inline-group {
overflow-x:auto;
}
/* begin fix issue #10 - Related widget broken in long tabular inline */
.inline-group .tabular .related-widget-wrapper {
white-space:nowrap;
}
/* end fix */
.inline-related h3 {
padding:6px 10px !important;
}
/* begin fix issue #12 - Inlines bad delete buttons alignement */
.inline-group .tabular thead th:last-child:not([class]):not([style]) {
text-align:right;
}
.inline-group .tabular tr td.delete {
text-align:right;
padding-right:15px;
}
.inline-group .tabular tr td.delete a.inline-deletelink {
margin-top:2px;
overflow:hidden;
text-indent:9999px;
}
/* end fix */
/*
django-modeltranslation support
https://github.com/deschler/django-modeltranslation/pull/313/commits
*/
#content h1 select {
text-transform:uppercase;
margin-left:15px;
}
.ui-tabs .ui-tabs-nav {
padding:10px 0 0 10px !important;
}
.ui-tabs .ui-tabs-nav li {
margin-left:-1px !important;
}
.ui-tabs .ui-tabs-nav li a {
outline:none;
background-color:#f8f8f8 !important;
border:1px solid #eeeeee !important;
border-bottom:none !important;
text-transform:uppercase;
padding:7px 14px 8px 14px !important;
margin-top:1px !important;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active a,
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
padding:8px 14px 8px 14px !important;
margin-top:0px !important;
margin-bottom:-1px !important;
background-color:#FFFFFF !important;
color:{{ theme.css_module_background_color }} !important;
border-bottom:1px solid #FFFFFF !important;
}
.inline-group .tabular .ui-tabs .ui-tabs-panel {
padding:8px !important;
}
#changelist .row1:not(.selected):hover,
#changelist .row2:not(.selected):hover {
background:#f9f9f9;
}
.row2 {
background:#fcfcfc;
}
.row2 .ui-tabs .ui-tabs-nav li a {
background-color:#f5f5f5 !important;
border:1px solid #ebebeb !important;
}
.row2 .ui-tabs .ui-tabs-nav li.ui-tabs-active a,
.row2 .ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
background-color:#fcfcfc !important;
border-bottom:1px solid #fcfcfc !important;
}
/*
list-filter-dropdown
*/
.list-filter-dropdown {
margin-top:10px;
margin-bottom:20px;
}
.list-filter-dropdown select {
width:90%;
margin-right:5%;
}
/*
sorl-thumbnail - improved AdminImageMixin widget layout
https://github.com/mariocesar/sorl-thumbnail
*/
a.thumbnail + input[type="checkbox"] {
margin:10px 0;
}
/*
ckeditor + light theme
https://github.com/Ikimea/ckeditor-light-theme
*/
.cke_inner, .cke_wysiwyg_frame {
border-top-left-radius: 4px !important;
border-top-right-radius: 4px !important;
border-bottom-left-radius: 4px !important;
border-bottom-right-radius: 4px !important;
}
.cke_top {
background: #f6f6f6 !important;
border-top: none;
border-top-left-radius: 4px !important;
border-top-right-radius: 4px !important;
-moz-box-shadow: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
.cke_bottom {
background: #f6f6f6 !important;
border-top: 1px solid #efefef !important;
border-bottom-left-radius: 4px !important;
border-bottom-right-radius: 4px !important;
}
.cke_source {
padding: 13px 15px !important;
box-sizing: border-box !important;
}
a.cke_button_on {
-moz-box-shadow: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
background-color: rgba(0,0,0,0.1) !important;
border-radius: 4px !important;
}
.cke_resizer {
border-color: transparent #999 transparent transparent !important;
}
/*
related modal + magnific popup customization
https://github.com/dimsemenov/Magnific-Popup
*/
.related-modal.mfp-bg {
background-color:{{ theme.related_modal_background_color }} !important;
opacity: {{ theme.related_modal_background_opacity }} !important;
}
.related-modal .mfp-content {
height: 100% !important;
overflow: hidden;
{% if theme.related_modal_rounded_corners %}
border-radius: 4px;
{% endif %}
-webkit-box-shadow: 0px 5px 30px 0px rgba(0,0,0,0.2);
-moz-box-shadow: 0px 5px 30px 0px rgba(0,0,0,0.2);
box-shadow: 0px 5px 30px 0px rgba(0,0,0,0.2);
}
.related-modal .mfp-container {
padding: 90px 90px 90px 90px !important;
}
.related-modal__nested .mfp-container {
padding: 30px 60px 30px 60px !important;
}
@media (max-width:640px){
.related-modal .mfp-container {
padding: 60px 15px 60px 15px !important;
}
.related-modal__nested .mfp-container {
padding: 30px 30px 30px 30px !important;
}
}
.related-modal #related-modal-iframe {
width: 100%;
height: 100%;
background-color: #FFFFFF;
background-repeat: no-repeat;
background-position: center center;
background-size: 30px 30px;
background-image: url("data:image/svg+xml;utf8,<?xml version='1.0' encoding='utf-8'?><svg width='30px' height='30px' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid' class='uil-ring-alt'><rect x='0' y='0' width='100' height='100' fill='none' class='bk'></rect><circle cx='50' cy='50' r='40' stroke='#eeeeee' fill='none' stroke-width='6' stroke-linecap='round'></circle><circle cx='50' cy='50' r='40' stroke='#aaaaaa' fill='none' stroke-width='6' stroke-linecap='round'><animate attributeName='stroke-dashoffset' dur='2s' repeatCount='indefinite' from='0' to='500'></animate><animate attributeName='stroke-dasharray' dur='2s' repeatCount='indefinite' values='150 100;1 250;150 100'></animate></circle></svg>");
border: none;
margin: 0 auto;
padding: 0;
display: block;
}
{% if theme.css %}
{{ theme.css|safe }}
{% endif %}
{% include "admin_interface/css/admin-interface.css" %}
{% include "admin_interface/css/admin-interface-fix.css" %}
{% include "admin_interface/css/list-filter-dropdown.css" %}
{% include "admin_interface/css/related-modal.css" %}
{% include "admin_interface/css/modeltranslation.css" %}
{% include "admin_interface/css/sorl-thumbnail.css" %}
{% include "admin_interface/css/ckeditor.css" %}
{% include "admin_interface/css/tinymce.css" %}
{% if theme.css %}
{{ theme.css|safe }}
{% endif %}
</style>
{% endblock %}
{% block extrahead %}
{% block blockbots %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}" />
{# https://github.com/elky/django-flat-responsive#important-note #}
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/responsive.css' %}" />
{% get_admin_interface_theme as theme %}
{% if theme.related_modal_active %}
<link rel="stylesheet" type="text/css" href="{% static "admin_interface/magnific-popup/magnific-popup.css" %}" />
<link rel="stylesheet" type="text/css" href="{% static 'admin_interface/magnific-popup/magnific-popup.css' %}" />
<script type="text/javascript" src="{% static 'admin_interface/magnific-popup/jquery.magnific-popup.js' %}"></script>
<script type="text/javascript" src="{% static 'admin_interface/related-modal/related-modal.js' %}"></script>
{% endif %}
{% endblock %}
{% block bodyclass %}admin-interface flat-theme {% get_admin_interface_theme as theme %}{% if theme.name %}{{ theme.name|slugify }}-theme{% endif %}{% endblock %}
{% block branding %}
{% get_admin_interface_theme as theme %}
<h1 id="site-name">
{% if theme.logo_visible and theme.logo %}
<img class="logo" src="{{ theme.logo.url }}" width="{{ theme.logo.width }}" height="{{ theme.logo.height }}" />
<img class="logo" style="display:none;" src="{{ theme.logo.url }}" {% if theme.logo.width %}width="{{ theme.logo.width }}"{% endif %} {% if theme.logo.height %}height="{{ theme.logo.height }}"{% endif %} />
{% endif %}
{% if theme.title_visible %}
<span>{% if theme.title %}{% trans theme.title %}{% else %}{% trans 'Django administration' %}{% endif %}</span>
{% endif %}
</h1>
{% endblock %}
{% block bodyclass %}admin-interface flat-theme{% endblock %}
{% block blockbots %}
{{ block.super }}
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
{% endblock %}
{% block sidebar %}
{% endblock %}
{% block footer %}
{{ block.super }}
{% get_admin_interface_theme as theme %}
{% if theme.related_modal_active %}
<script type="text/javascript" src="{% static "admin_interface/magnific-popup/jquery.magnific-popup.js" %}"></script>
<script type="text/javascript" src="{% static "admin_interface/related-modal/related-modal.js" %}"></script>
{% endif %}
{% endblock %}
{% endblock %}
@@ -0,0 +1,346 @@
.admin-interface.login #container {
width:320px;
margin:90px auto;
box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
}
.admin-interface.login #content {
padding:15px 30px 10px 30px;
}
@media (max-width:767px){
.admin-interface.login #container {
margin:0px auto;
}
.admin-interface.login #content {
padding:20px 30px 30px 30px;
}
}
.admin-interface.login #header {
padding:15px 30px 10px;
line-height:30px;
}
.admin-interface.login #branding h1 {
margin-right:0;
}
.admin-interface.login #branding h1 img.logo {
max-width:100%;
margin-right:0;
}
.admin-interface.login #header #branding h1 img.logo+span {
display:block;
margin-bottom: 5px;
}
.admin-interface.login .submit-row {
padding-left:0;
text-align:right;
}
@media (max-width:767px){
.admin-interface.login .submit-row label {
display:none;
}
.admin-interface.login .submit-row {
float: left;
width: 100%;
margin-top: 20px;
margin-bottom: 30px;
}
}
.admin-interface #header {
height:auto;
min-height:40px;
}
.admin-interface #branding h1 img.logo {
max-height:100px;
margin-top:10px;
margin-bottom:10px;
margin-right:15px;
display:inline-block !important; /* override inline display:none; */
}
.admin-interface #branding h1 img.logo+span {
white-space:nowrap;
}
.admin-interface fieldset.collapse {
border: 1px solid transparent;
}
.admin-interface fieldset.collapse.collapsed a.collapse-toggle {
font-weight: bold;
text-transform: lowercase;
}
.admin-interface fieldset.collapse a.collapse-toggle {
font-weight: bold;
text-transform: lowercase;
}
/*
#changelist table tbody tr.selected {
background-color:#FFFFCC;
}
*/
.admin-interface #changelist .paginator {
margin-top:-1px; /* merge 2 borders into 1 */
line-height:42px;
}
.admin-interface .paginator a,
.admin-interface .paginator a:link,
.admin-interface .paginator a:visited,
.admin-interface .paginator .this-page {
padding:7px 12px;
}
.admin-interface .paginator a,
.admin-interface .paginator .this-page {
margin-left:0px;
}
.admin-interface .paginator .this-page,
.admin-interface .paginator a.end {
margin-right:25px;
}
.admin-interface .paginator .this-page + a:not(.showall) {
margin-left:-25px;
}
body.admin-interface .paginator a.showall,
body.admin-interface .paginator a.showall:link,
body.admin-interface .paginator a.showall:visited {
margin-left:20px;
}
/* fix help text icon on newline */
.admin-interface .inline-group thead th {
white-space:nowrap;
}
.admin-interface .inline-group thead th img {
vertical-align: -2px;
margin-left: 5px;
}
.admin-interface .aligned p.file-upload {
display:table;
}
.admin-interface form .form-row p.file-upload > a {
margin-right:20px;
}
.admin-interface form .form-row p.file-upload .clearable-file-input {
display:inline-block;
margin-left:
}
.admin-interface form .form-row p.file-upload .clearable-file-input label {
padding-bottom:0px;
margin-left:2px;
}
.admin-interface form .form-row p.file-upload > input[type="file"] {
margin-top: 0px;
}
@media (max-width:767px){
.admin-interface form .form-row p.file-upload {
width: 100%;
}
.admin-interface form .form-row p.file-upload > a {
margin-right:0px;
display: block;
white-space: pre-wrap;
word-break: break-word;
}
.admin-interface form .form-row p.file-upload .clearable-file-input {
display: block;
margin-top: 10px;
margin-bottom: -10px;
}
.admin-interface form .form-row p.file-upload > input[type="file"] {
display: block;
width: auto;
padding: 0px;
}
}
/* FIX WIDE FIELDSET HELPS / ERROR MESSAGES */
.admin-interface form .wide p.help,
.admin-interface form .wide div.help {
padding-left: 50px;
}
.admin-interface form .wide input + p.help,
.admin-interface form .wide input + div.help {
margin-left: 160px;
}
@media (max-width:767px){
.admin-interface form .form-row div.help {
display: block;
width: 100%;
}
}
.admin-interface form .wide ul.errorlist {
margin-left: 200px;
}
/* LIST FILTER */
.admin-interface .module.filtered h2 {
border-bottom-left-radius:0;
border-bottom-right-radius:0;
}
.admin-interface .module.filtered #changelist-filter {
border-bottom-left-radius:4px;
border-bottom-right-radius:4px;
}
.admin-interface .module.filtered #changelist-filter h2 {
font-size: 11px;
padding: 10px 15px;
}
/* begin fix issue #13 - Datetime widget broken in long inlines */
.admin-interface p.datetime {
white-space:nowrap;
}
/* end fix */
/* begin fix lateral padding to align text with field labels */
.admin-interface .module h2,
.admin-interface.dashboard .module caption,
.admin-interface .module.filtered h2,
.admin-interface .inline-group h2 {
padding-left:10px;
padding-right:10px;
}
/* end fix */
.admin-interface .inline-group {
overflow-x:auto;
}
/* begin fix issue #10 - Related widget broken in long tabular inline */
.admin-interface .inline-group .tabular .related-widget-wrapper {
white-space:nowrap;
}
/* end fix */
.admin-interface .inline-related h3 {
padding:6px 10px;
}
/* begin fix issue #12 - Inlines bad delete buttons alignement */
.admin-interface .inline-group .tabular thead th:last-child:not([class]):not([style]) {
text-align:right;
}
.admin-interface .inline-group .tabular tr td.delete {
text-align:right;
padding-right:15px;
}
.admin-interface .inline-group .tabular tr td.delete a.inline-deletelink {
margin-top:2px;
overflow:hidden;
text-indent:9999px;
}
/* end fix */
/* top-right buttons color on hover -> just a lighten grey */
.admin-interface .object-tools a {
color:#FFFFFF;
}
.admin-interface .object-tools a:focus,
.admin-interface .object-tools a:hover,
.admin-interface .object-tools li:focus a,
.admin-interface .object-tools li:hover a {
background-color:#AAAAAA;
}
/* fix textarea horizontal scroll on Firefox */
@media (max-width: 767px){
.admin-interface .aligned .form-row textarea {
width: 100% !important;
flex: 0 1 auto;
}
}
/* improve responsive selector */
.admin-interface .selector.stacked {
width: 480px;
margin-right: 10px;
}
.admin-interface .selector.stacked .selector-chooser {
margin-left: calc(50% - 25px);
}
@media (min-width: 767px) and (max-width: 1124px){
.admin-interface .selector {
width: 610px;
display: block;
}
.admin-interface .selector .selector-available,
.admin-interface .selector .selector-chosen {
width: 285px;
flex: 0 1 auto;
}
.admin-interface .selector .selector-filter {
display: flex;
align-items: center;
}
.admin-interface .selector .selector-filter label {
margin: 0;
}
.admin-interface .selector .selector-available input {
width: auto;
flex: 1 1;
}
.admin-interface .selector select {
width: 100%;
}
}
@media (max-width: 767px){
.admin-interface .selector.stacked {
margin-right: 0px;
}
.admin-interface .selector.stacked .selector-available select {
margin-bottom: 0px;
}
}
/* equalize selectors height by adding the height of the .selector-available filter-bar */
.admin-interface .selector:not(.stacked) .selector-chosen select {
height: calc(46px + 17.2em);
}
/* equalize horizontal and vertical select padding */
.admin-interface .selector .selector-available select,
.admin-interface .selector .selector-chosen select {
padding: 7px 10px;
}
@@ -0,0 +1,220 @@
.admin-interface #header {
background:{{ theme.css_header_background_color }};
color:{{ theme.css_header_text_color }};
}
.admin-interface #branding h1 {
color:{{ theme.css_header_title_color }};
}
.admin-interface #header #user-tools a {
color:{{ theme.css_header_link_color }};
}
.admin-interface #header #user-tools a:hover,
.admin-interface #header #user-tools a:active {
color:{{ theme.css_header_link_hover_color }};
border-bottom-color:rgba(255, 255, 255, 0.5);
}
.admin-interface .module h2,
.admin-interface .module caption,
.admin-interface .module.filtered h2 {
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
.admin-interface .module a.section:link,
.admin-interface .module a.section:visited {
color:{{ theme.css_module_link_color }};
}
.admin-interface .module a.section:active,
.admin-interface .module a.section:hover {
color:{{ theme.css_module_link_hover_color }};
}
.admin-interface div.breadcrumbs {
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
.admin-interface div.breadcrumbs a {
color:{{ theme.css_module_link_color }};
}
.admin-interface div.breadcrumbs a:active,
.admin-interface div.breadcrumbs a:focus,
.admin-interface div.breadcrumbs a:hover {
color:{{ theme.css_module_link_hover_color }};
}
.admin-interface fieldset.collapse.collapsed a.collapse-toggle {
color:{{ theme.css_generic_link_color }};
}
.admin-interface fieldset.collapse.collapsed a.collapse-toggle:hover,
.admin-interface fieldset.collapse.collapsed a.collapse-toggle:active {
color:{{ theme.css_generic_link_hover_color }};
}
.admin-interface fieldset.collapse a.collapse-toggle {
color:{{ theme.css_module_link_color }};
}
.admin-interface fieldset.collapse a.collapse-toggle:hover,
.admin-interface fieldset.collapse a.collapse-toggle:active {
color:{{ theme.css_module_link_hover_color }};
}
.admin-interface .inline-group h2 {
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
.admin-interface .selector .selector-chosen h2 {
border-color:{{ theme.css_module_background_color }};
background:{{ theme.css_module_background_color }};
color:{{ theme.css_module_text_color }};
}
.admin-interface .selector .selector-available h2,
.admin-interface .selector .selector-chosen h2 {
{% if theme.css_module_rounded_corners %}
border-bottom-left-radius:0;
border-bottom-right-radius:0;
{% endif %}
}
.admin-interface .selector a.selector-chooseall:focus,
.admin-interface .selector a.selector-chooseall:hover,
.admin-interface .selector a.selector-clearall:focus,
.admin-interface .selector a.selector-clearall:hover {
color:{{ theme.css_generic_link_hover_color }};
}
.admin-interface a:link,
.admin-interface a:visited {
color:{{ theme.css_generic_link_color }};
}
.admin-interface a:hover {
color:{{ theme.css_generic_link_hover_color }};
}
.admin-interface .button,
.admin-interface input[type=submit],
.admin-interface input[type=button],
.admin-interface .submit-row input,
.admin-interface a.button {
background:{{ theme.css_save_button_background_color }};
color:{{ theme.css_save_button_text_color }};
}
.admin-interface .button:active,
.admin-interface .button:focus,
.admin-interface .button:hover,
.admin-interface input[type=submit]:active,
.admin-interface input[type=submit]:focus,
.admin-interface input[type=submit]:hover,
.admin-interface input[type=button]:active,
.admin-interface input[type=button]:focus,
.admin-interface input[type=button]:hover {
background:{{ theme.css_save_button_background_hover_color }};
color:{{ theme.css_save_button_text_color }};
outline: none;
}
.admin-interface .button.default,
.admin-interface input[type=submit].default,
.admin-interface .submit-row input.default {
background:{{ theme.css_save_button_background_color }};
color:{{ theme.css_save_button_text_color }};
outline: none;
}
.admin-interface .button.default:active,
.admin-interface .button.default:focus,
.admin-interface .button.default:hover,
.admin-interface input[type=submit].default:active,
.admin-interface input[type=submit].default:focus,
.admin-interface input[type=submit].default:hover {
background:{{ theme.css_save_button_background_hover_color }};
color:{{ theme.css_save_button_text_color }};
outline: none;
}
.admin-interface .submit-row a.deletelink:link,
.admin-interface .submit-row a.deletelink:visited {
background:{{ theme.css_delete_button_background_color }};
color:{{ theme.css_delete_button_text_color }};
}
.admin-interface .submit-row a.deletelink:hover {
background:{{ theme.css_delete_button_background_hover_color }};
color:{{ theme.css_delete_button_text_color }};
}
.admin-interface .paginator a,
.admin-interface .paginator a:link,
.admin-interface .paginator a:visited,
.admin-interface .paginator .this-page {
{% if theme.css_module_rounded_corners %}border-radius:4px;{% endif %}
}
.admin-interface .paginator a,
.admin-interface .paginator a:link,
.admin-interface .paginator a:visited {
background-color:#FFFFFF;
color:{{ theme.css_generic_link_color }};
}
.admin-interface .paginator a:hover,
.admin-interface .paginator a:active {
background-color:#F8F8F8;
color:{{ theme.css_generic_link_hover_color }};
}
.admin-interface .paginator .this-page {
background-color:{{ theme.css_module_background_color }};
color:{{ theme.css_module_link_color }};
}
.admin-interface .paginator a.showall,
.admin-interface .paginator a.showall:link,
.admin-interface .paginator a.showall:visited {
color:{{ theme.css_generic_link_color }};
}
.admin-interface .paginator a.showall:hover,
.admin-interface .paginator a.showall:active {
color:{{ theme.css_generic_link_hover_color }};
}
.admin-interface .module.filtered #changelist-filter li.selected a,
.admin-interface .module.filtered #changelist-filter li.selected a:hover {
color: {{ theme.css_generic_link_color }};
}
/* begin fix issue #11 - Inline border bottom should not be rounded */
.admin-interface .module h2,
.admin-interface.dashboard .module caption,
.admin-interface .module.filtered h2 {
{% if theme.css_module_rounded_corners %}
border-radius:4px;
{% endif %}
}
.admin-interface .inline-group h2 {
{% if theme.css_module_rounded_corners %}
border-bottom-left-radius:0;
border-bottom-right-radius:0;
{% endif %}
}
/* end fix */
.admin-interface #content-related {
{% if theme.css_module_rounded_corners %}
border-radius:4px;
{% endif %}
}
@@ -0,0 +1,120 @@
/*
ckeditor + light theme
https://github.com/Ikimea/ckeditor-light-theme
*/
.admin-interface .cke {
border: none;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.admin-interface .cke_inner,
.admin-interface .cke_wysiwyg_frame {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.admin-interface .cke_inner {
border: 1px solid #CCCCCC;
}
.admin-interface .cke_chrome {
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
.admin-interface .cke_top {
background: #f8f8f8;
border-top: none;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom: 1px solid #EEEEEE;
padding-left: 10px;
padding-right: 10px;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
.admin-interface .cke_toolgroup {
background: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
.admin-interface .cke_bottom {
background: #f8f8f8;
border-top: 1px solid #EEEEEE;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
.admin-interface .cke_source {
padding: 13px 15px;
box-sizing: border-box;
}
.admin-interface a.cke_button,
.admin-interface a.cke_button:active,
.admin-interface a.cke_button:hover,
.admin-interface a.cke_button:focus {
box-shadow: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
background-image: none;
border-radius: 4px;
border: none;
}
.admin-interface a.cke_button:active,
.admin-interface a.cke_button:hover,
.admin-interface a.cke_button:focus {
background-color: #E8E8E8 !important;
}
.admin-interface a.cke_button.cke_button_on {
background-color: #CCCCCC !important;
}
.admin-interface a.cke_button.cke_button_disabled {
background-color: transparent !important;
}
.admin-interface .cke_resizer {
border-color: transparent #666666 transparent transparent;
}
@media (max-width: 767px){
.django-ckeditor-widget {
width: 100% !important;
}
.admin-interface .cke {
width: 100% !important;
}
.admin-interface .cke_top {
padding-left: 10px;
padding-right: 10px;
}
.admin-interface .cke_toolbar {
height: auto;
}
.admin-interface .cke_contents {
height: auto;
}
}
@@ -0,0 +1,14 @@
/*
list-filter-dropdown
*/
.admin-interface .list-filter-dropdown {
margin-top:10px;
margin-bottom:20px;
}
.admin-interface .list-filter-dropdown select {
background-color:#FFFFFF;
width:90%;
margin-right:5%;
}
@@ -0,0 +1,66 @@
/*
django-modeltranslation support
https://github.com/deschler/django-modeltranslation/pull/313/commits
*/
.admin-interface #content h1 select {
text-transform:uppercase;
margin-left:15px;
}
.admin-interface .ui-tabs .ui-tabs-nav {
padding:10px 0 0 10px;
}
.admin-interface .ui-tabs .ui-tabs-nav li {
margin-left:-1px;
}
.admin-interface .ui-tabs .ui-tabs-nav li a {
outline:none;
background-color:#f8f8f8;
border:1px solid #eeeeee;
border-bottom:none;
text-transform:uppercase;
padding:7px 14px 8px 14px;
margin-top:1px;
}
.admin-interface .ui-tabs .ui-tabs-nav li.ui-tabs-active a,
.admin-interface .ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
padding:8px 14px 8px 14px;
margin-top:0px;
margin-bottom:-1px;
background-color:#FFFFFF;
color:{{ theme.css_module_background_color }};
border-bottom:1px solid #FFFFFF;
}
.admin-interface .inline-group .tabular .ui-tabs .ui-tabs-panel {
padding:8px;
}
.admin-interface #changelist .row1:not(.selected):hover,
.admin-interface #changelist .row2:not(.selected):hover {
background:#f9f9f9;
}
.admin-interface .row2 {
background:#fcfcfc;
}
.admin-interface .row2 .ui-tabs .ui-tabs-nav li a {
background-color:#f5f5f5;
border:1px solid #ebebeb;
}
.admin-interface .row2 .ui-tabs .ui-tabs-nav li.ui-tabs-active a,
.admin-interface .row2 .ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
background-color:#fcfcfc;
border-bottom:1px solid #fcfcfc;
}
@@ -0,0 +1,50 @@
/*
related modal + magnific popup customization
https://github.com/dimsemenov/Magnific-Popup
*/
.admin-interface .related-modal.mfp-bg {
background-color:{{ theme.related_modal_background_color }};
opacity: {{ theme.related_modal_background_opacity }};
}
.admin-interface .related-modal .mfp-content {
height: 100%;
overflow: hidden;
{% if theme.related_modal_rounded_corners %}
border-radius: 4px;
{% endif %}
-webkit-box-shadow: 0px 5px 30px 0px rgba(0,0,0,0.2);
-moz-box-shadow: 0px 5px 30px 0px rgba(0,0,0,0.2);
box-shadow: 0px 5px 30px 0px rgba(0,0,0,0.2);
}
.admin-interface .related-modal .mfp-container {
padding: 90px 90px 90px 90px;
}
.admin-interface .related-modal__nested .mfp-container {
padding: 30px 60px 30px 60px;
}
@media (max-width:640px){
.admin-interface .related-modal .mfp-container {
padding: 60px 15px 60px 15px;
}
.admin-interface .related-modal__nested .mfp-container {
padding: 30px 30px 30px 30px;
}
}
.admin-interface .related-modal #related-modal-iframe {
width: 100%;
height: 100%;
background-color: #FFFFFF;
background-repeat: no-repeat;
background-position: center center;
background-size: 30px 30px;
background-image: url("data:image/svg+xml;utf8,<?xml version='1.0' encoding='utf-8'?><svg width='30px' height='30px' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid' class='uil-ring-alt'><rect x='0' y='0' width='100' height='100' fill='none' class='bk'></rect><circle cx='50' cy='50' r='40' stroke='#eeeeee' fill='none' stroke-width='6' stroke-linecap='round'></circle><circle cx='50' cy='50' r='40' stroke='#aaaaaa' fill='none' stroke-width='6' stroke-linecap='round'><animate attributeName='stroke-dashoffset' dur='2s' repeatCount='indefinite' from='0' to='500'></animate><animate attributeName='stroke-dasharray' dur='2s' repeatCount='indefinite' values='150 100;1 250;150 100'></animate></circle></svg>");
border: none;
margin: 0 auto;
padding: 0;
display: block;
}
@@ -0,0 +1,67 @@
/*
sorl-thumbnail - improved AdminImageMixin widget layout
https://github.com/mariocesar/sorl-thumbnail
*/
.admin-interface a.thumbnail + a {
font-weight: normal;
}
.admin-interface a.thumbnail + a + input[type="checkbox"] {
margin: 10px 0px 10px 18px;
}
@media (max-width: 767px){
.admin-interface a.thumbnail + a {
display: block;
margin-top: 3px;
white-space: pre-wrap;
word-break: break-word;
}
.admin-interface a.thumbnail + a + input[type="checkbox"] {
margin: 15px 0;
}
}
.admin-interface a.thumbnail ~ label {
color: #333;
font-size: 11px;
display: inline;
float: none;
margin-left: 2px;
}
.admin-interface.change-form div[style="float:left"] {
font-size: 11px;
font-weight: bold;
color: #666;
margin-bottom: 5px;
}
@media (max-width: 767px){
.admin-interface.change-form div[style="float:left"] {
font-size: 12px;
width: 100%;
}
}
.admin-interface .aligned .form-row a.thumbnail ~ input[type="file"] {
margin-top: 0px;
}
@media (max-width:767px){
.admin-interface .aligned .form-row a.thumbnail ~ input[type="file"] {
width: auto;
padding: 0px;
display: block;
margin-top: 3px;
}
.admin-interface div[style="float:left"] {
margin-bottom: 0px;
}
.admin-interface div[style="float:left"] + div.help {
margin-top: 0px !important;
}
}
@@ -0,0 +1,3 @@
.admin-interface textarea.tinymce ~ p.help {
margin-top:5px !important;
}
+1 -1
View File
@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-
__version__ = '0.4.0'
__version__ = '0.4.4'
+18
View File
@@ -66,6 +66,24 @@ class AdminInterfaceTestCase(TestCase):
Theme.objects.filter( pk = Theme.get_active_theme().pk ).delete()
self.assertEqual( Theme.get_active_theme().pk, 1 )
def test_default_theme_logo_created_if_deleted(self):
Theme.objects.all().delete()
theme = Theme.get_active_theme()
theme.logo = ''
theme.save()
theme = Theme.get_active_theme()
self.assertNotEqual( theme.logo, None )
def test_default_theme_logo_not_created_if_not_deleted(self):
Theme.objects.all().delete()
theme = Theme.get_active_theme()
self.assertNotEqual( theme.logo, None )
logo_url = theme.logo.url
theme = Theme.get_active_theme()
self.assertEqual( theme.logo.url, logo_url )
def test_last_theme_activated_on_multiple_themes_created(self):
Theme.objects.all().delete()