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 ' <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('<br />', '<br />')
|
---|
108 | form = form.replace('&', '&')
|
---|
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
|
---|