Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 68a9974df8 | |||
| efb38d5825 | |||
| a48d2175ba | |||
| 8bffc8f82a | |||
| 1870635697 | |||
| 4e0c4a00e2 | |||
| 4b055f7ffa |
+65
-35
@@ -1,62 +1,92 @@
|
|||||||
language: python
|
language: python
|
||||||
python: 3.5
|
python: 3.5
|
||||||
env:
|
env:
|
||||||
- TOX_ENV=py27-dj17
|
- TOX_ENV=py27-dj17-sqlite
|
||||||
- TOX_ENV=py27-dj18
|
- TOX_ENV=py27-dj17-postgres
|
||||||
- TOX_ENV=py27-dj19
|
- TOX_ENV=py27-dj18-sqlite
|
||||||
- TOX_ENV=py27-dj110
|
- TOX_ENV=py27-dj18-postgres
|
||||||
- TOX_ENV=py27-dj111
|
- TOX_ENV=py27-dj19-sqlite
|
||||||
- TOX_ENV=py34-dj17
|
- TOX_ENV=py27-dj19-postgres
|
||||||
- TOX_ENV=py34-dj18
|
- TOX_ENV=py27-dj110-sqlite
|
||||||
- TOX_ENV=py34-dj19
|
- TOX_ENV=py27-dj110-postgres
|
||||||
- TOX_ENV=py34-dj110
|
- TOX_ENV=py27-dj111-sqlite
|
||||||
- TOX_ENV=py34-dj111
|
- TOX_ENV=py27-dj111-postgres
|
||||||
- TOX_ENV=py34-dj20
|
- TOX_ENV=py34-dj17-sqlite
|
||||||
- TOX_ENV=py35-dj18
|
- TOX_ENV=py34-dj17-postgres
|
||||||
- TOX_ENV=py35-dj19
|
- TOX_ENV=py34-dj18-sqlite
|
||||||
- TOX_ENV=py35-dj110
|
- TOX_ENV=py34-dj18-postgres
|
||||||
- TOX_ENV=py35-dj111
|
- TOX_ENV=py34-dj19-sqlite
|
||||||
- TOX_ENV=py35-dj20
|
- TOX_ENV=py34-dj19-postgres
|
||||||
- TOX_ENV=py35-dj21
|
- TOX_ENV=py34-dj110-sqlite
|
||||||
- TOX_ENV=py35-djmaster
|
- TOX_ENV=py34-dj110-postgres
|
||||||
# - TOX_ENV=py36-dj111
|
- TOX_ENV=py34-dj111-sqlite
|
||||||
# - TOX_ENV=py36-dj20
|
- TOX_ENV=py34-dj111-postgres
|
||||||
# - TOX_ENV=py36-dj21
|
- TOX_ENV=py34-dj20-sqlite
|
||||||
# - TOX_ENV=py36-djmaster
|
- TOX_ENV=py34-dj20-postgres
|
||||||
# - TOX_ENV=py37-dj20
|
- TOX_ENV=py35-dj18-sqlite
|
||||||
# - TOX_ENV=py37-dj21
|
- TOX_ENV=py35-dj18-postgres
|
||||||
# - TOX_ENV=py37-djmaster
|
- TOX_ENV=py35-dj19-sqlite
|
||||||
|
- TOX_ENV=py35-dj19-postgres
|
||||||
|
- TOX_ENV=py35-dj110-sqlite
|
||||||
|
- TOX_ENV=py35-dj110-postgres
|
||||||
|
- TOX_ENV=py35-dj111-sqlite
|
||||||
|
- TOX_ENV=py35-dj111-postgres
|
||||||
|
- TOX_ENV=py35-dj20-sqlite
|
||||||
|
- TOX_ENV=py35-dj20-postgres
|
||||||
|
- TOX_ENV=py35-dj21-sqlite
|
||||||
|
- TOX_ENV=py35-dj21-postgres
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- python: "3.6"
|
- python: "3.6"
|
||||||
env: TOX_ENV=py36-dj111
|
env:
|
||||||
|
- TOX_ENV=py36-dj111-sqlite
|
||||||
|
- TOX_ENV=py36-dj111-postgres
|
||||||
- python: "3.6"
|
- python: "3.6"
|
||||||
env: TOX_ENV=py36-dj20
|
env:
|
||||||
|
- TOX_ENV=py36-dj20-sqlite
|
||||||
|
- TOX_ENV=py36-dj20-postgres
|
||||||
- python: "3.6"
|
- python: "3.6"
|
||||||
env: TOX_ENV=py36-dj21
|
env:
|
||||||
|
- TOX_ENV=py36-dj21-sqlite
|
||||||
|
- TOX_ENV=py36-dj21-postgres
|
||||||
- python: "3.6"
|
- python: "3.6"
|
||||||
env: TOX_ENV=py36-djmaster
|
env:
|
||||||
|
- TOX_ENV=py36-djmaster-sqlite
|
||||||
|
- TOX_ENV=py36-djmaster-postgres
|
||||||
- python: "3.7"
|
- python: "3.7"
|
||||||
env: TOX_ENV=py37-dj20
|
env:
|
||||||
|
- TOX_ENV=py37-dj20-sqlite
|
||||||
|
- TOX_ENV=py37-dj20-postgres
|
||||||
dist: xenial
|
dist: xenial
|
||||||
language: python
|
language: python
|
||||||
sudo: required
|
sudo: required
|
||||||
- python: "3.7"
|
- python: "3.7"
|
||||||
env: TOX_ENV=py37-dj21
|
env:
|
||||||
|
- TOX_ENV=py37-dj21-sqlite
|
||||||
|
- TOX_ENV=py37-dj21-postgres
|
||||||
dist: xenial
|
dist: xenial
|
||||||
language: python
|
language: python
|
||||||
sudo: required
|
sudo: required
|
||||||
- python: "3.7"
|
- python: "3.7"
|
||||||
env: TOX_ENV=py37-djmaster
|
env:
|
||||||
|
- TOX_ENV=py37-djmaster-sqlite
|
||||||
|
- TOX_ENV=py37-djmaster-postgres
|
||||||
dist: xenial
|
dist: xenial
|
||||||
language: python
|
language: python
|
||||||
sudo: required
|
sudo: required
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- env: TOX_ENV=py35-djmaster
|
- env:
|
||||||
- env: TOX_ENV=py36-djmaster
|
- TOX_ENV=py36-djmaster-sqlite
|
||||||
- env: TOX_ENV=py37-djmaster
|
- TOX_ENV=py36-djmaster-postgres
|
||||||
|
- env:
|
||||||
|
- TOX_ENV=py37-djmaster-sqlite
|
||||||
|
- TOX_ENV=py37-djmaster-postgres
|
||||||
install:
|
install:
|
||||||
- pip install tox
|
- pip install tox
|
||||||
|
services:
|
||||||
|
- postgresql
|
||||||
|
before_script:
|
||||||
|
- psql -c 'create database admin_interface;' -U postgres
|
||||||
script:
|
script:
|
||||||
- tox -e $TOX_ENV
|
- tox -e $TOX_ENV
|
||||||
sudo: false
|
sudo: false
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11 on 2018-01-31 11:00
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# -*- 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -28,16 +28,17 @@ class Theme(models.Model):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_active_theme():
|
def get_active_theme():
|
||||||
objs_active_qs = Theme.objects.filter(active=True)
|
objs_manager = Theme.objects
|
||||||
|
objs_active_qs = objs_manager.filter(active=True)
|
||||||
objs_active_ls = list(objs_active_qs)
|
objs_active_ls = list(objs_active_qs)
|
||||||
objs_active_count = len(objs_active_ls)
|
objs_active_count = len(objs_active_ls)
|
||||||
|
|
||||||
if objs_active_count == 0:
|
if objs_active_count == 0:
|
||||||
default_obj, default_obj_created = Theme.objects.get_or_create(
|
obj = objs_manager.all().first()
|
||||||
pk='1', defaults={'active': True})
|
if obj:
|
||||||
if not default_obj_created:
|
obj.set_active()
|
||||||
default_obj.set_active()
|
else:
|
||||||
obj = default_obj
|
obj = objs_manager.create()
|
||||||
|
|
||||||
elif objs_active_count == 1:
|
elif objs_active_count == 1:
|
||||||
obj = objs_active_ls[0]
|
obj = objs_active_ls[0]
|
||||||
|
|||||||
@@ -1,24 +1,18 @@
|
|||||||
if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined')
|
if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') {
|
||||||
{
|
|
||||||
(function($) {
|
(function($) {
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
$('.cancel-link').click(function(e) {
|
$('.cancel-link').click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var parentWindow = window.parent;
|
var parentWindow = window.parent;
|
||||||
if (parentWindow && typeof(parentWindow.dismissRelatedObjectModal) === 'function') {
|
if (parentWindow && typeof(parentWindow.dismissRelatedObjectModal) === 'function' && parentWindow !== window) {
|
||||||
parentWindow.dismissRelatedObjectModal();
|
parentWindow.dismissRelatedObjectModal();
|
||||||
} else {
|
} else {
|
||||||
// fallback to default behavior
|
// fallback to default behavior
|
||||||
history.back();
|
window.history.back();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
})(django.jQuery);
|
})(django.jQuery);
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
__version__ = '0.9.0'
|
__version__ = '0.9.2'
|
||||||
|
|||||||
+24
-3
@@ -62,13 +62,34 @@ TEMPLATES = [{
|
|||||||
},
|
},
|
||||||
},]
|
},]
|
||||||
|
|
||||||
DATABASES = {
|
database_engine = os.environ.get('DATABASE_ENGINE', 'sqlite')
|
||||||
'default': {
|
database_config = {
|
||||||
|
'sqlite': {
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
'NAME': os.path.join(BASE_DIR, 'db.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),
|
||||||
|
}
|
||||||
|
|
||||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'admin_interface/public/media/')
|
MEDIA_ROOT = os.path.join(BASE_DIR, 'admin_interface/public/media/')
|
||||||
MEDIA_URL = '/media/'
|
MEDIA_URL = '/media/'
|
||||||
|
|
||||||
|
|||||||
+24
-24
@@ -28,10 +28,10 @@ class AdminInterfaceTestCase(TestCase):
|
|||||||
|
|
||||||
def __test_active_theme(self):
|
def __test_active_theme(self):
|
||||||
theme = Theme.get_active_theme()
|
theme = Theme.get_active_theme()
|
||||||
print( theme )
|
print(theme)
|
||||||
self.assertTrue(theme != None)
|
self.assertTrue(theme != None)
|
||||||
self.assertTrue(theme.active)
|
self.assertTrue(theme.active)
|
||||||
self.assertEqual(Theme.objects.filter( active = True ).count(), 1);
|
self.assertEqual(Theme.objects.filter(active=True).count(), 1);
|
||||||
|
|
||||||
def test_default_theme_created_if_no_themes(self):
|
def test_default_theme_created_if_no_themes(self):
|
||||||
Theme.objects.all().delete()
|
Theme.objects.all().delete()
|
||||||
@@ -50,47 +50,47 @@ class AdminInterfaceTestCase(TestCase):
|
|||||||
|
|
||||||
def test_default_theme_activated_after_update_if_no_active_themes(self):
|
def test_default_theme_activated_after_update_if_no_active_themes(self):
|
||||||
Theme.objects.all().delete()
|
Theme.objects.all().delete()
|
||||||
Theme.objects.all().update( active = False )
|
Theme.objects.all().update(active=False)
|
||||||
self.__test_active_theme()
|
self.__test_active_theme()
|
||||||
|
|
||||||
def test_default_theme_activated_after_update_if_multiple_active_themes(self):
|
def test_default_theme_activated_after_update_if_multiple_active_themes(self):
|
||||||
Theme.objects.all().delete()
|
Theme.objects.all().delete()
|
||||||
theme_1 = Theme.objects.create( name = 'Custom 1', active = True )
|
theme_1 = Theme.objects.create(name='Custom 1', active=True)
|
||||||
theme_2 = Theme.objects.create( name = 'Custom 2', active = True )
|
theme_2 = Theme.objects.create(name='Custom 2', active=True)
|
||||||
theme_3 = Theme.objects.create( name = 'Custom 3', active = True )
|
theme_3 = Theme.objects.create(name='Custom 3', active=True)
|
||||||
Theme.objects.update( active = False )
|
Theme.objects.update(active=False)
|
||||||
Theme.objects.update( active = True )
|
Theme.objects.update(active=True)
|
||||||
self.__test_active_theme()
|
self.__test_active_theme()
|
||||||
|
|
||||||
def test_default_theme_activated_on_active_theme_deleted(self):
|
def test_default_theme_activated_on_active_theme_deleted(self):
|
||||||
Theme.objects.all().delete()
|
Theme.objects.all().delete()
|
||||||
theme_1 = Theme.objects.create( name = 'Custom 1', active = True )
|
theme_1 = Theme.objects.create(name='Custom 1', active=True)
|
||||||
theme_2 = Theme.objects.create( name = 'Custom 2', active = True )
|
theme_2 = Theme.objects.create(name='Custom 2', active=True)
|
||||||
theme_3 = Theme.objects.create( name = 'Custom 3', active = True )
|
theme_3 = Theme.objects.create(name='Custom 3', active=True)
|
||||||
Theme.objects.filter( pk = Theme.get_active_theme().pk ).delete()
|
Theme.objects.filter(pk=Theme.get_active_theme().pk).delete()
|
||||||
self.__test_active_theme()
|
self.__test_active_theme()
|
||||||
|
|
||||||
def test_last_theme_activated_on_multiple_themes_created(self):
|
def test_last_theme_activated_on_multiple_themes_created(self):
|
||||||
Theme.objects.all().delete()
|
Theme.objects.all().delete()
|
||||||
theme_1 = Theme.objects.create( name = 'Custom 1', active = True )
|
theme_1 = Theme.objects.create(name='Custom 1', active=True)
|
||||||
theme_2 = Theme.objects.create( name = 'Custom 2', active = True )
|
theme_2 = Theme.objects.create(name='Custom 2', active=True)
|
||||||
theme_3 = Theme.objects.create( name = 'Custom 3', active = True )
|
theme_3 = Theme.objects.create(name='Custom 3', active=True)
|
||||||
self.assertEqual( Theme.get_active_theme().pk, theme_3.pk )
|
self.assertEqual(Theme.get_active_theme().pk, theme_3.pk)
|
||||||
self.__test_active_theme()
|
self.__test_active_theme()
|
||||||
|
|
||||||
def test_last_theme_activated_on_multiple_themes_activated(self):
|
def test_last_theme_activated_on_multiple_themes_activated(self):
|
||||||
Theme.objects.all().delete()
|
Theme.objects.all().delete()
|
||||||
theme_1 = Theme.objects.create( name = 'Custom 1', active = True )
|
theme_1 = Theme.objects.create(name='Custom 1', active=True)
|
||||||
theme_2 = Theme.objects.create( name = 'Custom 2', active = True )
|
theme_2 = Theme.objects.create(name='Custom 2', active=True)
|
||||||
theme_3 = Theme.objects.create( name = 'Custom 3', active = True )
|
theme_3 = Theme.objects.create(name='Custom 3', active=True)
|
||||||
theme_4 = Theme.objects.create( name = 'Custom 4', active = True )
|
theme_4 = Theme.objects.create(name='Custom 4', active=True)
|
||||||
theme_5 = Theme.objects.create( name = 'Custom 5', active = True )
|
theme_5 = Theme.objects.create(name='Custom 5', active=True)
|
||||||
themes = [ theme_1, theme_2, theme_3, theme_4, theme_5 ]
|
themes = [theme_1, theme_2, theme_3, theme_4, theme_5]
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
random.shuffle(themes)
|
random.shuffle(themes)
|
||||||
for theme in themes:
|
for theme in themes:
|
||||||
theme.set_active()
|
theme.set_active()
|
||||||
self.assertEqual( Theme.get_active_theme().pk, theme.pk )
|
self.assertEqual(Theme.get_active_theme().pk, theme.pk)
|
||||||
self.__test_active_theme()
|
self.__test_active_theme()
|
||||||
|
|
||||||
def test_templatetags_get_theme(self):
|
def test_templatetags_get_theme(self):
|
||||||
@@ -128,5 +128,5 @@ class AdminInterfaceTestCase(TestCase):
|
|||||||
|
|
||||||
def test_repr(self):
|
def test_repr(self):
|
||||||
theme = Theme.get_active_theme()
|
theme = Theme.get_active_theme()
|
||||||
self.assertEqual( '{0}'.format(theme), 'Django' )
|
self.assertEqual('{0}'.format(theme), 'Django')
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
[tox]
|
[tox]
|
||||||
envlist =
|
envlist =
|
||||||
py27-{dj17,dj18,dj19,dj110,dj111},
|
py27-{dj17,dj18,dj19,dj110,dj111}-{sqlite,postgres},
|
||||||
py34-{dj17,dj18,dj19,dj110,dj111,dj20},
|
py34-{dj17,dj18,dj19,dj110,dj111,dj20}-{sqlite,postgres},
|
||||||
py35-{dj18,dj19,dj110,dj111,dj20,dj21,djmaster},
|
py35-{dj18,dj19,dj110,dj111,dj20,dj21}-{sqlite,postgres},
|
||||||
py36-{dj18,dj19,dj110,dj111,dj20,dj21,djmaster},
|
py36-{dj18,dj19,dj110,dj111,dj20,dj21,djmaster}-{sqlite,postgres},
|
||||||
py37-{dj20,dj21,djmaster},
|
py37-{dj20,dj21,djmaster}-{sqlite,postgres},
|
||||||
[testenv]
|
[testenv]
|
||||||
passenv = CI TRAVIS TRAVIS_*
|
passenv = CI TRAVIS TRAVIS_*
|
||||||
deps =
|
deps =
|
||||||
@@ -16,8 +16,14 @@ deps =
|
|||||||
dj20: Django >= 2.0, < 2.1
|
dj20: Django >= 2.0, < 2.1
|
||||||
dj21: Django >= 2.1, < 2.2
|
dj21: Django >= 2.1, < 2.2
|
||||||
djmaster: https://github.com/django/django/archive/master.tar.gz
|
djmaster: https://github.com/django/django/archive/master.tar.gz
|
||||||
|
# mysql: mysqlclient
|
||||||
|
postgres: psycopg2-binary
|
||||||
coverage
|
coverage
|
||||||
codecov
|
codecov
|
||||||
|
setenv =
|
||||||
|
sqlite: DATABASE_ENGINE=sqlite
|
||||||
|
# mysql: DATABASE_ENGINE=mysql
|
||||||
|
postgres: DATABASE_ENGINE=postgres
|
||||||
commands =
|
commands =
|
||||||
coverage run --append --source=admin_interface setup.py test
|
coverage run --append --source=admin_interface setup.py test
|
||||||
coverage report -m
|
coverage report -m
|
||||||
|
|||||||
Reference in New Issue
Block a user