Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e2239dcb99 | |||
| c769a449f2 | |||
| 3cff729a8a | |||
| c44db23b31 | |||
| 485f5400db | |||
| a2329fdae5 | |||
| a388ec234c | |||
| a3b3f8922d | |||
| 6b6eed3aa0 | |||
| fd48e5ca97 | |||
| fbc29246ff | |||
| 1569828c67 | |||
| bb73fafeff | |||
| f76a41ff14 | |||
| 4351751193 | |||
| 044ad518e0 | |||
| 5b976adb1d | |||
| 74732ec9a9 |
@@ -4,6 +4,27 @@ 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
|
||||
|
||||
@@ -51,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``
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from admin_interface.compat import gettext_lazy as _
|
||||
from admin_interface.models import Theme
|
||||
|
||||
import django
|
||||
from django.contrib import admin
|
||||
if django.VERSION < (2, 0):
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
else:
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
|
||||
class ThemeAdmin(admin.ModelAdmin):
|
||||
@@ -42,6 +38,8 @@ class ThemeAdmin(admin.ModelAdmin):
|
||||
'classes': ('wide', ),
|
||||
'fields': (
|
||||
'logo',
|
||||
'logo_max_width',
|
||||
'logo_max_height',
|
||||
'logo_color',
|
||||
'logo_visible',
|
||||
)
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import django
|
||||
from admin_interface.compat import gettext_lazy as _
|
||||
|
||||
from django.apps import AppConfig
|
||||
from django.db.models.signals import post_migrate
|
||||
if django.VERSION < (2, 0):
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
else:
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
|
||||
class AdminInterfaceConfig(AppConfig):
|
||||
|
||||
@@ -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
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -15,6 +15,8 @@ class Migration(migrations.Migration):
|
||||
migrations.AlterField(
|
||||
model_name='theme',
|
||||
name='list_filter_dropdown',
|
||||
field=models.BooleanField(default=True, verbose_name='use dropdown'),
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='use dropdown'),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -15,6 +15,8 @@ class Migration(migrations.Migration):
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='list_filter_sticky',
|
||||
field=models.BooleanField(default=True, verbose_name='sticky position'),
|
||||
field=models.BooleanField(
|
||||
default=True,
|
||||
verbose_name='sticky position'),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
# Generated by Django 3.1.5 on 2021-01-29 20:29
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
@@ -13,11 +15,15 @@ class Migration(migrations.Migration):
|
||||
migrations.AddField(
|
||||
model_name='theme',
|
||||
name='form_pagination_sticky',
|
||||
field=models.BooleanField(default=False, verbose_name='sticky pagination'),
|
||||
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'),
|
||||
field=models.BooleanField(
|
||||
default=False,
|
||||
verbose_name='sticky submit'),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,10 +1,19 @@
|
||||
import colorfield.fields
|
||||
# -*- 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")
|
||||
Theme.objects.update(css_module_link_selected_color=F('css_module_link_color'))
|
||||
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):
|
||||
|
||||
@@ -16,12 +25,22 @@ class Migration(migrations.Migration):
|
||||
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'),
|
||||
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'),
|
||||
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'),
|
||||
),
|
||||
]
|
||||
@@ -3,23 +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
|
||||
|
||||
import django
|
||||
if django.VERSION >= (1, 11):
|
||||
from django.core.validators import FileExtensionValidator
|
||||
else:
|
||||
FileExtensionValidator = lambda allowed_extensions: None
|
||||
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_delete, post_save, pre_save
|
||||
if django.VERSION < (2, 0):
|
||||
from django.utils.encoding import force_text as force_str
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
else:
|
||||
from django.utils.encoding import force_str
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from six import python_2_unicode_compatible
|
||||
|
||||
@@ -114,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'))
|
||||
|
||||
@@ -23,6 +23,5 @@ def check_installed_app(app, app_dj_version_limit):
|
||||
|
||||
|
||||
def check_installed_apps():
|
||||
check_installed_app('colorfield', (4, 0))
|
||||
check_installed_app('flat', (1, 9))
|
||||
check_installed_app('flat_responsive', (2, 0))
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
}
|
||||
|
||||
.admin-interface.login #header {
|
||||
min-height: auto;
|
||||
padding: 10px 30px;
|
||||
line-height: 30px;
|
||||
align-items: flex-start;
|
||||
@@ -40,7 +41,6 @@
|
||||
|
||||
.admin-interface.login #header #branding h1 img.logo+span {
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.admin-interface.login #login-form {
|
||||
@@ -77,18 +77,16 @@
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: start;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
@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;
|
||||
@@ -103,13 +101,28 @@
|
||||
|
||||
.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;
|
||||
}
|
||||
@@ -313,6 +326,7 @@ body.admin-interface .paginator a.showall:visited {
|
||||
/* 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;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -42,7 +42,7 @@
|
||||
|
||||
@media (min-width:1280px) {
|
||||
.admin-interface.sticky-pagination.change-list:not(.popup) #main.shifted > #nav-sidebar + .content .paginator {
|
||||
width: calc(100% - 359px);
|
||||
width: calc(100% - 360px);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
text-overflow: ellipsis;
|
||||
border-radius: 0;
|
||||
border-top: 1px solid #EEEEEE;
|
||||
border-bottom: none;
|
||||
border-bottom: none !important;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% load static %}
|
||||
|
||||
{% if theme.favicon %}
|
||||
<link rel="icon" href="{{ theme.favicon.url }}?v={{ version }}">
|
||||
<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">
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
__version__ = '0.16.2'
|
||||
__version__ = '0.17.2'
|
||||
|
||||
Reference in New Issue
Block a user