Esempio n. 1
0
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
Esempio n. 3
0
    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()
Esempio n. 4
0
    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())
Esempio n. 6
0
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)
Esempio n. 7
0
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()))
Esempio n. 8
0
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
Esempio n. 9
0
    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
Esempio n. 10
0
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)
Esempio n. 11
0
    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)
Esempio n. 12
0
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())
    }
Esempio n. 13
0
 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)))
Esempio n. 15
0
        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
Esempio n. 16
0
    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)
Esempio n. 18
0
    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)
Esempio n. 19
0
 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)))
     )
Esempio n. 20
0
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)
Esempio n. 21
0
 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
Esempio n. 22
0
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
Esempio n. 24
0
    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)
Esempio n. 25
0
    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')
Esempio n. 26
0
 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
Esempio n. 27
0
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))
Esempio n. 28
0
    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
Esempio n. 29
0
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
Esempio n. 30
0
    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')
Esempio n. 31
0
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')
Esempio n. 32
0
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)
Esempio n. 33
0
 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
Esempio n. 34
0
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))
Esempio n. 35
0
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
Esempio n. 36
0
    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
Esempio n. 38
0
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)
Esempio n. 39
0
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
Esempio n. 40
0
    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)
Esempio n. 41
0
 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)
Esempio n. 42
0
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)
Esempio n. 43
0
    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
Esempio n. 44
0
    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()
Esempio n. 45
0
    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)
Esempio n. 47
0
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', []),
    }
Esempio n. 48
0
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
Esempio n. 49
0
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
Esempio n. 50
0
    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
Esempio n. 51
0
    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())
Esempio n. 52
0
    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
Esempio n. 53
0
 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)
Esempio n. 54
0
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)
Esempio n. 55
0
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))
Esempio n. 56
0
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
Esempio n. 57
0
    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)
Esempio n. 59
0
 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
Esempio n. 60
0
 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