def test_ObjectSupport(self): # make sure listbox supports rendering of simple objects # the only requirement is that objects have a `uid` attribute which is a # string starting by new_ (a convention to prevent indexing of objects). portal = self.getPortal() list_method_id = 'DummyListMethodId' portal.ListBoxZuite_reset() form = portal.FooModule_viewFooList listbox = form.listbox listbox.ListBox_setPropertyList( field_list_method = list_method_id, field_count_method = '', field_editable_columns = ['title | title'], field_columns = ['title | Title',],) form.manage_addField('listbox_title', 'Title', 'StringField') createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, **kw', "from Products.PythonScripts.standard import Object\n" "return [Object(uid='new_', title='Object Title')]") request = get_request() request['here'] = portal.foo_module line_list = [l for l in listbox.get_value('default', render_format='list', REQUEST=request) if l.isDataLine()] self.assertEqual(1, len(line_list)) self.assertEqual('Object Title', line_list[0].getColumnProperty('title')) html = listbox.render(REQUEST=request) self.assertTrue('Object Title' in html, html)
def test_06_LineFields(self, quiet=0, run=run_all_test): """ Line Fields are able to render a list parameter in the form of lines. The same behaviour is expected for Line Fields used in ListBox objects. """ portal = self.getPortal() portal.ListBoxZuite_reset() # Reset listbox properties listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method = 'portal_catalog', field_columns = ['subject_list | Subjects',], field_editable_columns = ['subject_list | Subjects',], ) # Create an new empty object with a list property foo_module = portal.foo_module word = 'averycomplexwordwhichhaslittlechancetoexistinhtml' o = foo_module.newContent(subject_list = [word]) # Make sure that word is the subject list self.assertEqual(word in o.getSubjectList(), True) # Reindex self.tic() # Render the module in html request = get_request() request['here'] = portal.foo_module rendered_listbox = listbox.render(REQUEST=request) # Make sure that word is there self.assertEqual(rendered_listbox.find(word) > 0, True)
def test_ProxyFieldRenderFormatLines(self): # tests that listbox default value in render_format=list mode is # compatible with proxy field. portal = self.getPortal() portal.ListBoxZuite_reset() form = portal.FooModule_viewFooList listbox = form.listbox listbox.ListBox_setPropertyList( field_list_method='contentValues', field_columns=['listbox_value | Title',],) # create a form, to store our proxy field inside portal.manage_addProduct['ERP5Form'].addERP5Form('Test_view', 'View') portal.Test_view.manage_addField('listbox', 'listbox', 'ProxyField') proxy_field = portal.Test_view.listbox proxy_field.manage_edit_xmlrpc(dict( form_id=form.getId(), field_id='listbox', columns=[('proxy_value', 'Proxy')])) # this proxy field will not delegate its "columns" value proxy_field._surcharged_edit(dict(columns=[('proxy_value', 'Proxy')]), ['columns']) request = get_request() request['here'] = portal.foo_module line_list = proxy_field.get_value('default', render_format='list', REQUEST=request) self.assertTrue(isinstance(line_list, list)) title_line = line_list[0] self.assertTrue(title_line.isTitleLine()) # title of columns is the value overloaded by the proxy field. self.assertEqual([('proxy_value', 'Proxy')], title_line.getColumnItemList())
def test_04_UnicodeParameters(self, quiet=0, run=run_all_test): """Unicode properties are handled. """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a list method list_method_id = 'ListBox_ParametersListMethod' createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, **kw', """return [context.asContext(alternate_title = u'\xe9lisa')]""") # set the listbox to use this as list method listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method=list_method_id, field_count_method='', field_columns=[ 'alternate_title | Alternate Title', ], ) request = get_request() request['here'] = portal.foo_module try: listbox.get_value('default', render_format='list', REQUEST=request) except UnicodeError, e: self.fail('Rendering failed: %s' % e)
def pt_render(self, source=0, extra_context={}): doc_xml = ZopePageTemplate.pt_render(self, source=source, extra_context=extra_context) # Unmarshall arguments to __call__ API args = extra_context.get("options", []) kwargs = extra_context.copy() if kwargs.has_key("options"): del kwargs["options"] if kwargs.has_key("context"): del kwargs["context"] batch_mode = extra_context.get("batch_mode", 0) request = extra_context.get("REQUEST", None) if not request: request = get_request() if request.get("debug", 0): return doc_xml report_tool = getToolByName(self, "portal_report") pdf = report_tool.renderPDF(self.pdf_stylesheet, doc_xml, context=self.pt_getContext()["here"], *args, **kwargs) if request and not batch_mode: request.RESPONSE.setHeader("Content-Type", "application/pdf") request.RESPONSE.setHeader("Content-Length", len(pdf)) request.RESPONSE.setHeader("Content-Disposition", "inline;filename=%s.pdf" % self.title_or_id()) return pdf
def test_UTF8URLColumns(self, quiet=0, run=run_all_test): """URL column script can return UTF8 encoded string """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a url column method url_column_method_id = 'Base_get%sUrlColumnMethod' % self.id() createZODBPythonScript( portal.portal_skins.custom, url_column_method_id, 'selection=None, **kw', """return u'http://example.com/?\xe9lisa'.encode('utf8')""") listbox = portal.FooModule_viewFooList.listbox # here we cover two cases, id has an editable field, title has not listbox.ListBox_setPropertyList( field_url_columns = [ 'title | %s' % url_column_method_id, 'id | %s' % url_column_method_id, ],) foo_module = portal.foo_module o = foo_module.newContent(title=u'\xe9lisa') o.immediateReindexObject() request = get_request() request['here'] = portal.foo_module try: rendered = listbox.get_value('default', render_format='list', REQUEST=request) except UnicodeError, e: self.fail('Rendering failed: %s' % e)
def pt_render(self, source=0, extra_context={}): doc_xml = ZopePageTemplate.pt_render(self, source=source, extra_context=extra_context) # Unmarshall arguments to __call__ API args = extra_context.get('options', []) kwargs = extra_context.copy() if kwargs.has_key('options'): del kwargs['options'] if kwargs.has_key('context'): del kwargs['context'] batch_mode = extra_context.get('batch_mode', 0) request = extra_context.get('REQUEST', None) if not request: request = get_request() if request.get('debug',0): return doc_xml report_tool = getToolByName(self, 'portal_report') pdf = report_tool.renderPDF(self.pdf_stylesheet, doc_xml, context=self.pt_getContext()['here'], *args, **kwargs) if request and not batch_mode: request.RESPONSE.setHeader('Content-Type','application/pdf') request.RESPONSE.setHeader('Content-Length',len(pdf)) request.RESPONSE.setHeader('Content-Disposition','inline;filename=%s.pdf' % self.title_or_id()) return pdf
def stepRenderList(self, sequence=None, sequence_list=None, **kw): portal = self.getPortal() listbox = portal.FooModule_viewFooList.listbox request = get_request() request["here"] = portal.foo_module listboxline_list = listbox.get_value("default", render_format="list", REQUEST=request) sequence.edit(listboxline_list=listboxline_list)
def render_view(self, field, value, REQUEST=None, key=None, render_format='html', render_prefix=None): """ Render a Chart in read-only. """ if REQUEST is None: REQUEST=get_request() return self.render(field, key, value, REQUEST, render_format=render_format, render_prefix=render_prefix)
def __call__(self, *args, **kwargs): warn( "ERP5Report to be obsolete, please use ReportBox and normal ERP5Form instead.", DeprecationWarning) if not self.report_method: raise KeyError('report method is not set on the report') if 'args' not in kwargs: kwargs['args'] = args form = self obj = getattr(form, 'aq_parent', None) if obj is not None: container = obj.aq_inner.aq_parent else: container = None pt = getattr(self, self.pt) report_method = getattr(obj, self.report_method) extra_context = self.pt_getContext() extra_context['options'] = kwargs extra_context['form'] = self extra_context['request'] = get_request() extra_context[ 'container'] = container ## PROBLEM NOT TAKEN INTO ACCOUNT extra_context['here'] = obj extra_context['report_method'] = report_method return pt.pt_render(extra_context=extra_context)
def test_06_LineFields(self, quiet=0, run=run_all_test): """ Line Fields are able to render a list parameter in the form of lines. The same behaviour is expected for Line Fields used in ListBox objects. """ portal = self.getPortal() portal.ListBoxZuite_reset() # Reset listbox properties listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method = 'portal_catalog', field_columns = ['subject_list | Subjects',], field_editable_columns = ['subject_list | Subjects',], ) # Create an new empty object with a list property foo_module = portal.foo_module word = 'averycomplexwordwhichhaslittlechancetoexistinhtml' o = foo_module.newContent(subject_list = [word]) # Make sure that word is the subject list self.assertEqual(word in o.getSubjectList(), True) # Reindex o.immediateReindexObject() # Render the module in html request = get_request() request['here'] = portal.foo_module rendered_listbox = listbox.render(REQUEST=request) # Make sure that word is there self.assertEqual(rendered_listbox.find(word) > 0, True)
def pt_render(self, source=0, extra_context={}): doc_xml = ZopePageTemplate.pt_render(self, source=source, extra_context=extra_context) # Unmarshall arguments to __call__ API args = extra_context.get('options', []) kwargs = extra_context.copy() if kwargs.has_key('options'): del kwargs['options'] if kwargs.has_key('context'): del kwargs['context'] batch_mode = extra_context.get('batch_mode', 0) request = extra_context.get('REQUEST', None) if not request: request = get_request() if request.get('debug', 0): return doc_xml report_tool = getToolByName(self, 'portal_report') pdf = report_tool.renderPDF(self.pdf_stylesheet, doc_xml, context=self.pt_getContext()['here'], *args, **kwargs) if request and not batch_mode: request.RESPONSE.setHeader('Content-Type', 'application/pdf') request.RESPONSE.setHeader('Content-Length', len(pdf)) request.RESPONSE.setHeader( 'Content-Disposition', 'inline;filename=%s.pdf' % self.title_or_id()) return pdf
def test_UTF8URLColumns(self, quiet=0, run=run_all_test): """URL column script can return UTF8 encoded string """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a url column method url_column_method_id = 'Base_get%sUrlColumnMethod' % self.id() createZODBPythonScript( portal.portal_skins.custom, url_column_method_id, 'selection=None, **kw', """return u'http://example.com/?\xe9lisa'.encode('utf8')""") listbox = portal.FooModule_viewFooList.listbox # here we cover two cases, id has an editable field, title has not listbox.ListBox_setPropertyList(field_url_columns=[ 'title | %s' % url_column_method_id, 'id | %s' % url_column_method_id, ], ) foo_module = portal.foo_module o = foo_module.newContent(title=u'\xe9lisa') o.immediateReindexObject() request = get_request() request['here'] = portal.foo_module try: rendered = listbox.get_value('default', render_format='list', REQUEST=request) except UnicodeError, e: self.fail('Rendering failed: %s' % e)
def test_ObjectSupport(self): # make sure listbox supports rendering of simple objects # the only requirement is that objects have a `uid` attribute which is a # string starting by new_ (a convention to prevent indexing of objects). portal = self.getPortal() list_method_id = 'DummyListMethodId' portal.ListBoxZuite_reset() form = portal.FooModule_viewFooList listbox = form.listbox listbox.ListBox_setPropertyList( field_list_method = list_method_id, field_count_method = '', field_editable_columns = ['title | title'], field_columns = ['title | Title',],) form.manage_addField('listbox_title', 'Title', 'StringField') createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, **kw', "from Products.PythonScripts.standard import Object\n" "return [Object(uid='new_', title='Object Title')]") request = get_request() request['here'] = portal.foo_module line_list = [l for l in listbox.get_value('default', render_format='list', REQUEST=request) if l.isDataLine()] self.assertEquals(1, len(line_list)) self.assertEquals('Object Title', line_list[0].getColumnProperty('title')) html = listbox.render(REQUEST=request) self.failUnless('Object Title' in html, html)
def test_04_UnicodeParameters(self, quiet=0, run=run_all_test): """Unicode properties are handled. """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a list method list_method_id = 'ListBox_ParametersListMethod' createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, **kw', """return [context.asContext(alternate_title = u'\xe9lisa')]""") # set the listbox to use this as list method listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method = list_method_id, field_count_method = '', field_columns = ['alternate_title | Alternate Title',],) request = get_request() request['here'] = portal.foo_module try: listbox.get_value('default', render_format='list', REQUEST=request) except UnicodeError, e: self.fail('Rendering failed: %s' % e)
def getCachedPageTemplate(self, id=None, REQUEST=None): global cached_template global expires_date if id is not None: # Get the user id and request if not REQUEST: REQUEST = get_request() user_id = self.portal_membership.getAuthenticatedMember( ).getIdOrUserName() key = (user_id, id) # lookup the cache for time now = time.time() # if cache exists and time is OK, return cache expires = expires_date.get(key, now) if expires > now: LOG('CACHED:', 0, str(id)) return cached_template[key] # else recompute cache method = getattr(self, id, None) if method is not None: cached_template[key] = method(REQUEST=REQUEST) expires_date[key] = now + CACHE_DURATION return cached_template[key] else: return ''
def test_03_DefaultParameters(self, quiet=quiet, run=run_all_test): """Defaults parameters are passed as keyword arguments to the list method """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a list method, in this script, we will check # the default parameter. list_method_id = 'ListBox_checkDefaultParametersListMethod' createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, dummy_default_param=None, **kw', """ if dummy_default_param != 'dummy value': raise AssertionError('recieved wrong arguments: %s instead of "dummy value"' % dummy_default_param ) return [] """) # set the listbox to use this as list method listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method = list_method_id, field_count_method = '', field_default_params = 'dummy_default_param | dummy value',) # render the listbox, checks are done by list method itself request = get_request() request['here'] = portal.foo_module listbox.get_value('default', render_format='list', REQUEST=request)
def test_03_DefaultParameters(self, quiet=quiet, run=run_all_test): """Defaults parameters are passed as keyword arguments to the list method """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a list method, in this script, we will check # the default parameter. list_method_id = 'ListBox_checkDefaultParametersListMethod' createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, dummy_default_param=None, **kw', textwrap.dedent(""" if dummy_default_param != 'dummy value': raise AssertionError('recieved wrong arguments: %s instead of "dummy value"' % dummy_default_param ) return [] """)) # set the listbox to use this as list method listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method=list_method_id, field_count_method='', field_default_params='dummy_default_param | dummy value', ) # render the listbox, checks are done by list method itself request = get_request() request['here'] = portal.foo_module listbox.get_value('default', render_format='list', REQUEST=request)
def test_ProxyFieldRenderFormatLines(self): # tests that listbox default value in render_format=list mode is # compatible with proxy field. portal = self.getPortal() portal.ListBoxZuite_reset() form = portal.FooModule_viewFooList listbox = form.listbox listbox.ListBox_setPropertyList(field_list_method="contentValues", field_columns=["listbox_value | Title"]) # create a form, to store our proxy field inside portal._setObject("Test_view", ERP5Form("Test_view", "View")) portal.Test_view.manage_addField("listbox", "listbox", "ProxyField") proxy_field = portal.Test_view.listbox proxy_field.manage_edit_xmlrpc( dict(form_id=form.getId(), field_id="listbox", columns=[("proxy_value", "Proxy")]) ) # this proxy field will not delegate its "columns" value proxy_field._surcharged_edit(dict(columns=[("proxy_value", "Proxy")]), ["columns"]) request = get_request() request["here"] = portal.foo_module line_list = proxy_field.get_value("default", render_format="list", REQUEST=request) self.failUnless(isinstance(line_list, list)) title_line = line_list[0] self.failUnless(title_line.isTitleLine()) # title of columns is the value overloaded by the proxy field. self.assertEquals([("proxy_value", "Proxy")], title_line.getColumnItemList())
def render_odf(self, field, key, value, REQUEST, render_format='ooo', render_prefix=None): """ Render a Chart for ODT Style. """ if REQUEST is None: REQUEST = get_request() form = field.aq_parent here = getattr(form, 'aq_parent', REQUEST) REQUEST.set('render_prefix', render_prefix) #needed to update REQUEST argument_dict = self.getArgumentDict(field, REQUEST) from xml.marshal.generic import dumps dump_args = dumps(argument_dict) #remove xml declaration (first processing node) dump_args = dump_args[dump_args.index('?>') + 2:] content = '''<office:include path="%s/ERP5Site_buildChart" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed">%s</office:include> ''' % (here.getPath(), dump_args) return content
def test_02_DefaultSort(self, quiet=quiet, run=run_all_test): """Defaults sort parameters must be passed to the list method, under the 'sort_on' key. """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a list method, in this script, we will check # the sort_on parameter. list_method_id = 'ListBox_checkSortOnListMethod' createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, sort_on=None, **kw', textwrap.dedent(r""" if sort_on != [('title', 'ASC'), ('uid', 'ASC')]: raise AssertionError('sort_on is %r' % sort_on) return [] """)) # set the listbox to use this as list method listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method=list_method_id, field_count_method='', field_sort='title | ASC\n' 'uid | ASC', ) # render the listbox, checks are done by list method itself request = get_request() request['here'] = portal.foo_module listbox.get_value('default', render_format='list', REQUEST=request)
def resetPassword(self, reset_key=None, REQUEST=None): """ """ # XXX-Aurel : is it used ? if REQUEST is None: REQUEST = get_request() user_login, expiration_date = self._password_request_dict.get( reset_key, (None, None)) site_url = self.getPortalObject().absolute_url() if REQUEST and 'came_from' in REQUEST: site_url = REQUEST.came_from if reset_key is None or user_login is None: ret_url = '%s/login_form' % site_url return REQUEST.RESPONSE.redirect(ret_url) # check date current_date = DateTime() if current_date > expiration_date: msg = translateString("Date has expire.") parameter = urlencode(dict(portal_status_message=msg)) ret_url = '%s/login_form?%s' % (site_url, parameter) return REQUEST.RESPONSE.redirect(ret_url) # redirect to form as all is ok REQUEST.set("password_key", reset_key) return self.reset_password_form(REQUEST=REQUEST)
def get_value(self, id, REQUEST=None, **kw): if REQUEST is None: REQUEST = get_request() if REQUEST is not None: field = REQUEST.get( 'field__proxyfield_%s_%s_%s' % (self.id, self._p_oid, id), self) else: field = self cache_id = ('Form.get_value', self._p_oid, field._p_oid, id) try: value = field_value_cache[cache_id] except KeyError: # either returns non callable value (ex. "Title") # or a FieldValue instance of appropriate class value, cacheable = getFieldValue(self, field, id, **kw) # Do not cache if the field is not stored in zodb, # because such field must be used for editing field in ZMI # and caching sometimes break these field settings at initialization. # As the result, we would see broken field editing screen in ZMI. if cacheable and self._p_oid: field_value_cache[cache_id] = value if callable(value): return value(field, id, **kw) return value
def resetPassword(self, reset_key=None, REQUEST=None): """ """ # XXX-Aurel : is it used ? if REQUEST is None: REQUEST = get_request() user_login, expiration_date = self._password_request_dict.get(reset_key, (None, None)) site_url = self.getPortalObject().absolute_url() if REQUEST and 'came_from' in REQUEST: site_url = REQUEST.came_from if reset_key is None or user_login is None: ret_url = '%s/login_form' % site_url return REQUEST.RESPONSE.redirect( ret_url ) # check date current_date = DateTime() if current_date > expiration_date: msg = translateString("Date has expire.") parameter = urlencode(dict(portal_status_message=msg)) ret_url = '%s/login_form?%s' % (site_url, parameter) return REQUEST.RESPONSE.redirect( ret_url ) # redirect to form as all is ok REQUEST.set("password_key", reset_key) return self.reset_password_form(REQUEST=REQUEST)
def test_02_DefaultSort(self, quiet=quiet, run=run_all_test): """Defaults sort parameters must be passed to the list method, under the 'sort_on' key. """ portal = self.getPortal() portal.ListBoxZuite_reset() # We create a script to use as a list method, in this script, we will check # the sort_on parameter. list_method_id = 'ListBox_checkSortOnListMethod' createZODBPythonScript( portal.portal_skins.custom, list_method_id, 'selection=None, sort_on=None, **kw', r""" if sort_on != [('title', 'ASC'), ('uid', 'ASC')]: raise AssertionError('sort_on is %r' % sort_on) return [] """) # set the listbox to use this as list method listbox = portal.FooModule_viewFooList.listbox listbox.ListBox_setPropertyList( field_list_method = list_method_id, field_count_method = '', field_sort = 'title | ASC\n' 'uid | ASC',) # render the listbox, checks are done by list method itself request = get_request() request['here'] = portal.foo_module listbox.get_value('default', render_format='list', REQUEST=request)
def stepRenderList(self, sequence = None, sequence_list = None, **kw): portal = self.getPortal() listbox = portal.FooModule_viewFooList.listbox request = get_request() request['here'] = portal.foo_module listboxline_list = listbox.get_value('default', render_format = 'list', REQUEST = request) sequence.edit(listboxline_list = listboxline_list)
def pushReport(self, context, render_prefix=None): self.pushRequest() REQUEST = get_request() portal_selections = context.portal_selections selection_list = [self.selection_name] # when the Form which is specified by form_id, has a listbox, make prefixed_selection_name. # which is based on specified selection_name in the listbox. form_id = self.getFormId() if form_id: listbox = getattr(getattr(context, form_id), "listbox", None) if listbox is not None: selection_name = listbox.get_value("selection_name") if render_prefix is not None: selection_name = "%s_%s" % (render_prefix, selection_name) REQUEST.other["prefixed_selection_name"] = selection_name selection_list.append(selection_name) # save report's selection and orignal form's selection, # as ListBox will overwrite it for selection_name in filter(lambda x: x is not None, selection_list): if self.temporary_selection: portal_selections.pushSelection(selection_name) else: if portal_selections.getSelectionFor(selection_name) is None: portal_selections.setSelectionFor(selection_name, Selection(selection_name)) if self.selection_report_list is not None: selection = portal_selections.getSelectionFor(selection_name, REQUEST=REQUEST) selection.edit(report_list=self.selection_report_list) if self.selection_report_path is not None: selection = portal_selections.getSelectionFor(selection_name, REQUEST=REQUEST) selection.edit(report_path=self.selection_report_path) if self.listbox_display_mode is not None: # XXX Dirty fix, to be able to change the display mode in form_view REQUEST.list_selection_name = selection_name portal_selections.setListboxDisplayMode( REQUEST, self.listbox_display_mode, selection_name=selection_name ) if self.selection_params is not None: params = portal_selections.getSelectionParamsFor(selection_name, REQUEST=REQUEST) params.update(self.selection_params) portal_selections.setSelectionParamsFor(selection_name, params, REQUEST=REQUEST) if self.selection_columns is not None: portal_selections.setSelectionColumns(selection_name, self.selection_columns, REQUEST=REQUEST) if self.selection_sort_order is not None: portal_selections.setSelectionSortOrder(selection_name, self.selection_sort_order, REQUEST=REQUEST) if self.selection_stats is not None: portal_selections.setSelectionStats(selection_name, self.selection_stats, REQUEST=REQUEST) # When rendering a report section with a listbox, listbox gets parameters # from request.form and edits selection with those parameters, so if you # happen to pass explicitly selection params that have the same name as # some request parameters (some dialog fields) but different values, # listbox would not use your explicit parameters, but the ones from # REQUEST.form, so we remove eventual request parameters that have the same # name of selections parameters passed explicitly. for selection_parameter in self.selection_params or (): REQUEST.form.pop(selection_parameter, None)
def pushRequest(self): self = aq_base(self) if hasattr(self, '_REQUEST'): raise ValueError, "can not replace the backupped REQUEST" self._REQUEST = {'form': {}, 'other': {},} REQUEST = get_request() self._REQUEST['form'].update(REQUEST.form) self._REQUEST['other'].update(REQUEST.other) REQUEST.form.update(self.param_dict)
def pushRequest(self): self = aq_base(self) if hasattr(self, "_REQUEST"): raise ValueError, "can not replace the backupped REQUEST" self._REQUEST = {"form": {}, "other": {}} REQUEST = get_request() self._REQUEST["form"].update(REQUEST.form) self._REQUEST["other"].update(REQUEST.other) REQUEST.form.update(self.param_dict)
def changeUserPassword(self, password, password_key, password_confirm=None, user_login=None, REQUEST=None, **kw): """ Reset the password for a given login """ # BBB: password_confirm: unused argument def error(message): # BBB: should "raise Redirect" instead of just returning, simplifying # calling code and making mistakes more difficult # BBB: should probably not translate message when REQUEST is None message = translateString(message) if REQUEST is None: return message return REQUEST.RESPONSE.redirect( site_url + '/login_form?' + urlencode({ 'portal_status_message': message, })) if REQUEST is None: REQUEST = get_request() if self.getWebSiteValue(): site_url = self.getWebSiteValue().absolute_url() elif REQUEST and 'came_from' in REQUEST: site_url = REQUEST.came_from else: site_url = self.getPortalObject().absolute_url() try: register_user_login, expiration_date = self._password_request_dict[ password_key] except KeyError: # XXX: incorrect grammar and not descriptive enough return error('Key not known. Please ask reset password.') if user_login is not None and register_user_login != user_login: # XXX: not descriptive enough return error("Bad login provided.") if DateTime() > expiration_date: # XXX: incorrect grammar return error("Date has expire.") del self._password_request_dict[password_key] persons = self.getPortalObject().acl_users.erp5_users.getUserByLogin( register_user_login) person = persons[0] person._forceSetPassword(password) person.reindexObject() if REQUEST is not None: return REQUEST.RESPONSE.redirect( site_url + '/login_form?' + urlencode({ 'portal_status_message': translateString("Password changed."), }))
def pushRequest(self): self = aq_base(self) if hasattr(self, '_REQUEST'): raise ValueError("can not replace the backupped REQUEST") self._REQUEST = {'form': {}, 'other': {},} REQUEST = get_request() self._REQUEST['form'].update(REQUEST.form) self._REQUEST['other'].update(REQUEST.other) REQUEST.form.update(self.param_dict)
def _helperEditableColumn(self, editable_in_listbox, editable_in_line, expected_editable): portal = self.getPortal() portal.ListBoxZuite_reset() field_name = 'editableproperty_%s_%s' \ % (editable_in_listbox, editable_in_line) field_name = field_name.lower() field_id = 'listbox_%s' % field_name # Reset listbox properties listbox = portal.FooModule_viewFooList.listbox kw = dict( field_list_method='portal_catalog', field_columns=[ '%s | Check extra' % field_name, ], ) if editable_in_listbox: kw['field_editable_columns'] = '%s | Check extra' % field_name listbox.ListBox_setPropertyList(**kw) form = portal.FooModule_viewFooList form.manage_addField(field_id, field_name, "StringField") field = getattr(form, field_id) field.values['default'] = '42' field.values['editable'] = editable_in_line form.groups['bottom'].remove(field_id) form.groups['hidden'].append(field_id) # Create an new empty object with a list property foo_module = portal.foo_module o = foo_module.newContent() # Reindex o.immediateReindexObject() # Render the module in html request = get_request() request['here'] = portal.foo_module rendered_listbox = listbox.render(REQUEST=request) html = etree.HTML(rendered_listbox) # When a StringField is editable, it is rendered as an input # with name: "field_%(field_id)s_%(object_id)s" editable_field_list = html.xpath( '//input[starts-with(@name, $name)]', name='field_%s_' % field_id, ) msg = "editable_in_listbox: %s, editable_in_line: %s" \ % (editable_in_listbox, editable_in_line) self.assertEquals( len(editable_field_list) == 1, expected_editable, msg)
def stepRenderStructure(self, sequence=None, sequence_list=None, **kw): portal = self.getPortal() context = portal.foo_module['0'] planningbox = context.Foo_viewPlanningBox.planning_box request = get_request() request['here'] = context #planningboxline_list = planningbox.get_value('default', REQUEST = request) basic, planning = planningbox.widget.render_structure( field=planningbox, REQUEST=request, context=context) sequence.edit(planning_box=planningbox, basic=basic, planning=planning)
def popRequest(self): self = aq_base(self) if not hasattr(self, '_REQUEST'): raise ValueError, "no backupped REQUEST" REQUEST = get_request() REQUEST.form.clear() REQUEST.other.clear() REQUEST.form.update(self._REQUEST['form']) REQUEST.other.update(self._REQUEST['other']) del self._REQUEST
def popRequest(self): self = aq_base(self) if not hasattr(self, '_REQUEST'): raise ValueError("no backupped REQUEST") REQUEST = get_request() REQUEST.form.clear() REQUEST.other.clear() REQUEST.form.update(self._REQUEST['form']) REQUEST.other.update(self._REQUEST['other']) del self._REQUEST
def render(self, name='', extension='sxw', source=False): """ returns the OOo document """ if name and not(source): request = get_request() request.response.setHeader('Content-Disposition', 'attachment; filename=%s.%s' % (name, extension)) self._document.seek(0) return self._document.read()
def _helperEditableColumn(self, editable_in_listbox, editable_in_line, expected_editable): portal = self.getPortal() portal.ListBoxZuite_reset() field_name = 'editableproperty_%s_%s' \ % (editable_in_listbox, editable_in_line) field_name = field_name.lower() field_id = 'listbox_%s' % field_name # Reset listbox properties listbox = portal.FooModule_viewFooList.listbox kw = dict( field_list_method = 'portal_catalog', field_columns = ['%s | Check extra' % field_name,], ) if editable_in_listbox: kw['field_editable_columns'] = '%s | Check extra' % field_name listbox.ListBox_setPropertyList(**kw) form = portal.FooModule_viewFooList form.manage_addField(field_id, field_name, "StringField") field = getattr(form, field_id) field.values['default'] = '42' field.values['editable'] = editable_in_line form.groups['bottom'].remove(field_id) form.groups['hidden'].append(field_id) # Create an new empty object with a list property foo_module = portal.foo_module o = foo_module.newContent() # Reindex o.immediateReindexObject() # Render the module in html request = get_request() request['here'] = portal.foo_module rendered_listbox = listbox.render(REQUEST=request) html = etree.HTML(rendered_listbox) # When a StringField is editable, it is rendered as an input # with name: "field_%(field_id)s_%(object_id)s" editable_field_list = html.xpath( '//input[starts-with(@name, $name)]', name='field_%s_' % field_id, ) msg = "editable_in_listbox: %s, editable_in_line: %s" \ % (editable_in_listbox, editable_in_line) self.assertEquals(len(editable_field_list) == 1, expected_editable, msg)
def install(): from ZPublisher.BaseRequest import RequestContainer from Products.ERP5Type.Globals import get_request portal = self.getPortalObject() # BusinessTemplate.install needs a request template_tool = portal.aq_base.__of__(portal.aq_parent.__of__( RequestContainer(REQUEST=get_request()))).portal_templates if template_tool.getInstalledBusinessTemplate(bt_name) is None: from Products.ERP5.ERP5Site import getBootstrapBusinessTemplateUrl url = getBootstrapBusinessTemplateUrl(bt_name) template_tool.download(url).install()
def render_view(self, field, value, REQUEST=None, key='reportbox', render_prefix=None): """ """ if REQUEST is None: REQUEST = get_request() return self.render(field, key, value, REQUEST)
def get_value(self, id, **kw): if id in self.widget.property_names: return ZMIField.get_value(self, id, **kw) if not self.is_delegated(id): original_template_field = self.getRecursiveTemplateField() function = getOriginalGetValueFunction(original_template_field, id) if function is not None: return function(self, id, **kw) else: return ZMIField.get_value(self, id, **kw) field = self proxy_field = self.getTemplateField() REQUEST = kw.get('REQUEST', get_request()) if proxy_field is not None and REQUEST is not None: field = REQUEST.get( 'field__proxyfield_%s_%s_%s' % (self.id, self._p_oid, id), self) REQUEST.set( 'field__proxyfield_%s_%s_%s' % (proxy_field.id, proxy_field._p_oid, id), field) # Don't use cache if field is not stored in zodb, or if target field is # defined by a TALES if self._p_oid is None or self.tales['field_id'] or self.tales['form_id']: return self._get_value(id, **kw) # XXX: Are these disabled? proxy_field = self.getTemplateField(cache=False) if proxy_field is not None: return proxy_field.get_value(id, **kw) else: return None cache_id = ('ProxyField.get_value', self._p_oid, field._p_oid, id) from Products.ERP5Form.Form import field_value_cache try: value = field_value_cache[cache_id] except KeyError: # either returns non callable value (ex. "Title") # or a FieldValue instance of appropriate class value, cacheable = self.getFieldValue(field, id, **kw) if cacheable: field_value_cache[cache_id] = value if value is _USE_ORIGINAL_GET_VALUE_MARKER: return proxy_field.get_value(id, **kw) if callable(value): return value(field, id, **kw) return value
def changeUserPassword(self, password, password_key, password_confirm=None, user_login=None, REQUEST=None, **kw): """ Reset the password for a given login """ # BBB: password_confirm: unused argument def error(message): # BBB: should "raise Redirect" instead of just returning, simplifying # calling code and making mistakes more difficult # BBB: should probably not translate message when REQUEST is None message = translateString(message) return redirect(REQUEST, site_url, message) if REQUEST is None: REQUEST = get_request() if self.getWebSiteValue(): site_url = self.getWebSiteValue().absolute_url() elif REQUEST and 'came_from' in REQUEST: site_url = REQUEST.came_from else: site_url = self.getPortalObject().absolute_url() try: register_user_login, expiration_date = self._password_request_dict[ password_key] except (KeyError, TypeError): # XXX: incorrect grammar and not descriptive enough return error('Key not known. Please ask reset password.') if user_login is not None and register_user_login != user_login: # XXX: not descriptive enough return error("Bad login provided.") if DateTime() > expiration_date: # XXX: incorrect grammar return error("Date has expire.") del self._password_request_dict[password_key] portal = self.getPortalObject() user_dict, = portal.acl_users.searchUsers( login=register_user_login, exact_match=True, ) login_dict, = user_dict['login_list'] login = portal.unrestrictedTraverse(login_dict['path']) login.checkPasswordValueAcceptable( password) # this will raise if password does not match policy login._forceSetPassword(password) login.reindexObject() return redirect(REQUEST, site_url, translateString("Password changed."))
def getObject(self): """ Get the Object. """ from Products.ERP5Type.Globals import get_request request = get_request()['PARENTS'] if request is not None: for item in request: if item.meta_type == 'ERP5 Site': return item.unrestrictedTraverse(self.object_relative_url) return None
def render(self, field, key, value, REQUEST, render_prefix=None): """ Render editor """ if REQUEST is None: REQUEST = get_request() here = REQUEST['here'] text_editor = field.get_value('text_editor') if text_editor == "svg_editor": svg_editor_support = getattr(here, 'svg_editor_support', None) if svg_editor_support is not None: return svg_editor_support.pt_render() elif text_editor == "spreadsheet_editor": sheet_editor_support = getattr(here, 'sheet_editor_support', None) if sheet_editor_support is not None: return sheet_editor_support.pt_render() elif text_editor == 'ace': ace_editor_support = getattr(here, 'ace_editor_support', None) if ace_editor_support is not None: return ace_editor_support.pt_render(extra_context={ 'field': field, 'content': value, 'id': key }) elif text_editor == 'codemirror': code_mirror_support = getattr(here, 'code_mirror_support', None) if code_mirror_support is not None: mode = "python" portal_type = here.getPortalType() if portal_type == "Web Page": mode = "htmlmixed" elif portal_type == "Web Script": mode = "javascript" elif portal_type == "Web Style": mode = "css" site_root = here.getWebSiteValue() or here.getPortalObject() portal_type = here.getPortalType() return code_mirror_support( field=field, content=value, field_id=key, portal_url=site_root.absolute_url(), mode=mode, keymap=site_root.portal_preferences. getPreferredSourceCodeEditorKeymap(), portal_type=portal_type) elif text_editor != 'text_area': return here.fckeditor_wysiwyg_support.pt_render(extra_context={ 'inputvalue': value, 'inputname': key }) return Widget.TextAreaWidget.render(self, field, key, value, REQUEST)
def _physicalPathToVirtualPath(self, path): """ Remove the path to the VirtualRoot from a physical path and add the path to the WebSite if any """ if isinstance(path, str): path = path.split('/') # Every Web Section acts as a mini site though layout for document editing is the root layout #website_path = self._v_request.get(WEBSECTION_KEY, self._v_request.get(WEBSITE_KEY, None)) # Only consider Web Site for absolute_url request = getattr(self, '_v_request', None) if request is None: request = self._v_request = get_request() # In ignore_layout case, we only remove empty element from path # XXX more support required for ignore_layout? if request.get('ignore_layout', None): return HTTPRequest.physicalPathToVirtualPath(request, path) website_path = request.get(WEBSITE_KEY, None) select_language = request.get(WEBSITE_LANGUAGE_KEY, None) if website_path: website_path = tuple(website_path) # Make sure all path are tuples path = tuple(path) # Make sure all path are tuples if select_language: website_path = website_path + (select_language, ) # Add the language part # Search for the common part index # XXX more testing should be added to check # if the URL is the kind of URL which is a Web Site common_index = 0 i = 0 path_len = len(path) for name in website_path: if i >= path_len: break if path[i] == name: common_index = i i += 1 # Insert the web site path after the common part of the path if path_len > common_index + 1: path = website_path + path[common_index + 1:] rpp = request.other.get('VirtualRootPhysicalPath', ('', )) i = 0 for name in rpp[:len(path)]: if path[i] == name: i = i + 1 else: break #if self._v_request.has_key(DOCUMENT_NAME_KEY): # # Replace the last id of the path with the name which # # was used to lookup the document # path = path[:-1] + (self._v_request[DOCUMENT_NAME_KEY],) return path[i:]
def __call__(self, field, id, **kw): # By default, pages are editable and # fields are editable if they are set to editable mode # However, if the REQUEST defines editable_mode to 0 # then all fields become read only. # This is useful to render ERP5 content as in a web site (ECommerce) # editable_mode should be set for example by the page template # which defines the current layout REQUEST = kw.get('REQUEST', get_request()) if REQUEST is not None: if not REQUEST.get('editable_mode', 1): return 0 return self.value
def stepRenderStructure(self, sequence = None, sequence_list = None, **kw): portal = self.getPortal() context = portal.foo_module['0'] planningbox = context.Foo_viewPlanningBox.planning_box request = get_request() request['here'] = context #planningboxline_list = planningbox.get_value('default', REQUEST = request) basic, planning = planningbox.widget.render_structure(field=planningbox, REQUEST=request, context=context) sequence.edit(planning_box = planningbox, basic=basic, planning=planning)
def test_ListboxRequestParameterPropagandation(self): """ Test that rendering a listbox field will set respective form & field_id of current form in REQUEST for further usage by used by litsbox's columns methods. """ portal = self.getPortal() request = get_request() portal.ListBoxZuite_reset() form = portal.FooModule_viewFooList self.assertEqual(None, request.get('listbox_form_id')) form.render() self.assertEqual(form.getId(), request.get('listbox_form_id')) self.assertEqual(form.listbox.getId(), request.get('listbox_field_id'))
def __call__(self, field, id, **kw): REQUEST = get_request() try: form = field.aq_parent ob = REQUEST.get('cell', getattr(form, 'aq_parent', None)) value = self.value try: if value not in (None, ''): # If a default value is defined on the field, it has precedence value = ob.getProperty(self.key, d=value) else: # else we should give a chance to the accessor to provide # a default value (including None) value = ob.getProperty(self.key) except Unauthorized: value = ob.getProperty(self.key, d=value, checked_permission='View') REQUEST = kw.get('REQUEST', get_request()) if REQUEST is not None: REQUEST.set('read_only_%s' % self.key, 1) except (KeyError, AttributeError): value = None return self.returnValue(field, id, value)
def _physicalPathToVirtualPath(self, path): """ Remove the path to the VirtualRoot from a physical path and add the path to the WebSite if any """ if isinstance(path, str): path = path.split( '/') # Every Web Section acts as a mini site though layout for document editing is the root layout #website_path = self._v_request.get(WEBSECTION_KEY, self._v_request.get(WEBSITE_KEY, None)) # Only consider Web Site for absolute_url request = getattr(self, '_v_request', None) if request is None: request = self._v_request = get_request() # In ignore_layout case, we only remove empty element from path # XXX more support required for ignore_layout? if request.get('ignore_layout', None): return HTTPRequest.physicalPathToVirtualPath(request, path) website_path = request.get(WEBSITE_KEY, None) select_language = request.get(WEBSITE_LANGUAGE_KEY, None) if website_path: website_path = tuple(website_path) # Make sure all path are tuples path = tuple(path) # Make sure all path are tuples if select_language: website_path = website_path + (select_language,) # Add the language part # Search for the common part index # XXX more testing should be added to check # if the URL is the kind of URL which is a Web Site common_index = 0 i = 0 path_len = len(path) for name in website_path: if i >= path_len: break if path[i] == name: common_index = i i += 1 # Insert the web site path after the common part of the path if path_len > common_index + 1: path = website_path + path[common_index + 1:] rpp = request.other.get('VirtualRootPhysicalPath', ('', )) i = 0 for name in rpp[:len(path)]: if path[i] == name: i = i + 1 else: break #if self._v_request.has_key(DOCUMENT_NAME_KEY): # # Replace the last id of the path with the name which # # was used to lookup the document # path = path[:-1] + (self._v_request[DOCUMENT_NAME_KEY],) return path[i:]
def changeUserPassword(self, password, password_key, password_confirm=None, user_login=None, REQUEST=None, **kw): """ Reset the password for a given login """ # BBB: password_confirm: unused argument def error(message): # BBB: should "raise Redirect" instead of just returning, simplifying # calling code and making mistakes more difficult # BBB: should probably not translate message when REQUEST is None message = translateString(message) if REQUEST is None: return message return REQUEST.RESPONSE.redirect( site_url + '/login_form?' + urlencode({ 'portal_status_message': message, }) ) if REQUEST is None: REQUEST = get_request() if self.getWebSiteValue(): site_url = self.getWebSiteValue().absolute_url() elif REQUEST and 'came_from' in REQUEST: site_url = REQUEST.came_from else: site_url = self.getPortalObject().absolute_url() try: register_user_login, expiration_date = self._password_request_dict[ password_key] except KeyError: # XXX: incorrect grammar and not descriptive enough return error('Key not known. Please ask reset password.') if user_login is not None and register_user_login != user_login: # XXX: not descriptive enough return error("Bad login provided.") if DateTime() > expiration_date: # XXX: incorrect grammar return error("Date has expire.") del self._password_request_dict[password_key] persons = self.getPortalObject().acl_users.erp5_users.getUserByLogin( register_user_login) person = persons[0] person._forceSetPassword(password) person.reindexObject() if REQUEST is not None: return REQUEST.RESPONSE.redirect( site_url + '/login_form?' + urlencode({ 'portal_status_message': translateString("Password changed."), }) )
def __call__(self, field, id, **kw): try: form = field.aq_parent ob = getattr(form, 'aq_parent', None) value = self.value try: value = ob.getProperty(self.key) except Unauthorized: value = ob.getProperty(self.key, d=value, checked_permission='View') REQUEST = kw.get('REQUEST', get_request()) if REQUEST is not None: REQUEST.set('read_only_%s' % self.key, 1) except (KeyError, AttributeError): value = None return self.returnValue(field, id, value)
def render_view(self, field, value, REQUEST=None, render_prefix=None): """ Render read only field. """ if (value not in ((), [], None, '')) and field.get_value('allow_jump'): if not isinstance(value, (list, tuple)): value = value, html_string = '<br />'.join( '<a class="relationfieldlink" href="%s">%s</a>' % ( escape(jump_reference.absolute_url()), escape(display_value), ) for jump_reference, display_value in zip( getattr( self._getContextValue(field, REQUEST), 'get%sValueList' % ''.join( part.capitalize() for part in field.get_value('base_category').split('_') ) )( portal_type=[x[0] for x in field.get_value('portal_type')], filter=dict(field.get_value('parameter_list')), ), value, ) ) else: html_string = self.default_widget_rendering_instance.render_view( field, value, REQUEST=REQUEST, ) if REQUEST is None: REQUEST = get_request() relation_html_string = self.render_relation_link(field, value, REQUEST) if relation_html_string: html_string += NBSP + NBSP + relation_html_string extra = field.get_value('extra') if extra not in (None, ''): html_string = "<div %s>%s</div>" % (extra, html_string) css_class = field.get_value('css_class') if css_class not in ('', None): html_string = '<span class="%s">%s</span>' % ( escape(css_class), html_string, ) return html_string