class IMigrator(Interface): """ remote source interface """ config = Choice( title=_(u"Select configuration"), description=_(u"Registered configurations to choose from."), vocabulary=u"collective-migrator-configurations", ) class Migrator(form.Form): label = _(u"Synchronize and migrate") fields = field.Fields(IMigrator) ignoreContext = True @button.buttonAndHandler(u'Select') def handleSelect(self, action): data, errors = self.extractData() if errors: return False self.request.RESPONSE.redirect('%s/@@mr.migrator-run?form.widgets.%s' % (self.context.absolute_url(), urllib.urlencode(data))) MigratorConfigurationsFactory = MigratorConfigurations() MigratorRunView = wrap_form(MigratorRun) MigratorView = wrap_form(Migrator)
ignoreContext = True # don't use context to get widget data label = _(u"Add Highlights Group") def __init__(self, *args, **kwargs): super(uwAddGroupForm, self).__init__(*args, **kwargs) self.hlite = getHliteTool() @button.buttonAndHandler(_(u'Add')) def handleAdd(self, action): data, errors = self.extractData() if errors: return self.hlite.addGroup(data) self.context.plone_utils.addPortalMessage(_('Group successfully added.')) self.request.RESPONSE.redirect(self.context.absolute_url()) AddGroupForm = wrap_form(uwAddGroupForm, back_link=back_to_highlightsmanager) # TODO: when changing content type whitelist, if highlighted content exists # either remove them or disallow the change class uwEditGroupForm(form.EditForm): fields = field.Fields(ifaces.IHighlightsGroup).omit('name') label = _(u"Edit Highlights Group") def updateWidgets(self): form.EditForm.updateWidgets(self) for dummy in self.context.getContentItems(): self.widgets['schema'].mode = DISPLAY_MODE break EditGroupForm = wrap_form(uwEditGroupForm, back_link=back_to_highlightsmanager)
class Form(form.Form): fields = field.Fields(ICSVImport) ignoreContext = True # don't use context to get widget data label = u"Import Places from CSV" @button.buttonAndHandler(u'Apply') def handleApply(self, action): upload_file = self.widgets['file'].value importer = CSVImporter(self.context, self.request) importer(upload_file) response = self.request.response response.redirect(self.context.absolute_url()) CSVImportForm = wrap_form(Form) class CSVImporter(object): """CSV importing view """ def __init__(self, context, request): self.context = context self.request = request def __call__(self, csvfile): portal = getToolByName(self.context, 'portal_url').getPortalObject() ptool = getToolByName(self.context, 'plone_utils') wtool = getToolByName(self.context, 'portal_workflow')
container = self.context.restrictedTraverse('@@plone').getCurrentFolder() if name in container.objectIds(): raise AlreadyExists(name) # create document name = container.invokeFactory(id=name, type_name='Document') document = container[name] # set initial content update_content(document, article) # annotate article metadata metadata = get_article_metadata(document) metadata.id = article.ArticleID metadata.url = article.ArticleUrl metadata.municipality = municipality # Enable TOC if setting is enabled document.setTableContents(enable_toc) # set review state directly (no transition is available for this) wftool = getToolByName(self.context, 'portal_workflow') status = wftool.getStatusOf('synchronizable_document_workflow', document) status['review_state'] = 'synchronized' document.reindexObject() return name SynchronizeView = wrap_form(SynchronizeForm)
return utils.get_queue().finished class StatsForm(crud.CrudForm): """View list of queues and last modification dates for all available channels. """ addform_factory = crud.NullForm editform_factory = EditForm view_schema = IQueueStatistics def get_items(self): return [(channel.name, ChannelStatistics(channel)) for channel in channel_lookup()] def remove(self, (id, item)): for name, stats in self.get_items(): if name == id: stats.channel.queue.clear() self.status = _(u"All sent and failed messages deleted") return else: raise KeyError(id) StatsView = layout.wrap_form(StatsForm, index=ViewPageTemplateFile('controlpanel.pt'), label=_(u"label_statistics_administration", default=u"Statistics"), back_link=controlpanel.back_to_controlpanel)
'sender_id' : sender_id, 'url' : referer, 'subject' : subject, 'message' : message, 'encoding' : encoding, } host = context.MailHost # plone_utils.getMailHost() (is private) try: message = context.author_feedback_template(context, **variables) result = host.secureSend(message, send_to_address, envelope_from, subject=subject, subtype='plain', charset=encoding, debug=False, From=send_from_address) except ConflictError: raise except: # TODO Too many things could possibly go wrong. So we catch all. exception = plone_utils.exceptionString() message = _(u'Unable to send mail: ${exception}', mapping={u'exception' : exception}) plone_utils.addPortalMessage(message, 'error') return False """ plone_utils.addPortalMessage(u'[FAKE] %s' % _(u'Mail sent.')) # wrap the form with plone.app.z3cform's Form wrapper ContactInfoView = wrap_form(ContactInfoForm) # Register Norobots validator for the correponding field in the IContactInfo interface validator.WidgetValidatorDiscriminators(NorobotsValidator, field=IContactInfo['norobots'])
try: oid, to_url = factory(data['title'], ptname) except KeyError: raise interfaces.WidgetActionExecutionError('title', Invalid('Id already exists')) response = self.request.response response.setStatus(201) response.setHeader( 'Location', '%s/base_edit' % to_url ) response.redirect('%s/base_edit' % to_url) AddNamedForm = wrap_form(Form) class NamedFactory(object): """Feature/Place adding view """ def __init__(self, context, request): self.context = context self.request = request def __call__(self, title, portal_type): portal = getToolByName(self.context, 'portal_url').getPortalObject() ptool = getToolByName(self.context, 'plone_utils') wtool = getToolByName(self.context, 'portal_workflow')
else: return True def __call__(self): if self.newsml_enabled(raise404=True): settings = IFeedSettings(self.context, None) if settings and self.__name__ not in settings.feed_types: raise NotFound self.request.response.setHeader('Content-Type', 'application/vnd.iptc.g2.newsitem+xml') return self.index() class SettingsForm(form.EditForm): label = _(u'heading_syndication_properties', default=u'Syndication Properties') description = _( u'description_syndication_properties', default=u'Syndication enables you to syndicate this folder so it can' u'be synchronized from other web sites.') fields = field.Fields(IFeedSettings) @button.buttonAndHandler(_(u'Save'), name='save') def handleSave(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return self.applyChanges(data) SettingsFormView = wrap_form(SettingsForm)
data, errors = self.extractData() if len(errors) == 0: self.postData(data) ok_message = _(u"Thank you for your comments. Our customer services will come back to you in few days") # Check whether this form was submitted from another page returnURL = data.get("returnURL", "") if returnURL != "" and returnURL is not None: # Go to page where we were sent and # pass the confirmation message as status message (in session) # as we are not in the control of the destination page from Products.statusmessages.interfaces import IStatusMessage messages = IStatusMessage(self.request) messages.addStatusMessage(ok_message, type="info") self.request.response.redirect(returnURL) else: # Act standalone self.status = ok_message else: # errors on the form self.status = _(u"Please correct the errors below") CommentFormView = layout.wrap_form(CommentAddForm)
email_charset = portal.getProperty('email_charset') from_address = portal.getProperty('email_from_address') # tr_annotate = ITokenRolesAnnotate(context) # end_date = context.toLocalizedTime(tr_annotate.token_dict[token_id]['token_end']) util = getToolByName(self.context, 'translation_service') end_date = util.ulocalized_time(time.time(), long_format = None, time_only = None, context = self.context, domain='plonelocales') # message = message.replace('${text}s', text) message = text.replace('${date}s', str(end_date)) message = message.replace('${url}s', url) try: for email_recipient in email_list: mailhost.secureSend(message, email_recipient, from_address, subject=subject, charset=email_charset, debug=False, ) except (MailHostError, SMTPException): return _('token_role_send_ko_mail', default=u'Mail error') except Exception: return _('token_role_send_ko', default=u'An error has occurred') else: return _('token_role_send_ok', default=u'Token sent') # wrap the form with plone.app.z3cform's Form wrapper TokenSendFormView = layout.wrap_form(TokenSendForm)
from z3c.form import field from z3c.form import form from plone.app.z3cform.layout import wrap_form from collective.easyslider.interfaces import ISliderSettings from collective.easyslider import easyslider_message_factory as _ class EasySliderSettingsForm(form.EditForm): """ The page that holds all the slider settings """ fields = field.Fields(ISliderSettings) EasySliderSettingsView = wrap_form(EasySliderSettingsForm) class EasySliderControlPanelForm(EasySliderSettingsForm): label = _(u"EasySlider Default Settings") description = _(u'Default settings to use for all Easy Sliders on site.') EasySliderControlPanelView = wrap_form(EasySliderControlPanelForm)
lock.lockContext(self.context) alsoProvides(self.context, IStructuralContent) self.context.reindexObject(idxs=["object_provides"]) plone_utils = getToolByName(self.context, "plone_utils") plone_utils.addPortalMessage( _(u"The content was locked as 'Structual content'")) self.request.response.redirect(self.context.absolute_url()) @button.buttonAndHandler(_(u"Cancel")) def handleCancel(self, action): plone_utils = getToolByName(self.context, "plone_utils") plone_utils.addPortalMessage(_("Accion cancelled")) self.request.response.redirect(self.context.absolute_url()) LockView = wrap_form(LockForm) class UnlockForm(form.Form): label = _(u"Unlock this structural content object") description = _( u"To unlock this 'Structural content' object click on 'Save'. " "Remember that this could generate inconsistencies in the portal. " "If you are unsure about this action click on 'Cancel'.") @button.buttonAndHandler(_(u"Save")) def handleApply(self, action): plone_utils = getToolByName(self.context, "plone_utils") if not IStructuralContent.providedBy(self.context): plone_utils.addPortalMessage(_("This object is not locked"),
return False @button.buttonAndHandler(_('Delete'), name='delete') def handleDelete(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return changes = self.applyDelete() if changes: self.status = self.successMessage else: self.status = self.noChangesMessage def applyDelete(self): extra = self.getExtra() if extra: extra.captions = u'' extra.transcription = u'' extra.download_url = '' extra.captions_format = '' self.request.response.redirect(self.context.absolute_url()) return True return False VideoExtraDataEditFormView = wrap_form(VideoExtraDataEditForm)
ignoreContext = True # don't use context to get widget data label = u"Import XML files" @button.buttonAndHandler(u'Apply') def handleApply(self, action): importer = XMLImporter(self.context, self.request) msg = importer(self.widgets['directory'].value, self.widgets['metadataId'].value or None) response = self.request.response response.setStatus(201) response.setHeader( 'Location', '%s' % self.context.absolute_url() ) response.redirect(self.context.absolute_url()) XMLImportForm = wrap_form(Form) class XMLImporter(object): """XML importing view """ def __init__(self, context, request): self.context = context self.request = request def __call__(self, directory, metadataId=None): request = self.request sourcedir = directory portal = getToolByName(self.context, 'portal_url').getPortalObject()
# Make sure our chosen id is unique, iterate until we get one that is. chooser = INameChooser(container) id = chooser._findUniqueName(id, None) # create the object type_name = data['type_name'] container.invokeFactory(type_name, id=id, title=title) if type_name in [u'Folder']: self.request.response.redirect("%s/@@cmsui-structure" % container[id].absolute_url()) else: self.request.response.redirect("%s/edit" % container[id].absolute_url()) AddNewContentView = wrap_form(AddNewContentForm) class IFileUploadForm(interface.Interface): file = NamedFile(title=u"File") class FileUploadForm(form.Form): implements(IWrappedForm) fields = field.Fields(IFileUploadForm) ignoreContext = True # don't use context to get widget data label = _(u"Add content") @button.buttonAndHandler(_(u'Upload content')) def handleApply(self, action):
# Context may not be a container, get one. context_state = getMultiAdapter((self.context, self.request), name="plone_context_state") container = context_state.folder() # Make sure our chosen id is unique, iterate until we get one that is. chooser = INameChooser(container) id = chooser._findUniqueName(id, None) # create the object container.invokeFactory(data['content_type'], id=id, title=title) # redirect to immediate_view self.request.response.redirect("%s/edit" % container[id].absolute_url()) # open edit overlay AddNewContentView = wrap_form(AddNewContentForm) class AddMenu(BrowserView): """Add menu overlay """ def __call__(self): # Disable theming self.request.response.setHeader('X-Theme-Disabled', 'True') factoriesMenu = getUtility(IBrowserMenu, name='plone_contentmenu_factory', context=self.context) self.addable_types = factoriesMenu.getMenuItems(self.context, self.request) breadcrumbs_view = getMultiAdapter((self.context, self.request), name='breadcrumbs_view')
""" registry = getUtility(IRegistry) ids = registry['collective.cropimage.ids'] ids = [i for i in ids if i['id'] != id] registry['collective.cropimage.ids'] = ids def before_update(self, item, data): registry = getUtility(IRegistry) ids = registry['collective.cropimage.ids'] ids = [i for i in ids if i['id'] != data['id']] ids.append(data) registry['collective.cropimage.ids'] = ids CropImageIDControlPanelView = wrap_form( CropImageIDControlPanelForm, index=ViewPageTemplateFile('templates/controlpanel.pt')) class CropImageView(BrowserView): template = ViewPageTemplateFile('templates/crop_image.pt') def __call__(self): context = aq_inner(self.context) form = self.request.form if form.get('form.button.Save', None) is not None: name = 'collective.cropimage.{0}'.format(form.get('field')) anno = IAnnotations(context) if anno.get(name) is None: anno[name] = PersistentDict()
fieldsid = [field.field.__name__ for field in fields.values()] main = plonegroup.GroupFactory(_pmf(u"label_schema_default", default=u"Default"), fields.select(*[a for a in fieldsid if a not in self.contentFields+self.navigationFields])) content = plonegroup.GroupFactory(_pmf(u"Content", default=u"Content"), fields.select(*[a for a in fieldsid if a in self.contentFields])) navigation = plonegroup.GroupFactory(_pmf(u"Navigation"), fields.select(*[a for a in fieldsid if a in self.navigationFields])) self.groups = [main, content, navigation] super(FlowViewSettingsForm, self).update() def set_status_message(self, settings, has_changes): msg = has_changes and self.successMessage or self.noChangesMessage msg = zope.i18n.translate(msg) self.status = msg @button.buttonAndHandler(_('Apply'), name='apply') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return changes = self.applyChanges(data) settings = FlowViewSettings(self.context) has_changes = False if changes: # settings = FlowViewSettings(self.context) # settings.last_cooked_time_in_seconds = 0 has_changes = True self.set_status_message(settings, has_changes) FlowViewSettingsView = wrap_form(FlowViewSettingsForm)
required=False, ) datetime = Datetime( title=u'DateTime widget', required=False, ) class TestForm(Form): """ """ ignoreContext = True fields = Fields(ITestForm) fields['date'].widgetFactory[INPUT_MODE] = DatePickerFieldWidget fields['datetime'].widgetFactory[INPUT_MODE] = DateTimePickerFieldWidget def updateWidgets(self): Form.updateWidgets(self) now = datetime.datetime.now() # self.fields['date'].field.default = now self.fields['datetime'].field.default = now @buttonAndHandler(u'Submit') def submit(self, action): data, errors = self.extractData() if errors: return False return True TestView = wrap_form(TestForm)
from z3c.form import button import zope.i18n from zope.i18nmessageid import MessageFactory from plone.app.z3cform.layout import wrap_form from collective.plonetruegallery.browser.views.settings import \ GallerySettingsForm _ = MessageFactory('collective.plonetruegallery') class PloneTruegalleryControlPanelForm(GallerySettingsForm): label = _(u"PloneTruegallery Default Settings") description = _(u'Default settings to use for all galleries on site.') @button.buttonAndHandler(_('Apply'), name='apply') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return changes = self.applyChanges(data) msg = changes and self.successMessage or self.noChangesMessage self.status = zope.i18n.translate(msg) PloneTruegalleryControlPanelView = wrap_form(PloneTruegalleryControlPanelForm)
if name == 'slides': # somehow this default value gets manually set. This prevents this # form happening on the slides... return self._metadata.get(name, []) return super(PageSliderSettings, self).__getattr__(name) class ViewSliderSettings(SliderSettings): interfaces = [ISliderSettings, IViewSliderSettings] class INothing(Interface): pass class MainSettingsGroup(plonegroup.Group): fields = field.Fields(ISliderSettings) label = _(u'Main') class EasySliderSettingsForm(group.GroupForm, form.EditForm): """ The page that holds all the slider settings """ fields = field.Fields(INothing) groups = [MainSettingsGroup] EasySliderSettingsView = wrap_form(EasySliderSettingsForm)
description = _(u'description_media_global_settings_form', default=u"Configure the parameters for media.") @button.buttonAndHandler(pmf('Save'), name='apply') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return self.applyChanges(data) self.status = pmf('Changes saved.') GlobalSettingsFormView = wrap_form(GlobalSettingsForm) class ConvertVideo(BrowserView): def __call__(self): # Mark the video as not converted self.context.video_converted = False video_edited(self.context, None) self.request.response.redirect(self.context.absolute_url()) class Utils(MediaView): def valid_type(self): return IMediaEnabled.providedBy(self.context) @memoize
self.widgets['year_month'].show_jquery_picker = False # Disable Javascript picker # # Example how to set datetime widget to look like american date format # self.widgets['american_date'].components = ["months", "days", "years"] self.widgets['american_date'].component_separators={"months":"/", "days" : "/"} self.widgets['american_date'].show_jquery_picker = False # Disable Javascript picker @buttonAndHandler(u'Submit') def submit(self, action): data, errors = self.extractData() # Give some submit feedback - # note that IStatusMessage uses session and # does not work through anonymizer proxy messages = IStatusMessage(self.request) # Check console to see what our cleaned data contains print str(data) messages.addStatusMessage("Got converted object values:" + str(data), type="info") if errors: return False return True TestView = wrap_form(TestForm) # Spice our life with some movies in this point # http://www.youtube.com/watch?v=MuOvqeABHvQ
catalog_entries = self._unique_keyword_values languages = self._portal_languages charset = self.default_charset() for item in catalog_entries: if item.decode(charset) not in storage_entries: self.add(dict(keyword=item, keywords=[])) for lang in languages: lang_item = "%s|%s" % (item, lang) if lang_item.decode(charset) not in storage_entries: self.add(dict(keyword=lang_item, keywords=[])) def update(self): """ This methos performs an initialization based on what is currently indexed on the portal_catalog """ self.update_storage() super(KeywordAliasForm, self).update() def link(self, item, field): """Return a URL for this item's field or None. """ content = self.getContent() portal_url = getMultiAdapter((content, self.request), name=u'plone_portal_state').portal_url() keyword = self._keyword_split(item.keyword)[0] return "%s/search?Subject=%s" % (portal_url, keyword) KeywordAliasView = layout.wrap_form(KeywordAliasForm, ControlPanelFormWrapper)
# Get category category = self.category # Get other search criteria from the form data zip, city, state = "", "", "" qs = "" if data['search_zip']: zip = data['search_zip'] qs = "category=%s&search_zip=%s" % (category, zip) elif data['search_city']: city = data['search_city'] qs = "category=%s&search_city=%s" % (category, city) elif data['search_state']: state = data['search_state'] qs = "category=%s&search_state=%s" % (category, state) #qs = "category=%s&search_zip=%s&search_city=%s&search_state=%s" % (category, zip, city, state) self.request.RESPONSE.redirect(self.context.absolute_url() + '/partnersearch' + '?' + qs) PartnerSearchFormView = wrap_form(PartnerSearchForm)
keyword_settings = self._keyword_settings keyword_storage = keyword_settings.keyword_storage storage_entries = keyword_storage.keys() catalog_entries = self._unique_keyword_values languages = self._portal_languages for item in catalog_entries: if item not in storage_entries: self.add(dict(keyword=item, keywords=[])) for lang in languages: lang_item = "%s|%s" % (item, lang) if lang_item not in storage_entries: self.add(dict(keyword=lang_item, keywords=[])) def update(self): """ This methos performs an initialization based on what is currently indexed on the portal_catalog """ self.update_storage() super(KeywordAliasForm, self).update() def link(self, item, field): """Return a URL for this item's field or None. """ content = self.getContent() portal_url = getMultiAdapter((content, self.request), name=u'plone_portal_state').portal_url() keyword = self._keyword_split(item.keyword)[0] return "%s/search?Subject=%s" % (portal_url, keyword) KeywordAliasView = layout.wrap_form(KeywordAliasForm, ControlPanelFormWrapper)
"""Remote source interface. """ config = Choice( title=_(u"Select configuration"), description=_(u"Registered configurations to choose from."), vocabulary=u"collective-migrator-configurations", ) class Migrator(form.Form): label = _(u"Synchronize and migrate") fields = field.Fields(IMigrator) ignoreContext = True @button.buttonAndHandler(_(u'Select')) def handleSelect(self, action): data, errors = self.extractData() if errors: return False self.request.RESPONSE.redirect( '%s/@@mr.migrator-run?form.widgets.%s' % (self.context.absolute_url(), urllib.urlencode(data))) MigratorConfigurationsFactory = MigratorConfigurations() MigratorRunView = wrap_form(MigratorRun) MigratorView = wrap_form(Migrator)
if selected: self.status = _(u"Successfully removed categories.") self.highlights_manager.deleteGroups([id for id, gr_o in selected]) class GroupOverviewForm(crud.CrudForm): """View list of groups and allow for deletion and addition.""" addform_factory = crud.NullForm editform_factory = EditForm view_schema = IGroupOverview def __init__(self, *args, **kwargs): super(GroupOverviewForm, self).__init__(*args, **kwargs) self.highlights_manager = getToolByName(self.context, 'highlights_manager') def get_items(self): return [(group_id, GroupOverview(group)) for group_id, group in self.highlights_manager.getAllGroups()] def remove(self, (id, item)): self.highlights_manager.deleteGroups([id]) def link(self, item, field): if field == 'title': return '%s/edit' % item.group.absolute_url() GroupsOverview = layout.wrap_form( GroupOverviewForm, index=ViewPageTemplateFile('templates/controlpanel.pt'), label = _(u"Highlights Manager: Groups Overview"), back_link=back_to_controlpanel)
def createAndAdd(self, data): context = self.getContent() applyChanges(self, context, data) self.status = self.successMessage return context def nextURL(self): IStatusMessage(self.request).addStatusMessage(self.status, type='info') return "%s/%s" % (self.getContent().absolute_url(), '@@token_manage') def update(self): self.buttons.values()[0].title = _(u'add_token', default=u"Add token") super(TokenAddForm, self).update() # wrap the form with plone.app.z3cform's Form wrapper TokenAddFormView = layout.wrap_form(TokenAddForm) class TokenEditForm(form.EditForm): """ Token Edit Form """ # Defining the fields fields = field.Fields( TextLine( __name__='token_display', title=ITokenInfoSchema['token_id'].title, description=ITokenInfoSchema['token_id'].description) ) + field.Fields(ITokenInfoSchema) fields['token_id'].mode = HIDDEN_MODE fields['token_display'].mode = DISPLAY_MODE fields['token_roles'].widgetFactory[INPUT_MODE] = CheckBoxFieldWidget
from collective.qextendedmenu import mf as _ from z3c.form import form, field from plone.app.z3cform.layout import wrap_form from collective.qextendedmenu.interfaces import IExtendedMenuSettings class ExtendedMenuSettings(form.EditForm): """ The page that holds all the gallery settings """ fields = field.Fields(IExtendedMenuSettings) label = _(u'heading_menu_settings_form', default=u'Menu Settings') # description = _(u'description_gallery_settings_form', # default=u'Configure the parameters for this gallery.') # successMessage = _(u'successMessage_gallery_settings_form', # default=u'Gallery Settings Saved.') # noChangesMessage = _(u'noChangesMessage_gallery_settings_form', # default=u'There are no changes in the Gallery settings.') ExtendedMenuSettingsView = wrap_form(ExtendedMenuSettings)
projects[bc] = obj return projects def projectsVocab(context): projects = projectsDict(context) items = sorted(projects.items()) return vocabulary.SimpleVocabulary.fromItems(items) def find_iterations(): site = getSite() return site.portal_catalog(portal_type='iteration') def find_projects(): site = getSite() return site.portal_catalog(portal_type='project') def startDate(): # start on first day of current month now = datetime.datetime.now() first_day = datetime.datetime(now.year, now.month, 1) return first_day def stopDate(): # stop in one month now = datetime.datetime.now() last_day = calendar.monthrange(now.year, now.month)[1] return datetime.datetime(now.year, now.month, last_day) directlyProvides(projectsVocab, IVocabularyFactory) CreateIteration = wrap_form(CreateIterationForm)
base_url = self.context.absolute_url() adding_view = queryMultiAdapter((self.context, self.request), name='+') t = getattr(portal.portal_types, type_id, None) if t: # XXX: Added to support CMF 2.2 style add view actions context_state = getMultiAdapter((self.context, self.request), name='plone_context_state') addActionsById = dict([(a['id'], a['url'],) for a in context_state.actions().get('folder/add', []) if a['available'] and a['allowed']]) # XXX: Added to support CMF 2.2 style add view actions if addActionsById.get(type_id, ''): # we have a non-empty URL url = addActionsById[type_id] elif adding_view and queryMultiAdapter((adding_view, self.request), name=t.factory): url = '%s/+/%s' % (base_url, t.factory) else: url = '%s/createObject?type_name=%s' % (base_url, quote_plus(type_id)) self.request.response.redirect(url) class ControlPanelFormWrapper(FormWrapper, FolderContentsView): """ Wrapper for controlpanel layout """ index = ViewPageTemplateFile('controlpanel_layout.pt') ControlPanelView = wrap_form(ControlPanelForm, __wrapper_class=ControlPanelFormWrapper)
url = "%s/private_token_listing?token=%s" % (context.absolute_url(), token_id) email_charset = portal.getProperty('email_charset') from_address = portal.getProperty('email_from_address') # tr_annotate = ITokenRolesAnnotate(context) # end_date = context.toLocalizedTime(tr_annotate.token_dict[token_id]['token_end']) util = getToolByName(self.context, 'translation_service') end_date = util.ulocalized_time(time.time(), long_format = None, time_only = None, context = self.context, domain='plonelocales') # message = message.replace('${text}s', text) message = text.replace('${date}s', str(end_date)) message = message.replace('${url}s', url) try: for email_recipient in email_list: mailhost.secureSend(message, email_recipient, from_address, subject=subject, charset=email_charset, debug=False, ) except (MailHostError, SMTPException): return _('token_role_send_ko_mail', default=u'Mail error') except Exception: return _('token_role_send_ko', default=u'An error has occurred') else: return _('token_role_send_ok', default=u'Token sent') # wrap the form with plone.app.z3cform's Form wrapper TokenSendFormView = layout.wrap_form(TokenSendForm)
def finished_jobs(self): return utils.get_queue().finished class StatsForm(crud.CrudForm): """View list of queues and last modification dates for all available channels. """ addform_factory = crud.NullForm editform_factory = EditForm view_schema = IQueueStatistics def get_items(self): return [(channel.name, ChannelStatistics(channel)) for channel in channel_lookup()] def remove(self, (id, item)): for name, stats in self.get_items(): if name == id: stats.channel.queue.clear() self.status = _(u"All sent and failed messages deleted") return else: raise KeyError(id) StatsView = layout.wrap_form( StatsForm, index=ViewPageTemplateFile('controlpanel.pt'), label = _(u"label_statistics_administration", default=u"Statistics"), back_link = controlpanel.back_to_controlpanel)
reset_passw = data.get('reset_password', '') passw_behavior = IPasswordProtected(self.context) if passw and passw != '': passw_behavior.assign_password(passw) self.status = _(u"Password assigned.") if reset_passw: passw_behavior.remove_password() self.status = _(u"This content is not going to be password protected.") @button.buttonAndHandler(_('Cancel'), name='cancel') def cancel(self, action): self.status = _(u"Cancelled.") AssignPasswordFormView = wrap_form(AssignPasswordForm) class ATAssignPasswordForm(form.Form): fields = field.Fields(IATPasswordProtected) ignoreContext = False @button.buttonAndHandler(_('Save'), name='save') def save(self, action): data, errors = self.extractData() if errors: self.status = _(u"Please correct errors") return passw = data.get('passw_hash', '')
return ajax = 'ajax' in self.request.form manager = IImageTagsManager(self.context) id, tag, new_tag = manager.save_tag(data) if not errors: # Special treatment for ajax/non-ajax save if not ajax: if new_tag: message = _(u"Tag '${title}' added.", mapping={u'title': tag['title']}) else: message = _(u"Tag '${title}' updated.", mapping={u'title': tag['title']}) self.request.response.redirect('%s/@@imagetags-manage' % self.context.absolute_url()) IStatusMessage(self.request).addStatusMessage(message, type='info') else: # Return XML response self.request.response.redirect('%s/@@imagetags-newtag?id=%s' % (self.context.absolute_url(), id)) class AddTagFormWrapper(FormWrapper): index = ViewPageTemplateFile('templates/form.pt') ajax = False def getId(self): return self.__name__.replace('.', '-') AddTag = wrap_form(AddTagForm, __wrapper_class=AddTagFormWrapper)
ignoreContext = True # don't use context to get widget data label = u"Import CAP directory XML file" @button.buttonAndHandler(u'Apply') def handleApply(self, action): importer = CAPImporter(self.context, self.request) msg = importer(self.widgets['path'].value) response = self.request.response response.setStatus(201) response.setHeader( 'Location', '%s' % self.context.absolute_url() ) response.redirect(self.context.absolute_url()) CAPImportForm = wrap_form(Form) class CAPImporter(object): """XML importing view """ def __init__(self, context, request): self.context = context self.request = request def __call__(self, path): request = self.request portal = getToolByName(self.context, 'portal_url').getPortalObject() places = portal['places']
class Form(form.Form): fields = field.Fields(IRoadImport) ignoreContext = True # don't use context to get widget data label = u"Import Places from Road JSON" @button.buttonAndHandler(u'Apply') def handleApply(self, action): upload_file = self.widgets['file'].value importer = RoadImporter(self.context, self.request) importer(upload_file.read()) response = self.request.response response.redirect(self.context.absolute_url()) RoadImportForm = wrap_form(Form) class RoadImporter(object): """Road JSON importing view """ def __init__(self, context, request): self.context = context self.request = request def __call__(self, json): portal = getToolByName(self.context, 'portal_url').getPortalObject() ptool = getToolByName(self.context, 'plone_utils') wtool = getToolByName(self.context, 'portal_workflow')
@button.buttonAndHandler(u'Cancel', name='cancel') def handleCancel(self, action): self.request.response.redirect(self.context.absolute_url()) @button.buttonAndHandler(u'Save', name='save') def handleSave(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return self.applyChanges(data) self.request.response.redirect(self.context.absolute_url()) SettingsFormView = wrap_form(SettingsForm) class FolderFeed(adapters.FolderFeed): def _brains(self): catalog = api.portal.get_tool('portal_catalog') sort_order = 'ascending' if self.settings.sort_reverse or self.settings.sort_reverse is None: sort_order = 'reverse' return catalog(path={ 'query': '/'.join(self.context.getPhysicalPath()), 'depth': 1 }, sort_order=sort_order, sort_on=self.settings.sort_on or 'effective', sort_limit=self.settings.limit or 15)
class SQLAlchemyConnectionsForm(crud.CrudForm): label = _(u'label_saconnectform', u'Manage SQLAlchemy connection strings') update_schema = IConnectionLine def __init__(self, context, request): crud.CrudForm.__init__(self, context, request) self.storage = ISQLAlchemyConnectionStrings(getUtility(ISiteRoot)) def get_items(self): names = self.storage.keys() names.sort() return [(name, ConnectionLine(name, self.storage[name], self)) for name in names] def add(self, data): name = data['connname'].strip() if str(name) in self.storage: msg = _(u'error_name_already_registered', u'The connection name is already registered') msg = translate(msg, self.request) raise schema.ValidationError(msg) self.storage[name] = data['connstring'].strip() return ConnectionLine(name, data['connstring'].strip(), self) def remove(self, (id, item)): del self.storage[item.connname] SQLAlchemyConnectionsView = wrap_form(SQLAlchemyConnectionsForm)
display_type = getDisplayType(settings.display_type) msg = has_changes and self.successMessage or self.noChangesMessage msg = zope.i18n.translate(msg) if display_type.userWarning is not None: self.status = "%s %s" % ( msg, zope.i18n.translate(display_type.userWarning)) else: self.status = msg @button.buttonAndHandler(_('Apply'), name='apply') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return changes = self.applyChanges(data) settings = GallerySettings(self.context) has_changes = False if changes: settings = GallerySettings(self.context) settings.last_cooked_time_in_seconds = 0 has_changes = True self.set_status_message(settings, has_changes) return self.request.response.redirect(self.context.absolute_url()) GallerySettingsView = wrap_form(GallerySettingsForm)
form.widget(getText=WysiwygFieldWidget) getText = schema.Text(title=_(u"Text"), required=False) class DocumentOverrideStorage(base.OverrideStorage): """ Store document content type specific override settings """ zope.interface.implements(IFormSchema) Title = FieldProperty(IFormSchema["Title"]) Description = FieldProperty(IFormSchema["Description"]) getText = FieldProperty(IFormSchema["getText"]) def document_override_storage_factory(context): """ Adapter which creates the persistent object storing document specific overrides. """ return base.getOverrideStorage(context, DocumentOverrideStorage) class DocumentOverriderForm(base.OverrideForm): """ Edit mobile overrides for the document """ grok.context(IATDocument) schema = IFormSchema DocumentOverriderFormView = wrap_form(DocumentOverriderForm)
group.fields = field.Fields(group.fields, *toadd) def update(self): super(NoticeBoardSettingsForm, self).update() def set_status_message(self, settings, has_changes): msg = has_changes and self.successMessage \ or self.noChangesMessage msg = zope.i18n.translate(msg) self.status = msg @button.buttonAndHandler(_('Apply'), name='apply') def handleApply(self, action): (data, errors) = self.extractData() if errors: self.status = self.formErrorsMessage return changes = self.applyChanges(data) settings = NoticeboardSettings(self.context) has_changes = False if changes: settings = NoticeboardSettings(self.context) has_changes = True self.set_status_message(settings, has_changes) return self.request.response.redirect(self.context.absolute_url()) NoticeboardSettingsView = wrap_form(NoticeBoardSettingsForm)
from z3c.form import field from z3c.form import form from z3c.form.browser.checkbox import CheckBoxFieldWidget logger = getLogger('collective.documentviewer') class GlobalSettingsForm(form.EditForm): fields = field.Fields(IGlobalDocumentViewerSettings) fields['auto_layout_file_types'].widgetFactory = CheckBoxFieldWidget label = _(u'heading_documentviewer_global_settings_form', default=u"Global Document Viewer Settings") description = _(u'description_documentviewer_global_settings_form', default=u"Configure the parameters for this Viewer.") @button.buttonAndHandler(_('Save'), name='apply') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return self.applyChanges(data) self.status = PloneMessageFactory('Changes saved.') GlobalSettingsFormView = wrap_form(GlobalSettingsForm)
:type id: object """ registry = getUtility(IRegistry) ids = registry['collective.cropimage.ids'] ids = [i for i in ids if i['id'] != id] registry['collective.cropimage.ids'] = ids def before_update(self, item, data): registry = getUtility(IRegistry) ids = registry['collective.cropimage.ids'] ids = [i for i in ids if i['id'] != data['id']] ids.append(data) registry['collective.cropimage.ids'] = ids CropImageIDControlPanelView = wrap_form( CropImageIDControlPanelForm, index=ViewPageTemplateFile('templates/controlpanel.pt') ) class CropImageView(BrowserView): template = ViewPageTemplateFile('templates/crop_image.pt') def __call__(self): context = aq_inner(self.context) form = self.request.form if form.get('form.button.Save', None) is not None: name = 'collective.cropimage.{0}'.format( form.get('field') ) anno = IAnnotations(context)
class ShopConfigurationForm(RegistryEditForm, group.GroupForm): """Configuration form for the ftw.shop configlet """ schema = IShopConfiguration fields = field.Fields(IShopConfiguration).omit( 'shop_email', 'mail_bcc', 'mail_subject', 'always_notify_shop_owner', 'payment_processor_step_group', 'enabled_payment_processors', 'contact_info_step_group', 'shipping_address_step_group', 'order_review_step_group', 'phone_number', 'vat_enabled', 'vat_number', 'vat_rates') groups = (MailGroup, CheckoutGroup, VATGroup) label = _(u'label_shop_configuration', default=u"Shop configuration") def updateFields(self): super(ShopConfigurationForm, self).updateFields() def updateWidgets(self): super(ShopConfigurationForm, self).updateWidgets() # BBB: For Plone3 compatibility, we need to override the template # on the form wrapper, not the form itself, and use zope2's # ViewPageTemplateFile, not zope3's # See http://plone.org/products/dexterity/documentation/error/rendering-a-form-fails-with-attributeerror-str-object-has-no-attribute-other ShopConfigurationView = wrap_form(ShopConfigurationForm, ControlPanelFormWrapper) ShopConfigurationView.template = ViewPageTemplateFile( 'templates/controlpanel.pt')
# render template and send email variables = {'send_from_address' : send_from_address, 'sender_id' : sender_id, 'url' : referer, 'subject' : subject, 'message' : message, 'encoding' : encoding, } host = context.MailHost # plone_utils.getMailHost() (is private) try: message = context.author_feedback_template(context, **variables) result = host.secureSend(message, send_to_address, envelope_from, subject=subject, subtype='plain', charset=encoding, debug=False, From=send_from_address) except ConflictError: raise except: # TODO Too many things could possibly go wrong. So we catch all. exception = plone_utils.exceptionString() message = _(u'Unable to send mail: ${exception}', mapping={u'exception' : exception}) plone_utils.addPortalMessage(message, 'error') return False """ plone_utils.addPortalMessage(u'[FAKE] %s' % _(u'Mail sent.')) # wrap the form with plone.app.z3cform's Form wrapper ContactInfoView = wrap_form(ContactInfoForm) # Register Norobots validator for the correponding field in the IContactInfo interface validator.WidgetValidatorDiscriminators(NorobotsValidator, field=IContactInfo['norobots'])
context = self.getContent() applyChanges(self, context, data) self.status = self.successMessage return context def nextURL(self): api.portal.show_message(self.status, request=self.request) return "%s/%s" % (self.getContent().absolute_url(), '@@token_manage') def update(self): self.buttons.values()[0].title = _(u'add_token', default=u"Add token") super(TokenAddForm, self).update() # wrap the form with plone.app.z3cform's Form wrapper TokenAddFormView = layout.wrap_form(TokenAddForm) class TokenEditForm(form.EditForm): """ Token Edit Form """ # Defining the fields fields = field.Fields( TextLine(__name__='token_display', title=ITokenInfoSchema['token_id'].title, description=ITokenInfoSchema['token_id'].description) ) + field.Fields(ITokenInfoSchema) fields['token_id'].mode = HIDDEN_MODE fields['token_display'].mode = DISPLAY_MODE fields['token_roles'].widgetFactory[INPUT_MODE] = CheckBoxFieldWidget
if not errors: # Special treatment for ajax/non-ajax save if not ajax: if new_tag: message = _(u"Tag '${title}' added.", mapping={u'title': tag['title']}) else: message = _(u"Tag '${title}' updated.", mapping={u'title': tag['title']}) self.request.response.redirect('%s/@@imagetags-manage' % self.context.absolute_url()) IStatusMessage(self.request).addStatusMessage(message, type='info') else: # Return XML response self.request.response.redirect( '%s/@@imagetags-newtag?id=%s' % (self.context.absolute_url(), id)) class AddTagFormWrapper(FormWrapper): index = ViewPageTemplateFile('templates/form.pt') ajax = False def getId(self): return self.__name__.replace('.', '-') AddTag = wrap_form(AddTagForm, __wrapper_class=AddTagFormWrapper)