Guest User

Untitled

a guest
Jan 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1.  
  2. from django.core.exceptions import ImproperlyConfigured
  3. import webapp2
  4. from webapp2_extras import jinja2
  5.  
  6. from utils import jinja2_factory
  7.  
  8. __all__ = (
  9. 'BaseHandler',
  10. 'DetailHandler',
  11. 'FormHandler',
  12. 'ListHandler',
  13. )
  14.  
  15. class BaseHandler(webapp2.RequestHandler):
  16.  
  17. @webapp2.cached_property
  18. def jinja2(self):
  19. # Returns a Jinja2 renderer cached in the app registry.
  20. return jinja2.get_jinja2(factory=jinja2_factory)
  21.  
  22. def render_response(self, _template, **context):
  23. # Renders a template and writes the result to the response.
  24. rv = self.jinja2.render_template(_template, **context)
  25. self.response.write(rv)
  26.  
  27. class SingleObjectMixin(object):
  28. """
  29. Provides the ability to retrieve a single object for further manipulation.
  30. """
  31. model = None
  32. context_object_name = None
  33.  
  34. def get_object(self):
  35. """
  36. by default this requires key_name to look up object
  37. """
  38. key_name = self.kwargs.get('key_name')
  39.  
  40. if key_name is not None:
  41. obj = self.model.get_by_key_name(key_name)
  42.  
  43. if obj:
  44. return obj
  45. else:
  46. self.abort(404, 'Requested object not found')
  47.  
  48. else:
  49. raise ImproperlyConfigured(u'Generic detail view %s must be called with '
  50. u'a key_name.' % self.__class__.__name__)
  51.  
  52. def get_context_object_name(self, obj):
  53. """
  54. Get the name to use for the object.
  55. """
  56. return self.context_object_name
  57.  
  58. def get_context_data(self, **kwargs):
  59. context = kwargs
  60. context_object_name = self.get_context_object_name(self.object)
  61. if context_object_name:
  62. context[context_object_name] = self.object
  63. return context
  64.  
  65. class MultipleObjectMixin(object):
  66. allow_empty = True
  67. model = None
  68. context_object_name = None
  69.  
  70. def get_object_list(self):
  71. if self.model:
  72. return self.model.all()
  73. else:
  74. raise ImproperlyConfigured(u"'%s' must define 'model'"
  75. % self.__class__.__name__)
  76.  
  77. def get_allow_empty(self):
  78. """
  79. Returns ``True`` if the view should display empty lists, and ``False``
  80. if a 404 should be raised instead.
  81. """
  82. return self.allow_empty
  83.  
  84. def get_context_object_name(self, object_list):
  85. """
  86. Get the name of the item to be used in the context.
  87. """
  88. return self.context_object_name
  89.  
  90. def get_context_data(self, **kwargs):
  91. """
  92. Get the context for this view.
  93. """
  94. object_list = kwargs.pop('object_list')
  95. context = {
  96. 'object_list': object_list
  97. }
  98. context.update(kwargs)
  99. context_object_name = self.get_context_object_name(object_list)
  100. if context_object_name:
  101. context[context_object_name] = object_list
  102. return context
  103.  
  104. class FormMixin(object):
  105. form_class = None
  106. redirect_url = None
  107.  
  108. def get_redirect_url(self):
  109. return self.redirect_url or None
  110.  
  111. def form_valid(self, form):
  112. model = form.save()
  113.  
  114. # add message and redirect?
  115. return self.redirect(self.get_redirect_url())
  116.  
  117. def form_invalid(self, form):
  118. return self.render_response(self.template, **self.get_context_data(
  119. form=form,
  120. ))
  121.  
  122. def get_context_data(self, **context):
  123. return context
  124.  
  125. def get_form_kwargs(self):
  126. return {
  127. 'data': self.request.POST or None,
  128. 'initial': self.get_initial(),
  129. }
  130.  
  131. def get_initial(self):
  132. pass
  133.  
  134. def get_form(self):
  135. return self.form_class(**self.get_form_kwargs())
  136.  
  137.  
  138. class ListHandler(MultipleObjectMixin, BaseHandler):
  139. template = None
  140.  
  141. def get(self, **kwargs):
  142. self.object_list = self.get_object_list()
  143. allow_empty = self.get_allow_empty()
  144. if not allow_empty and len(self.object_list) == 0:
  145. raise self.abort(404, u"Empty list and '%(class_name)s.allow_empty' is False."
  146. % {'class_name': self.__class__.__name__})
  147.  
  148. context = self.get_context_data(object_list=self.object_list)
  149. return self.render_response(self.template, **context)
  150.  
  151. class DetailHandler(SingleObjectMixin, BaseHandler):
  152. template = None
  153.  
  154. def get(self, **kwargs):
  155. self.kwargs = kwargs
  156.  
  157. self.object = self.get_object()
  158. context = self.get_context_data(object=self.object)
  159. return self.render_response(self.template, **context)
  160.  
  161. class FormHandler(FormMixin, BaseHandler):
  162.  
  163. def get(self, **kwargs):
  164. self.kwargs = kwargs
  165.  
  166. return self.render_response(self.template, **self.get_context_data(
  167. form=self.get_form(),
  168. ))
  169.  
  170. def post(self, **kwargs):
  171. self.kwargs = kwargs
  172.  
  173. form = self.get_form()
  174. if form.is_valid():
  175. return self.form_valid(form)
  176. else:
  177. return self.form_invalid(form)
Add Comment
Please, Sign In to add comment