clarify timezones used for URLItem.published, but no actual explicit per-URLFeed timezone..
import datetime
from django.conf import settings
from django.contrib import admin
from django.utils import timezone, formats
import django.utils.html
import django.forms.models
from qrurls.models import URL, URLItem, URLImage
class URLItemFormset (django.forms.models.BaseInlineFormSet) :
"""
Uses the existing URLItems for the URLFeed to determine the initial publishing
times for new items.
"""
def __init__ (self, *args, **kwargs) :
urlfeed = kwargs.get('instance')
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
)
kwargs.update(initial=[
dict(published=publish) for publish in publishing_schedule(count=5)
])
super(URLItemFormset, self).__init__(*args, **kwargs)
class URLItemInline (admin.TabularInline) :
"""
Inline set of URLItems for an URLFeed.
"""
model = URLItem
formset = URLItemFormset
class URLAdmin (admin.ModelAdmin) :
def timezone (self, obj) :
now = timezone.localtime(obj.now())
tz = now.tzinfo
td = now.tzinfo.utcoffset(now)
if td :
minutes, seconds = divmod(td.total_seconds(), 60)
hours, minutes = divmod(minutes, 60)
offset = "(UTC%+03d:%02d)" % (hours, minutes)
else :
offset = ""
return u"%s %s" % (tz, offset)
def qrcode_url (self, obj) :
warn = None
if obj.shorturl.upper() != obj.shorturl :
warn = "Shorturl should be UPPERCASE for most compact QR code"
return '<a href="{url}">{url}</a>{warn}'.format(
url = django.utils.html.escape(obj.qrcode_url()),
warn = '<p class="errornote">{warn}</p>'.format(warn=warn) if warn else '',
)
qrcode_url.allow_tags = True
def qrcode_img (self, obj) :
return '<img src="{img}" />'.format(
img=django.utils.html.escape(obj.qrcode_img()),
)
qrcode_img.allow_tags = True
# XXX: a whole bunch of ugly datetime-formatting for display...
def active (self, obj) :
item = obj.active_item()
if item :
return "%s %s" % (formats.localize(timezone.localtime(item.published)), item)
else :
return ""
def now (self, obj) :
return formats.localize(timezone.localtime(obj.now()))
def upcoming (self, obj) :
item = obj.upcoming_item()
if item :
return "%s %s" % (formats.localize(timezone.localtime(item.published)), item)
else :
return ""
readonly_fields = (
'timezone',
'qrcode_url',
'qrcode_img',
'active_item',
'upcoming_item',
'active',
'now',
'upcoming',
)
list_display = (
'get_absolute_url',
'active_item',
'upcoming_item',
)
fieldsets = (
(None, {
'fields': (
'shorturl',
'publishing_time',
'timezone',
),
}),
("QRCode", {
'fields': ('qrcode_url', 'qrcode_img'),
}),
("Item publishing overview", {
'fields': (
'active',
'now',
'upcoming',
),
}),
)
inlines = (URLItemInline, )
class URLItemAdmin (admin.ModelAdmin) :
list_display = (
'shorturl', 'published_state', 'get_absolute_url', 'image', 'published',
)
readonly_fields = ('published_state', 'published')
fieldsets = (
("Publishing", {
'fields': ('shorturl', 'published', ),
}),
("Target", {
'fields': ('url', 'image'),
}),
)
class URLImageAdmin (admin.ModelAdmin) :
list_display = (
'title',
'uploaded',
)
# hide the "uploaded" field
fields = (
'image',
'title',
)
readonly_fields = (
'uploaded',
)
inlines = (URLItemInline, )
admin.site.register(URL, URLAdmin)
admin.site.register(URLItem, URLItemAdmin)
admin.site.register(URLImage, URLImageAdmin)