Added blog app:

+ BlogEntry model
+ Views for news lists and news detail
+ Migrations
+ Custom date time filter based on settings timezone
This commit is contained in:
Felipe Martín 2013-05-28 15:15:12 +02:00
parent 513946e6fe
commit ffea80c049
10 changed files with 178 additions and 0 deletions

View File

View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'BlogEntry'
db.create_table(u'blog_blogentry', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=128)),
('date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 5, 28, 0, 0))),
('content', self.gf('django.db.models.fields.TextField')()),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=128)),
))
db.send_create_signal('blog', ['BlogEntry'])
def backwards(self, orm):
# Deleting model 'BlogEntry'
db.delete_table(u'blog_blogentry')
models = {
'blog.blogentry': {
'Meta': {'ordering': "['date']", 'object_name': 'BlogEntry'},
'content': ('django.db.models.fields.TextField', [], {}),
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 5, 28, 0, 0)'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '128'})
}
}
complete_apps = ['blog']

View File

@ -0,0 +1,34 @@
from django.db import models
from django.contrib import admin
import datetime
from django.utils.timezone import utc
# Create your models here.
class BlogEntry(models.Model):
title = models.CharField(max_length=128)
date = models.DateTimeField(auto_now_add=True)
content = models.TextField()
slug = models.SlugField(max_length=128)
class Meta:
app_label = 'blog'
ordering = ['-date']
class BlogEntryAdmin(admin.ModelAdmin):
list_display = ('title', 'date', )
list_display_links = ('title', )
list_filter = ('date', )
search_fields = ('title', 'content', )
prepopulated_fields = {"slug": ("title",)}
class Media:
css = {
"all": ("lib/redactor.css",)
}
js = ("lib/redactor.js",)
admin.site.register(BlogEntry, BlogEntryAdmin)

View File

@ -0,0 +1,24 @@
{% extends "layout.html" %}
{% block content %}
<h1>Blog</h1>
{% for item in page.object_list %}
<hr />
<article>
<h2><a href="/blog/{{ item.date.year }}/{{ item.date.month }}/{{ item.date.day }}/{{ item.slug }}">{{ item.title }}</a></h2>
<div><i class="icon-calendar"></i> {{ item.date|dt('%B %e, %Y') }}</div>
<p>{{ item.content|nl2br }}</p>
</article>
{% endfor %}
{% if paginator.num_pages > 1 %}
<div class="pagination pagination-centered">
<ul>
{% for p in range(1, paginator.num_pages+1) %}
<li {% if p == page_number %}class="active"{% endif %}>
<a href="{{ url('blocks_list') }}?page={{ p }}">{{ p }}</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,8 @@
{% extends "layout.html" %}
{% block content %}
<p><a href="{{ url('blog_list') }}"><i class="icon-arrow-left"></i> Go back</a></p>
<h1>{{ item.title }}</h1>
<div><i class="icon-calendar"></i> {{ item.date|dt('%B %e, %Y') }}</div>
<p>{{ item.content|nl2br }}</p>
{% endblock %}

View File

@ -0,0 +1,16 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

View File

@ -0,0 +1,42 @@
from blog.models import BlogEntry
from django.core.paginator import Paginator
from django.shortcuts import render_to_response
from django.template import RequestContext
from datetime import datetime
def blog(request):
section = 'blog'
items = BlogEntry.objects.all()
paginator = Paginator(items, 4)
page_number = 1
if 'page' in request.GET:
page_number = int(request.GET['page'])
page = paginator.page(page_number)
data = {
'section': section,
'page': page,
'page_number': page_number,
'paginator': paginator,
}
context = RequestContext(request, data)
return render_to_response('blog.html', context_instance=context)
def blog_item(request, year, month, day, slug):
item = BlogEntry.objects.get(
slug=slug,
date__year=int(year),
date__month=int(month),
date__day=int(day)
)
data = {
'item': item
}
context = RequestContext(request, data)
return render_to_response('blog_entry.html', context_instance=context)

View File

@ -0,0 +1,15 @@
from jingo import register
from django.utils.translation import ugettext as _
from django.utils.encoding import smart_unicode
from django.conf import settings
from pytz import timezone
import pytz
@register.filter
def dt(t, fmt=None):
"""Call ``datetime.strftime`` with the given format string."""
tz = timezone(settings.TIME_ZONE)
if fmt is None:
fmt = _('%B %e, %Y')
return smart_unicode(tz.normalize(t).strftime(fmt)) if t else u''

View File

@ -1,5 +1,6 @@
from django.conf.urls import patterns, include, url
from django.http import HttpResponse, HttpResponseRedirect
from herobrine import filters
# Admin
from django.contrib import admin