Compare commits

...

106 Commits

Author SHA1 Message Date
Fabio Caccamo a2329fdae5 Updated CHANGELOG and version. 2021-09-16 15:48:16 +02:00
Fabio Caccamo a388ec234c Added logo_max_width and logo_max_height. #127 2021-09-16 15:47:14 +02:00
Fabio Caccamo a3b3f8922d Update CHANGELOG.md 2021-09-16 14:35:26 +02:00
Fabio Caccamo 6b6eed3aa0 Updated CHANGELOG and version. 2021-09-16 14:33:53 +02:00
Mason Neipp fd48e5ca97 Fixed 0020 migration for multiple dbs. #132 2021-09-04 14:45:49 +02:00
Fabio Caccamo fbc29246ff Improved header elements vertical alignment. 2021-05-06 23:34:49 +02:00
Fabio Caccamo 1569828c67 Updated README Installation section. [ci skip] 2021-05-02 10:39:56 +02:00
Fabio Caccamo bb73fafeff Fixed inlines vertical overlow. 2021-04-26 15:29:46 +02:00
Fabio Caccamo f76a41ff14 Fixed sticky pagination width and border-bottom. 2021-04-26 11:51:06 +02:00
Fabio Caccamo 4351751193 Updated CHANGELOG and version. 2021-04-26 10:18:58 +02:00
Fabio Caccamo 044ad518e0 Formatted migrations. 2021-04-26 10:16:03 +02:00
Fabio Caccamo 5b976adb1d Added missing 0021_file_extension_validator migration. #126 2021-04-26 10:15:24 +02:00
Fabio Caccamo 74732ec9a9 Added compat module. 2021-04-26 10:14:36 +02:00
Fabio Caccamo 5c85dc9cd4 Updated version and CHANGELOG. 2021-04-23 15:00:26 +02:00
Fabio Caccamo 66966501f8 Added FileExtensionValidator to logo and favicon fields. #112 2021-04-23 14:53:02 +02:00
Fabio Caccamo 30af685edf Improved selects min-width. 2021-04-21 11:30:30 +02:00
Fabio Caccamo 96d1568c13 Added min-width to selects. 2021-04-20 16:54:29 +02:00
Fabio Caccamo 7c04b35b44 Fixed related widget wrapper margin/padding with normal select. 2021-04-20 16:54:13 +02:00
Fabio Caccamo 004cd5fbcb Improved tabular inlines horizontal scroll. 2021-04-20 15:04:51 +02:00
Fabio Caccamo 8e37cdd218 Fixed related widget wrapper margin/padding in inlines. 2021-04-20 15:04:30 +02:00
Fabio Caccamo ba6807b7f3 Fixed changelist search and actions horizontal margins. 2021-04-16 12:33:21 +02:00
Fabio Caccamo 59a8b4d2d7 Removed invalid property. 2021-04-16 12:32:36 +02:00
Fabio Caccamo f72aac8848 Fixed changelist submit button margin left (with html minified). 2021-04-14 16:03:52 +02:00
Fabio Caccamo 41c6d5b7f1 Fixed header min-height. 2021-04-14 11:31:38 +02:00
Fabio Caccamo 554d8d27b7 Fixed models.W042 warning on django 3.2. 2021-04-14 11:18:58 +02:00
Fabio Caccamo c337c21a03 Added python 3.9 and django 3.2 to tox and travis. 2021-04-12 10:00:22 +02:00
Fabio Caccamo 0f9d502e4f Updated CHANGELOG and version. 2021-04-07 15:16:36 +02:00
Fabio Caccamo c961de3391 Overridden dark-mode css variables introduced in django 3.2. #124 2021-04-07 15:14:36 +02:00
Fabio Caccamo aec7ede184 Fixed delete confirmation styles selector prefix. 2021-04-07 15:13:23 +02:00
Natán d338e5914e Added custom style for the "Delete" and "Save" buttons from the delete confirmation page. (#123)
![Confirmation page](https://i.imgur.com/h4hflxu.png)
2021-04-07 15:09:20 +02:00
Fabio Caccamo 36971ad662 Fixed README links. [ci skip] 2021-03-30 18:17:29 +02:00
Fabio Caccamo d2c8885afa Updated CHANGELOG and version. 2021-03-30 18:13:11 +02:00
Fabio Caccamo e9b0694c0b Added supporting section to README. 2021-03-30 18:05:58 +02:00
Fabio Caccamo 14aa681e7d Removed unused funding options. 2021-03-30 18:02:02 +02:00
Fabio Caccamo c2e3545f46 Added responsive_rtl.css stylesheet. #98 2021-03-30 18:01:39 +02:00
Fabio Caccamo aed5afbfa7 Updated vazir-font version to 27.2.2. #98 2021-03-30 17:59:56 +02:00
Fabio Caccamo 9b7c6ee3fe Added css variables for css_module_background_selected_color and css_module_link_selected_color. #122 2021-03-30 17:57:44 +02:00
Henri Chain a8322872ab Added customizable colors for selected apps and models in dashboard. #122 2021-03-29 09:49:07 +02:00
Fabio Caccamo e5318b688b Updated CHANGELOG and version. 2021-03-26 19:17:05 +01:00
Fabio Caccamo 455259f3ef Fixed inline changelink style. 2021-03-26 19:14:39 +01:00
Fabio Caccamo 7d2d29a42c Made globally available presentRelatedObjectModal and presentRelatedObjectModalOnClickOn. 2021-03-26 19:14:22 +01:00
Henri Chain 5ed9fd75cc support show_change_link with related modal (#120) 2021-03-26 18:35:06 +01:00
Fabio Caccamo ca71642ecf Updated CHANGELOG and version. 2021-03-02 09:52:48 +01:00
Fabio Caccamo 4369288928 Fixed sticky submit and pagination z-index issue with related modal. 2021-03-02 09:52:36 +01:00
Fabio Caccamo f167bbf2c4 Updated README, CHANGELOG and version. 2021-03-01 23:32:26 +01:00
Fabio Caccamo 1b60af57e0 Fixed sticky submit and pagination z-index issue with sticky list_filter and django-json-widget. 2021-03-01 23:32:05 +01:00
Fabio Caccamo 947202f915 Updated version and CHANGELOG. 2021-02-08 11:21:37 +01:00
Fabio Caccamo 7eb6371104 Fixed sticky submit and pagination width when admin.site.enable_nav_sidebar = False. #113 2021-02-08 11:21:04 +01:00
Fabio Caccamo c315f366f3 Updated version and CHANGELOG. 2021-02-03 21:24:27 +01:00
Fabio Caccamo f2a2a98ad9 Improved sticky submit and pagination backward compatibility. 2021-02-03 21:23:05 +01:00
Fabio Caccamo 5b606153de Fixed body classes template rendering. 2021-02-03 21:22:06 +01:00
Fabio Caccamo 87396a1b5e Updated version and CHANGELOG. 2021-02-03 17:15:13 +01:00
Fabio Caccamo b35a2987cc Fixed and improved sticky form controls and pagination style. 2021-02-03 17:15:01 +01:00
Fabio Caccamo 2baed25204 Updated version and CHANGELOG. 2021-02-03 14:35:45 +01:00
Fabio Caccamo 3f5a3f9ded Updated README. 2021-02-03 14:35:25 +01:00
Fabio Caccamo 6189a7bbdb Renamed migration. 2021-02-03 14:35:10 +01:00
Amir Ajorloo d1cda34a52 Add sticky action button option. (#110)
* Add sticky action button option.

* Add sticky_pagination field. Handle top submit row. Update Admin section

* Add sticky-pagination styles. Fix trailing whitespace issue in models.

* Update sticky pagination max-width
2021-02-03 10:26:07 +01:00
Fabio Caccamo fdbacba4bb Added support to 4-digit language code in language chooser. #111 2021-01-29 15:57:39 +01:00
Fabio Caccamo 5c56f3a2db Added theme css variables. 2021-01-11 15:34:58 +01:00
Fabio Caccamo 17bb35c559 Fixed app module section link hover color. 2021-01-11 15:34:42 +01:00
Fabio Caccamo ed25f0fdde Updated version and CHANGELOG. 2021-01-04 13:55:07 +01:00
Fabio Caccamo a18e35f4c3 Updated LICENSE copyright year to present. 2021-01-04 13:54:57 +01:00
Fabio Caccamo f9817da531 Fixed module header selected link color. 2021-01-04 13:50:40 +01:00
Fabio Caccamo d94c6321aa Disabled sidebar transition. 2021-01-04 12:24:43 +01:00
Fabio Caccamo 3c77bad4ae Fixed tabular inline scroll bar. #101 2021-01-04 12:24:24 +01:00
Fabio Caccamo aa36776490 Fixed main content width when admin.site.enable_nav_sidebar is False. 2021-01-04 12:16:28 +01:00
anatolzak d375b04941 added transition to nav sidebar and toggle nav sidebar button (#104)
* added transition to nav sidebar and toggle nav sidebar button

* specified transition properties instead of using all

* removed extra blank line

Co-authored-by: Anatol Zakrividoroga <anatol@Anatols-MacBook-Pro.local>
2020-12-15 16:32:15 +01:00
Fabio Caccamo cceb0b1721 Updated README. [ci skip] 2020-11-27 13:11:07 +01:00
Fabio Caccamo e364f9da1c Updated CHANGELOG and version. 2020-11-12 13:28:06 +01:00
Fabio Caccamo aec847070f Fixed sticky list-filter floating. #100 2020-11-12 13:27:51 +01:00
Fabio Caccamo 11f7440273 Improved tests coverage. 2020-10-21 12:27:14 +02:00
Fabio Caccamo 02cde83181 Fixed long description encoding. 2020-10-21 12:26:31 +02:00
Fabio Caccamo a302c87724 Updated CHANGELOG and version. 2020-10-15 11:14:12 +02:00
Fabio Caccamo d61ef86dd6 Added list filter sticky option (only for django >= 3.1.2). 2020-10-15 10:49:26 +02:00
Fabio Caccamo 071fe476a6 Enabled list filter dropdown by default. 2020-10-15 10:48:16 +02:00
Fabio Caccamo 9b611d1dcb Fixed searchbar style. 2020-10-15 10:42:40 +02:00
Fabio Caccamo 61c1720fd7 Fixed searchbar style. 2020-10-15 10:06:58 +02:00
Fabio Caccamo 962267de1d Updated CHANGELOG and version. 2020-10-14 18:37:50 +02:00
Fabio Caccamo f632929183 Improved responsive widgets style. 2020-10-14 18:35:59 +02:00
Fabio Caccamo 308858a0d0 Prevented body horizontal scroll. 2020-10-14 18:35:39 +02:00
Fabio Caccamo db7e0770b2 Fixed tabular inline horizontal scroll. 2020-10-14 18:34:56 +02:00
Fabio Caccamo 195ef2c44f Fixed changelist filter min-width. 2020-10-14 18:34:31 +02:00
Fabio Caccamo 48d3952e68 Fixed changelist and toolbar theme rounded corners. 2020-10-14 18:33:41 +02:00
Fabio Caccamo 96570502cc Fixed calendar and timelist buttons theme color. 2020-10-14 18:33:14 +02:00
Fabio Caccamo 759b5a6f49 Fixed list filter select size. 2020-10-14 18:32:49 +02:00
Fabio Caccamo 92710be337 Fixed content max-width with django 3.1.2 2020-10-14 13:57:35 +02:00
Fabio Caccamo c721359eea Updated CHANGELOG and version. 2020-10-14 13:00:34 +02:00
Fabio Caccamo 79ea1729cc Fixed logo, content and changelist-filter max-width. 2020-10-14 12:55:57 +02:00
Fabio Caccamo 8c4520d4b7 Added .admin-interface prefix to rtl selectors. 2020-10-14 12:55:26 +02:00
Fabio Caccamo b703f77f80 Re-added .gitignore [ci skip] 2020-10-14 10:02:25 +02:00
Amir Ajorloo 13b1d9f15f Add persian language (#98)
* add fa language translations
* add rtl css file. fix side-nav issue in rtl mode

Co-authored-by: Amir Ajorloo <amirajorloo@gmail.coml>
Co-authored-by: Fabio Caccamo <fabio.caccamo@gmail.com>
2020-10-14 10:00:45 +02:00
Fabio Caccamo e989e623db Updated README. [ci skip] 2020-10-13 15:38:20 +02:00
Fabio Caccamo 2113d009f4 Removed python 3.9 from travis. 2020-10-07 10:50:23 +02:00
Fabio Caccamo e967d09c8b Added python 3.9 to tests. 2020-10-06 10:59:09 +02:00
Fabio Caccamo c050c4f94c Updated CHANGELOG and version. 2020-09-15 09:54:30 +02:00
Fabio Caccamo 97cea97307 Removed python 3.4 from tox test matrix. 2020-09-15 09:54:01 +02:00
Fabio Caccamo 826340c9be Fixed loaddata error with initial_data.json fixture. #97 2020-09-15 09:49:50 +02:00
Fabio Caccamo 28dfc70474 Fixed tests warning (admin.W411). 2020-09-15 09:47:01 +02:00
Fabio Caccamo e9038157be Fixed changelist thead links color. 2020-09-07 23:30:35 +02:00
Fabio Caccamo be21550c6a Fixed changelist filter links hover color. 2020-09-07 14:10:53 +02:00
Fabio Caccamo db87a2aae2 Added "See also" section to README. [ci skip] 2020-09-04 17:00:02 +02:00
Fabio Caccamo 97ac8268b6 Updated version and CHANGELOG. 2020-09-04 15:35:54 +02:00
Fabio Caccamo 941835b5ee Removed old import. 2020-09-04 15:32:58 +02:00
Fabio Caccamo b050d7cb61 Added conditional imports to avoid Django deprecation warnings. #92 2020-09-04 15:30:03 +02:00
Fabio Caccamo 7d64545031 Updated header user-tools margins. 2020-09-04 11:43:42 +02:00
Fabio Caccamo 892bfa5e16 Changed header content vertical align to top. 2020-09-02 18:08:48 +02:00
44 changed files with 1422 additions and 136 deletions
-4
View File
@@ -1,6 +1,2 @@
github: [fabiocaccamo]
patreon: fabiocaccamo
ko_fi: fabiocaccamo
liberapay: fabiocaccamo
issuehunt: fabiocaccamo
custom: ['https://www.paypal.me/fabiocaccamo']
+34
View File
@@ -76,6 +76,10 @@ jobs:
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"
@@ -100,6 +104,10 @@ jobs:
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"
@@ -116,10 +124,34 @@ jobs:
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
@@ -127,6 +159,8 @@ jobs:
- 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:
+102
View File
@@ -4,6 +4,108 @@ 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.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
+1 -1
View File
@@ -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
+71 -8
View File
@@ -22,10 +22,12 @@ django-admin-interface is a modern **responsive flat admin interface customizabl
- Beautiful default **django-theme**
- Themes management and customization *(you can **customize admin title, logo and colors**)*
- Responsive
- List filter dropdown *(optional)*
- `NEW` **Related modal** *(instead of the old popup window, optional)*
- `NEW` **Environment name/marker**
- `NEW` **Language chooser**
- 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`
@@ -49,7 +51,9 @@ INSTALLED_APPS = (
#...
)
X_FRAME_OPTIONS='SAMEORIGIN' # only if django version >= 3.0
# only if django version >= 3.0
X_FRAME_OPTIONS = 'SAMEORIGIN'
SILENCED_SYSTEM_CHECKS = ['security.W019']
```
- Run ``python manage.py migrate``
- Run ``python manage.py collectstatic``
@@ -77,7 +81,7 @@ Run ``python manage.py loaddata admin_interface_theme_foundation.json``
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 :
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``
@@ -88,6 +92,34 @@ You can add a theme you've created through the admin to this repository by [send
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
![django-admin-interface_login](https://cloud.githubusercontent.com/assets/1035294/11240233/55c8d4ba-8df1-11e5-9568-00fdc987ede8.gif)
@@ -128,7 +160,38 @@ python setup.py test
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. 🧟‍♂️
+16 -2
View File
@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
from admin_interface.compat import gettext_lazy as _
from admin_interface.models import Theme
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
class ThemeAdmin(admin.ModelAdmin):
@@ -38,6 +38,8 @@ class ThemeAdmin(admin.ModelAdmin):
'classes': ('wide', ),
'fields': (
'logo',
'logo_max_width',
'logo_max_height',
'logo_color',
'logo_visible',
)
@@ -67,8 +69,10 @@ class ThemeAdmin(admin.ModelAdmin):
'classes': ('wide', ),
'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',
)
@@ -106,9 +110,19 @@ class ThemeAdmin(admin.ModelAdmin):
'related_modal_close_button_visible',
)
}),
(_('Form Controls'), {
'classes': ('wide', ),
'fields': (
'form_submit_sticky',
'form_pagination_sticky',
)
}),
(_('List Filter'), {
'classes': ('wide', ),
'fields': ('list_filter_dropdown', )
'fields': (
'list_filter_dropdown',
'list_filter_sticky',
)
}),
(_('Recent Actions'), {
'classes': ('wide', ),
+3 -1
View File
@@ -1,14 +1,16 @@
# -*- coding: utf-8 -*-
from admin_interface.compat import gettext_lazy as _
from django.apps import AppConfig
from django.db.models.signals import post_migrate
from django.utils.translation import ugettext_lazy as _
class AdminInterfaceConfig(AppConfig):
name = 'admin_interface'
verbose_name = _('Admin Interface')
default_auto_field = 'django.db.models.AutoField'
def ready(self):
+15
View File
@@ -0,0 +1,15 @@
# -*- 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:
FileExtensionValidator = lambda allowed_extensions: None
+39 -1
View File
@@ -1 +1,39 @@
[{"model": "admin_interface.theme", "pk": 1, "fields": {"name": "Django", "active": true, "title": "Django administration", "title_visible": true, "logo": "", "logo_visible": true, "css_header_background_color": "#0C4B33", "css_header_title_color": "#F5DD5D", "css_header_text_color": "#44B78B", "css_header_link_color": "#FFFFFF", "css_header_link_hover_color": "#C9F0DD", "css_module_background_color": "#44B78B", "css_module_text_color": "#FFFFFF", "css_module_link_color": "#FFFFFF", "css_module_link_hover_color": "#C9F0DD", "css_module_rounded_corners": true, "css_generic_link_color": "#0C3C26", "css_generic_link_hover_color": "#156641", "css_save_button_background_color": "#0C4B33", "css_save_button_background_hover_color": "#0C3C26", "css_save_button_text_color": "#FFFFFF", "css_delete_button_background_color": "#BA2121", "css_delete_button_background_hover_color": "#A41515", "css_delete_button_text_color": "#FFFFFF", "css": "", "related_modal_active": true, "related_modal_background_color": "#000000", "related_modal_background_opacity": 0.2, "related_modal_rounded_corners": true, "list_filter_dropdown": false}}]
[
{
"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,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 "پاپ آپ در حال بسته شدن..."
@@ -15,11 +15,21 @@ class Migration(migrations.Migration):
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'),
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'),
field=models.BooleanField(
default=True,
verbose_name='visible'),
),
]
@@ -15,31 +15,55 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='theme',
name='active',
field=models.BooleanField(default=True, verbose_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'),
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'),
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'),
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'),
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'),
field=models.CharField(
blank=True,
default='Django administration',
max_length=50,
verbose_name='title'),
),
]
@@ -17,11 +17,21 @@ class Migration(migrations.Migration):
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'),
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'),
field=colorfield.fields.ColorField(
blank=True,
default='#F5DD5D',
help_text='#F5DD5D',
max_length=10,
verbose_name='color'),
),
]
@@ -15,6 +15,8 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='theme',
name='related_modal_close_button_visible',
field=models.BooleanField(default=True, verbose_name='close button visible'),
field=models.BooleanField(
default=True,
verbose_name='close button visible'),
),
]
@@ -15,6 +15,10 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='theme',
name='name',
field=models.CharField(default='Django', max_length=50, unique=True, verbose_name='name'),
field=models.CharField(
default='Django',
max_length=50,
unique=True,
verbose_name='name'),
),
]
@@ -15,6 +15,8 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='theme',
name='language_chooser_active',
field=models.BooleanField(default=True, verbose_name='active'),
field=models.BooleanField(
default=True,
verbose_name='active'),
),
]
@@ -15,6 +15,13 @@ class Migration(migrations.Migration):
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'),
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'),
),
]
+38 -4
View File
@@ -3,13 +3,12 @@
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
from django.db import models
from django.db.models.signals import post_delete, post_save, pre_save
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from six import python_2_unicode_compatible
@@ -94,6 +93,8 @@ class Theme(models.Model):
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(
@@ -102,6 +103,14 @@ class Theme(models.Model):
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'))
@@ -109,6 +118,8 @@ class Theme(models.Model):
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'))
@@ -173,6 +184,12 @@ class Theme(models.Model):
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',
@@ -185,6 +202,12 @@ class Theme(models.Model):
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',
@@ -284,12 +307,23 @@ class Theme(models.Model):
verbose_name=_('close button visible'))
list_filter_dropdown = models.BooleanField(
default=False,
default=True,
verbose_name=_('use dropdown'))
list_filter_sticky = models.BooleanField(
default=True,
verbose_name=_('sticky position'))
recent_actions_visible = models.BooleanField(
default=True,
verbose_name=_('visible'))
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()
@@ -301,7 +335,7 @@ class Theme(models.Model):
verbose_name_plural = _('Themes')
def __str__(self):
return force_text(self.name)
return force_str(self.name)
post_delete.connect(Theme.post_delete_handler, sender=Theme)
@@ -130,6 +130,10 @@ if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined')
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');
@@ -145,7 +149,10 @@ if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined')
// 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);
}
}
+11 -2
View File
@@ -9,6 +9,7 @@
{% block extrastyle %}
{% get_admin_interface_theme as theme %}
{% get_admin_interface_version as version %}
{% get_current_language as current_lang %}
<style type="text/css">
/*
django-admin-interface {{ version }}
@@ -16,6 +17,7 @@ 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" %}
@@ -26,12 +28,18 @@ https://github.com/fabiocaccamo/django-admin-interface
{% 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 blockbots %}
@@ -40,12 +48,13 @@ https://github.com/fabiocaccamo/django-admin-interface
{% 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" href="{% static 'admin/css/responsive.css' %}?v={{ version }}">
<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 %}{% 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 %}
@@ -1,3 +1,7 @@
.admin-interface {
overflow-x: hidden;
}
/* fix login */
.admin-interface.login #container {
width: 100%;
@@ -19,6 +23,7 @@
}
.admin-interface.login #header {
min-height: auto;
padding: 10px 30px;
line-height: 30px;
align-items: flex-start;
@@ -36,7 +41,6 @@
.admin-interface.login #header #branding h1 img.logo+span {
display: block;
margin-bottom: 5px;
}
.admin-interface.login #login-form {
@@ -67,10 +71,10 @@
}
/* end login fix*/
.admin-interface #header {
height:auto;
min-height:40px;
height: auto;
min-height: 55px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
@@ -78,28 +82,47 @@
@media (max-width:1024px) {
.admin-interface #header {
align-items: flex-start;
align-items: center;
}
}
.admin-interface #branding h1 img.logo {
max-width: 400px;
max-height:100px;
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;
margin-bottom: 5px;
}
.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;
}
@@ -113,11 +136,12 @@
padding: 0 1px;
}
/*
#changelist table tbody tr.selected {
background-color:#FFFFCC;
@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 */
@@ -161,6 +185,12 @@ body.admin-interface .paginator a.showall:visited {
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;
}
@@ -175,7 +205,6 @@ body.admin-interface .paginator a.showall:visited {
.admin-interface form .form-row p.file-upload .clearable-file-input {
display:inline-block;
margin-left:
}
.admin-interface form .form-row p.file-upload .clearable-file-input label {
@@ -203,6 +232,7 @@ body.admin-interface .paginator a.showall:visited {
.admin-interface form .form-row p.file-upload .clearable-file-input {
display: block;
margin-top: 10px;
margin-left: 0;
margin-bottom: -10px;
}
@@ -243,13 +273,18 @@ body.admin-interface .paginator a.showall:visited {
/* LIST FILTER */
.admin-interface .module.filtered h2 {
border-bottom-left-radius:0;
border-bottom-right-radius:0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.admin-interface .module.filtered #changelist-filter {
border-bottom-left-radius:4px;
border-bottom-right-radius:4px;
min-width: 240px;
}
@media (max-width: 1024px) {
.admin-interface .module.filtered #changelist-filter {
min-width: 200px;
}
}
.admin-interface .module.filtered #changelist-filter h2 {
@@ -288,9 +323,23 @@ body.admin-interface .paginator a.showall:visited {
}
/* end fix */
/* begin fix issue #10 - Related widget broken in long tabular inline */
.admin-interface .inline-group .tabular .related-widget-wrapper {
white-space:nowrap;
/* 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 */
@@ -335,17 +384,6 @@ body.admin-interface .paginator a.showall:visited {
background-color:#AAAAAA;
}
/* fix textarea horizontal scroll on Firefox */
@media (max-width: 767px){
.admin-interface .aligned .form-row textarea {
width: 100% !important;
flex: 0 1 auto;
}
.admin-interface .aligned .form-row input[type="file"] {
width: 100% !important;
}
}
/* improve responsive selector */
/* fix [stacked, not-stacked] equalize horizontal and vertical select padding for selector */
@@ -385,12 +423,18 @@ body.admin-interface .paginator a.showall:visited {
-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,
@@ -410,6 +454,7 @@ body.admin-interface .paginator a.showall:visited {
border-top: none;
border-bottom: none;
border-left: none;
/*transition: left .3s, margin-left .3s;*/
}
@media (min-width:1280px) {
@@ -420,46 +465,125 @@ body.admin-interface .paginator a.showall:visited {
left: 0px;
margin-left: 0;
}
.admin-interface.change-list:not(.popup) #main.shifted > .content,
.admin-interface.change-form:not(.popup) #main.shifted > .content {
.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);
}
}
/* fix related-widget when the nav-sidebar is collapsed */
@media (max-width:1100px) {
.admin-interface.change-form #main .related-widget-wrapper {
clear: left;
/* 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;
}
.admin-interface.change-form #main .related-widget-wrapper + .help {
margin-top: 10px;
margin-left: 0;
padding-left: 0;
padding-right: 0;
}
}
/* fix related-widget when the nav-sidebar is expanded */
@media (min-width:1280px) and (max-width:1480px) {
.admin-interface.change-form:not(.popup) .related-widget-wrapper {
clear: left;
margin-top: 5px;
}
.admin-interface.change-form #main.shifted .related-widget-wrapper + .help {
margin-top: 10px;
margin-left: 0;
padding-left: 0;
padding-right: 0;
}
}
.admin-interface #nav-sidebar .current-app .section:link,
.admin-interface #nav-sidebar .current-app .section:visited {
color: #FFFFCC;
font-weight: normal;
}
.admin-interface #nav-sidebar .current-model {
background: #FFFFCC;
}
}
File diff suppressed because one or more lines are too long
@@ -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);
}
}
@@ -23,7 +23,7 @@ https://github.com/jmrivas86/django-json-widget
.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: #FFFFCC;
background-color: {{ theme.css_module_background_selected_color }};
color: #000000;
font-weight: bold;
}
@@ -8,7 +8,7 @@ list-filter-dropdown
}
.admin-interface .list-filter-dropdown select {
background-color:#FFFFFF;
width:90%;
margin-right:5%;
background-color: #FFFFFF;
width: calc(100% - 30px);
margin-right: 15px;
}
@@ -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;
}
@@ -42,7 +42,7 @@ def get_admin_interface_languages(context):
if not request:
return None
full_path = request.get_full_path()
admin_nolang_url = re.sub(r'^\/([\w]{2})([\-\_]{1}[\w]{2})?\/', '/', 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
+1 -1
View File
@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
__version__ = '0.13.3'
__version__ = '0.17.0'
+5 -2
View File
@@ -3,7 +3,7 @@
from setuptools import find_packages, setup
import os
import os, sys
exec(open('admin_interface/version.py').read())
@@ -15,7 +15,8 @@ long_description_file_path = os.path.join(package_path, 'README.md')
long_description_content_type = 'text/markdown'
long_description = ''
try:
with open(long_description_file_path) as f:
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
@@ -54,6 +55,7 @@ setup(
'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',
@@ -66,6 +68,7 @@ setup(
'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',
+12
View File
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import django
import os
@@ -58,6 +60,7 @@ TEMPLATES = [{
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.request',
]
},
},]
@@ -90,6 +93,15 @@ 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/'
+6
View File
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.core.management import call_command
from django.test import TestCase
@@ -17,6 +19,10 @@ class AdminInterfaceFixturesTestCase(TestCase):
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')
+2
View File
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.conf import settings
from django.test import TestCase
+2
View File
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import django
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
+60 -1
View File
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from django.test import TestCase
from __future__ import unicode_literals
from django.test import override_settings, TestCase
from django.test.client import RequestFactory
from django.template import Context, Template
@@ -20,6 +22,63 @@ class AdminInterfaceTemplateTagsTestCase(TestCase):
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({})
+20
View File
@@ -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),
)
+15
View File
@@ -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),
]
+5 -4
View File
@@ -1,11 +1,11 @@
[tox]
envlist =
py27-{dj17,dj18,dj19,dj110,dj111}-{sqlite,postgres},
py34-{dj17,dj18,dj19,dj110,dj111,dj20}-{sqlite,postgres},
py35-{dj18,dj19,dj110,dj111,dj20,dj21,dj22}-{sqlite,postgres},
py36-{dj18,dj19,dj110,dj111,dj20,dj21,dj22,dj30,dj31,djmaster}-{sqlite,postgres},
py37-{dj20,dj21,dj22,dj30,dj31,djmaster}-{sqlite,postgres},
py38-{dj22,dj30,dj31,djmaster}-{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 =
@@ -19,6 +19,7 @@ deps =
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