richleland / django-happening

a collection of news and events focused django apps.

Changed (Δ5.6 KB):

raw changeset »

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."

Up to file-list happening/news/templatetags/news_tags.py:

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.models import Event, NewsItem
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.models import Event, NewsItem
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
)