Changeset 6

Show
Ignore:
Timestamp:
09/17/07 18:48:54 (1 year ago)
Author:
simon
Message:

Added viewing of drafts.
Added a list of drafts to the info-block.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • bitstructures/trunk/css/bitstructures.css

    r2 r6  
    3131} 
    3232 
    33 #about
     33.info-entry
    3434        padding: 40px 60px 0 0; 
    3535} 
     
    7777        padding: 5px; 
    7878} 
     79 
     80#drafts ul { 
     81        margin-left: 0; 
     82        padding-left: 0; 
     83        list-style-type: none; 
     84} 
     85 
     86#drafts li { 
     87        padding-bottom: 6px; 
     88} 
     89 
     90#drafts li a { 
     91        text-decoration: none; 
     92} 
  • bitstructures/trunk/substructure/models.py

    r2 r6  
    77    >>> test1.id = 1 
    88    >>> test1.slug = 'testentry1' 
    9     >>> bool(test1.date
     9    >>> test1.is_published(
    1010    False 
    11     >>> bool(test1.is_public
    12     Fals
     11    >>> test1.is_draft(
     12    Tru
    1313    >>> test1.get_absolute_url() 
    14     '/testentry1' 
     14    '/drafts/testentry1' 
    1515    >>> test2 = Entry() 
    1616    >>> test2.id = 2 
    1717    >>> test2.slug = 'testentry2' 
    18     >>> test2.date = datetime(2001, 2, 3) 
    19     >>> bool(test2.date
     18    >>> test2.date_published = datetime(2001, 2, 3) 
     19    >>> test2.is_published(
    2020    True 
    21     >>> bool(test2.is_public
     21    >>> test2.is_draft(
    2222    False 
    2323    >>> test2.get_absolute_url() 
     
    2727    slug = models.SlugField(unique=True, blank=False) 
    2828    title = models.CharField(maxlength=200, blank=False) 
    29     date = models.DateTimeField(null=True, blank=True) 
    30     is_public = models.BooleanField() 
     29    date_published = models.DateTimeField(null=True, blank=True) 
    3130    text = models.TextField(blank=False) 
    3231 
     
    3433        return self.title 
    3534 
     35    def is_published(self): 
     36        return bool(self.date_published) 
     37 
     38    def is_draft(self): 
     39        return not self.is_published() 
     40 
    3641    def get_absolute_url(self): 
    37         if self.date
    38             year = self.date.year 
    39             month = self.date.month 
     42        if self.is_published()
     43            year = self.date_published.year 
     44            month = self.date_published.month 
    4045            return '/%04d/%02d/%s' % (year, month, self.slug) 
    4146        else: 
    42             return '/%s' % (self.slug) 
     47            return '/drafts/%s' % (self.slug) 
    4348 
    4449    class Admin: 
    4550        fields = ( 
    46             (None, {'fields': ('title', 'slug', 'date', 'is_public')}), 
     51            (None, {'fields': ('title', 'slug', 'date_published')}), 
    4752            (None, {'fields': ('text',), 'classes': 'monospace'}) 
    4853        ) 
    49         list_display = ('title', 'slug', 'date', 'is_public', 'get_absolute_url') 
    50         ordering = ['-date'] 
     54        list_display = ('title', 'get_absolute_url', 'date_published') 
     55        ordering = ['-date_published'] 
  • bitstructures/trunk/substructure/templates/substructure/base.html

    r5 r6  
    1616 
    1717<div id="info-block"> 
    18 <div id="about"> 
     18 
     19<div class="info-entry"> 
    1920<h2>About me</h2> 
    2021<p>Simon builds and designs web apps and infrastructure. 
     
    2324<p><a href="http://del.icio.us/simonbates">del.icio.us/simonbates</a></p> 
    2425</div> 
     26 
     27{% if drafts %} 
     28<div id="drafts" class="info-entry"> 
     29<h2>Drafts</h2> 
     30<ul> 
     31{% for entry in drafts %} 
     32<li><a href="{{ entry.get_absolute_url }}">{{ entry.title|escape }}</a></li> 
     33{% endfor %} 
     34</ul> 
     35<p><a href="/admin/substructure/entry/add/">new entry</a></p> 
     36</div> 
     37{% endif %} 
     38 
    2539</div> 
    2640 
  • bitstructures/trunk/substructure/templates/substructure/entry.html

    r2 r6  
    55<h2><a href="{{ entry.get_absolute_url }}">{{ entry.title|escape }}</a></h2> 
    66 
    7 {% if entry.date %} 
    8 <p>{{ entry.date|date:"F j, Y" }}</p> 
     7{% if entry.date_published %} 
     8<p>{{ entry.date_published|date:"F j, Y" }}</p> 
     9{% endif %} 
     10 
     11{% if user_can_change_entry %} 
     12<p><a href="/admin/substructure/entry/{{ entry.id }}/">edit</a></p> 
    913{% endif %} 
    1014 
  • bitstructures/trunk/substructure/urls.py

    r2 r6  
    44    (r'^$', 'substructure.views.blog'), 
    55    (r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<slug>[a-z0-9-]+)$', 
    6         'substructure.views.dated_entry_page'), 
    7     (r'^(?P<slug>[a-z0-9-]+)$', 
    8         'substructure.views.undated_entry_page') 
     6        'substructure.views.entry_page'), 
     7    (r'^drafts/(?P<slug>[a-z0-9-]+)$', 'substructure.views.draft_page') 
    98) 
  • bitstructures/trunk/substructure/views.py

    r5 r6  
    55 
    66def blog(request): 
    7     entry_list = Entry.objects.filter(date__isnull=False, is_public=True).order_by('-date') 
    8     return render_to_response('substructure/blog.html', 
    9                               { 'MEDIA_URL': settings.MEDIA_URL, 
    10                                 'entry_list': entry_list }) 
     7    data = get_context_data(request) 
     8    data['entry_list'] = Entry.objects.filter(date_published__isnull=False).order_by('-date_published') 
     9    return render_to_response('substructure/blog.html', data) 
    1110 
    12 def dated_entry_page(request, year, month, slug): 
     11def entry_page(request, year, month, slug): 
    1312    entry = get_object_or_404(Entry, slug=slug) 
    14     if not entry.is_public
     13    if not entry.is_published()
    1514        raise Http404 
    16     if not entry.date
     15    if int(year) != entry.date_published.year
    1716        raise Http404 
    18     if int(year) != entry.date.year
     17    if int(month) != entry.date_published.month
    1918        raise Http404 
    20     if int(month) != entry.date.month: 
     19    data = get_context_data(request) 
     20    data['entry'] = entry 
     21    return render_to_response('substructure/entry_page.html', data) 
     22 
     23def draft_page(request, slug): 
     24    if not user_can_change_entry(request): 
    2125        raise Http404 
    22     return render_to_response('substructure/entry_page.html', 
    23                               { 'MEDIA_URL': settings.MEDIA_URL, 
    24                                 'entry': entry }) 
     26    entry = get_object_or_404(Entry, slug=slug) 
     27    if not entry.is_draft(): 
     28        raise Http404 
     29    data = get_context_data(request) 
     30    data['entry'] = entry 
     31    return render_to_response('substructure/entry_page.html', data) 
    2532 
    26 def undated_entry_page(request, slug): 
    27     entry = get_object_or_404(Entry, slug=slug) 
    28     if not entry.is_public: 
    29         raise Http404 
    30     if entry.date: 
    31         raise Http404 
    32     return render_to_response('substructure/entry_page.html', 
    33                               { 'MEDIA_URL': settings.MEDIA_URL, 
    34                                 'entry': entry }) 
     33def get_context_data(request): 
     34    data = { 'MEDIA_URL': settings.MEDIA_URL } 
     35    if user_can_change_entry(request): 
     36        data['user_can_change_entry'] = True 
     37        data['drafts'] = get_drafts() 
     38    return data 
     39 
     40def user_can_change_entry(request): 
     41    return request.user.has_perm('change_entry') 
     42 
     43def get_drafts(): 
     44    return Entry.objects.filter(date_published__isnull=True).order_by('title')