28 category = 'form' |
28 category = 'form' |
29 controller = 'edit' |
29 controller = 'edit' |
30 http_cache_manager = NoHTTPCacheManager |
30 http_cache_manager = NoHTTPCacheManager |
31 add_to_breadcrumbs = False |
31 add_to_breadcrumbs = False |
32 |
32 |
|
33 def html_headers(self): |
|
34 """return a list of html headers (eg something to be inserted between |
|
35 <head> and </head> of the returned page |
|
36 |
|
37 by default forms are neither indexed nor followed |
|
38 """ |
|
39 return [NOINDEX, NOFOLLOW] |
|
40 |
|
41 def linkable(self): |
|
42 """override since forms are usually linked by an action, |
|
43 so we don't want them to be listed by appli.possible_views |
|
44 """ |
|
45 return False |
|
46 |
|
47 |
|
48 # XXX should disappear |
|
49 class FormMixIn(object): |
|
50 """abstract form mix-in |
|
51 XXX: you should inherit from this FIRST (obscure pb with super call) |
|
52 """ |
|
53 |
|
54 def initialize_varmaker(self): |
|
55 varmaker = self.req.get_page_data('rql_varmaker') |
|
56 if varmaker is None: |
|
57 varmaker = self.req.varmaker |
|
58 self.req.set_page_data('rql_varmaker', varmaker) |
|
59 self.varmaker = varmaker |
|
60 |
33 def __init__(self, req, rset, **kwargs): |
61 def __init__(self, req, rset, **kwargs): |
34 super(FormViewMixIn, self).__init__(req, rset, **kwargs) |
62 super(FormMixIn, self).__init__(req, rset, **kwargs) |
35 # get validation session data which may have been previously set. |
63 # get validation session data which may have been previously set. |
36 # deleting validation errors here breaks form reloading (errors are |
64 # deleting validation errors here breaks form reloading (errors are |
37 # no more available), they have to be deleted by application's publish |
65 # no more available), they have to be deleted by application's publish |
38 # method on successful commit |
66 # method on successful commit |
39 formurl = req.url() |
67 forminfo = req.get_session_data(req.url()) |
40 forminfo = req.get_session_data(formurl) |
|
41 if forminfo: |
68 if forminfo: |
42 req.data['formvalues'] = forminfo['values'] |
69 req.data['formvalues'] = forminfo['values'] |
43 req.data['formerrors'] = errex = forminfo['errors'] |
70 req.data['formerrors'] = errex = forminfo['errors'] |
44 req.data['displayederrors'] = set() |
71 req.data['displayederrors'] = set() |
45 # if some validation error occured on entity creation, we have to |
72 # if some validation error occured on entity creation, we have to |
50 errex.eid = var |
77 errex.eid = var |
51 break |
78 break |
52 else: |
79 else: |
53 errex.eid = foreid |
80 errex.eid = foreid |
54 |
81 |
55 def html_headers(self): |
|
56 """return a list of html headers (eg something to be inserted between |
|
57 <head> and </head> of the returned page |
|
58 |
|
59 by default forms are neither indexed nor followed |
|
60 """ |
|
61 return [NOINDEX, NOFOLLOW] |
|
62 |
|
63 def linkable(self): |
|
64 """override since forms are usually linked by an action, |
|
65 so we don't want them to be listed by appli.possible_views |
|
66 """ |
|
67 return False |
|
68 |
|
69 |
|
70 # XXX should disappear |
|
71 class FormMixIn(object): |
|
72 """abstract form mix-in |
|
73 XXX: you should inherit from this FIRST (obscure pb with super call) |
|
74 """ |
|
75 |
|
76 def initialize_varmaker(self): |
|
77 varmaker = self.req.get_page_data('rql_varmaker') |
|
78 if varmaker is None: |
|
79 varmaker = self.req.varmaker |
|
80 self.req.set_page_data('rql_varmaker', varmaker) |
|
81 self.varmaker = varmaker |
|
82 |
|
83 # XXX deprecated with new form system. Should disappear |
82 # XXX deprecated with new form system. Should disappear |
84 |
83 |
85 domid = 'entityForm' |
84 domid = 'entityForm' |
86 category = 'form' |
85 category = 'form' |
87 controller = 'edit' |
86 controller = 'edit' |
88 http_cache_manager = NoHTTPCacheManager |
87 http_cache_manager = NoHTTPCacheManager |
89 add_to_breadcrumbs = False |
88 add_to_breadcrumbs = False |
90 |
|
91 def __init__(self, req, rset, **kwargs): |
|
92 super(FormMixIn, self).__init__(req, rset, **kwargs) |
|
93 # get validation session data which may have been previously set. |
|
94 # deleting validation errors here breaks form reloading (errors are |
|
95 # no more available), they have to be deleted by application's publish |
|
96 # method on successful commit |
|
97 formurl = req.url() |
|
98 forminfo = req.get_session_data(formurl) |
|
99 if forminfo: |
|
100 req.data['formvalues'] = forminfo['values'] |
|
101 req.data['formerrors'] = errex = forminfo['errors'] |
|
102 req.data['displayederrors'] = set() |
|
103 # if some validation error occured on entity creation, we have to |
|
104 # get the original variable name from its attributed eid |
|
105 foreid = errex.entity |
|
106 for var, eid in forminfo['eidmap'].items(): |
|
107 if foreid == eid: |
|
108 errex.eid = var |
|
109 break |
|
110 else: |
|
111 errex.eid = foreid |
|
112 |
89 |
113 def html_headers(self): |
90 def html_headers(self): |
114 """return a list of html headers (eg something to be inserted between |
91 """return a list of html headers (eg something to be inserted between |
115 <head> and </head> of the returned page |
92 <head> and </head> of the returned page |
116 |
93 |
369 4. field's typed value |
346 4. field's typed value |
370 |
347 |
371 values found in 1. and 2. are expected te be already some 'display' |
348 values found in 1. and 2. are expected te be already some 'display' |
372 value while those found in 3. and 4. are expected to be correctly typed. |
349 value while those found in 3. and 4. are expected to be correctly typed. |
373 """ |
350 """ |
374 if field.name in self._previous_values: |
351 qname = self.form_field_name(field) |
375 value = self._previous_values[field.name] |
352 if qname in self._previous_values: |
376 elif field.name in self.req.form: |
353 value = self._previous_values[qname] |
377 value = self.req.form[field.name] |
354 elif qname in self.req.form: |
|
355 value = self.req.form[qname] |
378 else: |
356 else: |
379 if field.name in rendervalues: |
357 if field.name in rendervalues: |
380 value = rendervalues[field.name] |
358 value = rendervalues[field.name] |
381 else: |
359 else: |
382 value = self.form_field_value(field, load_bytes) |
360 value = self.form_field_value(field, load_bytes) |
447 # If we need to directly attach the new object to another one |
425 # If we need to directly attach the new object to another one |
448 for linkto in self.req.list_form_param('__linkto'): |
426 for linkto in self.req.list_form_param('__linkto'): |
449 self.form_add_hidden('__linkto', linkto) |
427 self.form_add_hidden('__linkto', linkto) |
450 msg = '%s %s' % (msg, self.req._('and linked')) |
428 msg = '%s %s' % (msg, self.req._('and linked')) |
451 self.form_add_hidden('__message', msg) |
429 self.form_add_hidden('__message', msg) |
|
430 # in case of direct instanciation |
|
431 self.schema = self.edited_entity.schema |
|
432 self.vreg = self.edited_entity.vreg |
452 |
433 |
453 def _errex_match_field(self, errex, field): |
434 def _errex_match_field(self, errex, field): |
454 """return true if the field has some error in given validation exception |
435 """return true if the field has some error in given validation exception |
455 """ |
436 """ |
456 return errex.eid == self.edited_entity.eid and field.name in errex.errors |
437 return errex.eid == self.edited_entity.eid and field.name in errex.errors |