qrurls/admin.py
author Tero Marttila <terom@fixme.fi>
Wed, 14 Aug 2013 23:26:00 +0300
changeset 27 ffcffe3024f1
parent 22 28a72692b749
child 30 d0f56303d8de
permissions -rw-r--r--
sane defaults for published in urlitems inline form
27
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     1
import datetime
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     2
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
from django.contrib import admin
27
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     4
import django.utils.html
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     5
import django.forms.models
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     6
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from qrurls.models import URL, URLItem
27
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     8
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
     9
class URLItemFormset (django.forms.models.BaseInlineFormSet) :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    10
    def __init__ (self, *args, **kwargs) :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    11
        urlfeed = kwargs.get('instance')
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    12
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    13
        publishing_date = None
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    14
        publishing_time = datetime.time()
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    15
        
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    16
        if urlfeed :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    17
            publishing_date = urlfeed.last_item().published.date()
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    18
            publishing_time = urlfeed.publishing_schedule
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    19
        
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    20
        def publishing_schedule (count) :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    21
            if not publishing_date :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    22
                # starting today
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    23
                start_date = datetime.date.today()
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    24
                offset = 0
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    25
            else :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    26
                # starting from the following day
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    27
                start_date = publishing_date
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    28
                offset = 1
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    29
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    30
            for days in xrange(offset, count + offset) :
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    31
                yield datetime.datetime.combine(
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    32
                        publishing_date + datetime.timedelta(days=days),
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    33
                        publishing_time
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    34
                )
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    35
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    36
        kwargs.update(initial=[
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    37
                dict(published=publish) for publish in publishing_schedule(count=5)
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    38
        ])
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    39
        super(URLItemFormset, self).__init__(*args, **kwargs)
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    41
class URLItemInline (admin.TabularInline) :
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    42
    model = URLItem
27
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    43
    formset = URLItemFormset
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    44
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
class URLAdmin (admin.ModelAdmin) :
22
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    46
    def qrcode_url (self, obj) :
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    47
        warn = None
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    48
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    49
        if obj.shorturl.upper() != obj.shorturl :
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    50
            warn = "Shorturl should be UPPERCASE for most compact QR code"
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    51
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    52
        return '<a href="{url}">{url}</a>{warn}'.format(
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    53
                url     = django.utils.html.escape(obj.qrcode_url()),
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    54
                warn    = '<p class="errornote">{warn}</p>'.format(warn=warn) if warn else '',
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    55
        )
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    56
    qrcode_url.allow_tags = True
28a72692b749 keep shorturl case sensitive, but warn if not uppercase
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
    57
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    58
    def qrcode_img (self, obj) :
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    59
        return '<img src="{img}" />'.format(
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    60
                img=django.utils.html.escape(obj.qrcode_img()),
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    61
        )
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    62
    qrcode_img.allow_tags = True
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    63
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    64
    readonly_fields = (
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    65
        'qrcode_url',
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    66
        'qrcode_img',
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    67
        'active_item',
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    68
        'upcoming_item',
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    69
    )
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    list_display = (
11
b975f7973402 show absolute url for url admin
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    71
        'get_absolute_url',
8
5c8a19fa6a29 display active/upcoming in list
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    72
        'active_item',
5c8a19fa6a29 display active/upcoming in list
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    73
        'upcoming_item',
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    )
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    75
    fieldsets = (
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    76
        (None, {
27
ffcffe3024f1 sane defaults for published in urlitems inline form
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
    77
            'fields': ('shorturl', 'active_item', 'upcoming_item', 'publishing_schedule')
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    78
        }),
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    79
        ("QRCode", {
7
8202196630d3 better reporting of active/upcoming items
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    80
            'fields': ('qrcode_url', 'qrcode_img'),
4
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    81
        }),
d56f48f6c94b URL: show qrcode for URL in admin (using google charts)
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    82
    )
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    83
    inlines = (URLItemInline, )
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
class URLItemAdmin (admin.ModelAdmin) :
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    list_display = (
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    87
        'shorturl', 'get_absolute_url', 'published_state',
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    88
    )
6
e821a59bf3a7 show published state for url items
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    89
    readonly_fields = ('published_state',)
3
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    90
    fieldsets = (
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    91
        ("Publishing", {
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    92
            'fields': ('shorturl', 'published', ),
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    93
        }),
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    94
        ("Target", {
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    95
            'fields': ('url', ),
e7d3f1a28b24 touchup admin ui
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    96
        }),
2
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    )
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
admin.site.register(URL, URLAdmin)
e838dda048a6 qrurls: basic functionality
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
admin.site.register(URLItem, URLItemAdmin)