Example #1
0
 def schema(self):
     language = negotiate(context=self.request) or u''
     return load_schema(
         aq_base(self.context).schema,
         language=language,
         cache_key=aq_base(self.context).schema_digest,
     )
Example #2
0
 def getContent(self):
     language = negotiate(context=self.request) or u''
     context_language = get_navigation_root_language(self.context)
     if context_language.startswith(language):
         return self.context
     else:
         proxy = LanguageFieldsProxy(self.context)
         proxy._language = language
         return proxy
Example #3
0
 def __init__(self, context, request, content):
     language = negotiate(context=request) or u''
     self.content = content
     self.schema = load_schema(
         aq_base(content).schema,
         language=language,
         cache_key=aq_base(content).schema_digest,
     )
     super(SubmissionView, self).__init__(context, request)
Example #4
0
    def _createFolderStructure(self, folder, structure='ymd', date=None):
        """ Create a folder structure and then return our innermost folder
        """
        if not date:
            date = DateTime()

        dateFormat = structure

        if '%B' in dateFormat:
            translation = getToolByName(self.context, 'translation_service')
            PLMF = MessageFactory('plonelocales')
            dateFormat = dateFormat.replace('%B', '%m')
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]
            index = dateFormat.split('/').index('%m')
            month_msgid = PLMF(translation.month_msgid(folderStructure[index]))
            try:
                target_language = i18n.negotiate(self.context.REQUEST)
            except:
                target_language = None
            transale_month = translate(month_msgid,
                                       target_language=target_language)
            folderStructure[index] = transale_month
        else:
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]

        container = self.element.container
        language = folder.Language()
        normalizer = getUtility(IIDNormalizer)

        portal_workflow = getToolByName(self.context, 'portal_workflow')
        pw = portal_workflow.doActionFor

        # We run IRuleExecutor here to make sure other rules will be
        # executed for the newly created folders
        executor = IRuleExecutor(self.context, None)
        for fId in folderStructure:
            fTitle = fId
            fId = normalizer.normalize(fId)
            if not fId in folder.objectIds():
                _createObjectByType(container,
                                    folder,
                                    id=normalizer.normalize(fId),
                                    title=fTitle,
                                    description=fTitle)
                folder = folder[fId]
                pw(folder, 'publish')
                # this makes happy multilang sites
                folder.setLanguage(language)
                event = ObjectAddedEvent(folder, aq_parent(folder), fId)
                if executor is not None:
                    executor(event)
            else:
                folder = folder[fId]
        return folder
Example #5
0
 def __init__(self, context, request):
     super(SubFlowSubmitForm, self).__init__(context, request)
     language = negotiate(context=request) or u''
     context_language = get_navigation_root_language(self.context)
     if context_language.startswith(language or context_language):
         self.localized_context = context
     else:
         proxy = LanguageFieldsProxy(self.context)
         proxy._language = language
         self.localized_context = proxy
Example #6
0
 def __init__(self, context, request):
     super(SubmissionEditForm, self).__init__(context, request)
     language = negotiate(context=request) or u''
     context_language = get_navigation_root_language(self.context)
     if context_language.startswith(language or context_language):
         self._locale_postfix = ''
     else:
         self._locale_postfix = '_' + language
     self.buttons = button.Buttons()
     self.handlers = button.Handlers()
Example #7
0
def save_schema_from_schema_context(schema_context, event=None):
    assert event
    language = negotiate(context=getRequest()) or u''
    context_language = get_navigation_root_language(schema_context.content)
    save_schema(
        schema_context.content,
        schema=schema_context.schema,
        language=not context_language.startswith(language or context_language)
        and language or u'',
    )
Example #8
0
 def default_fieldset_label(self):
     language = negotiate(context=self.request) or u''
     try:
         try:
             return getattr(
                 self.context,
                 DEFAULT_FIELDSET_LABEL_FIELD + '_' + language,
             )
         except AttributeError:
             return getattr(self.context, DEFAULT_FIELDSET_LABEL_FIELD)
     except AttributeError:
         return _(u'Form')
Example #9
0
 def schema(self):
     language = negotiate(context=self.request) or u''
     try:
         return load_schema(
             aq_base(self.context).schema,
             language=language,
             cache_key=aq_base(self.context).schema_digest,
         )
     except AttributeError:
         self.request.response.redirect(
             '{0:s}/@@design'.format(self.context.absolute_url()), )
         return load_schema(DEFAULT_SCHEMA, cache_key=None)
    def _createFolderStructure(self, folder, structure='ymd', date=None):
        """ Create a folder structure and then return our innermost folder
        """
        if not date:
            date = DateTime()

        dateFormat = structure

        if '%B' in dateFormat:
            translation = getToolByName(self.context, 'translation_service')
            PLMF = MessageFactory('plonelocales')
            dateFormat = dateFormat.replace('%B', '%m')
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]
            index = dateFormat.split('/').index('%m')
            month_msgid = PLMF(translation.month_msgid(folderStructure[index]))
            try:
                target_language = i18n.negotiate(self.context.REQUEST)
            except:
                target_language = None
            transale_month = translate(month_msgid, target_language=target_language)
            folderStructure[index] = transale_month
        else:
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]

        container = self.element.container
        language = folder.Language()
        normalizer = getUtility(IIDNormalizer)

        portal_workflow = getToolByName(self.context, 'portal_workflow')
        pw = portal_workflow.doActionFor

        # We run IRuleExecutor here to make sure other rules will be
        # executed for the newly created folders
        executor = IRuleExecutor(self.context, None)
        for fId in folderStructure:
            fTitle = fId
            fId = normalizer.normalize(fId)
            if not fId in folder.objectIds():
                _createObjectByType(container, folder, id=normalizer.normalize(fId),
                                    title=fTitle, description=fTitle)
                folder = folder[fId]
                pw(folder, 'publish')
                # this makes happy multilang sites
                folder.setLanguage(language)
                event = ObjectAddedEvent(folder, aq_parent(folder), fId)
                if executor is not None:
                    executor(event)
            else:
                folder = folder[fId]
        return folder
Example #11
0
 def default_fieldset_label(self):
     language = negotiate(context=self.request) or u''
     try:
         try:
             return self.context.aq_explicit.aq_acquire(
                 DEFAULT_FIELDSET_LABEL_FIELD + '_' + language,
             )
         except AttributeError:
             return self.context.aq_explicit.aq_acquire(
                 DEFAULT_FIELDSET_LABEL_FIELD,
             )
     except AttributeError:
         return _(u'Form')
Example #12
0
 def schema(self):
     try:
         language = negotiate(context=self.request) or u''
         schema = load_schema(
             aq_base(self.context).schema,
             name='@@impersonate',
             language=language,
             cache_key=aq_base(self.context).schema_digest,
         )
         alsoProvides(schema, IImpersonateFlowSchemaDynamic)
         return schema
     except (AttributeError, KeyError):
         return IFlowImpersonation
Example #13
0
 def __init__(self, context, request):
     super(FlowSubmitForm, self).__init__(context, request)
     language = negotiate(context=self.request) or u''
     context_language = get_navigation_root_language(self.context)
     if context_language.startswith(language or context_language):
         self.localized_context = context
     else:
         proxy = LanguageFieldsProxy(self.context)
         proxy._language = language
         self.localized_context = proxy
     self.buttons = button.Buttons()
     self.handlers = button.Handlers()
     if 'disable_border' in self.request.form:
         del self.request.form['disable_border']
Example #14
0
 def __init__(self, context, request):
     language = negotiate(context=request) or u''
     try:
         schema = load_schema(
             aq_base(context).schema,
             language=language,
             cache_key=None,
         )
     except AttributeError:
         schema = load_schema(DEFAULT_SCHEMA, cache_key=None)
     super(FlowSchemaContext, self).__init__(
         schema,
         request,
         name='@@{0:s}'.format(self.__name__),
         title=_(u'design'),
     )
     self.content = context
Example #15
0
    def render(self, target_language=None, **context):
        # We always include a ``request`` variable; it is (currently)
        # depended on in various expression types and must be defined
        request = context.setdefault("request", None)

        if target_language is None:
            try:
                target_language = i18n.negotiate(request)
            except Exception:
                target_language = None

        context["target_language"] = target_language

        # bind translation-method to request
        def translate(
            msgid,
            domain=None,
            mapping=None,
            target_language=None,
            default=None,
            context=None,
        ):
            if msgid is MV:
                # Special case handling of Zope2's Missing.MV
                # (Missing.Value) used by the ZCatalog but is
                # unhashable.

                # This case cannot arise in ordinary templates; msgid
                # comes from i18n:translate attributes, which does not
                # take a TALES expression, just a literal string.
                # However, the 'context' argument is available as an
                # implementation detail for macros
                return
            return fast_translate(msgid, domain, mapping, request,
                                  target_language, default)

        context["translate"] = translate

        if request is not None and not isinstance(request, six.string_types):
            content_type = self.content_type or "text/html"
            response = request.response
            if response and not response.getHeader("Content-Type"):
                response.setHeader("Content-Type", content_type)

        base_renderer = super(BaseTemplate, self).render
        return base_renderer(**context)
Example #16
0
def get_submission_title(form, submission):
    language = negotiate(context=getRequest()) or u''
    try:
        try:
            template = submission.aq_explicit.aq_acquire(
                SUBMISSION_TITLE_TEMPLATE_FIELD + '_' + language, )
        except AttributeError:
            template = submission.aq_explicit.aq_acquire(
                SUBMISSION_TITLE_TEMPLATE_FIELD, )
        return datetime.utcnow().strftime(
            interpolate(template, submission).encode('utf-8',
                                                     'ignore'), ).decode(
                                                         'utf-8', 'ignore')
    except AttributeError:
        return u'{0:s} {1:s}'.format(
            form.title,
            datetime.utcnow().strftime('%Y-%#m-%#d'),
        )
Example #17
0
def fixed_language(language, request=None):
    """Context manager for forcing the current language by temporarily
    replacing the global language negotiator with a fixed language negotiator
    """
    if request is None:
        request = getRequest()
    current_language = negotiate(context=request) or u''
    if current_language != language:
        original = queryUtility(INegotiator)
        if original is not None:
            gsm = getGlobalSiteManager()
            replacement = FixedNegotiator(language)
            gsm.registerUtility(replacement, provided=INegotiator)
            try:
                yield
            finally:
                gsm.unregisterUtility(replacement, provided=INegotiator)
                gsm.registerUtility(original, provided=INegotiator)
        else:
            yield
    else:
        yield
Example #18
0
    def render(self, target_language=None, **context):
        # We always include a ``request`` variable; it is (currently)
        # depended on in various expression types and must be defined
        request = context.setdefault('request', None)

        if target_language is None:
            try:
                target_language = i18n.negotiate(request)
            except:
                target_language = None

        context['target_language'] = target_language

        # bind translation-method to request
        def translate(msgid,
                      domain=None,
                      mapping=None,
                      target_language=None,
                      default=None,
                      context=None):
            if msgid is MV:
                # Special case handling of Zope2's Missing.MV
                # (Missing.Value) used by the ZCatalog but is
                # unhashable
                return
            return fast_translate(msgid, domain, mapping, request,
                                  target_language, default)

        context["translate"] = translate

        if request is not None and not isinstance(request, six.string_types):
            content_type = self.content_type or 'text/html'
            response = request.response
            if response and not response.getHeader("Content-Type"):
                response.setHeader("Content-Type", content_type)

        base_renderer = super(BaseTemplate, self).render
        return base_renderer(**context)
Example #19
0
 def schema(self):
     language = negotiate(context=self.request) or u''
     try:
         try:
             schema = load_schema(
                 aq_base(self.context).schema,
                 name='++add++',
                 language=language,
                 cache_key=aq_base(self.context).schema_digest,
             )
             alsoProvides(schema, IAddFlowSchemaDynamic)
             return schema
         except KeyError:
             schema = aq_base(self.context).schema.replace(
                 'flow.AuthorPortalContent',
                 'zope2.View',
             )
             key = hashlib.md5(schema).hexdigest()
             return load_schema(schema, language=language, cache_key=key)
     except AttributeError:
         self.request.response.redirect(
             u'{0}/@@design'.format(self.context.absolute_url()), )
         return load_schema(DEFAULT_SCHEMA, cache_key=None)
Example #20
0
    def render(self, target_language=None, **context):
        # We always include a ``request`` variable; it is (currently)
        # depended on in various expression types and must be defined
        request = context.setdefault('request', None)

        if target_language is None:
            try:
                target_language = i18n.negotiate(request)
            except:
                target_language = None

        context['target_language'] = target_language

        # bind translation-method to request
        def translate(
            msgid, domain=None, mapping=None,
            target_language=None, default=None,
            context=None):
            if msgid is MV:
                # Special case handling of Zope2's Missing.MV
                # (Missing.Value) used by the ZCatalog but is
                # unhashable
                return
            return fast_translate(
                msgid, domain, mapping, request, target_language, default)
        context["translate"] = translate

        if request is not None and not isinstance(request, six.string_types):
            content_type = self.content_type or 'text/html'
            response = request.response
            if response and not response.getHeader("Content-Type"):
                response.setHeader(
                    "Content-Type", content_type)

        base_renderer = super(BaseTemplate, self).render
        return base_renderer(**context)
Example #21
0
def translate(
        msgid, domain=None, mapping=None, context=None, target_language=None,
        default=None, plural=None, n=None):
    """Translate text.

    First setup some test components:

    >>> from zope import component, interface
    >>> import zope.i18n.interfaces

    >>> class TestDomain:
    ...     interface.implements(zope.i18n.interfaces.ITranslationDomain)  # noqa
    ...
    ...     def __init__(self, **catalog):
    ...         self.catalog = catalog
    ...
    ...     def translate(self, text, *_, **__):
    ...         return self.catalog[text]

    Normally, the translation system will use a domain utility:

    >>> component.provideUtility(TestDomain(eek=u'ook'), name='my.domain')
    >>> translate(u'eek', 'my.domain')
    u'ook'

    Normally, if no domain is given, or if there is no domain utility
    for the given domain, then the text isn't translated:

    >>> translate(u'eek')
    u'eek'

    Moreover the text will be converted to unicode:

    >>> translate('eek', 'your.domain')
    u'eek'

    A fallback domain factory can be provided. This is normally used
    for testing:

    >>> def fallback(domain=u''):
    ...     return TestDomain(eek=u'test-from-' + domain)
    >>> interface.directlyProvides(  # noqa
    ...     fallback,
    ...     zope.i18n.interfaces.IFallbackTranslationDomainFactory,
    ...     )

    >>> component.provideUtility(fallback)

    >>> translate(u'eek')
    u'test-from-'

    >>> translate(u'eek', 'your.domain')
    u'test-from-your.domain'
    """
    if isinstance(msgid, Message):
        domain = msgid.domain
        default = msgid.default
        if mapping is None:
            mapping = msgid.mapping

    if default is None:
        default = unicode(msgid)

    if domain:
        util = queryUtility(ITranslationDomain, domain)
        if util is None:
            util = queryUtility(IFallbackTranslationDomainFactory)
            if util is not None:
                util = util(domain)
    else:
        util = queryUtility(IFallbackTranslationDomainFactory)
        if util is not None:
            util = util()

    if util is None:
        return interpolate(default, mapping)

    if target_language is None and context is not None:
        target_language = negotiate(context)

    return util.translate(
        msgid, mapping, context, target_language, default, plural, n,
    )
Example #22
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        settings = IFeedSettings(self.context)
        api_key = settings.mailchimp_api_key
        next_url = self.nextURL()

        try:
            list_id = (
                data.pop('list_id', None) or
                self.getContent().mailinglist
            )
            try:
                name = data.pop('name')
            except KeyError:
                name = ''
            email = data.pop('email')
            interests = data.pop('interests')

            content = self.getContent()

            preselected = getattr(content, 'preselected_interest_groups', None)
            if preselected:
                if not interests:
                    interests = preselected
                else:
                    interests = interests + preselected

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                # Negotiate language
                language = negotiate(self.request)

                # Split full name into first (given) and last name.
                try:
                    fname, lname = queryUtility(
                        INameSplitter, name=language,
                        default=GenericNameSplitter
                        ).split_name(name)
                except AttributeError:
                    fname, lname = u'', u''

                # Log subscription attempt.
                logger.info(("listSubscribe(%r, %r, %r, %r)" % (
                    list_id, email, fname, lname)).encode('utf-8'))

                merge_vars = {
                    'FNAME': fname.encode('utf-8'),
                    'LNAME': lname.encode('utf-8'),
                    'GROUPINGS': [
                        dict(
                            id=grouping_id,
                            groups=",".join(
                                group.
                                encode('utf-8').
                                replace(',', '\\,')
                                for group in group_names
                            ),
                        )
                        for (grouping_id, group_names) in
                        create_groupings(interests).items()
                    ]
                }

                for name, value in data.items():
                    if value is not None:
                        merge_vars[name.upper()] = value.encode('utf-8')

                try:
                    result = api(
                        method="listSubscribe", id=list_id,
                        email_address=email,
                        update_existing=True,
                        replace_interests=False,
                        merge_vars=merge_vars
                    )
                except greatape.MailChimpError, exc:
                    logger.warn(exc.msg)

                    # ... is not a valid interest grouping id for the list
                    if exc.code == 270:
                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"There was a problem signing you up for "
                              u"the selected interest groups. This could "
                              u"mean that the subscription service is "
                              u"configured incorrectly. Please contact "
                              u"the webmaster."),
                            "error",
                        )
                else:
                    if result:
                        next_url += ('?' in next_url
                                     and '&' or '?') + 'success=yes'

                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"Thank you for signing up. We'll send you a "
                              u"confirmation message by e-mail shortly."),
                            "info"
                        )

            IStatusMessage(self.request).addStatusMessage(
                _(u"An error occurred while processing your "
                  u"request to sign up for ${email}. "
                  u"Please try again!", mapping={'email': email}),
                "error")
Example #23
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        settings = IFeedSettings(self.context)
        api_key = settings.mailchimp_api_key
        next_url = self.nextURL()

        try:
            list_id = (data.pop('list_id', None)
                       or self.getContent().mailinglist)
            try:
                name = data.pop('name')
            except KeyError:
                name = ''
            email = data.pop('email')
            interests = data.pop('interests')

            content = self.getContent()

            preselected = getattr(content, 'preselected_interest_groups', None)
            if preselected:
                if not interests:
                    interests = preselected
                else:
                    interests = interests + preselected

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                # Negotiate language
                language = negotiate(self.request)

                # Split full name into first (given) and last name.
                try:
                    fname, lname = queryUtility(
                        INameSplitter,
                        name=language,
                        default=GenericNameSplitter).split_name(name)
                except AttributeError:
                    fname, lname = u'', u''

                # Log subscription attempt.
                logger.info(("listSubscribe(%r, %r, %r, %r)" %
                             (list_id, email, fname, lname)).encode('utf-8'))

                merge_vars = {
                    'FNAME':
                    fname.encode('utf-8'),
                    'LNAME':
                    lname.encode('utf-8'),
                    'GROUPINGS': [
                        dict(
                            id=grouping_id,
                            groups=",".join(
                                group.encode('utf-8').replace(',', '\\,')
                                for group in group_names),
                        ) for (grouping_id, group_names
                               ) in create_groupings(interests).items()
                    ]
                }

                for name, value in data.items():
                    if value is not None:
                        merge_vars[name.upper()] = value.encode('utf-8')

                try:
                    result = api(method="listSubscribe",
                                 id=list_id,
                                 email_address=email,
                                 update_existing=True,
                                 replace_interests=False,
                                 merge_vars=merge_vars)
                except greatape.MailChimpError, exc:
                    logger.warn(exc.msg)

                    # ... is not a valid interest grouping id for the list
                    if exc.code == 270:
                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"There was a problem signing you up for "
                              u"the selected interest groups. This could "
                              u"mean that the subscription service is "
                              u"configured incorrectly. Please contact "
                              u"the webmaster."),
                            "error",
                        )
                else:
                    if result:
                        next_url += ('?' in next_url and '&'
                                     or '?') + 'success=yes'

                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"Thank you for signing up. We'll send you a "
                              u"confirmation message by e-mail shortly."),
                            "info")

            IStatusMessage(self.request).addStatusMessage(
                _(
                    u"An error occurred while processing your "
                    u"request to sign up for ${email}. "
                    u"Please try again!",
                    mapping={'email': email}), "error")
Example #24
0
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        settings = IFeedSettings(self.context)
        api_key = settings.mailchimp_api_key

        try:
            list_id = self.context.mailinglist

            email = data['email']
            name = data['name']
            interests = data['interests']

            if api_key:
                api = greatape.MailChimp(api_key, debug=False)

                # Negotiate language
                language = negotiate(self.request)

                # Split full name into first (given) and last name.
                fname, lname = queryUtility(
                    INameSplitter, name=language, default=GenericNameSplitter
                    ).split_name(name)

                try:
                    result = api(
                        method="listSubscribe", id=list_id,
                        email_address=email,
                        update_existing=True,
                        replace_interests=False,
                        merge_vars={
                            'FNAME': fname.encode('utf-8'),
                            'LNAME': lname.encode('utf-8'),
                            'GROUPINGS': [
                                dict(
                                    id=grouping_id,
                                    groups=",".join(
                                        group.\
                                        encode('utf-8').\
                                        replace(',', '\\,')
                                        for group in group_names
                                        ),
                                    )
                                for (grouping_id, group_names) in
                                create_groupings(interests).items()
                                ]
                            },
                        )
                except greatape.MailChimpError, exc:
                    logger.warn(exc.msg)
                else:
                    if result:
                        return IStatusMessage(self.request).addStatusMessage(
                            _(u"Thank you for signing up. We'll send you a "
                              u"confirmation message by e-mail shortly."),
                            "info"
                            )

            IStatusMessage(self.request).addStatusMessage(
                _(u"An error occurred while processing your "
                  u"request to sign up for ${email}. "
                  u"Please try again!", mapping={'email': email}),
                "error")