def __call__(self, value=None): msg = self.toggle(value) messages = IStatusMessage(self.request) messages.addStatusMessage(msg, type="info") redirect = self.request.get_header("referer") \ or '/'.join([self.context.absolute_url(), 'view']) self.request.response.redirect(redirect)
def plonegroup_contact_transition(contact, event): """ React when a IPloneGroupContact transition is done """ if event.transition and event.transition.id == 'deactivate': # check if the transition is selected registry = getUtility(IRegistry) pp = api.portal.get_tool('portal_properties') errors = [] if contact.UID() in registry[ORGANIZATIONS_REGISTRY]: errors.append(_('This contact is selected in configuration')) elif pp.site_properties.enable_link_integrity_checks: search_value_in_objects(contact, contact.UID(), p_types=[], type_fields={}) storage = ILinkIntegrityInfo(contact.REQUEST) breaches = storage.getIntegrityBreaches() if contact in breaches: errors.append(_("This contact is used in following content: ${items}", mapping={'items': ', '.join(['<a href="%s" target="_blank">%s</a>' % (i.absolute_url(), i.Title()) for i in breaches[contact]])})) if errors: smi = IStatusMessage(contact.REQUEST) smi.addStatusMessage(_('You cannot deactivate this item !'), type='error') smi.addStatusMessage(errors[0], type='error') view_url = getMultiAdapter((contact, contact.REQUEST), name=u'plone_context_state').view_url() # contact.REQUEST['RESPONSE'].redirect(view_url) raise Redirect(view_url)
def _on_save(self, data): """ Deleting the gray-scale converted resources from the filesystem cache """ messages = IStatusMessage(self.request) if data.get("delete_cached_resources"): site = getSite() try: path = str("/++%s++%s" % (TYPE, THEME)) location = site.restrictedTraverse(path).directory except AttributeError, e: log.info("Unable to remove files for: %s due to error: %s" % (path, e)) message = _(u"Couldn't remove files from %s" % path) messages.addStatusMessage(message, type="error") return try: log.info("Removing cached gray-scale files from: %s" % location) for filename in os.listdir(location): file_path = os.path.join(location, filename) if os.path.isfile(file_path): os.unlink(file_path) else: shutil.rmtree(file_path) except OSError, e: log.info("Unable to remove files from: %s, error: %s" % (location, e)) message = _(u"Couldn't remove files from %s" % location) messages.addStatusMessage(message, type="error")
def handle_migrate(self, action): data, errors = self.extractData() if errors: return changed_base_classes = data.get('changed_base_classes', []) if not changed_base_classes: return migrate_to_folderish = data.get('changed_base_classes', False) catalog = getToolByName(self.context, "portal_catalog") migrated = [] not_migrated = [] for brain in catalog(): obj = brain.getObject() old_class_name = dxmigration.get_old_class_name_string(obj) if old_class_name in changed_base_classes: if dxmigration.migrate_base_class_to_new_class( obj, migrate_to_folderish=migrate_to_folderish): migrated.append(obj) else: not_migrated.append(obj) messages = IStatusMessage(self.request) info_message_template = 'There are {0} objects migrated.' warn_message_template = 'There are not {0} objects migrated.' if migrated: msg = info_message_template.format(len(migrated)) messages.addStatusMessage(msg, type='info') if not_migrated: msg = warn_message_template.format(len(not_migrated)) messages.addStatusMessage(msg, type='warn') self.request.response.redirect(self.request['ACTUAL_URL'])
def handleAdd(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return self.checkISBN(data) # newEPublication = data.get('epublication_uid') and api.content.get(UID=data['epublication_uid']) \ # or self.addEPublication(data) newEPublication = self.addEPublication(data) newOriginalFile = self.addOriginalFile(newEPublication, data) # poslat zadost na vygenerovani ohlasovaciho listku - je na to # amqp sluzba if not data.get('epublication_uid'): authors = [data[key] for key in ['author1','author2','author3'] if data[key]] for author in authors: createContentInContainer(newEPublication, 'edeposit.content.author', fullname=author, title=author) messages = IStatusMessage(self.request) messages.addStatusMessage(u"ePublikace byla ohlášena.", type="info") fti = getUtility(IDexterityFTI, name=newOriginalFile.portal_type) #returnURL = "/".join([container.absolute_url(), newEPublication.id, newOriginalFile.id, fti.immediate_view]) self.request.response.redirect(newOriginalFile.absolute_url())
def send_unsubscribe_email(self, subscriber): newsletter = self.context catalog = getToolByName(self.context, "portal_catalog") query = {} query["portal_type"] = "ENLSubscriber" query["email"] = subscriber results = catalog.unrestrictedSearchResults(query) messages = IStatusMessage(self.request) if results: subscriber_brain = results[0] unsubscribe_url = self.newsletter_url +\ '/unsubscribe?subscriber=' + subscriber_brain.UID msg_text = """%s: %s""" % ( newsletter.getUnsubscribe_string(), unsubscribe_url) api.portal.send_email( recipient=subscriber, sender=self.context.email_from_address, subject=_(u"confirm newsletter unsubscription"), body=msg_text, ) messages.addStatusMessage( _("We send you an email, please confirm this unsubscription."), "info") else: # todo: write an extra error msg if a plone user wants to # unsubscribe himself messages.addStatusMessage( _("Your email address could not be found in subscribers."), "error")
def sendMail( self, msg, mail_from, mail_to, subject, ): if mail_to: bcc_to = [] if NOTIFICATION_LOG_ADDR: msg = u'''From: %s To: %s Bcc: %s Subject: %s ''' \ % (mail_from, mail_to, NOTIFICATION_LOG_ADDR, subject) + msg bcc_to = bcc_to + [NOTIFICATION_LOG_ADDR] if not isinstance(mail_to, list): mail_to = [mail_to] self.mailhost.send(messageText=msg, mto=mail_to + bcc_to, mfrom=mail_from, subject=subject, charset='utf-8') else: (mail_to, pref_lang) = self.findRecipient() messages = IStatusMessage(self.request) messages.addStatusMessage(self.ts.translate(_('mail_no_recipients' ), target_language=pref_lang), type='warning')
def __call__(self): context = aq_inner(self.context) request = self.request response_id = self.validate_response_id() file = None if response_id != -1: response = self.folder[response_id] file = response.attachment if file is None: status = IStatusMessage(request) msg = _(u"Response id ${response_id} has no attachment.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=context) status.addStatusMessage(msg, type='error') if file is None: request.response.redirect(context.absolute_url()) # From now on file exists. # Code mostly taken from Archetypes/Field.py:FileField.download filename = getattr(file, 'filename', file.getId()) if filename is not None: if FILE_NORMALIZER: filename = IUserPreferredFileNameNormalizer(request).normalize( safe_unicode(filename, context.getCharset())) else: filename = safe_unicode(filename, context.getCharset()) header_value = contentDispositionHeader( disposition='attachment', filename=filename) request.response.setHeader("Content-disposition", header_value) return file.index_html(request, request.response)
class NewsletterConfig(BrowserView): def __init__(self, context, request): self.context = context self.request = request self.messages = IStatusMessage(self.request) self.mailinglist_manager = utils.get_mailinglist_manager() self.mailinglists = self.mailinglist_manager.mailinglists self.protocols = self.mailinglist_manager.protocols def __call__(self): submitted = self.request.get('form.submitted') if submitted == 'add': # add new mailinglist name = self.request.get('name', None) email = self.request.get('email', None) protocol = self.request.get('protocol', None) if name and email and protocol: self.mailinglist_manager.add(name, email, protocol) else: msgid = _(u"config_add_mailinglist_failed", default="Could not add new mailing list. Please fill out\ all fields.") translated = self.context.translate(msgid) self.messages.addStatusMessage(translated, type="error") if submitted == 'remove': lists = self.request.get('remove', []) for list_id in lists: self.mailinglist_manager.remove(list_id) return self.index()
def __call__(self, request): value = request.form.get(self.field_name, request.get(self.field_name, None)) if value is not None: messages = IStatusMessage(request) catalog = getToolByName(self.context, "portal_catalog") plone_utils = getToolByName(self.context, 'plone_utils', None) parent = aq_parent(aq_inner(self.context)) # Get the object metatype that we are going to create object_type = self.context.Type() # Actual folder where the object is going to be created, ignoring the portal_factory check object_folder = str('/'.join(parent.getPhysicalPath())) object_folder = object_folder.replace('/portal_factory/'+object_type,'') results = self.context.portal_catalog.searchResults(portal_type=object_type, path={'query':object_folder,'level':0,'depth':1}, Title=value) for result in results: if self.context.UID() == result.getObject().UID(): return None if results: messages.addStatusMessage(_(u'There is an object in this folder with the same type and title'), type="error") return { self.field_name: '' } # Returning None means no error return None
def __call__(self): """ """ request = aq_inner(self.request) form = request.form if not 'form.button.Delete' in form: return super(PatchedManageAssignments, self).__call__() context = aq_inner(self.context) assignable = IRuleAssignmentManager(context) storage = getUtility(IRuleStorage) status = IStatusMessage(self.request) rule_ids = form.get('rule_ids', ()) path = '/'.join(context.getPhysicalPath()) for r in rule_ids: del assignable[r] assignments = get_assignments(storage[r]) if path in assignments: msg = 'Try to remove from %r' % ( assignments ) logger.info(msg) try: assignments.remove(path, None) except: assignments.remove(path) status.addStatusMessage(_(u"Assignments deleted."), type='info') return self.template()
def handle_buscar(self, action, data): db = getUtility(IDatabase, name=DB_NAME) mapper_class = db.mappers['posto'].class_ query = db.session.query(mapper_class) ativo = data.get('ativo') query = query.filter(mapper_class.ativo == ativo) #only add these items in a query if value is True for item in ['ferramentas','eletroportateis','eletronicos','bebedouros']: value = data.get(item, False) if value: query = query.filter(getattr(mapper_class, item) == value) modificado = data.get('modificado') criacao = data.get('criacao') if modificado is not None: query = query.filter(mapper_class.modificado >= modificado) if criacao is not None: query = query.filter(mapper_class.criacao >= criacao) for field in ['cod','cidade','bairro','uf']: if data.get(field) is not None: value = data.get(field) query = query.filter("%s ~* '%s'" % (field, value)) count = query.count() self.results = query.all() if not self.results: msg = "Nenhum registro foi encontrado." else: msg = "%d registro(s)." % count status = IStatusMessage(self.request) status.addStatusMessage(msg, u'info')
def __call__(self): self.update() message = _('Feed items updated') messages = IStatusMessage(self.request, alternate=None) if messages is not None: messages.addStatusMessage(message, 'info') self.request.response.redirect(self.context.absolute_url())
def __call__(self): context = aq_inner(self.context) request = aq_inner(self.request) form = request.form status = IStatusMessage(self.request) operation = request.get('operation', None) if operation == 'move_up': assignable = IRuleAssignmentManager(context) rule_id = request.get('rule_id') keys = list(assignable.keys()) idx = keys.index(rule_id) del keys[idx] keys.insert(idx - 1, rule_id) assignable.updateOrder(keys) elif operation == 'move_down': assignable = IRuleAssignmentManager(context) rule_id = request.get('rule_id') keys = list(assignable.keys()) idx = keys.index(rule_id) del keys[idx] keys.insert(idx + 1, rule_id) assignable.updateOrder(keys) elif 'form.button.AddAssignment' in form: rule_id = form.get('rule_id') api.assign_rule(self.context, rule_id) elif 'form.button.Delete' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.unassign_rule(self.context, r) status.addStatusMessage(_(u'Assignments deleted.'), type='info') elif 'form.button.Enable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.edit_rule_assignment(context, r, enabled=True) status.addStatusMessage(_(u'Assignments enabled.'), type='info') elif 'form.button.Disable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.edit_rule_assignment(context, r, enabled=False) status.addStatusMessage(_(u'Assignments disabled.'), type='info') elif 'form.button.Bubble' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.edit_rule_assignment( context, r, bubbles=True, enabled=True) status.addStatusMessage(_(u'Changes saved.'), type='info') elif 'form.button.NoBubble' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.edit_rule_assignment(context, r, bubbles=False) status.addStatusMessage(_(u'Changes saved.'), type='info') return self.template()
def render(self, *a, **kw): errors = [] results = '' status = IStatusMessage(self.request) data = self.request['_data'] # In the future we might implement other ways to render file # information, either for other types of backends or even file # formats (which file renderer should take over, but...), so # this serves as a placeholder of sort. view = 'fileinfo' fileview = zope.component.getMultiAdapter( (self.context, self.request), name=view) try: # XXX current way to disable main_template results = fileview.call_template() except: errors.append('failed to render file information') if errors: # probably should only show this info message to users who # can deal with this. status.addStatusMessage(' '.join(errors), 'info') if results: return results
def block_portlets(self, action): status = IStatusMessage(self.request) context = Acquisition.aq_inner(self.context) data, error = self.extractData() portlet_manager = data.get('portlet_manager', None) blockstatus = data.get('blockstatus', False) manager = data.get('portlet_manager', None) path = "/".join(context.getPhysicalPath()) if manager is not None: managernames = [manager] else: managernames = utils.get_portlet_manager_names() status.addStatusMessage(u'Set portlet block status on %s' % ', '.join( managernames), type='info') managers = dict() for managername in managernames: managers[managername] = assignment_mapping_from_key( context, managername, CONTEXT_CATEGORY, path, ) info, warnings, errors = utils.exec_for_all_langs( context, utils.block_portlets, managers=managers, blockstatus=blockstatus, ) self.handle_status(status, info, warnings, errors)
def render(self): this_attendee = self.context trainings_uid = self.request.form.get('trainings_uid', []) if isinstance(trainings_uid, str): trainings_uid = [trainings_uid, ] seat_table = SeatTable(this_attendee) # confirmed trainings are always part of the selection all_trainings = list(this_attendee.confirmed_trainings()) for uid in trainings_uid: if uid not in all_trainings: # was this training already ours # OR are there still available seats? if uid in this_attendee.trainings or seat_table.available_seats(uid): all_trainings.append(uid) else: training = uuidToObject(uid) messages = IStatusMessage(self.request) warning = _(u'This training is already fully booked') + ': ' + training.title messages.addStatusMessage(warning, type="warning") # reserve a seat for each training seat_table.refresh_attendee_trainings(this_attendee, all_trainings) # store the list of trainings of this attendee this_attendee.trainings = all_trainings this_attendee.reindexObject(idxs=['trainings', ]) # set the time of this operation for use in liberation of blocked seats this_attendee.last_time_trainings_were_set = datetime.now() if self.request.get('finish_button'): # back to the registration return self.request.response.redirect(this_attendee.getParentNode().absolute_url()) else: return self.request.response.redirect(this_attendee.absolute_url())
def createAndAdd(self, data): # use aq_inner, or else the obj will be wrapped in this view, # will screw up acquired security settings (esp. local roles) context = aq_inner(self.context) plone_utils = getToolByName(context, 'plone_utils') list_id = plone_utils.normalizeString(data['title']) context.invokeFactory(self.portal_type, list_id) list_ob = context._getOb(list_id) old_list_type = list_ob.list_type.list_marker new_list_type = data.get('list_type').list_marker form.applyChanges(list_ob, self.form_fields, data) # ensure correct role is set for users self._assign_local_roles_to_managers(list_ob) # XXX this ObjectCreatedEvent event would normally come before # the ObjectAddedEvent notify(zope.app.event.objectevent.ObjectCreatedEvent(list_ob)) notify(ListTypeChanged(list_ob, old_list_type, new_list_type)) self._finished_add = True status = IStatusMessage(self.request) status.addStatusMessage(_('Mailing list added.'), type=u'info') self._next_url = list_ob.absolute_url() return list_ob
def __call__(self, *args, **kwargs): ctx = self.context url = None if not self.permitted(): types_to_list = utils.typesToList(ctx) plt = getToolByName(self.context, "portal_languages") pref_lang = plt.getPreferredLanguage() ctx = self.find_endpoint(ctx, pref_lang, types_to_list) url = ctx.absolute_url() if ctx.defaultView() == "traverse_view": if not self.permitted(context=ctx): # Not allowed to list folder contents. Show fallback. url = "%s/%s" % (url, NON_TRAVERSE_FALLBACK_VIEW) else: # List folder contents permitted. Show folder_contents. url = "%s/folder_contents" % url messages = IStatusMessage(self.request) messages.addStatusMessage( _( "traverse_view-statusmessage", u"""This is a traverse view. Users who are not allowed to see the folder listing are redirected to the first subitem in this directory.""", ), type="info", ) raise Redirect(url)
def handleBuild(self, action): """\ Build the thing """ # validate all groups. errors = extractError(self) if errors: self.status = _(u"Unable to build exposure due to input error; " "please review the form and make the appropriate changes, " "update each subsection using the provided button, and try " "again.") return wh = zope.component.getAdapter(self.context, IExposureWizard) try: moldExposure(self.context, self.request, wh.structure) except ProcessingError, e: # XXX almost certainly a bad idea but this fixes # tracker item 3610. import transaction transaction.doom() self._doomed = True status = IStatusMessage(self.request) status.addStatusMessage(_(str(e)), 'error') # maybe the subscriber to this can do the rollback? raise ActionExecutionError(e)
def handleApply(self, action): """ Form button hander. """ # data is dict form field name -> cleaned value look-up # errors is a list of z3c error objects which have attribute message # extractData() also sets self.errors by default 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")
def addStatus(request, message): """Message is a tuple containing translated text (message[0]) and a dictionary of which we compose keyword arguments (message[1]), like message type. Messages are defined in config.py. """ messages = IStatusMessage(request) messages.addStatusMessage(message[0], **message[1])
def update(self): if not self.context.temporal_coverage_start: messages = IStatusMessage(self.request) messages.addStatusMessage(u"This metadata is not complete. Use the \ Edit tab to complete the information.", type="warning") super(View, self).update()
def __init__(self, context, request): self.context = context self.request = request portal_catalog = getToolByName(self.context, 'portal_catalog') p_state = getMultiAdapter((context, request), name=u'plone_portal_state') portal_url = p_state.portal_url() path = p_state.navigation_root_path() domain = urlparse(portal_url).hostname.split('.')[-1] domainsdict = {'de':'de','at':'at','ch':'ch'} target_id = domainsdict.get(domain, 'default') target_brains = portal_catalog(id=target_id, path=dict(query=path), depth=0) if len(target_brains) == 1: request.response.redirect(target_brains[0].getURL()) else: messages = IStatusMessage(self.request) messages.addStatusMessage(u"Diese Darstellung leitet je nach aufgerufener Domain auf ein \ Element (am sinnvollsten wohl ein Ordner) mit den id's 'de', 'at' oder 'ch' weiter. \ Als Fallback auf einen content mit der id 'default'. Wenn es auch das nicht gibt eben \ auf die folder_contents", type="info") request.response.redirect(portal_url+"/folder_contents")
def update(self): form = LoadFromSimilarForBookForm(self.context, self.request) view = LoadFromSimilarForBookSubView(self.context, self.request) view = view.__of__(self.context) view.form_instance = form self.loadsimilarform = view form.parent_form = self hiddenFields = ['related_aleph_record', 'summary_aleph_record', 'isClosed', 'thumbnail', 'shouldBeFullyCatalogized', 'isWellFormedForLTP', 'voucher'] for field in hiddenFields: if field in self.fields: del self.fields[field] super(AddAtOnceForm,self).update() sdm = self.context.session_data_manager session = sdm.getSessionData(create=True) proper_record = session.get('proper_record',None) # proper_record = getAlephRecord() if proper_record: messages = IStatusMessage(self.request) messages.addStatusMessage(u"Formulář je předvyplněn vybraným záznamem z Alephu.", type="info") self.loadValuesFromAlephRecord(proper_record) session.set('proper_record',None)
def PurgeAction(self): """ Purging actual object's cache by sending prepared request. The example request: PURGE 5bf8c564b5da741f9bc9a14ca2509b94 HTTP/1.1 Host: localhost:6081 """ mtool = getToolByName(self, 'portal_membership') host, port = self.getVarnishAddress() if not mtool.checkPermission("Modify portal content", self.context): raise Unauthorized purging_uids = [getUidOrId(self.context)] context_state = getMultiAdapter((self.context, self.request), name='plone_context_state') if context_state.is_default_page(): purging_uids.append(getUidOrId(context_state.parent())) #TODO: Handle exceptions of connection problem for uid in purging_uids: connection = httplib.HTTPConnection(host, port) connection.putrequest('PURGE', uid) connection.putheader('Host', host + ':' + port) connection.endheaders() connection.send('') response = connection.getresponse() messages = IStatusMessage(self.request) messages.addStatusMessage(_("Cache of the page has been purged"), type="info") return self.request.RESPONSE.redirect(self.context.absolute_url())
def update_final(self, data, *args, **kwargs): """ A final state/step of the form has been reached, and a 'next' button has been submitted. """ status = IStatusMessage(self.request) factory = MeasureFactory(self.context) measure = factory(data) url = measure.absolute_url() if self.context.source_type == MULTI_FORM_TYPE: status.addStatusMessage( 'Created new measure, please configure criteria by ' 'clicking on filters listed below.', type='info', ) config = data.get('IMeasureWizardMRCriteria') _types = [ config.get(k) for k in ('numerator_type', 'denominator_type') ] if 'multi_summarize' in _types: url += '/@@edit#autotoc-item-autotoc-2' else: url += '/@@measure_criteria' if self.context.source_type == SIMPLE_FORM_TYPE: status.addStatusMessage( 'Created new measure.', type='info', ) self.formbody = '' self.request.response.redirect(url)
def setProperties(self): context = aq_inner(self.context) new = self.request.form.get('new_definition', None) columns = self.request.form.get('new_definition_columns', []) error = 0 if new and new['name']: try: self._definitions.addDefinition(new['name'], new['style'], self._formatColumns(columns)) except: transaction.abort() error = _(u'Unable to parse the columns field of the definition to be added') modify = self.request.form.get('definitions', [])[:] for definition in modify: if definition.has_key('delete'): self._definitions.removeDefinition(definition['id']) if definition.has_key('delete'): continue try: columns = self.request.form.get('definition_columns_%s' % definition['origname'], []) self._definitions.addDefinition(definition['name'], definition['style'], self._formatColumns(columns), definition['id']) except: transaction.abort() error = _(u'Unable to parse the columns field of one of the definitions to be modified') statusmessage = IStatusMessage(self.request) if error: statusmessage.addStatusMessage(error, 'error') else: statusmessage.addStatusMessage(_p(u'Changes saved.'), 'info')
def __call__(self): # Add a status message, showing whether the login has # succeeded or not. status = IStatusMessage(self.request) pps = getMultiAdapter((self.context, self.request), name='plone_portal_state') anonymous = pps.anonymous() if anonymous and not self.show_group_options(): success = False msg = PMF(u"Login failed") msg = translate(msg, 'plone', context=self.request) status.addStatusMessage(msg, type='error') elif anonymous: success = False else: success = True msg = PMF(u"heading_you_are_now_logged_in", default=u"You are now logged in") msg = translate(msg, 'plone', context=self.request) status.addStatusMessage(msg, type='info') if anonymous and self.request.cookies.get('aselectattributes'): success = False logger.debug("We have an A-Select cookie but are still anonymous.") if (not success) or self.request.get('noredirect'): # Show the template. Manually adding '?noredirect=1' to # the url may be handy for debugging: this way you stay on # this url, which means you can inspect the cookies. return self._template() logger.debug('Redirecting to Plone Site root.') # We are only defined on the Plone Site root, so we can just # redirect to the context. self.request.RESPONSE.redirect(self.context.absolute_url())
def update(self): context = aq_inner(self.context) self.helper = MultiLinguageContentListingHelper(context, self.request) if not self.helper.getSettings(): messages = IStatusMessage(self.request) messages.addStatusMessage(u"Silvuple not configured in Site Setup", type="error")
def __call__(self): """ Install products by running the default import steps XXX: is this running all profiles? """ setupTool = getToolByName(self.context, 'portal_setup') profiles = self.request.get('install_products') msg_type = 'info' if profiles: messages = IStatusMessage(self.request) for profile in profiles: # TODO: find out where this is and don't run already # activated profiles setupTool.runAllImportStepsFromProfile(profile) msg = _(u'Installed ${product}!', mapping={'product': profile}) messages.addStatusMessage(msg, type=msg_type) purl = getToolByName(self.context, 'portal_url')() self.request.response.redirect(purl + '/prefs_install_products_form')
def __call__(self): products = self.request.get('prefs_reinstallProducts', None) if products: messages = IStatusMessage(self.request) for product_id in products: result = self.upgrade_product(product_id) if not result: messages.addStatusMessage( _(u'Error upgrading ${product}.', mapping={'product': product_id}), type="error") # Abort changes for all upgrades. transaction.abort() break else: messages.addStatusMessage( _(u'Upgraded products.'), type="info") purl = getToolByName(self.context, 'portal_url')() self.request.response.redirect(purl + '/prefs_install_products_form')
def handleBack(self, action): messages = IStatusMessage(self.request) if self.validate_back: # if true, only allow navigating back if the current # step validates data, errors = self.currentStep.extractData() if errors: self.status = self.formErrorsMessage messages.addStatusMessage(self.status, type="error") return self.currentStep.applyChanges(data) self.updateCurrentStep(self.currentIndex - 1) # Back can change the conditions for the finish button, # so we need to reconstruct the button actions, since we # do not redirect. self.updateActions()
def manage_renameObjects(self, ids=[], new_ids=[]): """Rename reflected files or directories The objects specified in 'ids' get renamed to 'new_ids'. This emulates the CopyContainer interface enough to support renaming in Plone only. When file renaming fails, errors are communicated through the return of the successful ids and the IStatusMessage utility """ if len(ids) != len(new_ids): raise BadRequest('Please rename each listed object.') if not ids: raise ValueError('No items specified') # To avoid inconsistencies, first test file availability for old, new in zip(ids, new_ids): if not self.has_key(old): raise KeyError(old) if not self.acceptableFilename(new) or self.has_key(new): raise CopyError, 'Invalid Id' notify(ObjectWillBeMovedEvent(self[old], self, old, self, new)) problem_ids = [] path = self.getFilesystemPath() for id in ids: try: os.rename(os.path.join(path, old), os.path.join(path, new)) notify(ObjectMovedEvent(self[new], self, old, self, new)) except OSError: problem_ids.append(old) if problem_ids: sm = IStatusMessage(getattr(self, 'REQUEST', None), None) if sm is not None: sm.addStatusMessage( 'Failed to rename some files: %s' % problem_ids, 'stop') if set(ids) - set(problem_ids): indexview = self.unrestrictedTraverse('@@index') indexview.index() notifyContainerModified(self) return list(set(ids) - set(problem_ids))
def update(self): super(View, self).update() messages = IStatusMessage(self.request) context = aq_inner(self.context) self.context = context self.state = getMultiAdapter((context, self.request), name=u'plone_context_state') self.wf_state = self.state.workflow_state() self.utility = context.utility # Handle vote form = self.request.form self.errors = [] self.messages = [] INVALID_OPTION = _(u'Invalid option') if 'poll.submit' in form: options = form.get('options', '') if isinstance(options, list): self.errors.append(INVALID_OPTION) elif isinstance(options, str): if not options.isdigit(): self.errors.append(INVALID_OPTION) else: options = int(options) if not self.errors: # Let's vote try: self.context.setVote(options, self.request) self.messages.append(_(u'Thanks for your vote')) # We do this to avoid redirecting anonymous user as # we just sent them the cookie self._has_voted = True except Unauthorized: self.errors.append(_(u'You are not authorized to vote')) # Update status messages for error in self.errors: messages.addStatusMessage(error, type="warn") for msg in self.messages: messages.addStatusMessage(msg, type="info") if 'voting.from' in form: url = form['voting.from']
def __call__(self): self.update() subscription = self.request.get('digest-subscription') statusmessage = IStatusMessage(self.request) self.utility.switch_subscription(self.subscriber, self.context, subscription) msg_type = 'info' if subscription is None: message = _("Please select daily or weekly digest.") msg_type = 'error' elif subscription == 'daily-digest': message = _("You subscribed to daily digest email about activity on this folder") elif subscription == 'weekly-digest': message = _("You subscribed to weekly digest email about activity on this folder") elif subscription == 'cancel-subscription': message = _("You cancelled your subscription to digest email about activity on this folder") else: raise ValueError statusmessage.addStatusMessage(message, msg_type) return self.context.absolute_url()
def __call__(self): qi = getToolByName(self.context, 'portal_quickinstaller') products = self.request.get('uninstall_products') msg_type = 'info' if products: messages = IStatusMessage(self.request) # 1 at a time for better error messages for product in products: try: qi.uninstallProducts(products=[ product, ]) msg = _(u'Uninstalled ${product}.', mapping={'product': product}) except Exception, e: logging.error("Could not uninstall %s: %s" % (product, e)) msg_type = 'error' msg = _(u'Error uninstalling ${product}.', mapping={'product': product}) messages.addStatusMessage(msg, type=msg_type)
def __call__(self, manager=None): self.manager = manager self.action = '%s/@@components' % self.context.absolute_url() if manager is not None: self.action += '?manager=%s' % manager if self.request.get('form.submitted', False) or self.request.get( 'form.view', False): statusmessage = IStatusMessage(self.request) if self._save(): statusmessage.addStatusMessage( _(u'Components saved successfully'), u'info') else: statusmessage.addStatusMessage(_(u'Saving components failed'), u'error') if self.request.get('ajax_load', 0): return '1' if self.request.get('form.view', False): return self.context.absolute_url( ) or self.request.RESPONSE.redirect(self.context.absolute_url()) return self.template()
def __call__(self): product_id = self.request.get('install_product') if product_id: messages = IStatusMessage(self.request) msg_type = 'info' result = self.install_product(product_id) if result: msg = _(u'Installed ${product}!', mapping={'product': product_id}) else: # Only reason should be that between loading the page and # clicking to install a product, another user has already # installed this product. msg_type = 'error' msg = _(u'Failed to install ${product}.', mapping={'product': product_id}) messages.addStatusMessage(msg, type=msg_type) purl = getToolByName(self.context, 'portal_url')() self.request.response.redirect(purl + '/prefs_install_products_form')
def __call__(self): """Perform the update and redirect if necessary, or render the page """ target = self.assignation_target() if self.request.form.get('send', None): usernames = self.request.get('counterparts', None) if not usernames: status = IStatusMessage(self.request) msg = _( u'You need to select at least one expert for discussion') status.addStatusMessage(msg, "error") return self.index() self.revoke_all_roles() for username in usernames: api.user.grant_roles(username=username, roles=['MSExpert'], obj=target) if api.content.get_state(self.context) in [ u'phase1-pending', u'phase1-pending-answer-drafting' ]: wf_action = 'phase1-assign-answerer' elif api.content.get_state(self.context) in [ u'phase2-pending', u'phase2-pending-answer-drafting' ]: wf_action = 'phase2-assign-answerer' else: status = IStatusMessage(self.request) msg = _(u'There was an error. Try again please') status.addStatusMessage(msg, "error") url = self.context.absolute_url() return self.request.response.redirect(url) return self.context.content_status_modify( workflow_action=wf_action, ) else: self.revoke_all_roles() return self.index()
def __call__(self): if self.request.form.get('submitted'): language = self.request.form['language'] catalog = getToolByName(self.context, 'portal_catalog') context = catalog.unrestrictedSearchResults( UID=self.request.form['came_from']) if context: context = context[0].getObject() if language and context: manager = ITranslationManager(context) try: manager.remove_translation(language) except Exception as e: messages = IStatusMessage(self.request) messages.addStatusMessage(e, type='error') return self.request.response.redirect(context.absolute_url() + '/modify_translations') return self.tpl()
def __call__(self): self.contenttype = self.request.get('customize.type', False) cancelled = self.request.form.get('form.button.cancel', False) if cancelled or self.contenttype not in ('organization', 'person'): return self.redirect() self.columns = getAdapter(self.context, interface=ICustomizableColumns, name=self.contenttype) submitted = self.request.form.get('customize.submitted', False) if submitted: self.columns.set_columns(self.request.form.get('selected', [])) statusmessage = IStatusMessage(self.request) statusmessage.addStatusMessage(_(u'View successfully customized'), 'info') return self.redirect() return self.pt()
def __call__(self): product_id = self.request.get('uninstall_product') if product_id: messages = IStatusMessage(self.request) try: result = self.uninstall_product(product_id) except Exception, e: logger.error("Could not uninstall %s: %s", product_id, e) msg_type = 'error' msg = _(u'Error uninstalling ${product}.', mapping={'product': product_id}) else: if result: msg_type = 'info' msg = _(u'Uninstalled ${product}.', mapping={'product': product_id}) else: msg_type = 'error' msg = _(u'Could not uninstall ${product}.', mapping={'product': product_id}) messages.addStatusMessage(msg, type=msg_type)
def update(self): # super(PollView, self).update() messages = IStatusMessage(self.request) context = aq_inner(self.context) self.context = context self.state = getMultiAdapter((context, self.request), name=u'plone_context_state') self.wf_state = self.state.workflow_state() self.utility = context.utility # Handle vote form = self.request.form self.errors = [] self.messages = [] if 'poll.submit' in form: self._handleSubmit(form) # Update status messages for error in self.errors: messages.addStatusMessage(error, type="warn") for msg in self.messages: messages.addStatusMessage(msg, type="info")
def __call__(self): status = IStatusMessage(self.request) self._setCanonicalLanguage(self.context) newlang = self.request["newlanguage"] lt = getToolByName(self.context, "portal_languages") lt.setLanguageCookie(newlang) if self.context.hasTranslation(newlang): status.addStatusMessage(_(u"message_translation_exists", default=u"Translation already exists"), type="info") else: self.context.addTranslation(newlang) status.addStatusMessage(_(u"message_translation_created", default=u"Translation created."), type="info") trans = self.context.getTranslation(newlang) return self.request.response.redirect(self.nextUrl(trans))
def __call__(self): portal_type = self.request.get('portal_type', [ 'File', ]) status = IStatusMessage(self.request) cnt = 0 lang = self.context.Language() for subobj in self.context.objectValues(): if not portal_type or subobj.portal_type in portal_type: if subobj.Language() != lang: subobj.setLanguage(lang) cnt += 1 if cnt > 0: msg = 'Align content languages handled a total of %d items of ' \ 'type %s.' % (cnt, ', '.join(portal_type)) else: msg = 'Align content languages: nothing needed to be done for '\ 'items of type %s.' % ', '.join(portal_type) status.addStatusMessage(msg, type='info') self.request.RESPONSE.redirect(self.context.absolute_url())
def handle_install(self, action): """ install p.a.c """ url = self.context.absolute_url() qi = getToolByName(self.context, 'portal_quickinstaller') fail = qi.installProduct( 'plone.app.contenttypes', profile='plone.app.contenttypes:default', blacklistedSteps=['typeinfo'], ) if fail: messages = IStatusMessage(self.request) messages.addStatusMessage(fail, type='error') self.request.response.redirect(url) # For types without any instances we want to instantly # replace the AT-FTI's with DX-FTI's. self.installTypesWithoutItems() url = url + '/@@atct_migrator' self.request.response.redirect(url)
def validate_response_id(self): """Validate the response id from the request. Return -1 if for example the response id does not exist. Return the response id otherwise. Side effect: an informative status message is set. """ status = IStatusMessage(self.request) response_id = self.request.form.get('response_id', None) if response_id is None: msg = _(u"No response selected.") msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') return -1 else: try: response_id = int(response_id) except ValueError: msg = _(u"Response id ${response_id} is no integer.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') return -1 if response_id >= len(self.folder): msg = _(u"Response id ${response_id} does not exist.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') return -1 else: return response_id # fallback return -1
def __call__(self): storage = getUtility(IRedirectionStorage) portal = getUtility(ISiteRoot) request = self.request form = request.form status = IStatusMessage(self.request) if 'form.button.Remove' in form: redirects = form.get('redirects', ()) for redirect in redirects: storage.remove(redirect) if len(redirects) == 0: status.addStatusMessage(_("No aliases selected for removal."), type='info') elif len(redirects) > 1: status.addStatusMessage(_("Aliases removed."), type='info') else: status.addStatusMessage(_("Alias removed."), type='info') elif 'form.button.Save' in form: dst = IAliasesSchema(self.context) dst.managed_types = self.request.form['form.widgets.managed_types'] elif 'form.button.Upload' in form: self.upload(form['file'], portal, storage, status) self.form = RedirectsControlPanelForm(self.context, self.request) self.form.update() return self.template()
def handleLogin(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return membership_tool = getToolByName(self.context, 'portal_membership') status_msg = IStatusMessage(self.request) if membership_tool.isAnonymousUser(): self.request.response.expireCookie('__ac', path='/') if self.use_email_as_login(): status_msg.addStatusMessage( _(u'Login failed. Both email address and password are ' u'case sensitive, check that caps lock is not enabled.'), 'error', ) else: status_msg.addStatusMessage( _(u'Login failed. Both login name and password are case ' u'sensitive, check that caps lock is not enabled.'), 'error', ) return is_initial_login = self._post_login() status_msg.addStatusMessage( _( u'you_are_now_logged_in', default=u'Welcome! You are now logged in.', ), 'info') came_from = data.get('came_from', None) self.redirect_after_login(came_from, is_initial_login)
def confirm_subscriber(self): hashkey = self.request.get('hkey') enl_registration_tool = queryUtility(IENLRegistrationTool, 'enl_registration_tool') regdataobj = enl_registration_tool.get(hashkey) messages = IStatusMessage(self.request) if regdataobj: easynewsletter = self.portal.unrestrictedTraverse( regdataobj.path_to_easynewsletter) valid_email, error_code = easynewsletter.addSubscriber( regdataobj.subscriber, regdataobj.firstname, regdataobj.lastname, regdataobj.name_prefix, regdataobj.nl_language, regdataobj.organization, regdataobj.salutation) if valid_email: # now delete the regobj del enl_registration_tool[hashkey] messages.addStatusMessage( _("Your subscription was successfully confirmed."), "info") else: messages.addStatusMessage(MESSAGE_CODE[error_code], "error") self._msg_redirect(easynewsletter) else: messages.addStatusMessage(_("Please enter a valid email address."), "error") return self.request.response.redirect(self.context.absolute_url())
def __call__(self): context = aq_inner(self.context) status = IStatusMessage(self.request) if not self.can_delete_response: msg = _(u"You are not allowed to delete responses.") msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') else: response_id = self.request.form.get('response_id', None) if response_id is None: msg = _(u"No response selected for removal.") msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') else: try: response_id = int(response_id) except ValueError: msg = _( u"Response id ${response_id} is no integer so it " "cannot be removed.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=context) status.addStatusMessage(msg, type='error') self.request.response.redirect(context.absolute_url()) return if response_id >= len(self.folder.list()): msg = _( u"Response id ${response_id} does not exist so it " "cannot be removed.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=context) status.addStatusMessage(msg, type='error') else: response = self.folder.list()[response_id] self.folder.delete(response.response_id) msg = _(u"Removed response id ${response_id}.", mapping=dict(response_id=response_id)) status.addStatusMessage(msg, type='info') self.request.response.redirect(context.absolute_url())
def __call__(self): form = self.request.form context = aq_inner(self.context) status = IStatusMessage(self.request) if not self.can_edit_response: msg = _(u"You are not allowed to edit responses.") msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') else: response_id = form.get('response_id', None) if response_id is None: msg = _(u"No response selected for saving.") msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='error') else: response = self.folder[response_id] response_text = form.get('response', u'') response.text = response_text # Remove cached rendered response. response.rendered_text = None msg = _(u"Changes saved to response id ${response_id}.", mapping=dict(response_id=response_id)) msg = translate(msg, 'Poi', context=self.request) status.addStatusMessage(msg, type='info') # Fire event. We put the context in the descriptions # so event handlers can use this fully acquisition # wrapped object to do their thing. Feels like # cheating, but it gets the job done. Arguably we # could turn the two arguments around and signal that # the issue has changed, with the response in the # event descriptions. modified(response, context) self.request.response.redirect(context.absolute_url())
def action_send(self, action, data): status = IStatusMessage(self.request) new_path_key = data['path_key'] if self.context.hasProperty('path_key'): old_path_key = self.context.get('path_key', None) if old_path_key and not new_path_key: self.context.manage_delProperties(['path_key']) noLongerProvides(self.context, IPathkey) status.addStatusMessage(_("Succesfully deleted the pathkey.")) elif new_path_key: self.context.manage_changeProperties( {'path_key': new_path_key}) status.addStatusMessage( _("Modification of the pathkey succeeded.")) else: if new_path_key: self.context.manage_addProperty('path_key', new_path_key, 'string') alsoProvides(self.context, IPathkey) status.addStatusMessage(_("Added a new pathkey.")) self.context.reindexObject(idxs=['object_provides']) self.response.redirect(self.context.absolute_url()) return ''
class FormParserView(BrowserView): """Parse the submitted "was this useful"-form. """ def _createVote(self, useful, comment=None): now = DateTime() useful_int = int(useful) vote = { KEY_USEFUL: useful_int, KEY_COMMENT: comment, KEY_DATE: now, KEY_IP: self.request.getClientAddr(), } return vote def _addVote(self, vote): manager = IUsefulnessManager(self.context) votes = manager.getVotes() votes.append(vote) manager.setVotes(votes) event = UsefulnessEvent(self.context) zope.event.notify(event) self.messages.addStatusMessage( _(u'message_thank_you', default=u'Thank you for voting!')) def __call__(self): self.messages = IStatusMessage(self.request) form = self.request.form authenticator = getMultiAdapter((self.context, self.request), name=u"authenticator") if not form or FORM_FIELD_USEFUL not in form: self.messages.addStatusMessage('No form submitted.') elif not authenticator.verify(): raise Unauthorized else: vote = self._createVote(form[FORM_FIELD_USEFUL], comment=form.get(FORM_FIELD_COMMENT, None)) self._addVote(vote) self.request.RESPONSE.redirect(self.context.absolute_url())
def update(self): super(View, self).update() messages = IStatusMessage(self.request) context = aq_inner(self.context) self.context = context self.state = getMultiAdapter( (context, self.request), name=u'plone_context_state') self.wf_state = self.state.workflow_state() self.utility = context.utility # Handle vote form = self.request.form self.errors = [] self.messages = [] #if the poll is open and anonymous should vote but the parent folder #is private.. inform the user. # When the poll's container is the site's root, we do not need to # check the permissions. container = aq_parent(aq_inner(self.context)) if 'open' == self.wf_state and not ISiteRoot.providedBy(container): roles = [ r['name'] for r in self.context.rolesOfPermission('collective.polls: Vote') if r['selected']] if 'Anonymous' not in roles and self.context.allow_anonymous: messages.addStatusMessage(_( u"Anonymous user won't be able to vote, you forgot to " u"publish the parent folder, you must sent back the poll " u"to private state, publish the parent folder and open " u"the poll again"), type="info") INVALID_OPTION = _(u'Invalid option') if 'poll.submit' in form: options = form.get('options', '') if isinstance(options, list): self.errors.append(INVALID_OPTION) elif isinstance(options, str): if not options.isdigit(): self.errors.append(INVALID_OPTION) else: options = int(options) if not self.errors: # Let's vote try: self.context.setVote(options, self.request) self.messages.append(_(u'Thanks for your vote')) # We do this to avoid redirecting anonymous user as # we just sent them the cookie self._has_voted = True except Unauthorized: self.errors.append(_(u'You are not authorized to vote')) # Update status messages for error in self.errors: messages.addStatusMessage(error, type="warn") for msg in self.messages: messages.addStatusMessage(msg, type="info")
def __call__(self): target = self.assignation_target() if self.request.form.get('send', None): usernames = self.request.get('counterparts', None) if not usernames: status = IStatusMessage(self.request) msg = _( u'You need to select at least one expert for discussion') status.addStatusMessage(msg, "error") return self.index() self.revoke_all_roles() for username in usernames: api.user.grant_roles(username=username, roles=['MSExpert'], obj=target) return self.request.response.redirect(target.absolute_url()) else: return self.index()
def __call__(self): """Perform the update and redirect if necessary, or render the page """ target = self.assignation_target() if self.request.form.get('send', None): usernames = self.request.form.get('counterparts', None) if not usernames: status = IStatusMessage(self.request) msg = _( u'You need to select at least one reviewer for conclusions' ) status.addStatusMessage(msg, "error") return self.index() self.revoke_all_roles() for username in usernames: api.user.grant_roles( username=username, obj=target, roles=['CounterPart'], ) if api.content.get_state(self.context).startswith('phase1-'): wf_action = 'phase1-request-comments' elif api.content.get_state(self.context).startswith('phase2-'): wf_action = 'phase2-request-comments' else: status = IStatusMessage(self.request) msg = _(u'There was an error. Try again please') status.addStatusMessage(msg, "error") url = self.context.absolute_url() return self.request.response.redirect(url) return self.context.content_status_modify( workflow_action=wf_action, ) else: return self.index()
class ReflectionView(BrowserView): template = ViewPageTemplateFile('templates/view.pt') label = u'Using SQLAlchemy reflection' def __init__(self, context, request): super(ReflectionView, self).__init__(context, request) def __call__(self): self.status = IStatusMessage(self.request) if self.request.form.has_key('submitted'): CheckAuthenticator(self.request) if self.request.form.has_key('add_row'): self.status.addStatusMessage(u"Added row.", type='info') self.add_row() return self.template() def rows(self): session = Session() # we use sqlalchemy reflection to build the model for us, # for an existing database where we do not have a model # (or do not want to create a model). table = get_table(session, 'test_data') query = table.select() # How to select with a where clause: # query = table.select(whereclause=((table.c.my_first_field == myvalue))) query_result = session.execute(query) output = [] for r in query_result: output.append('%s - %s - %s - %s' % (r.row_id, r.my_first_field, r.my_second_field, r.my_third_field)) return output def add_row(self): session = Session() table = get_table(session, 'test_data') data = { 'my_first_field': 43, 'my_second_field': 'qwertyæøå', 'my_third_field': 'qwertyusdfgh fghrt fgthy' } myinsert = table.insert(values=data) result = session.execute(myinsert) # When we do not use the ORM, but use raw sql like in this example, # we have to mark the session as changed manually: mark_changed(session) if result.rowcount > 0: self.status.addStatusMessage(u"Added row.", type='info') else: self.status.addStatusMessage( u"Row not added, some error happened.", type='error')
def upgrade_product(self, product): ''' Also upgrade profiles ''' # XXX remove customization in future versions!!! if not Products.CMFPlone.__version__.startswith('5.0'): raise Exception('Incompatible upgrade mechanisms') if super(ManageProductsView, self).upgrade_product(product): messages = IStatusMessage(self.request) try: profile_id = '{}:default'.format(product) steps_to_run = self.ps.listUpgrades(profile_id) if steps_to_run: self.ps.upgradeProfile(profile_id) return True except Exception as ex: logging.error("Could not upgrade %s: %s" % (product, ex)) messages.addStatusMessage(_(u'Error upgrading ${product}.', mapping={'product': product}), type="error") return False else: return False