root/libcommonDjango/django/pimentech/fields.py

Revision 7981, 6.5 kB (checked in by fredz, 1 month ago)

--

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