62 |
62 |
from quixote.html import htmltext, htmltag, htmlescape, TemplateIO
|
63 |
63 |
from quixote.util import randbytes
|
64 |
64 |
|
|
65 |
from django.template import RequestContext
|
|
66 |
from django.utils.safestring import mark_safe
|
|
67 |
|
|
68 |
from .template import render as render_template
|
65 |
69 |
from wcs.portfolio import has_portfolio
|
66 |
70 |
|
67 |
71 |
from qommon import _, ngettext
|
... | ... | |
114 |
118 |
|
115 |
119 |
def render(self):
|
116 |
120 |
# quixote/form/widget.py, Widget::render
|
117 |
|
r = TemplateIO(html=True)
|
118 |
|
classnames = '%s widget' % self.__class__.__name__
|
119 |
|
if hasattr(self, 'extra_css_class') and self.extra_css_class:
|
120 |
|
classnames += ' ' + self.extra_css_class
|
121 |
|
if self.get_error():
|
122 |
|
classnames += ' widget-with-error'
|
123 |
|
if self.get_message():
|
124 |
|
classnames += ' widget-with-message'
|
125 |
|
if self.is_required():
|
126 |
|
classnames += ' widget-required'
|
127 |
|
else:
|
128 |
|
classnames += ' widget-optional'
|
129 |
|
if self.is_prefilled():
|
130 |
|
classnames += ' widget-prefilled'
|
131 |
|
attributes = {}
|
132 |
|
if hasattr(self, 'div_id') and self.div_id:
|
133 |
|
attributes['data-valuecontainerid'] = 'form_%s' % self.name
|
134 |
|
if hasattr(self, 'prefill_attributes') and self.prefill_attributes:
|
135 |
|
for k, v in self.prefill_attributes.items():
|
136 |
|
attributes['data-' + k] = v
|
137 |
|
if hasattr(self, 'div_id') and self.div_id:
|
138 |
|
attributes['id'] = self.div_id
|
139 |
|
for attr in ('data-dynamic-display-child-of', 'data-dynamic-display-value'):
|
140 |
|
if attr in self.attrs:
|
141 |
|
attributes[attr] = self.attrs.pop(attr)
|
142 |
|
attributes['class'] = classnames
|
143 |
|
r += htmltext('<div %s>' % ' '.join(['%s="%s"' % x for x in attributes.items()]))
|
144 |
|
r += self.render_title(self.get_title())
|
145 |
|
classnames = 'content'
|
146 |
|
if hasattr(self, 'content_extra_css_class') and self.content_extra_css_class:
|
147 |
|
classnames += ' ' + self.content_extra_css_class
|
148 |
|
r += htmltext('<div class="%s">' % classnames)
|
149 |
|
r += self.render_error(self.get_error())
|
150 |
|
r += self.render_content()
|
151 |
|
r += self.render_hint(self.get_hint())
|
152 |
|
r += self.render_message(self.get_message())
|
153 |
|
r += htmltext('</div>')
|
154 |
|
r += htmltext('</div>')
|
155 |
|
if self.render_br:
|
156 |
|
r += htmltext('<br class="%s" />') % classnames
|
157 |
|
r += htmltext('\n')
|
158 |
|
return r.getvalue()
|
|
121 |
def safe(text):
|
|
122 |
return mark_safe(str(htmlescape(text)))
|
|
123 |
self.class_name = self.__class__.__name__
|
|
124 |
self.rendered_title = lambda: safe(self.render_title(self.get_title()))
|
|
125 |
self.rendered_error = lambda: safe(self.render_error(self.get_error()))
|
|
126 |
self.rendered_hint = lambda: safe(self.render_hint(self.get_hint()))
|
|
127 |
self.rendered_message = lambda: safe(self.render_message(self.get_message()))
|
|
128 |
context = RequestContext(get_request(), {'widget': self})
|
|
129 |
template_names = []
|
|
130 |
widget_template_name = getattr(self, 'template_name', None)
|
|
131 |
for extra_css_class in (getattr(self, 'extra_css_class', '') or '').split():
|
|
132 |
if not extra_css_class.startswith('template-'):
|
|
133 |
continue
|
|
134 |
template_name = extra_css_class.split('-', 1)[1]
|
|
135 |
# full template
|
|
136 |
template_names.append('qommon/form/widgets/%s.html' % template_name)
|
|
137 |
if widget_template_name:
|
|
138 |
# widget specific variation
|
|
139 |
template_names.append(widget_template_name.replace(
|
|
140 |
'.html', '--%s.html' % template_name))
|
|
141 |
if widget_template_name:
|
|
142 |
template_names.append(widget_template_name)
|
|
143 |
template_names.append('qommon/forms/widget.html')
|
|
144 |
return htmltext(render_template(template_names, context))
|
159 |
145 |
|
160 |
146 |
Widget.get_error = get_i18n_error
|
161 |
147 |
Widget.render = render
|