--- a/qrurls/admin.py Sun Aug 18 23:24:54 2013 +0300
+++ b/qrurls/admin.py Mon Aug 19 02:11:16 2013 +0300
@@ -1,7 +1,10 @@
import datetime
+import urllib
-from django.conf import settings
+from django import http, shortcuts, forms
+from django.conf import settings, urls
from django.contrib import admin
+from django.core.urlresolvers import reverse
from django.utils import timezone, formats
import django.utils.html
import django.forms.models
@@ -16,33 +19,13 @@
def __init__ (self, *args, **kwargs) :
urlfeed = kwargs.get('instance')
+ extra = kwargs.get('extra', 5)
- publishing_date = None
- publishing_time = datetime.time()
-
- # hack to get at the URLFeed to determine our initial values..
- if urlfeed and isinstance(urlfeed, URL) :
- publishing_date = urlfeed.last_item().published.date()
- publishing_time = urlfeed.publishing_time
-
- def publishing_schedule (count) :
- if not publishing_date :
- # starting today
- start_date = datetime.date.today()
- offset = 0
- else :
- # starting from the following day
- start_date = publishing_date
- offset = 1
-
- for days in xrange(offset, count + offset) :
- yield datetime.datetime.combine(
- start_date + datetime.timedelta(days=days),
- publishing_time
- )
-
+ publishing_date, publishing_time = URLAdmin.publish_scheduling(urlfeed)
+
kwargs.update(initial=[
- dict(published=publish) for publish in publishing_schedule(count=5)
+ dict(published=publish) for publish in URLAdmin.publishing_schedule(
+ publishing_date, publishing_time, count=extra)
])
super(URLItemFormset, self).__init__(*args, **kwargs)
@@ -55,6 +38,29 @@
formset = URLItemFormset
class URLAdmin (admin.ModelAdmin) :
+ @classmethod
+ def publish_scheduling (cls, urlfeed) :
+ """Calculate initial URLItem.published values for feed, or defaults."""
+ # hack to get at the URLFeed to determine our initial values..
+ if urlfeed and isinstance(urlfeed, URL) :
+ # starting from the following day
+ return (
+ urlfeed.last_item().published.date() + datetime.timedelta(days=1),
+ urlfeed.publishing_time,
+ )
+ else:
+ # no data...
+ datetime.date.today(), datetime.time()
+
+ @classmethod
+ def publishing_schedule (cls, publishing_date, publishing_time, count) :
+ """Yield URLItem.published values."""
+ for days in xrange(0, count) :
+ yield datetime.datetime.combine(
+ publishing_date + datetime.timedelta(days=days),
+ publishing_time
+ )
+
def timezone (self, obj) :
now = timezone.localtime(obj.now())
tz = now.tzinfo
@@ -141,6 +147,70 @@
)
inlines = (URLItemInline, )
+ ## Import
+ class ImportForm (forms.Form) :
+ shorturl = forms.ModelChoiceField(URL.objects)
+ publishing_date = forms.DateField(widget=admin.widgets.AdminDateWidget)
+ publishing_time = forms.TimeField(widget=admin.widgets.AdminTimeWidget)
+ image = forms.ImageField()
+
+ def import_images_handler (self, url_feed, data) :
+ """Custom for backend for mass-importing images into a feed."""
+
+ images = [data['image']]
+ publishing = self.publishing_schedule(data['publishing_date'], data['publishing_time'], len(images))
+
+ for image, publish in zip(images, publishing) :
+ # XXX: move title default elsewhere
+ url_image = URLImage(image=image, title=image.name)
+ url_image.save()
+
+ url_item = URLItem(shorturl=url_feed, published=publish, image=url_image)
+ url_item.save()
+
+ return http.HttpResponseRedirect(reverse('admin:qrurls_url_change', args=(url_feed.id, )))
+
+ def import_images (self, request, shorturl_id) :
+ """Custom form frontend for mass-importing images into a feed."""
+ url_feed = URL.objects.get(id=int(shorturl_id))
+
+ if request.method == 'POST' :
+ form = self.ImportForm(request.POST, request.FILES)
+
+ if form.is_valid() :
+ return self.import_images_handler(url_feed, form.cleaned_data)
+ else :
+ publishing_date, publishing_time = self.publish_scheduling(url_feed)
+
+ form = self.ImportForm(initial=dict(
+ shorturl = url_feed.id,
+ publishing_date = publishing_date,
+ publishing_time = publishing_time,
+ ))
+
+ return shortcuts.render(request, 'admin/qrurls_import_images.html', dict(
+ current_app = self.admin_site.name,
+
+ media = self.media + form.media,
+ form_url = reverse('admin:qrurls_import_images', kwargs=dict(shorturl_id=url_feed.id)),
+ form = form,
+ ))
+
+ def get_urls (self) :
+ return urls.patterns('',
+ urls.url(r'^(?P<shorturl_id>\d+)/import$', self.admin_site.admin_view(self.import_images),
+ name='qrurls_import_images'),
+ ) + super(URLAdmin, self).get_urls()
+
+ def import_images_action (self, request, queryset) :
+ url_feed, = [url_feed for url_feed in queryset]
+ return http.HttpResponseRedirect(
+ reverse('admin:qrurls_import_images', kwargs=dict(shorturl_id=url_feed.id)) # ) + '?' + urllib.urlencode(qs, doseq=True)
+ )
+ import_images_action.short_description = "Import images for selected feeds"
+
+ actions = [import_images_action]
+
class URLItemAdmin (admin.ModelAdmin) :
list_display = (
'shorturl', 'published_state', 'get_absolute_url', 'image', 'published',