Compare commits
152 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9becccce39 | |||
| 64a9e8371c | |||
| 8a85334f68 | |||
| 41a5ba61c8 | |||
| c780ccfbcf | |||
| 6091c886d7 | |||
| d05009ce44 | |||
| ef1eefb084 | |||
| e57042b1b4 | |||
| 0b0eff8653 | |||
| f6cef18c6b | |||
| e8522fe3d7 | |||
| fcb8a38e50 | |||
| 6c3a645edd | |||
| b9d0ac6dab | |||
| 3f270b0b75 | |||
| 7bc15ba61e | |||
| 37bb3ce0df | |||
| 66b0172195 | |||
| ca2f5c549e | |||
| 21b221f9e9 | |||
| 5fcbef3c5b | |||
| bc9d200461 | |||
| 8c903d5f4c | |||
| c253617346 | |||
| ca2b405989 | |||
| 0fd8469d9a | |||
| 5cce94eefc | |||
| c4c6a2b0f2 | |||
| 73a61080ae | |||
| 0164e5b791 | |||
| bb29c637ff | |||
| a8e9fffdac | |||
| d81c7fcdd8 | |||
| 4d07e9fec5 | |||
| 3b982a84c3 | |||
| 072fdcdc95 | |||
| 07c38baa83 | |||
| ed669a88be | |||
| 71ad991ba7 | |||
| 05128a997e | |||
| 92a816b9ae | |||
| 4a9b6e5e5c | |||
| 0e69ccdba6 | |||
| 3f9dc0c58e | |||
| cbd414485f | |||
| ccb818043c | |||
| 07d4fd65ef | |||
| 4dd7a9dd3d | |||
| 9ecaa3836c | |||
| 511ad909bf | |||
| 8fe6ffd3b2 | |||
| d0f8d7514a | |||
| 78d80bc129 | |||
| 09bd082759 | |||
| 70b4be757d | |||
| 486bfa9aba | |||
| e19cd51803 | |||
| 2d8eeee425 | |||
| ef35236c58 | |||
| eb676d9841 | |||
| 2301eedc8b | |||
| 2bc5c9f9ce | |||
| 44bae8b515 | |||
| ed34055290 | |||
| 8a9842c219 | |||
| b449a1140c | |||
| 3b2e567387 | |||
| f3c7695409 | |||
| 15aefd48d3 | |||
| f6c8e84b7b | |||
| 1865da3477 | |||
| b25cf463eb | |||
| 4ef14c248a | |||
| 165a8e4572 | |||
| a6df45a571 | |||
| b24c6010d2 | |||
| bb2dd77646 | |||
| 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 | |||
| 3203b437df | |||
| 202b5fa4aa | |||
| 9fdc3a0268 | |||
| ded2fee89c | |||
| beec7242c6 | |||
| 7a6a29b110 | |||
| 1f3bb6514c | |||
| b416b46c5a | |||
| 59f1831cbd | |||
| 20050e2964 | |||
| fd292ed1bf | |||
| fac0f690df | |||
| d18aadd93d | |||
| 9350575898 | |||
| 4789ee1dab | |||
| a924c6cf5e | |||
| 42b6e01f1f | |||
| d7fa681c56 | |||
| 18e1425156 | |||
| 1f39ceb0ad | |||
| 48cb73a604 | |||
| c5bbbbc855 | |||
| 793a019460 | |||
| 674178ecbe | |||
| 07a51c1678 | |||
| a58605a385 | |||
| e1d2c81ebe | |||
| e5e55bdfcd | |||
| f6ce51c839 | |||
| b4b19650f1 | |||
| 3d4f249487 | |||
| 7c236c6641 | |||
| 91b3809d61 | |||
| f918551971 | |||
| 149c95311f | |||
| 858f077bd4 | |||
| e46daa8f99 | |||
| e3320b2034 | |||
| 8991863fb1 |
+31
@@ -0,0 +1,31 @@
|
||||
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=py34-master
|
||||
- TOX_ENV=py35-18
|
||||
- TOX_ENV=py35-19
|
||||
- TOX_ENV=py35-110
|
||||
- TOX_ENV=py35-master
|
||||
matrix:
|
||||
include:
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-111
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-master
|
||||
allow_failures:
|
||||
- env: TOX_ENV=py34-master
|
||||
- env: TOX_ENV=py35-master
|
||||
- env: TOX_ENV=py36-master
|
||||
install:
|
||||
- pip install tox
|
||||
script:
|
||||
- tox -e $TOX_ENV
|
||||
sudo: false
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Fabio Caccamo - fabio.caccamo@gmail.com
|
||||
Copyright (c) 2016 Fabio Caccamo - fabio.caccamo@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -1,66 +1,97 @@
|
||||
#django-admin-interface
|
||||
django-admin-interface is a modern **flat admin interface customizable by the admin itself**.
|
||||
[](https://travis-ci.org/fabiocaccamo/django-admin-interface)
|
||||
[](https://codecov.io/gh/fabiocaccamo/django-admin-interface)
|
||||
[](https://landscape.io/github/fabiocaccamo/django-admin-interface/master)
|
||||
[](https://requires.io/github/fabiocaccamo/django-admin-interface/requirements/?branch=master)
|
||||
[](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)
|
||||
|
||||
You can use the builtin **django-theme** or create your own and **customize** **title, logo and colors**.
|
||||
# django-admin-interface
|
||||
django-admin-interface is a modern **responsive flat admin interface customizable by the admin itself**.
|
||||
|
||||
##Requirements
|
||||
- Python 2.6, Python 2.7
|
||||
- Django 1.6.5 through Django 1.8.4
|
||||
## 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`
|
||||
|
||||
##Installation
|
||||
## Requirements
|
||||
- Python 2.7, 3.4, 3.5, 3.6
|
||||
- Django 1.7, 1.8, 1.9, 1.10, 1.11
|
||||
|
||||
## Installation
|
||||
- Run `pip install django-admin-interface`
|
||||
- Add `admin_interface`, `flat` and `colorfield` to `settings.INSTALLED_APPS` **before** `django.contrib.admin`
|
||||
- Add `admin_interface`, `flat_responsive`, `flat` and `colorfield` to `settings.INSTALLED_APPS` **before** `django.contrib.admin`
|
||||
```python
|
||||
INSTALLED_APPS = (
|
||||
#...
|
||||
'flat',
|
||||
'admin_interface',
|
||||
'flat_responsive',
|
||||
'flat', # only if django version < 1.9
|
||||
'colorfield',
|
||||
'admin_interface',
|
||||
#...
|
||||
'django.contrib.admin',
|
||||
#...
|
||||
)
|
||||
```
|
||||
- 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
|
||||
|
||||
## Optional themes
|
||||
This package ships with optional themes as fixtures, they can be installed using the [loaddata admin command](https://docs.djangoproject.com/en/1.11/ref/django-admin/#django-admin-loaddata). Optional themes are activated on installation.
|
||||
|
||||
##### [Django](https://www.djangoproject.com/) theme (default):
|
||||
Run ``python manage.py loaddata admin_interface_theme_django.json``
|
||||
|
||||
##### [Bootstrap](http://getbootstrap.com/) theme:
|
||||
Run ``python manage.py loaddata admin_interface_theme_bootstrap.json``
|
||||
|
||||
##### [Foundation](http://foundation.zurb.com/) theme:
|
||||
Run ``python manage.py loaddata admin_interface_theme_foundation.json``
|
||||
|
||||
##### [U.S. Web Design Standards](https://standards.usa.gov/) theme:
|
||||
Run ``python manage.py loaddata admin_interface_theme_uswds.json``
|
||||
|
||||
### Add more themes
|
||||
You can add a theme you've created through the admin to this repository by [sending us a PR](http://makeapullrequest.com/). Here are the steps to follow to add :
|
||||
|
||||
1. Export your exact theme as fixture using the `dumpdata` admin command:
|
||||
``python manage.py dumpdata admin_interface.Theme --indent 4 -o admin_interface_theme_{{name}}.json --pks=N``
|
||||
|
||||
2. Copy the generated json file into the fixtures folder *(making sure its name starts with* `admin_interface_theme_` *to avoid clashes with fixtures that might be provided by other third party apps)*.
|
||||
|
||||
3. Remove the `"pk"` from the fixture and make sure the `active` field is set to `true` *(in this way a theme is automatically activated when installed)*.
|
||||
|
||||
4. Edit the section above to document your theme.
|
||||
|
||||
## Screenshots
|
||||
###### Admin login
|
||||

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

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

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

|
||||
|
||||
####Thanks
|
||||
- [django-flat-theme](https://github.com/elky/django-flat-theme/)
|
||||
- [django-colorfield](https://github.com/jaredly/django-colorfield/)
|
||||
## FAQ
|
||||
- #### I already have a custom `base_site.html`, how can I make it work?
|
||||
|
||||
##License
|
||||
The MIT License (MIT)
|
||||
You can use [django-apptemplates](https://github.com/bittner/django-apptemplates), then add `{% extends "admin_interface:admin/base_site.html" %}` to your `base_site.html`
|
||||
|
||||
Copyright (c) 2015 Fabio Caccamo - fabio.caccamo@gmail.com
|
||||
---
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
## License
|
||||
Released under [MIT License](LICENSE).
|
||||
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
|Build Status| |codecov| |Code Health| |Requirements Status| |PyPI version| |Py versions| |License|
|
||||
|
||||
django-admin-interface
|
||||
======================
|
||||
|
||||
django-admin-interface is a modern **responsive flat admin interface
|
||||
customizable by the admin itself**.
|
||||
|
||||
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
|
||||
- Django 1.7, 1.8, 1.9, 1.10, 1.11
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
- Run ``pip install django-admin-interface``
|
||||
- Add ``admin_interface``, ``flat_responsive``, ``flat`` *(only if django version < 1.9)* and ``colorfield`` to ``settings.INSTALLED_APPS`` **before** ``django.contrib.admin``
|
||||
- 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
|
||||
|
||||
Optional themes
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
This package ships with optional themes as fixtures, they can be
|
||||
installed using the ``loaddata`` admin command.
|
||||
Optional themes are activated on installation.
|
||||
|
||||
**Django theme** (default):
|
||||
|
||||
Run ``python manage.py loaddata admin_interface_theme_django.json``
|
||||
|
||||
**Bootstrap theme**:
|
||||
|
||||
Run ``python manage.py loaddata admin_interface_theme_bootstrap.json``
|
||||
|
||||
**Foundation theme**:
|
||||
|
||||
Run ``python manage.py loaddata admin_interface_theme_foundation.json``
|
||||
|
||||
**U.S. Web Design Standards theme**:
|
||||
|
||||
Run ``python manage.py loaddata admin_interface_theme_uswds.json``
|
||||
|
||||
Add more themes
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
You can add a theme you've created through the admin to this repository
|
||||
by **sending us a PR**. Here are the steps to follow to add:
|
||||
|
||||
1. Export your exact theme as fixture using the ``dumpdata`` admin command:
|
||||
``python manage.py dumpdata admin_interface.Theme --indent 4 -o admin_interface_theme_{{name}}.json --pks=N``
|
||||
|
||||
2. Copy the generated json file into the fixtures folder *(making sure
|
||||
its name starts with ``admin_interface_theme_`` to avoid clashes with
|
||||
fixtures that might be provided by other third party apps)*.
|
||||
|
||||
3. Remove the ``pk`` from the fixture and make sure the ``active``
|
||||
field is set to ``true`` *(in this way a theme is automatically
|
||||
activated when installed)*.
|
||||
|
||||
4. Edit the section above to document your theme.
|
||||
|
||||
Screenshots
|
||||
-----------
|
||||
|
||||
Admin login
|
||||
|
||||
|
||||
|django-admin-interface_login|
|
||||
-------------------------------
|
||||
|
||||
Admin dashboard
|
||||
|
||||
|
||||
|django-admin-interface_dashboard|
|
||||
-----------------------------------
|
||||
|
||||
Admin themes management
|
||||
|
||||
|
||||
|django-admin-interface_themes_management|
|
||||
--------------------------------------------
|
||||
|
||||
Admin theme customization
|
||||
|
||||
|
||||
|django-admin-interface_theme_customization|
|
||||
---------------------------------------------
|
||||
|
||||
FAQ
|
||||
---
|
||||
|
||||
**I already have a custom** ``base_site.html`` **, how can I make it work?**
|
||||
|
||||
You can use ``django-apptemplates`, then add ``{% extends "admin_interface:admin/base_site.html" %}`` to your ``base_site.html``
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Released under **MIT License**.
|
||||
|
||||
|
||||
.. |Build Status| image:: https://travis-ci.org/fabiocaccamo/django-admin-interface.svg?branch=master
|
||||
|
||||
.. |codecov| image:: https://codecov.io/gh/fabiocaccamo/django-admin-interface/branch/master/graph/badge.svg
|
||||
|
||||
.. |Code Health| image:: https://landscape.io/github/fabiocaccamo/django-admin-interface/master/landscape.svg?style=flat
|
||||
|
||||
.. |Requirements Status| image:: https://requires.io/github/fabiocaccamo/django-admin-interface/requirements.svg?branch=master
|
||||
|
||||
.. |PyPI version| image:: https://badge.fury.io/py/django-admin-interface.svg
|
||||
|
||||
.. |Py versions| image:: https://img.shields.io/pypi/pyversions/django-admin-interface.svg
|
||||
|
||||
.. |License| image:: https://img.shields.io/pypi/l/django-admin-interface.svg
|
||||
|
||||
.. |django-admin-interface_login| image:: https://cloud.githubusercontent.com/assets/1035294/11240233/55c8d4ba-8df1-11e5-9568-00fdc987ede8.gif
|
||||
|
||||
.. |django-admin-interface_dashboard| image:: https://cloud.githubusercontent.com/assets/1035294/11240239/627c0362-8df1-11e5-81fa-216366a5d8da.gif
|
||||
|
||||
.. |django-admin-interface_themes_management| image:: https://cloud.githubusercontent.com/assets/1035294/11240245/6cd1c342-8df1-11e5-928b-f22217474d3d.gif
|
||||
|
||||
.. |django-admin-interface_theme_customization| image:: https://cloud.githubusercontent.com/assets/1035294/11240250/7350d942-8df1-11e5-9b28-f2f54c333cdc.gif
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from admin_interface.version import __version__
|
||||
|
||||
default_app_config = 'admin_interface.apps.AdminInterfaceConfig'
|
||||
|
||||
|
||||
@@ -17,39 +17,85 @@ class ThemeAdmin(admin.ModelAdmin):
|
||||
}),
|
||||
('Logo', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('logo', 'logo_visible', )
|
||||
'fields': (
|
||||
'logo',
|
||||
'logo_color',
|
||||
'logo_visible',
|
||||
)
|
||||
}),
|
||||
('Favicon', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('favicon', )
|
||||
}),
|
||||
('Title', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('title', 'title_visible', )
|
||||
'fields': (
|
||||
'title',
|
||||
'title_color',
|
||||
'title_visible',
|
||||
)
|
||||
}),
|
||||
('Header', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_header_background_color', 'css_header_title_color', 'css_header_text_color', 'css_header_link_color', 'css_header_link_hover_color', )
|
||||
'fields': (
|
||||
'css_header_background_color',
|
||||
'css_header_text_color',
|
||||
'css_header_link_color',
|
||||
'css_header_link_hover_color',
|
||||
)
|
||||
}),
|
||||
('Breadcrumbs / Module headers', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_module_background_color', 'css_module_text_color', 'css_module_link_color', 'css_module_link_hover_color', 'css_module_rounded_corners', )
|
||||
'fields': (
|
||||
'css_module_background_color',
|
||||
'css_module_text_color',
|
||||
'css_module_link_color',
|
||||
'css_module_link_hover_color',
|
||||
'css_module_rounded_corners',
|
||||
)
|
||||
}),
|
||||
('Generic Links', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_generic_link_color', 'css_generic_link_hover_color', )
|
||||
'fields': (
|
||||
'css_generic_link_color',
|
||||
'css_generic_link_hover_color',
|
||||
)
|
||||
}),
|
||||
('Save Buttons', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_save_button_background_color', 'css_save_button_background_hover_color', 'css_save_button_text_color', )
|
||||
'fields': (
|
||||
'css_save_button_background_color',
|
||||
'css_save_button_background_hover_color',
|
||||
'css_save_button_text_color',
|
||||
)
|
||||
}),
|
||||
('Delete Buttons', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_delete_button_background_color', 'css_delete_button_background_hover_color', 'css_delete_button_text_color', )
|
||||
'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', )
|
||||
}),
|
||||
('Recent Actions', {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('recent_actions_visible', )
|
||||
}),
|
||||
)
|
||||
|
||||
save_on_top = True
|
||||
|
||||
admin.site.register(Theme, ThemeAdmin)
|
||||
|
||||
|
||||
@@ -12,5 +12,6 @@ class AdminInterfaceConfig(AppConfig):
|
||||
def ready(self):
|
||||
|
||||
from admin_interface.models import Theme
|
||||
post_migrate.connect(Theme.post_migrate_handler, sender = self)
|
||||
|
||||
post_migrate.connect(
|
||||
Theme.post_migrate_handler, sender=self)
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="104px" height="36px" viewBox="0 0 104 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
||||
<title>logo-django</title>
|
||||
<description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
||||
<g id="logo-django" sketch:type="MSArtboardGroup" transform="translate(-8.000000, -5.000000)" fill="#FFFFFF">
|
||||
<path d="M20.2602817,5 L25.9509859,5 L25.9509859,31.0824248 C23.0360563,31.6338042 20.8901408,31.8507285 18.5684507,31.8507285 C11.6180282,31.8434735 8,28.7383366 8,22.7747325 C8,17.0287781 11.8377465,13.2997118 17.7847887,13.2997118 C18.7076056,13.2997118 19.4107042,13.3722617 20.2602817,13.5899115 L20.2602817,5 L20.2602817,5 Z M20.2602817,18.1242821 C19.5938028,17.9066323 19.044507,17.8340823 18.3414085,17.8340823 C15.4630986,17.8340823 13.8005634,19.5897906 13.8005634,22.6666331 C13.8005634,25.6622196 15.3898592,27.316358 18.3047887,27.316358 C18.9346479,27.316358 19.4473239,27.2808085 20.2602817,27.1719836 L20.2602817,18.1242821 L20.2602817,18.1242821 Z M34.9960563,13.6987364 L34.9960563,26.7577235 C34.9960563,31.2550936 34.6591549,33.417807 33.6704225,35.2823401 C32.7476056,37.0750489 31.531831,38.2053768 29.0197183,39.453961 L23.7391549,36.9654985 C26.2512676,35.7981701 27.4670423,34.7665101 28.2433803,33.1921767 C29.056338,31.5822938 29.3126761,29.7177606 29.3126761,24.8133855 L29.3126761,13.6987364 L34.9960563,13.6987364 Z M29.3126761,5.02901997 L35.0033803,5.02901997 L35.0033803,10.8112493 L29.3126761,10.8112493 L29.3126761,5.02901997 Z M38.4302535,14.9828702 C40.9430986,13.8148163 43.3453521,13.2997118 45.9673239,13.2997118 C48.8895775,13.2997118 50.8077183,14.0687411 51.6580282,15.5705246 C52.1340845,16.4121037 52.2878873,17.5076077 52.2878873,19.8509704 L52.2878873,31.2993491 C49.7398873,31.6620987 46.5239437,31.922553 44.1649014,31.922553 C39.3970141,31.922553 37.2584225,30.2756696 37.2584225,26.6198787 C37.2584225,22.6659076 40.1008451,20.8376494 47.079831,20.2565245 L47.079831,19.0159207 C47.079831,17.9929667 46.559831,17.6229621 45.124338,17.6229621 C43.0223662,17.6229621 40.6567324,18.2106165 38.4375775,19.3423954 L38.4302535,14.9828702 Z M47.336169,23.9420608 C43.571662,24.3048105 42.3485634,24.8931904 42.3485634,26.3579734 C42.3485634,27.4549284 43.051662,27.9693073 44.604338,27.9693073 C45.4539155,27.9693073 46.2302535,27.8967574 47.3354366,27.7153826 L47.3354366,23.9420608 L47.336169,23.9420608 Z M55.056338,14.5765906 C58.4180282,13.6987364 61.1857465,13.2997118 63.9908169,13.2997118 C66.9057465,13.2997118 69.0157746,13.9599162 70.2674366,15.2367949 C71.4458592,16.4411237 71.8208451,17.7615324 71.8208451,20.5764696 L71.8208451,31.6258237 L66.1294085,31.6258237 L66.1294085,20.8013744 C66.1294085,18.6393866 65.3896901,17.8340823 63.3616901,17.8340823 C62.5846197,17.8340823 61.8822535,17.9066323 60.7397183,18.2403619 L60.7397183,31.6265492 L55.056338,31.6265492 L55.056338,14.5765906 Z M74.0326761,34.7012152 C76.0240563,35.7241692 78.0169014,36.1964692 80.1261972,36.1964692 C83.8540845,36.1964692 85.4433803,34.6946857 85.4433803,31.1107193 L85.4433803,31.0018944 C84.3374648,31.5460188 83.223493,31.7716491 81.7513803,31.7716491 C76.764507,31.7716491 73.5932394,28.5141573 73.5932394,23.3558574 C73.5932394,16.9496987 78.2878873,13.3294573 86.5932394,13.3294573 C89.0321127,13.3294573 91.2878873,13.583382 94.0189859,14.1347615 L92.0708169,18.1975575 C90.5562254,17.9073578 91.9463099,18.1540275 90.804507,18.0452026 L90.804507,18.6328571 L90.8777465,21.0124947 L90.9136338,24.0886117 C90.9509859,24.8583664 90.9509859,25.6259447 90.988338,26.3956994 L90.988338,27.9330324 C90.988338,32.7648576 90.5774648,35.0291409 89.3616901,36.900929 C87.5892958,39.6425908 84.5212958,41 80.1620845,41 C77.943662,41 76.0240563,40.6727998 74.0326761,39.9030451 L74.0326761,34.7012152 L74.0326761,34.7012152 Z M85.3335211,17.8703573 L85.1504225,17.8703573 L84.7395493,17.8703573 C83.6336338,17.8340823 82.3380282,18.1242821 81.4510986,18.6756615 C80.0895775,19.4446908 79.3872113,20.8376494 79.3872113,22.8110074 C79.3872113,25.6252192 80.7934085,27.2365531 83.3055211,27.2365531 C84.0811268,27.2365531 84.7117183,27.0921787 85.4441127,26.8738034 L85.4441127,26.4667983 L85.4441127,24.9294653 C85.4441127,24.269261 85.4067606,23.5365067 85.4067606,22.7674775 L85.3708732,20.17019 L85.3335211,18.3056569 L85.3335211,17.8703573 Z M102.84507,13.2271619 C108.528451,13.2271619 112,16.7748534 112,22.5208077 C112,28.4118619 108.382704,32.1039278 102.617296,32.1039278 C96.9265915,32.1039278 93.4176901,28.5569618 93.4176901,22.8480079 C93.4272113,16.9199532 97.044507,13.2271619 102.84507,13.2271619 Z M102.727887,27.5623023 C104.910423,27.5623023 106.199437,25.7710445 106.199437,22.6586526 C106.199437,19.5825356 104.94631,17.7542774 102.765239,17.7542774 C100.509465,17.7542774 99.2189859,19.5462607 99.2189859,22.6586526 C99.2189859,25.7710445 100.516056,27.5623023 102.727887,27.5623023 L102.727887,27.5623023 Z M102.727887,27.5623023" id="Shape" sketch:type="MSShapeGroup"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -0,0 +1,39 @@
|
||||
[
|
||||
{
|
||||
"model": "admin_interface.theme",
|
||||
"fields": {
|
||||
"name": "Bootstrap",
|
||||
"active": true,
|
||||
"title": "Django administration",
|
||||
"title_color": "#503873",
|
||||
"title_visible": false,
|
||||
"logo": "",
|
||||
"logo_color": "#503873",
|
||||
"logo_visible": true,
|
||||
"css_header_background_color": "#FFFFFF",
|
||||
"css_header_text_color": "#463265",
|
||||
"css_header_link_color": "#463265",
|
||||
"css_header_link_hover_color": "#7351A6",
|
||||
"css_module_background_color": "#7351A6",
|
||||
"css_module_text_color": "#FFFFFF",
|
||||
"css_module_link_color": "#CDBFE3",
|
||||
"css_module_link_hover_color": "#FFFFFF",
|
||||
"css_module_rounded_corners": true,
|
||||
"css_generic_link_color": "#463265",
|
||||
"css_generic_link_hover_color": "#7351A6",
|
||||
"css_save_button_background_color": "#5CB85C",
|
||||
"css_save_button_background_hover_color": "#449D44",
|
||||
"css_save_button_text_color": "#FFFFFF",
|
||||
"css_delete_button_background_color": "#D9534F",
|
||||
"css_delete_button_background_hover_color": "#C9302C",
|
||||
"css_delete_button_text_color": "#FFFFFF",
|
||||
"css": "",
|
||||
"related_modal_active": true,
|
||||
"related_modal_background_color": "#503873",
|
||||
"related_modal_background_opacity": 0.2,
|
||||
"related_modal_rounded_corners": true,
|
||||
"list_filter_dropdown": false,
|
||||
"recent_actions_visible": true
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,39 @@
|
||||
[
|
||||
{
|
||||
"model": "admin_interface.theme",
|
||||
"fields": {
|
||||
"name": "Django",
|
||||
"active": true,
|
||||
"title": "Django administration",
|
||||
"title_color": "#F5DD5D",
|
||||
"title_visible": true,
|
||||
"logo": "",
|
||||
"logo_color": "#FFFFFF",
|
||||
"logo_visible": true,
|
||||
"css_header_background_color": "#0C4B33",
|
||||
"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,
|
||||
"recent_actions_visible": true
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,39 @@
|
||||
[
|
||||
{
|
||||
"model": "admin_interface.theme",
|
||||
"fields": {
|
||||
"name": "Foundation",
|
||||
"active": true,
|
||||
"title": "Django administration",
|
||||
"title_color": "#DDDDDD",
|
||||
"title_visible": false,
|
||||
"logo": "",
|
||||
"logo_color": "#CCCCCC",
|
||||
"logo_visible": true,
|
||||
"css_header_background_color": "#2C3840",
|
||||
"css_header_text_color": "#FFFFFF",
|
||||
"css_header_link_color": "#FFFFFF",
|
||||
"css_header_link_hover_color": "#DDDDDD",
|
||||
"css_module_background_color": "#074E68",
|
||||
"css_module_text_color": "#FFFFFF",
|
||||
"css_module_link_color": "#FFFFFF",
|
||||
"css_module_link_hover_color": "#DDDDDD",
|
||||
"css_module_rounded_corners": true,
|
||||
"css_generic_link_color": "#000000",
|
||||
"css_generic_link_hover_color": "#074E68",
|
||||
"css_save_button_background_color": "#2199E8",
|
||||
"css_save_button_background_hover_color": "#1585CF",
|
||||
"css_save_button_text_color": "#FFFFFF",
|
||||
"css_delete_button_background_color": "#CC4B37",
|
||||
"css_delete_button_background_hover_color": "#BF4634",
|
||||
"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,
|
||||
"recent_actions_visible": true
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,39 @@
|
||||
[
|
||||
{
|
||||
"model": "admin_interface.theme",
|
||||
"fields": {
|
||||
"name": "USWDS",
|
||||
"active": true,
|
||||
"title": "Site administration",
|
||||
"title_color": "#FFFFFF",
|
||||
"title_visible": true,
|
||||
"logo": "",
|
||||
"logo_color": "#FFFFFF",
|
||||
"logo_visible": false,
|
||||
"css_header_background_color": "#112E51",
|
||||
"css_header_text_color": "#FFFFFF",
|
||||
"css_header_link_color": "#FFFFFF",
|
||||
"css_header_link_hover_color": "#E1F3F8",
|
||||
"css_module_background_color": "#205493",
|
||||
"css_module_text_color": "#FFFFFF",
|
||||
"css_module_link_color": "#FFFFFF",
|
||||
"css_module_link_hover_color": "#E1F3F8",
|
||||
"css_module_rounded_corners": true,
|
||||
"css_generic_link_color": "#205493",
|
||||
"css_generic_link_hover_color": "#0071BC",
|
||||
"css_save_button_background_color": "#205493",
|
||||
"css_save_button_background_hover_color": "#112E51",
|
||||
"css_save_button_text_color": "#FFFFFF",
|
||||
"css_delete_button_background_color": "#CD2026",
|
||||
"css_delete_button_background_hover_color": "#981B1E",
|
||||
"css_delete_button_text_color": "#FFFFFF",
|
||||
"css": "",
|
||||
"related_modal_active": true,
|
||||
"related_modal_background_color": "#000000",
|
||||
"related_modal_background_opacity": 0.8,
|
||||
"related_modal_rounded_corners": true,
|
||||
"list_filter_dropdown": false,
|
||||
"recent_actions_visible": true
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -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}}]
|
||||
@@ -1,7 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
import colorfield.fields
|
||||
|
||||
|
||||
@@ -14,33 +16,165 @@ class Migration(migrations.Migration):
|
||||
migrations.CreateModel(
|
||||
name='Theme',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('name', models.CharField(default=b'Django', max_length=50)),
|
||||
('active', models.BooleanField(default=True)),
|
||||
('title', models.CharField(default=b'Django administration', max_length=50, blank=True)),
|
||||
('title_visible', models.BooleanField(default=True, verbose_name=b'visible')),
|
||||
('logo', models.FileField(upload_to=b'admin-interface/logo/', blank=True)),
|
||||
('logo_visible', models.BooleanField(default=True, verbose_name=b'visible')),
|
||||
('css_header_background_color', colorfield.fields.ColorField(default=b'#0C4B33', help_text=b'#0C4B33', max_length=10, verbose_name=b'background color', blank=True)),
|
||||
('css_header_title_color', colorfield.fields.ColorField(default=b'#F5DD5D', help_text=b'#F5DD5D', max_length=10, verbose_name=b'title color', blank=True)),
|
||||
('css_header_text_color', colorfield.fields.ColorField(default=b'#44B78B', help_text=b'#44B78B', max_length=10, verbose_name=b'text color', blank=True)),
|
||||
('css_header_link_color', colorfield.fields.ColorField(default=b'#FFFFFF', help_text=b'#FFFFFF', max_length=10, verbose_name=b'link color', blank=True)),
|
||||
('css_header_link_hover_color', colorfield.fields.ColorField(default=b'#C9F0DD', help_text=b'#C9F0DD', max_length=10, verbose_name=b'link hover color', blank=True)),
|
||||
('css_module_background_color', colorfield.fields.ColorField(default=b'#44B78B', help_text=b'#44B78B', max_length=10, verbose_name=b'background color', blank=True)),
|
||||
('css_module_text_color', colorfield.fields.ColorField(default=b'#FFFFFF', help_text=b'#FFFFFF', max_length=10, verbose_name=b'text color', blank=True)),
|
||||
('css_module_link_color', colorfield.fields.ColorField(default=b'#FFFFFF', help_text=b'#FFFFFF', max_length=10, verbose_name=b'link color', blank=True)),
|
||||
('css_module_link_hover_color', colorfield.fields.ColorField(default=b'#C9F0DD', help_text=b'#C9F0DD', max_length=10, verbose_name=b'link hover color', blank=True)),
|
||||
('css_module_rounded_corners', models.BooleanField(default=True, verbose_name=b'rounded corners')),
|
||||
('css_generic_link_color', colorfield.fields.ColorField(default=b'#0C3C26', help_text=b'#0C3C26', max_length=10, verbose_name=b'link color', blank=True)),
|
||||
('css_generic_link_hover_color', colorfield.fields.ColorField(default=b'#156641', help_text=b'#156641', max_length=10, verbose_name=b'link hover color', blank=True)),
|
||||
('css_save_button_background_color', colorfield.fields.ColorField(default=b'#0C4B33', help_text=b'#0C4B33', max_length=10, verbose_name=b'background color', blank=True)),
|
||||
('css_save_button_background_hover_color', colorfield.fields.ColorField(default=b'#0C3C26', help_text=b'#0C3C26', max_length=10, verbose_name=b'background hover color', blank=True)),
|
||||
('css_save_button_text_color', colorfield.fields.ColorField(default=b'#FFFFFF', help_text=b'#FFFFFF', max_length=10, verbose_name=b'text color', blank=True)),
|
||||
('css_delete_button_background_color', colorfield.fields.ColorField(default=b'#BA2121', help_text=b'#BA2121', max_length=10, verbose_name=b'background color', blank=True)),
|
||||
('css_delete_button_background_hover_color', colorfield.fields.ColorField(default=b'#A41515', help_text=b'#A41515', max_length=10, verbose_name=b'background hover color', blank=True)),
|
||||
('css_delete_button_text_color', colorfield.fields.ColorField(default=b'#FFFFFF', help_text=b'#FFFFFF', max_length=10, verbose_name=b'text color', blank=True)),
|
||||
('css', models.TextField(blank=True)),
|
||||
('list_filter_dropdown', models.BooleanField(default=False)),
|
||||
('id',
|
||||
models.AutoField(
|
||||
verbose_name='ID',
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
primary_key=True)),
|
||||
('name',
|
||||
models.CharField(
|
||||
default=b'Django',
|
||||
max_length=50)),
|
||||
('active',
|
||||
models.BooleanField(
|
||||
default=True)),
|
||||
('title',
|
||||
models.CharField(
|
||||
default=b'Django administration',
|
||||
max_length=50,
|
||||
blank=True)),
|
||||
('title_visible',
|
||||
models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=b'visible')),
|
||||
('logo',
|
||||
models.FileField(
|
||||
upload_to=b'admin-interface/logo/',
|
||||
blank=True)),
|
||||
('logo_visible',
|
||||
models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=b'visible')),
|
||||
('css_header_background_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#0C4B33',
|
||||
help_text=b'#0C4B33',
|
||||
max_length=10,
|
||||
verbose_name=b'background color',
|
||||
blank=True)),
|
||||
('css_header_title_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#F5DD5D',
|
||||
help_text=b'#F5DD5D',
|
||||
max_length=10,
|
||||
verbose_name=b'title color',
|
||||
blank=True)),
|
||||
('css_header_text_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#44B78B',
|
||||
help_text=b'#44B78B',
|
||||
max_length=10,
|
||||
verbose_name=b'text color',
|
||||
blank=True)),
|
||||
('css_header_link_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#FFFFFF',
|
||||
help_text=b'#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=b'link color',
|
||||
blank=True)),
|
||||
('css_header_link_hover_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#C9F0DD',
|
||||
help_text=b'#C9F0DD',
|
||||
max_length=10,
|
||||
verbose_name=b'link hover color',
|
||||
blank=True)),
|
||||
('css_module_background_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#44B78B',
|
||||
help_text=b'#44B78B',
|
||||
max_length=10,
|
||||
verbose_name=b'background color',
|
||||
blank=True)),
|
||||
('css_module_text_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#FFFFFF',
|
||||
help_text=b'#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=b'text color',
|
||||
blank=True)),
|
||||
('css_module_link_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#FFFFFF',
|
||||
help_text=b'#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=b'link color',
|
||||
blank=True)),
|
||||
('css_module_link_hover_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#C9F0DD',
|
||||
help_text=b'#C9F0DD',
|
||||
max_length=10,
|
||||
verbose_name=b'link hover color',
|
||||
blank=True)),
|
||||
('css_module_rounded_corners',
|
||||
models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=b'rounded corners')),
|
||||
('css_generic_link_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#0C3C26',
|
||||
help_text=b'#0C3C26',
|
||||
max_length=10,
|
||||
verbose_name=b'link color',
|
||||
blank=True)),
|
||||
('css_generic_link_hover_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#156641',
|
||||
help_text=b'#156641',
|
||||
max_length=10,
|
||||
verbose_name=b'link hover color',
|
||||
blank=True)),
|
||||
('css_save_button_background_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#0C4B33',
|
||||
help_text=b'#0C4B33',
|
||||
max_length=10,
|
||||
verbose_name=b'background color',
|
||||
blank=True)),
|
||||
('css_save_button_background_hover_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#0C3C26',
|
||||
help_text=b'#0C3C26',
|
||||
max_length=10,
|
||||
verbose_name=b'background hover color',
|
||||
blank=True)),
|
||||
('css_save_button_text_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#FFFFFF',
|
||||
help_text=b'#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=b'text color',
|
||||
blank=True)),
|
||||
('css_delete_button_background_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#BA2121',
|
||||
help_text=b'#BA2121',
|
||||
max_length=10,
|
||||
verbose_name=b'background color',
|
||||
blank=True)),
|
||||
('css_delete_button_background_hover_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#A41515',
|
||||
help_text=b'#A41515',
|
||||
max_length=10,
|
||||
verbose_name=b'background hover color',
|
||||
blank=True)),
|
||||
('css_delete_button_text_color',
|
||||
colorfield.fields.ColorField(
|
||||
default=b'#FFFFFF',
|
||||
help_text=b'#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=b'text color',
|
||||
blank=True)),
|
||||
('css',
|
||||
models.TextField(
|
||||
blank=True)),
|
||||
('list_filter_dropdown',
|
||||
models.BooleanField(
|
||||
default=False)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Theme',
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# -*- 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'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,35 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import colorfield.fields
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0002_add_related_modal'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='logo_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='logo color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='logo',
|
||||
field=models.FileField(
|
||||
blank=True,
|
||||
help_text='(leave blank to use the default Django logo)',
|
||||
upload_to='admin-interface/logo/'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0003_add_logo_color'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='theme',
|
||||
old_name='css_header_title_color',
|
||||
new_name='title_color',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0004_rename_title_color'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='recent_actions_visible',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='visible'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,266 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import colorfield.fields
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0005_add_recent_actions_visible'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_delete_button_background_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#BA2121',
|
||||
help_text='#BA2121',
|
||||
max_length=10,
|
||||
verbose_name='background color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_delete_button_background_hover_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#A41515',
|
||||
help_text='#A41515',
|
||||
max_length=10,
|
||||
verbose_name='background hover color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_delete_button_text_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='text color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_generic_link_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#0C3C26',
|
||||
help_text='#0C3C26',
|
||||
max_length=10,
|
||||
verbose_name='link color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_generic_link_hover_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#156641',
|
||||
help_text='#156641',
|
||||
max_length=10,
|
||||
verbose_name='link hover color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_header_background_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#0C4B33',
|
||||
help_text='#0C4B33',
|
||||
max_length=10,
|
||||
verbose_name='background color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_header_link_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='link color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_header_link_hover_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#C9F0DD',
|
||||
help_text='#C9F0DD',
|
||||
max_length=10,
|
||||
verbose_name='link hover color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_header_text_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#44B78B',
|
||||
help_text='#44B78B',
|
||||
max_length=10,
|
||||
verbose_name='text color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_module_background_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#44B78B',
|
||||
help_text='#44B78B',
|
||||
max_length=10,
|
||||
verbose_name='background color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_module_link_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='link color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_module_link_hover_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#C9F0DD',
|
||||
help_text='#C9F0DD',
|
||||
max_length=10,
|
||||
verbose_name='link hover color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_module_rounded_corners',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='rounded corners'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_module_text_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='text color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_save_button_background_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#0C4B33',
|
||||
help_text='#0C4B33',
|
||||
max_length=10,
|
||||
verbose_name='background color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_save_button_background_hover_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#0C3C26',
|
||||
help_text='#0C3C26',
|
||||
max_length=10,
|
||||
verbose_name='background hover color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css_save_button_text_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='text color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='list_filter_dropdown',
|
||||
field=models.BooleanField(
|
||||
default=False,
|
||||
verbose_name='use dropdown'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='logo_visible',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='visible'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='name',
|
||||
field=models.CharField(
|
||||
default='Django',
|
||||
max_length=50),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='related_modal_active',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='active'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='related_modal_background_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#000000',
|
||||
help_text='#000000',
|
||||
max_length=10,
|
||||
verbose_name='background color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='related_modal_background_opacity',
|
||||
field=models.FloatField(
|
||||
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%')],
|
||||
default=0.2,
|
||||
help_text='20%',
|
||||
verbose_name='background opacity'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='related_modal_rounded_corners',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='rounded corners'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='title',
|
||||
field=models.CharField(
|
||||
blank=True,
|
||||
default='Django administration',
|
||||
max_length=50),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='title_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#F5DD5D',
|
||||
help_text='#F5DD5D',
|
||||
max_length=10,
|
||||
verbose_name='title color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='title_visible',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='visible'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0006_bytes_to_str'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='favicon',
|
||||
field=models.FileField(
|
||||
blank=True,
|
||||
help_text='(.ico|.png|.gif - 16x16|32x32 px)',
|
||||
upload_to='admin-interface/favicon/',
|
||||
verbose_name='favicon'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0007_add_favicon'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='related_modal_background_opacity',
|
||||
field=models.CharField(
|
||||
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%')],
|
||||
default='0.3',
|
||||
help_text='20%',
|
||||
max_length=5,
|
||||
verbose_name='background opacity'),
|
||||
),
|
||||
]
|
||||
+131
-63
@@ -1,98 +1,168 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.core.files import File
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_delete, post_save
|
||||
from django.utils.encoding import python_2_unicode_compatible, force_text
|
||||
|
||||
from colorfield.fields import ColorField
|
||||
|
||||
import os
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class Theme(models.Model):
|
||||
|
||||
@staticmethod
|
||||
def post_migrate_handler(sender, **kwargs):
|
||||
Theme.get_or_create_default_theme()
|
||||
def post_migrate_handler(**kwargs):
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def post_delete_handler(instance, **kwargs):
|
||||
Theme.get_or_create_default_theme()
|
||||
def post_delete_handler(**kwargs):
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def post_save_handler(instance, created, **kwargs):
|
||||
instance.set_active(instance.active)
|
||||
Theme.get_or_create_default_theme()
|
||||
def post_save_handler(instance, **kwargs):
|
||||
if instance.active:
|
||||
Theme.objects.exclude(pk=instance.pk).update(active=False)
|
||||
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)
|
||||
objs_active_ls = list(objs_active_qs)
|
||||
objs_active_count = len(objs_active_ls)
|
||||
|
||||
if not obj.logo:
|
||||
obj.set_default_logo()
|
||||
if objs_active_count == 0:
|
||||
default_obj, default_obj_created = Theme.objects.get_or_create(
|
||||
pk='1', defaults={'active': True})
|
||||
if not default_obj_created:
|
||||
default_obj.set_active()
|
||||
obj = default_obj
|
||||
|
||||
if not obj_created and obj_active:
|
||||
obj.set_active(True)
|
||||
elif objs_active_count == 1:
|
||||
obj = objs_active_ls[0]
|
||||
|
||||
return (obj, obj_created, )
|
||||
elif objs_active_count > 1:
|
||||
obj = objs_active_ls[-1]
|
||||
obj.set_active()
|
||||
|
||||
name = models.CharField( max_length = 50, default = 'Django' )
|
||||
active = models.BooleanField( default = True )
|
||||
return obj
|
||||
|
||||
title = models.CharField( max_length = 50, default = 'Django administration', blank = True )
|
||||
title_visible = models.BooleanField( default = True, verbose_name = 'visible' )
|
||||
name = models.CharField(max_length=50, default='Django')
|
||||
active = models.BooleanField(default=True)
|
||||
|
||||
logo = models.FileField( upload_to = 'admin-interface/logo/', blank = True )
|
||||
logo_visible = models.BooleanField( default = True, verbose_name = 'visible' )
|
||||
title = models.CharField(
|
||||
max_length=50, default='Django administration', blank=True)
|
||||
title_color = ColorField(
|
||||
blank=True, default='#F5DD5D', help_text='#F5DD5D',
|
||||
max_length=10, verbose_name='title color')
|
||||
title_visible = models.BooleanField(
|
||||
default=True, verbose_name='visible')
|
||||
|
||||
css_header_background_color = ColorField( blank = True, default = '#0C4B33', help_text = '#0C4B33', verbose_name = 'background color' )
|
||||
css_header_title_color = ColorField( blank = True, default = '#F5DD5D', help_text = '#F5DD5D', verbose_name = 'title color' )
|
||||
css_header_text_color = ColorField( blank = True, default = '#44B78B', help_text = '#44B78B', verbose_name = 'text color' )
|
||||
css_header_link_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'link color' )
|
||||
css_header_link_hover_color = ColorField( blank = True, default = '#C9F0DD', help_text = '#C9F0DD', verbose_name = 'link hover color' )
|
||||
logo = models.FileField(
|
||||
upload_to='admin-interface/logo/', blank=True,
|
||||
help_text='(leave blank to use the default Django logo)')
|
||||
logo_color = ColorField(
|
||||
blank=True, default='#FFFFFF', help_text='#FFFFFF',
|
||||
max_length=10, verbose_name='logo color')
|
||||
logo_visible = models.BooleanField(
|
||||
default=True, verbose_name='visible')
|
||||
|
||||
css_module_background_color = ColorField( blank = True, default = '#44B78B', help_text = '#44B78B', verbose_name = 'background color' )
|
||||
css_module_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
||||
css_module_link_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'link color' )
|
||||
css_module_link_hover_color = ColorField( blank = True, default = '#C9F0DD', help_text = '#C9F0DD', verbose_name = 'link hover color' )
|
||||
css_module_rounded_corners = models.BooleanField( default = True, verbose_name = 'rounded corners' )
|
||||
favicon = models.FileField(
|
||||
upload_to='admin-interface/favicon/', blank=True,
|
||||
help_text='(.ico|.png|.gif - 16x16|32x32 px)', verbose_name='favicon')
|
||||
|
||||
css_generic_link_color = ColorField( blank = True, default = '#0C3C26', help_text = '#0C3C26', verbose_name = 'link color' )
|
||||
css_generic_link_hover_color = ColorField( blank = True, default = '#156641', help_text = '#156641', verbose_name = 'link hover color' )
|
||||
css_header_background_color = ColorField(
|
||||
blank=True, default='#0C4B33', help_text='#0C4B33',
|
||||
max_length=10, verbose_name='background color')
|
||||
css_header_text_color = ColorField(
|
||||
blank=True, default='#44B78B', help_text='#44B78B',
|
||||
max_length=10, verbose_name='text color')
|
||||
css_header_link_color = ColorField(
|
||||
blank=True, default='#FFFFFF', help_text='#FFFFFF',
|
||||
max_length=10, verbose_name='link color')
|
||||
css_header_link_hover_color = ColorField(
|
||||
blank=True, default='#C9F0DD', help_text='#C9F0DD',
|
||||
max_length=10, verbose_name='link hover color')
|
||||
|
||||
css_save_button_background_color = ColorField( blank = True, default = '#0C4B33', help_text = '#0C4B33', verbose_name = 'background color' )
|
||||
css_save_button_background_hover_color = ColorField( blank = True, default = '#0C3C26', help_text = '#0C3C26', verbose_name = 'background hover color' )
|
||||
css_save_button_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
||||
css_module_background_color = ColorField(
|
||||
blank=True, default='#44B78B', help_text='#44B78B',
|
||||
max_length=10, verbose_name='background color')
|
||||
css_module_text_color = ColorField(
|
||||
blank=True, default='#FFFFFF', help_text='#FFFFFF',
|
||||
max_length=10, verbose_name='text color')
|
||||
css_module_link_color = ColorField(
|
||||
blank=True, default='#FFFFFF', help_text='#FFFFFF',
|
||||
max_length=10, verbose_name='link color')
|
||||
css_module_link_hover_color = ColorField(
|
||||
blank=True, default='#C9F0DD', help_text='#C9F0DD',
|
||||
max_length=10, verbose_name='link hover color')
|
||||
css_module_rounded_corners = models.BooleanField(
|
||||
default=True, verbose_name='rounded corners')
|
||||
|
||||
css_delete_button_background_color = ColorField( blank = True, default = '#BA2121', help_text = '#BA2121', verbose_name = 'background color' )
|
||||
css_delete_button_background_hover_color = ColorField( blank = True, default = '#A41515', help_text = '#A41515', verbose_name = 'background hover color' )
|
||||
css_delete_button_text_color = ColorField( blank = True, default = '#FFFFFF', help_text = '#FFFFFF', verbose_name = 'text color' )
|
||||
css_generic_link_color = ColorField(
|
||||
blank=True, default='#0C3C26', help_text='#0C3C26',
|
||||
max_length=10, verbose_name='link color')
|
||||
css_generic_link_hover_color = ColorField(
|
||||
blank=True, default='#156641', help_text='#156641',
|
||||
max_length=10, verbose_name='link hover color')
|
||||
|
||||
css = models.TextField( blank = True )
|
||||
css_save_button_background_color = ColorField(
|
||||
blank=True, default='#0C4B33', help_text='#0C4B33',
|
||||
max_length=10, verbose_name='background color')
|
||||
css_save_button_background_hover_color = ColorField(
|
||||
blank=True, default='#0C3C26', help_text='#0C3C26',
|
||||
max_length=10, verbose_name='background hover color')
|
||||
css_save_button_text_color = ColorField(
|
||||
blank=True, default='#FFFFFF', help_text='#FFFFFF',
|
||||
max_length=10, verbose_name='text color')
|
||||
|
||||
list_filter_dropdown = models.BooleanField( default = False )
|
||||
css_delete_button_background_color = ColorField(
|
||||
blank=True, default='#BA2121', help_text='#BA2121',
|
||||
max_length=10, verbose_name='background color')
|
||||
css_delete_button_background_hover_color = ColorField(
|
||||
blank=True, default='#A41515', help_text='#A41515',
|
||||
max_length=10, verbose_name='background hover color')
|
||||
css_delete_button_text_color = ColorField(
|
||||
blank=True, default='#FFFFFF', help_text='#FFFFFF',
|
||||
max_length=10, verbose_name='text color')
|
||||
|
||||
css = models.TextField(blank=True)
|
||||
|
||||
def set_active(self, value):
|
||||
related_modal_active = models.BooleanField(
|
||||
default=True, verbose_name='active')
|
||||
related_modal_background_color = ColorField(
|
||||
blank=True, default='#000000', help_text='#000000',
|
||||
max_length=10, 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.CharField(
|
||||
max_length=5,
|
||||
choices=related_modal_background_opacity_choices,
|
||||
default='0.3', help_text='20%', verbose_name='background opacity')
|
||||
related_modal_rounded_corners = models.BooleanField(
|
||||
default=True, verbose_name='rounded corners')
|
||||
|
||||
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)
|
||||
list_filter_dropdown = models.BooleanField(
|
||||
default=False, verbose_name='use dropdown')
|
||||
recent_actions_visible = models.BooleanField(
|
||||
default=True, verbose_name='visible')
|
||||
|
||||
def set_default_logo(self):
|
||||
def set_active(self):
|
||||
|
||||
logo_path = os.path.normpath(os.path.dirname(__file__) + '/data/logo-django.svg')
|
||||
logo_file = open(logo_path)
|
||||
|
||||
self.logo = File(logo_file)
|
||||
self.active = True
|
||||
self.save()
|
||||
|
||||
logo_file.close()
|
||||
|
||||
class Meta:
|
||||
|
||||
app_label = 'admin_interface'
|
||||
@@ -100,11 +170,9 @@ class Theme(models.Model):
|
||||
verbose_name = 'Theme'
|
||||
verbose_name_plural = 'Themes'
|
||||
|
||||
def __unicode__(self):
|
||||
|
||||
return unicode(u'%s' % (self.name, ))
|
||||
def __str__(self):
|
||||
return force_text(self.name)
|
||||
|
||||
|
||||
post_delete.connect(Theme.post_delete_handler, sender = Theme)
|
||||
post_save.connect(Theme.post_save_handler, sender = Theme)
|
||||
|
||||
post_delete.connect(Theme.post_delete_handler, sender=Theme)
|
||||
post_save.connect(Theme.post_save_handler, sender=Theme)
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/*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':
|
||||
if( typeof(openerRef.dismissChangeRelatedObjectPopup) == 'function' ){
|
||||
openerRef.dismissChangeRelatedObjectPopup(modalRef, initData.value, initData.obj, initData.new_value);
|
||||
}
|
||||
break;
|
||||
case 'delete':
|
||||
if( typeof(openerRef.dismissDeleteRelatedObjectPopup) == 'function' ){
|
||||
openerRef.dismissDeleteRelatedObjectPopup(modalRef, initData.value);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if( typeof(openerRef.dismissAddRelatedObjectPopup) == 'function' ){
|
||||
openerRef.dismissAddRelatedObjectPopup(modalRef, initData.value, initData.obj);
|
||||
}
|
||||
else if( typeof(openerRef.dismissAddAnotherPopup) == 'function' ){
|
||||
// django 1.7 compatibility
|
||||
openerRef.dismissAddAnotherPopup(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,90 @@
|
||||
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 as modal
|
||||
$.magnificPopup.close();
|
||||
}
|
||||
|
||||
// assign the function to a global variable
|
||||
window.dismissRelatedObjectModal = dismissRelatedObjectModal;
|
||||
|
||||
function presentRelatedObjectModal(e)
|
||||
{
|
||||
var href = ($(this).attr('href') || '');
|
||||
if( href == '' ){
|
||||
return;
|
||||
}
|
||||
|
||||
// open the popup as modal
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
// 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 = href;
|
||||
|
||||
// fix for django 1.7
|
||||
if( iframeSrc.indexOf('_popup=1') == -1 ){
|
||||
iframeSrc += '&_popup=1';
|
||||
}
|
||||
|
||||
iframeSrc += '&_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;
|
||||
}
|
||||
|
||||
// listen click events on related links
|
||||
|
||||
// django 1.7 compatibility
|
||||
$('a.add-another').removeAttr('onclick');
|
||||
$('a.add-another').click( presentRelatedObjectModal );
|
||||
|
||||
// django 1.8 and above
|
||||
$('a.related-widget-wrapper-link').click( presentRelatedObjectModal );
|
||||
});
|
||||
|
||||
})(django.jQuery);
|
||||
}
|
||||
|
||||
@@ -1,493 +1,67 @@
|
||||
{% 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 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 %}
|
||||
{% get_admin_interface_version as version %}
|
||||
<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:hover,
|
||||
div.breadcrumbs a:active {
|
||||
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,
|
||||
.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:hover, input[type=submit]:hover, input[type=button]:hover {
|
||||
background:{{ theme.css_save_button_background_hover_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
}
|
||||
|
||||
.button.default, input[type=submit].default, .submit-row input.default {
|
||||
background:{{ theme.css_save_button_background_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
}
|
||||
|
||||
.button.default:active, input[type=submit].default:active,
|
||||
.button.default:hover, input[type=submit].default:hover {
|
||||
background:{{ theme.css_save_button_background_hover_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
/* same lateral padding as in logged view */
|
||||
.login #header {
|
||||
padding:10px 25px !important;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
textarea.tinymce ~ p.help {
|
||||
margin-top:5px !important;
|
||||
}
|
||||
|
||||
.aligned p.file-upload {
|
||||
display:table;
|
||||
}
|
||||
|
||||
/* fix lateral padding to align text with field labels */
|
||||
.module h2,
|
||||
.dashboard .module caption,
|
||||
.inline-group h2,
|
||||
.module.filtered h2,
|
||||
.inline-group h2 {
|
||||
padding:8px 10px;
|
||||
{% if theme.css_module_rounded_corners %}border-radius:4px;{% endif %}
|
||||
}
|
||||
|
||||
.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-related h3 {
|
||||
padding:6px 10px !important;
|
||||
}
|
||||
|
||||
/*
|
||||
.inline-group .tabular thead th:last-child:not([class]):not([style]) {
|
||||
text-align:center;
|
||||
}
|
||||
*/
|
||||
|
||||
/*.inline-group .tabular tr.has_original td.original, */
|
||||
.inline-group .tabular tr td.delete {
|
||||
vertical-align:middle !important;
|
||||
text-align:center !important;
|
||||
}
|
||||
|
||||
.inline-group .tabular tr td.delete a.inline-deletelink {
|
||||
float:none;
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
/* 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%;
|
||||
}
|
||||
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
django-admin-interface {{ version }}
|
||||
https://github.com/fabiocaccamo/django-admin-interface
|
||||
*/
|
||||
{% 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/recent-actions.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 }}
|
||||
{% get_admin_interface_theme as theme %}
|
||||
{% get_admin_interface_version as version %}
|
||||
{# 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' %}?v={{ version }}" />
|
||||
{% if theme.favicon %}
|
||||
<link rel="icon" type="image/x-icon" href="{{ theme.favicon.url }}?v={{ version }}" />
|
||||
{% endif %}
|
||||
{% if theme.related_modal_active %}
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'admin_interface/magnific-popup/magnific-popup.css' %}?v={{ version }}" />
|
||||
<script type="text/javascript" src="{% static 'admin_interface/magnific-popup/jquery.magnific-popup.js' %}?v={{ version }}"></script>
|
||||
<script type="text/javascript" src="{% static 'admin_interface/related-modal/related-modal.js' %}?v={{ version }}"></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 }}" />
|
||||
{% if theme.logo_visible %}
|
||||
{% if 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 %} />
|
||||
{% else %}
|
||||
<img class="logo default" style="display:none;" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" width="104" height="36" />
|
||||
{% endif %}
|
||||
{% if theme.title_visible %}
|
||||
<span>{% if theme.title %}{% trans theme.title %}{% else %}{% trans 'Django administration' %}{% endif %}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% trans 'Django administration' %}
|
||||
{% 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 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,15 @@
|
||||
{% load i18n static %}<!DOCTYPE html>
|
||||
<html>
|
||||
<head><title>{% trans 'Popup closing...' %}</title></head>
|
||||
<body>
|
||||
<script type="text/javascript"
|
||||
id="django-admin-popup-response-constants"
|
||||
src="{% static "admin/js/popup_response.js" %}"
|
||||
{% if popup_response_data %}
|
||||
data-popup-response="{{ popup_response_data }}"
|
||||
{% else %}
|
||||
data-popup-response='{"action":"{{ action|escape }}","value":"{{ value|escape }}","obj":"{{ obj|escape }}","new_value":"{{ new_value|escape }}"}'
|
||||
{% endif %}>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,386 @@
|
||||
.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,
|
||||
.admin-interface fieldset.collapse a.collapse-toggle {
|
||||
font-weight: normal;
|
||||
text-transform: lowercase;
|
||||
font-size: 12px;
|
||||
text-decoration: underline;
|
||||
padding: 0 1px;
|
||||
}
|
||||
|
||||
/*
|
||||
#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 inline horizontal scroll caused by checkbox-row */
|
||||
.admin-interface form .form-row > div.checkbox-row {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 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 */
|
||||
|
||||
/* begin fix restrict tabular-inline horizontal-scroll to inline-group instead of whole page */
|
||||
.admin-interface .inline-group[data-inline-type="tabular"] {
|
||||
overflow-x:auto;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
/* begin fix stacked-inline margin-bottom in responsive small viewport */
|
||||
.admin-interface .inline-group[data-inline-type="stacked"] .module {
|
||||
margin-bottom:0px;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
/* 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 {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular tr td.delete {
|
||||
text-align:right;
|
||||
padding-right:15px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular tr td input[type="checkbox"] {
|
||||
margin: 7px 0px;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular tr td.delete a.inline-deletelink {
|
||||
margin-top:4px;
|
||||
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 */
|
||||
|
||||
/* fix [stacked, not-stacked] equalize horizontal and vertical select padding for selector (stacked and not) */
|
||||
.admin-interface .selector .selector-available select,
|
||||
.admin-interface .selector .selector-chosen select {
|
||||
padding: 7px 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* fix [not-stacked] selector */
|
||||
.admin-interface .selector:not(.stacked) {
|
||||
width: auto;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
/* fix [not-stacked] 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) !important;
|
||||
}
|
||||
|
||||
@media (max-width: 1024px){
|
||||
.admin-interface .related-widget-wrapper-link + .selector:not(.stacked) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 767px) and (max-width: 1124px){
|
||||
|
||||
.admin-interface .selector:not(.stacked) .selector-available,
|
||||
.admin-interface .selector:not(.stacked) .selector-chosen {
|
||||
width: 285px;
|
||||
flex: 0 1 auto;
|
||||
}
|
||||
.admin-interface .selector:not(.stacked) .selector-filter {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.admin-interface .selector:not(.stacked) .selector-filter label {
|
||||
margin: 0;
|
||||
}
|
||||
.admin-interface .selector:not(.stacked) .selector-available input {
|
||||
width: auto;
|
||||
flex: 1 1;
|
||||
}
|
||||
.admin-interface .selector:not(.stacked) select {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* fix [not-stacked] in tabular inline context */
|
||||
.admin-interface .tabular.inline-related .selector:not(.stacked) {
|
||||
width: 795px;
|
||||
float: none;
|
||||
display: inline-block;
|
||||
margin-right: 22px;
|
||||
}
|
||||
|
||||
.admin-interface .tabular.inline-related .form-row .related-widget-wrapper-link:first-child {
|
||||
float: right;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/* fix [stacked] in tabular inline context */
|
||||
.admin-interface .tabular.inline-related .selector.stacked {
|
||||
width: 480px;
|
||||
float: none;
|
||||
display: inline-block;
|
||||
margin-right: 22px;
|
||||
}
|
||||
|
||||
/* fix [stacked] chooser align center */
|
||||
.admin-interface .selector.stacked .selector-chooser {
|
||||
margin-left:calc(50% - 30px);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
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){
|
||||
|
||||
.admin-interface .django-ckeditor-widget,
|
||||
.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;
|
||||
}
|
||||
|
||||
.admin-interface .tabular .django-ckeditor-widget,
|
||||
.admin-interface .tabular .cke {
|
||||
width: 400px !important;
|
||||
}
|
||||
|
||||
.admin-interface .tabular .cke_contents {
|
||||
height: 90px !important;
|
||||
}
|
||||
}
|
||||
@@ -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,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;
|
||||
}
|
||||
|
||||
.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;
|
||||
font-weight: bold;
|
||||
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,9 @@
|
||||
{% if not theme.recent_actions_visible %}
|
||||
.admin-interface.dashboard #content {
|
||||
max-width:600px;
|
||||
margin-right:0;
|
||||
}
|
||||
.admin-interface.dashboard #content #recent-actions-module {
|
||||
display:none;
|
||||
}
|
||||
{% endif %}
|
||||
@@ -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='%23eeeeee' fill='none' stroke-width='6' stroke-linecap='round'></circle><circle cx='50' cy='50' r='40' stroke='%23aaaaaa' 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,4 +1,4 @@
|
||||
{% load i18n admin_interface_tags %}
|
||||
{% load i18n %}
|
||||
|
||||
<div class="list-filter-dropdown">
|
||||
<h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
|
||||
|
||||
@@ -3,22 +3,34 @@
|
||||
from django import template
|
||||
|
||||
from admin_interface.models import Theme
|
||||
|
||||
from admin_interface.version import __version__
|
||||
|
||||
register = template.Library()
|
||||
|
||||
try:
|
||||
assignment_tag = register.assignment_tag
|
||||
except AttributeError:
|
||||
assignment_tag = register.simple_tag
|
||||
|
||||
@register.assignment_tag(takes_context = True)
|
||||
|
||||
@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
|
||||
theme = None
|
||||
request = context.get('request', None)
|
||||
|
||||
if len(obj_ls):
|
||||
obj = obj_ls[0]
|
||||
else:
|
||||
obj = Theme.get_or_create_default_theme()
|
||||
if request:
|
||||
theme = getattr(request, 'admin_interface_theme', None)
|
||||
|
||||
return obj
|
||||
if not theme:
|
||||
theme = Theme.get_active_theme()
|
||||
|
||||
if request:
|
||||
request.admin_interface_theme = theme
|
||||
|
||||
return theme
|
||||
|
||||
|
||||
@assignment_tag(takes_context=False)
|
||||
def get_admin_interface_version():
|
||||
return __version__
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
__version__ = '0.1.4'
|
||||
|
||||
__version__ = '0.5.9'
|
||||
|
||||
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,25 +1,62 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
import os
|
||||
|
||||
exec(open('admin_interface/version.py').read())
|
||||
|
||||
github_url = 'https://github.com/fabiocaccamo'
|
||||
package_name = 'django-admin-interface'
|
||||
package_path = os.path.abspath(os.path.dirname(__file__))
|
||||
long_description_file_path = os.path.join(package_path, 'README.rst')
|
||||
long_description = ''
|
||||
try:
|
||||
with open(long_description_file_path) as f:
|
||||
long_description = f.read()
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
setup(
|
||||
name='django-admin-interface',
|
||||
packages=find_packages(),
|
||||
name=package_name,
|
||||
packages=find_packages(exclude=['contrib', 'docs', 'tests*']),
|
||||
include_package_data=True,
|
||||
license='MIT License',
|
||||
version=__version__,
|
||||
description='django-admin-interface is a modern flat admin interface customizable by the admin itself.',
|
||||
description='django-admin-interface is a modern responsive flat admin interface customizable by the admin itself.',
|
||||
long_description=long_description,
|
||||
author='Fabio Caccamo',
|
||||
author_email='fabio.caccamo@gmail.com',
|
||||
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', 'ui', 'flat', 'theme', 'custom'],
|
||||
url='%s/%s' % (github_url, package_name, ),
|
||||
download_url='%s/%s/archive/%s.tar.gz' % (github_url, package_name, __version__, ),
|
||||
keywords=['django', 'admin', 'interface', 'responsive', 'flat', 'theme', 'custom', 'ui'],
|
||||
requires=['django(>=1.7)'],
|
||||
install_requires=[
|
||||
'django-colorfield==0.1.10',
|
||||
'django-flat-theme==1.1.2'
|
||||
'django-colorfield >= 0.1, < 1.0',
|
||||
'django-flat-theme >= 1.0, < 2.0',
|
||||
'django-flat-responsive >= 1.0, < 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/'
|
||||
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.conf import settings
|
||||
from django.test import TestCase
|
||||
from django.test.client import RequestFactory
|
||||
from django.template import Context, Template
|
||||
|
||||
import random
|
||||
import shutil
|
||||
|
||||
from admin_interface.models import Theme
|
||||
from admin_interface.templatetags import admin_interface_tags as templatetags
|
||||
from admin_interface.version import __version__
|
||||
|
||||
|
||||
class AdminInterfaceTestCase(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.request_factory = RequestFactory()
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(settings.MEDIA_ROOT, ignore_errors=True)
|
||||
pass
|
||||
|
||||
def __render_template(self, string, context=None):
|
||||
return Template(string).render(Context(context or {}))
|
||||
|
||||
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_after_update_if_multiple_active_themes(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.update( active = False )
|
||||
Theme.objects.update( active = True )
|
||||
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.__test_active_theme()
|
||||
|
||||
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_last_theme_activated_on_multiple_themes_activated(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_4 = Theme.objects.create( name = 'Custom 4', active = True )
|
||||
theme_5 = Theme.objects.create( name = 'Custom 5', active = True )
|
||||
themes = [ theme_1, theme_2, theme_3, theme_4, theme_5 ]
|
||||
for i in range(5):
|
||||
random.shuffle(themes)
|
||||
for theme in themes:
|
||||
theme.set_active()
|
||||
self.assertEqual( Theme.get_active_theme().pk, theme.pk )
|
||||
self.__test_active_theme()
|
||||
|
||||
def test_templatetags_get_theme(self):
|
||||
Theme.objects.all().delete()
|
||||
context = Context({})
|
||||
theme = templatetags.get_admin_interface_theme(context)
|
||||
self.assertEqual(theme.name, 'Django')
|
||||
rendered = self.__render_template(
|
||||
'{% load admin_interface_tags %}'\
|
||||
'{% get_admin_interface_theme as theme %}'\
|
||||
'{{ theme.name }}', context)
|
||||
self.assertEqual(rendered, 'Django')
|
||||
|
||||
def test_templatetags_get_theme_with_request(self):
|
||||
Theme.objects.all().delete()
|
||||
context = Context({
|
||||
'request': self.request_factory.get('/')
|
||||
})
|
||||
theme = templatetags.get_admin_interface_theme(context)
|
||||
self.assertEqual(theme.name, 'Django')
|
||||
rendered = self.__render_template(
|
||||
'{% load admin_interface_tags %}'\
|
||||
'{% get_admin_interface_theme as theme %}'\
|
||||
'{{ theme.name }}', context)
|
||||
self.assertEqual(rendered, 'Django')
|
||||
|
||||
def test_templatetags_get_version(self):
|
||||
version = templatetags.get_admin_interface_version()
|
||||
self.assertEqual(version, __version__)
|
||||
rendered = self.__render_template(
|
||||
'{% load admin_interface_tags %}'\
|
||||
'{% get_admin_interface_version as version %}'\
|
||||
'{{ version }}')
|
||||
self.assertEqual(rendered, __version__)
|
||||
|
||||
def test_repr(self):
|
||||
theme = Theme.get_active_theme()
|
||||
self.assertEqual( '{0}'.format(theme), 'Django' )
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
[tox]
|
||||
envlist =
|
||||
py27-{17,18,19,110,111},
|
||||
py34-{17,18,19,110,111,master},
|
||||
py35-{18,19,110,111,master},
|
||||
py36-{18,19,110,111,master},
|
||||
[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
|
||||
master: https://github.com/django/django/archive/master.tar.gz
|
||||
coverage
|
||||
codecov
|
||||
commands =
|
||||
coverage run --append --source=admin_interface setup.py test
|
||||
coverage report -m
|
||||
codecov
|
||||
Reference in New Issue
Block a user