def get_mail_body(self, fields, request, context): """Returns the mail-body with footer. """ schema = get_fields(context) all_fields = [f for f in fields # TODO # if not (f.isLabel() or f.isFileField()) and not (getattr(self, # 'showAll', True) and f.getServerSide())] if not (INamedFile.providedBy(fields[f])) and not (getattr(self, 'showAll', True) and IFieldExtender(schema[f]).serverSide) ] # which fields should we show? if getattr(self, 'showAll', True): live_fields = all_fields else: live_fields = [ f for f in all_fields if f in getattr(self, 'showFields', ())] if not getattr(self, 'includeEmpties', True): all_fields = live_fields live_fields = [f for f in all_fields if fields[f]] for f in all_fields: value = fields[f] if value: live_fields.append(f) #bare_fields = [schema[f] for f in live_fields] bare_fields = dict([(f, fields[f]) for f in live_fields]) bodyfield = self.body_pt # pass both the bare_fields (fgFields only) and full fields. # bare_fields for compatability with older templates, # full fields to enable access to htmlValue replacer = DollarVarReplacer(fields).sub extra = { 'data': bare_fields, 'fields': dict([(i, j.title) for i, j in getFieldsInOrder(schema)]), 'mailer': self, 'body_pre': self.body_pre and replacer(self.body_pre), 'body_post': self.body_post and replacer(self.body_post), 'body_footer': self.body_footer and replacer(self.body_footer), } template = ZopePageTemplate(self.__name__) template.write(bodyfield) template = template.__of__(context) body = template.pt_render(extra_context=extra) # if isinstance(body, unicode): #body = body.encode("utf-8") #keyid = getattr(self, 'gpg_keyid', None) #encryption = gpg and keyid # if encryption: #bodygpg = gpg.encrypt(body, keyid) # if bodygpg.strip(): #body = bodygpg return body
def __init__(self, context, request): self.schema = get_fields(context) super(EasyFormFieldsView, self).__init__( self.schema, request, name='fields' )
def testFgFieldsDisplayOnly(self): """ test EasyForm's fgFields displayOnly option """ ff = self.ff1 fields = get_fields(ff) res = dict([(i, fields[i]) for i in fields]) len1 = len(res) # TODO add label fields # ff.invokeFactory('FormLabelField', 'lf') # ff.invokeFactory('FormRichLabelField', 'rlf') # when displayOnly==True, fgFields should not return label fields self.assertEqual(len(get_fields(ff)), len1) # when displayOnly is omitted, all fields should be returned self.assertEqual(len(ff.fgFields()), len1 + 2)
def testDeleteSavedFormInput(self): ''' test manage_deleteData functionality ''' # set up saver self.createSaver() self.assertTrue('saver' in get_actions(self.ff1)) saver = get_actions(self.ff1)['saver'] # save a few rows fields = list(get_fields(self.ff1)) saver.addDataRow(dict(zip(fields, ['one', 'two', 'three']))) saver.addDataRow(dict(zip(fields, ['four', 'five', 'six']))) saver.addDataRow(dict(zip(fields, ['seven', 'eight', 'nine']))) self.assertEqual(saver.itemsSaved(), 3) # saver.manage_deleteData(saver._storage.keys()[1]) saver.delDataRow(saver.getSavedFormInputItems()[1][0]) self.assertEqual(saver.itemsSaved(), 2) items = saver.getSavedFormInputItems() self.assertEqual( items[0][1], dict(zip(['id'] + fields, [items[0][0], 'one', 'two', 'three']))) self.assertEqual( items[1][1], dict(zip(['id'] + fields, [items[1][0], 'seven', 'eight', 'nine'])))
def testSetSavedFormInput(self): ''' test setSavedFormInput functionality ''' # set up saver self.createSaver() self.assertTrue('saver' in get_actions(self.ff1)) saver = get_actions(self.ff1)['saver'] self.assertEqual(saver.getSavedFormInputForEdit(), '') # save a row fields = list(get_fields(self.ff1)) saver.addDataRow(dict(zip(fields, ['one', 'two', 'three']))) self.assertEqual(saver.itemsSaved(), 1) items = saver.getSavedFormInputItems() self.assertEqual( items[0][1], dict(zip(['id'] + fields, [items[0][0], 'one', 'two', 'three']))) self.assertEqual(saver.getSavedFormInputForEdit(), 'one,two,three\r\n') # save a couple of \n-delimited rows - \n eol saver.addDataRow(dict(zip(fields, ['four', 'five', 'six']))) self.assertEqual(saver.itemsSaved(), 2) items = saver.getSavedFormInputItems() self.assertEqual( items[0][1], dict(zip(['id'] + fields, [items[0][0], 'one', 'two', 'three']))) self.assertEqual( items[1][1], dict(zip(['id'] + fields, [items[1][0], 'four', 'five', 'six']))) self.assertEqual( saver.getSavedFormInputForEdit(), 'one,two,three\r\nfour,five,six\r\n') # save empty string saver.clearSavedFormInput() self.assertEqual(saver.itemsSaved(), 0) self.assertEqual(saver.getSavedFormInputForEdit(), '')
def testActiveAdaptersNotDuplicatedOnFormCopy(self): # self.loginAsPortalOwner() copy = self.folder.manage_copyObjects('ff1') new_id = self.folder.manage_pasteObjects(copy)[0]['new_id'] ff2 = getattr(self.folder, new_id) active_adapters = tuple(get_actions(ff2)) self.assertEqual(active_adapters, ('mailer',)) active_fields = tuple(get_fields(ff2)) self.assertEqual(active_fields, ('replyto', 'topic', 'comments'))
def test_basevalidator2(self): fields = get_fields(self.ff1) IFieldExtender(fields['comments']).validators = ["isInt", "isURL"] set_fields(self.ff1, fields) view = self.ff1.restrictedTraverse('view') form = view.form_instance form.update() data, errors = form.extractData() self.assertEqual(len(errors), 1)
def test_talvalidator2(self): fields = get_fields(self.ff1) IFieldExtender(fields['comments']).TValidator = "python: !value" set_fields(self.ff1, fields) view = self.ff1.restrictedTraverse('view') form = view.form_instance form.update() data, errors = form.extractData() self.assertEqual(len(errors), 1)
def testFgFieldsDisplayList(self): """ test EasyForm's fgFieldsDisplayList """ # in v 1.0.2, this caused "'unicode' object has no attribute 'decode'" # w/ Plone 2.5.1 and Zope 2.8.7 fields = get_fields(self.ff1) res = dict([(i, fields[i]) for i in fields]) self.assertEqual(len(res), 3) self.assertEqual(res.keys()[0], 'replyto') self.assertEqual(res.values()[0]._type, unicode)
def test_basevalidator(self): fields = get_fields(self.ff1) IFieldExtender(fields['replyto']).validators = ["isEmail"] set_fields(self.ff1, fields) view = self.ff1.restrictedTraverse('view') form = view.form_instance form.update() data, errors = form.extractData() self.assertEqual(errors, ()) self.assertEqual(data, FORM_DATA)
def getColumnNames(self): # """Returns a list of column names""" context = get_context(self) showFields = getattr(self, 'showFields', []) names = [ name for name, field in getFieldsInOrder(get_fields(context)) if not showFields or name in showFields ] if self.ExtraData: for f in self.ExtraData: names.append(f) return names
def __call__(self, context): terms = [] if hasattr(context, "interface"): form = get_context(context) elif hasattr(context, "fields_model"): form = context else: return SimpleVocabulary(terms) fields = getFieldsInOrder(get_fields(form)) for name, field in fields: terms.append(SimpleVocabulary.createTerm(name, str(name), field.title)) return SimpleVocabulary(terms)
def getColumnTitles(self): # """Returns a list of column titles""" context = get_context(self) showFields = getattr(self, 'showFields', []) names = [ field.title for name, field in getFieldsInOrder(get_fields(context)) if not showFields or name in showFields ] if self.ExtraData: for f in self.ExtraData: names.append(IExtraData[f].title) return names
def __call__(self, context): terms = [] if hasattr(context, 'interface'): form = get_context(context) elif hasattr(context, 'fields_model'): form = context else: return SimpleVocabulary(terms) fields = getFieldsInOrder(get_fields(form)) for name, field in fields: terms.append( SimpleVocabulary.createTerm(name, str(name), field.title)) return SimpleVocabulary(terms)
def getColumnNames(self): # """Returns a list of column names""" context = get_context(self) showFields = getattr(self, 'showFields', []) if showFields is None: showFields = [] names = [ name for name, field in getFieldsInOrder(get_fields(context)) if not showFields or name in showFields ] if self.ExtraData: for f in self.ExtraData: names.append(f) return names
def testEditSavedFormInput(self): ''' test manage_saveData functionality ''' # set up saver self.createSaver() self.assertTrue('saver' in get_actions(self.ff1)) saver = get_actions(self.ff1)['saver'] # save a row fields = list(get_fields(self.ff1)) #saver.savedFormInput = 'one,two,three' saver.addDataRow(dict(zip(fields, ['one', 'two', 'three']))) self.assertEqual(saver.itemsSaved(), 1) items = saver.getSavedFormInputItems() self.assertEqual( items[0][1], dict(zip(['id'] + fields, [items[0][0], 'one', 'two', 'three'])))
def getColumnTitles(self): # """Returns a list of column titles""" context = get_context(self) showFields = getattr(self, 'showFields', []) if showFields is None: showFields = [] names = [ field.title for name, field in getFieldsInOrder(get_fields(context)) if not showFields or name in showFields ] if self.ExtraData: for f in self.ExtraData: names.append(IExtraData[f].title) return names
def get_fields(self): return get_fields(get_context(self.field))
def schema(self): return get_fields(self.context)
def get_mail_body(self, fields, request, context): """Returns the mail-body with footer. """ schema = get_fields(context) all_fields = [ f for f in fields # TODO # if not (f.isLabel() or f.isFileField()) and not (getattr(self, # 'showAll', True) and f.getServerSide())] if not (self._is_file_data(fields[f])) and not (getattr(self, 'showAll', True) and IFieldExtender(schema[f]).serverSide) ] # which fields should we show? if getattr(self, 'showAll', True): live_fields = all_fields else: showFields = getattr(self, 'showFields', []) if showFields is None: showFields = [] live_fields = [f for f in all_fields if f in showFields] if not getattr(self, 'includeEmpties', True): all_fields = live_fields live_fields = [f for f in all_fields if fields[f]] for f in all_fields: value = fields[f] if value: live_fields.append(f) # bare_fields = [schema[f] for f in live_fields] bare_fields = OrderedDict([(f, fields[f]) for f in live_fields]) bodyfield = self.body_pt # pass both the bare_fields (fgFields only) and full fields. # bare_fields for compatability with older templates, # full fields to enable access to htmlValue replacer = DollarVarReplacer(fields).sub extra = { 'data': bare_fields, 'fields': OrderedDict([(i, j.title) for i, j in getFieldsInOrder(schema)]), 'mailer': self, 'body_pre': self.body_pre and replacer(self.body_pre), 'body_post': self.body_post and replacer(self.body_post), 'body_footer': self.body_footer and replacer(self.body_footer), } template = ZopePageTemplate(self.__name__) template.write(bodyfield) template = template.__of__(context) body = template.pt_render(extra_context=extra) # if isinstance(body, unicode): # body = body.encode("utf-8") # keyid = getattr(self, 'gpg_keyid', None) # encryption = gpg and keyid # if encryption: # bodygpg = gpg.encrypt(body, keyid) # if bodygpg.strip(): # body = bodygpg return body
def test_selectiveFieldMailing(self): """ Test selective inclusion of fields in the mailing """ mailer = get_actions(self.ff1)['mailer'] request = self.LoadRequestForm( topic='test subject', replyto='*****@*****.**', comments='test comments') # make sure all fields are sent unless otherwise specified self.messageText = '' mailer.onSuccess(request.form, request) self.assertTrue( self.messageBody.find('test subject') > 0 and self.messageBody.find('*****@*****.**') > 0 and self.messageBody.find('test comments') > 0 ) # setting some show fields shouldn't change that mailer.showFields = ('topic', 'comments',) self.messageText = '' mailer.onSuccess(request.form, request) self.assertTrue( self.messageBody.find('test subject') > 0 and self.messageBody.find('*****@*****.**') > 0 and self.messageBody.find('test comments') > 0 ) # until we turn off the showAll flag mailer.showAll = False self.messageText = '' mailer.onSuccess(request.form, request) self.assertTrue( self.messageBody.find('test subject') > 0 and self.messageBody.find('*****@*****.**') < 0 and self.messageBody.find('test comments') > 0 ) # check includeEmpties mailer.includeEmpties = False # first see if everything's still included mailer.showAll = True self.messageText = '' mailer.onSuccess(request.form, request) # look for labels self.assertTrue( self.messageBody.find('Subject') > 0 and self.messageBody.find('Your E-Mail Address') > 0 and self.messageBody.find('Comments') > 0 ) # now, turn off required for a field and leave it empty fields = get_fields(self.ff1) fields['comments'].required = False set_fields(self.ff1, fields) request = self.LoadRequestForm( topic='test subject', replyto='*****@*****.**',) self.messageText = '' mailer.onSuccess(request.form, request) self.assertTrue( self.messageBody.find('Subject') > 0 and self.messageBody.find('Your E-Mail Address') > 0 and self.messageBody.find('Comments') < 0 )