Compare commits
401 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e2239dcb99 | |||
| c769a449f2 | |||
| 3cff729a8a | |||
| c44db23b31 | |||
| 485f5400db | |||
| a2329fdae5 | |||
| a388ec234c | |||
| a3b3f8922d | |||
| 6b6eed3aa0 | |||
| fd48e5ca97 | |||
| fbc29246ff | |||
| 1569828c67 | |||
| bb73fafeff | |||
| f76a41ff14 | |||
| 4351751193 | |||
| 044ad518e0 | |||
| 5b976adb1d | |||
| 74732ec9a9 | |||
| 5c85dc9cd4 | |||
| 66966501f8 | |||
| 30af685edf | |||
| 96d1568c13 | |||
| 7c04b35b44 | |||
| 004cd5fbcb | |||
| 8e37cdd218 | |||
| ba6807b7f3 | |||
| 59a8b4d2d7 | |||
| f72aac8848 | |||
| 41c6d5b7f1 | |||
| 554d8d27b7 | |||
| c337c21a03 | |||
| 0f9d502e4f | |||
| c961de3391 | |||
| aec7ede184 | |||
| d338e5914e | |||
| 36971ad662 | |||
| d2c8885afa | |||
| e9b0694c0b | |||
| 14aa681e7d | |||
| c2e3545f46 | |||
| aed5afbfa7 | |||
| 9b7c6ee3fe | |||
| a8322872ab | |||
| e5318b688b | |||
| 455259f3ef | |||
| 7d2d29a42c | |||
| 5ed9fd75cc | |||
| ca71642ecf | |||
| 4369288928 | |||
| f167bbf2c4 | |||
| 1b60af57e0 | |||
| 947202f915 | |||
| 7eb6371104 | |||
| c315f366f3 | |||
| f2a2a98ad9 | |||
| 5b606153de | |||
| 87396a1b5e | |||
| b35a2987cc | |||
| 2baed25204 | |||
| 3f5a3f9ded | |||
| 6189a7bbdb | |||
| d1cda34a52 | |||
| fdbacba4bb | |||
| 5c56f3a2db | |||
| 17bb35c559 | |||
| ed25f0fdde | |||
| a18e35f4c3 | |||
| f9817da531 | |||
| d94c6321aa | |||
| 3c77bad4ae | |||
| aa36776490 | |||
| d375b04941 | |||
| cceb0b1721 | |||
| e364f9da1c | |||
| aec847070f | |||
| 11f7440273 | |||
| 02cde83181 | |||
| a302c87724 | |||
| d61ef86dd6 | |||
| 071fe476a6 | |||
| 9b611d1dcb | |||
| 61c1720fd7 | |||
| 962267de1d | |||
| f632929183 | |||
| 308858a0d0 | |||
| db7e0770b2 | |||
| 195ef2c44f | |||
| 48d3952e68 | |||
| 96570502cc | |||
| 759b5a6f49 | |||
| 92710be337 | |||
| c721359eea | |||
| 79ea1729cc | |||
| 8c4520d4b7 | |||
| b703f77f80 | |||
| 13b1d9f15f | |||
| e989e623db | |||
| 2113d009f4 | |||
| e967d09c8b | |||
| c050c4f94c | |||
| 97cea97307 | |||
| 826340c9be | |||
| 28dfc70474 | |||
| e9038157be | |||
| be21550c6a | |||
| db87a2aae2 | |||
| 97ac8268b6 | |||
| 941835b5ee | |||
| b050d7cb61 | |||
| 7d64545031 | |||
| 892bfa5e16 | |||
| b165e6d27c | |||
| f0a72d5e40 | |||
| 869d4c31ad | |||
| a7788b98ed | |||
| 1045690678 | |||
| 09548dbcdc | |||
| 0a4949c75a | |||
| f36e904faf | |||
| f9a6f501e1 | |||
| f9629f5ef1 | |||
| 084b0d65f3 | |||
| 5935ee9d40 | |||
| ac66bfddb9 | |||
| 62ccb31793 | |||
| 4e243962d1 | |||
| 51202a1def | |||
| d799242714 | |||
| e37142e0f4 | |||
| 79dcc111da | |||
| 651557bfc2 | |||
| 5456e7ac53 | |||
| 03f8a2704e | |||
| ceab3232ad | |||
| 6a0576cb7a | |||
| 2935c890cf | |||
| 36f13ce164 | |||
| 6aec3c0c7b | |||
| 147a2a6abf | |||
| f7ec79eb75 | |||
| 32e4afd90f | |||
| bf40b1f36b | |||
| 94ba6c1813 | |||
| ca57425525 | |||
| 535a7c0490 | |||
| d97fc38a88 | |||
| 1caca70e0f | |||
| 427c1c2a00 | |||
| 01f4254f05 | |||
| 8bf78d3ba0 | |||
| 10a4ceaf90 | |||
| df66fa49a4 | |||
| d689ba43af | |||
| dc43ff1b0a | |||
| 49ae15ce98 | |||
| 1e26e5ff6c | |||
| 8391d2ebd2 | |||
| fd81e75729 | |||
| e51e4e3ae6 | |||
| b3ac5df522 | |||
| 11944eb07c | |||
| 42dda3d91d | |||
| fb0582ded7 | |||
| 1e7fa33527 | |||
| 8bdbf31465 | |||
| e739b784ec | |||
| 4a6cb3601e | |||
| 7993467346 | |||
| 287e4421c9 | |||
| aa57797297 | |||
| 2667e96549 | |||
| 22dbcd206b | |||
| aaf586721d | |||
| d5c14ef3f4 | |||
| 93dfb07af9 | |||
| 8e734864c2 | |||
| d1cb3c11aa | |||
| 82923f9e98 | |||
| 235d51ed9a | |||
| 1baebf9d62 | |||
| 56cdbe5d2f | |||
| 06de101ded | |||
| 59ab83538f | |||
| b04c17a4fd | |||
| 5b0490b352 | |||
| 8de47f2ecb | |||
| 783464c065 | |||
| 6b3f59788b | |||
| 45ab7066cc | |||
| df013b9ba3 | |||
| bb83f74fb4 | |||
| da044864d1 | |||
| db7c12fdb4 | |||
| 5b0a5e4c46 | |||
| 0f1dde545e | |||
| b45e357418 | |||
| fa6c79c367 | |||
| 760609cafd | |||
| cb3443aa4c | |||
| 9384c6db79 | |||
| 1a800d7d6a | |||
| 352701ae7d | |||
| b4d0b4c985 | |||
| 26e67dab66 | |||
| e604dcdffa | |||
| 9b56343a81 | |||
| aef2d56fba | |||
| cb7a358c6c | |||
| c8690b316b | |||
| 91bba7f522 | |||
| 439902dce8 | |||
| 19854f70a3 | |||
| 8291a65a15 | |||
| 9433287cee | |||
| f0a046ff7f | |||
| 877c4da5bf | |||
| 229a4ef573 | |||
| cf5e784550 | |||
| e58bbbeacf | |||
| 1c2ac2a308 | |||
| 3133beb82f | |||
| 18d2281011 | |||
| 7d9edddf82 | |||
| 1c335f83e9 | |||
| 68a9974df8 | |||
| efb38d5825 | |||
| a48d2175ba | |||
| 8bffc8f82a | |||
| 1870635697 | |||
| 4e0c4a00e2 | |||
| 4b055f7ffa | |||
| d6f0e5b0da | |||
| 4cf0d8f1b9 | |||
| cc9b470bfe | |||
| 01d995b031 | |||
| c383adb9a0 | |||
| 4ad2d87020 | |||
| 9284594901 | |||
| a3c469f032 | |||
| 17f71ad803 | |||
| 1913af4b7d | |||
| 8c382f97d1 | |||
| 89fda153de | |||
| 3fc3fe5912 | |||
| acdb755071 | |||
| c680bb5461 | |||
| ce32a56cdf | |||
| 7137cbab08 | |||
| 3f7b1e54e9 | |||
| cf76fd412e | |||
| ab0afff087 | |||
| e3811e2609 | |||
| 47a3d66d5c | |||
| 2700b4ff12 | |||
| 6a1897b95c | |||
| e5768da21b | |||
| dc8efcbd6b | |||
| 01c4ad1f06 | |||
| 4a848948a0 | |||
| a96a70400f | |||
| cc0d2a402b | |||
| 415de9ca66 | |||
| 7e57885988 | |||
| 013dcedd37 | |||
| b011256370 | |||
| 752ccbb603 | |||
| 8612012783 | |||
| f78167b711 | |||
| ef9b7e6d1b | |||
| 748b95854e | |||
| 2f10c88375 | |||
| 73c9a54d94 | |||
| eff414b40c | |||
| ccbf76dc5a | |||
| 5b6e83751b | |||
| 572294f646 | |||
| 4e18d36c79 | |||
| ee9994231b | |||
| fb4cfdb772 | |||
| 8535232598 | |||
| abbb666eae | |||
| d48fc882f1 | |||
| f968bd9ffa | |||
| c0592276de | |||
| 451679d565 | |||
| e579134152 | |||
| 6e57cf558c | |||
| d00428c30a | |||
| 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 |
+2
-1
@@ -1 +1,2 @@
|
||||
admin_interface/static/ckeditor/* linguist-vendored
|
||||
admin_interface/static/admin_interface/magnific-popup/* linguist-vendored=true
|
||||
admin_interface/static/ckeditor/* linguist-vendored=true
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
github: [fabiocaccamo]
|
||||
custom: ['https://www.paypal.me/fabiocaccamo']
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a bug for this project
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: fabiocaccamo
|
||||
|
||||
---
|
||||
|
||||
**Python version**
|
||||
?
|
||||
|
||||
**Django version**
|
||||
?
|
||||
|
||||
**Package version**
|
||||
?
|
||||
|
||||
**Current behavior (bug description)**
|
||||
?
|
||||
|
||||
**Expected behavior**
|
||||
?
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: fabiocaccamo
|
||||
|
||||
---
|
||||
|
||||
|
||||
+2
-1
@@ -44,7 +44,6 @@ coverage.xml
|
||||
*,cover
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
@@ -55,3 +54,5 @@ docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
screenshots
|
||||
TODO.txt
|
||||
|
||||
+171
@@ -0,0 +1,171 @@
|
||||
os: linux
|
||||
dist: xenial
|
||||
language: python
|
||||
cache: pip
|
||||
jobs:
|
||||
include:
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj17-sqlite
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj17-postgres
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj18-sqlite
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj18-postgres
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj19-sqlite
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj19-postgres
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj110-sqlite
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj110-postgres
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj111-sqlite
|
||||
- python: "2.7"
|
||||
env: TOX_ENV=py27-dj111-postgres
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj18-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj18-postgres
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj19-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj19-postgres
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj110-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj110-postgres
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj111-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj111-postgres
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj20-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj20-postgres
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj21-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj21-postgres
|
||||
# - python: "3.5"
|
||||
# env: TOX_ENV=py35-dj22-sqlite
|
||||
- python: "3.5"
|
||||
env: TOX_ENV=py35-dj22-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj111-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj111-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj20-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj20-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj21-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj21-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj22-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj22-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj30-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj30-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj31-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj31-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj32-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-dj32-postgres
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-djmaster-sqlite
|
||||
- python: "3.6"
|
||||
env: TOX_ENV=py36-djmaster-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj20-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj20-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj21-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj21-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj22-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj22-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj30-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj30-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj31-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj31-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj32-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-dj32-postgres
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-djmaster-sqlite
|
||||
- python: "3.7"
|
||||
env: TOX_ENV=py37-djmaster-postgres
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj22-sqlite
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj22-postgres
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj30-sqlite
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj30-postgres
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj31-sqlite
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj31-postgres
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj32-sqlite
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-dj32-postgres
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-djmaster-sqlite
|
||||
- python: "3.8"
|
||||
env: TOX_ENV=py38-djmaster-postgres
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj22-sqlite
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj22-postgres
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj30-sqlite
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj30-postgres
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj31-sqlite
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj31-postgres
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj32-sqlite
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-dj32-postgres
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-djmaster-sqlite
|
||||
- python: "3.9"
|
||||
env: TOX_ENV=py39-djmaster-postgres
|
||||
allow_failures:
|
||||
- env: TOX_ENV=py36-djmaster-sqlite
|
||||
- env: TOX_ENV=py36-djmaster-postgres
|
||||
- env: TOX_ENV=py37-djmaster-sqlite
|
||||
- env: TOX_ENV=py37-djmaster-postgres
|
||||
- env: TOX_ENV=py38-djmaster-sqlite
|
||||
- env: TOX_ENV=py38-djmaster-postgres
|
||||
- env: TOX_ENV=py39-djmaster-sqlite
|
||||
- env: TOX_ENV=py39-djmaster-postgres
|
||||
install:
|
||||
- pip install tox
|
||||
services:
|
||||
- postgresql
|
||||
before_script:
|
||||
- psql -c 'create database admin_interface;' -U postgres
|
||||
script:
|
||||
- tox -e $TOX_ENV
|
||||
+237
@@ -0,0 +1,237 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.17.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.17.2) - 2021-10-08
|
||||
- Fixed `FileExtensionValidator` `TypeError` on django < 1.11.
|
||||
|
||||
## [0.17.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.17.1) - 2021-09-24
|
||||
- Fixed `TemplateDoesNotExist` error on `django==4.0.a1` removing checking condition for `colorfield` package. #134
|
||||
- Fixed favicon fetching incompatible with `django-storages` `S3`. #128
|
||||
|
||||
## [0.17.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.17.0) - 2021-09-16
|
||||
- Added `logo_max_width` and `logo_max_height`. #127
|
||||
|
||||
## [0.16.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.16.4) - 2021-09-04
|
||||
- Fixed `0020_module_selected_colors` migration for multiple dbs. #132
|
||||
- Fixed sticky pagination `width` and `border-bottom`.
|
||||
- Fixed inlines vertical overlow.
|
||||
- Improved header elements vertical alignment.
|
||||
|
||||
## [0.16.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.16.3) - 2021-04-26
|
||||
- Added `compat` module.
|
||||
- Added missing `0021_file_extension_validator` migration. #126
|
||||
- Formatted migrations.
|
||||
|
||||
## [0.16.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.16.2) - 2021-04-23
|
||||
- Added `python 3.9` and `django 3.2` to CI.
|
||||
- Added `FileExtensionValidator` to `logo` and `favicon` fields. #112
|
||||
- Fixed `models.W042` warning on `django 3.2`.
|
||||
- Fixed header `min-height`.
|
||||
- Fixed selects `min-width`.
|
||||
- Fixed changelist search, actions and submit button horizontal margins.
|
||||
- Fixed related widget wrapper margin/padding with normal select and in inlines.
|
||||
- Fixed tabular inlines horizontal scroll.
|
||||
|
||||
## [0.16.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.16.1) - 2021-04-07
|
||||
- Fixed style of "Delete" and "Save" buttons in the delete confirmation page. #123
|
||||
- Overridden dark-mode css variables introduced in `django 3.2`. #124
|
||||
|
||||
## [0.16.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.16.0) - 2021-03-30
|
||||
- Added customizable colors for selected apps and models in dashboard. #122
|
||||
- Added `responsive_rtl.css` stylesheet. #98
|
||||
- Updated `vazir-font` version to `27.2.2`. #98
|
||||
|
||||
## [0.15.6](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.6) - 2021-03-26
|
||||
- Fixed `show_change_link` related modal support. #120
|
||||
- Fixed inline changelink style.
|
||||
- Made globally available `presentRelatedObjectModal` and `presentRelatedObjectModalOnClickOn` js functions.
|
||||
|
||||
## [0.15.5](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.5) - 2021-03-02
|
||||
- Fixed sticky submit and pagination `z-index` issue with related modal.
|
||||
|
||||
## [0.15.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.4) - 2021-03-01
|
||||
- Fixed sticky submit and pagination `z-index` issue with sticky `list_filter` and `django-json-widget`.
|
||||
|
||||
## [0.15.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.3) - 2021-02-08
|
||||
- Fixed sticky submit and pagination width when `admin.site.enable_nav_sidebar = False`. #113
|
||||
|
||||
## [0.15.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.2) - 2021-02-03
|
||||
- Fixed body classes template rendering.
|
||||
- Improved sticky submit and pagination backward compatibility.
|
||||
|
||||
## [0.15.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.1) - 2021-02-03
|
||||
- Fixed and improved sticky form controls and pagination style.
|
||||
|
||||
## [0.15.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.15.0) - 2021-02-03
|
||||
- Added sticky form controls and pagination options. #110
|
||||
- Added support to 4-digit language code in language chooser. #111
|
||||
- Added theme css variables for third-party libraries.
|
||||
- Fixed app module section link hover color.
|
||||
|
||||
## [0.14.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.14.2) - 2021-01-04
|
||||
- Fixed tabular inline scroll bar. #101
|
||||
- Fixed module header selected link color. #102
|
||||
- Fixed main content width when `admin.site.enable_nav_sidebar = False`. #105
|
||||
|
||||
## [0.14.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.14.1) - 2020-11-12
|
||||
- Fixed sticky list-filter floating. #100
|
||||
|
||||
## [0.14.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.14.0) - 2020-10-15
|
||||
- Added list filter sticky option (only for `django >= 3.1.2`).
|
||||
- Enabled list filter dropdown by default.
|
||||
- Fixed changelist searchbar style.
|
||||
|
||||
## [0.13.7](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.7) - 2020-10-14
|
||||
- Improved responsive widgets style.
|
||||
- Prevented body horizontal scroll.
|
||||
- Fixed tabular inline horizontal scroll.
|
||||
- Fixed changelist filter min-width.
|
||||
- Fixed changelist and toolbar theme rounded corners.
|
||||
- Fixed calendar and timelist buttons theme color.
|
||||
- Fixed list filter select size.
|
||||
- Fixed content max-width with `django >= 3.1`.
|
||||
|
||||
## [0.13.6](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.6) - 2020-10-14
|
||||
- Added persian language. #98
|
||||
- Fixed logo max-width on small screens.
|
||||
- Fixed content max-width when nav-sidebar is collapsed.
|
||||
- Fixed changelist max-width on medium screens.
|
||||
|
||||
## [0.13.5](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.5) - 2020-09-15
|
||||
- Fixed loaddata error with initial_data.json fixture. #97
|
||||
- Fixed tests warning (admin.W411).
|
||||
- Fixed changelist thead links color.
|
||||
- Fixed changelist filter links hover color.
|
||||
|
||||
## [0.13.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.4) - 2020-09-04
|
||||
- Added conditional imports to avoid Django deprecation warnings. #92
|
||||
- Changed admin header content vertical align to top.
|
||||
|
||||
## [0.13.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.3) - 2020-09-02
|
||||
- Added `django-json-widget` theming support.
|
||||
|
||||
## [0.13.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.2) - 2020-08-21
|
||||
- Fixed related modal not closing on edit save and create with django 3.1 - #96
|
||||
|
||||
## [0.13.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.1) - 2020-08-18
|
||||
- Improved header and nav-sidebar style.
|
||||
- Added `max-width` to logo.
|
||||
- Added `requirements-dev.txt`
|
||||
|
||||
## [0.13.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.13.0) - 2020-08-05
|
||||
- Improved nav-sidebar style (`django>=3.1` support).
|
||||
- Improved header style.
|
||||
|
||||
## [0.12.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.12.3) - 2020-07-20
|
||||
- Fixed unreadable text in autocomplete multi-selects. #83
|
||||
|
||||
## [0.12.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.12.2) - 2020-04-07
|
||||
- Fixed popup javascript error when related modal is inactive. #76
|
||||
- Fixed js self invoking anonymous function expression.
|
||||
|
||||
## [0.12.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.12.1) - 2020-02-21
|
||||
- Updated `.travis` config.
|
||||
- Fixed custom django admin header. #75
|
||||
- Bumped `django-colorfield` version to `0.2.0`.
|
||||
- Added `tr` language.
|
||||
- Removed hard-coded favicon type.
|
||||
- Improved code-quality.
|
||||
|
||||
## [0.12.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.12.0) - 2019-12-02
|
||||
- Added `python 3.8` and `django 3.0` compatibility.
|
||||
|
||||
## [0.11.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.11.2) - 2019-09-27
|
||||
- Fixed `select2` background color.
|
||||
|
||||
## [0.11.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.11.1) - 2019-09-04
|
||||
- Added language chooser display option.
|
||||
|
||||
## [0.11.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.11.0) - 2019-09-03
|
||||
- Added language chooser.
|
||||
|
||||
## [0.10.5](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.10.5) - 2019-05-09
|
||||
- Fixed broken migration on postgres/windows. #52
|
||||
|
||||
## [0.10.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.10.4) - 2019-03-29
|
||||
- Added `django 2.2` to `tox` and `travis`.
|
||||
- Fixed admin duplicated count query.
|
||||
- Added admin theme caching to remove duplicated queries. #19
|
||||
- Added `django-dynamic-raw-id` support. #61
|
||||
- Updated `it` localization.
|
||||
|
||||
## [0.10.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.10.3) - 2019-03-28
|
||||
- Fixed idempotent deploy support. #40
|
||||
|
||||
## [0.10.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.10.2) - 2019-03-22
|
||||
- Fixed `raw-id-field` whith `django-admin-interface`. #58
|
||||
|
||||
## [0.10.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.10.1) - 2019-03-20
|
||||
- Updated `fr` localization.
|
||||
|
||||
## [0.10.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.10.0) - 2019-02-21
|
||||
- Updated messages.
|
||||
- Added related modal close button. #45
|
||||
- Updated fields verbose names.
|
||||
- Added environment options. #56
|
||||
|
||||
## [0.9.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.9.3) - 2019-02-06
|
||||
- Enabled travis pip cache.
|
||||
- Splitted tests to multiple files.
|
||||
- Added env badge to favicon.
|
||||
|
||||
## [0.9.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.9.2) - 2019-01-11
|
||||
- Fixed cancel button does not work. #53
|
||||
- Fixed IntegrityError on postgres
|
||||
|
||||
## [0.9.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.9.1) - 2019-01-11
|
||||
- Fixed missing migration. #51
|
||||
|
||||
## [0.9.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.9.0) - 2018-11-13
|
||||
- Added French localization.
|
||||
- Added Italian localization.
|
||||
- Added Spanish localization.
|
||||
- Added internationalization support.
|
||||
|
||||
## [0.8.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.8.2) - 2018-10-24
|
||||
## [0.8.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.8.1) - 2018-10-11
|
||||
## [0.8.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.8.0) - 2018-08-31
|
||||
## [0.7.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.7.0) - 2018-02-06
|
||||
## [0.6.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.6.3) - 2018-02-05
|
||||
## [0.6.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.6.2) - 2018-02-01
|
||||
## [0.6.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.6.1) - 2018-01-31
|
||||
## [0.6.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.6.0) - 2017-11-23
|
||||
## [0.5.9](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.9) - 2017-10-04
|
||||
## [0.5.8](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.8) - 2017-09-29
|
||||
## [0.5.7](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.7) - 2017-09-29
|
||||
## [0.5.6](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.6) - 2017-09-29
|
||||
## [0.5.5](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.5) - 2017-09-27
|
||||
## [0.5.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.4) - 2017-09-27
|
||||
## [0.5.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.3) - 2017-08-24
|
||||
## [0.5.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.2) - 2017-07-13
|
||||
## [0.5.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.1) - 2017-06-13
|
||||
## [0.5.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.5.0) - 2017-06-09
|
||||
## [0.4.6](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.6) - 2017-05-24
|
||||
## [0.4.5](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.5) - 2017-05-19
|
||||
## [0.4.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.4) - 2017-05-18
|
||||
## [0.4.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.3) - 2017-05-16
|
||||
## [0.4.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.2) - 2017-05-11
|
||||
## [0.4.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.1) - 2017-05-04
|
||||
## [0.4.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.4.0) - 2017-04-14
|
||||
## [0.3.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.3.2) - 2017-03-29
|
||||
## [0.3.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.3.1) - 2017-03-29
|
||||
## [0.3.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.3.0) - 2017-02-09
|
||||
## [0.2.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.2.1) - 2016-11-08
|
||||
## [0.2.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.2.0) - 2016-09-10
|
||||
## [0.1.9](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.9) - 2016-09-04
|
||||
## [0.1.8](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.8) - 2016-08-05
|
||||
## [0.1.7](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.7) - 2016-06-29
|
||||
## [0.1.6](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.6) - 2016-04-13
|
||||
## [0.1.5](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.5) - 2016-02-24
|
||||
## [0.1.4](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.4) - 2016-02-15
|
||||
## [0.1.3](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.3) - 2015-12-03
|
||||
## [0.1.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.2) - 2015-11-25
|
||||
## [0.1.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.1.1) - 2015-11-13
|
||||
## [0.0.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.0.1) - 2015-11-13
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Fabio Caccamo - fabio.caccamo@gmail.com
|
||||
Copyright (c) 2016 - present, 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,48 +1,197 @@
|
||||
#django-admin-interface
|
||||
[](https://www.python.org/)
|
||||
[](https://www.djangoproject.com/)
|
||||
|
||||
[](https://pypi.org/project/django-admin-interface/)
|
||||
[](https://pepy.tech/project/django-admin-interface)
|
||||
[](https://github.com/fabiocaccamo/django-admin-interface/)
|
||||
[](https://badges.pufler.dev)
|
||||
[](https://github.com/fabiocaccamo/django-admin-interface/blob/master/LICENSE.txt)
|
||||
|
||||
[](https://travis-ci.org/fabiocaccamo/django-admin-interface)
|
||||
[](https://codecov.io/gh/fabiocaccamo/django-admin-interface)
|
||||
[](https://www.codacy.com/app/fabiocaccamo/django-admin-interface)
|
||||
[](https://codeclimate.com/github/fabiocaccamo/django-admin-interface/)
|
||||
[](https://requires.io/github/fabiocaccamo/django-admin-interface/requirements/?branch=master)
|
||||
|
||||
# django-admin-interface
|
||||
django-admin-interface is a modern **responsive flat admin interface customizable by the admin itself**.
|
||||
|
||||
You can use the builtin **django-theme** or create your own and **customize** **title, logo and colors**.
|
||||

|
||||
|
||||
##Requirements
|
||||
- Python 2.6, Python 2.7, Python 3.4
|
||||
- Django 1.6.5 through Django 1.10
|
||||
## Features
|
||||
- Beautiful default **django-theme**
|
||||
- Themes management and customization *(you can **customize admin title, logo and colors**)*
|
||||
- Responsive
|
||||
- Related modal *(instead of the old popup window)*
|
||||
- Environment name/marker
|
||||
- Language chooser
|
||||
- List filter dropdown
|
||||
- `NEW` **List filter sticky**
|
||||
- `NEW` **Form controls sticky** *(pagination and save/delete buttons)*
|
||||
- Compatibility / Style optimizations for:
|
||||
- `django-ckeditor`
|
||||
- `django-dynamic-raw-id`
|
||||
- `django-json-widget`
|
||||
- `django-modeltranslation`
|
||||
- `django-tabbed-admin`
|
||||
- `sorl-thumbnail`
|
||||
|
||||
##Installation
|
||||
## Installation
|
||||
- Run `pip install django-admin-interface`
|
||||
- Add `admin_interface`, `flat_responsive`, `flat` and `colorfield` to `settings.INSTALLED_APPS` **before** `django.contrib.admin`
|
||||
```python
|
||||
INSTALLED_APPS = (
|
||||
#...
|
||||
'admin_interface',
|
||||
'flat_responsive',
|
||||
'flat', #if django version < 1.9
|
||||
'flat_responsive', # only if django version < 2.0
|
||||
'flat', # only if django version < 1.9
|
||||
'colorfield',
|
||||
#...
|
||||
'django.contrib.admin',
|
||||
#...
|
||||
)
|
||||
|
||||
# only if django version >= 3.0
|
||||
X_FRAME_OPTIONS = 'SAMEORIGIN'
|
||||
SILENCED_SYSTEM_CHECKS = ['security.W019']
|
||||
```
|
||||
- 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.
|
||||
|
||||
### Add theme support to third-party libraries
|
||||
You can add **theme support to existing third-party libraries** using the following **css variables**:
|
||||
|
||||
- `--admin-interface-title-color`
|
||||
- `--admin-interface-logo-color`
|
||||
- `--admin-interface-env-color`
|
||||
- `--admin-interface-header-background-color:`
|
||||
- `--admin-interface-header-text-color`
|
||||
- `--admin-interface-header-link-color`
|
||||
- `--admin-interface-header-link_hover-color`
|
||||
- `--admin-interface-module-background-color`
|
||||
- `--admin-interface-module-background-selected-color`
|
||||
- `--admin-interface-module-text-color`
|
||||
- `--admin-interface-module-link-color`
|
||||
- `--admin-interface-module-link-selected-color`
|
||||
- `--admin-interface-module-link-hover-color`
|
||||
- `--admin-interface-generic-link-color`
|
||||
- `--admin-interface-generic-link-hover-color`
|
||||
- `--admin-interface-save-button-background-color`
|
||||
- `--admin-interface-save-button-background-hover-color`
|
||||
- `--admin-interface-save-button-text-color`
|
||||
- `--admin-interface-delete-button-background-color`
|
||||
- `--admin-interface-delete-button-background-hover-color`
|
||||
- `--admin-interface-delete-button-text-color`
|
||||
- `--admin-interface-related-modal-background-color`
|
||||
- `--admin-interface-related-modal-background-opacity`
|
||||
|
||||
|
||||
## 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-flat-responsive](https://github.com/elky/django-flat-responsive)
|
||||
- [django-colorfield](https://github.com/jaredly/django-colorfield/)
|
||||
## FAQ
|
||||
- #### I already have a custom `base_site.html`, how can I make it work?
|
||||
|
||||
##License
|
||||
Released under [MIT License](LICENSE).
|
||||
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`
|
||||
|
||||
## Testing
|
||||
```bash
|
||||
# create python virtual environment
|
||||
virtualenv testing_django_admin_interface
|
||||
|
||||
# activate virtualenv
|
||||
cd testing_django_admin_interface && . bin/activate
|
||||
|
||||
# clone repo
|
||||
git clone https://github.com/fabiocaccamo/django-admin-interface.git src && cd src
|
||||
|
||||
# install dependencies
|
||||
pip install -r requirements.txt
|
||||
|
||||
# run tests
|
||||
tox
|
||||
# or
|
||||
python setup.py test
|
||||
# or
|
||||
python -m django test --settings "tests.settings"
|
||||
```
|
||||
|
||||
## License
|
||||
Released under [MIT License](LICENSE.txt).
|
||||
|
||||
---
|
||||
|
||||
## Supporting
|
||||
|
||||
I would like to spend more time on this project, especially to improve it and adding new features.
|
||||
|
||||
As everyone knows open-source projects takes up a lot of time that is unpaid. :money_with_wings:
|
||||
|
||||
If you are using this package in commercial project(s), please consider the idea to become a sponsor or donating once:
|
||||
|
||||
- [GitHub Sponsor](https://github.com/sponsors/fabiocaccamo)
|
||||
- [PayPal](https://www.paypal.me/fabiocaccamo)
|
||||
- BTC: bc1q2t0pv8z3udpyuvfnx5kskhqdad4dcvtfuzmvjw
|
||||
- ETH: 0x8B55Fb7798b5A9F797A4455C00821B6e53daca74
|
||||
|
||||
## See also
|
||||
|
||||
- [`django-colorfield`](https://github.com/fabiocaccamo/django-colorfield) - simple color field for models with a nice color-picker in the admin. 🎨
|
||||
|
||||
- [`django-extra-settings`](https://github.com/fabiocaccamo/django-extra-settings) - config and manage typed extra settings using just the django admin. ⚙️
|
||||
|
||||
- [`django-maintenance-mode`](https://github.com/fabiocaccamo/django-maintenance-mode) - shows a 503 error page when maintenance-mode is on. 🚧 🛠️
|
||||
|
||||
- [`django-redirects`](https://github.com/fabiocaccamo/django-redirects) - redirects with full control. ↪️
|
||||
|
||||
- [`django-treenode`](https://github.com/fabiocaccamo/django-treenode) - probably the best abstract model / admin for your tree based stuff. 🌳
|
||||
|
||||
- [`python-benedict`](https://github.com/fabiocaccamo/python-benedict) - dict subclass with keylist/keypath support, I/O shortcuts (base64, csv, json, pickle, plist, query-string, toml, xml, yaml) and many utilities. 📘
|
||||
|
||||
- [`python-codicefiscale`](https://github.com/fabiocaccamo/python-codicefiscale) - encode/decode Italian fiscal codes - codifica/decodifica del Codice Fiscale. 🇮🇹 💳
|
||||
|
||||
- [`python-fsutil`](https://github.com/fabiocaccamo/python-fsutil) - file-system utilities for lazy devs. 🧟♂️
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from admin_interface.version import __version__
|
||||
|
||||
default_app_config = 'admin_interface.apps.AdminInterfaceConfig'
|
||||
|
||||
|
||||
+100
-19
@@ -1,55 +1,136 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.contrib import admin
|
||||
|
||||
from admin_interface.compat import gettext_lazy as _
|
||||
from admin_interface.models import Theme
|
||||
|
||||
from django.contrib import admin
|
||||
|
||||
|
||||
class ThemeAdmin(admin.ModelAdmin):
|
||||
|
||||
list_display = ('name', 'active', )
|
||||
list_editable = ('active', )
|
||||
list_per_page = 100
|
||||
show_full_result_count = False
|
||||
|
||||
fieldsets = (
|
||||
(None, {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('name', 'active', )
|
||||
}),
|
||||
('Logo', {
|
||||
(_('Environment'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('logo', 'logo_visible', )
|
||||
'fields': (
|
||||
'env_name',
|
||||
'env_color',
|
||||
'env_visible_in_header',
|
||||
'env_visible_in_favicon',
|
||||
)
|
||||
}),
|
||||
('Title', {
|
||||
(_('Language chooser'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('title', 'title_visible', )
|
||||
'fields': (
|
||||
'language_chooser_active',
|
||||
'language_chooser_display',
|
||||
)
|
||||
}),
|
||||
('Header', {
|
||||
(_('Logo'), {
|
||||
'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': (
|
||||
'logo',
|
||||
'logo_max_width',
|
||||
'logo_max_height',
|
||||
'logo_color',
|
||||
'logo_visible',
|
||||
)
|
||||
}),
|
||||
('Breadcrumbs / Module headers', {
|
||||
(_('Favicon'), {
|
||||
'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': ('favicon', )
|
||||
}),
|
||||
('Generic Links', {
|
||||
(_('Title'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_generic_link_color', 'css_generic_link_hover_color', )
|
||||
'fields': (
|
||||
'title',
|
||||
'title_color',
|
||||
'title_visible',
|
||||
)
|
||||
}),
|
||||
('Save Buttons', {
|
||||
(_('Header'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_save_button_background_color', 'css_save_button_background_hover_color', 'css_save_button_text_color', )
|
||||
'fields': (
|
||||
'css_header_background_color',
|
||||
'css_header_text_color',
|
||||
'css_header_link_color',
|
||||
'css_header_link_hover_color',
|
||||
)
|
||||
}),
|
||||
('Delete Buttons', {
|
||||
(_('Breadcrumbs / Module headers'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('css_delete_button_background_color', 'css_delete_button_background_hover_color', 'css_delete_button_text_color', )
|
||||
'fields': (
|
||||
'css_module_background_color',
|
||||
'css_module_background_selected_color',
|
||||
'css_module_text_color',
|
||||
'css_module_link_color',
|
||||
'css_module_link_selected_color',
|
||||
'css_module_link_hover_color',
|
||||
'css_module_rounded_corners',
|
||||
)
|
||||
}),
|
||||
('Extras', {
|
||||
(_('Generic Links'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('list_filter_dropdown', )
|
||||
'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',
|
||||
)
|
||||
}),
|
||||
(_('Delete Buttons'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': (
|
||||
'css_delete_button_background_color',
|
||||
'css_delete_button_background_hover_color',
|
||||
'css_delete_button_text_color',
|
||||
)
|
||||
}),
|
||||
(_('Related Modal'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': (
|
||||
'related_modal_active',
|
||||
'related_modal_background_color',
|
||||
'related_modal_background_opacity',
|
||||
'related_modal_rounded_corners',
|
||||
'related_modal_close_button_visible',
|
||||
)
|
||||
}),
|
||||
(_('Form Controls'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': (
|
||||
'form_submit_sticky',
|
||||
'form_pagination_sticky',
|
||||
)
|
||||
}),
|
||||
(_('List Filter'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': (
|
||||
'list_filter_dropdown',
|
||||
'list_filter_sticky',
|
||||
)
|
||||
}),
|
||||
(_('Recent Actions'), {
|
||||
'classes': ('wide', ),
|
||||
'fields': ('recent_actions_visible', )
|
||||
}),
|
||||
)
|
||||
|
||||
save_on_top = True
|
||||
|
||||
admin.site.register(Theme, ThemeAdmin)
|
||||
|
||||
admin.site.register(Theme, ThemeAdmin)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from admin_interface.compat import gettext_lazy as _
|
||||
|
||||
from django.apps import AppConfig
|
||||
from django.db.models.signals import post_migrate
|
||||
|
||||
@@ -7,10 +9,14 @@ from django.db.models.signals import post_migrate
|
||||
class AdminInterfaceConfig(AppConfig):
|
||||
|
||||
name = 'admin_interface'
|
||||
verbose_name = 'Admin Interface'
|
||||
verbose_name = _('Admin Interface')
|
||||
default_auto_field = 'django.db.models.AutoField'
|
||||
|
||||
def ready(self):
|
||||
|
||||
from admin_interface import settings
|
||||
from admin_interface.models import Theme
|
||||
post_migrate.connect(Theme.post_migrate_handler, sender = self)
|
||||
|
||||
settings.check_installed_apps()
|
||||
post_migrate.connect(
|
||||
Theme.post_migrate_handler, sender=self)
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache, caches
|
||||
|
||||
|
||||
def app_cache():
|
||||
return caches['admin_interface'] if 'admin_interface' in settings.CACHES else cache
|
||||
|
||||
|
||||
def del_cached_active_theme():
|
||||
app_cache().delete('admin_interface_theme')
|
||||
|
||||
|
||||
def get_cached_active_theme():
|
||||
return app_cache().get('admin_interface_theme', None)
|
||||
|
||||
|
||||
def set_cached_active_theme(theme):
|
||||
app_cache().set('admin_interface_theme', theme)
|
||||
@@ -0,0 +1,17 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import django
|
||||
|
||||
if django.VERSION < (2, 0):
|
||||
from django.utils.encoding import force_text as force_str
|
||||
from django.utils.translation import ugettext_lazy as gettext_lazy
|
||||
else:
|
||||
from django.utils.encoding import force_str
|
||||
from django.utils.translation import gettext_lazy
|
||||
|
||||
if django.VERSION >= (1, 11):
|
||||
from django.core.validators import FileExtensionValidator
|
||||
else:
|
||||
def FileExtensionValidator(*args, **kwargs):
|
||||
def noop(*args, **kwargs):
|
||||
pass
|
||||
@@ -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": "Django administration",
|
||||
"title_color": "#FFFFFF",
|
||||
"title_visible": false,
|
||||
"logo": "",
|
||||
"logo_color": "#FFFFFF",
|
||||
"logo_visible": true,
|
||||
"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,39 @@
|
||||
[{"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",
|
||||
"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
|
||||
}
|
||||
}
|
||||
]
|
||||
Binary file not shown.
@@ -0,0 +1,206 @@
|
||||
# This file is distributed under the same license as the
|
||||
# django-admin-interface package.
|
||||
#
|
||||
# Translators:
|
||||
# Martin Vuelta <martin.vuelta@softbutterfly.io>, 2018
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: django-admin-interface\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-04 09:18+0000\n"
|
||||
"PO-Revision-Date: 2018-12-30 19:13-0500\n"
|
||||
"Last-Translator: Martin Vuelta <martin.vuelta@softbutterfly.io>\n"
|
||||
"Language-Team: Spanish <dev@softbutterfly.io>\n"
|
||||
"Language: Spanish \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: admin_interface/admin.py:21
|
||||
msgid "Environment"
|
||||
msgstr "Ambiente"
|
||||
|
||||
#: admin_interface/admin.py:30
|
||||
msgid "Language chooser"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/admin.py:37
|
||||
msgid "Logo"
|
||||
msgstr "Logo"
|
||||
|
||||
#: admin_interface/admin.py:45
|
||||
msgid "Favicon"
|
||||
msgstr "Favicon"
|
||||
|
||||
#: admin_interface/admin.py:49
|
||||
msgid "Title"
|
||||
msgstr "Título"
|
||||
|
||||
#: admin_interface/admin.py:57
|
||||
msgid "Header"
|
||||
msgstr "Encabezado"
|
||||
|
||||
#: admin_interface/admin.py:66
|
||||
msgid "Breadcrumbs / Module headers"
|
||||
msgstr "Breadcrumbs / Encabezados de módulos"
|
||||
|
||||
#: admin_interface/admin.py:76
|
||||
msgid "Generic Links"
|
||||
msgstr "Enlaces genéricos"
|
||||
|
||||
#: admin_interface/admin.py:83
|
||||
msgid "Save Buttons"
|
||||
msgstr "Botones de guardar"
|
||||
|
||||
#: admin_interface/admin.py:91
|
||||
msgid "Delete Buttons"
|
||||
msgstr "Botones de borrar"
|
||||
|
||||
#: admin_interface/admin.py:99
|
||||
msgid "Related Modal"
|
||||
msgstr "Modal para objetos relacionados"
|
||||
|
||||
#: admin_interface/admin.py:109
|
||||
msgid "List Filter"
|
||||
msgstr "Lista de filtros"
|
||||
|
||||
#: admin_interface/admin.py:113
|
||||
msgid "Recent Actions"
|
||||
msgstr "Acciones recientes"
|
||||
|
||||
#: admin_interface/apps.py:11
|
||||
msgid "Admin Interface"
|
||||
msgstr "Interfaz de administración"
|
||||
|
||||
#: admin_interface/models.py:72 admin_interface/models.py:116
|
||||
#: admin_interface/models.py:135
|
||||
msgid "name"
|
||||
msgstr "Nombre"
|
||||
|
||||
#: admin_interface/models.py:75 admin_interface/models.py:132
|
||||
#: admin_interface/models.py:253
|
||||
msgid "active"
|
||||
msgstr "Activo"
|
||||
|
||||
#: admin_interface/models.py:79
|
||||
#: admin_interface/templates/admin/base_site.html:6
|
||||
#: admin_interface/templates/admin/base_site.html:60
|
||||
msgid "Django administration"
|
||||
msgstr "Administración de Django"
|
||||
|
||||
#: admin_interface/models.py:81
|
||||
msgid "title"
|
||||
msgstr "Título"
|
||||
|
||||
#: admin_interface/models.py:87 admin_interface/models.py:102
|
||||
#: admin_interface/models.py:122
|
||||
#, fuzzy
|
||||
#| msgid "logo color"
|
||||
msgid "color"
|
||||
msgstr "color de logo"
|
||||
|
||||
#: admin_interface/models.py:90 admin_interface/models.py:105
|
||||
#: admin_interface/models.py:289
|
||||
msgid "visible"
|
||||
msgstr "Visible"
|
||||
|
||||
#: admin_interface/models.py:95
|
||||
msgid "Leave blank to use the default Django logo"
|
||||
msgstr "Dejar en blanco para usaer el logo por defecto de Django"
|
||||
|
||||
#: admin_interface/models.py:96
|
||||
msgid "logo"
|
||||
msgstr "logo"
|
||||
|
||||
#: admin_interface/models.py:110
|
||||
msgid "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
msgstr "Formatos ico, png o gif. Tamaños de 16x16 o 32x32 pixeles"
|
||||
|
||||
#: admin_interface/models.py:111
|
||||
msgid "favicon"
|
||||
msgstr "favicon"
|
||||
|
||||
#: admin_interface/models.py:120
|
||||
msgid ""
|
||||
"(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: "
|
||||
"#3498DB)"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:125
|
||||
msgid "visible in header (marker and name)"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:128
|
||||
msgid "visible in favicon (marker)"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:134
|
||||
msgid "code"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:141
|
||||
msgid "display"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:148 admin_interface/models.py:173
|
||||
#: admin_interface/models.py:214 admin_interface/models.py:233
|
||||
#: admin_interface/models.py:259
|
||||
msgid "background color"
|
||||
msgstr "color de fondo"
|
||||
|
||||
#: admin_interface/models.py:154 admin_interface/models.py:179
|
||||
#: admin_interface/models.py:226 admin_interface/models.py:245
|
||||
#: admin_interface/models.py:249
|
||||
msgid "text color"
|
||||
msgstr "color de texto"
|
||||
|
||||
#: admin_interface/models.py:160 admin_interface/models.py:185
|
||||
#: admin_interface/models.py:201
|
||||
msgid "link color"
|
||||
msgstr "color de enlace"
|
||||
|
||||
#: admin_interface/models.py:166 admin_interface/models.py:191
|
||||
#: admin_interface/models.py:207
|
||||
msgid "link hover color"
|
||||
msgstr "color de enlace (hover)"
|
||||
|
||||
#: admin_interface/models.py:194 admin_interface/models.py:279
|
||||
msgid "rounded corners"
|
||||
msgstr "esquinas redondas"
|
||||
|
||||
#: admin_interface/models.py:220 admin_interface/models.py:239
|
||||
msgid "background hover color"
|
||||
msgstr "color de fondo (hover)"
|
||||
|
||||
#: admin_interface/models.py:276
|
||||
msgid "background opacity"
|
||||
msgstr "opacidad de fondo"
|
||||
|
||||
#: admin_interface/models.py:282
|
||||
msgid "close button visible"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:286
|
||||
msgid "use dropdown"
|
||||
msgstr "Usar lista desplegable"
|
||||
|
||||
#: admin_interface/models.py:298
|
||||
msgid "Theme"
|
||||
msgstr "Tema"
|
||||
|
||||
#: admin_interface/models.py:299
|
||||
msgid "Themes"
|
||||
msgstr "Temas"
|
||||
|
||||
#: admin_interface/templates/admin/filter.html:13
|
||||
#: admin_interface/templates/admin_interface/dropdown_filter.html:4
|
||||
#, python-format
|
||||
msgid " By %(filter_title)s "
|
||||
msgstr " Por %(filter_title)s "
|
||||
|
||||
#: admin_interface/templates/admin/popup_response.html:3
|
||||
msgid "Popup closing..."
|
||||
msgstr "Cerando popup..."
|
||||
Binary file not shown.
@@ -0,0 +1,205 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Amir Ajorloo <amirajorloo@gmail.com>, 2020.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: django-admin-interface\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-10-12 19:23+0330\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Amir Ajorloo <amirajorloo@gmail.com>\n"
|
||||
"Language-Team: Farsi <LL@li.org>\n"
|
||||
"Language: Farsi"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: admin_interface/admin.py:21
|
||||
msgid "Environment"
|
||||
msgstr "محیط"
|
||||
|
||||
#: admin_interface/admin.py:30
|
||||
msgid "Language chooser"
|
||||
msgstr "انتخاب زبان"
|
||||
|
||||
#: admin_interface/admin.py:37
|
||||
msgid "Logo"
|
||||
msgstr "لوگو"
|
||||
|
||||
#: admin_interface/admin.py:45
|
||||
msgid "Favicon"
|
||||
msgstr "آیکون تب"
|
||||
|
||||
#: admin_interface/admin.py:49
|
||||
msgid "Title"
|
||||
msgstr "عنوان"
|
||||
|
||||
#: admin_interface/admin.py:57
|
||||
msgid "Header"
|
||||
msgstr "هدر"
|
||||
|
||||
#: admin_interface/admin.py:66
|
||||
msgid "Breadcrumbs / Module headers"
|
||||
msgstr "مسیر صفحه"
|
||||
|
||||
#: admin_interface/admin.py:76
|
||||
msgid "Generic Links"
|
||||
msgstr "لینکهای عمومی"
|
||||
|
||||
#: admin_interface/admin.py:83
|
||||
msgid "Save Buttons"
|
||||
msgstr "دکمههای ذخیره"
|
||||
|
||||
#: admin_interface/admin.py:91
|
||||
msgid "Delete Buttons"
|
||||
msgstr "دکمههای حذف"
|
||||
|
||||
#: admin_interface/admin.py:99
|
||||
msgid "Related Modal"
|
||||
msgstr "مدلهای مرتبط"
|
||||
|
||||
#: admin_interface/admin.py:109
|
||||
msgid "List Filter"
|
||||
msgstr "فیلترهای لیست"
|
||||
|
||||
#: admin_interface/admin.py:113
|
||||
msgid "Recent Actions"
|
||||
msgstr "فعالیتهای اخیر"
|
||||
|
||||
#: admin_interface/apps.py:11
|
||||
msgid "Admin Interface"
|
||||
msgstr "ظاهر ادمین"
|
||||
|
||||
#: admin_interface/models.py:72 admin_interface/models.py:116
|
||||
#: admin_interface/models.py:135
|
||||
msgid "name"
|
||||
msgstr "نام"
|
||||
|
||||
#: admin_interface/models.py:75 admin_interface/models.py:132
|
||||
#: admin_interface/models.py:253
|
||||
msgid "active"
|
||||
msgstr "فعال"
|
||||
|
||||
#: admin_interface/models.py:79
|
||||
#: admin_interface/templates/admin/base_site.html:6
|
||||
#: admin_interface/templates/admin/base_site.html:60
|
||||
msgid "Django administration"
|
||||
msgstr "مدیریت جنگو"
|
||||
|
||||
#: admin_interface/models.py:81
|
||||
msgid "title"
|
||||
msgstr "عنوان"
|
||||
|
||||
#: admin_interface/models.py:87 admin_interface/models.py:102
|
||||
#: admin_interface/models.py:122
|
||||
msgid "color"
|
||||
msgstr "رنگ"
|
||||
|
||||
#: admin_interface/models.py:90 admin_interface/models.py:105
|
||||
#: admin_interface/models.py:289
|
||||
msgid "visible"
|
||||
msgstr "نمایان"
|
||||
|
||||
#: admin_interface/models.py:95
|
||||
msgid "Leave blank to use the default Django logo"
|
||||
msgstr "برای نمایش لوگوی پیش فرض، خالی بگذارید."
|
||||
|
||||
#: admin_interface/models.py:96
|
||||
msgid "logo"
|
||||
msgstr "لوگو"
|
||||
|
||||
#: admin_interface/models.py:110
|
||||
msgid "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
msgstr "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
|
||||
#: admin_interface/models.py:111
|
||||
msgid "favicon"
|
||||
msgstr "آیکون تب"
|
||||
|
||||
#: admin_interface/models.py:120
|
||||
msgid ""
|
||||
"(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: "
|
||||
"#3498DB)"
|
||||
msgstr ""
|
||||
"(قرمز: #E74C3C, نارنجی: #E67E22, زرد: #F1C40F, سبز: #2ECC71, آبی: "
|
||||
"#3498DB)"
|
||||
|
||||
#: admin_interface/models.py:125
|
||||
msgid "visible in header (marker and name)"
|
||||
msgstr "نمایان در هدر"
|
||||
|
||||
#: admin_interface/models.py:128
|
||||
msgid "visible in favicon (marker)"
|
||||
msgstr "نمایان در آیکون تب"
|
||||
|
||||
#: admin_interface/models.py:134
|
||||
msgid "code"
|
||||
msgstr "کد"
|
||||
|
||||
#: admin_interface/models.py:141
|
||||
msgid "display"
|
||||
msgstr "نمایش"
|
||||
|
||||
#: admin_interface/models.py:148 admin_interface/models.py:173
|
||||
#: admin_interface/models.py:214 admin_interface/models.py:233
|
||||
#: admin_interface/models.py:259
|
||||
msgid "background color"
|
||||
msgstr "رنگ پسزمینه"
|
||||
|
||||
#: admin_interface/models.py:154 admin_interface/models.py:179
|
||||
#: admin_interface/models.py:226 admin_interface/models.py:245
|
||||
#: admin_interface/models.py:249
|
||||
msgid "text color"
|
||||
msgstr "رنگ متن"
|
||||
|
||||
#: admin_interface/models.py:160 admin_interface/models.py:185
|
||||
#: admin_interface/models.py:201
|
||||
msgid "link color"
|
||||
msgstr "رنگ لینک"
|
||||
|
||||
#: admin_interface/models.py:166 admin_interface/models.py:191
|
||||
#: admin_interface/models.py:207
|
||||
msgid "link hover color"
|
||||
msgstr "رنگ لینک در حالت هاور"
|
||||
|
||||
#: admin_interface/models.py:194 admin_interface/models.py:279
|
||||
msgid "rounded corners"
|
||||
msgstr "گوشههای خمیده"
|
||||
|
||||
#: admin_interface/models.py:220 admin_interface/models.py:239
|
||||
msgid "background hover color"
|
||||
msgstr "رنگ پسزمینه در حالت هاور"
|
||||
|
||||
#: admin_interface/models.py:276
|
||||
msgid "background opacity"
|
||||
msgstr "شفافیت بکگراند"
|
||||
|
||||
#: admin_interface/models.py:282
|
||||
msgid "close button visible"
|
||||
msgstr "دکمه بستن نمایان باشد"
|
||||
|
||||
#: admin_interface/models.py:286
|
||||
msgid "use dropdown"
|
||||
msgstr "استفاده از دراپ داون"
|
||||
|
||||
#: admin_interface/models.py:298
|
||||
msgid "Theme"
|
||||
msgstr "تم"
|
||||
|
||||
#: admin_interface/models.py:299
|
||||
msgid "Themes"
|
||||
msgstr "تمها"
|
||||
|
||||
#: admin_interface/templates/admin/filter.html:13
|
||||
#: admin_interface/templates/admin_interface/dropdown_filter.html:4
|
||||
#, python-format
|
||||
msgid " By %(filter_title)s "
|
||||
msgstr " توسط %(filter_title)s "
|
||||
|
||||
#: admin_interface/templates/admin/popup_response.html:3
|
||||
msgid "Popup closing..."
|
||||
msgstr "پاپ آپ در حال بسته شدن..."
|
||||
Binary file not shown.
@@ -0,0 +1,205 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-04 09:18+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: admin_interface/admin.py:21
|
||||
msgid "Environment"
|
||||
msgstr "Environnment"
|
||||
|
||||
#: admin_interface/admin.py:30
|
||||
msgid "Language chooser"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/admin.py:37
|
||||
msgid "Logo"
|
||||
msgstr "Logo"
|
||||
|
||||
#: admin_interface/admin.py:45
|
||||
msgid "Favicon"
|
||||
msgstr "Favicon"
|
||||
|
||||
#: admin_interface/admin.py:49
|
||||
msgid "Title"
|
||||
msgstr "Titre"
|
||||
|
||||
#: admin_interface/admin.py:57
|
||||
msgid "Header"
|
||||
msgstr "Bannière"
|
||||
|
||||
#: admin_interface/admin.py:66
|
||||
msgid "Breadcrumbs / Module headers"
|
||||
msgstr "Fil d'ariane / en-têtes de module"
|
||||
|
||||
#: admin_interface/admin.py:76
|
||||
msgid "Generic Links"
|
||||
msgstr "Liens génériques"
|
||||
|
||||
#: admin_interface/admin.py:83
|
||||
msgid "Save Buttons"
|
||||
msgstr "Boutons sauvegarder"
|
||||
|
||||
#: admin_interface/admin.py:91
|
||||
msgid "Delete Buttons"
|
||||
msgstr "Boutons supprimer"
|
||||
|
||||
#: admin_interface/admin.py:99
|
||||
msgid "Related Modal"
|
||||
msgstr "Modale pour objet reliés"
|
||||
|
||||
#: admin_interface/admin.py:109
|
||||
msgid "List Filter"
|
||||
msgstr "Filtre de liste"
|
||||
|
||||
#: admin_interface/admin.py:113
|
||||
msgid "Recent Actions"
|
||||
msgstr "Actions récentes"
|
||||
|
||||
#: admin_interface/apps.py:11
|
||||
msgid "Admin Interface"
|
||||
msgstr "Interface Admin"
|
||||
|
||||
#: admin_interface/models.py:72 admin_interface/models.py:116
|
||||
#: admin_interface/models.py:135
|
||||
msgid "name"
|
||||
msgstr "nom"
|
||||
|
||||
#: admin_interface/models.py:75 admin_interface/models.py:132
|
||||
#: admin_interface/models.py:253
|
||||
msgid "active"
|
||||
msgstr "actif"
|
||||
|
||||
#: admin_interface/models.py:79
|
||||
#: admin_interface/templates/admin/base_site.html:6
|
||||
#: admin_interface/templates/admin/base_site.html:60
|
||||
msgid "Django administration"
|
||||
msgstr "Administration Django"
|
||||
|
||||
#: admin_interface/models.py:81
|
||||
msgid "title"
|
||||
msgstr "titre"
|
||||
|
||||
#: admin_interface/models.py:87 admin_interface/models.py:102
|
||||
#: admin_interface/models.py:122
|
||||
msgid "color"
|
||||
msgstr "couleur"
|
||||
|
||||
#: admin_interface/models.py:90 admin_interface/models.py:105
|
||||
#: admin_interface/models.py:289
|
||||
msgid "visible"
|
||||
msgstr "visible"
|
||||
|
||||
#: admin_interface/models.py:95
|
||||
msgid "Leave blank to use the default Django logo"
|
||||
msgstr "Laisser vide pour utiliser le logo Django par défaut"
|
||||
|
||||
#: admin_interface/models.py:96
|
||||
msgid "logo"
|
||||
msgstr "logo"
|
||||
|
||||
#: admin_interface/models.py:110
|
||||
msgid "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
msgstr "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
|
||||
#: admin_interface/models.py:111
|
||||
msgid "favicon"
|
||||
msgstr "favicon"
|
||||
|
||||
#: admin_interface/models.py:120
|
||||
msgid ""
|
||||
"(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: "
|
||||
"#3498DB)"
|
||||
msgstr ""
|
||||
"(rouge: #E74C3C, orange: #E67E22, jaune: #F1C40F, vert: #2ECC71, bleu: "
|
||||
"#3498DB)"
|
||||
|
||||
#: admin_interface/models.py:125
|
||||
msgid "visible in header (marker and name)"
|
||||
msgstr "visible dans l’en-tête (marqueur et nom)"
|
||||
|
||||
#: admin_interface/models.py:128
|
||||
msgid "visible in favicon (marker)"
|
||||
msgstr "visible dans la favicon (marqueur)"
|
||||
|
||||
#: admin_interface/models.py:134
|
||||
msgid "code"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:141
|
||||
msgid "display"
|
||||
msgstr ""
|
||||
|
||||
#: admin_interface/models.py:148 admin_interface/models.py:173
|
||||
#: admin_interface/models.py:214 admin_interface/models.py:233
|
||||
#: admin_interface/models.py:259
|
||||
msgid "background color"
|
||||
msgstr "couleur d'arrière-plan"
|
||||
|
||||
#: admin_interface/models.py:154 admin_interface/models.py:179
|
||||
#: admin_interface/models.py:226 admin_interface/models.py:245
|
||||
#: admin_interface/models.py:249
|
||||
msgid "text color"
|
||||
msgstr "couleur du texte"
|
||||
|
||||
#: admin_interface/models.py:160 admin_interface/models.py:185
|
||||
#: admin_interface/models.py:201
|
||||
msgid "link color"
|
||||
msgstr "couleur de lien"
|
||||
|
||||
#: admin_interface/models.py:166 admin_interface/models.py:191
|
||||
#: admin_interface/models.py:207
|
||||
msgid "link hover color"
|
||||
msgstr "couleur de lien au survol"
|
||||
|
||||
#: admin_interface/models.py:194 admin_interface/models.py:279
|
||||
msgid "rounded corners"
|
||||
msgstr "coins arrondis"
|
||||
|
||||
#: admin_interface/models.py:220 admin_interface/models.py:239
|
||||
msgid "background hover color"
|
||||
msgstr "couleur de fond au survol"
|
||||
|
||||
#: admin_interface/models.py:276
|
||||
msgid "background opacity"
|
||||
msgstr "opacité de l'arrière-plan"
|
||||
|
||||
#: admin_interface/models.py:282
|
||||
msgid "close button visible"
|
||||
msgstr "bouton fermer visible"
|
||||
|
||||
#: admin_interface/models.py:286
|
||||
msgid "use dropdown"
|
||||
msgstr "utiliser un menu déroulant"
|
||||
|
||||
#: admin_interface/models.py:298
|
||||
msgid "Theme"
|
||||
msgstr "Thème"
|
||||
|
||||
#: admin_interface/models.py:299
|
||||
msgid "Themes"
|
||||
msgstr "Thèmes"
|
||||
|
||||
#: admin_interface/templates/admin/filter.html:13
|
||||
#: admin_interface/templates/admin_interface/dropdown_filter.html:4
|
||||
#, python-format
|
||||
msgid " By %(filter_title)s "
|
||||
msgstr " Par %(filter_title)s "
|
||||
|
||||
#: admin_interface/templates/admin/popup_response.html:3
|
||||
msgid "Popup closing..."
|
||||
msgstr "Fermeture de la modale..."
|
||||
Binary file not shown.
@@ -0,0 +1,206 @@
|
||||
# This file is distributed under the same license as the
|
||||
# django-admin-interface package.
|
||||
#
|
||||
# Translators:
|
||||
# Fabio Caccamo <fabio.caccamo@gmail.com>, 2018
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: django-admin-interface\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-04 09:19+0000\n"
|
||||
"PO-Revision-Date: 2018-12-30 19:13-0500\n"
|
||||
"Last-Translator: Fabio Caccamo <fabio.caccamo@gmail.com>\n"
|
||||
"Language-Team: Italian <LL@li.org>\n"
|
||||
"Language: Italian \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: admin_interface/admin.py:21
|
||||
msgid "Environment"
|
||||
msgstr "Ambiente"
|
||||
|
||||
#: admin_interface/admin.py:30
|
||||
msgid "Language chooser"
|
||||
msgstr "Selettore di lingua"
|
||||
|
||||
#: admin_interface/admin.py:37
|
||||
msgid "Logo"
|
||||
msgstr "Logo"
|
||||
|
||||
#: admin_interface/admin.py:45
|
||||
msgid "Favicon"
|
||||
msgstr "Favicon"
|
||||
|
||||
#: admin_interface/admin.py:49
|
||||
msgid "Title"
|
||||
msgstr "Titolo"
|
||||
|
||||
#: admin_interface/admin.py:57
|
||||
msgid "Header"
|
||||
msgstr "Header"
|
||||
|
||||
#: admin_interface/admin.py:66
|
||||
msgid "Breadcrumbs / Module headers"
|
||||
msgstr "Breadcrumbs / Header dei moduli"
|
||||
|
||||
#: admin_interface/admin.py:76
|
||||
msgid "Generic Links"
|
||||
msgstr "Link generici"
|
||||
|
||||
#: admin_interface/admin.py:83
|
||||
msgid "Save Buttons"
|
||||
msgstr "Pulsanti per salvare"
|
||||
|
||||
#: admin_interface/admin.py:91
|
||||
msgid "Delete Buttons"
|
||||
msgstr "Pulsanti per eliminare"
|
||||
|
||||
#: admin_interface/admin.py:99
|
||||
msgid "Related Modal"
|
||||
msgstr "Modale per gli oggetti correlati"
|
||||
|
||||
#: admin_interface/admin.py:109
|
||||
msgid "List Filter"
|
||||
msgstr "Filtro listato"
|
||||
|
||||
#: admin_interface/admin.py:113
|
||||
msgid "Recent Actions"
|
||||
msgstr "Azioni recenti"
|
||||
|
||||
#: admin_interface/apps.py:11
|
||||
msgid "Admin Interface"
|
||||
msgstr "Interfaccia di amministrazione"
|
||||
|
||||
#: admin_interface/models.py:72 admin_interface/models.py:116
|
||||
#: admin_interface/models.py:135
|
||||
msgid "name"
|
||||
msgstr "nome"
|
||||
|
||||
#: admin_interface/models.py:75 admin_interface/models.py:132
|
||||
#: admin_interface/models.py:253
|
||||
msgid "active"
|
||||
msgstr "attivo"
|
||||
|
||||
#: admin_interface/models.py:79
|
||||
#: admin_interface/templates/admin/base_site.html:6
|
||||
#: admin_interface/templates/admin/base_site.html:60
|
||||
msgid "Django administration"
|
||||
msgstr "Amministrazione di Django"
|
||||
|
||||
#: admin_interface/models.py:81
|
||||
msgid "title"
|
||||
msgstr "titolo"
|
||||
|
||||
#: admin_interface/models.py:87 admin_interface/models.py:102
|
||||
#: admin_interface/models.py:122
|
||||
msgid "color"
|
||||
msgstr "colore"
|
||||
|
||||
#: admin_interface/models.py:90 admin_interface/models.py:105
|
||||
#: admin_interface/models.py:289
|
||||
msgid "visible"
|
||||
msgstr "visibile"
|
||||
|
||||
#: admin_interface/models.py:95
|
||||
msgid "Leave blank to use the default Django logo"
|
||||
msgstr "Lasciare vuoto per usare il logo Django di default"
|
||||
|
||||
#: admin_interface/models.py:96
|
||||
msgid "logo"
|
||||
msgstr "logo"
|
||||
|
||||
#: admin_interface/models.py:110
|
||||
msgid "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
msgstr "(formato ico, png o gif - dimensioni 16x16 o 32x32 px)"
|
||||
|
||||
#: admin_interface/models.py:111
|
||||
msgid "favicon"
|
||||
msgstr "favicon"
|
||||
|
||||
#: admin_interface/models.py:120
|
||||
msgid ""
|
||||
"(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: "
|
||||
"#3498DB)"
|
||||
msgstr ""
|
||||
"(rosso: #E74C3C, arancione: #E67E22, giallo: #F1C40F, verde: #2ECC71, blu: "
|
||||
"#3498DB)"
|
||||
|
||||
#: admin_interface/models.py:125
|
||||
msgid "visible in header (marker and name)"
|
||||
msgstr "visibile nell'header (marker e nome)"
|
||||
|
||||
#: admin_interface/models.py:128
|
||||
msgid "visible in favicon (marker)"
|
||||
msgstr "visibile nella favicon (marker)"
|
||||
|
||||
#: admin_interface/models.py:134
|
||||
msgid "code"
|
||||
msgstr "codice"
|
||||
|
||||
#: admin_interface/models.py:141
|
||||
msgid "display"
|
||||
msgstr "visualizzazione"
|
||||
|
||||
#: admin_interface/models.py:148 admin_interface/models.py:173
|
||||
#: admin_interface/models.py:214 admin_interface/models.py:233
|
||||
#: admin_interface/models.py:259
|
||||
msgid "background color"
|
||||
msgstr "colore di sfondo"
|
||||
|
||||
#: admin_interface/models.py:154 admin_interface/models.py:179
|
||||
#: admin_interface/models.py:226 admin_interface/models.py:245
|
||||
#: admin_interface/models.py:249
|
||||
msgid "text color"
|
||||
msgstr "colore del testo"
|
||||
|
||||
#: admin_interface/models.py:160 admin_interface/models.py:185
|
||||
#: admin_interface/models.py:201
|
||||
msgid "link color"
|
||||
msgstr "colore dei link"
|
||||
|
||||
#: admin_interface/models.py:166 admin_interface/models.py:191
|
||||
#: admin_interface/models.py:207
|
||||
msgid "link hover color"
|
||||
msgstr "colore dei link in hover"
|
||||
|
||||
#: admin_interface/models.py:194 admin_interface/models.py:279
|
||||
msgid "rounded corners"
|
||||
msgstr "bordi arrotondati"
|
||||
|
||||
#: admin_interface/models.py:220 admin_interface/models.py:239
|
||||
msgid "background hover color"
|
||||
msgstr "colore di sfondo in hover"
|
||||
|
||||
#: admin_interface/models.py:276
|
||||
msgid "background opacity"
|
||||
msgstr "opacità dello sfondo"
|
||||
|
||||
#: admin_interface/models.py:282
|
||||
msgid "close button visible"
|
||||
msgstr "pulsante chiudi visibile"
|
||||
|
||||
#: admin_interface/models.py:286
|
||||
msgid "use dropdown"
|
||||
msgstr "usa dropdown"
|
||||
|
||||
#: admin_interface/models.py:298
|
||||
msgid "Theme"
|
||||
msgstr "Tema"
|
||||
|
||||
#: admin_interface/models.py:299
|
||||
msgid "Themes"
|
||||
msgstr "Temi"
|
||||
|
||||
#: admin_interface/templates/admin/filter.html:13
|
||||
#: admin_interface/templates/admin_interface/dropdown_filter.html:4
|
||||
#, python-format
|
||||
msgid " By %(filter_title)s "
|
||||
msgstr " Per %(filter_title)s "
|
||||
|
||||
#: admin_interface/templates/admin/popup_response.html:3
|
||||
msgid "Popup closing..."
|
||||
msgstr "Chiusura popup..."
|
||||
Binary file not shown.
@@ -0,0 +1,208 @@
|
||||
# This file is distributed under the same license as the
|
||||
# django-admin-interface package.
|
||||
#
|
||||
# Translators:
|
||||
# Ishak Okutan <ishak.oktn@gmail.com>, 2020
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: django-admin-interface\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-01-24 06:07+0300\n"
|
||||
"PO-Revision-Date: 2020-01-29 04:53+0300\n"
|
||||
"Last-Translator: Ishak Okutan <ishak.oktn@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: tr\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Poedit 2.2.4\n"
|
||||
|
||||
#: admin_interface/admin.py:21
|
||||
msgid "Environment"
|
||||
msgstr "Ortam"
|
||||
|
||||
#: admin_interface/admin.py:30
|
||||
msgid "Language chooser"
|
||||
msgstr "Dil seçimi"
|
||||
|
||||
#: admin_interface/admin.py:37
|
||||
msgid "Logo"
|
||||
msgstr "Logo"
|
||||
|
||||
#: admin_interface/admin.py:45
|
||||
msgid "Favicon"
|
||||
msgstr "Favicon"
|
||||
|
||||
#: admin_interface/admin.py:49
|
||||
msgid "Title"
|
||||
msgstr "Başlık"
|
||||
|
||||
#: admin_interface/admin.py:57
|
||||
msgid "Header"
|
||||
msgstr "Üst Kısım"
|
||||
|
||||
#: admin_interface/admin.py:66
|
||||
msgid "Breadcrumbs / Module headers"
|
||||
msgstr "Link alanı / Modül başlıkları"
|
||||
|
||||
#: admin_interface/admin.py:76
|
||||
msgid "Generic Links"
|
||||
msgstr "Genel Bağlantılar"
|
||||
|
||||
#: admin_interface/admin.py:83
|
||||
msgid "Save Buttons"
|
||||
msgstr "Kaydet Butonları"
|
||||
|
||||
#: admin_interface/admin.py:91
|
||||
msgid "Delete Buttons"
|
||||
msgstr "Kaldır Butonları"
|
||||
|
||||
#: admin_interface/admin.py:99
|
||||
msgid "Related Modal"
|
||||
msgstr "İlgili Modal"
|
||||
|
||||
#: admin_interface/admin.py:109
|
||||
msgid "List Filter"
|
||||
msgstr "Liste Filtresi"
|
||||
|
||||
#: admin_interface/admin.py:113
|
||||
msgid "Recent Actions"
|
||||
msgstr "Son İşlemler"
|
||||
|
||||
#: admin_interface/apps.py:11
|
||||
msgid "Admin Interface"
|
||||
msgstr "Yönetici Arayüzü"
|
||||
|
||||
#: admin_interface/models.py:72 admin_interface/models.py:116
|
||||
#: admin_interface/models.py:135
|
||||
msgid "name"
|
||||
msgstr "adı"
|
||||
|
||||
#: admin_interface/models.py:75 admin_interface/models.py:132
|
||||
#: admin_interface/models.py:253
|
||||
msgid "active"
|
||||
msgstr "aktif"
|
||||
|
||||
#: admin_interface/models.py:79
|
||||
#: admin_interface/templates/admin/base_site.html:6
|
||||
#: admin_interface/templates/admin/base_site.html:60
|
||||
msgid "Django administration"
|
||||
msgstr "Django yönetimi"
|
||||
|
||||
#: admin_interface/models.py:81
|
||||
msgid "title"
|
||||
msgstr "başlık"
|
||||
|
||||
#: admin_interface/models.py:87 admin_interface/models.py:102
|
||||
#: admin_interface/models.py:122
|
||||
msgid "color"
|
||||
msgstr "renk"
|
||||
|
||||
#: admin_interface/models.py:90 admin_interface/models.py:105
|
||||
#: admin_interface/models.py:289
|
||||
msgid "visible"
|
||||
msgstr "göster"
|
||||
|
||||
#: admin_interface/models.py:95
|
||||
msgid "Leave blank to use the default Django logo"
|
||||
msgstr "Varsayılan Django logosunu kullanmak için boş bırakın"
|
||||
|
||||
#: admin_interface/models.py:96
|
||||
msgid "logo"
|
||||
msgstr "logo"
|
||||
|
||||
#: admin_interface/models.py:110
|
||||
msgid "(.ico|.png|.gif - 16x16|32x32 px)"
|
||||
msgstr ""
|
||||
"(favicon simgesi, png veya (GIF 16x16) veya (32x32) piksel "
|
||||
"boyutlarında olmalıdır)"
|
||||
|
||||
#: admin_interface/models.py:111
|
||||
msgid "favicon"
|
||||
msgstr "favicon"
|
||||
|
||||
#: admin_interface/models.py:120
|
||||
msgid ""
|
||||
"(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: "
|
||||
"#3498DB)"
|
||||
msgstr ""
|
||||
"(kırmızı: # E74C3C, turuncu: # E67E22, sarı: # F1C40F, yeşil: # "
|
||||
"2ECC71, mavi: # 3498DB)"
|
||||
|
||||
#: admin_interface/models.py:125
|
||||
msgid "visible in header (marker and name)"
|
||||
msgstr "üst kısım da görünsün (yuvarlak işaret ve ad)"
|
||||
|
||||
#: admin_interface/models.py:128
|
||||
msgid "visible in favicon (marker)"
|
||||
msgstr "favicon’da görünsün (yuvarlak işaret)"
|
||||
|
||||
#: admin_interface/models.py:134
|
||||
msgid "code"
|
||||
msgstr "kod"
|
||||
|
||||
#: admin_interface/models.py:141
|
||||
msgid "display"
|
||||
msgstr "görüntüle"
|
||||
|
||||
#: admin_interface/models.py:148 admin_interface/models.py:173
|
||||
#: admin_interface/models.py:214 admin_interface/models.py:233
|
||||
#: admin_interface/models.py:259
|
||||
msgid "background color"
|
||||
msgstr "arka plan rengi"
|
||||
|
||||
#: admin_interface/models.py:154 admin_interface/models.py:179
|
||||
#: admin_interface/models.py:226 admin_interface/models.py:245
|
||||
#: admin_interface/models.py:249
|
||||
msgid "text color"
|
||||
msgstr "metin rengi"
|
||||
|
||||
#: admin_interface/models.py:160 admin_interface/models.py:185
|
||||
#: admin_interface/models.py:201
|
||||
msgid "link color"
|
||||
msgstr "bağlantı rengi"
|
||||
|
||||
#: admin_interface/models.py:166 admin_interface/models.py:191
|
||||
#: admin_interface/models.py:207
|
||||
msgid "link hover color"
|
||||
msgstr "bağlantı üzerine gelindiğindeki rengi"
|
||||
|
||||
#: admin_interface/models.py:194 admin_interface/models.py:279
|
||||
msgid "rounded corners"
|
||||
msgstr "köşeleri ovalleştir"
|
||||
|
||||
#: admin_interface/models.py:220 admin_interface/models.py:239
|
||||
msgid "background hover color"
|
||||
msgstr "arka planın üzerine gelindiğindeki renk"
|
||||
|
||||
#: admin_interface/models.py:276
|
||||
msgid "background opacity"
|
||||
msgstr "arka plan şeffaflığı"
|
||||
|
||||
#: admin_interface/models.py:282
|
||||
msgid "close button visible"
|
||||
msgstr "kapat düğmesi görünsün"
|
||||
|
||||
#: admin_interface/models.py:286
|
||||
msgid "use dropdown"
|
||||
msgstr "açılır listeyi kullan"
|
||||
|
||||
#: admin_interface/models.py:298
|
||||
msgid "Theme"
|
||||
msgstr "Tema"
|
||||
|
||||
#: admin_interface/models.py:299
|
||||
msgid "Themes"
|
||||
msgstr "Temalar"
|
||||
|
||||
#: admin_interface/templates/admin/filter.html:13
|
||||
#: admin_interface/templates/admin_interface/dropdown_filter.html:4
|
||||
#, python-format
|
||||
msgid " By %(filter_title)s "
|
||||
msgstr " %(filter_title)s tarafından "
|
||||
|
||||
#: admin_interface/templates/admin/popup_response.html:3
|
||||
msgid "Popup closing..."
|
||||
msgstr "Popup kapanıyor..."
|
||||
@@ -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,32 @@
|
||||
# -*- 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.RemoveField(
|
||||
model_name='theme',
|
||||
name='related_modal_background_opacity'
|
||||
),
|
||||
migrations.AddField(
|
||||
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'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,35 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0008_change_related_modal_background_opacity_type'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='env',
|
||||
field=models.CharField(
|
||||
choices=[
|
||||
('development', 'Development'),
|
||||
('testing', 'Testing'),
|
||||
('staging', 'Staging'),
|
||||
('production', 'Production')],
|
||||
default='development',
|
||||
max_length=50,
|
||||
verbose_name='enviroment'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='env_visible',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='visible'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,69 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0009_add_enviroment'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='active',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='active'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='css',
|
||||
field=models.TextField(
|
||||
blank=True,
|
||||
verbose_name='text color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='env',
|
||||
field=models.CharField(
|
||||
choices=[
|
||||
('development', 'Development'),
|
||||
('testing', 'Testing'),
|
||||
('staging', 'Staging'),
|
||||
('production', 'Production')
|
||||
],
|
||||
default='development',
|
||||
max_length=50,
|
||||
verbose_name='environment'),
|
||||
),
|
||||
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/',
|
||||
verbose_name='logo'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='name',
|
||||
field=models.CharField(
|
||||
default='Django',
|
||||
max_length=50,
|
||||
verbose_name='name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='title',
|
||||
field=models.CharField(
|
||||
blank=True,
|
||||
default='Django administration',
|
||||
max_length=50,
|
||||
verbose_name='title'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,59 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import colorfield.fields
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0010_add_localization'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='theme',
|
||||
old_name='env',
|
||||
new_name='env_name',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='env_name',
|
||||
field=models.CharField(
|
||||
blank=True,
|
||||
max_length=50,
|
||||
verbose_name='name'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='env_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#E74C3C',
|
||||
help_text='(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: #3498DB)',
|
||||
max_length=10,
|
||||
verbose_name='color'),
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='theme',
|
||||
old_name='env_visible',
|
||||
new_name='env_visible_in_header',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='env_visible_in_header',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='visible in header (marker and name)'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='env_visible_in_favicon',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='visible in favicon (marker)'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import colorfield.fields
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0011_add_environment_options'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='logo_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='color'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='title_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#F5DD5D',
|
||||
help_text='#F5DD5D',
|
||||
max_length=10,
|
||||
verbose_name='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', '0012_update_verbose_names'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='related_modal_close_button_visible',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='close button 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', '0013_add_related_modal_close_button'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='name',
|
||||
field=models.CharField(
|
||||
default='Django',
|
||||
max_length=50,
|
||||
unique=True,
|
||||
verbose_name='name'),
|
||||
),
|
||||
]
|
||||
@@ -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', '0014_name_unique'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='language_chooser_active',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='active'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0015_add_language_chooser_active'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='language_chooser_display',
|
||||
field=models.CharField(
|
||||
choices=[
|
||||
('code', 'code'),
|
||||
('name', 'name')
|
||||
],
|
||||
default='code',
|
||||
max_length=10,
|
||||
verbose_name='display'),
|
||||
),
|
||||
]
|
||||
@@ -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', '0016_add_language_chooser_display'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='list_filter_dropdown',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='use dropdown'),
|
||||
),
|
||||
]
|
||||
@@ -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', '0017_change_list_filter_dropdown'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='list_filter_sticky',
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='sticky position'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,29 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0018_theme_list_filter_sticky'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='form_pagination_sticky',
|
||||
field=models.BooleanField(
|
||||
default=False,
|
||||
verbose_name='sticky pagination'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='form_submit_sticky',
|
||||
field=models.BooleanField(
|
||||
default=False,
|
||||
verbose_name='sticky submit'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,46 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
from django.db.models import F
|
||||
|
||||
import colorfield.fields
|
||||
|
||||
|
||||
def default_link_selected(apps, schema_editor):
|
||||
Theme = apps.get_model("admin_interface", "Theme")
|
||||
db_alias = schema_editor.connection.alias
|
||||
Theme.objects.using(db_alias).update(
|
||||
css_module_link_selected_color=F('css_module_link_color'))
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0019_add_form_sticky'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='css_module_background_selected_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFCC',
|
||||
help_text='#FFFFCC',
|
||||
max_length=10,
|
||||
verbose_name='background selected color'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='css_module_link_selected_color',
|
||||
field=colorfield.fields.ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name='link selected color'),
|
||||
),
|
||||
migrations.RunPython(default_link_selected),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from admin_interface.compat import FileExtensionValidator
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0020_module_selected_colors'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='favicon',
|
||||
field=models.FileField(
|
||||
blank=True,
|
||||
help_text='(.ico|.png|.gif - 16x16|32x32 px)',
|
||||
upload_to='admin-interface/favicon/',
|
||||
validators=[
|
||||
FileExtensionValidator(allowed_extensions=[
|
||||
'gif', 'ico', 'jpg', 'jpeg', 'png', 'svg'
|
||||
])
|
||||
],
|
||||
verbose_name='favicon'),
|
||||
),
|
||||
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/',
|
||||
validators=[
|
||||
FileExtensionValidator(allowed_extensions=[
|
||||
'gif', 'jpg', 'jpeg', 'png', 'svg'
|
||||
])
|
||||
],
|
||||
verbose_name='logo'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('admin_interface', '0021_file_extension_validator'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='logo_max_height',
|
||||
field=models.PositiveSmallIntegerField(blank=True, default=100, verbose_name='max height'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='logo_max_width',
|
||||
field=models.PositiveSmallIntegerField(blank=True, default=400, verbose_name='max width'),
|
||||
),
|
||||
]
|
||||
+298
-66
@@ -1,111 +1,343 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.core.files import File
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_delete, post_save
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from admin_interface.cache import del_cached_active_theme
|
||||
from admin_interface.compat import FileExtensionValidator, force_str, gettext_lazy as _
|
||||
|
||||
from colorfield.fields import ColorField
|
||||
|
||||
import os
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_delete, post_save, pre_save
|
||||
|
||||
from six import python_2_unicode_compatible
|
||||
|
||||
|
||||
@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):
|
||||
del_cached_active_theme()
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def post_delete_handler(instance, **kwargs):
|
||||
Theme.get_or_create_default_theme()
|
||||
def post_delete_handler(**kwargs):
|
||||
del_cached_active_theme()
|
||||
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):
|
||||
del_cached_active_theme()
|
||||
if instance.active:
|
||||
Theme.objects.exclude(pk=instance.pk).update(active=False)
|
||||
Theme.get_active_theme()
|
||||
|
||||
@staticmethod
|
||||
def get_or_create_default_theme():
|
||||
def pre_save_handler(instance, **kwargs):
|
||||
if instance.pk is None:
|
||||
try:
|
||||
obj = Theme.objects.get(name=instance.name)
|
||||
if obj:
|
||||
instance.pk = obj.pk
|
||||
except Theme.DoesNotExist:
|
||||
pass
|
||||
|
||||
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 })
|
||||
@staticmethod
|
||||
def get_active_theme():
|
||||
objs_manager = Theme.objects
|
||||
objs_active_qs = objs_manager.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:
|
||||
obj = objs_manager.all().first()
|
||||
if obj:
|
||||
obj.set_active()
|
||||
else:
|
||||
obj = objs_manager.create()
|
||||
|
||||
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(
|
||||
unique=True,
|
||||
max_length=50,
|
||||
default='Django',
|
||||
verbose_name=_('name'))
|
||||
active = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('active'))
|
||||
|
||||
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,
|
||||
verbose_name=_('title'))
|
||||
title_color = ColorField(
|
||||
blank=True,
|
||||
default='#F5DD5D',
|
||||
help_text='#F5DD5D',
|
||||
max_length=10,
|
||||
verbose_name=_('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,
|
||||
validators=[FileExtensionValidator(
|
||||
allowed_extensions=['gif', 'jpg', 'jpeg', 'png', 'svg'])],
|
||||
help_text=_('Leave blank to use the default Django logo'),
|
||||
verbose_name=_('logo'))
|
||||
logo_color = ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=_('color'))
|
||||
logo_max_width = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
default=400,
|
||||
verbose_name=_('max width'))
|
||||
logo_max_height = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
default=100,
|
||||
verbose_name=_('max height'))
|
||||
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,
|
||||
validators=[FileExtensionValidator(
|
||||
allowed_extensions=['gif', 'ico', 'jpg', 'jpeg', 'png', 'svg'])],
|
||||
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' )
|
||||
env_name = models.CharField(
|
||||
blank=True,
|
||||
max_length=50,
|
||||
verbose_name=_('name'))
|
||||
env_color = ColorField(
|
||||
blank=True,
|
||||
default='#E74C3C',
|
||||
help_text=_('(red: #E74C3C, orange: #E67E22, yellow: #F1C40F, green: #2ECC71, blue: #3498DB)'),
|
||||
max_length=10,
|
||||
verbose_name=_('color'))
|
||||
env_visible_in_header = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('visible in header (marker and name)'))
|
||||
env_visible_in_favicon = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('visible in favicon (marker)'))
|
||||
|
||||
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' )
|
||||
language_chooser_active = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('active'))
|
||||
language_chooser_display_choices = (
|
||||
('code', _('code'), ),
|
||||
('name', _('name'), ),
|
||||
)
|
||||
language_chooser_display = models.CharField(
|
||||
max_length=10,
|
||||
choices=language_chooser_display_choices,
|
||||
default='code',
|
||||
verbose_name=_('display'))
|
||||
|
||||
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_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 = models.TextField( blank = True )
|
||||
css_module_background_color = ColorField(
|
||||
blank=True,
|
||||
default='#44B78B',
|
||||
help_text='#44B78B',
|
||||
max_length=10,
|
||||
verbose_name=_('background color'))
|
||||
css_module_background_selected_color = ColorField(
|
||||
blank=True,
|
||||
default='#FFFFCC',
|
||||
help_text='#FFFFCC',
|
||||
max_length=10,
|
||||
verbose_name=_('background selected 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_selected_color = ColorField(
|
||||
blank=True,
|
||||
default='#FFFFFF',
|
||||
help_text='#FFFFFF',
|
||||
max_length=10,
|
||||
verbose_name=_('link selected 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'))
|
||||
|
||||
list_filter_dropdown = models.BooleanField( default = False )
|
||||
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_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'))
|
||||
|
||||
def set_active(self, value):
|
||||
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'))
|
||||
|
||||
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)
|
||||
css = models.TextField(
|
||||
blank=True,
|
||||
verbose_name=_('text color'))
|
||||
|
||||
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'))
|
||||
related_modal_close_button_visible = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('close button visible'))
|
||||
|
||||
def set_default_logo(self):
|
||||
list_filter_dropdown = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('use dropdown'))
|
||||
list_filter_sticky = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('sticky position'))
|
||||
|
||||
logo_filename = 'logo-django.svg'
|
||||
logo_path = os.path.normpath(os.path.dirname(__file__) + '/data/' + logo_filename)
|
||||
logo_file = open(logo_path)
|
||||
recent_actions_visible = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_('visible'))
|
||||
|
||||
self.logo = File(logo_file, logo_filename)
|
||||
form_submit_sticky = models.BooleanField(
|
||||
default=False,
|
||||
verbose_name=_('sticky submit'))
|
||||
form_pagination_sticky = models.BooleanField(
|
||||
default=False,
|
||||
verbose_name=_('sticky pagination'))
|
||||
|
||||
def set_active(self):
|
||||
self.active = True
|
||||
self.save()
|
||||
|
||||
logo_file.close()
|
||||
|
||||
class Meta:
|
||||
|
||||
app_label = 'admin_interface'
|
||||
|
||||
verbose_name = 'Theme'
|
||||
verbose_name_plural = 'Themes'
|
||||
verbose_name = _('Theme')
|
||||
verbose_name_plural = _('Themes')
|
||||
|
||||
def __unicode__(self):
|
||||
|
||||
return unicode(u'%s' % (self.name, ))
|
||||
def __str__(self):
|
||||
return force_str(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)
|
||||
pre_save.connect(Theme.pre_save_handler, sender=Theme)
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import django
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
|
||||
def check_installed_app(app, app_dj_version_limit):
|
||||
dj_version = django.VERSION
|
||||
installed_apps = settings.INSTALLED_APPS
|
||||
if dj_version < app_dj_version_limit:
|
||||
if app not in installed_apps:
|
||||
raise ImproperlyConfigured(
|
||||
'\'{}\' needed before django {}.{}, '
|
||||
'add it to settings.INSTALLED_APPS.'.format(
|
||||
app, *app_dj_version_limit))
|
||||
else:
|
||||
if app in installed_apps:
|
||||
raise ImproperlyConfigured(
|
||||
'\'{}\' not needed since django {}.{}, '
|
||||
'remove it from settings.INSTALLED_APPS.'.format(
|
||||
app, *app_dj_version_limit))
|
||||
|
||||
|
||||
def check_installed_apps():
|
||||
check_installed_app('flat', (1, 9))
|
||||
check_installed_app('flat_responsive', (2, 0))
|
||||
@@ -1,82 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'Theme'
|
||||
db.create_table(u'admin_interface_theme', (
|
||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('name', self.gf('django.db.models.fields.CharField')(default='Django', max_length=50)),
|
||||
('active', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('title', self.gf('django.db.models.fields.CharField')(default='Django administration', max_length=50, blank=True)),
|
||||
('title_visible', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('logo', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)),
|
||||
('logo_visible', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('css_header_background_color', self.gf('colorfield.fields.ColorField')(default='#0C4B33', max_length=10, blank=True)),
|
||||
('css_header_title_color', self.gf('colorfield.fields.ColorField')(default='#F5DD5D', max_length=10, blank=True)),
|
||||
('css_header_text_color', self.gf('colorfield.fields.ColorField')(default='#44B78B', max_length=10, blank=True)),
|
||||
('css_header_link_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_header_link_hover_color', self.gf('colorfield.fields.ColorField')(default='#C9F0DD', max_length=10, blank=True)),
|
||||
('css_module_background_color', self.gf('colorfield.fields.ColorField')(default='#44B78B', max_length=10, blank=True)),
|
||||
('css_module_text_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_module_link_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_module_link_hover_color', self.gf('colorfield.fields.ColorField')(default='#C9F0DD', max_length=10, blank=True)),
|
||||
('css_module_rounded_corners', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('css_generic_link_color', self.gf('colorfield.fields.ColorField')(default='#0C3C26', max_length=10, blank=True)),
|
||||
('css_generic_link_hover_color', self.gf('colorfield.fields.ColorField')(default='#156641', max_length=10, blank=True)),
|
||||
('css_save_button_background_color', self.gf('colorfield.fields.ColorField')(default='#0C4B33', max_length=10, blank=True)),
|
||||
('css_save_button_background_hover_color', self.gf('colorfield.fields.ColorField')(default='#0C3C26', max_length=10, blank=True)),
|
||||
('css_save_button_text_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css_delete_button_background_color', self.gf('colorfield.fields.ColorField')(default='#BA2121', max_length=10, blank=True)),
|
||||
('css_delete_button_background_hover_color', self.gf('colorfield.fields.ColorField')(default='#A41515', max_length=10, blank=True)),
|
||||
('css_delete_button_text_color', self.gf('colorfield.fields.ColorField')(default='#FFFFFF', max_length=10, blank=True)),
|
||||
('css', self.gf('django.db.models.fields.TextField')(blank=True)),
|
||||
('list_filter_dropdown', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
))
|
||||
db.send_create_signal('admin_interface', ['Theme'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'Theme'
|
||||
db.delete_table(u'admin_interface_theme')
|
||||
|
||||
|
||||
models = {
|
||||
'admin_interface.theme': {
|
||||
'Meta': {'object_name': 'Theme'},
|
||||
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'css': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'css_delete_button_background_color': ('colorfield.fields.ColorField', [], {'default': "'#BA2121'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_delete_button_background_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#A41515'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_delete_button_text_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_generic_link_color': ('colorfield.fields.ColorField', [], {'default': "'#0C3C26'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_generic_link_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#156641'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_background_color': ('colorfield.fields.ColorField', [], {'default': "'#0C4B33'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_link_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_link_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#C9F0DD'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_text_color': ('colorfield.fields.ColorField', [], {'default': "'#44B78B'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_header_title_color': ('colorfield.fields.ColorField', [], {'default': "'#F5DD5D'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_background_color': ('colorfield.fields.ColorField', [], {'default': "'#44B78B'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_link_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_link_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#C9F0DD'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_module_rounded_corners': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'css_module_text_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_save_button_background_color': ('colorfield.fields.ColorField', [], {'default': "'#0C4B33'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_save_button_background_hover_color': ('colorfield.fields.ColorField', [], {'default': "'#0C3C26'", 'max_length': '10', 'blank': 'True'}),
|
||||
'css_save_button_text_color': ('colorfield.fields.ColorField', [], {'default': "'#FFFFFF'", 'max_length': '10', 'blank': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'list_filter_dropdown': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'logo': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
|
||||
'logo_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'default': "'Django'", 'max_length': '50'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'default': "'Django administration'", 'max_length': '50', 'blank': 'True'}),
|
||||
'title_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['admin_interface']
|
||||
@@ -0,0 +1,20 @@
|
||||
/** global: django */
|
||||
|
||||
if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') {
|
||||
(function($) {
|
||||
'use strict';
|
||||
$(document).ready(function() {
|
||||
$('.cancel-link').click(function(e) {
|
||||
e.preventDefault();
|
||||
var parentWindow = window.parent;
|
||||
if (parentWindow && typeof(parentWindow.dismissRelatedObjectModal) === 'function' && parentWindow !== window) {
|
||||
parentWindow.dismissRelatedObjectModal();
|
||||
} else {
|
||||
// fallback to default behavior
|
||||
window.history.back();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
});
|
||||
})(django.jQuery);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
(function() {
|
||||
|
||||
'use strict';
|
||||
|
||||
var windowRef = window;
|
||||
var windowName, widgetName;
|
||||
var openerRef = windowRef.opener;
|
||||
if (!openerRef) {
|
||||
// related modal is active
|
||||
openerRef = windowRef.parent;
|
||||
windowName = windowRef.name;
|
||||
widgetName = windowName.replace(/^(change|add|delete|lookup)_/, '');
|
||||
if (typeof(openerRef.id_to_windowname) === 'function') {
|
||||
// django < 3.1 compatibility
|
||||
widgetName = openerRef.id_to_windowname(widgetName);
|
||||
}
|
||||
windowRef = {
|
||||
name: widgetName,
|
||||
close: function() {
|
||||
openerRef.dismissRelatedObjectModal();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// default django popup_response.js
|
||||
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(windowRef, initData.value, initData.obj, initData.new_value);
|
||||
}
|
||||
break;
|
||||
case 'delete':
|
||||
if (typeof(openerRef.dismissDeleteRelatedObjectPopup) === 'function') {
|
||||
openerRef.dismissDeleteRelatedObjectPopup(windowRef, initData.value);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (typeof(openerRef.dismissAddRelatedObjectPopup) === 'function') {
|
||||
openerRef.dismissAddRelatedObjectPopup(windowRef, initData.value, initData.obj);
|
||||
}
|
||||
else if (typeof(openerRef.dismissAddAnotherPopup) === 'function') {
|
||||
// django 1.7 compatibility
|
||||
openerRef.dismissAddAnotherPopup(windowRef, initData.value, initData.obj);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
})();
|
||||
@@ -0,0 +1,913 @@
|
||||
/**
|
||||
* @license MIT or GPL-2.0
|
||||
* @fileOverview Favico animations
|
||||
* @author Miroslav Magda, http://blog.ejci.net
|
||||
* @source: https://github.com/ejci/favico.js
|
||||
* @version 0.3.10
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create new favico instance
|
||||
* @param {Object} Options
|
||||
* @return {Object} Favico object
|
||||
* @example
|
||||
* var favico = new Favico({
|
||||
* bgColor : '#d00',
|
||||
* textColor : '#fff',
|
||||
* fontFamily : 'sans-serif',
|
||||
* fontStyle : 'bold',
|
||||
* type : 'circle',
|
||||
* position : 'down',
|
||||
* animation : 'slide',
|
||||
* elementId: false,
|
||||
* element: null,
|
||||
* dataUrl: function(url){},
|
||||
* win: window
|
||||
* });
|
||||
*/
|
||||
(function () {
|
||||
|
||||
var Favico = (function (opt) {
|
||||
'use strict';
|
||||
opt = (opt) ? opt : {};
|
||||
var _def = {
|
||||
bgColor: '#d00',
|
||||
textColor: '#fff',
|
||||
fontFamily: 'sans-serif', //Arial,Verdana,Times New Roman,serif,sans-serif,...
|
||||
fontStyle: 'bold', //normal,italic,oblique,bold,bolder,lighter,100,200,300,400,500,600,700,800,900
|
||||
type: 'circle',
|
||||
position: 'down', // down, up, left, leftup (upleft)
|
||||
animation: 'slide',
|
||||
elementId: false,
|
||||
element: null,
|
||||
dataUrl: false,
|
||||
win: window
|
||||
};
|
||||
var _opt, _orig, _h, _w, _canvas, _context, _img, _ready, _lastBadge, _running, _readyCb, _stop, _browser, _animTimeout, _drawTimeout, _doc;
|
||||
|
||||
_browser = {};
|
||||
_browser.ff = typeof InstallTrigger != 'undefined';
|
||||
_browser.chrome = !!window.chrome;
|
||||
_browser.opera = !!window.opera || navigator.userAgent.indexOf('Opera') >= 0;
|
||||
_browser.ie = /*@cc_on!@*/false;
|
||||
_browser.safari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
|
||||
_browser.supported = (_browser.chrome || _browser.ff || _browser.opera);
|
||||
|
||||
var _queue = [];
|
||||
_readyCb = function () {
|
||||
};
|
||||
_ready = _stop = false;
|
||||
/**
|
||||
* Initialize favico
|
||||
*/
|
||||
var init = function () {
|
||||
//merge initial options
|
||||
_opt = merge(_def, opt);
|
||||
_opt.bgColor = hexToRgb(_opt.bgColor);
|
||||
_opt.textColor = hexToRgb(_opt.textColor);
|
||||
_opt.position = _opt.position.toLowerCase();
|
||||
_opt.animation = (animation.types['' + _opt.animation]) ? _opt.animation : _def.animation;
|
||||
|
||||
_doc = _opt.win.document;
|
||||
|
||||
var isUp = _opt.position.indexOf('up') > -1;
|
||||
var isLeft = _opt.position.indexOf('left') > -1;
|
||||
|
||||
//transform the animations
|
||||
if (isUp || isLeft) {
|
||||
for (var a in animation.types) {
|
||||
for (var i = 0; i < animation.types[a].length; i++) {
|
||||
var step = animation.types[a][i];
|
||||
|
||||
if (isUp) {
|
||||
if (step.y < 0.6) {
|
||||
step.y = step.y - 0.4;
|
||||
} else {
|
||||
step.y = step.y - 2 * step.y + (1 - step.w);
|
||||
}
|
||||
}
|
||||
|
||||
if (isLeft) {
|
||||
if (step.x < 0.6) {
|
||||
step.x = step.x - 0.4;
|
||||
} else {
|
||||
step.x = step.x - 2 * step.x + (1 - step.h);
|
||||
}
|
||||
}
|
||||
|
||||
animation.types[a][i] = step;
|
||||
}
|
||||
}
|
||||
}
|
||||
_opt.type = (type['' + _opt.type]) ? _opt.type : _def.type;
|
||||
|
||||
_orig = link. getIcons();
|
||||
//create temp canvas
|
||||
_canvas = document.createElement('canvas');
|
||||
//create temp image
|
||||
_img = document.createElement('img');
|
||||
var lastIcon = _orig[_orig.length - 1];
|
||||
if (lastIcon.hasAttribute('href')) {
|
||||
_img.setAttribute('crossOrigin', 'anonymous');
|
||||
//get width/height
|
||||
_img.onload = function () {
|
||||
_h = (_img.height > 0) ? _img.height : 32;
|
||||
_w = (_img.width > 0) ? _img.width : 32;
|
||||
_canvas.height = _h;
|
||||
_canvas.width = _w;
|
||||
_context = _canvas.getContext('2d');
|
||||
icon.ready();
|
||||
};
|
||||
_img.setAttribute('src', lastIcon.getAttribute('href'));
|
||||
} else {
|
||||
_h = 32;
|
||||
_w = 32;
|
||||
_img.height = _h;
|
||||
_img.width = _w;
|
||||
_canvas.height = _h;
|
||||
_canvas.width = _w;
|
||||
_context = _canvas.getContext('2d');
|
||||
icon.ready();
|
||||
}
|
||||
|
||||
};
|
||||
/**
|
||||
* Icon namespace
|
||||
*/
|
||||
var icon = {};
|
||||
/**
|
||||
* Icon is ready (reset icon) and start animation (if ther is any)
|
||||
*/
|
||||
icon.ready = function () {
|
||||
_ready = true;
|
||||
icon.reset();
|
||||
_readyCb();
|
||||
};
|
||||
/**
|
||||
* Reset icon to default state
|
||||
*/
|
||||
icon.reset = function () {
|
||||
//reset
|
||||
if (!_ready) {
|
||||
return;
|
||||
}
|
||||
_queue = [];
|
||||
_lastBadge = false;
|
||||
_running = false;
|
||||
_context.clearRect(0, 0, _w, _h);
|
||||
_context.drawImage(_img, 0, 0, _w, _h);
|
||||
//_stop=true;
|
||||
link.setIcon(_canvas);
|
||||
//webcam('stop');
|
||||
//video('stop');
|
||||
window.clearTimeout(_animTimeout);
|
||||
window.clearTimeout(_drawTimeout);
|
||||
};
|
||||
/**
|
||||
* Start animation
|
||||
*/
|
||||
icon.start = function () {
|
||||
if (!_ready || _running) {
|
||||
return;
|
||||
}
|
||||
var finished = function () {
|
||||
_lastBadge = _queue[0];
|
||||
_running = false;
|
||||
if (_queue.length > 0) {
|
||||
_queue.shift();
|
||||
icon.start();
|
||||
} else {
|
||||
|
||||
}
|
||||
};
|
||||
if (_queue.length > 0) {
|
||||
_running = true;
|
||||
var run = function () {
|
||||
// apply options for this animation
|
||||
['type', 'animation', 'bgColor', 'textColor', 'fontFamily', 'fontStyle'].forEach(function (a) {
|
||||
if (a in _queue[0].options) {
|
||||
_opt[a] = _queue[0].options[a];
|
||||
}
|
||||
});
|
||||
animation.run(_queue[0].options, function () {
|
||||
finished();
|
||||
}, false);
|
||||
};
|
||||
if (_lastBadge) {
|
||||
animation.run(_lastBadge.options, function () {
|
||||
run();
|
||||
}, true);
|
||||
} else {
|
||||
run();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Badge types
|
||||
*/
|
||||
var type = {};
|
||||
var options = function (opt) {
|
||||
opt.n = ((typeof opt.n) === 'number') ? Math.abs(opt.n | 0) : opt.n;
|
||||
opt.x = _w * opt.x;
|
||||
opt.y = _h * opt.y;
|
||||
opt.w = _w * opt.w;
|
||||
opt.h = _h * opt.h;
|
||||
opt.len = ("" + opt.n).length;
|
||||
return opt;
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate circle
|
||||
* @param {Object} opt Badge options
|
||||
*/
|
||||
type.circle = function (opt) {
|
||||
opt = options(opt);
|
||||
var more = false;
|
||||
if (opt.len === 2) {
|
||||
opt.x = opt.x - opt.w * 0.4;
|
||||
opt.w = opt.w * 1.4;
|
||||
more = true;
|
||||
} else if (opt.len >= 3) {
|
||||
opt.x = opt.x - opt.w * 0.65;
|
||||
opt.w = opt.w * 1.65;
|
||||
more = true;
|
||||
}
|
||||
|
||||
// begin patch
|
||||
// draw a smaller badge without text
|
||||
opt.w = 14;
|
||||
opt.h = 14;
|
||||
opt.x = (_w - opt.w);
|
||||
opt.y = (_h - opt.h);
|
||||
// end patch
|
||||
|
||||
_context.clearRect(0, 0, _w, _h);
|
||||
_context.drawImage(_img, 0, 0, _w, _h);
|
||||
_context.beginPath();
|
||||
_context.font = _opt.fontStyle + " " + Math.floor(opt.h * (opt.n > 99 ? 0.85 : 1)) + "px " + _opt.fontFamily;
|
||||
_context.textAlign = 'center';
|
||||
if (more) {
|
||||
_context.moveTo(opt.x + opt.w / 2, opt.y);
|
||||
_context.lineTo(opt.x + opt.w - opt.h / 2, opt.y);
|
||||
_context.quadraticCurveTo(opt.x + opt.w, opt.y, opt.x + opt.w, opt.y + opt.h / 2);
|
||||
_context.lineTo(opt.x + opt.w, opt.y + opt.h - opt.h / 2);
|
||||
_context.quadraticCurveTo(opt.x + opt.w, opt.y + opt.h, opt.x + opt.w - opt.h / 2, opt.y + opt.h);
|
||||
_context.lineTo(opt.x + opt.h / 2, opt.y + opt.h);
|
||||
_context.quadraticCurveTo(opt.x, opt.y + opt.h, opt.x, opt.y + opt.h - opt.h / 2);
|
||||
_context.lineTo(opt.x, opt.y + opt.h / 2);
|
||||
_context.quadraticCurveTo(opt.x, opt.y, opt.x + opt.h / 2, opt.y);
|
||||
} else {
|
||||
_context.arc(opt.x + opt.w / 2, opt.y + opt.h / 2, opt.h / 2, 0, 2 * Math.PI);
|
||||
}
|
||||
_context.fillStyle = 'rgba(' + _opt.bgColor.r + ',' + _opt.bgColor.g + ',' + _opt.bgColor.b + ',' + opt.o + ')';
|
||||
_context.fill();
|
||||
_context.closePath();
|
||||
_context.beginPath();
|
||||
_context.stroke();
|
||||
_context.fillStyle = 'rgba(' + _opt.textColor.r + ',' + _opt.textColor.g + ',' + _opt.textColor.b + ',' + opt.o + ')';
|
||||
//_context.fillText((more) ? '9+' : opt.n, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.15));
|
||||
if ((typeof opt.n) === 'number' && opt.n > 999) {
|
||||
_context.fillText(((opt.n > 9999) ? 9 : Math.floor(opt.n / 1000)) + 'k+', Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.2));
|
||||
} else {
|
||||
_context.fillText(opt.n, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.15));
|
||||
}
|
||||
_context.closePath();
|
||||
};
|
||||
/**
|
||||
* Generate rectangle
|
||||
* @param {Object} opt Badge options
|
||||
*/
|
||||
type.rectangle = function (opt) {
|
||||
opt = options(opt);
|
||||
var more = false;
|
||||
if (opt.len === 2) {
|
||||
opt.x = opt.x - opt.w * 0.4;
|
||||
opt.w = opt.w * 1.4;
|
||||
more = true;
|
||||
} else if (opt.len >= 3) {
|
||||
opt.x = opt.x - opt.w * 0.65;
|
||||
opt.w = opt.w * 1.65;
|
||||
more = true;
|
||||
}
|
||||
_context.clearRect(0, 0, _w, _h);
|
||||
_context.drawImage(_img, 0, 0, _w, _h);
|
||||
_context.beginPath();
|
||||
_context.font = _opt.fontStyle + " " + Math.floor(opt.h * (opt.n > 99 ? 0.9 : 1)) + "px " + _opt.fontFamily;
|
||||
_context.textAlign = 'center';
|
||||
_context.fillStyle = 'rgba(' + _opt.bgColor.r + ',' + _opt.bgColor.g + ',' + _opt.bgColor.b + ',' + opt.o + ')';
|
||||
_context.fillRect(opt.x, opt.y, opt.w, opt.h);
|
||||
_context.fillStyle = 'rgba(' + _opt.textColor.r + ',' + _opt.textColor.g + ',' + _opt.textColor.b + ',' + opt.o + ')';
|
||||
//_context.fillText((more) ? '9+' : opt.n, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.15));
|
||||
if ((typeof opt.n) === 'number' && opt.n > 999) {
|
||||
_context.fillText(((opt.n > 9999) ? 9 : Math.floor(opt.n / 1000)) + 'k+', Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.2));
|
||||
} else {
|
||||
_context.fillText(opt.n, Math.floor(opt.x + opt.w / 2), Math.floor(opt.y + opt.h - opt.h * 0.15));
|
||||
}
|
||||
_context.closePath();
|
||||
};
|
||||
|
||||
/**
|
||||
* Set badge
|
||||
*/
|
||||
var badge = function (number, opts) {
|
||||
opts = ((typeof opts) === 'string' ? {
|
||||
animation: opts
|
||||
} : opts) || {};
|
||||
_readyCb = function () {
|
||||
try {
|
||||
if (typeof (number) === 'number' ? (number > 0) : (number !== '')) {
|
||||
var q = {
|
||||
type: 'badge',
|
||||
options: {
|
||||
n: number
|
||||
}
|
||||
};
|
||||
if ('animation' in opts && animation.types['' + opts.animation]) {
|
||||
q.options.animation = '' + opts.animation;
|
||||
}
|
||||
if ('type' in opts && type['' + opts.type]) {
|
||||
q.options.type = '' + opts.type;
|
||||
}
|
||||
['bgColor', 'textColor'].forEach(function (o) {
|
||||
if (o in opts) {
|
||||
q.options[o] = hexToRgb(opts[o]);
|
||||
}
|
||||
});
|
||||
['fontStyle', 'fontFamily'].forEach(function (o) {
|
||||
if (o in opts) {
|
||||
q.options[o] = opts[o];
|
||||
}
|
||||
});
|
||||
_queue.push(q);
|
||||
if (_queue.length > 100) {
|
||||
throw new Error('Too many badges requests in queue.');
|
||||
}
|
||||
icon.start();
|
||||
} else {
|
||||
icon.reset();
|
||||
}
|
||||
} catch (e) {
|
||||
throw new Error('Error setting badge. Message: ' + e.message);
|
||||
}
|
||||
};
|
||||
if (_ready) {
|
||||
_readyCb();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Set image as icon
|
||||
*/
|
||||
var image = function (imageElement) {
|
||||
_readyCb = function () {
|
||||
try {
|
||||
var w = imageElement.width;
|
||||
var h = imageElement.height;
|
||||
var newImg = document.createElement('img');
|
||||
var ratio = (w / _w < h / _h) ? (w / _w) : (h / _h);
|
||||
newImg.setAttribute('crossOrigin', 'anonymous');
|
||||
newImg.onload=function(){
|
||||
_context.clearRect(0, 0, _w, _h);
|
||||
_context.drawImage(newImg, 0, 0, _w, _h);
|
||||
link.setIcon(_canvas);
|
||||
};
|
||||
newImg.setAttribute('src', imageElement.getAttribute('src'));
|
||||
newImg.height = (h / ratio);
|
||||
newImg.width = (w / ratio);
|
||||
} catch (e) {
|
||||
throw new Error('Error setting image. Message: ' + e.message);
|
||||
}
|
||||
};
|
||||
if (_ready) {
|
||||
_readyCb();
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Set the icon from a source url. Won't work with badges.
|
||||
*/
|
||||
var rawImageSrc = function (url) {
|
||||
_readyCb = function() {
|
||||
link.setIconSrc(url);
|
||||
};
|
||||
if (_ready) {
|
||||
_readyCb();
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Set video as icon
|
||||
*/
|
||||
var video = function (videoElement) {
|
||||
_readyCb = function () {
|
||||
try {
|
||||
if (videoElement === 'stop') {
|
||||
_stop = true;
|
||||
icon.reset();
|
||||
_stop = false;
|
||||
return;
|
||||
}
|
||||
//var w = videoElement.width;
|
||||
//var h = videoElement.height;
|
||||
//var ratio = (w / _w < h / _h) ? (w / _w) : (h / _h);
|
||||
videoElement.addEventListener('play', function () {
|
||||
drawVideo(this);
|
||||
}, false);
|
||||
|
||||
} catch (e) {
|
||||
throw new Error('Error setting video. Message: ' + e.message);
|
||||
}
|
||||
};
|
||||
if (_ready) {
|
||||
_readyCb();
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Set video as icon
|
||||
*/
|
||||
var webcam = function (action) {
|
||||
//UR
|
||||
if (!window.URL || !window.URL.createObjectURL) {
|
||||
window.URL = window.URL || {};
|
||||
window.URL.createObjectURL = function (obj) {
|
||||
return obj;
|
||||
};
|
||||
}
|
||||
if (_browser.supported) {
|
||||
var newVideo = false;
|
||||
navigator.getUserMedia = navigator.getUserMedia || navigator.oGetUserMedia || navigator.msGetUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia;
|
||||
_readyCb = function () {
|
||||
try {
|
||||
if (action === 'stop') {
|
||||
_stop = true;
|
||||
icon.reset();
|
||||
_stop = false;
|
||||
return;
|
||||
}
|
||||
newVideo = document.createElement('video');
|
||||
newVideo.width = _w;
|
||||
newVideo.height = _h;
|
||||
navigator.getUserMedia({
|
||||
video: true,
|
||||
audio: false
|
||||
}, function (stream) {
|
||||
newVideo.src = URL.createObjectURL(stream);
|
||||
newVideo.play();
|
||||
drawVideo(newVideo);
|
||||
}, function () {
|
||||
});
|
||||
} catch (e) {
|
||||
throw new Error('Error setting webcam. Message: ' + e.message);
|
||||
}
|
||||
};
|
||||
if (_ready) {
|
||||
_readyCb();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
var setOpt = function (key, value) {
|
||||
var opts = key;
|
||||
if (!(value == null && Object.prototype.toString.call(key) == '[object Object]')) {
|
||||
opts = {};
|
||||
opts[key] = value;
|
||||
}
|
||||
|
||||
var keys = Object.keys(opts);
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
if (keys[i] == 'bgColor' || keys[i] == 'textColor') {
|
||||
_opt[keys[i]] = hexToRgb(opts[keys[i]]);
|
||||
} else {
|
||||
_opt[keys[i]] = opts[keys[i]];
|
||||
}
|
||||
}
|
||||
|
||||
_queue.push(_lastBadge);
|
||||
icon.start();
|
||||
};
|
||||
|
||||
/**
|
||||
* Draw video to context and repeat :)
|
||||
*/
|
||||
function drawVideo(video) {
|
||||
if (video.paused || video.ended || _stop) {
|
||||
return false;
|
||||
}
|
||||
//nasty hack for FF webcam (Thanks to Julian Ćwirko, kontakt@redsunmedia.pl)
|
||||
try {
|
||||
_context.clearRect(0, 0, _w, _h);
|
||||
_context.drawImage(video, 0, 0, _w, _h);
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
_drawTimeout = setTimeout(function () {
|
||||
drawVideo(video);
|
||||
}, animation.duration);
|
||||
link.setIcon(_canvas);
|
||||
}
|
||||
|
||||
var link = {};
|
||||
/**
|
||||
* Get icons from HEAD tag or create a new <link> element
|
||||
*/
|
||||
link.getIcons = function () {
|
||||
var elms = [];
|
||||
//get link element
|
||||
var getLinks = function () {
|
||||
var icons = [];
|
||||
var links = _doc.getElementsByTagName('head')[0].getElementsByTagName('link');
|
||||
for (var i = 0; i < links.length; i++) {
|
||||
if ((/(^|\s)icon(\s|$)/i).test(links[i].getAttribute('rel'))) {
|
||||
icons.push(links[i]);
|
||||
}
|
||||
}
|
||||
return icons;
|
||||
};
|
||||
if (_opt.element) {
|
||||
elms = [_opt.element];
|
||||
} else if (_opt.elementId) {
|
||||
//if img element identified by elementId
|
||||
elms = [_doc.getElementById(_opt.elementId)];
|
||||
elms[0].setAttribute('href', elms[0].getAttribute('src'));
|
||||
} else {
|
||||
//if link element
|
||||
elms = getLinks();
|
||||
if (elms.length === 0) {
|
||||
elms = [_doc.createElement('link')];
|
||||
elms[0].setAttribute('rel', 'icon');
|
||||
_doc.getElementsByTagName('head')[0].appendChild(elms[0]);
|
||||
}
|
||||
}
|
||||
elms.forEach(function(item) {
|
||||
item.setAttribute('type', 'image/png');
|
||||
});
|
||||
return elms;
|
||||
};
|
||||
link.setIcon = function (canvas) {
|
||||
var url = canvas.toDataURL('image/png');
|
||||
link.setIconSrc(url);
|
||||
};
|
||||
link.setIconSrc = function (url) {
|
||||
if (_opt.dataUrl) {
|
||||
//if using custom exporter
|
||||
_opt.dataUrl(url);
|
||||
}
|
||||
if (_opt.element) {
|
||||
_opt.element.setAttribute('href', url);
|
||||
_opt.element.setAttribute('src', url);
|
||||
} else if (_opt.elementId) {
|
||||
//if is attached to element (image)
|
||||
var elm = _doc.getElementById(_opt.elementId);
|
||||
elm.setAttribute('href', url);
|
||||
elm.setAttribute('src', url);
|
||||
} else {
|
||||
//if is attached to fav icon
|
||||
if (_browser.ff || _browser.opera) {
|
||||
//for FF we need to "recreate" element, atach to dom and remove old <link>
|
||||
//var originalType = _orig.getAttribute('rel');
|
||||
var old = _orig[_orig.length - 1];
|
||||
var newIcon = _doc.createElement('link');
|
||||
_orig = [newIcon];
|
||||
//_orig.setAttribute('rel', originalType);
|
||||
if (_browser.opera) {
|
||||
newIcon.setAttribute('rel', 'icon');
|
||||
}
|
||||
newIcon.setAttribute('rel', 'icon');
|
||||
newIcon.setAttribute('type', 'image/png');
|
||||
_doc.getElementsByTagName('head')[0].appendChild(newIcon);
|
||||
newIcon.setAttribute('href', url);
|
||||
if (old.parentNode) {
|
||||
old.parentNode.removeChild(old);
|
||||
}
|
||||
} else {
|
||||
_orig.forEach(function(icon) {
|
||||
icon.setAttribute('href', url);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb#answer-5624139
|
||||
//HEX to RGB convertor
|
||||
function hexToRgb(hex) {
|
||||
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
|
||||
hex = hex.replace(shorthandRegex, function (m, r, g, b) {
|
||||
return r + r + g + g + b + b;
|
||||
});
|
||||
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
||||
return result ? {
|
||||
r: parseInt(result[1], 16),
|
||||
g: parseInt(result[2], 16),
|
||||
b: parseInt(result[3], 16)
|
||||
} : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge options
|
||||
*/
|
||||
function merge(def, opt) {
|
||||
var mergedOpt = {};
|
||||
var attrname;
|
||||
for (attrname in def) {
|
||||
mergedOpt[attrname] = def[attrname];
|
||||
}
|
||||
for (attrname in opt) {
|
||||
mergedOpt[attrname] = opt[attrname];
|
||||
}
|
||||
return mergedOpt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cross-browser page visibility shim
|
||||
* http://stackoverflow.com/questions/12536562/detect-whether-a-window-is-visible
|
||||
*/
|
||||
function isPageHidden() {
|
||||
return _doc.hidden || _doc.msHidden || _doc.webkitHidden || _doc.mozHidden;
|
||||
}
|
||||
|
||||
/**
|
||||
* @namespace animation
|
||||
*/
|
||||
var animation = {};
|
||||
/**
|
||||
* Animation "frame" duration
|
||||
*/
|
||||
animation.duration = 40;
|
||||
/**
|
||||
* Animation types (none,fade,pop,slide)
|
||||
*/
|
||||
animation.types = {};
|
||||
animation.types.fade = [{
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.0
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.2
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.3
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.4
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.5
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.6
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.7
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.8
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 0.9
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1.0
|
||||
}];
|
||||
animation.types.none = [{
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}];
|
||||
animation.types.pop = [{
|
||||
x: 1,
|
||||
y: 1,
|
||||
w: 0,
|
||||
h: 0,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.9,
|
||||
y: 0.9,
|
||||
w: 0.1,
|
||||
h: 0.1,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.8,
|
||||
y: 0.8,
|
||||
w: 0.2,
|
||||
h: 0.2,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.7,
|
||||
y: 0.7,
|
||||
w: 0.3,
|
||||
h: 0.3,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.6,
|
||||
y: 0.6,
|
||||
w: 0.4,
|
||||
h: 0.4,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.5,
|
||||
y: 0.5,
|
||||
w: 0.5,
|
||||
h: 0.5,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}];
|
||||
animation.types.popFade = [{
|
||||
x: 0.75,
|
||||
y: 0.75,
|
||||
w: 0,
|
||||
h: 0,
|
||||
o: 0
|
||||
}, {
|
||||
x: 0.65,
|
||||
y: 0.65,
|
||||
w: 0.1,
|
||||
h: 0.1,
|
||||
o: 0.2
|
||||
}, {
|
||||
x: 0.6,
|
||||
y: 0.6,
|
||||
w: 0.2,
|
||||
h: 0.2,
|
||||
o: 0.4
|
||||
}, {
|
||||
x: 0.55,
|
||||
y: 0.55,
|
||||
w: 0.3,
|
||||
h: 0.3,
|
||||
o: 0.6
|
||||
}, {
|
||||
x: 0.50,
|
||||
y: 0.50,
|
||||
w: 0.4,
|
||||
h: 0.4,
|
||||
o: 0.8
|
||||
}, {
|
||||
x: 0.45,
|
||||
y: 0.45,
|
||||
w: 0.5,
|
||||
h: 0.5,
|
||||
o: 0.9
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}];
|
||||
animation.types.slide = [{
|
||||
x: 0.4,
|
||||
y: 1,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.9,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.9,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.8,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.7,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.6,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.5,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}, {
|
||||
x: 0.4,
|
||||
y: 0.4,
|
||||
w: 0.6,
|
||||
h: 0.6,
|
||||
o: 1
|
||||
}];
|
||||
/**
|
||||
* Run animation
|
||||
* @param {Object} opt Animation options
|
||||
* @param {Object} cb Callabak after all steps are done
|
||||
* @param {Object} revert Reverse order? true|false
|
||||
* @param {Object} step Optional step number (frame bumber)
|
||||
*/
|
||||
animation.run = function (opt, cb, revert, step) {
|
||||
var animationType = animation.types[isPageHidden() ? 'none' : _opt.animation];
|
||||
if (revert === true) {
|
||||
step = (typeof step !== 'undefined') ? step : animationType.length - 1;
|
||||
} else {
|
||||
step = (typeof step !== 'undefined') ? step : 0;
|
||||
}
|
||||
cb = (cb) ? cb : function () {
|
||||
};
|
||||
if ((step < animationType.length) && (step >= 0)) {
|
||||
type[_opt.type](merge(opt, animationType[step]));
|
||||
_animTimeout = setTimeout(function () {
|
||||
if (revert) {
|
||||
step = step - 1;
|
||||
} else {
|
||||
step = step + 1;
|
||||
}
|
||||
animation.run(opt, cb, revert, step);
|
||||
}, animation.duration);
|
||||
|
||||
link.setIcon(_canvas);
|
||||
} else {
|
||||
cb();
|
||||
return;
|
||||
}
|
||||
};
|
||||
//auto init
|
||||
init();
|
||||
return {
|
||||
badge: badge,
|
||||
video: video,
|
||||
image: image,
|
||||
rawImageSrc: rawImageSrc,
|
||||
webcam: webcam,
|
||||
setOpt: setOpt,
|
||||
reset: icon.reset,
|
||||
browser: {
|
||||
supported: _browser.supported
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
// AMD / RequireJS
|
||||
if (typeof define !== 'undefined' && define.amd) {
|
||||
define([], function () {
|
||||
return Favico;
|
||||
});
|
||||
}
|
||||
// CommonJS
|
||||
else if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = Favico;
|
||||
}
|
||||
// included directly via <script> tag
|
||||
else {
|
||||
this.Favico = Favico;
|
||||
}
|
||||
|
||||
})();
|
||||
File diff suppressed because one or more lines are too long
+1867
File diff suppressed because it is too large
Load Diff
+351
@@ -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,158 @@
|
||||
/** global: django */
|
||||
|
||||
if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined')
|
||||
{
|
||||
(function($) {
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
function dismissModal()
|
||||
{
|
||||
$.magnificPopup.close();
|
||||
}
|
||||
|
||||
// create the function that will close the modal
|
||||
function dismissRelatedObjectModal()
|
||||
{
|
||||
dismissModal();
|
||||
}
|
||||
|
||||
function dismissRelatedLookupModal(win, chosenId)
|
||||
{
|
||||
var windowRef = win;
|
||||
var windowName = windowRef.name;
|
||||
var widgetName = windowName.replace(/^(change|add|delete|lookup)_/, '');
|
||||
var widgetEl = $('#' + widgetName);
|
||||
var widgetVal = widgetEl.val();
|
||||
if (widgetEl.hasClass('vManyToManyRawIdAdminField') && Boolean(widgetVal)) {
|
||||
widgetEl.val(widgetVal + ', ' + chosenId);
|
||||
} else {
|
||||
widgetEl.val(chosenId);
|
||||
}
|
||||
dismissModal();
|
||||
}
|
||||
|
||||
// assign functions to global variables
|
||||
window.dismissRelatedObjectModal = dismissRelatedObjectModal;
|
||||
window.dismissRelatedLookupPopup = dismissRelatedLookupModal;
|
||||
|
||||
function presentRelatedObjectModal(e)
|
||||
{
|
||||
var linkEl = $(this);
|
||||
|
||||
var href = (linkEl.attr('href') || '');
|
||||
if (href === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
// open the popup as modal
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
// remove focus from clicked link
|
||||
linkEl.blur();
|
||||
|
||||
// use the clicked link id as iframe name
|
||||
// it will be available as window.name in the loaded iframe
|
||||
var iframeName = linkEl.attr('id');
|
||||
var iframeSrc = href;
|
||||
|
||||
if (e.data.lookup !== true)
|
||||
{
|
||||
// browsers stop loading nested iframes having the same src url
|
||||
// create a random parameter and append it to the src url to prevent it
|
||||
// this workaround doesn't work with related lookup url
|
||||
var iframeSrcRandom = String(Math.round(Math.random() * 999999));
|
||||
if (iframeSrc.indexOf('?') === -1) {
|
||||
iframeSrc += '?_modal=' + iframeSrcRandom;
|
||||
} else {
|
||||
iframeSrc += '&_modal=' + iframeSrcRandom;
|
||||
}
|
||||
}
|
||||
|
||||
// fix for django 1.7
|
||||
if (iframeSrc.indexOf('_popup=1') === -1) {
|
||||
if (iframeSrc.indexOf('?') === -1) {
|
||||
iframeSrc += '?_popup=1';
|
||||
} else {
|
||||
iframeSrc += '&_popup=1';
|
||||
}
|
||||
}
|
||||
|
||||
// build the iframe html
|
||||
var iframeHTML = '<iframe id="related-modal-iframe" name="' + iframeName + '" src="' + iframeSrc + '"></iframe>';
|
||||
var modalHTML = '<div class="related-modal-iframe-container">' + iframeHTML + '</div>';
|
||||
var modalEl = $(modalHTML);
|
||||
var iframeEl = modalEl.find('#related-modal-iframe');
|
||||
|
||||
if (e.data.lookup === true)
|
||||
{
|
||||
// set current window as iframe opener because
|
||||
// the callback is called on the opener window
|
||||
iframeEl.on('load', function() {
|
||||
var iframeObj = $(this).get(0);
|
||||
var iframeWindow = iframeObj.contentWindow;
|
||||
iframeWindow.opener = window;
|
||||
});
|
||||
}
|
||||
|
||||
// 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,
|
||||
showCloseBtn: true,
|
||||
closeBtnInside: true,
|
||||
items: {
|
||||
src: modalEl,
|
||||
type: 'inline'
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// listen click events on related links
|
||||
function presentRelatedObjectModalOnClickOn(selector, lookup) {
|
||||
var data = {
|
||||
lookup:(lookup === true ? true : false)
|
||||
};
|
||||
var el = $(selector);
|
||||
el.removeAttr('onclick');
|
||||
el.unbind('click');
|
||||
el.click(data, presentRelatedObjectModal);
|
||||
}
|
||||
|
||||
// assign functions to global variables
|
||||
window.presentRelatedObjectModal = presentRelatedObjectModal;
|
||||
window.presentRelatedObjectModalOnClickOn = presentRelatedObjectModalOnClickOn;
|
||||
|
||||
// django 1.7 compatibility
|
||||
// $('a.add-another').removeAttr('onclick').click({ lookup:false }, presentRelatedObjectModal);
|
||||
presentRelatedObjectModalOnClickOn('a.add-another');
|
||||
|
||||
// django 1.8 and above
|
||||
// $('a.related-widget-wrapper-link').click({ lookup:false }, presentRelatedObjectModal);
|
||||
presentRelatedObjectModalOnClickOn('a.related-widget-wrapper-link');
|
||||
|
||||
// raw_id_fields support
|
||||
// $('a.related-lookup').unbind('click').click({ lookup:true }, presentRelatedObjectModal);
|
||||
presentRelatedObjectModalOnClickOn('a.related-lookup', true);
|
||||
|
||||
// django-dynamic-raw-id support - #61
|
||||
// https://github.com/lincolnloop/django-dynamic-raw-id
|
||||
presentRelatedObjectModalOnClickOn('a.dynamic_raw_id-related-lookup', true);
|
||||
|
||||
// show_change_link=True support
|
||||
presentRelatedObjectModalOnClickOn('a.inlinechangelink');
|
||||
});
|
||||
|
||||
})(django.jQuery);
|
||||
}
|
||||
@@ -1,567 +1,82 @@
|
||||
{% extends "admin/base.html" %}
|
||||
{% load i18n staticfiles admin_interface_tags %}
|
||||
{% extends 'admin/base.html' %}
|
||||
{% load i18n static admin_interface_tags %}
|
||||
|
||||
{% block title %}
|
||||
{% get_admin_interface_theme as theme %}
|
||||
{% if theme.title %}{% trans theme.title %}{% else %}{% trans 'Django administration' %}{% endif %}
|
||||
{% if title %}{{ title }} | {% endif %}{% if theme.title %}{% trans theme.title %}{% else %}{{ site_title|default:_('Django administration') }}{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block extrastyle %}
|
||||
{% get_admin_interface_theme as theme %}
|
||||
{% get_admin_interface_version as version %}
|
||||
{% get_current_language as current_lang %}
|
||||
<style type="text/css">
|
||||
|
||||
{% if theme.active %}
|
||||
|
||||
#header {
|
||||
height:auto;
|
||||
min-height:40px;
|
||||
background:{{ theme.css_header_background_color }};
|
||||
color:{{ theme.css_header_text_color }};
|
||||
}
|
||||
|
||||
#header #user-tools a {
|
||||
color:{{ theme.css_header_link_color }};
|
||||
}
|
||||
|
||||
#header #user-tools a:hover,
|
||||
#header #user-tools a:active {
|
||||
color:{{ theme.css_header_link_hover_color }};
|
||||
border-bottom-color:rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
#branding h1 img.logo {
|
||||
max-height:100px;
|
||||
margin-top:10px;
|
||||
margin-bottom:10px;
|
||||
margin-right:15px;
|
||||
}
|
||||
|
||||
#branding h1 {
|
||||
color:{{ theme.css_header_title_color }};
|
||||
}
|
||||
|
||||
#branding h1 img+span {
|
||||
white-space:nowrap;
|
||||
}
|
||||
|
||||
.module h2,
|
||||
.module caption,
|
||||
.module.filtered h2 {
|
||||
background:{{ theme.css_module_background_color }};
|
||||
color:{{ theme.css_module_text_color }};
|
||||
}
|
||||
|
||||
.module a.section:link,
|
||||
.module a.section:visited {
|
||||
color:{{ theme.css_module_link_color }};
|
||||
}
|
||||
|
||||
.module a.section:active,
|
||||
.module a.section:hover {
|
||||
color:{{ theme.css_module_link_hover_color }};
|
||||
}
|
||||
|
||||
div.breadcrumbs {
|
||||
background:{{ theme.css_module_background_color }};
|
||||
color:{{ theme.css_module_text_color }};
|
||||
}
|
||||
|
||||
div.breadcrumbs a {
|
||||
color:{{ theme.css_module_link_color }};
|
||||
}
|
||||
|
||||
div.breadcrumbs a:active,
|
||||
div.breadcrumbs a:focus,
|
||||
div.breadcrumbs a:hover {
|
||||
color:{{ theme.css_module_link_hover_color }} !important;
|
||||
}
|
||||
|
||||
fieldset.collapse {
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
fieldset.collapse.collapsed a.collapse-toggle {
|
||||
color:{{ theme.css_generic_link_color }} !important;
|
||||
font-weight: bold;
|
||||
text-transform: lowercase;
|
||||
}
|
||||
|
||||
fieldset.collapse.collapsed a.collapse-toggle:hover,
|
||||
fieldset.collapse.collapsed a.collapse-toggle:active {
|
||||
color:{{ theme.css_generic_link_hover_color }} !important;
|
||||
}
|
||||
|
||||
fieldset.collapse a.collapse-toggle {
|
||||
color:{{ theme.css_module_link_color }} !important;
|
||||
font-weight: bold;
|
||||
text-transform: lowercase;
|
||||
}
|
||||
|
||||
fieldset.collapse a.collapse-toggle:hover,
|
||||
fieldset.collapse a.collapse-toggle:active {
|
||||
color:{{ theme.css_module_link_hover_color }} !important;
|
||||
}
|
||||
|
||||
.inline-group h2 {
|
||||
background:{{ theme.css_module_background_color }};
|
||||
color:{{ theme.css_module_text_color }};
|
||||
}
|
||||
|
||||
.selector-chosen h2 {
|
||||
background:{{ theme.css_module_background_color }} !important;
|
||||
color:{{ theme.css_module_text_color }} !important;
|
||||
}
|
||||
|
||||
a:link, a:visited {
|
||||
color:{{ theme.css_generic_link_color }};
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color:{{ theme.css_generic_link_hover_color }};
|
||||
}
|
||||
|
||||
.button, input[type=submit], input[type=button], .submit-row input, a.button {
|
||||
background:{{ theme.css_save_button_background_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
}
|
||||
|
||||
.button:active, input[type=submit]:active, input[type=button]:active,
|
||||
.button:focus, input[type=submit]:focus, input[type=button]:focus,
|
||||
.button:hover, input[type=submit]:hover, input[type=button]:hover {
|
||||
background:{{ theme.css_save_button_background_hover_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.button.default, input[type=submit].default, .submit-row input.default {
|
||||
background:{{ theme.css_save_button_background_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.button.default:active, input[type=submit].default:active,
|
||||
.button.default:focus, input[type=submit].default:focus,
|
||||
.button.default:hover, input[type=submit].default:hover {
|
||||
background:{{ theme.css_save_button_background_hover_color }};
|
||||
color:{{ theme.css_save_button_text_color }};
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.submit-row a.deletelink:link,
|
||||
.submit-row a.deletelink:visited {
|
||||
background:{{ theme.css_delete_button_background_color }};
|
||||
color:{{ theme.css_delete_button_text_color }};
|
||||
}
|
||||
|
||||
.submit-row a.deletelink:hover {
|
||||
background:{{ theme.css_delete_button_background_hover_color }} !important;
|
||||
color:{{ theme.css_delete_button_text_color }};
|
||||
}
|
||||
|
||||
/*
|
||||
#changelist table tbody tr.selected {
|
||||
background-color:#FFFFCC;
|
||||
}
|
||||
*/
|
||||
|
||||
#changelist .paginator {
|
||||
margin-top:-1px !important; /* merge 2 borders into 1 */
|
||||
line-height:42px;
|
||||
}
|
||||
|
||||
.paginator a,
|
||||
.paginator a:link,
|
||||
.paginator a:visited,
|
||||
.paginator .this-page {
|
||||
padding:7px 12px !important;
|
||||
{% if theme.css_module_rounded_corners %}border-radius:4px;{% endif %}
|
||||
}
|
||||
|
||||
.paginator a,
|
||||
.paginator a:link,
|
||||
.paginator a:visited {
|
||||
background-color:#ffffff !important;
|
||||
color:{{ theme.css_generic_link_color }} !important;
|
||||
}
|
||||
|
||||
.paginator a:hover,
|
||||
.paginator a:active {
|
||||
background-color:#f8f8f8 !important;
|
||||
color:{{ theme.css_generic_link_hover_color }} !important;
|
||||
}
|
||||
|
||||
.paginator .this-page {
|
||||
background-color:{{ theme.css_module_background_color }} !important;
|
||||
color:{{ theme.css_module_link_color }} !important;
|
||||
}
|
||||
|
||||
.paginator a,
|
||||
.paginator .this-page {
|
||||
margin-left:0px;
|
||||
}
|
||||
|
||||
.paginator .this-page,
|
||||
.paginator a.end {
|
||||
margin-right:25px;
|
||||
}
|
||||
|
||||
.paginator .this-page + a:not(.showall) {
|
||||
margin-left:-25px !important;
|
||||
}
|
||||
|
||||
body .paginator a.showall,
|
||||
body .paginator a.showall:link,
|
||||
body .paginator a.showall:visited {
|
||||
margin-left:20px;
|
||||
color:{{ theme.css_generic_link_color }} !important;
|
||||
}
|
||||
|
||||
body .paginator a.showall:hover,
|
||||
body .paginator a.showall:active {
|
||||
color:{{ theme.css_generic_link_hover_color }} !important;
|
||||
}
|
||||
|
||||
/* OTHER FIXES */
|
||||
|
||||
/* reduced width */
|
||||
.login #container {
|
||||
width:320px !important;
|
||||
min-width:320px !important;
|
||||
}
|
||||
|
||||
.login #content {
|
||||
padding:10px 30px 10px 30px !important;
|
||||
}
|
||||
|
||||
/* same lateral padding as in logged view */
|
||||
.login #header {
|
||||
padding:15px 30px !important;
|
||||
}
|
||||
|
||||
.login #branding h1 {
|
||||
margin-right:0;
|
||||
}
|
||||
|
||||
.login #branding h1 img.logo {
|
||||
max-width:100%;
|
||||
margin-right:0;
|
||||
}
|
||||
|
||||
/* login button right aligned */
|
||||
.login #header #branding h1 img+span {
|
||||
display:block;
|
||||
}
|
||||
|
||||
/* login button right aligned */
|
||||
.login .submit-row {
|
||||
padding-left:0 !important;
|
||||
text-align:right !important;
|
||||
}
|
||||
|
||||
/* top-right buttons color on hover -> just a lighten grey */
|
||||
.object-tools a:hover,
|
||||
.object-tools li:hover a {
|
||||
background-color:#AAAAAA;
|
||||
}
|
||||
|
||||
/* fix help text icon on newline */
|
||||
.inline-group thead th {
|
||||
white-space:nowrap;
|
||||
}
|
||||
|
||||
.inline-group thead th img {
|
||||
vertical-align: -2px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
form .form-row p.file-upload > a {
|
||||
margin-right:10px;
|
||||
}
|
||||
|
||||
form .form-row p.file-upload .clearable-file-input {
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
form .wide p.help {
|
||||
padding-left:10px !important;
|
||||
}
|
||||
|
||||
form .aligned.wide p.help {
|
||||
margin-left: 200px;
|
||||
}
|
||||
|
||||
textarea.tinymce ~ p.help {
|
||||
margin-top:5px !important;
|
||||
}
|
||||
|
||||
.aligned p.file-upload {
|
||||
display:table;
|
||||
}
|
||||
|
||||
/* begin fix issue #13 - Datetime widget broken in long inlines */
|
||||
p.datetime {
|
||||
white-space:nowrap;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
/* begin fix lateral padding to align text with field labels */
|
||||
.module h2,
|
||||
.dashboard .module caption,
|
||||
.module.filtered h2,
|
||||
.inline-group h2 {
|
||||
padding-left:10px;
|
||||
padding-right:10px;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
/* begin fix issue #11 - Inline border bottom should not be rounded */
|
||||
.module h2,
|
||||
.dashboard .module caption,
|
||||
.module.filtered h2 {
|
||||
{% if theme.css_module_rounded_corners %}
|
||||
border-radius:4px;
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
.inline-group h2 {
|
||||
{% if theme.css_module_rounded_corners %}
|
||||
border-bottom-left-radius:0;
|
||||
border-bottom-right-radius:0;
|
||||
{% endif %}
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
.module.filtered h2 {
|
||||
border-bottom-left-radius:0;
|
||||
border-bottom-right-radius:0;
|
||||
}
|
||||
|
||||
.module.filtered #changelist-filter {
|
||||
border-bottom-left-radius:4px;
|
||||
border-bottom-right-radius:4px;
|
||||
}
|
||||
|
||||
.module.filtered #changelist-filter select {
|
||||
background-color:#ffffff;
|
||||
}
|
||||
|
||||
.module.filtered #changelist-filter li.selected a,
|
||||
.module.filtered #changelist-filter li.selected a:hover {
|
||||
color: {{ theme.css_generic_link_color }};
|
||||
}
|
||||
|
||||
#content-related {
|
||||
{% if theme.css_module_rounded_corners %}
|
||||
border-radius:4px;
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
/* selector chooseall / clearall color on hover -> just a lighten grey */
|
||||
a.selector-chooseall:hover, a.selector-clearall:hover {
|
||||
color:#888888 !important;
|
||||
}
|
||||
|
||||
.inline-group {
|
||||
overflow-x:auto;
|
||||
}
|
||||
|
||||
/* begin fix issue #10 - Related widget broken in long tabular inline */
|
||||
.inline-group .tabular .related-widget-wrapper {
|
||||
white-space:nowrap;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
.inline-related h3 {
|
||||
padding:6px 10px !important;
|
||||
}
|
||||
|
||||
/* begin fix issue #12 - Inlines bad delete buttons alignement */
|
||||
.inline-group .tabular thead th:last-child:not([class]):not([style]) {
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
.inline-group .tabular tr td.delete {
|
||||
text-align:right;
|
||||
padding-right:15px;
|
||||
}
|
||||
|
||||
.inline-group .tabular tr td.delete a.inline-deletelink {
|
||||
margin-top:2px;
|
||||
overflow:hidden;
|
||||
text-indent:9999px;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
/* improve django-modeltranslation support - https://github.com/deschler/django-modeltranslation/pull/313/commits */
|
||||
|
||||
#content h1 select {
|
||||
text-transform:uppercase;
|
||||
margin-left:15px;
|
||||
}
|
||||
|
||||
.ui-tabs .ui-tabs-nav {
|
||||
padding:10px 0 0 10px !important;
|
||||
}
|
||||
|
||||
.ui-tabs .ui-tabs-nav li {
|
||||
margin-left:-1px !important;
|
||||
}
|
||||
|
||||
.ui-tabs .ui-tabs-nav li a {
|
||||
outline:none;
|
||||
background-color:#f8f8f8 !important;
|
||||
border:1px solid #eeeeee !important;
|
||||
border-bottom:none !important;
|
||||
text-transform:uppercase;
|
||||
|
||||
padding:7px 14px 8px 14px !important;
|
||||
margin-top:1px !important;
|
||||
|
||||
}
|
||||
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-active a,
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
|
||||
|
||||
padding:8px 14px 8px 14px !important;
|
||||
margin-top:0px !important;
|
||||
|
||||
margin-bottom:-1px !important;
|
||||
|
||||
background-color:#FFFFFF !important;
|
||||
color:{{ theme.css_module_background_color }} !important;
|
||||
|
||||
border-bottom:1px solid #FFFFFF !important;
|
||||
}
|
||||
|
||||
.inline-group .tabular .ui-tabs .ui-tabs-panel {
|
||||
padding:8px !important;
|
||||
}
|
||||
|
||||
#changelist .row1:not(.selected):hover,
|
||||
#changelist .row2:not(.selected):hover {
|
||||
background:#f9f9f9;
|
||||
}
|
||||
|
||||
.row2 {
|
||||
background:#fcfcfc;
|
||||
}
|
||||
|
||||
.row2 .ui-tabs .ui-tabs-nav li a {
|
||||
background-color:#f5f5f5 !important;
|
||||
border:1px solid #ebebeb !important;
|
||||
}
|
||||
|
||||
.row2 .ui-tabs .ui-tabs-nav li.ui-tabs-active a,
|
||||
.row2 .ui-tabs .ui-tabs-nav li.ui-tabs-selected a {
|
||||
background-color:#fcfcfc !important;
|
||||
border-bottom:1px solid #fcfcfc !important;
|
||||
}
|
||||
|
||||
.list-filter-dropdown {
|
||||
margin-top:10px;
|
||||
margin-bottom:20px;
|
||||
}
|
||||
|
||||
.list-filter-dropdown select {
|
||||
width:90%;
|
||||
margin-right:5%;
|
||||
}
|
||||
|
||||
|
||||
/* sorl-thumbnail - improved AdminImageMixin widget layout */
|
||||
|
||||
a.thumbnail + input[type="checkbox"] {
|
||||
margin:10px 0;
|
||||
}
|
||||
|
||||
|
||||
/* ckeditor + light theme - https://github.com/Ikimea/ckeditor-light-theme */
|
||||
|
||||
.cke_inner, .cke_wysiwyg_frame {
|
||||
border-top-left-radius: 4px !important;
|
||||
border-top-right-radius: 4px !important;
|
||||
border-bottom-left-radius: 4px !important;
|
||||
border-bottom-right-radius: 4px !important;
|
||||
}
|
||||
|
||||
.cke_top {
|
||||
background: #f6f6f6 !important;
|
||||
border-top: none;
|
||||
|
||||
border-top-left-radius: 4px !important;
|
||||
border-top-right-radius: 4px !important;
|
||||
|
||||
-moz-box-shadow: none !important;
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.cke_bottom {
|
||||
background: #f6f6f6 !important;
|
||||
border-top: 1px solid #efefef !important;
|
||||
|
||||
border-bottom-left-radius: 4px !important;
|
||||
border-bottom-right-radius: 4px !important;
|
||||
}
|
||||
|
||||
.cke_source {
|
||||
padding: 13px 15px !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
a.cke_button_on {
|
||||
-moz-box-shadow: none !important;
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important;
|
||||
background-color: rgba(0,0,0,0.1) !important;
|
||||
border-radius: 4px !important;
|
||||
}
|
||||
|
||||
.cke_resizer {
|
||||
border-color: transparent #999 transparent transparent !important;
|
||||
}
|
||||
|
||||
{% if theme.css %}
|
||||
{{ theme.css|safe }}
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
|
||||
#branding h1 img.logo {
|
||||
display:none;
|
||||
}
|
||||
|
||||
/*
|
||||
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/form-controls.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/jquery.ui.tabs.css" %}
|
||||
{% include "admin_interface/css/modeltranslation.css" %}
|
||||
{% include "admin_interface/css/sorl-thumbnail.css" %}
|
||||
{% include "admin_interface/css/tabbed-admin.css" %}
|
||||
{% include "admin_interface/css/ckeditor.css" %}
|
||||
{% include "admin_interface/css/tinymce.css" %}
|
||||
{% include "admin_interface/css/json-widget.css" %}
|
||||
{% include "admin_interface/css/rtl.css" %}
|
||||
|
||||
{% if theme.css %}
|
||||
{{ theme.css|safe }}
|
||||
{% endif %}
|
||||
|
||||
</style>
|
||||
|
||||
{% if current_lang == 'fa' %}
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/rastikerdar/vazir-font@v27.2.2/dist/font-face.css" />
|
||||
{% endif %}
|
||||
|
||||
{% 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 }}">
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/responsive_rtl.css' %}?v={{ version }}" />
|
||||
{% include "admin_interface/favicon.html" %}
|
||||
{% include "admin_interface/related-modal.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block bodyclass %}admin-interface flat-theme {% get_admin_interface_theme as theme %}{% if theme.name %}{{ theme.name|slugify }}-theme{% endif %}{% if theme.form_submit_sticky %} sticky-submit {% endif %}{% if theme.form_pagination_sticky %} sticky-pagination {% 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 %}{{ site_header|default:_('Django administration') }}{% endif %}</span>
|
||||
{% endif %}
|
||||
</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block bodyclass %}admin-interface flat-theme{% endblock %}
|
||||
|
||||
{% block blockbots %}
|
||||
{{ block.super }}
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}" />
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% block welcome-msg %}
|
||||
{% get_admin_interface_theme as theme %}
|
||||
{% if theme.language_chooser_active %}
|
||||
{% get_admin_interface_languages as languages %}
|
||||
{% include "admin_interface/language_chooser.html" %}
|
||||
{% endif %}
|
||||
{% if theme.env_visible_in_header %}<span class="environment-label {{ theme.env_name }}"></span><br>{% endif %}{{ block.super }}<br>
|
||||
{% 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,589 @@
|
||||
.admin-interface {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
/* fix login */
|
||||
.admin-interface.login #container {
|
||||
width: 100%;
|
||||
max-width: 360px;
|
||||
margin: 15px auto;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
}
|
||||
|
||||
.admin-interface.login #content {
|
||||
padding: 15px 30px 30px 30px;
|
||||
}
|
||||
|
||||
@media (min-width:768px){
|
||||
.admin-interface.login #container {
|
||||
margin: 90px auto;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface.login #header {
|
||||
min-height: auto;
|
||||
padding: 10px 30px;
|
||||
line-height: 30px;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.admin-interface.login #header #branding h1 {
|
||||
margin-right:0;
|
||||
}
|
||||
|
||||
.admin-interface.login #header #branding h1 img.logo {
|
||||
max-width: 100%;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.admin-interface.login #header #branding h1 img.logo+span {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.admin-interface.login #login-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.admin-interface.login .submit-row {
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
padding-top: 0;
|
||||
padding-left: 0;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.admin-interface.login .submit-row label {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.admin-interface.login .submit-row input[type="submit"] {
|
||||
width: 100%;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.admin-interface.login #footer {
|
||||
display: none;
|
||||
}
|
||||
/* end login fix*/
|
||||
|
||||
.admin-interface #header {
|
||||
height: auto;
|
||||
min-height: 55px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
@media (max-width:1024px) {
|
||||
.admin-interface #header {
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface #branding h1 img.logo {
|
||||
margin-top:10px;
|
||||
margin-bottom:10px;
|
||||
margin-right:15px;
|
||||
display:inline-block !important; /* override inline display:none; */
|
||||
}
|
||||
|
||||
@media (max-width:400px) {
|
||||
.admin-interface #branding h1 img.logo {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface #branding h1 span {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.admin-interface #branding h1 img.logo+span {
|
||||
white-space:nowrap;
|
||||
}
|
||||
|
||||
.admin-interface #user-tools {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
white-space: nowrap;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.admin-interface #user-tools br {
|
||||
display: none;
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.admin-interface #user-tools br {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.admin-interface #changelist .actions .button,
|
||||
.admin-interface #changelist .actions .action-counter {
|
||||
margin-left: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.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 .inline-group .inlinechangelink {
|
||||
background-size: contain;
|
||||
padding-left: 15px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.admin-interface .file-thumbnail > a {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.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-left: 0;
|
||||
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 {
|
||||
min-width: 240px;
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.admin-interface .module.filtered #changelist-filter {
|
||||
min-width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.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.dashboard .module th,
|
||||
.admin-interface .module.filtered h2,
|
||||
.admin-interface .inline-group h2,
|
||||
.admin-interface #nav-sidebar .module caption,
|
||||
.admin-interface #nav-sidebar .module th {
|
||||
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 tabular inlines horizontal scroll */
|
||||
.admin-interface .inline-related.tabular {
|
||||
overflow-x: scroll;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
.admin-interface .inline-related.tabular fieldset.module {
|
||||
display: contents;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
}
|
||||
.admin-interface .inline-related.tabular fieldset.module h2 {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
}
|
||||
.admin-interface .inline-related.tabular fieldset.module table tbody tr {
|
||||
position: relative;
|
||||
}
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* improve responsive selector */
|
||||
|
||||
/* fix [stacked, not-stacked] equalize horizontal and vertical select padding for selector */
|
||||
.admin-interface .selector .selector-available select,
|
||||
.admin-interface .selector .selector-chosen select {
|
||||
padding: 7px 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* fix [stacked, not-stacked] select options text overflow */
|
||||
.admin-interface .selector .selector-available select option,
|
||||
.admin-interface .selector .selector-chosen select option {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* fix nav-sidebar (added in django 3.1.0) */
|
||||
.admin-interface #toggle-nav-sidebar {
|
||||
top: 10px;
|
||||
left: 0;
|
||||
z-index: 20;
|
||||
flex: 0 0 30px;
|
||||
width: 30px;
|
||||
height: 45px;
|
||||
margin-top: 10px;
|
||||
margin-right: 10px;
|
||||
background-color: #FFFFFF;
|
||||
font-size: 16px;
|
||||
border: 1px solid #eaeaea;
|
||||
border-left: none;
|
||||
outline: none;
|
||||
-webkit-box-shadow: 4px 2px 8px -4px #DBDBDB;
|
||||
-moz-box-shadow: 4px 2px 8px -4px #DBDBDB;
|
||||
box-shadow: 4px 2px 8px -4px #DBDBDB;
|
||||
/*transition: left .3s;*/
|
||||
}
|
||||
|
||||
.admin-interface .toggle-nav-sidebar::before {
|
||||
margin-top: -2px;
|
||||
}
|
||||
|
||||
.admin-interface .main > #nav-sidebar + .content,
|
||||
.admin-interface .main.shifted > #nav-sidebar + .content {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* hide nav-sidebar below 1280px to prevent horizontal overflow issues */
|
||||
@media (max-width:1279px) {
|
||||
.admin-interface #nav-sidebar,
|
||||
.admin-interface #toggle-nav-sidebar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface #nav-sidebar {
|
||||
flex: 0 0 320px;
|
||||
left: -320px;
|
||||
margin-left: -360px;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
padding: 40px 40px 40px 0px;
|
||||
border-top: none;
|
||||
border-bottom: none;
|
||||
border-left: none;
|
||||
/*transition: left .3s, margin-left .3s;*/
|
||||
}
|
||||
|
||||
@media (min-width:1280px) {
|
||||
.admin-interface #main.shifted > #toggle-nav-sidebar {
|
||||
left: 359px;
|
||||
}
|
||||
.admin-interface #main.shifted > #nav-sidebar {
|
||||
left: 0px;
|
||||
margin-left: 0;
|
||||
}
|
||||
.admin-interface #main:not(.shifted) > .content {
|
||||
max-width: 100%;
|
||||
}
|
||||
.admin-interface.change-list:not(.popup) #main.shifted > #nav-sidebar + .content,
|
||||
.admin-interface.change-form:not(.popup) #main.shifted > #nav-sidebar + .content {
|
||||
max-width: calc(100% - 360px);
|
||||
}
|
||||
}
|
||||
|
||||
/* fixed related widget and select2 */
|
||||
/* begin fix issue #10 - Related widget broken in long tabular inline */
|
||||
.admin-interface .related-widget-wrapper {
|
||||
white-space: nowrap;
|
||||
}
|
||||
/* end fix */
|
||||
|
||||
.admin-interface .related-widget-wrapper select + .related-widget-wrapper-link,
|
||||
.admin-interface .related-widget-wrapper .select2-container + .related-widget-wrapper-link {
|
||||
margin-left: 12px !important;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.admin-interface.change-form select {
|
||||
min-width: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.admin-interface.change-form select {
|
||||
min-width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface.change-form .inline-related.tabular select {
|
||||
min-width: auto !important;
|
||||
}
|
||||
|
||||
/* fixed time widget header border radius */
|
||||
.admin-interface .clockbox.module h2 {
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
/* fix searchbar overriden padding */
|
||||
.admin-interface #changelist #changelist-search #searchbar {
|
||||
padding: 2px 5px 3px 5px;
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.admin-interface #changelist #changelist-search #searchbar,
|
||||
.admin-interface #changelist #changelist-search input[type="submit"],
|
||||
.admin-interface #changelist #changelist-search .quiet {
|
||||
margin-left: 8px;
|
||||
}
|
||||
.admin-interface #changelist #changelist-search label img {
|
||||
vertical-align: text-top;
|
||||
margin-right: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.admin-interface #changelist #toolbar {
|
||||
border-top: 1px solid #eee;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
/* fixed changelist search size when there are search results and .quiet is visible */
|
||||
.admin-interface #changelist-search label img {
|
||||
margin-top: 2px;
|
||||
}
|
||||
.admin-interface #changelist-search .quiet {
|
||||
margin: 0 0 0 10px;
|
||||
align-self: center;
|
||||
flex-basis: content;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
/* fixed responsive widgets */
|
||||
.admin-interface .aligned.collapsed .form-row {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row > div {
|
||||
display: flex;
|
||||
max-width: 100vw;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row .help {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row .checkbox-row label {
|
||||
margin: 10px 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row input[type="file"],
|
||||
.admin-interface .aligned .form-row input[type="text"],
|
||||
.admin-interface .aligned .form-row input[type="email"] {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* fix textarea horizontal scroll on Firefox */
|
||||
.admin-interface .aligned .form-row textarea {
|
||||
width: 100% !important;
|
||||
flex: 0 1 auto;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row .datetime input[type="text"] {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row span + .file-upload {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.admin-interface .aligned .form-row .file-upload input[type="file"] {
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
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,95 @@
|
||||
/* sticky pagination */
|
||||
|
||||
.admin-interface.sticky-pagination.change-list #content-main {
|
||||
padding-bottom: 4.375rem;
|
||||
}
|
||||
|
||||
.admin-interface.sticky-pagination.change-list .paginator {
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 40;
|
||||
box-sizing: border-box;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
border-radius: 0;
|
||||
border-top: 1px solid #EEEEEE;
|
||||
border-bottom: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.admin-interface.sticky-pagination.change-list.popup .paginator {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
@media (min-width:768px) {
|
||||
.admin-interface.sticky-pagination.change-list:not(.popup) .paginator {
|
||||
padding-left: 30px;
|
||||
padding-right: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width:1024px) {
|
||||
.admin-interface.sticky-pagination.change-list:not(.popup) .paginator {
|
||||
padding-left: 40px;
|
||||
padding-right: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width:1280px) {
|
||||
.admin-interface.sticky-pagination.change-list:not(.popup) #main.shifted > #nav-sidebar + .content .paginator {
|
||||
width: calc(100% - 360px);
|
||||
}
|
||||
}
|
||||
|
||||
/* sticky submit */
|
||||
|
||||
@media (min-width:768px) {
|
||||
.admin-interface.sticky-submit.change-form #content-main {
|
||||
padding-bottom: 4.375rem;
|
||||
}
|
||||
|
||||
.admin-interface.sticky-submit.change-form .submit-row:last-of-type {
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 40;
|
||||
box-sizing: border-box;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
border-radius: 0;
|
||||
border-top: 1px solid #EEEEEE;
|
||||
border-bottom: none !important;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.admin-interface.sticky-submit.change-form.popup .submit-row:last-of-type {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.admin-interface.sticky-submit.change-form:not(.popup) .submit-row:last-of-type {
|
||||
padding-left: 30px;
|
||||
padding-right: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width:1024px) {
|
||||
.admin-interface.sticky-submit.change-form:not(.popup) .submit-row:last-of-type {
|
||||
padding-left: 40px;
|
||||
padding-right: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width:1280px) {
|
||||
.admin-interface.sticky-submit.change-form:not(.popup) #main.shifted > #nav-sidebar + .content .submit-row:last-of-type {
|
||||
width: calc(100% - 359px);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* jQuery UI CSS Framework
|
||||
* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
|
||||
* http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/base/jquery.ui.core.css
|
||||
*/
|
||||
|
||||
/*
|
||||
backward compatibility:
|
||||
.ui-tabs-selected: jquery ui < 1.10
|
||||
.ui-tabs-active classes jquery ui >= 1.10
|
||||
*/
|
||||
|
||||
/* Layout helpers
|
||||
----------------------------------*/
|
||||
.ui-helper-hidden { display: none; }
|
||||
.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
|
||||
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
||||
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
||||
.ui-helper-clearfix { display: inline-block; }
|
||||
/* required comment for clearfix to work in Opera \*/
|
||||
* html .ui-helper-clearfix { height:1%; }
|
||||
.ui-helper-clearfix { display:block; }
|
||||
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
||||
.ui-state-disabled { cursor: default !important; }
|
||||
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||
/* http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/base/jquery.ui.tabs.css */
|
||||
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
||||
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
|
||||
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
|
||||
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-active, .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
||||
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
||||
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
|
||||
.ui-tabs .ui-tabs-hide {
|
||||
position: absolute;
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Custom tabs theme */
|
||||
.admin-interface .ui-tabs {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.admin-interface .ui-tabs,
|
||||
.admin-interface .ui-tabs .ui-widget-header,
|
||||
.admin-interface .ui-tabs .ui-widget-header .ui-state-default {
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.admin-interface .ui-tabs .ui-tabs-nav {
|
||||
padding: 10px 0 0 10px;
|
||||
border-bottom: none;
|
||||
}
|
||||
.admin-interface .ui-tabs .ui-tabs-nav li {
|
||||
margin: 0 0 0 -1px;
|
||||
}
|
||||
.admin-interface .ui-tabs .ui-tabs-nav li.required {
|
||||
font-weight: bold;
|
||||
}
|
||||
.admin-interface .ui-tabs .ui-tabs-nav li a {
|
||||
border: 1px solid #eeeeee;
|
||||
background-color: #f8f8f8;
|
||||
border-bottom: none;
|
||||
color: #666666;
|
||||
padding: 7px 14px 8px 14px;
|
||||
margin-top: 1px;
|
||||
-moz-border-radius-topright: 4px;
|
||||
-webkit-border-top-right-radius: 4px;
|
||||
-moz-border-radius-topleft: 4px;
|
||||
-webkit-border-top-left-radius: 4px;
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
font-size: 12px;
|
||||
text-transform: uppercase;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.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 .ui-tabs .ui-tabs-panel {
|
||||
border: 1px solid #eeeeee;
|
||||
border-radius: 4px;
|
||||
padding: 10px;
|
||||
margin-bottom: 30px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular .ui-tabs .ui-tabs-panel {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular .ui-tabs .ui-tabs-nav {
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular tr td {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular tr.has_original td.original,
|
||||
.admin-interface .inline-group .tabular tr td.delete {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular .datetime > input {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.admin-interface .inline-group .tabular .datetime br {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.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,29 @@
|
||||
/*
|
||||
django-json-widget support
|
||||
https://github.com/jmrivas86/django-json-widget
|
||||
*/
|
||||
|
||||
.admin-interface div.jsoneditor {
|
||||
border: 1px solid {{ theme.css_module_background_color }};
|
||||
{% if theme.css_module_rounded_corners %}
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
.admin-interface div.jsoneditor-menu {
|
||||
background-color: {{ theme.css_module_background_color }};
|
||||
border-bottom: 1px solid {{ theme.css_module_background_color }};
|
||||
}
|
||||
|
||||
.admin-interface div.jsoneditor-menu a.jsoneditor-poweredBy {
|
||||
color: {{ theme.css_module_link_color }};
|
||||
}
|
||||
|
||||
.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected,
|
||||
.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus,
|
||||
.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover {
|
||||
background-color: {{ theme.css_module_background_selected_color }};
|
||||
color: #000000;
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -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: calc(100% - 30px);
|
||||
margin-right: 15px;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
django-modeltranslation support
|
||||
https://github.com/deschler/django-modeltranslation
|
||||
*/
|
||||
|
||||
.admin-interface #content h1 select {
|
||||
text-transform: uppercase;
|
||||
margin-left: 15px;
|
||||
min-width: 50px;
|
||||
}
|
||||
|
||||
.admin-interface .ui-tabs .ui-tabs-panel[id^=tab_id_] {
|
||||
border: none;
|
||||
border-top: 1px solid #eeeeee;
|
||||
padding: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
@@ -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,84 @@
|
||||
/*
|
||||
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%;
|
||||
-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: 80px 80px 80px 80px;
|
||||
}
|
||||
|
||||
.admin-interface .related-modal__nested .mfp-container {
|
||||
padding: 40px 80px 40px 80px;
|
||||
}
|
||||
|
||||
@media (max-width:640px){
|
||||
.admin-interface .related-modal .mfp-container {
|
||||
padding: 80px 20px 80px 20px;
|
||||
}
|
||||
.admin-interface .related-modal__nested .mfp-container {
|
||||
padding: 40px 40px 40px 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-height:640px){
|
||||
.admin-interface .related-modal .mfp-container {
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
.admin-interface .related-modal__nested .mfp-container {
|
||||
padding: 40px 40px 40px 40px;
|
||||
}
|
||||
}
|
||||
|
||||
.admin-interface .related-modal .related-modal-iframe-container {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
overflow: hidden;
|
||||
{% if theme.related_modal_rounded_corners %}
|
||||
border-radius: 4px;
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.admin-interface .related-modal .mfp-close {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
opacity: 1.0;
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
{% if not theme.related_modal_close_button_visible %}
|
||||
display: none;
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
.admin-interface .related-modal .mfp-close:hover,
|
||||
.admin-interface .related-modal .mfp-close:active {
|
||||
color: rgba(0, 0, 0, 0.6);
|
||||
top: 0;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
[dir="rtl"] .admin-interface,
|
||||
[dir="rtl"] .admin-interface * {
|
||||
font-family: 'Vazir', sans-serif !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .admin-interface .main .toggle-nav-sidebar.sticky {
|
||||
left: auto !important;
|
||||
right: 0px !important;
|
||||
margin-right: 0px !important;
|
||||
margin-left: 10px;
|
||||
border: 1px solid #eaeaea !important;
|
||||
border-right: none !important;
|
||||
border-top-right-radius: 0px !important;
|
||||
border-bottom-right-radius: 0px !important;
|
||||
border-top-left-radius: 4px;
|
||||
border-bottom-left-radius: 4px;
|
||||
box-shadow: -4px 2px 8px -2px #DBDBDB !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .admin-interface #main.shifted > #toggle-nav-sidebar {
|
||||
right: 359px !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .admin-interface #main > #nav-sidebar {
|
||||
margin-right: -360px !important;
|
||||
margin-left: 0px !important;
|
||||
right: -320px !important;
|
||||
}
|
||||
|
||||
[dir="rtl"] .admin-interface #main.shifted > #nav-sidebar {
|
||||
border-left: 1px solid #eaeaea;
|
||||
margin-right: 0px !important;
|
||||
padding: 40px 0px 40px 40px !important;
|
||||
}
|
||||
@@ -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,37 @@
|
||||
/*
|
||||
django-tabbed-admin support
|
||||
https://github.com/omji/django-tabbed-admin
|
||||
*/
|
||||
|
||||
/* Hide tabs until ready */
|
||||
/*
|
||||
.admin-interface #tabs ul {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.admin-interface #tabs ul.ui-tabs-nav {
|
||||
display: block;
|
||||
}
|
||||
*/
|
||||
|
||||
.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .module.aligned:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .module.aligned:last-child .form-row:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
@media (max-width: 350px){
|
||||
.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .vTextField,
|
||||
.admin-interface .inline-related .vTextField {
|
||||
width: 17em;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 767px){
|
||||
/* fix horizontal overflow - responsive.css:563 */
|
||||
.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .aligned .form-row > div:not([class]) {
|
||||
width: 100% !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>
|
||||
@@ -10,4 +10,3 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
{% load static %}
|
||||
|
||||
{% if theme.favicon %}
|
||||
<link rel="icon" href="{{ theme.favicon.url }}">
|
||||
{% if theme.env_visible_in_favicon %}
|
||||
<script type="text/javascript" src="{% static 'admin_interface/favico/favico-0.3.10-patched.min.js' %}?v={{ version }}"></script>
|
||||
<script type="text/javascript">
|
||||
var favicon = new Favico({
|
||||
type: 'circle',
|
||||
bgColor: '{{ theme.env_color }}',
|
||||
textColor: '#FFFFFF',
|
||||
animation: 'none'
|
||||
});
|
||||
favicon.badge(' ');
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
@@ -0,0 +1,20 @@
|
||||
{% load admin_interface_tags %}
|
||||
|
||||
{% if languages %}
|
||||
<div class="language-chooser">
|
||||
{% for language in languages %}
|
||||
<form class="language-chooser-hidden-form" id="language-chooser-hidden-form-{{ language.code }}" action="{{ language.activation_url }}" method="POST">
|
||||
{% csrf_token %}
|
||||
<input name="language" type="hidden" value="{{ language.code }}">
|
||||
</form>
|
||||
{% endfor %}
|
||||
<form class="language-chooser-select-form">
|
||||
{% csrf_token %}
|
||||
<select name="language" onchange="document.getElementById(String('language-chooser-hidden-form-' + this.value)).submit();">
|
||||
{% for language in languages %}
|
||||
<option value="{{ language.code }}" {% if language.active %}selected{% endif %}>{% if theme.language_chooser_display == 'code' %}{{ language.code|upper }}{% elif theme.language_chooser_display == 'name' %}{{ language.name }}{% endif %}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -0,0 +1,7 @@
|
||||
{% load static %}
|
||||
|
||||
{% 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 %}
|
||||
@@ -1,24 +1,80 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django import template
|
||||
import django
|
||||
from django import template, VERSION
|
||||
from django.conf import settings
|
||||
if django.VERSION < (1, 10):
|
||||
from django.core.urlresolvers import NoReverseMatch, reverse
|
||||
else:
|
||||
from django.urls import NoReverseMatch, reverse
|
||||
from django.utils import translation
|
||||
|
||||
from admin_interface.cache import get_cached_active_theme, set_cached_active_theme
|
||||
from admin_interface.models import Theme
|
||||
from admin_interface.version import __version__
|
||||
|
||||
import re
|
||||
|
||||
|
||||
register = template.Library()
|
||||
|
||||
if VERSION < (1, 9):
|
||||
simple_tag = register.assignment_tag
|
||||
else:
|
||||
simple_tag = register.simple_tag
|
||||
|
||||
@register.assignment_tag(takes_context = True)
|
||||
|
||||
@simple_tag(takes_context=True)
|
||||
def get_admin_interface_languages(context):
|
||||
if not settings.USE_I18N:
|
||||
# i18n disabled
|
||||
return None
|
||||
if len(settings.LANGUAGES) < 2:
|
||||
# less than 2 languages
|
||||
return None
|
||||
try:
|
||||
set_language_url = reverse('set_language')
|
||||
except NoReverseMatch:
|
||||
# ImproperlyConfigured - must include i18n urls:
|
||||
# urlpatterns += [url(r'^i18n/', include('django.conf.urls.i18n')),]
|
||||
return None
|
||||
request = context.get('request', None)
|
||||
if not request:
|
||||
return None
|
||||
full_path = request.get_full_path()
|
||||
admin_nolang_url = re.sub(r'^\/([\w]{2})([\-\_]{1}[\w]{2,4})?\/', '/', full_path)
|
||||
if admin_nolang_url == full_path:
|
||||
# ImproperlyConfigured - must include admin urls using i18n_patterns:
|
||||
# from django.conf.urls.i18n import i18n_patterns
|
||||
# urlpatterns += i18n_patterns(url(r'^admin/', admin.site.urls))
|
||||
return None
|
||||
langs_data = []
|
||||
default_lang_code = settings.LANGUAGE_CODE
|
||||
current_lang_code = translation.get_language() or default_lang_code
|
||||
for language in settings.LANGUAGES:
|
||||
lang_code = language[0].lower()
|
||||
lang_name = language[1].title()
|
||||
lang_data = {
|
||||
'code': lang_code,
|
||||
'name': lang_name,
|
||||
'default': lang_code == default_lang_code,
|
||||
'active': lang_code == current_lang_code,
|
||||
'activation_url': '{}?next=/{}{}'.format(
|
||||
set_language_url, lang_code, admin_nolang_url)
|
||||
}
|
||||
langs_data.append(lang_data)
|
||||
return langs_data
|
||||
|
||||
|
||||
@simple_tag(takes_context=True)
|
||||
def get_admin_interface_theme(context):
|
||||
theme = get_cached_active_theme()
|
||||
if not theme:
|
||||
theme = Theme.get_active_theme()
|
||||
set_cached_active_theme(theme)
|
||||
return theme
|
||||
|
||||
obj_qs = Theme.objects.filter(active = True)[:1]
|
||||
obj_ls = list(obj_qs)
|
||||
obj = None
|
||||
|
||||
if len(obj_ls):
|
||||
obj = obj_ls[0]
|
||||
else:
|
||||
obj = Theme.get_or_create_default_theme()
|
||||
|
||||
return obj
|
||||
|
||||
@simple_tag(takes_context=False)
|
||||
def get_admin_interface_version():
|
||||
return __version__
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
__version__ = '0.2.0'
|
||||
|
||||
__version__ = '0.17.2'
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
codecov
|
||||
coverage
|
||||
django>=1.7
|
||||
django-colorfield
|
||||
django-flat-theme
|
||||
django-flat-responsive
|
||||
six>=1.9.0
|
||||
tox
|
||||
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,26 +1,76 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
import os, sys
|
||||
|
||||
exec(open('admin_interface/version.py').read())
|
||||
|
||||
github_url = 'https://github.com/fabiocaccamo'
|
||||
package_name = 'django-admin-interface'
|
||||
package_url = '{}/{}'.format(github_url, package_name)
|
||||
package_path = os.path.abspath(os.path.dirname(__file__))
|
||||
long_description_file_path = os.path.join(package_path, 'README.md')
|
||||
long_description_content_type = 'text/markdown'
|
||||
long_description = ''
|
||||
try:
|
||||
long_description_file_options = {} if sys.version_info[0] < 3 else { 'encoding':'utf-8' }
|
||||
with open(long_description_file_path, 'r', **long_description_file_options) 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 responsive flat admin interface customizable by the admin itself.',
|
||||
long_description=long_description,
|
||||
long_description_content_type=long_description_content_type,
|
||||
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__,
|
||||
url=package_url,
|
||||
download_url='{}/archive/{}.tar.gz'.format(package_url, __version__),
|
||||
keywords=['django', 'admin', 'interface', 'responsive', 'flat', 'theme', 'custom', 'ui'],
|
||||
requires=['django(>=1.7)'],
|
||||
install_requires=[
|
||||
'django-colorfield==0.1.12',
|
||||
'django-flat-theme==1.1.4',
|
||||
'django-flat-responsive==1.2.0'
|
||||
'django-colorfield >= 0.2, < 1.0',
|
||||
'django-flat-theme >= 1.0, < 2.0',
|
||||
'django-flat-responsive >= 1.0, < 3.0',
|
||||
'six >= 1.9.0, < 2.0.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',
|
||||
'Framework :: Django :: 2.0',
|
||||
'Framework :: Django :: 2.1',
|
||||
'Framework :: Django :: 2.2',
|
||||
'Framework :: Django :: 3.0',
|
||||
'Framework :: Django :: 3.1',
|
||||
'Framework :: Django :: 3.2',
|
||||
'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',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
'Programming Language :: Python :: 3.8',
|
||||
'Programming Language :: Python :: 3.9',
|
||||
'Topic :: Software Development :: Build Tools',
|
||||
],
|
||||
license='MIT',
|
||||
test_suite='runtests.runtests'
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import django
|
||||
import os
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
SECRET_KEY = 'django-admin-interface'
|
||||
|
||||
ALLOWED_HOSTS = ['*']
|
||||
|
||||
# Application definition
|
||||
INSTALLED_APPS = [
|
||||
'admin_interface',
|
||||
'colorfield',
|
||||
]
|
||||
|
||||
if django.VERSION < (1, 9):
|
||||
# ONLY if django version < 1.9
|
||||
INSTALLED_APPS += [
|
||||
'flat',
|
||||
]
|
||||
|
||||
if django.VERSION < (2, 0):
|
||||
# ONLY if django version < 2.0
|
||||
INSTALLED_APPS += [
|
||||
'flat_responsive',
|
||||
]
|
||||
|
||||
INSTALLED_APPS += [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.sessions',
|
||||
]
|
||||
|
||||
if django.VERSION < (2, 0):
|
||||
MIDDLEWARE_CLASSES = [
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware'
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
]
|
||||
else:
|
||||
MIDDLEWARE = [
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
]
|
||||
|
||||
TEMPLATES = [{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
'django.template.context_processors.request',
|
||||
]
|
||||
},
|
||||
},]
|
||||
|
||||
database_engine = os.environ.get('DATABASE_ENGINE', 'sqlite')
|
||||
database_config = {
|
||||
'sqlite': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': ':memory:',
|
||||
},
|
||||
# 'mysql': {
|
||||
# 'ENGINE': 'django.db.backends.mysql',
|
||||
# 'NAME': 'admin_interface',
|
||||
# 'USER': 'mysql',
|
||||
# 'PASSWORD': 'mysql',
|
||||
# 'HOST': '',
|
||||
# 'PORT': '',
|
||||
# },
|
||||
'postgres': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'admin_interface',
|
||||
'USER': 'postgres',
|
||||
'PASSWORD': 'postgres',
|
||||
'HOST': '',
|
||||
'PORT': '',
|
||||
}
|
||||
}
|
||||
|
||||
DATABASES = {
|
||||
'default': database_config.get(database_engine),
|
||||
}
|
||||
|
||||
USE_I18N = True
|
||||
LANGUAGES = (
|
||||
('en', 'English', ),
|
||||
('it', 'Italian', ),
|
||||
)
|
||||
LANGUAGE_CODE = 'en'
|
||||
|
||||
ROOT_URLCONF = 'tests.urls'
|
||||
|
||||
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/'
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.core.management import call_command
|
||||
from django.test import TestCase
|
||||
|
||||
from admin_interface.models import Theme
|
||||
|
||||
|
||||
class AdminInterfaceFixturesTestCase(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
def __load_theme(self, theme_name):
|
||||
call_command('loaddata', 'admin_interface_theme_%s.json' % (theme_name, ))
|
||||
|
||||
def test_import_initial_data(self):
|
||||
call_command('loaddata', 'initial_data.json')
|
||||
self.assertEqual(Theme.objects.count(), 1);
|
||||
|
||||
def test_import_all(self):
|
||||
self.__load_theme('django')
|
||||
self.__load_theme('bootstrap')
|
||||
self.__load_theme('foundation')
|
||||
self.__load_theme('uswds')
|
||||
self.assertEqual(Theme.objects.count(), 4);
|
||||
|
||||
def test_import_idempotency(self):
|
||||
self.__load_theme('django')
|
||||
self.__load_theme('django')
|
||||
self.__load_theme('django')
|
||||
self.__load_theme('django')
|
||||
self.__load_theme('django')
|
||||
self.assertEqual(Theme.objects.count(), 1);
|
||||
self.__load_theme('bootstrap')
|
||||
self.__load_theme('bootstrap')
|
||||
self.__load_theme('bootstrap')
|
||||
self.assertEqual(Theme.objects.count(), 2);
|
||||
|
||||
def test_import_override(self):
|
||||
obj1 = Theme.get_active_theme()
|
||||
obj1.title = 'Custom 1'
|
||||
obj1.save()
|
||||
self.__load_theme('django')
|
||||
obj2 = Theme.get_active_theme()
|
||||
self.assertEqual(obj1.pk, obj2.pk)
|
||||
self.assertTrue(obj1.title != obj2.title)
|
||||
@@ -0,0 +1,91 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
from django.test import TestCase
|
||||
|
||||
import random
|
||||
import shutil
|
||||
|
||||
from admin_interface.models import Theme
|
||||
|
||||
|
||||
class AdminInterfaceModelsTestCase(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(settings.MEDIA_ROOT, ignore_errors=True)
|
||||
|
||||
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_repr(self):
|
||||
theme = Theme.get_active_theme()
|
||||
self.assertEqual('{0}'.format(theme), 'Django')
|
||||
@@ -0,0 +1,94 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import django
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.test import override_settings, TestCase
|
||||
|
||||
from admin_interface.settings import check_installed_apps
|
||||
|
||||
|
||||
class AdminInterfaceSettingsTestCase(TestCase):
|
||||
|
||||
DJANGO_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.sessions',
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
def __test_installed_apps(self):
|
||||
dj_version = django.VERSION
|
||||
installed_apps = settings.INSTALLED_APPS
|
||||
|
||||
if 'colorfield' not in installed_apps:
|
||||
self.assertRaises(ImproperlyConfigured, check_installed_apps)
|
||||
|
||||
elif 'flat' not in installed_apps and dj_version < (1, 9):
|
||||
self.assertRaises(ImproperlyConfigured, check_installed_apps)
|
||||
|
||||
elif 'flat' in installed_apps and dj_version >= (1, 9):
|
||||
self.assertRaises(ImproperlyConfigured, check_installed_apps)
|
||||
|
||||
elif 'flat_responsive' not in installed_apps and dj_version < (2, 0):
|
||||
self.assertRaises(ImproperlyConfigured, check_installed_apps)
|
||||
|
||||
elif 'flat_responsive' in installed_apps and dj_version >= (2, 0):
|
||||
self.assertRaises(ImproperlyConfigured, check_installed_apps)
|
||||
|
||||
else:
|
||||
check_installed_apps()
|
||||
|
||||
@override_settings(
|
||||
INSTALLED_APPS = [
|
||||
'admin_interface',
|
||||
'colorfield',
|
||||
'flat',
|
||||
'flat_responsive',
|
||||
] + DJANGO_APPS
|
||||
)
|
||||
def test_installed_apps_all(self):
|
||||
self.__test_installed_apps()
|
||||
|
||||
@override_settings(
|
||||
INSTALLED_APPS = [
|
||||
'admin_interface',
|
||||
# 'colorfield',
|
||||
'flat',
|
||||
'flat_responsive',
|
||||
] + DJANGO_APPS
|
||||
)
|
||||
def test_installed_apps_no_colorfield(self):
|
||||
self.__test_installed_apps()
|
||||
|
||||
@override_settings(
|
||||
INSTALLED_APPS = [
|
||||
'admin_interface',
|
||||
'colorfield',
|
||||
# 'flat',
|
||||
'flat_responsive',
|
||||
] + DJANGO_APPS
|
||||
)
|
||||
def test_installed_apps_no_flat(self):
|
||||
self.__test_installed_apps()
|
||||
|
||||
@override_settings(
|
||||
INSTALLED_APPS = [
|
||||
'admin_interface',
|
||||
'colorfield',
|
||||
'flat',
|
||||
# 'flat_responsive',
|
||||
] + DJANGO_APPS
|
||||
)
|
||||
def test_installed_apps_no_flat_responsive(self):
|
||||
self.__test_installed_apps()
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.test import override_settings, TestCase
|
||||
from django.test.client import RequestFactory
|
||||
from django.template import Context, Template
|
||||
|
||||
from admin_interface.models import Theme
|
||||
from admin_interface.templatetags import admin_interface_tags as templatetags
|
||||
from admin_interface.version import __version__
|
||||
|
||||
|
||||
class AdminInterfaceTemplateTagsTestCase(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.request_factory = RequestFactory()
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
def __render_template(self, string, context=None):
|
||||
return Template(string).render(Context(context or {}))
|
||||
|
||||
def test_get_admin_interface_languages(self):
|
||||
context = Context({
|
||||
'request': self.request_factory.get('/en/admin/'),
|
||||
})
|
||||
languages = templatetags.get_admin_interface_languages(context)
|
||||
expected_languages = [
|
||||
{'code': 'en', 'name': 'English', 'default': True, 'active': True, 'activation_url': '/i18n/setlang/?next=/en/admin/'},
|
||||
{'code': 'it', 'name': 'Italian', 'default': False, 'active': False, 'activation_url': '/i18n/setlang/?next=/it/admin/'}
|
||||
]
|
||||
self.assertEqual(len(languages), len(expected_languages))
|
||||
self.assertEqual(languages[0], expected_languages[0])
|
||||
self.assertEqual(languages[1], expected_languages[1])
|
||||
|
||||
@override_settings(
|
||||
USE_I18N = False,
|
||||
)
|
||||
def test_get_admin_interface_languages_with_i18n_disabled(self):
|
||||
context = Context({
|
||||
'request': self.request_factory.get('/en/admin/'),
|
||||
})
|
||||
languages = templatetags.get_admin_interface_languages(context)
|
||||
self.assertEqual(languages, None)
|
||||
|
||||
@override_settings(
|
||||
ROOT_URLCONF = 'tests.urls_without_i18n_patterns',
|
||||
)
|
||||
def test_get_admin_interface_languages_without_i18n_url_patterns(self):
|
||||
context = Context({
|
||||
'request': self.request_factory.get('/en/admin/'),
|
||||
})
|
||||
languages = templatetags.get_admin_interface_languages(context)
|
||||
self.assertEqual(languages, None)
|
||||
|
||||
@override_settings(
|
||||
LANGUAGES = (
|
||||
('en', 'English'),
|
||||
),
|
||||
)
|
||||
def test_get_admin_interface_languages_without_multiple_languages(self):
|
||||
context = Context({
|
||||
'request': self.request_factory.get('/en/admin/'),
|
||||
})
|
||||
languages = templatetags.get_admin_interface_languages(context)
|
||||
self.assertEqual(languages, None)
|
||||
|
||||
def test_get_admin_interface_languages_without_request(self):
|
||||
context = Context({})
|
||||
languages = templatetags.get_admin_interface_languages(context)
|
||||
self.assertEqual(languages, None)
|
||||
|
||||
def test_get_admin_interface_languages_without_language_prefix_in_url(self):
|
||||
context = Context({
|
||||
'request': self.request_factory.get('/admin/'),
|
||||
})
|
||||
languages = templatetags.get_admin_interface_languages(context)
|
||||
self.assertEqual(languages, None)
|
||||
|
||||
def test_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_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_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__)
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import django
|
||||
from django.contrib import admin
|
||||
if django.VERSION < (2, 0):
|
||||
from django.conf.urls import include, url as re_path
|
||||
else:
|
||||
from django.urls import include, re_path
|
||||
from django.conf.urls.i18n import i18n_patterns
|
||||
|
||||
|
||||
urlpatterns = []
|
||||
urlpatterns += [
|
||||
re_path(r'^i18n/', include('django.conf.urls.i18n')),
|
||||
]
|
||||
urlpatterns += i18n_patterns(
|
||||
re_path(r'^admin/', admin.site.urls),
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import django
|
||||
from django.contrib import admin
|
||||
if django.VERSION < (2, 0):
|
||||
from django.conf.urls import url as re_path
|
||||
else:
|
||||
from django.urls import re_path
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
re_path(r'^admin/', admin.site.urls),
|
||||
]
|
||||
@@ -0,0 +1,35 @@
|
||||
[tox]
|
||||
envlist =
|
||||
py27-{dj17,dj18,dj19,dj110,dj111}-{sqlite,postgres},
|
||||
py35-{dj18,dj19,dj110,dj111,dj20,dj21,dj22}-{sqlite,postgres},
|
||||
py36-{dj18,dj19,dj110,dj111,dj20,dj21,dj22,dj30,dj31,dj32,djmaster}-{sqlite,postgres},
|
||||
py37-{dj20,dj21,dj22,dj30,dj31,dj32,djmaster}-{sqlite,postgres},
|
||||
py38-{dj22,dj30,dj31,dj32,djmaster}-{sqlite,postgres},
|
||||
py39-{dj22,dj30,dj31,dj32,djmaster}-{sqlite,postgres},
|
||||
[testenv]
|
||||
passenv = CI TRAVIS TRAVIS_*
|
||||
deps =
|
||||
dj17: Django == 1.7.*
|
||||
dj18: Django == 1.8.*
|
||||
dj19: Django == 1.9.*
|
||||
dj110: Django == 1.10.*
|
||||
dj111: Django == 1.11.*
|
||||
dj20: Django == 2.0.*
|
||||
dj21: Django == 2.1.*
|
||||
dj22: Django == 2.2.*
|
||||
dj30: Django == 3.0.*
|
||||
dj31: Django == 3.1.*
|
||||
dj32: Django == 3.2.*
|
||||
djmaster: https://github.com/django/django/archive/master.tar.gz
|
||||
# mysql: mysqlclient
|
||||
postgres: psycopg2-binary
|
||||
coverage
|
||||
codecov
|
||||
setenv =
|
||||
sqlite: DATABASE_ENGINE=sqlite
|
||||
# mysql: DATABASE_ENGINE=mysql
|
||||
postgres: DATABASE_ENGINE=postgres
|
||||
commands =
|
||||
coverage run --append --source=admin_interface setup.py test
|
||||
coverage report -m
|
||||
codecov
|
||||
Reference in New Issue
Block a user