widgets.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. """
  2. Created on Oct 12, 2013
  3. @author: Daniel Gaspar
  4. """
  5. import logging
  6. from flask.globals import _request_ctx_stack
  7. from ._compat import as_unicode
  8. log = logging.getLogger(__name__)
  9. class RenderTemplateWidget(object):
  10. """
  11. Base template for every widget
  12. Enables the possibility of rendering a template
  13. inside a template with run time options
  14. """
  15. template = "appbuilder/general/widgets/render.html"
  16. template_args = None
  17. def __init__(self, **kwargs):
  18. self.template_args = kwargs
  19. def __call__(self, **kwargs):
  20. ctx = _request_ctx_stack.top
  21. jinja_env = ctx.app.jinja_env
  22. template = jinja_env.get_template(self.template)
  23. args = self.template_args.copy()
  24. args.update(kwargs)
  25. return template.render(args)
  26. class FormWidget(RenderTemplateWidget):
  27. """
  28. FormWidget
  29. form = None
  30. include_cols = []
  31. exclude_cols = []
  32. fieldsets = []
  33. """
  34. template = "appbuilder/general/widgets/form.html"
  35. class FormVerticalWidget(RenderTemplateWidget):
  36. """
  37. FormWidget
  38. form = None
  39. include_cols = []
  40. exclude_cols = []
  41. fieldsets = []
  42. """
  43. template = "appbuilder/general/widgets/form_vertical.html"
  44. class FormHorizontalWidget(RenderTemplateWidget):
  45. """
  46. FormWidget
  47. form = None
  48. include_cols = []
  49. exclude_cols = []
  50. fieldsets = []
  51. """
  52. template = "appbuilder/general/widgets/form_horizontal.html"
  53. class FormInlineWidget(RenderTemplateWidget):
  54. """
  55. FormWidget
  56. form = None
  57. include_cols = []
  58. exclude_cols = []
  59. fieldsets = []
  60. """
  61. template = "appbuilder/general/widgets/form_inline.html"
  62. class GroupFormListWidget(RenderTemplateWidget):
  63. template = "appbuilder/general/widgets/group_form_list.html"
  64. class SearchWidget(FormWidget):
  65. template = "appbuilder/general/widgets/search.html"
  66. filters = None
  67. def __init__(self, **kwargs):
  68. self.filters = kwargs.get("filters")
  69. return super(SearchWidget, self).__init__(**kwargs)
  70. def __call__(self, **kwargs):
  71. """create dict labels based on form"""
  72. """ create dict of form widgets """
  73. """ create dict of possible filters """
  74. """ create list of active filters """
  75. label_columns = {}
  76. form_fields = {}
  77. search_filters = {}
  78. dict_filters = self.filters.get_search_filters()
  79. for col in self.template_args["include_cols"]:
  80. label_columns[col] = as_unicode(self.template_args["form"][col].label.text)
  81. form_fields[col] = self.template_args["form"][col]()
  82. search_filters[col] = [as_unicode(flt.name) for flt in dict_filters[col]]
  83. kwargs["label_columns"] = label_columns
  84. kwargs["form_fields"] = form_fields
  85. kwargs["search_filters"] = search_filters
  86. kwargs["active_filters"] = self.filters.get_filters_values_tojson()
  87. return super(SearchWidget, self).__call__(**kwargs)
  88. class ShowWidget(RenderTemplateWidget):
  89. """
  90. ShowWidget implements a template as an widget
  91. it takes the following arguments
  92. pk = None
  93. label_columns = []
  94. include_columns = []
  95. value_columns = []
  96. actions = None
  97. fieldsets = []
  98. modelview_name = ''
  99. """
  100. template = "appbuilder/general/widgets/show.html"
  101. class ShowBlockWidget(RenderTemplateWidget):
  102. template = "appbuilder/general/widgets/show_block.html"
  103. class ShowVerticalWidget(RenderTemplateWidget):
  104. template = "appbuilder/general/widgets/show_vertical.html"
  105. class ListWidget(RenderTemplateWidget):
  106. """
  107. List Widget implements a Template as an widget.
  108. It takes the following arguments
  109. label_columns = []
  110. include_columns = []
  111. value_columns = []
  112. order_columns = []
  113. page = None
  114. page_size = None
  115. count = 0
  116. pks = []
  117. actions = None
  118. filters = {}
  119. modelview_name = ''
  120. """
  121. template = "appbuilder/general/widgets/list.html"
  122. class ListMasterWidget(ListWidget):
  123. template = "appbuilder/general/widgets/list_master.html"
  124. class ListAddWidget(ListWidget):
  125. template = "appbuilder/general/widgets/list_add.html"
  126. def __init__(self, **kwargs):
  127. super(ListAddWidget, self).__init__(**kwargs)
  128. def __call__(self, **kwargs):
  129. return super(ListAddWidget, self).__call__(**kwargs)
  130. class ListThumbnail(ListWidget):
  131. template = "appbuilder/general/widgets/list_thumbnail.html"
  132. class ListLinkWidget(ListWidget):
  133. template = "appbuilder/general/widgets/list_link.html"
  134. class ListCarousel(ListWidget):
  135. template = "appbuilder/general/widgets/list_carousel.html"
  136. class ListItem(ListWidget):
  137. template = "appbuilder/general/widgets/list_item.html"
  138. class ListBlock(ListWidget):
  139. template = "appbuilder/general/widgets/list_block.html"