Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 60f451d073 | |||
| 4c182157eb | |||
| dd9de6ba42 | |||
| a09e13fb00 | |||
| c3cf8e4d10 | |||
| a6ae4230f6 | |||
| 07dc59747d | |||
| 690d28dd8c | |||
| 8db8528542 | |||
| cfac48db5d | |||
| f20d64c99f | |||
| 4cf01aa1df | |||
| 875269e314 | |||
| 775f1cf42b | |||
| cc0474940f | |||
| 97896e3690 | |||
| 6a723e5515 | |||
| fdf3b418f9 | |||
| 49538ed582 | |||
| c784a083f3 | |||
| d1c912e875 | |||
| e9e950dda3 | |||
| 3c4ea399e2 | |||
| a28fe1c5e0 | |||
| c07a846374 | |||
| f0126fb407 | |||
| 869ae626da | |||
| a6bdb2b36d | |||
| aa18e19625 | |||
| a35f8d0fb7 | |||
| d29515c4ae | |||
| 00f60c222d | |||
| ff2d05e44c | |||
| 6e5cbf3a2c | |||
| 55b365b2e4 |
+22
@@ -0,0 +1,22 @@
|
||||
language: python
|
||||
python: 3.5
|
||||
env:
|
||||
- TOX_ENV=py27-17
|
||||
- TOX_ENV=py27-18
|
||||
- TOX_ENV=py27-19
|
||||
- TOX_ENV=py27-110
|
||||
- TOX_ENV=py34-17
|
||||
- TOX_ENV=py34-18
|
||||
- TOX_ENV=py34-19
|
||||
- TOX_ENV=py34-110
|
||||
- TOX_ENV=py35-18
|
||||
- TOX_ENV=py35-19
|
||||
- TOX_ENV=py35-110
|
||||
#- TOX_ENV=py36-18
|
||||
#- TOX_ENV=py36-19
|
||||
#- TOX_ENV=py36-110
|
||||
install:
|
||||
- pip install tox
|
||||
script:
|
||||
- tox -e $TOX_ENV
|
||||
sudo: false
|
||||
@@ -1,13 +1,25 @@
|
||||
#django-admin-interface
|
||||
[](https://travis-ci.org/fabiocaccamo/django-admin-interface)
|
||||
[](https://codecov.io/gh/fabiocaccamo/django-admin-interface)
|
||||
[](https://badge.fury.io/py/django-admin-interface)
|
||||
[](https://img.shields.io/pypi/pyversions/django-admin-interface.svg)
|
||||
[](https://img.shields.io/pypi/l/django-admin-interface.svg)
|
||||
|
||||
# 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.6, Python 2.7, Python 3.4
|
||||
- Django 1.6.5 through Django 1.10
|
||||
## Requirements
|
||||
- Python 2.7, 3.4, 3.5, 3.6
|
||||
- Django 1.7, 1.8, 1.9, 1.10, 1.11
|
||||
|
||||
##Installation
|
||||
## Installation
|
||||
- Run `pip install django-admin-interface`
|
||||
- Add `admin_interface`, `flat_responsive`, `flat` and `colorfield` to `settings.INSTALLED_APPS` **before** `django.contrib.admin`
|
||||
```python
|
||||
@@ -22,27 +34,34 @@ 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
|
||||
|
||||
##Screenshots
|
||||
######Admin login
|
||||
#### 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
|
||||

|
||||
---
|
||||
######Admin dashboard
|
||||
###### Admin dashboard
|
||||

|
||||
---
|
||||
######Admin themes management
|
||||
###### Admin themes management
|
||||

|
||||
---
|
||||
######Admin theme customization
|
||||
###### Admin theme customization
|
||||

|
||||
|
||||
####Thanks
|
||||
#### Thanks
|
||||
- [django-flat-theme](https://github.com/elky/django-flat-theme/)
|
||||
- [django-flat-responsive](https://github.com/elky/django-flat-responsive)
|
||||
- [django-colorfield](https://github.com/jaredly/django-colorfield/)
|
||||
|
||||
##License
|
||||
## License
|
||||
Released under [MIT License](LICENSE).
|
||||
|
||||
@@ -43,7 +43,11 @@ class ThemeAdmin(admin.ModelAdmin):
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_delete_button_background_color', 'css_delete_button_background_hover_color', 'css_delete_button_text_color', )
|
||||
}),
|
||||
('Extras', {
|
||||
('Related Modal', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('related_modal_active', 'related_modal_background_color', 'related_modal_background_opacity', 'related_modal_rounded_corners', )
|
||||
}),
|
||||
('List Filter', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('list_filter_dropdown', )
|
||||
}),
|
||||
|
||||
@@ -1 +1 @@
|
||||
[{"fields": {"css_save_button_text_color": "#FFFFFF", "css_module_link_hover_color": "#C9F0DD", "css_delete_button_text_color": "#FFFFFF", "list_filter_dropdown": false, "css_save_button_background_hover_color": "#0C3C26", "css_module_rounded_corners": true, "logo": "", "css_module_background_color": "#44B78B", "title": "Django administration", "css_header_link_color": "#FFFFFF", "css_delete_button_background_hover_color": "#A41515", "css": "", "css_module_link_color": "#FFFFFF", "css_module_text_color": "#FFFFFF", "css_generic_link_hover_color": "#156641", "css_save_button_background_color": "#0C4B33", "logo_visible": true, "active": false, "css_header_background_color": "#0C4B33", "name": "Django", "css_generic_link_color": "#0C3C26", "css_delete_button_background_color": "#BA2121", "css_header_text_color": "#44B78B", "css_header_link_hover_color": "#C9F0DD", "css_header_title_color": "#F5DD5D", "title_visible": true}, "model": "admin_interface.theme", "pk": 1}]
|
||||
[{"model": "admin_interface.theme", "pk": 1, "fields": {"name": "Django", "active": true, "title": "Django administration", "title_visible": true, "logo": "", "logo_visible": true, "css_header_background_color": "#0C4B33", "css_header_title_color": "#F5DD5D", "css_header_text_color": "#44B78B", "css_header_link_color": "#FFFFFF", "css_header_link_hover_color": "#C9F0DD", "css_module_background_color": "#44B78B", "css_module_text_color": "#FFFFFF", "css_module_link_color": "#FFFFFF", "css_module_link_hover_color": "#C9F0DD", "css_module_rounded_corners": true, "css_generic_link_color": "#0C3C26", "css_generic_link_hover_color": "#156641", "css_save_button_background_color": "#0C4B33", "css_save_button_background_hover_color": "#0C3C26", "css_save_button_text_color": "#FFFFFF", "css_delete_button_background_color": "#BA2121", "css_delete_button_background_hover_color": "#A41515", "css_delete_button_text_color": "#FFFFFF", "css": "", "related_modal_active": true, "related_modal_background_color": "#000000", "related_modal_background_opacity": 0.2, "related_modal_rounded_corners": true, "list_filter_dropdown": false}}]
|
||||
@@ -0,0 +1,40 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import colorfield.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='list_filter_dropdown',
|
||||
field=models.BooleanField(default=False, verbose_name=b'use dropdown'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='related_modal_active',
|
||||
field=models.BooleanField(default=True, verbose_name=b'active'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='related_modal_background_color',
|
||||
field=colorfield.fields.ColorField(blank=True, default=b'#000000', help_text=b'#000000', max_length=10, verbose_name=b'background color'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='related_modal_background_opacity',
|
||||
field=models.FloatField(choices=[(0.1, b'10%'), (0.2, b'20%'), (0.3, b'30%'), (0.4, b'40%'), (0.5, b'50%'), (0.6, b'60%'), (0.7, b'70%'), (0.8, b'80%'), (0.9, b'90%')], default=0.2, help_text=b'20%', verbose_name=b'background opacity'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='related_modal_rounded_corners',
|
||||
field=models.BooleanField(default=True, verbose_name=b'rounded corners'),
|
||||
),
|
||||
]
|
||||
+47
-19
@@ -13,30 +13,37 @@ class Theme(models.Model):
|
||||
|
||||
@staticmethod
|
||||
def post_migrate_handler(sender, **kwargs):
|
||||
Theme.get_or_create_default_theme()
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def post_delete_handler(instance, **kwargs):
|
||||
Theme.get_or_create_default_theme()
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def post_save_handler(instance, created, **kwargs):
|
||||
instance.set_active(instance.active)
|
||||
Theme.get_or_create_default_theme()
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def get_or_create_default_theme():
|
||||
def get_active_theme():
|
||||
|
||||
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 })
|
||||
objs_active_qs = Theme.objects.filter( active = True )
|
||||
|
||||
if not obj.logo:
|
||||
obj.set_default_logo()
|
||||
#get or create default theme and enforce default logo if deleted
|
||||
default_obj_active = (objs_active_qs.count() == 0)
|
||||
default_obj, default_obj_created = Theme.objects.get_or_create(pk = '1', defaults = { 'active':default_obj_active })
|
||||
|
||||
if not obj_created and obj_active:
|
||||
obj.set_active(True)
|
||||
if not default_obj_created and default_obj_active:
|
||||
default_obj.set_active()
|
||||
|
||||
return (obj, obj_created, )
|
||||
default_obj.set_default_logo()
|
||||
|
||||
obj = objs_active_qs.last()
|
||||
objs_active_count = objs_active_qs.count()
|
||||
|
||||
if objs_active_count > 1:
|
||||
obj.set_active()
|
||||
|
||||
return obj
|
||||
|
||||
name = models.CharField( max_length = 50, default = 'Django' )
|
||||
active = models.BooleanField( default = True )
|
||||
@@ -72,26 +79,46 @@ class Theme(models.Model):
|
||||
|
||||
css = models.TextField( blank = True )
|
||||
|
||||
list_filter_dropdown = models.BooleanField( default = False )
|
||||
related_modal_active = models.BooleanField( default = True, verbose_name = 'active' )
|
||||
related_modal_background_color = ColorField( blank = True, default = '#000000', help_text = '#000000', verbose_name = 'background color' )
|
||||
related_modal_background_opacity_choices = (
|
||||
(0.1, '10%', ),
|
||||
(0.2, '20%', ),
|
||||
(0.3, '30%', ),
|
||||
(0.4, '40%', ),
|
||||
(0.5, '50%', ),
|
||||
(0.6, '60%', ),
|
||||
(0.7, '70%', ),
|
||||
(0.8, '80%', ),
|
||||
(0.9, '90%', ),
|
||||
)
|
||||
related_modal_background_opacity = models.FloatField( choices = related_modal_background_opacity_choices, default = 0.2, help_text = '20%', verbose_name = 'background opacity' )
|
||||
related_modal_rounded_corners = models.BooleanField( default = True, verbose_name = 'rounded corners' )
|
||||
|
||||
list_filter_dropdown = models.BooleanField( default = False, verbose_name = 'use dropdown' )
|
||||
|
||||
def set_active(self, value):
|
||||
def set_active(self):
|
||||
|
||||
if value:
|
||||
Theme.objects.exclude(pk = self.pk).update(active = False)
|
||||
Theme.objects.filter(pk = self.pk).update(active = True)
|
||||
else:
|
||||
Theme.objects.filter(pk = self.pk).update(active = False)
|
||||
Theme.objects.exclude( pk = self.pk ).update( active = False )
|
||||
|
||||
if not self.active:
|
||||
self.active = True
|
||||
self.save()
|
||||
|
||||
def set_default_logo(self):
|
||||
|
||||
if self.logo and os.path.isfile(self.logo.path):
|
||||
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()
|
||||
|
||||
@@ -109,3 +136,4 @@ class Theme(models.Model):
|
||||
|
||||
post_delete.connect(Theme.post_delete_handler, sender = Theme)
|
||||
post_save.connect(Theme.post_save_handler, sender = Theme)
|
||||
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'Theme'
|
||||
db.create_table(u'admin_interface_theme', (
|
||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('name', self.gf('django.db.models.fields.CharField')(default='Django', max_length=50)),
|
||||
('active', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('title', self.gf('django.db.models.fields.CharField')(default='Django administration', max_length=50, blank=True)),
|
||||
('title_visible', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('logo', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)),
|
||||
('logo_visible', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('css_header_background_color', self.gf('colorfield.fields.ColorField')(default='#0C4B33', max_length=10, blank=True)),
|
||||
('css_header_title_color', self.gf('colorfield.fields.ColorField')(default='#F5DD5D', max_length=10, blank=True)),
|
||||
('css_header_text_color', self.gf('colorfield.fields.ColorField')(default='#44B78B', max_length=10, blank=True)),
|
||||
('css_header_link_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_header_link_hover_color', self.gf('colorfield.fields.ColorField')(default='#C9F0DD', max_length=10, blank=True)),
|
||||
('css_module_background_color', self.gf('colorfield.fields.ColorField')(default='#44B78B', max_length=10, blank=True)),
|
||||
('css_module_text_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_module_link_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_module_link_hover_color', self.gf('colorfield.fields.ColorField')(default='#C9F0DD', max_length=10, blank=True)),
|
||||
('css_module_rounded_corners', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('css_generic_link_color', self.gf('colorfield.fields.ColorField')(default='#0C3C26', max_length=10, blank=True)),
|
||||
('css_generic_link_hover_color', self.gf('colorfield.fields.ColorField')(default='#156641', max_length=10, blank=True)),
|
||||
('css_save_button_background_color', self.gf('colorfield.fields.ColorField')(default='#0C4B33', max_length=10, blank=True)),
|
||||
('css_save_button_background_hover_color', self.gf('colorfield.fields.ColorField')(default='#0C3C26', max_length=10, blank=True)),
|
||||
('css_save_button_text_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_delete_button_background_color', self.gf('colorfield.fields.ColorField')(default='#BA2121', max_length=10, blank=True)),
|
||||
('css_delete_button_background_hover_color', self.gf('colorfield.fields.ColorField')(default='#A41515', max_length=10, blank=True)),
|
||||
('css_delete_button_text_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css', self.gf('django.db.models.fields.TextField')(blank=True)),
|
||||
('list_filter_dropdown', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
))
|
||||
db.send_create_signal('admin_interface', ['Theme'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'Theme'
|
||||
db.delete_table(u'admin_interface_theme')
|
||||
|
||||
|
||||
models = {
|
||||
'admin_interface.theme': {
|
||||
'Meta': {'object_name': 'Theme'},
|
||||
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'css': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'css_delete_button_background_color': ('colorfield.fields.ColorField', [], {'default': "'#BA2121'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_delete_button_background_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#A41515'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_delete_button_text_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_generic_link_color': ('colorfield.fields.ColorField', [], {'default': "'#0C3C26'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_generic_link_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#156641'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_background_color': ('colorfield.fields.ColorField', [], {'default': "'#0C4B33'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_link_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_link_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#C9F0DD'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_text_color': ('colorfield.fields.ColorField', [], {'default': "'#44B78B'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_title_color': ('colorfield.fields.ColorField', [], {'default': "'#F5DD5D'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_background_color': ('colorfield.fields.ColorField', [], {'default': "'#44B78B'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_link_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_link_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#C9F0DD'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_rounded_corners': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'css_module_text_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_save_button_background_color': ('colorfield.fields.ColorField', [], {'default': "'#0C4B33'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_save_button_background_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#0C3C26'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_save_button_text_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'list_filter_dropdown': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'logo': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
|
||||
'logo_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'default': "'Django'", 'max_length': '50'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'default': "'Django administration'", 'max_length': '50', 'blank': 'True'}),
|
||||
'title_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['admin_interface']
|
||||
@@ -0,0 +1,35 @@
|
||||
/*global opener */
|
||||
(function() {
|
||||
'use strict';
|
||||
var windowRef = window;
|
||||
var windowName = windowRef.name;
|
||||
var widgetName = windowName.replace(/^(change|add|delete|lookup)_/, '');
|
||||
//var windowNames = windowName.split('____');
|
||||
//var widgetName = windowNames[(windowNames.length - 1)];
|
||||
//widgetName = widgetName.replace(/^(change|add|delete|lookup)_/, '');
|
||||
//console.log('dismiss modal and update widget with id: "' + widgetName + '"');
|
||||
var modalRef = {};
|
||||
var openerRef = windowRef.opener;
|
||||
if(!openerRef){
|
||||
openerRef = windowRef.parent;
|
||||
modalRef = {
|
||||
name: openerRef.id_to_windowname(widgetName),
|
||||
close: function(){
|
||||
openerRef.dismissRelatedObjectModal();
|
||||
}
|
||||
};
|
||||
}
|
||||
var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse);
|
||||
switch(initData.action){
|
||||
case 'change':
|
||||
openerRef.dismissChangeRelatedObjectPopup(modalRef, initData.value, initData.obj, initData.new_value);
|
||||
break;
|
||||
case 'delete':
|
||||
openerRef.dismissDeleteRelatedObjectPopup(modalRef, initData.value);
|
||||
break;
|
||||
default:
|
||||
openerRef.dismissAddRelatedObjectPopup(modalRef, initData.value, initData.obj);
|
||||
break;
|
||||
}
|
||||
})();
|
||||
|
||||
+1867
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,351 @@
|
||||
/* Magnific Popup CSS */
|
||||
.mfp-bg {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 1042;
|
||||
overflow: hidden;
|
||||
position: fixed;
|
||||
background: #0b0b0b;
|
||||
opacity: 0.8; }
|
||||
|
||||
.mfp-wrap {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 1043;
|
||||
position: fixed;
|
||||
outline: none !important;
|
||||
-webkit-backface-visibility: hidden; }
|
||||
|
||||
.mfp-container {
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
padding: 0 8px;
|
||||
box-sizing: border-box; }
|
||||
|
||||
.mfp-container:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
vertical-align: middle; }
|
||||
|
||||
.mfp-align-top .mfp-container:before {
|
||||
display: none; }
|
||||
|
||||
.mfp-content {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin: 0 auto;
|
||||
text-align: left;
|
||||
z-index: 1045; }
|
||||
|
||||
.mfp-inline-holder .mfp-content,
|
||||
.mfp-ajax-holder .mfp-content {
|
||||
width: 100%;
|
||||
cursor: auto; }
|
||||
|
||||
.mfp-ajax-cur {
|
||||
cursor: progress; }
|
||||
|
||||
.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
|
||||
cursor: -moz-zoom-out;
|
||||
cursor: -webkit-zoom-out;
|
||||
cursor: zoom-out; }
|
||||
|
||||
.mfp-zoom {
|
||||
cursor: pointer;
|
||||
cursor: -webkit-zoom-in;
|
||||
cursor: -moz-zoom-in;
|
||||
cursor: zoom-in; }
|
||||
|
||||
.mfp-auto-cursor .mfp-content {
|
||||
cursor: auto; }
|
||||
|
||||
.mfp-close,
|
||||
.mfp-arrow,
|
||||
.mfp-preloader,
|
||||
.mfp-counter {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none; }
|
||||
|
||||
.mfp-loading.mfp-figure {
|
||||
display: none; }
|
||||
|
||||
.mfp-hide {
|
||||
display: none !important; }
|
||||
|
||||
.mfp-preloader {
|
||||
color: #CCC;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: auto;
|
||||
text-align: center;
|
||||
margin-top: -0.8em;
|
||||
left: 8px;
|
||||
right: 8px;
|
||||
z-index: 1044; }
|
||||
.mfp-preloader a {
|
||||
color: #CCC; }
|
||||
.mfp-preloader a:hover {
|
||||
color: #FFF; }
|
||||
|
||||
.mfp-s-ready .mfp-preloader {
|
||||
display: none; }
|
||||
|
||||
.mfp-s-error .mfp-content {
|
||||
display: none; }
|
||||
|
||||
button.mfp-close,
|
||||
button.mfp-arrow {
|
||||
overflow: visible;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
display: block;
|
||||
outline: none;
|
||||
padding: 0;
|
||||
z-index: 1046;
|
||||
box-shadow: none;
|
||||
touch-action: manipulation; }
|
||||
|
||||
button::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border: 0; }
|
||||
|
||||
.mfp-close {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
line-height: 44px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
opacity: 0.65;
|
||||
padding: 0 0 18px 10px;
|
||||
color: #FFF;
|
||||
font-style: normal;
|
||||
font-size: 28px;
|
||||
font-family: Arial, Baskerville, monospace; }
|
||||
.mfp-close:hover,
|
||||
.mfp-close:focus {
|
||||
opacity: 1; }
|
||||
.mfp-close:active {
|
||||
top: 1px; }
|
||||
|
||||
.mfp-close-btn-in .mfp-close {
|
||||
color: #333; }
|
||||
|
||||
.mfp-image-holder .mfp-close,
|
||||
.mfp-iframe-holder .mfp-close {
|
||||
color: #FFF;
|
||||
right: -6px;
|
||||
text-align: right;
|
||||
padding-right: 6px;
|
||||
width: 100%; }
|
||||
|
||||
.mfp-counter {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
color: #CCC;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
white-space: nowrap; }
|
||||
|
||||
.mfp-arrow {
|
||||
position: absolute;
|
||||
opacity: 0.65;
|
||||
margin: 0;
|
||||
top: 50%;
|
||||
margin-top: -55px;
|
||||
padding: 0;
|
||||
width: 90px;
|
||||
height: 110px;
|
||||
-webkit-tap-highlight-color: transparent; }
|
||||
.mfp-arrow:active {
|
||||
margin-top: -54px; }
|
||||
.mfp-arrow:hover,
|
||||
.mfp-arrow:focus {
|
||||
opacity: 1; }
|
||||
.mfp-arrow:before,
|
||||
.mfp-arrow:after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
margin-top: 35px;
|
||||
margin-left: 35px;
|
||||
border: medium inset transparent; }
|
||||
.mfp-arrow:after {
|
||||
border-top-width: 13px;
|
||||
border-bottom-width: 13px;
|
||||
top: 8px; }
|
||||
.mfp-arrow:before {
|
||||
border-top-width: 21px;
|
||||
border-bottom-width: 21px;
|
||||
opacity: 0.7; }
|
||||
|
||||
.mfp-arrow-left {
|
||||
left: 0; }
|
||||
.mfp-arrow-left:after {
|
||||
border-right: 17px solid #FFF;
|
||||
margin-left: 31px; }
|
||||
.mfp-arrow-left:before {
|
||||
margin-left: 25px;
|
||||
border-right: 27px solid #3F3F3F; }
|
||||
|
||||
.mfp-arrow-right {
|
||||
right: 0; }
|
||||
.mfp-arrow-right:after {
|
||||
border-left: 17px solid #FFF;
|
||||
margin-left: 39px; }
|
||||
.mfp-arrow-right:before {
|
||||
border-left: 27px solid #3F3F3F; }
|
||||
|
||||
.mfp-iframe-holder {
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px; }
|
||||
.mfp-iframe-holder .mfp-content {
|
||||
line-height: 0;
|
||||
width: 100%;
|
||||
max-width: 900px; }
|
||||
.mfp-iframe-holder .mfp-close {
|
||||
top: -40px; }
|
||||
|
||||
.mfp-iframe-scaler {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
padding-top: 56.25%; }
|
||||
.mfp-iframe-scaler iframe {
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
|
||||
background: #000; }
|
||||
|
||||
/* Main image in popup */
|
||||
img.mfp-img {
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
line-height: 0;
|
||||
box-sizing: border-box;
|
||||
padding: 40px 0 40px;
|
||||
margin: 0 auto; }
|
||||
|
||||
/* The shadow behind the image */
|
||||
.mfp-figure {
|
||||
line-height: 0; }
|
||||
.mfp-figure:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 40px;
|
||||
bottom: 40px;
|
||||
display: block;
|
||||
right: 0;
|
||||
width: auto;
|
||||
height: auto;
|
||||
z-index: -1;
|
||||
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
|
||||
background: #444; }
|
||||
.mfp-figure small {
|
||||
color: #BDBDBD;
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
line-height: 14px; }
|
||||
.mfp-figure figure {
|
||||
margin: 0; }
|
||||
|
||||
.mfp-bottom-bar {
|
||||
margin-top: -36px;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
cursor: auto; }
|
||||
|
||||
.mfp-title {
|
||||
text-align: left;
|
||||
line-height: 18px;
|
||||
color: #F3F3F3;
|
||||
word-wrap: break-word;
|
||||
padding-right: 36px; }
|
||||
|
||||
.mfp-image-holder .mfp-content {
|
||||
max-width: 100%; }
|
||||
|
||||
.mfp-gallery .mfp-image-holder .mfp-figure {
|
||||
cursor: pointer; }
|
||||
|
||||
@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
|
||||
/**
|
||||
* Remove all paddings around the image on small screen
|
||||
*/
|
||||
.mfp-img-mobile .mfp-image-holder {
|
||||
padding-left: 0;
|
||||
padding-right: 0; }
|
||||
.mfp-img-mobile img.mfp-img {
|
||||
padding: 0; }
|
||||
.mfp-img-mobile .mfp-figure:after {
|
||||
top: 0;
|
||||
bottom: 0; }
|
||||
.mfp-img-mobile .mfp-figure small {
|
||||
display: inline;
|
||||
margin-left: 5px; }
|
||||
.mfp-img-mobile .mfp-bottom-bar {
|
||||
background: rgba(0, 0, 0, 0.6);
|
||||
bottom: 0;
|
||||
margin: 0;
|
||||
top: auto;
|
||||
padding: 3px 5px;
|
||||
position: fixed;
|
||||
box-sizing: border-box; }
|
||||
.mfp-img-mobile .mfp-bottom-bar:empty {
|
||||
padding: 0; }
|
||||
.mfp-img-mobile .mfp-counter {
|
||||
right: 5px;
|
||||
top: 3px; }
|
||||
.mfp-img-mobile .mfp-close {
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
background: rgba(0, 0, 0, 0.6);
|
||||
position: fixed;
|
||||
text-align: center;
|
||||
padding: 0; } }
|
||||
|
||||
@media all and (max-width: 900px) {
|
||||
.mfp-arrow {
|
||||
-webkit-transform: scale(0.75);
|
||||
transform: scale(0.75); }
|
||||
.mfp-arrow-left {
|
||||
-webkit-transform-origin: 0;
|
||||
transform-origin: 0; }
|
||||
.mfp-arrow-right {
|
||||
-webkit-transform-origin: 100%;
|
||||
transform-origin: 100%; }
|
||||
.mfp-container {
|
||||
padding-left: 6px;
|
||||
padding-right: 6px; } }
|
||||
@@ -0,0 +1,69 @@
|
||||
if(typeof django !== 'undefined' && typeof django.jQuery !== 'undefined' )
|
||||
{
|
||||
(function($) {
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
// create the function that will close the modal
|
||||
function dismissRelatedObjectModal()
|
||||
{
|
||||
// close the popup
|
||||
$.magnificPopup.close();
|
||||
}
|
||||
|
||||
// assign the function to a global variable
|
||||
window.dismissRelatedObjectModal = dismissRelatedObjectModal;
|
||||
|
||||
// listen click events on related links
|
||||
// (:link prevents to listen click event if href is not defined)
|
||||
$('a.related-widget-wrapper-link:link').click(function(e){
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
// remove focus from clicked link
|
||||
$(this).blur();
|
||||
|
||||
// use the clicked link id as iframe name
|
||||
// it will be available as window.name in the loaded iframe
|
||||
var iframeName = $(this).attr('id');
|
||||
//var iframeName = String(window.name + '____' + $(this).attr('id'));
|
||||
//console.log('open modal with name: "' + iframeName + '"');
|
||||
|
||||
// browsers stop loading nested iframes having the same src url
|
||||
// create a random parameter and append it to the src url to prevent it
|
||||
var iframeSrcRandom = String(Math.round(Math.random() * 999999));
|
||||
var iframeSrc = $(this).attr('href') + '&_modal=' + iframeSrcRandom;
|
||||
|
||||
// build the iframe html
|
||||
//var iframeHTML = '<iframe id="related-modal" name="' + iframeName + '" src="' + iframeSrc + '"></iframe>';
|
||||
var iframeHTML = '<iframe id="related-modal-iframe" name="' + iframeName + '" src="' + iframeSrc + '"></iframe>';
|
||||
|
||||
// create the iframe jquery element
|
||||
var iframeEl = $(iframeHTML);
|
||||
|
||||
// the modal css class
|
||||
var iframeInternalModalClass = 'related-modal';
|
||||
|
||||
// if the current window is inside an iframe, it means that it is already in a modal,
|
||||
// append an additional css class to the modal to offer more customization
|
||||
if( window.top != window.self )
|
||||
{
|
||||
iframeInternalModalClass += ' related-modal__nested';
|
||||
}
|
||||
|
||||
// open the popup using magnific popup
|
||||
$.magnificPopup.open({
|
||||
mainClass: iframeInternalModalClass,
|
||||
items: {
|
||||
src: iframeEl,
|
||||
type: 'inline'
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
})(django.jQuery);
|
||||
}
|
||||
|
||||
@@ -1,567 +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">
|
||||
|
||||
{% if theme.active %}
|
||||
|
||||
#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:hover,
|
||||
.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 {
|
||||
margin-left: 200px;
|
||||
}
|
||||
|
||||
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 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 */
|
||||
|
||||
/* improve 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 {
|
||||
margin-top:10px;
|
||||
margin-bottom:20px;
|
||||
}
|
||||
|
||||
.list-filter-dropdown select {
|
||||
width:90%;
|
||||
margin-right:5%;
|
||||
}
|
||||
|
||||
|
||||
/* sorl-thumbnail - improved AdminImageMixin widget layout */
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
{% if theme.css %}
|
||||
{{ theme.css|safe }}
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
|
||||
#branding h1 img.logo {
|
||||
display:none;
|
||||
}
|
||||
|
||||
{% 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 }}
|
||||
{# 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' %}" />
|
||||
<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.active %}
|
||||
{% if theme.logo_visible and theme.logo %}
|
||||
<img class="logo" src="{{ theme.logo.url }}" width="{{ theme.logo.width }}" height="{{ theme.logo.height }}" />
|
||||
{% endif %}
|
||||
{% if theme.title_visible %}
|
||||
<span>{% if theme.title %}{% trans theme.title %}{% else %}{% trans 'Django administration' %}{% endif %}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% trans 'Django administration' %}
|
||||
{% if theme.logo_visible and theme.logo %}
|
||||
<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">
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}" />
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
@@ -5,15 +5,11 @@
|
||||
{% if theme.list_filter_dropdown %}
|
||||
|
||||
{% include "admin_interface/dropdown_filter.html" %}
|
||||
|
||||
|
||||
{% else %}
|
||||
|
||||
{% comment %}
|
||||
|
||||
Use the default list filter template -> https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/filter.html
|
||||
|
||||
{% endcomment %}
|
||||
|
||||
|
||||
{# Use the default list filter template -> https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/filter.html #}
|
||||
|
||||
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
|
||||
<ul>
|
||||
{% for choice in choices %}
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
.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;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.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 !important; /* 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 !important;
|
||||
}
|
||||
|
||||
.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/* !important*/;
|
||||
}
|
||||
|
||||
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 > a {
|
||||
margin-right:0px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* HELPS / MESSAGES */
|
||||
.admin-interface form .wide p.help {
|
||||
padding-left:10px;
|
||||
}
|
||||
|
||||
@media (max-width:767px){
|
||||
.admin-interface form .wide p.help {
|
||||
padding-left:0px;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface form .aligned.wide p.help,
|
||||
.admin-interface form .aligned.wide ul.error-list,
|
||||
.admin-interface form .aligned.wide ul.errorlist {
|
||||
margin-left: 200px;
|
||||
}
|
||||
|
||||
.admin-interface form .aligned.wide div.help {
|
||||
margin-left: 210px;
|
||||
}
|
||||
|
||||
|
||||
/* 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 */
|
||||
|
||||
/* selector chooseall / clearall color on hover -> just a lighten grey */
|
||||
.admin-interface a.selector-chooseall:hover,
|
||||
.admin-interface a.selector-clearall:hover {
|
||||
color:#888888/* !important*/;
|
||||
}
|
||||
|
||||
.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/* !important*/;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* selector chooseall / clearall color on hover -> just a lighten grey */
|
||||
.admin-interface a.selector-chooseall:hover,
|
||||
.admin-interface a.selector-clearall:hover {
|
||||
color:#888888/* !important*/;
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
.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-chosen h2 {
|
||||
background:{{ theme.css_module_background_color }};
|
||||
color:{{ theme.css_module_text_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 !important;
|
||||
color:{{ theme.css_generic_link_color }};
|
||||
}
|
||||
|
||||
.admin-interface .paginator a:hover,
|
||||
.admin-interface .paginator a:active {
|
||||
background-color:#F8F8F8 !important;
|
||||
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,48 @@
|
||||
/*
|
||||
ckeditor + light theme
|
||||
https://github.com/Ikimea/ckeditor-light-theme
|
||||
*/
|
||||
.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_top {
|
||||
background: #f6f6f6;
|
||||
border-top: none;
|
||||
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.admin-interface .cke_bottom {
|
||||
background: #f6f6f6;
|
||||
border-top: 1px solid #efefef;
|
||||
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
.admin-interface .cke_source {
|
||||
padding: 13px 15px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.admin-interface a.cke_button_on {
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
background-color: rgba(0,0,0,0.1);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.admin-interface .cke_resizer {
|
||||
border-color: transparent #999 transparent transparent;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
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,65 @@
|
||||
/*
|
||||
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/* !important*/;
|
||||
}
|
||||
|
||||
.admin-interface .ui-tabs .ui-tabs-nav li {
|
||||
margin-left:-1px/* !important*/;
|
||||
}
|
||||
|
||||
.admin-interface .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*/;
|
||||
}
|
||||
|
||||
.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/* !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;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular .ui-tabs .ui-tabs-panel {
|
||||
padding:8px/* !important*/;
|
||||
}
|
||||
|
||||
.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/* !important*/;
|
||||
border:1px solid #ebebeb/* !important*/;
|
||||
}
|
||||
|
||||
.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/* !important*/;
|
||||
border-bottom:1px solid #fcfcfc/* !important*/;
|
||||
}
|
||||
@@ -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 }}/* !important*/;
|
||||
opacity: {{ theme.related_modal_background_opacity }}/* !important*/;
|
||||
}
|
||||
|
||||
.admin-interface .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);
|
||||
}
|
||||
|
||||
.admin-interface .related-modal .mfp-container {
|
||||
padding: 90px 90px 90px 90px/* !important*/;
|
||||
}
|
||||
|
||||
.admin-interface .related-modal__nested .mfp-container {
|
||||
padding: 30px 60px 30px 60px/* !important*/;
|
||||
}
|
||||
|
||||
@media (max-width:640px){
|
||||
.admin-interface .related-modal .mfp-container {
|
||||
padding: 60px 15px 60px 15px/* !important*/;
|
||||
}
|
||||
.admin-interface .related-modal__nested .mfp-container {
|
||||
padding: 30px 30px 30px 30px/* !important*/;
|
||||
}
|
||||
}
|
||||
|
||||
.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,37 @@
|
||||
/*
|
||||
sorl-thumbnail - improved AdminImageMixin widget layout
|
||||
https://github.com/mariocesar/sorl-thumbnail
|
||||
*/
|
||||
.admin-interface a.thumbnail + input[type="checkbox"] {
|
||||
margin: 10px 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;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.admin-interface div[style="float:left"] {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
.admin-interface textarea.tinymce ~ p.help {
|
||||
margin-top:5px/* !important*/;
|
||||
}
|
||||
@@ -11,14 +11,5 @@ register = template.Library()
|
||||
@register.assignment_tag(takes_context = True)
|
||||
def get_admin_interface_theme(context):
|
||||
|
||||
obj_qs = Theme.objects.filter(active = True)[:1]
|
||||
obj_ls = list(obj_qs)
|
||||
obj = None
|
||||
|
||||
if len(obj_ls):
|
||||
obj = obj_ls[0]
|
||||
else:
|
||||
obj = Theme.get_or_create_default_theme()
|
||||
|
||||
return obj
|
||||
return Theme.get_active_theme()
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
__version__ = '0.2.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import django
|
||||
from django.conf import settings
|
||||
from django.test.utils import get_runner
|
||||
|
||||
|
||||
def runtests():
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.settings'
|
||||
django.setup()
|
||||
TestRunner = get_runner(settings)
|
||||
test_runner = TestRunner()
|
||||
failures = test_runner.run_tests(['tests'])
|
||||
sys.exit(bool(failures))
|
||||
|
||||
if __name__ == '__main__':
|
||||
runtests()
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
exec(open('admin_interface/version.py').read())
|
||||
|
||||
|
||||
setup(
|
||||
name='django-admin-interface',
|
||||
packages=find_packages(),
|
||||
packages=find_packages(exclude=['contrib', 'docs', 'tests*']),
|
||||
include_package_data=True,
|
||||
license='MIT License',
|
||||
version=__version__,
|
||||
description='django-admin-interface is a modern responsive flat admin interface customizable by the admin itself.',
|
||||
author='Fabio Caccamo',
|
||||
@@ -16,11 +15,34 @@ setup(
|
||||
url='https://github.com/fabiocaccamo/django-admin-interface',
|
||||
download_url='https://github.com/fabiocaccamo/django-admin-interface/archive/%s.tar.gz' % __version__,
|
||||
keywords=['django', 'admin', 'interface', 'responsive', 'flat', 'theme', 'custom', 'ui'],
|
||||
requires=['django(>=1.7)'],
|
||||
install_requires=[
|
||||
'django-colorfield==0.1.12',
|
||||
'django-flat-theme==1.1.4',
|
||||
'django-flat-responsive==1.2.0'
|
||||
'django-flat-responsive==1.3.0'
|
||||
],
|
||||
classifiers=[]
|
||||
classifiers=[
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Environment :: Web Environment',
|
||||
'Framework :: Django',
|
||||
'Framework :: Django :: 1.7',
|
||||
'Framework :: Django :: 1.8',
|
||||
'Framework :: Django :: 1.9',
|
||||
'Framework :: Django :: 1.10',
|
||||
'Framework :: Django :: 1.11',
|
||||
'Intended Audience :: Developers',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
'Natural Language :: English',
|
||||
'Operating System :: OS Independent',
|
||||
'Programming Language :: Python :: 2',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.4',
|
||||
'Programming Language :: Python :: 3.5',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
'Topic :: Software Development :: Build Tools',
|
||||
],
|
||||
license='MIT',
|
||||
test_suite='runtests.runtests'
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import django
|
||||
import os
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
SECRET_KEY = 'django-admin-interface'
|
||||
|
||||
ALLOWED_HOSTS = ['*']
|
||||
|
||||
INSTALLED_APPS = [
|
||||
|
||||
'admin_interface',
|
||||
'flat_responsive',
|
||||
'flat', #if django version < 1.9
|
||||
'colorfield',
|
||||
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
]
|
||||
|
||||
MIDDLEWARE_CLASSES = [
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
]
|
||||
|
||||
TEMPLATES = [{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
]
|
||||
},
|
||||
},]
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
||||
}
|
||||
}
|
||||
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'admin_interface/public/media/')
|
||||
MEDIA_URL = '/media/'
|
||||
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'admin_interface/public/static/')
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.conf import settings
|
||||
from django.test import TestCase
|
||||
from django.template import Context, Template
|
||||
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from admin_interface.models import Theme
|
||||
|
||||
|
||||
class AdminInterfaceTestCase(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(settings.MEDIA_ROOT, ignore_errors=True)
|
||||
pass
|
||||
|
||||
def __render_template(self, string, context=None):
|
||||
|
||||
context = context or {}
|
||||
context = Context(context)
|
||||
return Template(string).render(context)
|
||||
|
||||
def __test_active_theme(self):
|
||||
|
||||
theme = Theme.get_active_theme()
|
||||
print( theme )
|
||||
self.assertTrue(theme != None)
|
||||
self.assertTrue(theme.active)
|
||||
self.assertEqual(Theme.objects.filter( active = True ).count(), 1);
|
||||
|
||||
def test_default_theme_created_if_no_themes(self):
|
||||
|
||||
Theme.objects.all().delete()
|
||||
self.__test_active_theme()
|
||||
|
||||
def test_default_theme_created_if_all_themes_deleted(self):
|
||||
|
||||
Theme.objects.all().delete()
|
||||
self.__test_active_theme()
|
||||
|
||||
def test_default_theme_activated_on_save_if_no_active_themes(self):
|
||||
|
||||
Theme.objects.all().delete()
|
||||
theme = Theme.get_active_theme()
|
||||
theme.active = False
|
||||
theme.save()
|
||||
self.__test_active_theme()
|
||||
|
||||
def test_default_theme_activated_after_update_if_no_active_themes(self):
|
||||
|
||||
Theme.objects.all().delete()
|
||||
Theme.objects.all().update( active = False )
|
||||
self.__test_active_theme()
|
||||
|
||||
def test_default_theme_activated_on_active_theme_deleted(self):
|
||||
|
||||
Theme.objects.all().delete()
|
||||
theme_1 = Theme.objects.create( name = 'Custom 1', active = True )
|
||||
theme_2 = Theme.objects.create( name = 'Custom 2', active = True )
|
||||
theme_3 = Theme.objects.create( name = 'Custom 3', active = True )
|
||||
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()
|
||||
theme_1 = Theme.objects.create( name = 'Custom 1', active = True )
|
||||
theme_2 = Theme.objects.create( name = 'Custom 2', active = True )
|
||||
theme_3 = Theme.objects.create( name = 'Custom 3', active = True )
|
||||
self.assertEqual( Theme.get_active_theme().pk, theme_3.pk )
|
||||
self.__test_active_theme()
|
||||
|
||||
def test_templatetags(self):
|
||||
|
||||
Theme.objects.all().delete()
|
||||
rendered = self.__render_template('{% load admin_interface_tags %}{% get_admin_interface_theme as theme %}{{ theme.name }}')
|
||||
self.assertEqual(rendered, 'Django')
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
[tox]
|
||||
envlist =
|
||||
py27-{17,18,19,110,111},
|
||||
py34-{17,18,19,110,111},
|
||||
py35-{18,19,110,111},
|
||||
py36-{18,19,110,111},
|
||||
[testenv]
|
||||
passenv = CI TRAVIS TRAVIS_*
|
||||
deps =
|
||||
17: Django >= 1.7, < 1.8
|
||||
18: Django >= 1.8, < 1.9
|
||||
19: Django >= 1.9, < 1.10
|
||||
110: Django >= 1.10, < 1.11
|
||||
111: Django >= 1.11, < 1.12
|
||||
coverage
|
||||
codecov
|
||||
commands =
|
||||
coverage run --append --source=admin_interface setup.py test
|
||||
coverage report -m
|
||||
codecov
|
||||
Reference in New Issue
Block a user