PageRenderTime 68ms CodeModel.GetById 49ms RepoModel.GetById 0ms app.codeStats 1ms

/views/snippets.py

http://cab.googlecode.com/
Python | 214 lines | 184 code | 9 blank | 21 comment | 4 complexity | 4b85529ac5295c38da3b90ee1e01246f MD5 | raw file
Possible License(s): BSD-3-Clause
  1. """
  2. Views which work with Snippets, allowing them to be added, modified,
  3. rated and viewed according to various criteria.
  4. """
  5. from django.http import HttpResponse, HttpResponseRedirect
  6. from django.shortcuts import get_object_or_404, render_to_response
  7. from django.template import RequestContext
  8. from django.views.generic import list_detail
  9. from django.contrib.auth.decorators import login_required
  10. from django.contrib.auth.models import User
  11. from cab import forms
  12. from cab.models import Language, Rating, Snippet, Tag
  13. from bookmarks import base_generic_dict
  14. def add_snippet(request):
  15. """
  16. Allows a user to add a Snippet to the database.
  17. Context::
  18. form
  19. The form to add the Snippet.
  20. Template::
  21. cab/add_snippet_form.html
  22. """
  23. original_id = request.GET.get('oid', None)
  24. if request.method == 'POST':
  25. form = forms.AddSnippetForm(request.POST)
  26. if form.is_valid():
  27. new_snippet = Snippet(title=form.clean_data['title'],
  28. description=form.clean_data['description'],
  29. code=form.clean_data['code'],
  30. tag_list=form.clean_data['tag_list'],
  31. language_id=form.clean_data['language'],
  32. author=request.user)
  33. if original_id:
  34. new_snippet.original_id = original_id
  35. new_snippet.save()
  36. return HttpResponseRedirect(new_snippet.get_absolute_url())
  37. else:
  38. form = forms.AddSnippetForm()
  39. return render_to_response('cab/add_snippet_form.html',
  40. { 'form': form },
  41. context_instance=RequestContext(request))
  42. add_snippet = login_required(add_snippet)
  43. def download(request, snippet_id):
  44. """
  45. Allows a user to download a Snippet's code.
  46. Context::
  47. None, returns a downloadable file.
  48. Template::
  49. None, returns a downloadable file.
  50. """
  51. snippet = get_object_or_404(Snippet, pk=snippet_id)
  52. response = HttpResponse(snippet.code, mimetype='text/plain')
  53. response['Content-Disposition'] = 'attachment; filename=%s.%s' % (snippet.id,
  54. snippet.language.file_extension)
  55. response['Content-Type'] = snippet.language.mime_type
  56. return response
  57. def edit_snippet(request, snippet_id):
  58. """
  59. Allows a user to edit an existing Snippet.
  60. Context::
  61. form
  62. The form to add the Snippet.
  63. original
  64. The Snippet being edited.
  65. Template::
  66. cab/edit_snippet_form.html
  67. """
  68. snippet = get_object_or_404(Snippet,
  69. pk=snippet_id,
  70. author__pk=request.user.id)
  71. if request.method == 'POST':
  72. form = forms.EditSnippetForm(request.POST)
  73. if form.is_valid():
  74. for field in ['title', 'description', 'code', 'tag_list']:
  75. setattr(snippet, field, form.clean_data[field])
  76. snippet.save()
  77. return HttpResponseRedirect(snippet.get_absolute_url())
  78. else:
  79. form = forms.EditSnippetForm(snippet.__dict__)
  80. return render_to_response('cab/edit_snippet_form.html',
  81. { 'form': form,
  82. 'original': snippet },
  83. context_instance=RequestContext(request))
  84. edit_snippet = login_required(edit_snippet)
  85. def rate_snippet(request, snippet_id):
  86. """
  87. Allows a user to rate a Snippet.
  88. Context::
  89. None, returns a redirect back to the Snippet.
  90. Template::
  91. None, returns a redirect back to the Snippet.
  92. """
  93. snippet = get_object_or_404(Snippet, pk=snippet_id)
  94. if not Rating.objects.already_rated(request.user.id, snippet.id):
  95. score = request.GET.get('score')
  96. if score:
  97. rating = Rating.objects.create(snippet=snippet,
  98. user=request.user,
  99. score={ 'up': 1,
  100. 'down': -1 }[score])
  101. return HttpResponseRedirect(snippet.get_absolute_url())
  102. rate_snippet = login_required(rate_snippet)
  103. def snippets_by_author(request, username):
  104. """
  105. List of Snippets submitted by a particular User.
  106. Context::
  107. Same as the generic ``list_detail.object_list`` view, with
  108. one extra variable:
  109. object
  110. The User
  111. Template::
  112. cab/user_detail.html
  113. """
  114. user = get_object_or_404(User, username__exact=username)
  115. return list_detail.object_list(request,
  116. queryset=Snippet.objects.get_by_author(user.username),
  117. extra_context={ 'object': user },
  118. template_name='cab/user_detail.html',
  119. **base_generic_dict)
  120. def snippets_by_language(request, slug):
  121. """
  122. List of Snippets written in a particular Language.
  123. Context::
  124. Same as the generic ``list_detail.object_list`` view, with
  125. one extra variable:
  126. object
  127. The Language
  128. Template::
  129. cab/language_detail.html
  130. """
  131. language = get_object_or_404(Language, slug__exact=slug)
  132. return list_detail.object_list(request,
  133. queryset=Snippet.objects.get_by_language(slug),
  134. extra_context={ 'object': language },
  135. template_name='cab/language_detail.html',
  136. **base_generic_dict)
  137. def snippets_by_tag(request, slug):
  138. """
  139. List of Snippets with a particular Tag.
  140. Context::
  141. Same as the generic ``list_detail.object_list`` view, with
  142. one extra variable:
  143. object
  144. The Tag
  145. Template::
  146. cab/tag_detail.html
  147. """
  148. tag = get_object_or_404(Tag, slug__exact=slug)
  149. return list_detail.object_list(request,
  150. queryset=Snippet.objects.get_by_tag(slug),
  151. extra_context={ 'object': tag },
  152. template_name='cab/tag_detail.html',
  153. **base_generic_dict)
  154. def snippet_detail(request, snippet_id):
  155. """
  156. Detail view of a Snippet.
  157. Context::
  158. object
  159. The Snippet object.
  160. num_ratings
  161. The number of Ratings this Snippet has received.
  162. rating_score
  163. The sum of this Snippet's received ratings.
  164. Template::
  165. cab/snippet_detail.html
  166. """
  167. snippet = get_object_or_404(Snippet, pk=snippet_id)
  168. return render_to_response('cab/snippet_detail.html',
  169. { 'object': snippet,
  170. 'num_ratings': snippet.rating_set.count(),
  171. 'rating_score': Rating.objects.score_for_snippet(snippet.id) },
  172. context_instance=RequestContext(request))