root/libcommonDjango/django/pimentech/fields.py

Revision 8270, 7.3 KB (checked in by fredz, 3 weeks ago)

*** empty log message ***

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1# -*- coding:utf-8 -*-
2from django.db.models import TextField
3#from django.core import validators
4try:
5    from django import newforms as forms
6except:
7    from django import forms
8
9from django.utils.html import escape
10from django.utils.functional import curry
11
12from django.dispatch import dispatcher
13try:
14    from django.utils.encoding import smart_unicode
15except:
16    from django.newforms.util import smart_unicode
17try:
18    from django.oldforms import LargeTextField
19    LARGE_TEXTFIELD = True
20except:
21        try:
22                from django.forms import LargeTextField
23                LARGE_TEXTFIELD = True
24        except:
25                LARGE_TEXTFIELD = False
26       
27
28try:
29    from django.newforms import widgets
30    from django.newforms import fields
31except:
32    from django.forms import widgets
33    from django.forms import fields
34from docutils import nodes, utils
35from docutils.core import publish_parts
36from docutils.writers import html4css1
37import types
38
39def rest2htmlbody(data):
40    parts = publish_parts(data, writer=html4css1.Writer(), settings_overrides={'input_encoding': 'utf-8'})
41    return parts['body'].encode('utf-8')
42
43
44class ReadOnlyTextInput(forms.TextInput):
45    def __init__(self, *args, **kwargs):
46        kwargs.setdefault('attrs',{}).update({'readonly': True,
47                'style':"background-color:#FFF3C8; border:0px"})
48        super(ReadOnlyTextInput, self).__init__(*args, **kwargs)
49
50
51if LARGE_TEXTFIELD:
52        class FormRestField(LargeTextField):
53                input_type = "text"
54                def __init__(self, field_name, rows=25, cols=100, is_required=False, validator_list=None, maxlength=None):
55                        if validator_list is None: validator_list = []
56                        self.field_name = field_name
57                        self.rows, self.cols, self.is_required = rows, cols, is_required
58                        self.validator_list = validator_list[:]
59                        if maxlength:
60                                self.validator_list.append(self.isValidLength)
61                                self.maxlength = maxlength
62
63                def render(self, data):
64                        if data is None:
65                                data = ''
66
67                        js_preview = '''<script type="text/javascript">
68                        <!--
69                        function hide_%s_preview(){
70                          field_id = "%s";
71                          document.getElementById(field_id + "-preview").style.display = "none";
72                          document.getElementById(field_id).style.display = "inline";
73                          document.getElementById("hide-" + field_id + "-button").style.display = "none";
74                          document.getElementById("show-" + field_id + "-button").style.display = "inline";
75                        }
76                        function show_%s_preview(){
77                          field_id = "%s";
78                          document.getElementById(field_id + "-preview").style.display = "block";
79                          document.getElementById(field_id).style.display = "none";
80                          document.getElementById("hide-" + field_id + "-button").style.display = "inline";
81                          document.getElementById("show-" + field_id + "-button").style.display = "none";
82                        }
83                        -->
84                        </script>
85                        <input class="default" type="button" value="Mode édition" id="hide-%s-button" onclick="hide_%s_preview()" style="display: none;" />
86                        <input class="default" type="button" value="Mode preview" id="show-%s-button" onclick="show_%s_preview()" />
87                        ''' % (self.field_name, self.get_id(), self.field_name, self.get_id(), self.get_id(), self.field_name, self.get_id(), self.field_name,)
88
89                        return js_preview + '''<table><tr>
90                        <td><textarea id="%s" class="v%s%s" name="%s" rows="%s" cols="%s" style="font-family:monospace">%s</textarea></td>
91                        <td><div id="%s-preview" style="border: 1px solid #ccc; max-height:%sem; width: %sem; overflow:auto; display: none;">%s</div></td>
92                        </tr></table>''' % (self.get_id(), self.__class__.__name__, self.is_required and ' required' or '', self.field_name, self.rows,
93                                                                self.cols, data, self.get_id(),
94                                                                int(self.rows*1.5),
95                                                                int(self.cols*0.65) ,
96                                                                rest2htmlbody(data))
97
98                def html2python(data):
99                        return data
100                html2python = staticmethod(html2python)
101
102
103        def get_FIELD_rst2html(instance, field):
104                return rest2htmlbody(getattr(instance, field.name))
105
106
107class RestField(TextField):
108
109    def contribute_to_class(self, cls, name):
110        super(RestField, self).contribute_to_class(cls, name)
111        setattr(cls, 'get_%s_html' % self.name, curry(get_FIELD_rst2html, field=self))
112
113    def isValid(self, field_data, all_data):
114        # TODO : lancer publish_parts et chopper les erreurs
115        pass
116   
117    def get_internal_type(self):
118        return "TextField"
119
120    def get_manipulator_field_objs(self):
121        return [FormRestField]
122   
123
124class DateTimeInput(widgets.Input):
125    """ C/C du trunk de django."""
126    input_type = 'text'
127    format = '%Y-%m-%d %H:%M:%S'     # '2006-10-25 14:30:59'
128
129    def __init__(self, attrs=None, format=None):
130        super(DateTimeInput, self).__init__(attrs)
131        if format:
132            self.format = format
133
134    def render(self, name, value, attrs=None):
135        if value is None:
136            value = ''
137        elif hasattr(value, 'strftime'):
138            value = value.strftime(self.format)
139        return super(DateTimeInput, self).render(name, value, attrs)
140
141
142class ISODateInput(widgets.TextInput):
143    def __init__(self, *args, **kwargs):
144        super(ISODateInput, self).__init__(*args, **kwargs)
145   
146    def render(self, name, value, attrs=None):
147        if value is None: value = ''
148        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
149        if value:
150            if type(value) != types.StringType:
151                # Hope it's datetime.date
152                value = value.strftime("%Y-%m-%d")
153            final_attrs['value'] = value
154
155        if final_attrs.has_key('calendar'):
156            if final_attrs['calendar']:
157                return (u"<input%s />"
158                        " <script language='javascript'>"
159                        " var inp = document.getElementById('%s');"
160                        "addCalendar(inp, '%s', 'english', false);"
161                        "</script>" %(widgets.flatatt(final_attrs), final_attrs['id'],\
162                                      final_attrs['calendar_class'],))
163        return (u"<input%s />" %(widgets.flatatt(final_attrs),))
164
165
166class FrenchDateInput(widgets.TextInput):
167    def __init__(self, *args, **kwargs):
168        super(FrenchDateInput, self).__init__(*args, **kwargs)
169   
170    def render(self, name, value, attrs=None):
171        if value is None: value = ''
172        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
173        if value:
174            if type(value) != types.StringType:
175                # Hope it's datetime.date
176                value = value.strftime("%d/%m/%Y")
177            final_attrs['value'] = value
178
179        if final_attrs.has_key('calendar'):
180            if final_attrs['calendar']:
181                return (u"<input%s />"
182                        " <script language='javascript'>"
183                        " var inp = document.getElementById('%s');"
184                        "addCalendar(inp, '%s', 'french', true);"
185                        "</script>" %(widgets.flatatt(final_attrs), final_attrs['id'],\
186                                      final_attrs['calendar_class'],))
187
188        return (u"<input%s />" %(widgets.flatatt(final_attrs),))
189
190
191FRENCH_DATE_INPUT_FORMATS = (
192    '%Y-%m-%d', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06'
193    '%d %b %Y',                         # '25 Oct 2006'
194    '%d %B %Y',                         # '25 October 2006', 'October 25, 2006'
195)
196
197class FrenchDateField(fields.DateField):
198    widget = FrenchDateInput
199    def __init__(self, *args, **kwargs):
200        super(FrenchDateField, self).__init__(
201            FRENCH_DATE_INPUT_FORMATS, *args, **kwargs
202            )
Note: See TracBrowser for help on using the browser.