diff --git a/avatar/conf.py b/avatar/conf.py index 645fa25..fd8122f 100644 --- a/avatar/conf.py +++ b/avatar/conf.py @@ -31,6 +31,9 @@ class AvatarConf(AppConf): FACEBOOK_GET_ID = None CACHE_ENABLED = True RANDOMIZE_HASHES = False + ADD_TEMPLATE = '' + CHANGE_TEMPLATE = '' + DELETE_TEMPLATE = '' def configure_auto_generate_avatar_sizes(self, value): return value or getattr(settings, 'AVATAR_AUTO_GENERATE_SIZES', diff --git a/avatar/views.py b/avatar/views.py index 31efe4f..0e4804b 100644 --- a/avatar/views.py +++ b/avatar/views.py @@ -80,7 +80,8 @@ def add(request, extra_context=None, next_override=None, 'next': next_override or _get_next(request), } context.update(extra_context) - return render(request, 'avatar/add.html', context) + template_name = settings.AVATAR_ADD_TEMPLATE or 'avatar/add.html' + return render(request, template_name, context) @login_required @@ -120,7 +121,8 @@ def change(request, extra_context=None, next_override=None, 'next': next_override or _get_next(request) } context.update(extra_context) - return render(request, 'avatar/change.html', context) + template_name = settings.AVATAR_CHANGE_TEMPLATE or 'avatar/change.html' + return render(request, template_name, context) @login_required @@ -155,8 +157,8 @@ def delete(request, extra_context=None, next_override=None, *args, **kwargs): 'next': next_override or _get_next(request), } context.update(extra_context) - - return render(request, 'avatar/confirm_delete.html', context) + template_name = settings.AVATAR_DELETE_TEMPLATE or 'avatar/confirm_delete.html' + return render(request, template_name, context) def render_primary(request, user=None, size=settings.AVATAR_DEFAULT_SIZE): diff --git a/docs/index.txt b/docs/index.txt index e96cc3a..425fd7b 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -170,6 +170,15 @@ AVATAR_STORAGE_DIR non-filesystem storage device, this will simply be appended to the beginning of the file name. Defaults to ``avatars``. +AVATAR_ADD_TEMPLATE + Path to the Django template to use for adding a new avatar. Defaults to ``avatar/add.html``. + +AVATAR_CHANGE_TEMPLATE + Path to the Django template to use for changing a user's avatar. Defaults to ``avatar/change.html``. + +AVATAR_DELETE_TEMPLATE + Path to the Django template to use for confirming a delete of a user's avatar. Defaults to ``avatar/avatar/confirm_delete.html``. + Management Commands ------------------- diff --git a/tests/settings.py b/tests/settings.py index c85df2d..471b8fe 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,5 +1,9 @@ +import os import django +VERSION = django.VERSION +SETTINGS_DIR = os.path.dirname(__file__) + DATABASE_ENGINE = 'sqlite3' DATABASES = { @@ -25,6 +29,20 @@ MIDDLEWARE_CLASSES = ( "django.contrib.messages.middleware.MessageMiddleware", ) +if VERSION[0] == 1 and VERSION[1] < 8: + TEMPLATE_DIRS = ( + os.path.join(SETTINGS_DIR, 'templates'), + ) +else: + TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, + 'DIRS': [ + os.path.join(SETTINGS_DIR, 'templates') + ] + } + ] ROOT_URLCONF = 'tests.urls' diff --git a/tests/templates/alt/add.html b/tests/templates/alt/add.html new file mode 100644 index 0000000..37d4839 --- /dev/null +++ b/tests/templates/alt/add.html @@ -0,0 +1 @@ +ALTERNATE ADD TEMPLATE diff --git a/tests/templates/alt/change.html b/tests/templates/alt/change.html new file mode 100644 index 0000000..bb8650f --- /dev/null +++ b/tests/templates/alt/change.html @@ -0,0 +1 @@ +ALTERNATE CHANGE TEMPLATE diff --git a/tests/templates/alt/delete.html b/tests/templates/alt/delete.html new file mode 100644 index 0000000..10bfe9d --- /dev/null +++ b/tests/templates/alt/delete.html @@ -0,0 +1 @@ +ALTERNATE DELETE TEMPLATE diff --git a/tests/tests.py b/tests/tests.py index 9c3874c..e8c82f1 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -210,6 +210,39 @@ class AvatarTests(TestCase): self.assertIn('', result) + def test_default_add_template(self): + response = self.client.get('/avatar/add/') + self.assertContains(response, 'Upload New Image') + self.assertNotContains(response, 'ALTERNATE ADD TEMPLATE') + + @override_settings(AVATAR_ADD_TEMPLATE='alt/add.html') + def test_custom_add_template(self): + response = self.client.get('/avatar/add/') + self.assertNotContains(response, 'Upload New Image') + self.assertContains(response, 'ALTERNATE ADD TEMPLATE') + + def test_default_change_template(self): + response = self.client.get('/avatar/change/') + self.assertContains(response, 'Upload New Image') + self.assertNotContains(response, 'ALTERNATE CHANGE TEMPLATE') + + @override_settings(AVATAR_CHANGE_TEMPLATE='alt/change.html') + def test_custom_change_template(self): + response = self.client.get('/avatar/change/') + self.assertNotContains(response, 'Upload New Image') + self.assertContains(response, 'ALTERNATE CHANGE TEMPLATE') + + def test_default_delete_template(self): + response = self.client.get('/avatar/delete/') + self.assertContains(response, 'like to delete.') + self.assertNotContains(response, 'ALTERNATE DELETE TEMPLATE') + + @override_settings(AVATAR_DELETE_TEMPLATE='alt/delete.html') + def test_custom_delete_template(self): + response = self.client.get('/avatar/delete/') + self.assertNotContains(response, 'like to delete.') + self.assertContains(response, 'ALTERNATE DELETE TEMPLATE') + # def testAvatarOrder # def testReplaceAvatarWhenMaxIsOne # def testHashFileName