From 1aec098d6d47b5e885a33011df85e5acdac59031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dzikie=20dro=C5=BCd=C5=BCe?= Date: Tue, 7 Jan 2014 01:05:20 +0100 Subject: [PATCH] Does anyone read this? I'll be at the coffee shop accross the street. --- src/papiez_ipsum/settings.py | 3 + src/papiezator/papiezator_settings.py | 6 ++ src/papiezator/pope_utils.py | 67 +++++++++++++----- .../static/admin/css/base.css | 0 .../static/admin/css/changelists.css | 0 .../static/admin/css/dashboard.css | 0 .../static/admin/css/forms.css | 0 .../static/admin/css/ie.css | 0 .../static/admin/css/login.css | 0 .../static/admin/css/rtl.css | 0 .../static/admin/css/widgets.css | 0 .../static/admin/img/changelist-bg.gif | Bin .../static/admin/img/changelist-bg_rtl.gif | Bin .../static/admin/img/chooser-bg.gif | Bin .../static/admin/img/chooser_stacked-bg.gif | Bin .../static/admin/img/default-bg-reverse.gif | Bin .../static/admin/img/default-bg.gif | Bin .../static/admin/img/deleted-overlay.gif | Bin .../static/admin/img/gis/move_vertex_off.png | Bin .../static/admin/img/gis/move_vertex_on.png | Bin .../static/admin/img/icon-no.gif | Bin .../static/admin/img/icon-unknown.gif | Bin .../static/admin/img/icon-yes.gif | Bin .../static/admin/img/icon_addlink.gif | Bin .../static/admin/img/icon_alert.gif | Bin .../static/admin/img/icon_calendar.gif | Bin .../static/admin/img/icon_changelink.gif | Bin .../static/admin/img/icon_clock.gif | Bin .../static/admin/img/icon_deletelink.gif | Bin .../static/admin/img/icon_error.gif | Bin .../static/admin/img/icon_searchbox.png | Bin .../static/admin/img/icon_success.gif | Bin .../static/admin/img/inline-delete-8bit.png | Bin .../static/admin/img/inline-delete.png | Bin .../static/admin/img/inline-restore-8bit.png | Bin .../static/admin/img/inline-restore.png | Bin .../static/admin/img/inline-splitter-bg.gif | Bin .../static/admin/img/nav-bg-grabber.gif | Bin .../static/admin/img/nav-bg-reverse.gif | Bin .../static/admin/img/nav-bg-selected.gif | Bin .../static/admin/img/nav-bg.gif | Bin .../static/admin/img/selector-icons.gif | Bin .../static/admin/img/selector-search.gif | Bin .../static/admin/img/sorting-icons.gif | Bin .../static/admin/img/tool-left.gif | Bin .../static/admin/img/tool-left_over.gif | Bin .../static/admin/img/tool-right.gif | Bin .../static/admin/img/tool-right_over.gif | Bin .../static/admin/img/tooltag-add.gif | Bin .../static/admin/img/tooltag-add_over.gif | Bin .../static/admin/img/tooltag-arrowright.gif | Bin .../admin/img/tooltag-arrowright_over.gif | Bin .../static/admin/js/LICENSE-JQUERY.txt | 0 .../static/admin/js/SelectBox.js | 0 .../static/admin/js/SelectFilter2.js | 0 .../static/admin/js/actions.js | 0 .../static/admin/js/actions.min.js | 0 .../admin/js/admin/DateTimeShortcuts.js | 0 .../admin/js/admin/RelatedObjectLookups.js | 0 .../static/admin/js/calendar.js | 0 .../static/admin/js/collapse.js | 0 .../static/admin/js/collapse.min.js | 0 .../static/admin/js/core.js | 0 .../static/admin/js/inlines.js | 0 .../static/admin/js/inlines.min.js | 0 .../static/admin/js/jquery.init.js | 0 .../static/admin/js/jquery.js | 0 .../static/admin/js/jquery.min.js | 0 .../static/admin/js/prepopulate.js | 0 .../static/admin/js/prepopulate.min.js | 0 .../static/admin/js/timeparse.js | 0 .../static/admin/js/urlify.js | 0 .../static/css/bootstrap-responsive.css | 0 .../static/css/bootstrap-responsive.min.css | 0 .../static/css/bootstrap.css | 0 .../static/css/bootstrap.min.css | 0 src/papiezator/static/foo | 0 src/papiezator/static/img/forkme.png | Bin 0 -> 18136 bytes .../static/img/glyphicons-halflings-white.png | Bin .../static/img/glyphicons-halflings.png | Bin .../static/js/bootstrap.js | 0 .../static/js/bootstrap.min.js | 0 .../static/js/jquery.js | 0 .../templates/papiezator/index.html | 3 + 84 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 src/papiezator/papiezator_settings.py rename src/{papiez_ipsum => papiezator}/static/admin/css/base.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/changelists.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/dashboard.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/forms.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/ie.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/login.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/rtl.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/css/widgets.css (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/changelist-bg.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/changelist-bg_rtl.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/chooser-bg.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/chooser_stacked-bg.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/default-bg-reverse.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/default-bg.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/deleted-overlay.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/gis/move_vertex_off.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/gis/move_vertex_on.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon-no.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon-unknown.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon-yes.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_addlink.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_alert.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_calendar.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_changelink.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_clock.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_deletelink.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_error.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_searchbox.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/icon_success.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/inline-delete-8bit.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/inline-delete.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/inline-restore-8bit.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/inline-restore.png (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/inline-splitter-bg.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/nav-bg-grabber.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/nav-bg-reverse.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/nav-bg-selected.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/nav-bg.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/selector-icons.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/selector-search.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/sorting-icons.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tool-left.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tool-left_over.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tool-right.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tool-right_over.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tooltag-add.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tooltag-add_over.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tooltag-arrowright.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/img/tooltag-arrowright_over.gif (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/LICENSE-JQUERY.txt (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/SelectBox.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/SelectFilter2.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/actions.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/actions.min.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/admin/DateTimeShortcuts.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/admin/RelatedObjectLookups.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/calendar.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/collapse.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/collapse.min.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/core.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/inlines.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/inlines.min.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/jquery.init.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/jquery.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/jquery.min.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/prepopulate.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/prepopulate.min.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/timeparse.js (100%) rename src/{papiez_ipsum => papiezator}/static/admin/js/urlify.js (100%) rename src/{papiez_ipsum => papiezator}/static/css/bootstrap-responsive.css (100%) rename src/{papiez_ipsum => papiezator}/static/css/bootstrap-responsive.min.css (100%) rename src/{papiez_ipsum => papiezator}/static/css/bootstrap.css (100%) rename src/{papiez_ipsum => papiezator}/static/css/bootstrap.min.css (100%) create mode 100644 src/papiezator/static/foo create mode 100644 src/papiezator/static/img/forkme.png rename src/{papiez_ipsum => papiezator}/static/img/glyphicons-halflings-white.png (100%) rename src/{papiez_ipsum => papiezator}/static/img/glyphicons-halflings.png (100%) rename src/{papiez_ipsum => papiezator}/static/js/bootstrap.js (100%) rename src/{papiez_ipsum => papiezator}/static/js/bootstrap.min.js (100%) rename src/{papiez_ipsum => papiezator}/static/js/jquery.js (100%) diff --git a/src/papiez_ipsum/settings.py b/src/papiez_ipsum/settings.py index 4326e56..24e8bd6 100644 --- a/src/papiez_ipsum/settings.py +++ b/src/papiez_ipsum/settings.py @@ -164,3 +164,6 @@ try: from papiez_ipsum.settings_local import * except ImportError: pass + + +PAPIEZATOR_REDIS_TTL = 60*60*12 diff --git a/src/papiezator/papiezator_settings.py b/src/papiezator/papiezator_settings.py new file mode 100644 index 0000000..7c9f039 --- /dev/null +++ b/src/papiezator/papiezator_settings.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from django.conf import settings + +REDIS_TTL = getattr(settings, "PAPIEZATOR_REDIS_TTL", 60*60*12) diff --git a/src/papiezator/pope_utils.py b/src/papiezator/pope_utils.py index 9e72699..95f322a 100644 --- a/src/papiezator/pope_utils.py +++ b/src/papiezator/pope_utils.py @@ -1,7 +1,14 @@ -from papiezator.models import Pope, PopeImage, PerfectPope, DECIMAL_PLACES +from papiezator.models import PopeImage, PerfectPope, DECIMAL_PLACES from PIL import Image -from io import BytesIO # FIXME: +from io import BytesIO from django.core.exceptions import ObjectDoesNotExist +from papiezator.papiezator_settings import REDIS_TTL +try: + from redis import Redis + from redis.exceptions import ConnectionError as RedisConnectionError + redis = Redis() +except ImportError: + redis = None def select_best_pope(aspect_ratio, pope): """ (float, pope) -> PopeImage @@ -10,54 +17,76 @@ def select_best_pope(aspect_ratio, pope): pp = PerfectPope.objects.filter(aspect_ratio=aspect_ratio, pope=pope) if pp: return pp[0].image + # popes below and above this ratio lte = PopeImage.objects.filter(aspect_ratio__lte=aspect_ratio, pope=pope).order_by('-aspect_ratio')[0:1] gte = PopeImage.objects.filter(aspect_ratio__gte=aspect_ratio, pope=pope).order_by('aspect_ratio')[0:1] if gte and lte: - r_lte = abs(aspect_ratio - lte[0].aspect_ratio) # FIXME: - r_gte = abs(aspect_ratio - gte[0].aspect_ratio) + lte, gte = lte[0], gte[0] - if r_lte >= r_gte: - return_pope = habemus_papam(aspect_ratio, gte[0], pope) + lte_distance = abs(aspect_ratio - lte.aspect_ratio) + gte_distance = abs(aspect_ratio - gte.aspect_ratio) + + if lte_distance >= gte_distance: + return_image_path = gte else: - return_pope = habemus_papam(aspect_ratio, lte[0], pope) + return_image_path = lte + # if there are no popes above or below this ratio elif gte: - return_pope = gte[0] + return_image_path = gte[0] elif lte: - return_pope = lte[0] + return_image_path = lte[0] + # or even if there are no popes at all :c else: return None - return return_pope + return habemus_papam(aspect_ratio, image_path=return_image_path, pope=pope) -def habemus_papam(aspect_ratio, image, pope): - pp = PerfectPope(aspect_ratio=aspect_ratio, image=image, pope=pope) - pp.save() # FIXME: - return image +def habemus_papam(aspect_ratio, image_path, pope): + pp = PerfectPope(aspect_ratio=aspect_ratio, image=image_path, pope=pope) + pp.save() + return image_path def unpopable(width, height): if width == 0 or height == 0: return True - if (width+height) > 9000: + if (width+height) >= 9001: return True return False -def read_pope(width, height, pope): - """ (int, int, Pope) -> bytes - """ - im = Image.open(pope.path) +def read_pope_from_fs(width, height, pope_image): + im = Image.open(pope_image.path) im = im.resize((width, height)) f = BytesIO() # FIXME: ceriously. im.save(f, "jpeg") f.seek(0) return f.read() +def read_pope(width, height, pope_image): + """ (int, int, Pope) -> bytes + get pope and scale for display + """ + if redis: + try: + + im = redis.get((width,height)) + if not im: + im = read_pope_from_fs(width, height, pope_image) + redis.set((width,height), im) + redis.expire((width,height), REDIS_TTL) + + except RedisConnectionError: + im = read_pope_from_fs(width, height, pope_image) + + return im + + def parse_pope(path): diff --git a/src/papiez_ipsum/static/admin/css/base.css b/src/papiezator/static/admin/css/base.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/base.css rename to src/papiezator/static/admin/css/base.css diff --git a/src/papiez_ipsum/static/admin/css/changelists.css b/src/papiezator/static/admin/css/changelists.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/changelists.css rename to src/papiezator/static/admin/css/changelists.css diff --git a/src/papiez_ipsum/static/admin/css/dashboard.css b/src/papiezator/static/admin/css/dashboard.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/dashboard.css rename to src/papiezator/static/admin/css/dashboard.css diff --git a/src/papiez_ipsum/static/admin/css/forms.css b/src/papiezator/static/admin/css/forms.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/forms.css rename to src/papiezator/static/admin/css/forms.css diff --git a/src/papiez_ipsum/static/admin/css/ie.css b/src/papiezator/static/admin/css/ie.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/ie.css rename to src/papiezator/static/admin/css/ie.css diff --git a/src/papiez_ipsum/static/admin/css/login.css b/src/papiezator/static/admin/css/login.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/login.css rename to src/papiezator/static/admin/css/login.css diff --git a/src/papiez_ipsum/static/admin/css/rtl.css b/src/papiezator/static/admin/css/rtl.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/rtl.css rename to src/papiezator/static/admin/css/rtl.css diff --git a/src/papiez_ipsum/static/admin/css/widgets.css b/src/papiezator/static/admin/css/widgets.css similarity index 100% rename from src/papiez_ipsum/static/admin/css/widgets.css rename to src/papiezator/static/admin/css/widgets.css diff --git a/src/papiez_ipsum/static/admin/img/changelist-bg.gif b/src/papiezator/static/admin/img/changelist-bg.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/changelist-bg.gif rename to src/papiezator/static/admin/img/changelist-bg.gif diff --git a/src/papiez_ipsum/static/admin/img/changelist-bg_rtl.gif b/src/papiezator/static/admin/img/changelist-bg_rtl.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/changelist-bg_rtl.gif rename to src/papiezator/static/admin/img/changelist-bg_rtl.gif diff --git a/src/papiez_ipsum/static/admin/img/chooser-bg.gif b/src/papiezator/static/admin/img/chooser-bg.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/chooser-bg.gif rename to src/papiezator/static/admin/img/chooser-bg.gif diff --git a/src/papiez_ipsum/static/admin/img/chooser_stacked-bg.gif b/src/papiezator/static/admin/img/chooser_stacked-bg.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/chooser_stacked-bg.gif rename to src/papiezator/static/admin/img/chooser_stacked-bg.gif diff --git a/src/papiez_ipsum/static/admin/img/default-bg-reverse.gif b/src/papiezator/static/admin/img/default-bg-reverse.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/default-bg-reverse.gif rename to src/papiezator/static/admin/img/default-bg-reverse.gif diff --git a/src/papiez_ipsum/static/admin/img/default-bg.gif b/src/papiezator/static/admin/img/default-bg.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/default-bg.gif rename to src/papiezator/static/admin/img/default-bg.gif diff --git a/src/papiez_ipsum/static/admin/img/deleted-overlay.gif b/src/papiezator/static/admin/img/deleted-overlay.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/deleted-overlay.gif rename to src/papiezator/static/admin/img/deleted-overlay.gif diff --git a/src/papiez_ipsum/static/admin/img/gis/move_vertex_off.png b/src/papiezator/static/admin/img/gis/move_vertex_off.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/gis/move_vertex_off.png rename to src/papiezator/static/admin/img/gis/move_vertex_off.png diff --git a/src/papiez_ipsum/static/admin/img/gis/move_vertex_on.png b/src/papiezator/static/admin/img/gis/move_vertex_on.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/gis/move_vertex_on.png rename to src/papiezator/static/admin/img/gis/move_vertex_on.png diff --git a/src/papiez_ipsum/static/admin/img/icon-no.gif b/src/papiezator/static/admin/img/icon-no.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon-no.gif rename to src/papiezator/static/admin/img/icon-no.gif diff --git a/src/papiez_ipsum/static/admin/img/icon-unknown.gif b/src/papiezator/static/admin/img/icon-unknown.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon-unknown.gif rename to src/papiezator/static/admin/img/icon-unknown.gif diff --git a/src/papiez_ipsum/static/admin/img/icon-yes.gif b/src/papiezator/static/admin/img/icon-yes.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon-yes.gif rename to src/papiezator/static/admin/img/icon-yes.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_addlink.gif b/src/papiezator/static/admin/img/icon_addlink.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_addlink.gif rename to src/papiezator/static/admin/img/icon_addlink.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_alert.gif b/src/papiezator/static/admin/img/icon_alert.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_alert.gif rename to src/papiezator/static/admin/img/icon_alert.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_calendar.gif b/src/papiezator/static/admin/img/icon_calendar.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_calendar.gif rename to src/papiezator/static/admin/img/icon_calendar.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_changelink.gif b/src/papiezator/static/admin/img/icon_changelink.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_changelink.gif rename to src/papiezator/static/admin/img/icon_changelink.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_clock.gif b/src/papiezator/static/admin/img/icon_clock.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_clock.gif rename to src/papiezator/static/admin/img/icon_clock.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_deletelink.gif b/src/papiezator/static/admin/img/icon_deletelink.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_deletelink.gif rename to src/papiezator/static/admin/img/icon_deletelink.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_error.gif b/src/papiezator/static/admin/img/icon_error.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_error.gif rename to src/papiezator/static/admin/img/icon_error.gif diff --git a/src/papiez_ipsum/static/admin/img/icon_searchbox.png b/src/papiezator/static/admin/img/icon_searchbox.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_searchbox.png rename to src/papiezator/static/admin/img/icon_searchbox.png diff --git a/src/papiez_ipsum/static/admin/img/icon_success.gif b/src/papiezator/static/admin/img/icon_success.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/icon_success.gif rename to src/papiezator/static/admin/img/icon_success.gif diff --git a/src/papiez_ipsum/static/admin/img/inline-delete-8bit.png b/src/papiezator/static/admin/img/inline-delete-8bit.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/inline-delete-8bit.png rename to src/papiezator/static/admin/img/inline-delete-8bit.png diff --git a/src/papiez_ipsum/static/admin/img/inline-delete.png b/src/papiezator/static/admin/img/inline-delete.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/inline-delete.png rename to src/papiezator/static/admin/img/inline-delete.png diff --git a/src/papiez_ipsum/static/admin/img/inline-restore-8bit.png b/src/papiezator/static/admin/img/inline-restore-8bit.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/inline-restore-8bit.png rename to src/papiezator/static/admin/img/inline-restore-8bit.png diff --git a/src/papiez_ipsum/static/admin/img/inline-restore.png b/src/papiezator/static/admin/img/inline-restore.png similarity index 100% rename from src/papiez_ipsum/static/admin/img/inline-restore.png rename to src/papiezator/static/admin/img/inline-restore.png diff --git a/src/papiez_ipsum/static/admin/img/inline-splitter-bg.gif b/src/papiezator/static/admin/img/inline-splitter-bg.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/inline-splitter-bg.gif rename to src/papiezator/static/admin/img/inline-splitter-bg.gif diff --git a/src/papiez_ipsum/static/admin/img/nav-bg-grabber.gif b/src/papiezator/static/admin/img/nav-bg-grabber.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/nav-bg-grabber.gif rename to src/papiezator/static/admin/img/nav-bg-grabber.gif diff --git a/src/papiez_ipsum/static/admin/img/nav-bg-reverse.gif b/src/papiezator/static/admin/img/nav-bg-reverse.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/nav-bg-reverse.gif rename to src/papiezator/static/admin/img/nav-bg-reverse.gif diff --git a/src/papiez_ipsum/static/admin/img/nav-bg-selected.gif b/src/papiezator/static/admin/img/nav-bg-selected.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/nav-bg-selected.gif rename to src/papiezator/static/admin/img/nav-bg-selected.gif diff --git a/src/papiez_ipsum/static/admin/img/nav-bg.gif b/src/papiezator/static/admin/img/nav-bg.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/nav-bg.gif rename to src/papiezator/static/admin/img/nav-bg.gif diff --git a/src/papiez_ipsum/static/admin/img/selector-icons.gif b/src/papiezator/static/admin/img/selector-icons.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/selector-icons.gif rename to src/papiezator/static/admin/img/selector-icons.gif diff --git a/src/papiez_ipsum/static/admin/img/selector-search.gif b/src/papiezator/static/admin/img/selector-search.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/selector-search.gif rename to src/papiezator/static/admin/img/selector-search.gif diff --git a/src/papiez_ipsum/static/admin/img/sorting-icons.gif b/src/papiezator/static/admin/img/sorting-icons.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/sorting-icons.gif rename to src/papiezator/static/admin/img/sorting-icons.gif diff --git a/src/papiez_ipsum/static/admin/img/tool-left.gif b/src/papiezator/static/admin/img/tool-left.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tool-left.gif rename to src/papiezator/static/admin/img/tool-left.gif diff --git a/src/papiez_ipsum/static/admin/img/tool-left_over.gif b/src/papiezator/static/admin/img/tool-left_over.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tool-left_over.gif rename to src/papiezator/static/admin/img/tool-left_over.gif diff --git a/src/papiez_ipsum/static/admin/img/tool-right.gif b/src/papiezator/static/admin/img/tool-right.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tool-right.gif rename to src/papiezator/static/admin/img/tool-right.gif diff --git a/src/papiez_ipsum/static/admin/img/tool-right_over.gif b/src/papiezator/static/admin/img/tool-right_over.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tool-right_over.gif rename to src/papiezator/static/admin/img/tool-right_over.gif diff --git a/src/papiez_ipsum/static/admin/img/tooltag-add.gif b/src/papiezator/static/admin/img/tooltag-add.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tooltag-add.gif rename to src/papiezator/static/admin/img/tooltag-add.gif diff --git a/src/papiez_ipsum/static/admin/img/tooltag-add_over.gif b/src/papiezator/static/admin/img/tooltag-add_over.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tooltag-add_over.gif rename to src/papiezator/static/admin/img/tooltag-add_over.gif diff --git a/src/papiez_ipsum/static/admin/img/tooltag-arrowright.gif b/src/papiezator/static/admin/img/tooltag-arrowright.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tooltag-arrowright.gif rename to src/papiezator/static/admin/img/tooltag-arrowright.gif diff --git a/src/papiez_ipsum/static/admin/img/tooltag-arrowright_over.gif b/src/papiezator/static/admin/img/tooltag-arrowright_over.gif similarity index 100% rename from src/papiez_ipsum/static/admin/img/tooltag-arrowright_over.gif rename to src/papiezator/static/admin/img/tooltag-arrowright_over.gif diff --git a/src/papiez_ipsum/static/admin/js/LICENSE-JQUERY.txt b/src/papiezator/static/admin/js/LICENSE-JQUERY.txt similarity index 100% rename from src/papiez_ipsum/static/admin/js/LICENSE-JQUERY.txt rename to src/papiezator/static/admin/js/LICENSE-JQUERY.txt diff --git a/src/papiez_ipsum/static/admin/js/SelectBox.js b/src/papiezator/static/admin/js/SelectBox.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/SelectBox.js rename to src/papiezator/static/admin/js/SelectBox.js diff --git a/src/papiez_ipsum/static/admin/js/SelectFilter2.js b/src/papiezator/static/admin/js/SelectFilter2.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/SelectFilter2.js rename to src/papiezator/static/admin/js/SelectFilter2.js diff --git a/src/papiez_ipsum/static/admin/js/actions.js b/src/papiezator/static/admin/js/actions.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/actions.js rename to src/papiezator/static/admin/js/actions.js diff --git a/src/papiez_ipsum/static/admin/js/actions.min.js b/src/papiezator/static/admin/js/actions.min.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/actions.min.js rename to src/papiezator/static/admin/js/actions.min.js diff --git a/src/papiez_ipsum/static/admin/js/admin/DateTimeShortcuts.js b/src/papiezator/static/admin/js/admin/DateTimeShortcuts.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/admin/DateTimeShortcuts.js rename to src/papiezator/static/admin/js/admin/DateTimeShortcuts.js diff --git a/src/papiez_ipsum/static/admin/js/admin/RelatedObjectLookups.js b/src/papiezator/static/admin/js/admin/RelatedObjectLookups.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/admin/RelatedObjectLookups.js rename to src/papiezator/static/admin/js/admin/RelatedObjectLookups.js diff --git a/src/papiez_ipsum/static/admin/js/calendar.js b/src/papiezator/static/admin/js/calendar.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/calendar.js rename to src/papiezator/static/admin/js/calendar.js diff --git a/src/papiez_ipsum/static/admin/js/collapse.js b/src/papiezator/static/admin/js/collapse.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/collapse.js rename to src/papiezator/static/admin/js/collapse.js diff --git a/src/papiez_ipsum/static/admin/js/collapse.min.js b/src/papiezator/static/admin/js/collapse.min.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/collapse.min.js rename to src/papiezator/static/admin/js/collapse.min.js diff --git a/src/papiez_ipsum/static/admin/js/core.js b/src/papiezator/static/admin/js/core.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/core.js rename to src/papiezator/static/admin/js/core.js diff --git a/src/papiez_ipsum/static/admin/js/inlines.js b/src/papiezator/static/admin/js/inlines.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/inlines.js rename to src/papiezator/static/admin/js/inlines.js diff --git a/src/papiez_ipsum/static/admin/js/inlines.min.js b/src/papiezator/static/admin/js/inlines.min.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/inlines.min.js rename to src/papiezator/static/admin/js/inlines.min.js diff --git a/src/papiez_ipsum/static/admin/js/jquery.init.js b/src/papiezator/static/admin/js/jquery.init.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/jquery.init.js rename to src/papiezator/static/admin/js/jquery.init.js diff --git a/src/papiez_ipsum/static/admin/js/jquery.js b/src/papiezator/static/admin/js/jquery.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/jquery.js rename to src/papiezator/static/admin/js/jquery.js diff --git a/src/papiez_ipsum/static/admin/js/jquery.min.js b/src/papiezator/static/admin/js/jquery.min.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/jquery.min.js rename to src/papiezator/static/admin/js/jquery.min.js diff --git a/src/papiez_ipsum/static/admin/js/prepopulate.js b/src/papiezator/static/admin/js/prepopulate.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/prepopulate.js rename to src/papiezator/static/admin/js/prepopulate.js diff --git a/src/papiez_ipsum/static/admin/js/prepopulate.min.js b/src/papiezator/static/admin/js/prepopulate.min.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/prepopulate.min.js rename to src/papiezator/static/admin/js/prepopulate.min.js diff --git a/src/papiez_ipsum/static/admin/js/timeparse.js b/src/papiezator/static/admin/js/timeparse.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/timeparse.js rename to src/papiezator/static/admin/js/timeparse.js diff --git a/src/papiez_ipsum/static/admin/js/urlify.js b/src/papiezator/static/admin/js/urlify.js similarity index 100% rename from src/papiez_ipsum/static/admin/js/urlify.js rename to src/papiezator/static/admin/js/urlify.js diff --git a/src/papiez_ipsum/static/css/bootstrap-responsive.css b/src/papiezator/static/css/bootstrap-responsive.css similarity index 100% rename from src/papiez_ipsum/static/css/bootstrap-responsive.css rename to src/papiezator/static/css/bootstrap-responsive.css diff --git a/src/papiez_ipsum/static/css/bootstrap-responsive.min.css b/src/papiezator/static/css/bootstrap-responsive.min.css similarity index 100% rename from src/papiez_ipsum/static/css/bootstrap-responsive.min.css rename to src/papiezator/static/css/bootstrap-responsive.min.css diff --git a/src/papiez_ipsum/static/css/bootstrap.css b/src/papiezator/static/css/bootstrap.css similarity index 100% rename from src/papiez_ipsum/static/css/bootstrap.css rename to src/papiezator/static/css/bootstrap.css diff --git a/src/papiez_ipsum/static/css/bootstrap.min.css b/src/papiezator/static/css/bootstrap.min.css similarity index 100% rename from src/papiez_ipsum/static/css/bootstrap.min.css rename to src/papiezator/static/css/bootstrap.min.css diff --git a/src/papiezator/static/foo b/src/papiezator/static/foo new file mode 100644 index 0000000..e69de29 diff --git a/src/papiezator/static/img/forkme.png b/src/papiezator/static/img/forkme.png new file mode 100644 index 0000000000000000000000000000000000000000..dd01df157de2a9507bc2dfbf4441be00909aee4c GIT binary patch literal 18136 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 +{% load staticfiles %} @@ -26,6 +27,8 @@ + Fork me on GitHub +