def linked_version_preview(item, value): url = "{}/@@bumblebee-overlay-listing?version_id={}".format( item.url, item.version) showroom_title = translate( _('label_showroom_version_title', default='Version ${version} of ${timestamp}', mapping={'version': item.version, 'timestamp': item.timestamp}), context=getRequest()).encode('utf-8') data = { 'url': url, 'showroom_url': url, 'showroom_title': showroom_title, 'title': translate( _('label_preview', default='Preview'), context=getRequest()).encode('utf-8') } return """ <div> <a class="showroom-item function-preview-pdf" href="{%(url)s}" data-showroom-target="%(showroom_url)s" data-showroom-title="%(showroom_title)s">%(title)s</a> </div> """ % data
def ticket_title_generator(obj): """Generate a title for the ticket, also using event information. """ event = obj ret = { 'title': obj.title, 'eventtitle': '', 'eventstart': '', 'eventend': '' } if ITicketOccurrence.providedBy(event): event = aq_parent(aq_parent(event)) # Traverse to the Occurrence object if IATEvent.providedBy(event): # get the request out of thin air to be able to publishTraverse to # the transient Occurrence object. traverser = OccTravAT(event, getRequest()) elif IDXEvent.providedBy(event): # TODO traverser = OccTravDX(event, getRequest()) else: raise NotImplementedError( u"There is no event occurrence traverser implementation for " u"this kind of object." ) try: event = traverser.publishTraverse(getRequest(), obj.id) except KeyError: # Maybe the ticket occurrence isn't valid anymore because the # event occurence doesn't exist anymore. # Just ignore that case. return ret elif ITicket.providedBy(event): event = aq_parent(event) if IEvent.providedBy(event) or IOccurrence.providedBy(event): acc = IEventAccessor(event) lstart = ulocalized_time( DT(acc.start), long_format=True, context=event ) lend = ulocalized_time( DT(acc.start), long_format=True, context=event ) # XXX: no unicode, store as utf-8 encoded string instead ret = dict( title=u'%s - %s (%s - %s)' % ( safe_unicode(acc.title), safe_unicode(obj.title), lstart, lend, ), eventtitle=acc.title, eventstart=acc.start, eventend=acc.end, ) return ret
def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except (WrongAgendaItemState, CannotExecuteTransition): return JSONResponse(getRequest()).error( _(u'invalid_agenda_item_state', default=u'The agenda item is in an invalid state for ' 'this action.'), status=403).dump() except Forbidden: return JSONResponse(getRequest()).error( _(u'editing_not_allowed', default=u'Editing is not allowed.'), status=403).dump() except MissingMeetingDossierPermissions: return JSONResponse(getRequest()).error( _('error_no_permission_to_add_document', default=u'Insufficient privileges to add a ' u'document to the meeting dossier.'), status=403).dump() except MissingAdHocTemplate: return JSONResponse(getRequest()).error( _('missing_ad_hoc_template', default=u"No ad-hoc agenda-item template has been " u"configured."), status=501).dump() except SablonProcessingFailed: return JSONResponse(getRequest()).error( _('Error while processing Sablon template'), status=500).dump()
def _recursive_rename(self, obj): """Recursively rename object and its children. Children are renamed/moved postorder, i.e. children are renamed before their parents. This is important to avoid race-conditions with the move optimization from ftw.copymovepatches: - When moving multiple items plone dispatches the move event to children in an event handler. This event handler is registered earlier than the handler from `ftw.copymovepatches`. Thus it is called before the parent item is "moved" in the catalog by `ftw.copymovepatches`. - The optimization in `ftw.copymovepatches` trips up if one of the children somehow cause their parent to be reindexed while it is moved as the catalog then treats it as a new entry. """ # We update the docproperties only when renaming a document # not when renaming the containing dossiers if IBaseDocument.providedBy(obj): getRequest().set(DISABLE_DOCPROPERTY_UPDATE_FLAG, False) else: getRequest().set(DISABLE_DOCPROPERTY_UPDATE_FLAG, True) for child in obj.getFolderContents(): self._recursive_rename(child.getObject()) return api.content.rename(obj, new_id=self.get_new_id(obj))
def test_isolate_globalrequest(self): setRequest(self.layer['request']) with isolate_globalrequest(): self.assertIsNone(None, getRequest()) setRequest('bar') self.assertEquals(self.layer['request'], getRequest())
def removeFromYouTube(video): if not youtube: return api.portal.show_message( 'Whoops, trying to use YouTube but not configure correctly?', request=getRequest()) api.portal.show_message( 'Removing video from YouTube. Be patient.', request=getRequest()) _run(video, youtube.removeFromYouTube)
def interactive_users(context): yield ('responsible', translate(_(u'interactive_user_responsible', default=u'Responsible'), context=getRequest())) yield ('current_user', translate(_(u'interactive_user_current_user', default=u'Current user'), context=getRequest()))
def accept_task_with_successor(dossier, predecessor_oguid, response_text): predecessor = Task.query.by_oguid(predecessor_oguid) # Set the "X-CREATING-SUCCESSOR" flag for preventing the event handler # from creating additional responses per added document. getRequest().set('X-CREATING-SUCCESSOR', True) # Transport the original task (predecessor) to this dossier. The new # response and task change is not yet done and will be done later. This # is necessary for beeing as transaction aware as possible. transporter = Transporter() successor = transporter.transport_from( dossier, predecessor.admin_unit_id, predecessor.physical_path) successor_tc = ISuccessorTaskController(successor) # copy documents and map the intids doc_transporter = getUtility(ITaskDocumentsTransporter) comment = _(u'version_message_accept_task', default=u'Document copied from task (task accepted)') intids_mapping = doc_transporter.copy_documents_from_remote_task( predecessor, successor, comment=comment) # copy the responses response_transporter = IResponseTransporter(successor) response_transporter.get_responses(predecessor.admin_unit_id, predecessor.physical_path, intids_mapping=intids_mapping) # Move current responsible from predecessor task to successor center = notification_center() center.add_task_responsible(successor, successor.responsible) # First "accept" the successor task.. accept_task_with_response(successor, response_text) transaction.savepoint() response_text = response_text or '' request_data = {'text': response_text.encode('utf-8'), 'successor_oguid': successor_tc.get_oguid()} response = dispatch_request(predecessor.admin_unit_id, '@@accept_task_workflow_transition', path=predecessor.physical_path, data=request_data) response_body = response.read() if response_body.strip() != 'OK': raise TaskRemoteRequestError( 'Adding the response and changing the workflow state on the ' 'predecessor task failed.') # Connect the predecessor and the successor task. This needs to be done # that late for preventing a deadlock because of the locked tasks table. successor_tc.set_predecessor(predecessor_oguid) return successor
def render_tree(self): context_path = '/'.join(self.context.getPhysicalPath()) query_filter = { 'object_provides': ( IRepositoryFolder.__identifier__, IDossierMarker.__identifier__, ), 'blocked_local_roles': True, } dossier_container_brains = api.content.find( context=self.context, **query_filter) if dossier_container_brains: title = escape_html(translate( _( u'label_blocked_local_roles', default=u'Protected Objects', ), context=getRequest(), )) title_element = u''.join((u'<h1>', title, u'</h1>', )) tree = Treeify( dossier_container_brains, context_path, node_updater, ) # XXX - Preserving the reference number tree order. # Sorting here was easier than figuring out the treeifying. iterable_children = sorted( tree(self.context).get('children', ()), key=lambda child: child.get('title', ''), ) rendered_tree = self._build_html_tree(iterable_children) garnished_tree = ''.join(( title_element, rendered_tree, )) return garnished_tree title = escape_html(translate( _( u'label_no_blocked_local_roles', default=u'No protected objects were found within this scope.', ), context=getRequest(), )) title_element = u''.join((u'<h1>', title, u'</h1>', )) return title_element
def uploadToYouTube(video): if not youtube: return api.portal.show_message( 'Whoops, trying to use YouTube but not configure correctly?', request=getRequest()) api.portal.show_message( 'Uploading video to YouTube. Check YouTube for status. ' 'Be patient while YouTube processes.', request=getRequest()) _run(video, youtube.uploadToYouTube)
def queue_conversion(self): self.set_state(STATE_CONVERTING) IBumblebeeServiceV3(getRequest()).queue_conversion( self.document, PROCESSING_QUEUE, self.get_callback_url(), target_format='pdf/a') annotations = IAnnotations(getRequest()) if ARCHIVAL_FILE_CONVERSION_QUEUE_KEY not in annotations: annotations[ARCHIVAL_FILE_CONVERSION_QUEUE_KEY] = [] annotations[ARCHIVAL_FILE_CONVERSION_QUEUE_KEY].append(self.document_intid)
def interactive_users(): return { 'responsible': translate(_(u'interactive_user_responsible', default=u'Responsible'), context=getRequest()), 'current_user': translate(_(u'interactive_user_current_user', default=u'Current user'), context=getRequest()) }
def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return changes = self.applyChanges(data) if changes: api.portal.show_message(self.successMessage, getRequest()) else: api.portal.show_message(self.noChangesMessage, getRequest()) return self.request.RESPONSE.redirect(self.main_url)
def resourceDirectorySubDirectoriesSource(context): # Our context is portal root, because z3c.form would not work otherwise try: context = getRequest()['PUBLISHED'].form_instance.directory except AttributeError: # For InlineValidationView context = getRequest()['PUBLISHED'].context.form_instance.directory files = context.listDirectory() directories = [path for path in files if context.isDirectory(path)] return SimpleVocabulary(map(SimpleTerm, map(str, directories)))
def create(*args, **kwargs): request = getRequest() if request is not None: alsoProvides(request, IDuringContentCreation) result = original_create(*args, **kwargs) request = getRequest() if request is not None: noLongerProvides(request, IDuringContentCreation) return result
def _fixup(self): # due to compatibility reasons this method fixes data structure # for old Taxonomy instances. # XXX: remove this in version 2.0 to prevent write on read if self.order is None: safeWrite(self, getRequest()) self.order = PersistentDict() self.count = PersistentDict() if self.version is None: safeWrite(self, getRequest()) self.version = PersistentDict()
def createdEvent(obj, event): """ Subscriber to set language on the child folder It can be a - IObjectRemovedEvent - don't do anything - IObjectMovedEvent - IObjectAddedEvent - IObjectCopiedEvent """ if IObjectRemovedEvent.providedBy(event): return request = getattr(event.object, 'REQUEST', getRequest()) if not IPloneAppMultilingualInstalled.providedBy(request): return # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is # always equal to event.newParent. parent = aq_parent(event.object) # special parent handling if not ITranslatable.providedBy(parent): set_recursive_language(obj, LANGUAGE_INDEPENDENT) return # Normal use case # We set the tg, linking language = ILanguage(parent).get_language() set_recursive_language(obj, language) request = getattr(event.object, 'REQUEST', getRequest()) try: ti = request.translation_info except AttributeError: return # AT check portal = getSite() portal_factory = getToolByName(portal, 'portal_factory', None) if ( not IDexterityContent.providedBy(obj) and portal_factory is not None and not portal_factory.isTemporary(obj) ): return IMutableTG(obj).set(ti['tg']) modified(obj) tm = ITranslationManager(obj) old_obj = tm.get_translation(ti['source_language']) ILanguageIndependentFieldsManager(old_obj).copy_fields(obj)
def set(self, value): if value is None: return IStatusMessage(getRequest()).add( _('Password not updated, none was specified.'), type='error') try: mt = getToolByName(self.user, "portal_membership") except AttributeError: return IStatusMessage(getRequest()).add( _('Cannot change password for Zope users, only Plone'), type='error') else: mt.setPassword(value)
def get_agenda_item_attachment_filename(self, document, agenda_item_number, attachment_number): return normalize_path(u'{}/{}/{}_{}'.format( translate( _(u'title_agenda_item', default=u'Agenda item ${agenda_item_number}', mapping={u'number': agenda_item_number}), context=getRequest(), ), translate( _(u'attachments', default=u'Attachments'), context=getRequest(), ), str(attachment_number), safe_unicode(self.get_filename(document))) )
def as_internal_workflow_transition(): """This contextmanager allows to temporarily mark the request as an internal workflow transition request. Some transitions are only available when be triggered by code, for example the `planned to open` transition of tasks. """ try: # mark request with marker interface alsoProvides(getRequest(), IInternalWorkflowTransition) yield finally: # remove marker interface noLongerProvides(getRequest(), IInternalWorkflowTransition)
def _get_scaled_img(self, item, size): request = getRequest() if ( ICatalogBrain.providedBy(item) or IContentListingObject.providedBy(item) ): obj = item.getObject() else: obj = item info = {} if hasattr(obj, 'image'): scales = getMultiAdapter((obj, request), name='images') if size == 'small': scale = scales.scale('image', width=300, height=300) if size == 'medium': scale = scales.scale('image', width=600, height=600) if size == 'large': scale = scales.scale('image', width=900, height=900) else: scale = scales.scale('image', width=1200, height=1200) if scale is not None: info['url'] = scale.url info['width'] = scale.width info['height'] = scale.height else: info['url'] = IMG info['width'] = '1px' info['height'] = '1px' else: info['url'] = IMG info['width'] = '1px' info['height'] = '1px' return info
def combine(context): logger = context.getLogger("bundles") registry = queryUtility(IRegistry) if registry is None: logger.info("Cannot find registry") return body = context.readDataFile("registry.xml") if body and "IBundleRegistry" in body: # Calling combine_bundles will have as side effect that the # Content-Type header of the response is set to application/javascript, # which we do not want. So we reset it to the original at the end. site = context.getSite() request = getattr(site, "REQUEST", getRequest()) if request is not None: # Easily happens in tests. orig_header = request.response.getHeader("Content-Type") combine_bundles(site) if request is not None: new_header = request.response.getHeader("Content-Type") if new_header != orig_header: if orig_header is None: # Setting it to None would result in the string 'None'. # So pick a saner one. orig_header = "text/html" request.response.setHeader("Content-Type", orig_header)
def approve(self, key): if key not in self._data.keys(): raise KeyError(key) portal = getSite() registration = getToolByName(self, 'portal_registration') portal_props = getToolByName(self, 'portal_properties') mt = getToolByName(self, 'portal_membership') props = portal_props.site_properties use_email_as_login = props.getProperty('use_email_as_login') data = self._data[key] if use_email_as_login: data['username'] = data['email'] user_id = data['username'] password = registration.generatePassword() request = getRequest() try: registration.addMember(user_id, password, REQUEST=request) except (AttributeError, ValueError), err: logging.exception(err) IStatusMessage(request).addStatusMessage(err, type="error") return
def traverse(self, name, remaining): # in case its not a request get the default one req = getRequest() if 'PATH_INFO' not in req.environ: return super(PloneBundlesTraverser, self).traverse(name, remaining) resource_path = req.environ['PATH_INFO'].split('++plone++')[-1] resource_name, resource_filepath = resource_path.split('/', 1) # If we have additional traversers in the path we should not use them # in the file lookup more_traversal = (resource_filepath.startswith('++') or resource_filepath.startswith('@@')) if more_traversal: resource_filepath = resource_filepath.split('/')[-1] persistentDirectory = getUtility(IResourceDirectory, name="persistent") directory = None if OVERRIDE_RESOURCE_DIRECTORY_NAME in persistentDirectory: container = persistentDirectory[OVERRIDE_RESOURCE_DIRECTORY_NAME] if resource_name in container: directory = container[resource_name] if resource_filepath in directory: return directory return super(PloneBundlesTraverser, self).traverse(name, remaining)
def execute(self, obj, model, text=None, **kwargs): super(Cancel, self).execute(obj, model) model.cancel(text=text) msg = _(u'msg_proposal_cancelled', default=u'Proposal cancelled successfully.') api.portal.show_message(msg, request=getRequest(), type='info')
def key_value_provider(self): yield ('interactive_users', translate(_(u'client_interactive_users', default=u'Interactive users'), context=getRequest())) for e in ClientsVocabularyFactory.key_value_provider(self): yield e
def logged_in_handler(event): """ Listen to the event and perform the action accordingly. """ #user = event.object # check for came_from or next url .... # if empty go to dashboard otherwise to came_from request = getRequest() if request is None: # HTTP request is not present e.g. # when doing unit testing / calling scripts from command line return came_from = request.get('came_from', None) site_url = getSite().absolute_url() if came_from: if came_from.endswith('/'): # get rid of trailing slash for comparison came_from = came_from.rstrip('/') if came_from != site_url: # do nothing continue normal login redirect behaviour return # check if came_from is not empty, then clear it up, otherwise further # Plone scripts will override our redirect if came_from: request['came_from'] = '' request.form['came_from'] = '' # no redirect set, so go to dashboard request.RESPONSE.redirect('{0}/dashboard'.format(site_url))
def get_values_to_index(self): request = getRequest() items = super(FactsheetCataloguer, self).get_values_to_index() view = getMultiAdapter((self.context, request), name='view') contents = u'' for item in view.facts(): for fact in item.get('facts'): contents += getMultiAdapter( (fact.getObject(), request), name='factrenderview')() items['article[content]'] = contents targets = [] for target in (self.context.targets or []): targets.append(target) items['article[target_list]'] = u','.join(targets) actions = [] for action in (self.context.actions or []): actions.append(action) items['article[action_list]'] = u','.join(actions) tags = [] for tag in (self.context.cataloguetags or []): tagid, tagname = tag.split('-') tags.append(tagname) items['article[tag_list]'] = u','.join(tags) items['article[countries]'] = \ (self.context.fact_countryCode or '').strip() return items
def getFragmentSchemata(name): """Get matching XML schema for theme fragment""" request = getRequest() filename = (u'{0:s}.xml'.format(name)).encode('utf-8', 'ignore') if not isThemeEnabled(request): return SimpleVocabulary([]) currentTheme = getCurrentTheme() if currentTheme is None: return SimpleVocabulary([]) themeDirectory = queryResourceDirectory(THEME_RESOURCE_NAME, currentTheme) if themeDirectory is None: return SimpleVocabulary([]) if not themeDirectory.isDirectory(FRAGMENTS_DIRECTORY): return SimpleVocabulary([]) if not themeDirectory[FRAGMENTS_DIRECTORY].isFile(filename): return () handle = themeDirectory[FRAGMENTS_DIRECTORY].openFile(filename) schemata = parse(handle, 'collective.themefragments').schemata.values() for schema_ in schemata: schema_.__name__ = schema_.__name__.encode('utf-8', 'ignore') return schemata
def execute(self, obj, model, text=None, **kwargs): super(Reactivate, self).execute(obj, model) model.reactivate(text) msg = _(u'msg_proposal_reactivated', default=u'Proposal reactivated successfully.') api.portal.show_message(msg, request=getRequest(), type='info')
def safeWrite(obj, request=None): if request is None: request = getRequest() if request is None or getattr(request, 'environ', _default) is _default: # Request not found or it is a TestRequest without an environment. LOGGER.debug('could not mark object as a safe write') return if SAFE_WRITE_KEY not in request.environ: request.environ[SAFE_WRITE_KEY] = [] try: if obj._p_oid not in request.environ[SAFE_WRITE_KEY]: request.environ[SAFE_WRITE_KEY].append(obj._p_oid) except AttributeError: LOGGER.debug('object you attempted to mark safe does not have an oid')
def delete_integrity(context, event): request = getRequest() if request is not None: path = context.getPhysicalPath() for base in _ignorepaths(request): if tuple(path[:len(base)]) == base: # allow deletion of Plone site marked by before_site_delete() return used_by = InUseBy(context, request) if len(used_by) > 0: info = ILinkIntegrityInfo(request) for brain in used_by._brainmap.values(): info.addBreach(brain._unrestrictedGetObject(), context) raise LinkIntegrityNotificationException(context)
def f(*args, **kwargs): ret = fn(*args, **kwargs) l = Log() request = getRequest() l.usuario = str(request.other.get('AUTHENTICATED_USER', 'Anonymous')) l.url = request.other.get('ACTUAL_URL') l.modulo = fn.__module__ l.classe = args[0].__class__.__name__ l.funcao = fn.__name__ l.args = repr(list(args)[1:]) l.kwargs = repr(kwargs) session = Session() session.add(l) return ret
def credentialsChanged(self, user, name, pw, request=None): """ Updates cookie credentials if user details are changed. """ if request is None: request = getRequest() # BBB for Membershiptool reponse = request['RESPONSE'] # <patch> # We don't want new lines, so use base64.standard_b64encode instead of # base64.encodestring ac = standard_b64encode('%s:%s' % (name, pw)).rstrip() # </patch> method = self.getCookieMethod('setAuthCookie', self.defaultSetAuthCookie) method(reponse, self.auth_cookie, quote(ac))
def _sendMail(context, event): email = context.email subject = translate(_(u"Account validation"), context=getRequest()) if event.status['review_state'] == 'enabled': validated = True else: validated = False portal_url = getToolByName(context, 'portal_url') host = getToolByName(context, 'MailHost') from_email = host.email_from_address subject = Header(subject, 'utf-8').encode() mail_template = context.email_user_has_been_validated mail_text = mail_template(from_email=from_email, subject=subject, email=email, portal_url=portal_url(), validated=validated, request=getRequest()) try: host.send(mail_text.encode('utf8')) except: # @TODO pass
def get_filename(self): normalizer = getUtility(IIDNormalizer) period_title = normalizer.normalize(self.model.title) committee_title = normalizer.normalize(self.model.committee.title) return u"{}.docx".format( translate(_( u'filename_dossier_reference_number_toc', default=u'Dossier Reference Number Toc ${period} ${committee}', mapping={ 'period': period_title, 'committee': committee_title, }), context=getRequest()))
def _compute_fields_order(self, schema): """ Given a `schema` interface compute the field ordering the way `plone.autoform` does, i.e taking into account `plone.directives.form` ordering directives. Return: a list of field names in order. """ auto_fields = AutoFields() auto_fields.schema = schema auto_fields.request = getRequest() auto_fields.mode = INPUT_MODE auto_fields.updateFieldsFromSchemata() return auto_fields.fields
def create_event_event(obj, event): if IRegistration.providedBy(obj.aq_parent): parent = obj.aq_parent parent.setDefaultPage(obj.id) create_registration_form(parent) behavior = ISelectableConstrainTypes(parent) behavior.setConstrainTypesMode(1) behavior.setImmediatelyAddableTypes(("period", )) request = getattr(event.object, "REQUEST", getRequest()) link_translations(request, parent) url = obj.aq_parent.absolute_url() obj.REQUEST.RESPONSE.redirect(url)
def get_form_fieldsets(form): """ Get fieldsets from form """ fieldsets = [] form_fields = getattr(form, 'fields', {}) fields_values = list(form_fields.values()) if form_fields: fieldsets.append({ "id": "default", "title": translate("label_schema_default", default="Default", domain="plone", context=getRequest()), "fields": fields_values }) # Additional fieldsets (AKA z3c.form groups) for group in getattr(form, 'groups', []): fieldset = { "id": group.__name__, "title": translate(group.label, context=getRequest()), "fields": list(group.fields.values()), } fieldsets.append(fieldset) return fieldsets
def test_set(self): class FauxRequest(object): pass class FauxEvent(object): request = FauxRequest() event = FauxEvent() from ZPublisher.hooks import set_ set_(event) from zope.globalrequest import getRequest self.assertEqual(getRequest(), event.request)
def add(self, data): old_record = self.search(query={"email": data.get("email", "")}) if old_record: msg = translate( _( "address_already_registered", default=u"E-mail address already registered.", ), context=getRequest(), ) if six.PY2: msg = msg.encode("utf-8") raise ValueError(msg) return super(SubscriptionsStore, self).add(data=data)
def author_cache_key(m, i, author): """Cache key that discriminates on the user ID of the provided user (Plone user or string), and the hostname. The hostname is required because this cache key is used to cache generated URLs, which are dependent on the hostname that is used to access the system (might be localhost + SSH tunnel). """ hostname = get_hostname(getRequest()) if IPropertiedUser.providedBy(author) or IMemberData.providedBy(author): userid = author.getId() else: userid = author return (userid, hostname)
def __call__(self): mailhost = getToolByName(aq_inner(self.context), 'MailHost') if not mailhost: raise ComponentLookupError('You must have a Mailhost utility to \ execute this action') self.email_charset = self.mail_settings.email_charset obj = self.event.object interpolator = IStringInterpolator(obj) self.source = self.element.source if self.source: self.source = interpolator(self.source).strip() if not self.source: # no source provided, looking for the site wide from email # address from_address = self.mail_settings.email_from_address if not from_address: # the mail can't be sent. Try to inform the user request = getRequest() if request: messages = IStatusMessage(request) msg = _(u'Error sending email from content rule. You must ' 'provide a source address for mail ' 'actions or enter an email in the portal properties') messages.add(msg, type=u'error') return False from_name = self.mail_settings.email_from_name.strip('"') self.source = '%s <%s>' % (from_name, from_address) self.recipients = self.get_recipients() # prepend interpolated message with \n to avoid interpretation # of first line as header self.message = '\n%s' % interpolator(self.element.message) self.subject = interpolator(self.element.subject) mime_msg = self.create_mime_msg() if not mime_msg: return False # Finally send mail. # Plone-4 mailhost.send(mime_msg) return True
def _schedule_flush(self): """A fallback queue flusher that runs without user interactions""" if not MAX_QUEUE_AGE > 0: return try: # non-persisted, absent on first request self._v_timer except AttributeError: # initialize on first request self._v_timer = None if self._v_timer is not None: # timer already running return # only a one-second granularity, round upwards timeout = int(math.ceil(float(MAX_QUEUE_AGE) / 1000)) # Get the global request, # we just need to copy over some environment stuff. request = getRequest() request_environ = {} site = getSite() # We do not use plone.api here because we cannot assume # that site == plone portal. # It could also be a directory under it if site: site_path = '/'.join(site.getPhysicalPath()) if request is None: # If we fail getting a request, # we might still have it in portal request = getattr(site, 'REQUEST', None) else: # This situation can happen in tests. logger.warning("Could not get the site") site_path = None if request is not None: request_environ = { 'SERVER_NAME': request.SERVER_NAME, 'SERVER_PORT': request.SERVER_PORT, 'REQUEST_METHOD': request.REQUEST_METHOD } with LOCK: # logger.info("Setting timer") self._v_timer = threading.Timer( timeout, self._scheduled_autoflush, kwargs={'site_path': site_path, 'environ': request_environ} ) self._v_timer.start()
def get_deadline_label(self, fmt="medium"): if not self.deadline: return u'' if self.is_overdue: label = u'<span class="task-overdue">{}</span>' else: label = u'<span>{}</span>' formatter = getRequest().locale.dates.getFormatter("date", fmt) formatted_date = formatter.format(self.deadline) return label.format(formatted_date.strip())
def populate_dexterity(obj, data): request = getRequest() for schema in get_dexterity_schemas(context=obj): for name in getFieldNames(schema): field = schema[name] if getattr(field, 'readonly', False): continue autoform_widgets = schema.queryTaggedValue(WIDGETS_KEY, default={}) if name in autoform_widgets: try: widgetclass = utils.resolveDottedName( autoform_widgets[name]) except AttributeError: # XXX: Investigate: # AttributeError: 'ParameterizedWidget' object has no # attribute 'split' continue widget = widgetclass(field, request) else: widget = component.getMultiAdapter((field, request), IFieldWidget) widget.context = obj widget.ignoreRequest = True widget.update() if HAS_RECURRENCE_WIDGET and IRecurrenceWidget.providedBy(widget): # We cannot yet deal with the recurrence widget continue if name == 'title': value = unicode(data['title']) else: value = widget.value if not value or value in [NOT_CHANGED, NO_VALUE] or \ not IDataConverter(widget).toFieldValue(value): value = get_dummy_dexterity_value(obj, widget, data) if value is None: continue if interfaces.ICollection.providedBy(widget.field) or \ interfaces.IChoice.providedBy(widget.field): value = [value] if value: dm = component.getMultiAdapter((obj, field), IDataManager) try: dm.set(IDataConverter(widget).toFieldValue(value)) except TypeError: dm.set(value)
def get_jsonschema_for_fti(fti, context, request, excluded_fields=None): """Build a complete JSON schema for the given FTI. """ if excluded_fields is None: excluded_fields = [] # We try..except lookupSchema here, so we still get FTI information # through /@types/{typeid} for non-DX type, notably the "Plone Site" type. try: schema = fti.lookupSchema() except AttributeError: schema = None fieldsets = () additional_schemata = () else: additional_schemata = tuple(getAdditionalSchemata(portal_type=fti.id)) fieldsets = get_fieldsets(context, request, schema, additional_schemata) # Mangle the properties a bit to add widgets hints schemas = (schema, ) + additional_schemata # Build JSON schema properties properties = get_jsonschema_properties(context, request, fieldsets, excluded_fields=excluded_fields, tagged_values=get_tagged_values( schemas, WIDGETS_KEY)) # Determine required fields required = [] for field in iter_fields(fieldsets): if field.field.required: required.append(field.field.getName()) # Include field modes for field in iter_fields(fieldsets): if field.mode: properties[field.field.getName()]['mode'] = field.mode return { 'type': 'object', 'title': translate(fti.Title(), context=getRequest()), 'properties': json_compatible(properties), 'required': required, 'fieldsets': get_fieldset_infos(fieldsets), 'layouts': getattr(fti, 'view_methods', []), }
def get_relateditems_options(context, value, separator, vocabulary_name, vocabulary_view, field_name=None): if IForm.providedBy(context): context = context.context request = getRequest() site = get_top_site_from_url(context, request) options = get_ajaxselect_options(site, value, separator, vocabulary_name, vocabulary_view, field_name) nav_root = getNavigationRootObject(context, site) # basePath - start to search/browse in here. base_path_context = context if not IFolder.providedBy(base_path_context): base_path_context = aq_parent(base_path_context) if not base_path_context: base_path_context = nav_root options['basePath'] = '/'.join(base_path_context.getPhysicalPath()) # rootPath - Only display breadcrumb elements deeper than this path. options['rootPath'] = '/'.join(site.getPhysicalPath()) if site else '/' # rootUrl: Visible URL up to the rootPath. This is prepended to the # currentPath to generate submission URLs. options['rootUrl'] = site.absolute_url() if site else '' # contextPath - current edited object. Will not be available to select. options['contextPath'] = '/'.join(context.getPhysicalPath()) if base_path_context != nav_root: options['favorites'] = [ { # 'title': _(u'Current Content'), 'title': u'Aktueller Inhalt', 'path': '/'.join(base_path_context.getPhysicalPath()) }, { 'title': _(u'Start Page'), 'path': '/'.join(nav_root.getPhysicalPath()) } ] return options
def getUser(request=None): if request is None: request = getRequest() site = getSite() try: portal_membership = getToolByName(site, 'portal_membership') user = portal_membership.getAuthenticatedMember() username = user.getUserName() except AttributeError: user = request and request.other.get('AUTHENTICATED_USER') or None if user is not None: username = user.getUserName() else: username = '******' return username
def current_url(self): """ complete url from current request return yarl.URL""" request = getRequest() if request is None: # fallback request = api.portal.get().REQUEST base_url = URL(request.getURL()) if request.get("QUERY_STRING", None): url = base_url.with_query(request.get("QUERY_STRING", None)) else: url = base_url return url
def _unrestrictedGetObject(self): """Return the object for this record Same as getObject, but does not do security checks. """ parent = aq_parent(self) if (aq_get(parent, 'REQUEST', None) is None and _GLOBALREQUEST_INSTALLED and _REQUESTCONTAINER_EXISTS): request = getRequest() if request is not None: # path should be absolute, starting at the physical root parent = self.getPhysicalRoot() request_container = RequestContainer(REQUEST=request) parent = aq_base(parent).__of__(request_container) return parent.unrestrictedTraverse(self.getPath())
def getAbsolutePaths(self): root = self._getRoot() if root is None: return request = getRequest() if request is None: return for name, pathProvider in getAdapters((root, ), IPurgePaths): # add absoute paths, which are not absolutePaths = pathProvider.getAbsolutePaths() if absolutePaths: for absolutePath in absolutePaths: yield absolutePath
def logout(self, response=None): """ Logs out the user """ target = None if response is None: response = getRequest()['RESPONSE'] # BBB for App.Management atool = getUtility(IActionsTool) target = atool.getActionInfo('user/logout')['url'] method = self.getCookieMethod('expireAuthCookie', self.defaultExpireAuthCookie) method(response, cookie_name=self.auth_cookie) # BBB for App.Management if target is not None: response.redirect(target)
def redirect_to_personal_preferences(): site = getSite() request = getRequest() messages = IStatusMessage(request) messages.add( u"Please complete your profile by adding your Professional " + "thematic domain.", type=u"info") if request.get('came_from', None): request['came_from'] = '' request.form['came_from'] = '' edit_profile_url = site.portal_url() + '/@@personal-preferences' request.RESPONSE.redirect(edit_profile_url)
def queuePurge(event): """Find URLs to purge and queue them for later """ request = getRequest() if request is None: return annotations = IAnnotations(request, None) if annotations is None: return if not isCachePurgingEnabled(): return paths = annotations.setdefault(KEY, set()) paths.update(getPathsToPurge(event.object, request))
def events_enable(request=None): """Re-enable event-driven preview generation for this request. This only makes sense if you explicitly disabled preview generation, since it is enabled by default. :param request: The request for which events were disabled :type request: Request """ if not request: request = getRequest() if not request: logger.error("No request available, cannot toggle event handling.") return for event_key in event_keys: request[event_key] = True
def execute(self): document = Oguid.resolve_object(self.generated_document.oguid) document.file.data = self.generate_file_data() repository = api.portal.get_tool('portal_repository') comment = translate(_( u'Updated with a newer generated version from meeting ${title}.', mapping=dict(title=self.meeting.get_title())), context=getRequest()) repository.save(obj=document, comment=comment) new_version = document.get_current_version() self.generated_document.generated_version = new_version return document
def _unrestrictedGetObject(self): parent = aq_parent(self) if (aq_get(parent, 'REQUEST', None) is None and _GLOBALREQUEST_INSTALLED and _REQUESTCONTAINER_EXISTS): request = getRequest() if request is not None: # path should be absolute, starting at the physical root parent = self.getPhysicalRoot() request_container = RequestContainer(REQUEST=request) parent = aq_base(parent).__of__(request_container) try: return parent.unrestrictedTraverse(self.getPath()) except: connection = getUtility(ISQLConnectionsUtility, name=self.portal_type) return connection.getVirtualItem(self.sql_id, context=parent)
def migrate_pst_action_fields(self): for brain in self.pc(portal_type="pstaction"): action = brain.getObject() action.manager = [ m[:-13] for m in action.manager if m.endswith('_actioneditor') ] if base_hasattr(action, 'work_plan') and action.work_plan: title = translate(_( "Work plan: ${action_title}", mapping={'action_title': safe_unicode(action.Title())}), context=getRequest()) task = api.content.create(container=action, title=title, type='task') task.task_description = action.work_plan.raw
def _get_mapping(self, es): request = getRequest() mapping = getattr(request, CACHE_ATTRIBUTE, None) if mapping is not None: return mapping try: mapping = es.indices.get_mapping(index=index_name()) except TransportError as e: if e.status_code == 404: self._create_index(es) mapping = es.indices.get_mapping(index=index_name()) else: raise setattr(request, CACHE_ATTRIBUTE, mapping) return mapping