richleland / django-happening
a collection of news and events focused django apps.
$ hg clone http://code.richleland.com/django-happening
| commit 24: | 9f36ceca063e |
| parent 23: | cd3dfd448077 |
| branch: | refactor |
Changed (Δ5.6 KB):
happening/news/admin.py (1 lines added, 12 lines removed)
happening/news/fixtures/test-data-news.yaml (12 lines added, 0 lines removed)
happening/news/managers.py (0 lines added, 6 lines removed)
happening/news/models.py (1 lines added, 37 lines removed)
happening/news/templates/news/latest_news.html (null-size change)
happening/news/templates/news/newsitem_archive.html (null-size change)
happening/news/templates/news/newsitem_archive_day.html (null-size change)
happening/news/templates/news/newsitem_archive_month.html (null-size change)
happening/news/templates/news/newsitem_archive_year.html (null-size change)
happening/news/templates/news/newsitem_detail.html (null-size change)
happening/news/templates/shakin/event_archive.html
happening/news/templates/shakin/event_archive_day.html
happening/news/templates/shakin/event_archive_month.html
happening/news/templates/shakin/event_archive_year.html
happening/news/templates/shakin/event_detail.html
happening/news/templates/shakin/latest_news.html
happening/news/templates/shakin/news_events.html
happening/news/templates/shakin/newsitem_archive.html
happening/news/templates/shakin/newsitem_archive_day.html
happening/news/templates/shakin/newsitem_archive_month.html
happening/news/templates/shakin/newsitem_archive_year.html
happening/news/templates/shakin/newsitem_detail.html
happening/news/templates/shakin/templatetags_usage.html
happening/news/templates/shakin/upcoming_events.html
happening/news/templatetags/news_tags.py (10 lines added, 0 lines removed)
happening/news/templatetags/shakin_tags.py
happening/news/tests.py (3 lines added, 52 lines removed)
happening/news/urls.py (1 lines added, 38 lines removed)
Up to file-list happening/news/admin.py:
1 |
1 |
from django.contrib import admin |
2 |
from happening.models import EventType, Event, NewsItem |
|
3 |
||
4 |
class EventTypeAdmin(admin.ModelAdmin): |
|
5 |
prepopulated_fields = { 'slug': ('title',) } |
|
6 |
||
7 |
class EventAdmin(admin.ModelAdmin): |
|
8 |
list_display = ('title', 'pub_date', 'visible') |
|
9 |
list_filter = ('visible', 'event_type') |
|
10 |
search_fields = ('title',) |
|
11 |
prepopulated_fields = { 'slug': ('title',) } |
|
2 |
from happening.news.models import NewsItem |
|
12 |
3 |
|
13 |
4 |
class NewsItemAdmin(admin.ModelAdmin): |
14 |
5 |
list_display = ('title', 'pub_date', 'visible') |
| … | … | @@ -16,6 +7,4 @@ class NewsItemAdmin(admin.ModelAdmin): |
16 |
7 |
search_fields = ('title',) |
17 |
8 |
prepopulated_fields = { 'slug': ('title',) } |
18 |
9 |
|
19 |
admin.site.register(EventType, EventTypeAdmin) |
|
20 |
admin.site.register(Event, EventAdmin) |
|
21 |
10 |
admin.site.register(NewsItem, NewsItemAdmin) |
Up to file-list happening/news/fixtures/test-data-news.yaml:
1 |
- fields: {end_date: null, long_text: 'Lorem ipsum dolor sit amet, consectetur adipisicing |
|
2 |
elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. |
|
3 |
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi |
|
4 |
ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit |
|
5 |
in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur |
|
6 |
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt |
|
7 |
mollit anim id est laborum.', pub_date: !!timestamp '2010-01-20 11:19:43', |
|
8 |
short_text: '', slug: interesting-news-item, subhead: '', title: Interesting |
|
9 |
News Item, visible: true} |
|
10 |
model: news.newsitem |
|
11 |
pk: 1 |
|
12 |
Up to file-list happening/news/managers.py:
| … | … | @@ -2,12 +2,6 @@ from datetime import datetime |
2 |
2 |
from django.db import models |
3 |
3 |
from django.db.models import Q |
4 |
4 |
|
5 |
class EventManager(models.Manager): |
|
6 |
"Manager methods to account for visibility." |
|
7 |
||
8 |
def live(self, *args, **kwargs): |
|
9 |
return self.get_query_set().filter(visible=True) |
|
10 |
||
11 |
5 |
class NewsItemManager(models.Manager): |
12 |
6 |
"Manager methods to account for start and end dates for NewsItems." |
13 |
7 |
Up to file-list happening/news/models.py:
1 |
1 |
from datetime import datetime |
2 |
2 |
from django.db import models |
3 |
3 |
from django.utils.translation import ugettext_lazy as _ |
4 |
from happening.managers import EventManager, NewsItemManager |
|
5 |
||
6 |
class EventType(models.Model): |
|
7 |
"Represents a type of event for categorization." |
|
8 |
visible = models.BooleanField(default=True) |
|
9 |
title = models.CharField(max_length=255) |
|
10 |
slug = models.SlugField(unique=True) |
|
11 |
||
12 |
objects = EventManager() |
|
13 |
||
14 |
class Meta: |
|
15 |
verbose_name = _("event type") |
|
16 |
verbose_name_plural = _("event types") |
|
17 |
||
18 |
def __unicode__(self): |
|
19 |
return self.title |
|
20 |
||
21 |
class Event(models.Model): |
|
22 |
"Represents an event in time." |
|
23 |
visible = models.BooleanField(default=True) |
|
24 |
pub_date = models.DateTimeField(default=datetime.now) |
|
25 |
event_type = models.ForeignKey(EventType) |
|
26 |
title = models.CharField(max_length=255) |
|
27 |
slug = models.SlugField() |
|
28 |
short_text = models.CharField(max_length=50, blank=True) |
|
29 |
long_text = models.TextField() |
|
30 |
||
31 |
objects = EventManager() |
|
32 |
||
33 |
class Meta: |
|
34 |
unique_together = ('pub_date', 'slug') |
|
35 |
get_latest_by = 'pub_date' |
|
36 |
verbose_name = _("event") |
|
37 |
verbose_name_plural = _("events") |
|
38 |
||
39 |
def __unicode__(self): |
|
40 |
return self.title |
|
4 |
from happening.news.managers import NewsItemManager |
|
41 |
5 |
|
42 |
6 |
class NewsItem(models.Model): |
43 |
7 |
"Represents a press release or other newsworthy item." |
1 |
from django import template |
|
2 |
from happening.news.models import NewsItem |
|
3 |
||
4 |
register = template.Library() |
|
5 |
||
6 |
@register.inclusion_tag('news/latest_news.html') |
|
7 |
def latest_news(): |
|
8 |
return { |
|
9 |
'news_items': NewsItem.objects.live().order_by('-pub_date')[:10] |
|
10 |
} |
Up to file-list happening/news/tests.py:
1 |
1 |
from django.test import TestCase |
2 |
2 |
from django.core.urlresolvers import reverse |
3 |
from django.shortcuts import render_to_response |
|
4 |
3 |
from django.conf.urls.defaults import * |
5 |
4 |
|
6 |
from happening. |
|
5 |
from happening.news.models import NewsItem |
|
7 |
6 |
|
8 |
7 |
class MainTests(TestCase): |
9 |
8 |
def setUp(self): |
10 |
9 |
self.news_item = NewsItem.objects.live().latest() |
11 |
self.event = Event.objects.live().latest() |
|
12 |
10 |
|
13 |
11 |
def tearDown(self): |
14 |
12 |
pass |
15 |
13 |
|
16 |
14 |
|
17 |
class ShakinTests(MainTests): |
|
18 |
fixtures = ['test-data'] |
|
15 |
class NewsTests(MainTests): |
|
16 |
fixtures = ['test-data-news'] |
|
19 |
17 |
urls = 'urls' |
20 |
18 |
|
21 |
19 |
def test_news_views(self): |
| … | … | @@ -50,50 +48,3 @@ class ShakinTests(MainTests): |
50 |
48 |
}) |
51 |
49 |
response = self.client.get(url) |
52 |
50 |
self.assertEquals(response.status_code, 200) |
53 |
||
54 |
def test_events_views(self): |
|
55 |
url = reverse('events-index') |
|
56 |
response = self.client.get(url) |
|
57 |
self.assertEquals(response.status_code, 200) |
|
58 |
||
59 |
url = reverse('events-year', kwargs={ 'year': self.event.pub_date.year }) |
|
60 |
response = self.client.get(url) |
|
61 |
self.assertEquals(response.status_code, 200) |
|
62 |
||
63 |
url = reverse('events-month', kwargs={ |
|
64 |
'year': self.event.pub_date.year, |
|
65 |
'month': self.event.pub_date.strftime('%m') |
|
66 |
}) |
|
67 |
response = self.client.get(url) |
|
68 |
self.assertEquals(response.status_code, 200) |
|
69 |
||
70 |
url = reverse('events-day', kwargs={ |
|
71 |
'year': self.event.pub_date.year, |
|
72 |
'month': self.event.pub_date.strftime('%m'), |
|
73 |
'day': self.event.pub_date.strftime('%d') |
|
74 |
}) |
|
75 |
response = self.client.get(url) |
|
76 |
self.assertEquals(response.status_code, 200) |
|
77 |
||
78 |
url = reverse('events-detail', kwargs={ |
|
79 |
'year': self.event.pub_date.year, |
|
80 |
'month': self.event.pub_date.strftime('%m'), |
|
81 |
'day': self.event.pub_date.strftime('%d'), |
|
82 |
'slug': self.event.slug |
|
83 |
}) |
|
84 |
response = self.client.get(url) |
|
85 |
self.assertEquals(response.status_code, 200) |
|
86 |
||
87 |
class ShakinTemplatetagTests(MainTests): |
|
88 |
fixtures = ['test-data'] |
|
89 |
urls = patterns('django.views.generic.simple', |
|
90 |
url(r'^templatetags/$', |
|
91 |
'direct_to_template', |
|
92 |
{ 'template': 'happening/templatetags_usage.html' }, |
|
93 |
name='templatetags'), |
|
94 |
) |
|
95 |
||
96 |
def test_templatetags(self): |
|
97 |
url = reverse('templatetags') |
|
98 |
response = self.client.get(url) |
|
99 |
self.assertEquals(response.status_code, 200) |
Up to file-list happening/news/urls.py:
1 |
1 |
from django.conf.urls.defaults import * |
2 |
from django.conf import settings |
|
3 |
2 |
|
4 |
from happening. |
|
3 |
from happening.news.models import NewsItem |
|
5 |
4 |
|
6 |
5 |
urlpatterns = patterns('django.views.generic.date_based', |
7 |
6 |
url(r'^news/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', |
| … | … | @@ -39,40 +38,4 @@ urlpatterns = patterns('django.views.gen |
39 |
38 |
'queryset': NewsItem.objects.live(), |
40 |
39 |
'date_field': 'pub_date', |
41 |
40 |
}, name='news-index'), |
42 |
||
43 |
url(r'^events/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', |
|
44 |
'object_detail', { |
|
45 |
'queryset': Event.objects.live(), |
|
46 |
'date_field': 'pub_date', |
|
47 |
'slug_field': 'slug', |
|
48 |
'month_format': '%m', |
|
49 |
'day_format': '%d', |
|
50 |
}, name='events-detail'), |
|
51 |
||
52 |
url(r'^events/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', |
|
53 |
'archive_day', { |
|
54 |
'queryset': Event.objects.live(), |
|
55 |
'date_field': 'pub_date', |
|
56 |
'month_format': '%m', |
|
57 |
'day_format': '%d', |
|
58 |
},name='events-day'), |
|
59 |
||
60 |
url(r'^events/(?P<year>\d{4})/(?P<month>\d{2})/$', |
|
61 |
'archive_month', { |
|
62 |
'queryset': Event.objects.live(), |
|
63 |
'date_field': 'pub_date', |
|
64 |
'month_format': '%m', |
|
65 |
}, name='events-month'), |
|
66 |
||
67 |
url(r'^events/(?P<year>\d{4})/$', |
|
68 |
'archive_year', { |
|
69 |
'queryset': Event.objects.live(), |
|
70 |
'date_field': 'pub_date', |
|
71 |
}, name='events-year'), |
|
72 |
||
73 |
url(r'^events/$', |
|
74 |
'archive_index', { |
|
75 |
'queryset': Event.objects.live(), |
|
76 |
'date_field': 'pub_date', |
|
77 |
}, name='events-index'), |
|
78 |
41 |
) |
