widgets.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import
  3. from __future__ import division
  4. from __future__ import print_function
  5. from __future__ import unicode_literals
  6. from django.forms import widgets
  7. from django.template import loader, Context
  8. from django.utils.encoding import force_text
  9. from rapid.wrappers import ModelData
  10. _templates_root = 'rapid/widgets/'
  11. class RapidReadOnly(widgets.Widget):
  12. def render(self, name, value, attrs=None):
  13. hidden = '<input type="hidden" name="%s" value="%s" ' % (name, value)
  14. for a in attrs.keys():
  15. hidden += '%s="%s" ' % (a, attrs[a])
  16. hidden += '>'
  17. return '<span class="data-value">%s</span>%s\n' % (force_text(value), hidden)
  18. def value_from_datadict(self, data, files, name):
  19. return data[name]
  20. class RapidRelationReadOnly(widgets.Widget):
  21. def __init__(self, model, *args, **kwargs):
  22. super(RapidRelationReadOnly, self).__init__(*args, **kwargs)
  23. self.model = ModelData(model)
  24. def render(self, name, value, attrs=None):
  25. hidden = '<input type="hidden" name="%s" value="%s" ' % (name, value)
  26. for a in attrs.keys():
  27. hidden += '%s="%s" ' % (a, attrs[a])
  28. hidden += '>'
  29. if hasattr(value, '__iter__'):
  30. obj = self.model.default_manager().filter(pk__in=value)
  31. ret = ''
  32. for o in obj:
  33. ret += '<span class="data-value multiple">%s</span>\n' % force_text(o)
  34. ret += hidden
  35. return ret
  36. else:
  37. obj = self.model.default_manager().get(pk=value)
  38. return '<span class="data-value">%s</span>%s\n' % (force_text(obj), hidden)
  39. def value_from_datadict(self, data, files, name):
  40. return data[name]
  41. class RapidSelector(widgets.Select):
  42. """
  43. Selects one of the target crud type.
  44. For ForeignKeyFields and OneToOneFields.
  45. If the target is dependent (that means, has only
  46. value when linked with this object), only displays
  47. an edition link.
  48. """
  49. def __init__(self, relation, *args, **kwargs):
  50. super(RapidSelector, self).__init__(*args, **kwargs)
  51. self.relation = relation
  52. self.allow_multiple_selected = relation.is_multiple()
  53. self.remove_deselected = relation.is_weak()
  54. def render(self, name, value, attrs=None, choices=()):
  55. tp_id = attrs.get('id', name)
  56. related = self.relation.related_model()
  57. if self.allow_multiple_selected:
  58. if value:
  59. v = ",".join([str(x) for x in value])
  60. selected = related.default_manager().filter(pk__in=value)
  61. else:
  62. v = ""
  63. selected = []
  64. else:
  65. if value:
  66. v = str(value)
  67. selected = related.default_manager().get(pk=value)
  68. else:
  69. v = ""
  70. selected = ""
  71. select_url = related.select_url()
  72. if self.allow_multiple_selected:
  73. icon = 'fa-times'
  74. if self.remove_deselected:
  75. icon = 'fa-trash-o'
  76. else:
  77. icon = 'fa-search'
  78. c = Context({'id': tp_id, 'name': name, 'value': v, 'selected': selected, 'icon': icon,
  79. 'select_url': select_url, 'multiple': self.allow_multiple_selected})
  80. if self.allow_multiple_selected:
  81. t = loader.get_template(_templates_root + 'multiple-selector.html')
  82. else:
  83. t = loader.get_template(_templates_root + 'single-selector.html')
  84. return t.render(c)
  85. def value_from_datadict(self, data, files, name):
  86. val = data.get(name)
  87. if self.allow_multiple_selected:
  88. if val:
  89. return [int(x) for x in val.split(",") if x]
  90. return []
  91. else:
  92. if val:
  93. return int(val)
  94. return None
  95. def rapid_alternatives_widget(alternatives, selector):
  96. class RapidAlternativeFormsWidget(widgets.Widget):
  97. def render(self, name, value, attrs=None):
  98. attrs = attrs if attrs else []
  99. c = Context({'name': name,
  100. 'value': value,
  101. 'attrs': attrs,
  102. 'alternatives': alternatives.values(),
  103. 'selector': selector,
  104. })
  105. t = loader.get_template(_templates_root + 'alternativeForms.html')
  106. return t.render(c)
  107. def value_from_datadict(self, data, files, name):
  108. ct_id = data.get(selector)
  109. if not ct_id:
  110. return None
  111. return alternatives.get(int(ct_id))[1]
  112. return RapidAlternativeFormsWidget