widgets.py 3.8 KB

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