| 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 |
|---|