root/trunk/blog/views.py

Revision 58, 8.9 kB (checked in by nobu, 8 months ago)
  • Djangoのリビジョン7378に対応。
Line 
1 # vim: encoding=utf-8 :
2
3 import datetime
4 import time
5 from urllib import quote, unquote
6
7 from django.core.paginator import Paginator, QuerySetPaginator, InvalidPage
8 from django.core.urlresolvers import reverse
9 from django.db.models.query import QuerySet
10 from django.http import HttpResponse, HttpResponseRedirect, Http404
11 from django.template import loader, RequestContext
12 from django.utils.translation import ugettext_lazy as _
13
14 from blog.models import Tag, Entry, Comment, TrackBack
15 from blog.forms import CommentForm, TrackBackForm
16
17 DEFAULT_PAGINATION_PER_PAGE = 10
18
19
20 def _create_pagination(obj_list, page, per_page=DEFAULT_PAGINATION_PER_PAGE,
21                        orphans=0, allow_empty_first_page=True):
22     if isinstance(obj_list, QuerySet):
23         PageClass = QuerySetPaginator
24     else:
25         PageClass = Paginator
26     try:
27         paginator = PageClass(obj_list, per_page, orphans, allow_empty_first_page)
28         page_obj = paginator.page(page)
29         results = page_obj.object_list
30     except InvalidPage:
31         page_obj = None
32         results = []
33     return page_obj, results
34
35
36 def entry_list(request):
37     """
38     Show entry list.
39     """
40     queryset = Entry.objects.filter(is_published__exact=True)\
41                             .filter(is_active__exact=True)
42     page = request.GET.get('page', 1)
43     page_obj, obj_list = _create_pagination(queryset, page)
44     c = RequestContext(request, {
45         'obj_list': obj_list,
46         'page_obj': page_obj,
47         'title': _(u'Latest entries'),
48     })
49     t = loader.get_template('blog/entry_list.html')
50     return HttpResponse(t.render(c))
51
52
53 def entry_tag(request, label):
54     """
55     """
56     try:
57         obj = Tag.objects.get(label__iexact=label)
58     except Tag.DoesNotExist:
59         raise Http404
60     queryset = obj.entry_set.filter(is_published__exact=True)\
61                             .filter(is_active__exact=True)
62     page = request.GET.get('page', 1)
63     page_obj, obj_list = _create_pagination(queryset, page)
64     c = RequestContext(request, {
65         'current_tag': obj,
66         'obj_list': obj_list,
67         'page_obj': page_obj,
68         'title': _(u'Tag/%s') % obj.label,
69     })
70     t = loader.get_template('blog/entry_list.html')
71     return HttpResponse(t.render(c))
72
73
74 def entry_search(request, query=None):
75     """
76     Show search results.
77     """
78     if query is None:
79         query = request.GET.get('query', u'')
80         if len(query):
81             query = quote(query.encode('utf-8'))
82             return HttpResponseRedirect(reverse('blog_entry_search_keyword', args=[query]))
83     encoded = unquote(query.encode('utf-8'))
84     query = unicode(encoded, 'utf-8')
85     if len(query):
86         queryset = Entry.objects.filter(description__search=u'*D+ %s' % query)\
87                                 .filter(is_published__exact=True)\
88                                 .filter(is_active__exact=True)
89     else:
90         queryset = []
91     page = request.GET.get('page', 1)
92     page_obj, obj_list = _create_pagination(queryset, page)
93     c = RequestContext(request, {
94         'obj_list': obj_list,
95         'page_obj': page_obj,
96         'query': query,
97         'title': _(u'Search/%s') % query,
98     })
99     t = loader.get_template('blog/entry_list.html')
100     return HttpResponse(t.render(c))
101
102
103 def entry_from_id(request, obj_id):
104     """
105     Show entry detail (login required).
106     """
107     if not request.user.is_authenticated():
108         raise Http404
109     try:
110         obj = Entry.objects.get(pk=obj_id)
111     except Entry.DoesNotExist:
112         raise Http404
113     c = RequestContext(request, {'obj': obj})
114     t = loader.get_template('blog/entry_detail.html')
115     return HttpResponse(t.render(c))
116
117
118 def entry_detail(request, year, month, day, slug):
119     """
120     Show entry detail.
121     """
122     try:
123         date = datetime.date(*time.strptime(year+month+day, '%Y%m%d')[:3])
124     except ValueError:
125         raise Http404
126     date_range = (
127         datetime.datetime.combine(date, datetime.time.min),
128         datetime.datetime.combine(date, datetime.time.max),
129     )
130     try:
131         obj = Entry.objects.filter(slug__exact=slug)\
132                            .filter(published_at__range=date_range)\
133                            .filter(is_published__exact=True)\
134                            .get(is_active__exact=True)
135     except Entry.DoesNotExist:
136         raise Http404
137     status_code = 200
138     form = CommentForm(request.POST.copy() or None, auto_id='comment-%s')
139     if request.method == 'POST':
140         if form.is_valid():
141             comment = form.save(commit=False)
142             comment.entry = obj
143             comment.save()
144             return HttpResponseRedirect(comment.get_absolute_url())
145         else:
146             status_code = 403
147     c = RequestContext(request, {
148         'form': form,
149         'obj': obj,
150     })
151     t = loader.get_template('blog/entry_detail.html')
152     return HttpResponse(t.render(c), status=status_code)
153
154
155 def trackback_create(request, year, month, day, slug):
156     """
157     Add new track back.
158     """
159     try:
160         date = datetime.date(*time.strptime(year+month+day, '%Y%m%d')[:3])
161     except ValueError:
162         raise Http404
163     date_range = (
164         datetime.datetime.combine(date, datetime.time.min),
165         datetime.datetime.combine(date, datetime.time.max),
166     )
167     try:
168         obj = Entry.objects.filter(slug__exact=slug)\
169                            .filter(published_at__range=date_range)\
170                            .filter(is_published__exact=True)\
171                            .get(is_active__exact=True)
172     except Entry.DoesNotExist:
173         raise Http404
174     if request.method == 'GET':
175         return HttpResponseRedirect(obj.get_absolute_url())
176     data = request.POST.copy()
177     data.update({'entry': obj.id})
178     form = TrackBackForm(data)
179     if form.is_valid():
180         trackback = form.save()
181         status_code = 200
182         c = RequestContext(request, {'error': 0})
183     else:
184         status_code = 403
185         c = RequestContext(request, {
186             'error': 1,
187             'message': _(u'Your request has been rejected, because it was invalid.')
188         })
189     t = loader.get_template('blog/trackback_response.xml')
190     return HttpResponse(t.render(c), status=status_code)
191
192
193 def archive_day(request, year, month, day):
194     """
195     Show day archive.
196     """
197     try:
198         date = datetime.date(*time.strptime(year+month+day, '%Y%m%d')[:3])
199     except ValueError:
200         raise Http404
201     date_range = (
202         datetime.datetime.combine(date, datetime.time.min),
203         datetime.datetime.combine(date, datetime.time.max),
204     )
205     queryset = Entry.objects.filter(published_at__range=date_range)\
206                             .filter(is_published__exact=True)\
207                             .filter(is_active__exact=True)
208     page = request.GET.get('page', 1)
209     page_obj, obj_list = _create_pagination(queryset, page)
210     c = RequestContext(request, {
211         'obj_list': obj_list,
212         'page_obj': page_obj,
213         'title': _(u'Archive@%s') % date.strftime('%Y/%m/%d'),
214     })
215     t = loader.get_template('blog/entry_list.html')
216     return HttpResponse(t.render(c))
217
218
219 def archive_month(request, year, month):
220     """
221     Show month archive.
222     """
223     try:
224         firstday = datetime.date(*time.strptime(year+month, '%Y%m')[:3])
225     except ValueError:
226         raise Http404
227     for i in range(31, 0, -1):
228         try:
229             lastday = firstday.replace(day=i)
230             break
231         except:
232             pass
233     date_range = (
234         datetime.datetime.combine(firstday, datetime.time.min),
235         datetime.datetime.combine(lastday, datetime.time.max),
236     )
237     queryset = Entry.objects.filter(published_at__range=date_range)\
238                             .filter(is_published__exact=True)\
239                             .filter(is_active__exact=True)
240     page = request.GET.get('page', 1)
241     page_obj, obj_list = _create_pagination(queryset, page)
242     c = RequestContext(request, {
243         'obj_list': obj_list,
244         'page_obj': page_obj,
245         'title': _(u'Archive@%s') % firstday.strftime('%Y/%m'),
246     })
247     t = loader.get_template('blog/entry_list.html')
248     return HttpResponse(t.render(c))
249
250
251 def archive_year(request, year):
252     """
253     Show year archive.
254     """
255     try:
256         firstday = datetime.date(*time.strptime(year, '%Y')[:3])
257     except ValueError:
258         raise Http404
259     lastday = firstday.replace(month=12, day=31)
260     date_range = (
261         datetime.datetime.combine(firstday, datetime.time.min),
262         datetime.datetime.combine(lastday, datetime.time.max),
263     )
264     queryset = Entry.objects.filter(published_at__range=date_range)\
265                             .filter(is_published__exact=True)\
266                             .filter(is_active__exact=True)
267     page = request.GET.get('page', 1)
268     page_obj, obj_list = _create_pagination(queryset, page)
269     c = RequestContext(request, {
270         'obj_list': obj_list,
271         'page_obj': page_obj,
272         'title': _(u'Archive@%s') % firstday.year,
273     })
274     t = loader.get_template('blog/entry_list.html')
275     return HttpResponse(t.render(c))
Note: See TracBrowser for help on using the browser.