diff -r 5df9ed6b5976 -r 7c0dcf6603f5 qrurls/admin.py --- 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\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',