views.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. from xml.dom.minidom import parseString
  2. from django.contrib.auth.decorators import login_required, permission_required
  3. from django.core import mail
  4. from django.forms import fields
  5. from django.forms.forms import Form, ValidationError
  6. from django.forms.formsets import formset_factory, BaseFormSet
  7. from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound
  8. from django.shortcuts import render_to_response
  9. from django.template import Context, Template
  10. from django.utils.decorators import method_decorator
  11. from django.utils.six.moves.urllib.parse import urlencode
  12. def get_view(request):
  13. "A simple view that expects a GET request, and returns a rendered template"
  14. t = Template('This is a test. {{ var }} is the value.', name='GET Template')
  15. c = Context({'var': request.GET.get('var', 42)})
  16. return HttpResponse(t.render(c))
  17. def post_view(request):
  18. """A view that expects a POST, and returns a different template depending
  19. on whether any POST data is available
  20. """
  21. if request.method == 'POST':
  22. if request.POST:
  23. t = Template('Data received: {{ data }} is the value.', name='POST Template')
  24. c = Context({'data': request.POST['value']})
  25. else:
  26. t = Template('Viewing POST page.', name='Empty POST Template')
  27. c = Context()
  28. else:
  29. t = Template('Viewing GET page.', name='Empty GET Template')
  30. c = Context()
  31. return HttpResponse(t.render(c))
  32. def view_with_header(request):
  33. "A view that has a custom header"
  34. response = HttpResponse()
  35. response['X-DJANGO-TEST'] = 'Slartibartfast'
  36. return response
  37. def raw_post_view(request):
  38. """A view which expects raw XML to be posted and returns content extracted
  39. from the XML"""
  40. if request.method == 'POST':
  41. root = parseString(request.body)
  42. first_book = root.firstChild.firstChild
  43. title, author = [n.firstChild.nodeValue for n in first_book.childNodes]
  44. t = Template("{{ title }} - {{ author }}", name="Book template")
  45. c = Context({"title": title, "author": author})
  46. else:
  47. t = Template("GET request.", name="Book GET template")
  48. c = Context()
  49. return HttpResponse(t.render(c))
  50. def redirect_view(request):
  51. "A view that redirects all requests to the GET view"
  52. if request.GET:
  53. query = '?' + urlencode(request.GET, True)
  54. else:
  55. query = ''
  56. return HttpResponseRedirect('/test_client/get_view/' + query)
  57. def view_with_secure(request):
  58. "A view that indicates if the request was secure"
  59. response = HttpResponse()
  60. response.test_was_secure_request = request.is_secure()
  61. return response
  62. def double_redirect_view(request):
  63. "A view that redirects all requests to a redirection view"
  64. return HttpResponseRedirect('/test_client/permanent_redirect_view/')
  65. def bad_view(request):
  66. "A view that returns a 404 with some error content"
  67. return HttpResponseNotFound('Not found!. This page contains some MAGIC content')
  68. TestChoices = (
  69. ('a', 'First Choice'),
  70. ('b', 'Second Choice'),
  71. ('c', 'Third Choice'),
  72. ('d', 'Fourth Choice'),
  73. ('e', 'Fifth Choice')
  74. )
  75. class TestForm(Form):
  76. text = fields.CharField()
  77. email = fields.EmailField()
  78. value = fields.IntegerField()
  79. single = fields.ChoiceField(choices=TestChoices)
  80. multi = fields.MultipleChoiceField(choices=TestChoices)
  81. def clean(self):
  82. cleaned_data = self.cleaned_data
  83. if cleaned_data.get("text") == "Raise non-field error":
  84. raise ValidationError("Non-field error.")
  85. return cleaned_data
  86. def form_view(request):
  87. "A view that tests a simple form"
  88. if request.method == 'POST':
  89. form = TestForm(request.POST)
  90. if form.is_valid():
  91. t = Template('Valid POST data.', name='Valid POST Template')
  92. c = Context()
  93. else:
  94. t = Template('Invalid POST data. {{ form.errors }}', name='Invalid POST Template')
  95. c = Context({'form': form})
  96. else:
  97. form = TestForm(request.GET)
  98. t = Template('Viewing base form. {{ form }}.', name='Form GET Template')
  99. c = Context({'form': form})
  100. return HttpResponse(t.render(c))
  101. def form_view_with_template(request):
  102. "A view that tests a simple form"
  103. if request.method == 'POST':
  104. form = TestForm(request.POST)
  105. if form.is_valid():
  106. message = 'POST data OK'
  107. else:
  108. message = 'POST data has errors'
  109. else:
  110. form = TestForm()
  111. message = 'GET form page'
  112. return render_to_response('form_view.html',
  113. {
  114. 'form': form,
  115. 'message': message
  116. }
  117. )
  118. class BaseTestFormSet(BaseFormSet):
  119. def clean(self):
  120. """Checks that no two email addresses are the same."""
  121. if any(self.errors):
  122. # Don't bother validating the formset unless each form is valid
  123. return
  124. emails = []
  125. for i in range(0, self.total_form_count()):
  126. form = self.forms[i]
  127. email = form.cleaned_data['email']
  128. if email in emails:
  129. raise ValidationError(
  130. "Forms in a set must have distinct email addresses."
  131. )
  132. emails.append(email)
  133. TestFormSet = formset_factory(TestForm, BaseTestFormSet)
  134. def formset_view(request):
  135. "A view that tests a simple formset"
  136. if request.method == 'POST':
  137. formset = TestFormSet(request.POST)
  138. if formset.is_valid():
  139. t = Template('Valid POST data.', name='Valid POST Template')
  140. c = Context()
  141. else:
  142. t = Template('Invalid POST data. {{ my_formset.errors }}',
  143. name='Invalid POST Template')
  144. c = Context({'my_formset': formset})
  145. else:
  146. formset = TestForm(request.GET)
  147. t = Template('Viewing base formset. {{ my_formset }}.',
  148. name='Formset GET Template')
  149. c = Context({'my_formset': formset})
  150. return HttpResponse(t.render(c))
  151. def login_protected_view(request):
  152. "A simple view that is login protected."
  153. t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')
  154. c = Context({'user': request.user})
  155. return HttpResponse(t.render(c))
  156. login_protected_view = login_required(login_protected_view)
  157. def login_protected_view_changed_redirect(request):
  158. "A simple view that is login protected with a custom redirect field set"
  159. t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')
  160. c = Context({'user': request.user})
  161. return HttpResponse(t.render(c))
  162. login_protected_view_changed_redirect = login_required(redirect_field_name="redirect_to")(login_protected_view_changed_redirect)
  163. def _permission_protected_view(request):
  164. "A simple view that is permission protected."
  165. t = Template('This is a permission protected test. '
  166. 'Username is {{ user.username }}. '
  167. 'Permissions are {{ user.get_all_permissions }}.' ,
  168. name='Permissions Template')
  169. c = Context({'user': request.user})
  170. return HttpResponse(t.render(c))
  171. permission_protected_view = permission_required('permission_not_granted')(_permission_protected_view)
  172. permission_protected_view_exception = permission_required('permission_not_granted', raise_exception=True)(_permission_protected_view)
  173. class _ViewManager(object):
  174. @method_decorator(login_required)
  175. def login_protected_view(self, request):
  176. t = Template('This is a login protected test using a method. '
  177. 'Username is {{ user.username }}.',
  178. name='Login Method Template')
  179. c = Context({'user': request.user})
  180. return HttpResponse(t.render(c))
  181. @method_decorator(permission_required('permission_not_granted'))
  182. def permission_protected_view(self, request):
  183. t = Template('This is a permission protected test using a method. '
  184. 'Username is {{ user.username }}. '
  185. 'Permissions are {{ user.get_all_permissions }}.' ,
  186. name='Permissions Template')
  187. c = Context({'user': request.user})
  188. return HttpResponse(t.render(c))
  189. _view_manager = _ViewManager()
  190. login_protected_method_view = _view_manager.login_protected_view
  191. permission_protected_method_view = _view_manager.permission_protected_view
  192. def session_view(request):
  193. "A view that modifies the session"
  194. request.session['tobacconist'] = 'hovercraft'
  195. t = Template('This is a view that modifies the session.',
  196. name='Session Modifying View Template')
  197. c = Context()
  198. return HttpResponse(t.render(c))
  199. def broken_view(request):
  200. """A view which just raises an exception, simulating a broken view."""
  201. raise KeyError("Oops! Looks like you wrote some bad code.")
  202. def mail_sending_view(request):
  203. mail.EmailMessage(
  204. "Test message",
  205. "This is a test email",
  206. "from@example.com",
  207. ['first@example.com', 'second@example.com']).send()
  208. return HttpResponse("Mail sent")
  209. def mass_mail_sending_view(request):
  210. m1 = mail.EmailMessage(
  211. 'First Test message',
  212. 'This is the first test email',
  213. 'from@example.com',
  214. ['first@example.com', 'second@example.com'])
  215. m2 = mail.EmailMessage(
  216. 'Second Test message',
  217. 'This is the second test email',
  218. 'from@example.com',
  219. ['second@example.com', 'third@example.com'])
  220. c = mail.get_connection()
  221. c.send_messages([m1,m2])
  222. return HttpResponse("Mail sent")
  223. def django_project_redirect(request):
  224. return HttpResponseRedirect('https://www.djangoproject.com/')