Django

Code

Ticket #6071: form_system.py

File form_system.py, 7.5 kB (added by hans.rauch@gmx.net, 1 year ago)
Line 
1 #-*-coding: utf-8 -*-
2 """
3 /dms/form_system.py
4
5 .. enthaelt Modifikationen des Django-Formular-Systems
6          Django content Management System
7
8 Hans Rauch
9 hans.rauch@gmx.net
10
11 Die Programme des dms-Systems koennen frei genutzt und den spezifischen
12 Beduerfnissen entsprechend angepasst werden.
13
14 0.01  31.01.2007  Beginn der Dokumentation
15 0.02  13.09.2007  Adresse der Hilfeseiten
16 0.03  14.09.2007  Fehlerkorrektur fuer Hilfefenster
17 """
18
19 import  string, re
20 from    settings import HELP_URL
21
22 from django.utils.encoding  import smart_unicode
23
24 from django.utils.translation import ugettext as _
25
26 from dms.encode_decode  import encode_html
27
28 # -----------------------------------------------------
29 class form_system :
30
31   def encode(self, text):
32     text = string.replace(text, '\n', ' ')
33     text = string.replace(text, "'", '"')
34     text = string.replace(text, '"', '"')
35     text = encode_html(text)
36     return text
37
38   def getJsHelp(self, rHelp, text, title, rAnchor):
39     """ zeigt Hilfe in einem PopUp-Fenster an """
40     if string.strip(text) == '':
41       return ''
42     text  = self.encode(text)
43     title = _('Kurzhilfe: ') + self.encode(title)
44     #url = 'JavaScript:showHelp(\'' + rHelp + '#' + rAnchor + '\');" '
45     url = "JavaScript:showHelp('%s#%s');\" " % (rHelp, rAnchor)
46     #url += 'class="overlay" \n'
47     url += 'onMouseOver="return overlib('
48     url += "'" + text + "'"
49     url += ",CAPTION,'" + title + "',TEXTSIZE,2,CAPTIONSIZE,2,SNAPX,16,SNAPY,4,"
50     url += 'ol_vpos=ABOVE,ol_fgcolor=\'#f0f0ff\',ol_width=400)" onMouseOut="nd();"'
51
52     return '&nbsp;<a href="' + url + '>...?</a>\n'
53
54   def modify_form ( self, rId, rForm, valign, max_cols, rError='' ) :
55     """ """
56     def convert_date(s):
57       cStart = 'value="'
58       nLen = len(cStart)
59       nStart  = string.find(s, cStart)
60       nEnd    = min(string.find(s, '"', nStart+nLen+1), string.find(s, ' ', nStart+nLen+1))
61       n_end_2 = string.find(s, '"', nStart+nLen+1)
62       d = s[nStart+nLen:nEnd]
63       arr = string.splitfields(d, '-')
64       if len(arr) == 3 :
65         dGerman = u'%s.%s.%s' % (arr[2],arr[1],arr[0])
66       else :
67         dGerman = d
68       return s[:nStart+nLen] + dGerman + s[n_end_2:] + """ <a href="javascript: void(0);"
69    onclick="return getCalendar(document.form_input.id_""" + rId + """);"><img
70    src="/dms_media/javascript/calendar/calendar.png" border="0" /></a>"""
71
72     def convert_date_time(s):
73       cStart = 'value="'
74       nLen = len(cStart)
75       nStart = string.find(s, cStart)
76       nEnd   = string.find(s, '"', nStart+nLen+1)
77       d = s[nStart+nLen:nEnd]
78       a = string.splitfields(d, ' ')
79       arr = string.splitfields(a[0], '-')
80       if len(arr) == 3 :
81         dGerman = u'%s.%s.%s' % (arr[2],arr[1],arr[0])
82       else :
83         dGerman = d
84       dGerman += ' ' + a[1][:a[1].rfind(':')]  # Sekunden abschneiden
85       return s[:nStart+nLen] + dGerman + s[nEnd:]
86
87     myType = smart_unicode(type(rForm.field))
88     nPos = string.rfind ( myType, '.' )
89     myType = myType[nPos+1:-2]
90     if rError:
91       error = ''
92       for err in rError:
93         error += encode_html(err)
94       form = smart_unicode(rForm) + '<br /><span class="red"><b>' + error + '</b></span>'
95     else :
96       form = smart_unicode(rForm)
97     # --- soll das Eingabeobjekt horizontal angezeigt werden?
98     if not valign and string.find(form, '<ul>') >= 0:
99       form = string.replace(form, '<ul>', '')
100       form = string.replace(form, '</ul>', '')
101       form = string.replace(form, '<li>', '')
102       form = string.replace(form, '</li>', '')
103     if string.find(form, 'type="hidden"') >= 0:
104       v = 'value="'
105       obj = re.search(v+'.*?"', form, re.S)
106       form += ' ' + form[obj.start()+len(v):obj.end()-1]
107       form = form.replace('&lt;br /&gt;', '<br />')
108       form = form.replace('&amp;', '&')
109     #if not myType in ['DateField', 'DateTimeField']:
110     if not myType in ['DateField']:
111       return form
112     if myType == 'DateTimeField':
113       return convert_date_time(form)
114     return convert_date(form)
115
116   def get_form ( self, rFormList, rFormDict, app_name, rForm,
117                        tab_cluster, valign, max_cols, show_errors):
118     """ """
119     from django.template.loader import get_template
120     from django.template import Context
121     h = get_template('app/form_header.html')
122     hm = get_template('app/form_header_multiple.html')
123     i = get_template('app/form_input.html')
124     im = get_template('app/form_input_multiple.html')
125     inf = get_template('app/form_info.html')
126     t = get_template('app/form_table_start.html')
127     my_help_url = HELP_URL + app_name + '/'
128     if show_errors:
129       my_errors = rForm.errors
130     else:
131       my_errors = {}
132     c = Context ( {} )
133     ret = t.render(c)
134     for my_id in rFormList:
135       if tab_cluster.has_key(my_id):
136         my_data = tab_cluster[my_id]
137         my_info = my_data[0]['title']
138         my_cols = my_data[0]['cols']
139         my_rows = my_data[0]['rows']
140         my_show_cols = my_data[0]['show_cols']
141         if my_data[0].has_key('valign'):
142           my_valign = my_data[0]['valign']
143         else:
144           my_valign = valign
145         my_cells = my_data[1]
146         c = Context ( {} )
147         ret += t.render(c)
148         if my_info != '':
149           c = Context ( { 'cols': 1+len(my_cols), 'info': my_info} )
150           ret += inf.render(c)
151         if my_show_cols:
152           c = Context ( { 'headers': my_cols, } )
153           ret += hm.render(c)
154         n_row = 0
155         for row in my_rows:
156           if my_show_cols:
157             inputs = []
158             for c in my_cols:
159               cell_id = my_cells[n_row]
160               if my_errors.has_key(cell_id):
161                 err_info = my_errors[cell_id][0]
162                 my_form = self.modify_form(cell_id, rForm[cell_id],
163                                            my_valign, max_cols, err_info)
164               else :
165                 my_form = self.modify_form(cell_id, rForm[cell_id], my_valign, max_cols)
166               inputs.append(my_form)
167               n_row += 1
168             c = Context ( { 'title'   : row,
169                             'label'   : cell_id,
170                             'inputs'  : inputs,
171                             'max_cols': max_cols,
172                           } )
173             ret += im.render(c)
174           else:
175             inputs = []
176             for c in my_cols:
177               cell_id = my_cells[n_row]
178               if my_errors.has_key(cell_id):
179                 err_info = my_errors[cell_id][0]
180                 my_form = self.modify_form(cell_id, rForm[cell_id],
181                                            my_valign, max_cols, err_info)
182               else :
183                 my_form = self.modify_form(cell_id, rForm[cell_id], my_valign, max_cols)
184               inputs.append(my_form)
185               n_row += 1
186             c = Context ( { 'title'   : row,
187                             'label'   : cell_id,
188                             'inputs'  : inputs,
189                             'max_cols': max_cols,
190                           } )
191             ret += im.render(c)
192       else:
193         form = rFormDict[my_id]
194         if my_errors.has_key(my_id) :
195           my_form = self.modify_form(my_id, rForm[my_id], valign, max_cols, my_errors[my_id])
196         else :
197           my_form = self.modify_form(my_id, rForm[my_id], valign, max_cols)
198         c = Context ( { 'title'   : form['title'],
199                         'label'   : my_id,
200                         'input'   : my_form,
201                         'help'    : self.getJsHelp(my_help_url, form['help'],
202                                                    form['title'], my_id),
203                         'max_cols': max_cols,
204                       } )
205         ret += i.render(c)
206     ret += '</table>\n'
207     return ret