class IBannerImage(model.Schema): form.order_before(banner_image='IDublinCore.description') banner_image = namedfile.NamedBlobImage( title=_(u"Banner Image"), description=u"", required=False, ) form.order_before(banner_image_caption='IDublinCore.description') banner_image_caption = schema.TextLine( title=_(u"Banner Image Caption"), description=u"", required=False, )
class ISurveyGroup(form.Schema, IBasic): title = schema.TextLine( title=_("label_title", default=u"Title"), description=_( "help_surveygroup_title", default=u"The title of this OiRA Tool. This title is used in " u"the OiRA Tool overview in the clients."), required=True) form.order_before(title="*") form.omitted("description") obsolete = schema.Bool( title=_("label_survey_obsolete", default=u"Obsolete survey"), description=_( "help_survey_obsolete", default=u"This OiRA Tool is obsolete; it has been retired or " u"replaced with another OiRA Tool."), default=False, required=False) form.omitted(IEditForm, 'evaluation_algorithm') evaluation_algorithm = schema.Choice( title=_("label_survey_evaluation_algorithm", default=u"Evaluation algorithm"), vocabulary=SimpleVocabulary([ SimpleTerm(u"kinney", title=_("algorithm_kinney", default=u"Standard three criteria")), SimpleTerm(u"french", title=_("french", default=u"Simplified two criteria")), ]), default=u"kinney", required=True)
class IOGMail(form.Schema): """Opengever specific behavior, which add a title Field to the form. """ form.fieldset( u'common', label=base_mf(u'fieldset_common', u'Common'), fields=[u'title', 'original_message', 'message_source']) form.order_before(title='message') dexteritytextindexer.searchable('title') title = schema.TextLine( title=dossier_mf(u'label_title', default=u'Title'), required=False, ) form.mode(original_message=DISPLAY_MODE) form.read_permission(original_message='cmf.ManagePortal') form.write_permission(original_message='cmf.ManagePortal') original_message = field.NamedBlobFile( title=_(u'label_original_message', default=u'Raw *.msg message before conversion'), required=False, ) form.mode(message_source=DISPLAY_MODE) form.read_permission(message_source='cmf.ManagePortal') form.write_permission(message_source='cmf.ManagePortal') message_source = schema.Choice( title=_('label_message_source', default='Message source'), vocabulary=get_message_source_vocabulary(), required=False, )
class ISurveyEditSchema(ISurvey): survey_title = schema.TextLine( title=_("label_title", default=u"Title"), description=_( "help_surveygroup_title", default=u"The title of this OiRA Tool. This title is used in " u"the OiRA Tool overview in the clients."), required=True) form.order_before(survey_title="*") obsolete = schema.Bool( title=_("label_survey_obsolete", default=u"Obsolete survey"), description=_( "help_survey_obsolete", default=u"This OiRA Tool is obsolete; it has been retired or " u"replaced with another OiRA Tool."), default=False, required=False) form.order_before(obsolete="introduction")
class IFaqBlockSchema(ITextBlockSchema): """Faq block for simplelayout """ title = schema.TextLine(title=Message(u'label_title', domain='ftw.simplelayout', default=u'Title'), required=True) form.omitted('show_title') form.order_before(title='*')
class IDummy(form.Schema): form.omitted('foo') form.omitted('bar') form.widget(foo='some.dummy.Widget') form.widget(baz='other.Widget') form.mode(bar='hidden') form.mode(foo='display') form.order_before(baz='title') form.order_after(baz='qux') form.order_after(qux='bar') form.order_before(foo='body') form.read_permission(foo='zope2.View', bar='zope2.View') form.read_permission(baz='random.Permission') form.write_permission(foo='cmf.ModifyPortalContent') form.write_permission(baz='another.Permission') foo = zope.schema.TextLine(title=u"Foo") bar = zope.schema.TextLine(title=u"Bar") baz = zope.schema.TextLine(title=u"Baz") qux = zope.schema.TextLine(title=u"Qux")
class ISector(form.Schema, IUser, IBasic): """Sector object. A sector is a national organisation for a specific type of industry. """ form.order_before(title="*") dexterity.write_permission(title="euphorie.content.ManageCountry") form.order_after(login="******") dexterity.write_permission(login="******") form.order_before(password="******") form.order_after(locked="password") dexterity.write_permission(locked="euphorie.content.ManageCountry") contact_name = schema.TextLine(title=_("label_contact_name", default=u"Contact name"), required=True) form.order_after(contact_email="contact_name") logo = filefield.NamedBlobImage( title=_("label_logo", default=u"Logo"), description=_( "help_image_upload", default=u"Upload an image. Make sure your image is of format " u"png, jpg or gif and does not contain any special " u"characters."), required=False) main_colour = colour.Colour(title=_("label_main_colour", default=u"Main colour"), required=False) support_colour = colour.Colour(title=_("label_support_colour", default=u"Support colour"), required=False)
class ISection(model.Schema): """Behavior interface to make a content type support sections.""" model.fieldset('categorization', fields=['section']) form.order_before(section='genre') # nitf/head/pubdata/@position.section section = schema.Choice( title=_(u'Section'), description=_( u'help_section', default=u'Named section where the item will appear.', ), vocabulary=u'collective.nitf.AvailableSections', )
class IForwarding(ITask): """Schema interface for forwardings. """ # common fieldset form.omitted('task_type') # only hide relatedItems - we need it for remembering which documents # should be moved after creation when creating forwarding from tabbed view. form.mode(relatedItems=HIDDEN_MODE) # additional fieldset form.omitted('expectedStartOfWork') form.omitted('expectedDuration') form.omitted('expectedCost') form.omitted('effectiveDuration') form.omitted('effectiveCost') # only hide date_of_completion, it's used form.mode(date_of_completion=HIDDEN_MODE) # make sure hidden field is not rendered in its own empty fieldset by # moving it to the form's first position before title form.order_before(date_of_completion='title') # deadline is not required deadline = schema.Date( title=task_mf(u"label_deadline", default=u"Deadline"), description=task_mf(u"help_deadline", default=u""), required=False, ) form.widget('responsible', KeywordFieldWidget, async=True) responsible = schema.Choice( title=_(u"label_responsible", default=u"Responsible"), description=_(u"help_responsible", default=""), source=AllUsersAndInboxesSourceBinder( only_current_orgunit=True), required=True, )
class IHtmlBlockSchema(form.Schema): """HTML block for simplelayout """ title = schema.TextLine( title=_(u'htmlblock_title_label', default=u'Title'), required=True, ) show_title = schema.Bool( title=_(u'htmlblock_show_title_label', default=u'Show title'), default=False, required=False, ) content = schema.Text( title=_(u'htmlblock_content_label', default=u'Content'), description=_(u'htmlblock_content_description', default=u'The content will be rendered without ' u'being escaped.'), required=False, ) form.order_before(title='*')
class ISurvey(form.Schema, IBasic): """Survey. The survey is the root of a survey. """ title = schema.TextLine( title=_("label_survey_title", default=u"Version name"), description=_( "help_survey_title", default=u"This is the title of this OiRA Tool version. This " u"name is never shown to users."), required=True) form.order_before(title="*") form.omitted("description") introduction = HtmlText( title=_("label_introduction", default=u"Introduction text"), description=_( u"The introduction text is shown when starting a new " u"OiRA Tool session. If no introduction is provided here a " u"standard text will be shown. Please keep this text brief " u"so it will easily fit on screens of small devices such as " u"phones and PDAs."), required=False) form.widget(introduction=WysiwygFieldWidget) evaluation_optional = schema.Bool( title=_("label_evaluation_optional", default=u"Evaluation may be skipped"), description=_( "help_evaluation_optional", default=u"This option allows users to skip the evaluation " u"phase."), default=False, required=False) language = schema.Choice( title=_("label_language", default=u"Language"), vocabulary="plone.app.vocabularies.AvailableContentLanguages", default=u"en", required=True) classification_code = schema.TextLine( title=_("label_classification_code", default=u"Classification code"), description=_( "help_classification_code", default=u"A code identifying this sector. Classification " u"codes are defined by national standards bodies " u"and based on revision 2 of the NACE standard."), required=False) enable_tool_notification = schema.Bool( title=_("label_enable_tool_notification", default=u"Show a custom notification for this OiRA tool?"), description=_( u'description_tool_notification', default=u'If you enter text here, it will be shown to users ' u'in a pop-up when they open the tool. It can be used for ' u'notifying users about changes.'), required=False, default=False) depends("tool_notification_title", "enable_tool_notification", "on") tool_notification_title = ConditionalTextLine(title=_( "label_tool_notification_title", default=u"Tool notification title"), required=True) depends("tool_notification_message", "enable_tool_notification", "on") tool_notification_message = ConditionalHtmlText(title=_( "label_tool_notification", default=u"Tool notification message"), required=True) form.widget(tool_notification_message=WysiwygFieldWidget)
class IBar(form.Schema): form.order_before(ber='*') bar = zope.schema.TextLine()
class IRepositoryFolderSchema(form.Schema): """ A Repository Folder """ form.fieldset( u'common', label=_(u'fieldset_common', default=u'Common'), fields=[ u'effective_title', u'description', u'valid_from', u'valid_until', u'location', u'referenced_activity', u'former_reference', ], ) #form.omitted('title') form.order_before(effective_title='*') effective_title = schema.TextLine( title=_(u'Title'), required=True, ) description = schema.Text( title=_(u'label_description', default=u'Description'), description=_( u'help_description', default=u'A short summary of the content.'), required=False, ) valid_from = schema.Date( title=_(u'label_valid_from', default=u'Valid from'), description=_(u'help_valid_from', default=u''), required=False, ) valid_until = schema.Date( title=_(u'label_valid_until', default=u'Valid until'), description=_(u'help_valid_until', default=u''), required=False, ) location = schema.TextLine( title=_(u'label_location', default=u'Location'), description=_(u'help_location', default=u''), required=False, ) referenced_activity = schema.TextLine( title=_( u'label_referenced_activity', default=u'Referenced activity'), description=_(u'help_referenced_activity', default=u''), required=False, ) former_reference = schema.TextLine( title=_(u'label_former_reference', default=u'Former reference'), description=_(u'help_former_reference', default=u''), required=False, ) addable_dossier_types = schema.List( title=_(u'label_addable_dossier_types', default=u'Addable dossier types'), description=_(u'help_addable_dossier_types', default=u'Select all additional dossier types which ' 'should be addable in this repository folder.'), value_type=schema.Choice(vocabulary=u'opengever.repository.' u'RestrictedAddableDossiersVocabulary'), required=False)
class INITF(model.Schema): """A News Article based on the News Industry Text Format specification.""" # title = schema.TextLine() # nitf/head/title and nitf/body/body.head/hedline/hl1 form.order_before(subtitle='IDublinCore.title') subtitle = schema.TextLine( # nitf/body/body.head/hedline/hl2 title=_(u'Subtitle'), description=_(u'help_subtitle', default=u'A subordinate headline for the article.'), default=u'', missing_value=u'', required=False, ) byline = schema.TextLine( # nitf/body/body.head/byline/person title=_(u'Author'), default=u'', missing_value=u'', required=False, ) location = schema.TextLine( # nitf/body/body.head/dateline/location title=_(u'Location'), description=_( u'help_location', default=u'Event location. Where an event took place ' u'(as opposed to where the story was written).', ), default=u'', missing_value=u'', required=False, ) text = RichText( # nitf/body/body.content title=_(u'Body text'), required=False, ) model.fieldset('categorization', fields=['genre', 'urgency']) genre = schema.Choice( # nitf/head/tobject/tobject.property/@tobject.property.type title=_(u'Genre'), description=_( u'help_genre', default=u'Describes the nature, journalistic or ' u'intellectual characteristic of a news ' u'object, not specifically its content.', ), vocabulary=u'collective.nitf.AvailableGenres', defaultFactory=genre_default_value) urgency = schema.Choice( # nitf/head/docdata/urgency/@ed-urg title=_(u'Urgency'), description=_(u'help_urgency', default=u'News importance.'), vocabulary=u'collective.nitf.Urgencies', defaultFactory=urgency_default_value)
class IISAWPublication(form.Schema): short_title = TextLine(title=_(u'Short Title')) form.order_after(short_title='IBibliographicItem.title') tag_line = TextLine(title=_(u'Tag Line'), required=False) form.order_after(tag_line='IBibliographicItem.description') authors = Tuple( title=_(u'Authors'), description=_(u'Enter username or plain-text name, one per line'), value_type=TextLine(), required=False, missing_value=(), ) form.order_before(authors='IBibliographicItem.citation_detail') editors = Tuple( title=_(u'Editors'), description=_(u'Enter username or plain-text name, one per line'), value_type=TextLine(), required=False, missing_value=(), ) form.order_before(editors='IBibliographicItem.citation_detail') contributors = Tuple( title=_(u'Contributors'), description=_(u'Enter username or plain-text name, one per line'), value_type=TextLine(), required=False, missing_value=(), ) form.order_before(contributors='IBibliographicItem.citation_detail') alt_bib_uri = URI(title=_(u'Alternate Bibliographic URI'), required=False) form.order_after(alt_bib_uri='IBibliographicItem.bibliographic_uri') publisher = TextLine(title=_(u'Publisher'), required=False) form.order_after(publisher='IBibliographicItem.alternate_uri') publisher_uri = URI(title=_(u'Publisher URI'), required=False) form.order_after(publisher_uri='publisher') review_uri = URI(title=_(u'Review URI'), required=False) form.order_after(review_uri='publisher_uri') isbn = TextLine(title=_(u'ISBN'), required=False) form.order_after(isbn='review_uri') issn = TextLine(title=_(u'ISSN'), required=False) form.order_after(issn='isbn') doi = TextLine(title=_(u'DOI'), required=False) form.order_after(doi='issn') text = RichText( title=_(u'Body'), default_mime_type='text/html', allowed_mime_types=('text/html', ), output_mime_type='text/x-safe-html', required=False, ) form.order_after(text='doi') date_of_publication = TextLine( title=_(u'Publication Date'), description=_(u'Enter the date on which this publication was issued'), required=False) form.order_after(date_of_publication='text') loc_subjects = List(title=_(u'LOC Subjects'), value_type=DictRow(title=u'Subject', schema=ILOCSubject), required=False) form.widget(loc_subjects=DataGridFieldFactory) form.order_after(loc_subjects='*')
class IChurchBody(form.Schema, IBasic, IImageScaleTraversable): """ Church Body """ # If you want a schema-defined interface, delete the form.model # line below and delete the matching file in the models sub-directory. # If you want a model-based interface, edit # models/churchbody.xml to define the content type # and add directives here as necessary. title = schema.TextLine( title = _(u'label_short_title', default=u'Short Name / Abbreviation'), required = True ) full_title = schema.TextLine( title=_(u'label_full_title', u'Full Name'), required=True ) dexteritytextindexer.searchable('text') form.widget(text="plone.app.z3cform.wysiwyg.WysiwygFieldWidget") text = schema.Text( title=_(u'label_body_text', u"Body Text"), description=u'', required=False, ) member_of = RelationChoice( title=_(u'label_member_of', u"Member Of"), source=ObjectProvidesPathSourceBinder(object_provides=[ 'wcc.churches.churchfamily.IChurchFamily', 'wcc.churches.churchbody.IChurchBody' ]), required=False ) assoc_member_of = RelationChoice( title=_(u'label_assoc_member_of', u'Associate Member Of'), source=ObjectProvidesPathSourceBinder( object_provides=[ 'wcc.churches.churchfamily.IChurchFamily', 'wcc.churches.churchbody.IChurchBody', ] ), required=False ) form.widget(other_members="plone.app.z3cform.wysiwyg.WysiwygFieldWidget") other_members = schema.Text( title=_(u'label_other_members', u'Other Members'), required=False ) form.widget(other_assoc_members="plone.app.z3cform.wysiwyg.WysiwygFieldWidget") other_assoc_members = schema.Text( title=_(u'label_other_assoc_members', u'Other Associate Members'), required=False ) remoteUrl = schema.TextLine( title=_(u"Website"), default=u'http://', description=u"", required=False, ) form.order_before(full_title = '*') form.order_before(title = '*')
class IEmbedder(form.Schema): """ A representation of a content embedder content type """ dexteritytextindexer.searchable('text', 'alternate_content') form.order_before(**{'url': '*'}) url = schema.ASCIILine( title=_(u'Multimedia URL'), description=_(u'The URL for your multimedia file. Can be a URL ' + u'from YouTube, Vimeo, SlideShare, SoundCloud or ' + u'other main multimedia websites.'), required=False, ) width = schema.ASCIILine( title=_(u'Width'), description= _(u'Can be expressed as a decimal number or a percentage, e.g., 270 or 50%.' ), required=True, ) height = schema.Int( title=_(u'Height'), description=_(u'Can be expressed as a decimal number, e.g., 480.'), required=True, min=1, max=9999, ) embed_html = schema.Text( title=_(u'Embedded HTML code'), description=_(u'HTML code to render the embedded media.'), required=True, ) player_position = schema.Choice( title=_(u'Player position'), description=_(u''), default=u'Top', required=True, values=[u'Top', u'Bottom', u'Left', u'Right'], ) form.widget(image=EmbedderImageFieldWidget) image = NamedImage( title=_(u'Preview image'), description=_(u'Image to be used when listing content.'), required=False, ) text = RichText( title=_(u'Body text'), required=False, ) alternate_content = RichText( title=_(u'Alternate content'), description=_( u'Description or transcription for accessibility (WCAG) users.'), required=False, )
class IRisk(form.Schema, IRichDescription, IBasic): """A possible risk that can be present in an organisation. """ title = schema.TextLine( title=_("label_statement", default=u"Affirmative statement"), description=_( "help_statement", default=u"This is a short affirmative statement about a " u"possible risk (e.g. The building is well maintained.)"), required=True) form.widget(title="euphorie.content.risk.TextLines4Rows") form.order_before(title="*") problem_description = schema.TextLine( title=_("label_problem_description", default=u"Negative statement"), description=_( "help_problem_description", default=u"This is the inverse of the affirmative " u"statement (e.g. The building is not well maintained.)"), required=True) form.widget(problem_description="euphorie.content.risk.TextLines4Rows") form.order_after(problem_description="title") description = HtmlText( title=_("label_description", default=u"Description"), description=_( "help_risk_description", default=u"Describe the risk. Include any relevant information " u"that may be helpful for the end-user."), required=True) form.widget(description="plone.app.z3cform.wysiwyg.WysiwygFieldWidget") form.order_after(description="problem_description") existing_measures = TextLinesWithBreaks( title=_("label_existing_measures", default=u"Existing measures"), description=_( "help_existing_measures", default=u"Use this field to define (common) existing measures." u" Separate measures with a line break (Enter). The user will be " u"able to deselect those measures that are not applicable to their" u" situation."), required=False) form.widget(existing_measures="euphorie.content.risk.TextLines8Rows") form.order_after(existing_measures="description") legal_reference = HtmlText(title=_("label_legal_reference", default=u"Legal and policy references"), required=False) form.widget(legal_reference="plone.app.z3cform.wysiwyg.WysiwygFieldWidget") form.order_after(legal_reference="description") form.fieldset("identification", label=_("header_identification", default=u"Identification"), fields=["show_notapplicable"]) show_notapplicable = schema.Bool( title=_("label_show_notapplicable", default=u"Show `not applicable' option"), description=_("help_show_notapplicable", default=u"Offer a `not applicable' option in addition " u"to the standard yes/no options."), default=False) type = schema.Choice( title=_("label_risk_type", default=u"Risk type"), description=_( "help_risk_type", default=u'"Priority risk" is one of the high risks in the ' u'sector. "Risk" is related to the workplace or to the work ' u'carried out. "Policy" refers to agreements, procedures, ' u'and management decisions.'), vocabulary=SimpleVocabulary([ SimpleTerm(u"top5", title=_("risktype_top5", default=u"Priority risk")), SimpleTerm(u"risk", title=_("risktype_risk", default="Risk")), SimpleTerm(u"policy", title=_("risktype_policy", default=u"Policy")), ]), default=u"risk", required=True) depends("risk_always_present", "type", "==", "risk") risk_always_present = schema.Bool( title=_("label_risk_always_present", default=u"Risk is always present"), description=_( "description_risk_always_present", default=u'If selected, the user will not be able to answer "Yes" or ' '"No", since the risk is considered to be always present. The ' 'Evaluation and Action Plan will behave in the same way as for ' 'regular risks.'), required=False, default=False, ) depends("evaluation_method", "type", "==", "risk") evaluation_method = schema.Choice( title=_("label_evaluation_method", default=u"Evaluation method"), description=_( "help_evaluation_method", default=u"Select 'estimated' if calcuation is not necessary " u"or not possible."), vocabulary=SimpleVocabulary([ SimpleTerm(u"direct", title=_("evalmethod_direct", default=u"Estimated")), SimpleTerm(u"calculated", title=_("evalmethod_calculated", default=u"Calculated")), SimpleTerm(u"fixed", title=_("evalmethod_fixed", default=u"Skip evaluation")), ]), default=u"calculated", required=False) depends("fixed_priority", "type", "==", "risk") depends("fixed_priority", "evaluation_method", "==", "fixed") fixed_priority = schema.Choice(title=_("report_timeline_priority", default=u"Priority"), vocabulary=SimpleVocabulary([ SimpleTerm("low", title=_("priority_low", default=u"Low")), SimpleTerm("medium", title=_("priority_medium", default=u"Medium")), SimpleTerm("high", title=_("priority_high", default="High")), ]), required=False, default="low") depends("default_priority", "type", "==", "risk") depends("default_priority", "evaluation_method", "==", "direct") default_priority = schema.Choice( title=_("label_default_priority", default=u"Default priority"), description=_( "help_default_priority", default=u"You can help the end-user by selecting a default " u"priority. He/she can still change the priority."), vocabulary=SimpleVocabulary([ SimpleTerm("none", title=_("no_default", default=u"No default")), SimpleTerm("low", title=_("priority_low", default=u"Low")), SimpleTerm("medium", title=_("priority_medium", default=u"Medium")), SimpleTerm("high", title=_("priority_high", default="High")), ]), required=False, default="low") form.fieldset( "main_image", label=_("header_main_image", default=u"Main image"), description=_( "intro_main_image", default=u"The main image will get a more prominent position " u"in the client than the other images."), fields=["image", "caption"]) image = filefield.NamedBlobImage( title=_("label_image", default=u"Image file"), description=_( "help_image_upload", default=u"Upload an image. Make sure your image is of format " u"png, jpg or gif and does not contain any special " u"characters."), required=False) caption = schema.TextLine(title=_("label_caption", default=u"Image caption"), required=False) form.fieldset("secondary_images", label=_("header_secondary_images", default=u"Secondary images"), fields=[ "image2", "caption2", "image3", "caption3", "image4", "caption4" ]) image2 = filefield.NamedBlobImage( title=_("label_image", default=u"Image file"), description=_( "help_image_upload", default=u"Upload an image. Make sure your image is of format " u"png, jpg or gif and does not contain any special " u"characters."), required=False) caption2 = schema.TextLine(title=_("label_caption", default=u"Image caption"), required=False) image3 = filefield.NamedBlobImage( title=_("label_image", default=u"Image file"), description=_( "help_image_upload", default=u"Upload an image. Make sure your image is of format " u"png, jpg or gif and does not contain any special " u"characters."), required=False) caption3 = schema.TextLine(title=_("label_caption", default=u"Image caption"), required=False) image4 = filefield.NamedBlobImage( title=_("label_image", default=u"Image file"), description=_( "help_image_upload", default=u"Upload an image. Make sure your image is of format " u"png, jpg or gif and does not contain any special " u"characters."), required=False) caption4 = schema.TextLine(title=_("label_caption", default=u"Image caption"), required=False) form.fieldset( "additional_content", label=_("header_additional_content", default=u"Additional content"), description=_( "intro_additional_content", default=u"Attach any additional content you consider helpful " "for the user"), fields=[ "file1", "file1_caption", "file2", "file2_caption", "file3", "file3_caption", "file4", "file4_caption" ]) file1 = filefield.NamedBlobFile( title=_("label_file", default=u"Content file"), description=_( "help_content_upload", default=u"Upload a file that contains additional information, " u"like a PDF, Word document or spreadsheet. Optionally provide " u"a descriptive caption for your file."), required=False) file1_caption = schema.TextLine(title=_("label_file_caption", default=u"Content caption"), required=False) file2 = filefield.NamedBlobFile( title=_("label_file", default=u"Content file"), description=_( "help_content_upload", default=u"Upload a file that contains additional information, " u"like a PDF, Word document or spreadsheet. Optionally provide " u"a descriptive caption for your file."), required=False) file2_caption = schema.TextLine(title=_("label_file_caption", default=u"Content caption"), required=False) file3 = filefield.NamedBlobFile( title=_("label_file", default=u"Content file"), description=_( "help_content_upload", default=u"Upload a file that contains additional information, " u"like a PDF, Word document or spreadsheet. Optionally provide " u"a descriptive caption for your file."), required=False) file3_caption = schema.TextLine(title=_("label_file_caption", default=u"Content caption"), required=False) file4 = filefield.NamedBlobFile( title=_("label_file", default=u"Content file"), description=_( "help_content_upload", default=u"Upload a file that contains additional information, " u"like a PDF, Word document or spreadsheet. Optionally provide " u"a descriptive caption for your file."), required=False) file4_caption = schema.TextLine(title=_("label_file_caption", default=u"Content caption"), required=False)