# -*- coding:utf-8 -*- from django.db.models import TextField #from django.core import validators try: from django import newforms as forms except: from django import forms from django.utils.html import escape from django.utils.functional import curry from django.dispatch import dispatcher try: from django.utils.encoding import smart_unicode except: from django.newforms.util import smart_unicode try: from django.oldforms import LargeTextField LARGE_TEXTFIELD = True except: try: from django.forms import LargeTextField LARGE_TEXTFIELD = True except: LARGE_TEXTFIELD = False try: from django.newforms import widgets from django.newforms import fields except: from django.forms import widgets from django.forms import fields from docutils import nodes, utils from docutils.core import publish_parts from docutils.writers import html4css1 import types def rest2htmlbody(data): parts = publish_parts(data, writer=html4css1.Writer(), settings_overrides={'input_encoding': 'utf-8'}) return parts['body'].encode('utf-8') class ReadOnlyTextInput(forms.TextInput): def __init__(self, *args, **kwargs): kwargs.setdefault('attrs',{}).update({'readonly': True, 'style':"background-color:#FFF3C8; border:0px"}) super(ReadOnlyTextInput, self).__init__(*args, **kwargs) if LARGE_TEXTFIELD: class FormRestField(LargeTextField): input_type = "text" def __init__(self, field_name, rows=25, cols=100, is_required=False, validator_list=None, maxlength=None): if validator_list is None: validator_list = [] self.field_name = field_name self.rows, self.cols, self.is_required = rows, cols, is_required self.validator_list = validator_list[:] if maxlength: self.validator_list.append(self.isValidLength) self.maxlength = maxlength def render(self, data): if data is None: data = '' js_preview = ''' ''' % (self.field_name, self.get_id(), self.field_name, self.get_id(), self.get_id(), self.field_name, self.get_id(), self.field_name,) return js_preview + '''
''' % (self.get_id(), self.__class__.__name__, self.is_required and ' required' or '', self.field_name, self.rows, self.cols, data, self.get_id(), int(self.rows*1.5), int(self.cols*0.65) , rest2htmlbody(data)) def html2python(data): return data html2python = staticmethod(html2python) def get_FIELD_rst2html(instance, field): return rest2htmlbody(getattr(instance, field.name)) class RestField(TextField): def contribute_to_class(self, cls, name): super(RestField, self).contribute_to_class(cls, name) setattr(cls, 'get_%s_html' % self.name, curry(get_FIELD_rst2html, field=self)) def isValid(self, field_data, all_data): # TODO : lancer publish_parts et chopper les erreurs pass def get_internal_type(self): return "TextField" def get_manipulator_field_objs(self): return [FormRestField] class DateTimeInput(widgets.Input): """ C/C du trunk de django.""" input_type = 'text' format = '%Y-%m-%d %H:%M:%S' # '2006-10-25 14:30:59' def __init__(self, attrs=None, format=None): super(DateTimeInput, self).__init__(attrs) if format: self.format = format def render(self, name, value, attrs=None): if value is None: value = '' elif hasattr(value, 'strftime'): value = value.strftime(self.format) return super(DateTimeInput, self).render(name, value, attrs) class ISODateInput(widgets.TextInput): def __init__(self, *args, **kwargs): super(ISODateInput, self).__init__(*args, **kwargs) def render(self, name, value, attrs=None): if value is None: value = '' final_attrs = self.build_attrs(attrs, type=self.input_type, name=name) if value: if type(value) != types.StringType: # Hope it's datetime.date value = value.strftime("%Y-%m-%d") final_attrs['value'] = value if final_attrs.has_key('calendar'): if final_attrs['calendar']: return (u"" " " %(widgets.flatatt(final_attrs), final_attrs['id'],\ final_attrs['calendar_class'],)) return (u"" %(widgets.flatatt(final_attrs),)) class FrenchDateInput(widgets.TextInput): def __init__(self, *args, **kwargs): super(FrenchDateInput, self).__init__(*args, **kwargs) def render(self, name, value, attrs=None): if value is None: value = '' final_attrs = self.build_attrs(attrs, type=self.input_type, name=name) if value: if type(value) != types.StringType: # Hope it's datetime.date value = value.strftime("%d/%m/%Y") final_attrs['value'] = value if final_attrs.has_key('calendar'): if final_attrs['calendar']: return (u"" " " %(widgets.flatatt(final_attrs), final_attrs['id'],\ final_attrs['calendar_class'],)) return (u"" %(widgets.flatatt(final_attrs),)) FRENCH_DATE_INPUT_FORMATS = ( '%Y-%m-%d', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06' '%d %b %Y', # '25 Oct 2006' '%d %B %Y', # '25 October 2006', 'October 25, 2006' ) class FrenchDateField(fields.DateField): widget = FrenchDateInput def __init__(self, *args, **kwargs): super(FrenchDateField, self).__init__( FRENCH_DATE_INPUT_FORMATS, *args, **kwargs )