/pinax/apps/photos/views.py

https://github.com/ockham/pinax · Python · 312 lines · 227 code · 68 blank · 17 comment · 65 complexity · 61f9dc814c5b7ade0312fb8fe84cfa12 MD5 · raw file

  1. from django.db.models import Q
  2. from django.core.exceptions import ObjectDoesNotExist
  3. from django.core.urlresolvers import reverse
  4. from django.http import Http404, HttpResponseRedirect, get_host
  5. from django.shortcuts import render_to_response, get_object_or_404
  6. from django.template import RequestContext
  7. from django.utils.translation import ugettext, ugettext_lazy as _
  8. from django.contrib import messages
  9. from django.contrib.auth.models import User
  10. from django.contrib.auth.decorators import login_required
  11. from photologue.models import *
  12. from pinax.apps.photos.models import Image, Pool
  13. from pinax.apps.photos.forms import PhotoUploadForm, PhotoEditForm
  14. @login_required
  15. def upload(request, form_class=PhotoUploadForm,
  16. template_name="photos/upload.html", group_slug=None, bridge=None):
  17. """
  18. upload form for photos
  19. """
  20. if bridge:
  21. try:
  22. group = bridge.get_group(group_slug)
  23. except ObjectDoesNotExist:
  24. raise Http404
  25. else:
  26. group = None
  27. photo_form = form_class()
  28. if request.method == "POST":
  29. if request.POST.get("action") == "upload":
  30. photo_form = form_class(request.user, request.POST, request.FILES)
  31. if photo_form.is_valid():
  32. photo = photo_form.save(commit=False)
  33. photo.member = request.user
  34. photo.save()
  35. # in group context we create a Pool object for it
  36. if group:
  37. pool = Pool()
  38. pool.photo = photo
  39. group.associate(pool)
  40. pool.save()
  41. messages.add_message(request, messages.SUCCESS,
  42. ugettext("Successfully uploaded photo '%s'") % photo.title
  43. )
  44. include_kwargs = {"id": photo.id}
  45. if group:
  46. redirect_to = bridge.reverse("photo_details", group, kwargs=include_kwargs)
  47. else:
  48. redirect_to = reverse("photo_details", kwargs=include_kwargs)
  49. return HttpResponseRedirect(redirect_to)
  50. return render_to_response(template_name, {
  51. "group": group,
  52. "photo_form": photo_form,
  53. }, context_instance=RequestContext(request))
  54. @login_required
  55. def yourphotos(request, template_name="photos/yourphotos.html", group_slug=None, bridge=None):
  56. """
  57. photos for the currently authenticated user
  58. """
  59. if bridge:
  60. try:
  61. group = bridge.get_group(group_slug)
  62. except ObjectDoesNotExist:
  63. raise Http404
  64. else:
  65. group = None
  66. photos = Image.objects.filter(member=request.user)
  67. if group:
  68. photos = group.content_objects(photos, join="pool")
  69. else:
  70. photos = photos.filter(pool__object_id=None)
  71. photos = photos.order_by("-date_added")
  72. return render_to_response(template_name, {
  73. "group": group,
  74. "photos": photos,
  75. }, context_instance=RequestContext(request))
  76. @login_required
  77. def photos(request, template_name="photos/latest.html", group_slug=None, bridge=None):
  78. """
  79. latest photos
  80. """
  81. if bridge:
  82. try:
  83. group = bridge.get_group(group_slug)
  84. except ObjectDoesNotExist:
  85. raise Http404
  86. else:
  87. group = None
  88. photos = Image.objects.filter(
  89. Q(is_public=True) |
  90. Q(is_public=False, member=request.user)
  91. )
  92. if group:
  93. photos = group.content_objects(photos, join="pool")
  94. else:
  95. photos = photos.filter(pool__object_id=None)
  96. photos = photos.order_by("-date_added")
  97. return render_to_response(template_name, {
  98. "group": group,
  99. "photos": photos,
  100. }, context_instance=RequestContext(request))
  101. @login_required
  102. def details(request, id, template_name="photos/details.html", group_slug=None, bridge=None):
  103. """
  104. show the photo details
  105. """
  106. if bridge:
  107. try:
  108. group = bridge.get_group(group_slug)
  109. except ObjectDoesNotExist:
  110. raise Http404
  111. else:
  112. group = None
  113. photos = Image.objects.all()
  114. if group:
  115. photos = group.content_objects(photos, join="pool")
  116. else:
  117. photos = photos.filter(pool__object_id=None)
  118. photo = get_object_or_404(photos, id=id)
  119. # @@@: test
  120. if not photo.is_public and request.user != photo.member:
  121. raise Http404
  122. photo_url = photo.get_display_url()
  123. title = photo.title
  124. host = "http://%s" % get_host(request)
  125. if photo.member == request.user:
  126. is_me = True
  127. else:
  128. is_me = False
  129. return render_to_response(template_name, {
  130. "group": group,
  131. "host": host,
  132. "photo": photo,
  133. "photo_url": photo_url,
  134. "is_me": is_me,
  135. }, context_instance=RequestContext(request))
  136. @login_required
  137. def memberphotos(request, username, template_name="photos/memberphotos.html", group_slug=None, bridge=None):
  138. """
  139. Get the members photos and display them
  140. """
  141. if bridge:
  142. try:
  143. group = bridge.get_group(group_slug)
  144. except ObjectDoesNotExist:
  145. raise Http404
  146. else:
  147. group = None
  148. user = get_object_or_404(User, username=username)
  149. photos = Image.objects.filter(
  150. member__username = username,
  151. is_public = True,
  152. )
  153. if group:
  154. photos = group.content_objects(photos, join="pool")
  155. else:
  156. photos = photos.filter(pool__object_id=None)
  157. photos = photos.order_by("-date_added")
  158. return render_to_response(template_name, {
  159. "group": group,
  160. "photos": photos,
  161. }, context_instance=RequestContext(request))
  162. @login_required
  163. def edit(request, id, form_class=PhotoEditForm,
  164. template_name="photos/edit.html", group_slug=None, bridge=None):
  165. if bridge:
  166. try:
  167. group = bridge.get_group(group_slug)
  168. except ObjectDoesNotExist:
  169. raise Http404
  170. else:
  171. group = None
  172. photos = Image.objects.all()
  173. if group:
  174. photos = group.content_objects(photos, join="pool")
  175. else:
  176. photos = photos.filter(pool__object_id=None)
  177. photo = get_object_or_404(photos, id=id)
  178. photo_url = photo.get_display_url()
  179. if request.method == "POST":
  180. if photo.member != request.user:
  181. message.add_message(request, messages.ERROR,
  182. ugettext("You can't edit photos that aren't yours")
  183. )
  184. include_kwargs = {"id": photo.id}
  185. if group:
  186. redirect_to = bridge.reverse("photo_details", group, kwargs=include_kwargs)
  187. else:
  188. redirect_to = reverse("photo_details", kwargs=include_kwargs)
  189. return HttpResponseRedirect(reverse('photo_details', args=(photo.id,)))
  190. if request.POST["action"] == "update":
  191. photo_form = form_class(request.user, request.POST, instance=photo)
  192. if photo_form.is_valid():
  193. photoobj = photo_form.save(commit=False)
  194. photoobj.save()
  195. messages.add_message(request, messages.SUCCESS,
  196. ugettext("Successfully updated photo '%s'") % photo.title
  197. )
  198. include_kwargs = {"id": photo.id}
  199. if group:
  200. redirect_to = bridge.reverse("photo_details", group, kwargs=include_kwargs)
  201. else:
  202. redirect_to = reverse("photo_details", kwargs=include_kwargs)
  203. return HttpResponseRedirect(redirect_to)
  204. else:
  205. photo_form = form_class(instance=photo)
  206. else:
  207. photo_form = form_class(instance=photo)
  208. return render_to_response(template_name, {
  209. "group": group,
  210. "photo_form": photo_form,
  211. "photo": photo,
  212. "photo_url": photo_url,
  213. }, context_instance=RequestContext(request))
  214. @login_required
  215. def destroy(request, id, group_slug=None, bridge=None):
  216. if bridge:
  217. try:
  218. group = bridge.get_group(group_slug)
  219. except ObjectDoesNotExist:
  220. raise Http404
  221. else:
  222. group = None
  223. photos = Image.objects.all()
  224. if group:
  225. photos = group.content_objects(photos, join="pool")
  226. else:
  227. photos = photos.filter(pool__object_id=None)
  228. photo = get_object_or_404(photos, id=id)
  229. title = photo.title
  230. if group:
  231. redirect_to = bridge.reverse("photos_yours", group)
  232. else:
  233. redirect_to = reverse("photos_yours")
  234. if photo.member != request.user:
  235. message.add_message(request, messages.ERROR,
  236. ugettext("You can't edit photos that aren't yours")
  237. )
  238. return HttpResponseRedirect(redirect_to)
  239. if request.method == "POST" and request.POST["action"] == "delete":
  240. photo.delete()
  241. messages.add_message(request, messages.SUCCESS,
  242. ugettext("Successfully deleted photo '%s'") % title
  243. )
  244. return HttpResponseRedirect(redirect_to)