root/trunk/djedna/catalog2/views.py

Revision 494, 19.6 kB (checked in by thomas, 5 months ago)

Added ImageFile? templates, views, and tests

Line 
1 # (c) Copyright 2008 Thomas Bohmbach, Jr.
2 #
3 # This file is part of DJ Edna.
4 #
5 # DJ Edna is free software: you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free
7 # Software Foundation, either version 3 of the License, or (at your option)
8 # any later version.
9 #
10 # DJ Edna is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13 # more details.
14 #
15 # You should have received a copy of the GNU General Public License along with
16 # DJ Edna.  If not, see <http://www.gnu.org/licenses/>.
17
18 import logging as log
19 import mimetypes
20 import os
21
22 from django.conf import settings
23 from django.contrib.auth.decorators import login_required
24 from django.contrib.auth.models import User, Group
25 from django.contrib.sites.models import Site, RequestSite
26 from django.core.urlresolvers import reverse
27 from django.http import HttpResponse, HttpResponseRedirect
28 from django.template import loader, Context, RequestContext
29 from django.template import TemplateDoesNotExist
30 from django.shortcuts import render_to_response, get_object_or_404
31 from django.utils.http import urlquote
32 from django.views.generic.list_detail import object_list, object_detail
33 from django.views import static
34
35 from djedna.catalog2.forms import LocalPathTrackFileForm, UploadTrackFileForm
36 from djedna.catalog2.forms import UploadImageFileForm
37 from djedna.catalog2.forms import get_track_form
38 from djedna.catalog2.models import TrackFile, Track, ImageFile
39
40
41 def trackfile_list(
42         request, queryset=None, paginate_by=None, page=None,
43         allow_empty=True, template_name='catalog2/trackfile_list.html',
44         template_loader=loader, extra_context=None, context_processors=None,
45         template_object_name='trackfile', mimetype=None
46     ):
47     """
48     Generic list of TrackFiles.
49     
50     Templates: ``catalog2/trackfile_list.html``
51     Context:
52         trackfile_list
53             list of trackfiles
54         is_paginated
55             are the results paginated?
56         results_per_page
57             number of trackfiles per page (if paginated)
58         has_next
59             is there a next page?
60         has_previous
61             is there a prev page?
62         page
63             the current page
64         next
65             the next page
66         previous
67             the previous page
68         pages
69             number of pages, total
70         hits
71             number of trackfiles, total
72         last_on_page
73             the result number of the last of trackfile in the
74             trackfile_list (1-indexed)
75         first_on_page
76             the result number of the first trackfile in the
77             trackfile_list (1-indexed)
78         page_range:
79             A list of the page numbers (1-indexed).
80     """
81     if queryset == None:
82         queryset = TrackFile.on_site.all()
83     return object_list(
84         request, queryset, paginate_by=paginate_by, page=page,
85         allow_empty=allow_empty, template_name=template_name,
86         template_loader=template_loader, extra_context=extra_context,
87         context_processors=context_processors,
88         template_object_name=template_object_name, mimetype=mimetype
89     )
90
91 def trackfile_detail(
92         request, trackfile_id=None, queryset=None,
93         template_name='catalog2/trackfile_detail.html',
94         template_loader=loader, extra_context=None,
95         context_processors=None, template_object_name='trackfile',
96         mimetype=None
97     ):
98     """
99     Generic detail of a TrackFile.
100     
101     Templates: ``<app_label>/<model_name>_detail.html``
102     Context:
103         trackfile
104             the trackfile
105     """
106     trackfile = get_object_or_404(TrackFile, pk=trackfile_id)
107     if queryset == None:
108         queryset = TrackFile.on_site.all()
109     if trackfile.mimetype:
110         mimetype_ext = mimetypes.guess_extension(trackfile.mimetype)
111         if mimetype_ext:
112             mimetype_ext = mimetype_ext[1:] # Drop the leading '.'
113             template_base, template_ext = os.path.splitext(template_name)
114             ext_template_name = '%s_%s%s' % (template_base,
115                                              mimetype_ext,
116                                              template_ext)
117             try:
118                 loader.get_template(ext_template_name)
119                 template_name = ext_template_name
120             except TemplateDoesNotExist, tdne:
121                 pass
122     return object_detail(
123         request, queryset, object_id=trackfile_id,
124         template_name=template_name, template_loader=loader,
125         extra_context=extra_context, context_processors=context_processors,
126         template_object_name=template_object_name, mimetype=mimetype
127     )
128
129 def trackfile_import(
130         request, next_page=None,
131         template_name='catalog2/trackfile_import.html',
132         template_loader=loader, extra_context=None, context_processors=None,
133         template_form_name='form'
134     ):
135     next_page = next_page or request.POST.get('next_page', '')
136     if request.method == 'POST':
137         form = LocalPathTrackFileForm(data=request.POST)
138         if form.is_valid():
139             path = form.path
140             if path:
141                 group_hash = TrackFile.objects.add_from_path(path) or 'none'
142                 if not next_page:
143                     next_page = reverse(
144                         'djedna_trackfile_import_result',
145                         kwargs={'group_hash' : group_hash}
146                     )
147                 return HttpResponseRedirect(next_page)
148     else:
149         form = LocalPathTrackFileForm()
150     t = template_loader.get_template(template_name)
151     c = RequestContext(request,
152                        {template_form_name: form,
153                         'next_page' : next_page},
154                        context_processors)
155     if extra_context is None: extra_context = {}
156     for key, value in extra_context.items():
157         if callable(value):
158             c[key] = value()
159         else:
160             c[key] = value
161     return HttpResponse(t.render(c))
162
163 def trackfile_import_result(
164         request, group_hash=None, paginate_by=None, page=None,
165         allow_empty=True,
166         template_name='catalog2/trackfile_import_result.html',
167         template_loader=loader, extra_context=None, context_processors=None,
168         template_object_name='trackfile', mimetype=None
169     ):
170     if group_hash and group_hash != 'none':
171         queryset = TrackFile.objects.filter(group_hash=group_hash)
172     else:
173         queryset = TrackFile.objects.none()
174     return trackfile_list(
175         request, queryset=queryset, paginate_by=paginate_by, page=page,
176         allow_empty=allow_empty, template_name=template_name,
177         template_loader=template_loader, extra_context=extra_context,
178         context_processors=context_processors,
179         template_object_name=template_object_name, mimetype=mimetype
180     )
181
182 def trackfile_upload(
183         request, track=None, next_page=None,
184         template_name='catalog2/trackfile_upload.html',
185         template_loader=loader, extra_context=None,
186         context_processors=None, template_form_name='form'
187     ):
188     next_page = next_page or request.REQUEST.get('next_page', '')
189     if request.method == 'POST':
190         form = UploadTrackFileForm(request.POST, request.FILES)
191         if form.is_valid():
192             trackfile_upload = form.save()
193             if request.user.is_authenticated():
194                 trackfile_upload.user = request.user
195                 trackfile_upload.save()
196             if track and trackfile_upload.trackfile:
197                 trackfile_upload.trackfile.track = track
198                 trackfile_upload.trackfile.save()
199             if not next_page:
200                 if trackfile_upload.trackfile:
201                     group_hash = trackfile_upload.trackfile.group_hash or 'none'
202                 else:
203                     trackfile_upload.delete()
204                     group_hash = 'none'
205                 next_page = reverse(
206                     'djedna_trackfile_upload_result',
207                     kwargs={'group_hash' : group_hash}
208                 )
209             return HttpResponseRedirect(next_page)
210     else:
211         form = UploadTrackFileForm()
212     t = template_loader.get_template(template_name)
213     c = RequestContext(request,
214                        {template_form_name: form,
215                         'next_page' : next_page},
216                        context_processors)
217     if extra_context is None: extra_context = {}
218     for key, value in extra_context.items():
219         if callable(value):
220             c[key] = value()
221         else:
222             c[key] = value
223     return HttpResponse(t.render(c))
224
225 def trackfile_upload_result(
226         request, group_hash=None, paginate_by=None, page=None,
227         allow_empty=True,
228         template_name='catalog2/trackfile_upload_result.html',
229         template_loader=loader, extra_context=None, context_processors=None,
230         template_object_name='trackfile', mimetype=None
231     ):
232     if group_hash and group_hash != 'none':
233         queryset = TrackFile.objects.filter(group_hash=group_hash)
234     else:
235         queryset = TrackFile.objects.none()
236     return trackfile_list(
237         request, queryset=queryset, paginate_by=paginate_by, page=page,
238         allow_empty=allow_empty, template_name=template_name,
239         template_loader=template_loader, extra_context=extra_context,
240         context_processors=context_processors,
241         template_object_name=template_object_name, mimetype=mimetype
242     )
243
244
245 def imagefile_list(
246         request, queryset=None, paginate_by=None, page=None,
247         allow_empty=True, template_name='catalog2/imagefile_list.html',
248         template_loader=loader, extra_context=None, context_processors=None,
249         template_object_name='imagefile', mimetype=None
250     ):
251     """
252     Generic list of ImageFiles.
253     
254     Templates: ``catalog2/imageile_list.html``
255     Context:
256         imagefile_list
257             list of imagefiles
258         is_paginated
259             are the results paginated?
260         results_per_page
261             number of trackfiles per page (if paginated)
262         has_next
263             is there a next page?
264         has_previous
265             is there a prev page?
266         page
267             the current page
268         next
269             the next page
270         previous
271             the previous page
272         pages
273             number of pages, total
274         hits
275             number of trackfiles, total
276         last_on_page
277             the result number of the last of imagefile in the
278                 imagefile_list (1-indexed)
279         first_on_page
280             the result number of the first imagefile in the
281                 imagefile_list (1-indexed)
282         page_range:
283             A list of the page numbers (1-indexed).
284     """
285     if queryset == None:
286         queryset = ImageFile.on_site.all()
287     return object_list(
288         request, queryset, paginate_by=paginate_by, page=page,
289         allow_empty=allow_empty, template_name=template_name,
290         template_loader=template_loader, extra_context=extra_context,
291         context_processors=context_processors,
292         template_object_name=template_object_name, mimetype=mimetype
293     )
294
295 def imagefile_detail(
296         request, imagefile_id=None, queryset=None,
297         template_name='catalog2/imagefile_detail.html',
298         template_loader=loader, extra_context=None,
299         context_processors=None, template_object_name='imagefile',
300         mimetype=None
301     ):
302     """
303     Generic detail of an ImageFile.
304     
305     Templates: ``<app_label>/<model_name>_detail.html``
306     Context:
307         imagefile
308             the imagefile
309     """
310     imagefile = get_object_or_404(ImageFile, pk=imagefile_id)
311     if queryset == None:
312         queryset = ImageFile.on_site.all()
313     if imagefile.mimetype:
314         mimetype_ext = mimetypes.guess_extension(imagefile.mimetype)
315         if mimetype_ext:
316             mimetype_ext = mimetype_ext[1:] # Drop the leading '.'
317             template_base, template_ext = os.path.splitext(template_name)
318             ext_template_name = '%s_%s%s' % (template_base,
319                                              mimetype_ext,
320                                              template_ext)
321             try:
322                 loader.get_template(ext_template_name)
323                 template_name = ext_template_name
324             except TemplateDoesNotExist, tdne:
325                 pass
326     return object_detail(
327         request, queryset, object_id=imagefile_id,
328         template_name=template_name, template_loader=loader,
329         extra_context=extra_context, context_processors=context_processors,
330         template_object_name=template_object_name, mimetype=mimetype
331     )
332
333 def imagefile_upload(
334         request, next_page=None,
335         template_name='catalog2/imagefile_upload.html',
336         template_loader=loader, extra_context=None,
337         context_processors=None, template_form_name='form'
338     ):
339     next_page = next_page or request.REQUEST.get('next_page', '')
340     if request.method == 'POST':
341         form = UploadImageFileForm(request.POST, request.FILES)
342         if form.is_valid():
343             imagefile_upload = form.save()
344             if request.user.is_authenticated():
345                 imagefile_upload.user = request.user
346                 imagefile_upload.save()
347             if not next_page:
348                 if imagefile_upload.imagefile:
349                     group_hash = imagefile_upload.imagefile.group_hash or 'none'
350                 else:
351                     imagefile_upload.delete()
352                     group_hash = 'none'
353                 next_page = reverse(
354                     'djedna_imagefile_upload_result',
355                     kwargs={'group_hash' : group_hash}
356                 )
357             return HttpResponseRedirect(next_page)
358     else:
359         form = UploadImageFileForm()
360     t = template_loader.get_template(template_name)
361     c = RequestContext(request,
362                        {template_form_name: form,
363                         'next_page' : next_page},
364                        context_processors)
365     if extra_context is None: extra_context = {}
366     for key, value in extra_context.items():
367         if callable(value):
368             c[key] = value()
369         else:
370             c[key] = value
371     return HttpResponse(t.render(c))
372
373 def imagefile_upload_result(
374         request, group_hash=None, paginate_by=None, page=None,
375         allow_empty=True,
376         template_name='catalog2/imagefile_upload_result.html',
377         template_loader=loader, extra_context=None, context_processors=None,
378         template_object_name='imagefile', mimetype=None
379     ):
380     if group_hash and group_hash != 'none':
381         queryset = ImageFile.objects.filter(group_hash=group_hash)
382     else:
383         queryset = ImageFile.objects.none()
384     return imagefile_list(
385         request, queryset=queryset, paginate_by=paginate_by, page=page,
386         allow_empty=allow_empty, template_name=template_name,
387         template_loader=template_loader, extra_context=extra_context,
388         context_processors=context_processors,
389         template_object_name=template_object_name, mimetype=mimetype
390     )
391
392
393 def track_list(
394         request, queryset=None, paginate_by=None, page=None,
395         allow_empty=True, template_name='catalog2/track_list.html',
396         template_loader=loader, extra_context=None, context_processors=None,
397         template_object_name='track', mimetype=None
398     ):
399     """
400     Generic list of Tracks.
401     
402     Templates: ``catalog2/track_list.html``
403     Context:
404         track_list
405             list of tracks
406         is_paginated
407             are the results paginated?
408         results_per_page
409             number of tracks per page (if paginated)
410         has_next
411             is there a next page?
412         has_previous
413             is there a prev page?
414         page
415             the current page
416         next
417             the next page
418         previous
419             the previous page
420         pages
421             number of pages, total
422         hits
423             number of objects, total
424         last_on_page
425             the result number of the last of object in the
426             track_list (1-indexed)
427         first_on_page
428             the result number of the first track in the
429             track_list (1-indexed)
430         page_range:
431             A list of the page numbers (1-indexed).
432     """
433     if queryset == None:
434         queryset = Track.on_site.all()
435     return object_list(
436         request, queryset, paginate_by=paginate_by, page=page,
437         allow_empty=allow_empty, template_name=template_name,
438         template_loader=template_loader, extra_context=extra_context,
439         context_processors=context_processors,
440         template_object_name=template_object_name, mimetype=mimetype
441     )
442
443 def track_detail(
444         request, track_slug=None, queryset=None,
445         template_name='catalog2/track_detail.html',
446         template_loader=loader, extra_context=None,
447         context_processors=None, template_object_name='track',
448         mimetype=None
449     ):
450     """
451     Generic detail of a Track.
452     
453     Templates: ``<app_label>/<model_name>_detail.html``
454     Context:
455         track
456             the track
457     """
458     track = get_object_or_404(Track, slug=track_slug)
459     if queryset == None:
460         queryset = Track.on_site.all()
461     return object_detail(
462         request, queryset, object_id=track.id,
463         template_name=template_name, template_loader=loader,
464         extra_context=extra_context, context_processors=context_processors,
465         template_object_name=template_object_name, mimetype=mimetype
466     )
467
468 def track_create(
469         request, initial=None, next_page=None,
470         template_name='catalog2/track_create.html',
471         template_loader=loader, extra_context=None, context_processors=None,
472         template_form_name='form'
473     ):
474     pass
475
476 def track_create_from_trackfile(
477         request, trackfile=None, next_page=None,
478         template_name='catalog2/track_create.html',
479         template_loader=loader, extra_context=None, context_processors=None,
480         template_form_name='form'
481     ):
482     pass
483
484 def track_update(
485         request, track_slug=None, next_page=None,
486         template_name='catalog2/track_update.html',
487         template_loader=loader, extra_context=None, context_processors=None,
488         template_form_name='form'
489     ):
490     track = get_object_or_404(Track, slug=track_slug)
491     next_page = next_page or request.POST.get('next_page', '')
492     if request.method == 'POST':
493         form = get_track_form(instance=track, data=request.POST)
494         if form.is_valid():
495             form.save()
496             track.trackfiles = form.cleaned_data['trackfiles']
497             if not next_page:
498                 next_page = reverse(
499                     'djedna_track_detail',
500                     kwargs={'track_slug' : track.slug}
501                 )
502             return HttpResponseRedirect(next_page)
503     else:
504         data = {
505             'trackfiles' :
506                 [trackfile.id for trackfile in track.trackfiles.all()],
507         }
508         form = get_track_form(initial=data, instance=track)
509     t = template_loader.get_template(template_name)
510     c = RequestContext(request,
511                        {template_form_name: form,
512                         'next_page' : next_page},
513                        context_processors)
514     if extra_context is None: extra_context = {}
515     for key, value in extra_context.items():
516         if callable(value):
517             c[key] = value()
518         else:
519             c[key] = value
520     return HttpResponse(t.render(c))
521
522 def track_upload(
523         request, track_slug=None, next_page=None,
524         template_name='catalog2/trackfile_upload.html',
525         template_loader=loader, extra_context=None,
526         context_processors=None, template_form_name='form'
527     ):
528     track = get_object_or_404(Track, slug=track_slug)
529     return trackfile_upload(
530         request, track=track, next_page=next_page,
531         template_name=template_name,
532         template_loader=loader, extra_context=extra_context,
533         context_processors=context_processors,
534         template_form_name=template_form_name
535     )
Note: See TracBrowser for help on using the browser.