Ejemplo n.º 1
0
    def __init__(self, request):
        self.request = request
        self.session = self.request.db_session
        self.request.template_helper.rendering_type = 'static'
        self.request.template_helper.section = 'admin'
        self.log = logging.getLogger("%s.%s" % ( self.__class__.__module__,
                                                self.__class__.__name__))
        self.log.debug("handle request for %s", request.path_info)

        lang = request.params.get('lang')
        country = request.params.get('country')
        if bool(lang) ^ bool(country):
            # either the request contains no lang options or both.
            # if the request contains only one of the two, it's a bad request
            raise HTTPBadRequest()
        elif lang:
            self.log.debug('Setting language to %s', lang)
            request.language = Language.get_by_lang(request.db_session, lang)
Ejemplo n.º 2
0
def get_negotiated_language(request):
    """ This function returns a Language from database that
        best matches one of those requested by the client.
        If a match cannot be found, it simply returns the first
        language available
    """

    # Get all the registered and enabled languages of the system.
    available = [str(locale)
                 for locale in Language.get_locales(request.db_session,
                                                    enabled=True)]
    # Get client preferred languages.
    preferred = [str(locale) for locale in request.accepted_locales]

    # Choose the best one.
    negotiated = Locale.negotiate(preferred, available)
    if negotiated is None:
        lang = available[0][:2]
    else:
        lang = negotiated.language

    return Language.get_by_lang(request.db_session, lang)
Ejemplo n.º 3
0
    def test_get_by_lang(self):

        languages = [
            Language(id=1, lang=u'it', country=u'IT', enabled=True),
            Language(id=2, lang=u'it', country=u'CH', enabled=False)]

        for language in languages:
            self.session.add(language)

        self.session.commit()

        self.assertIn(Language.get_by_lang(self.session, u'it'), languages)
        self.assertIn(Language.get_by_lang(self.session, u'IT'), languages)
        self.assertIn(Language.get_by_lang(self.session, u'It'), languages)
        self.assertIn(Language.get_by_lang(self.session, u'iT'), languages)

        self.session.add(Language(id=3, lang=u'en', country=u'GB',
                                  enabled=True))
        self.session.commit()

        self.assertNotIn(Language.get_by_lang(self.session, u'en'), languages)
        self.assertNotIn(Language.get_by_lang(self.session, u'EN'), languages)
        self.assertNotIn(Language.get_by_lang(self.session, u'En'), languages)
        self.assertNotIn(Language.get_by_lang(self.session, u'eN'), languages)
Ejemplo n.º 4
0
    def enable(self):
        """
            Enable the language identified by 'lang_id'.
        """
        try:
            def_lang = self.request.registry.settings['default_locale_name']
            def_lang = Language.get_by_lang(self.session, def_lang)
            language = Language.enable(self.session,
                                       int(self.request.params['lang_id']),
                                       def_lang.id)
            self.session.flush()

        except QuotaError as e:
            self.log.exception(e)
            self.session.rollback()
            success = False
            msg = self.request.translate(
                    'Hai raggiunto il numero massimo di lingue acquistate.')

        except Exception as e:
            self.log.exception('Cannot enable requested language: %s', e)
            self.session.rollback()
            success = False
            msg=self.request.translate(
                u"Errore durante la procedura di aggiunta della lingua.")

        else:
            self.log.debug('Enabled: %s', language)
            self.session.commit()
            name = language.locale.get_display_name().title()
            success = True
            msg = self.request.translate(
                u'Lingua %s aggiunta con successo.' % name)
            self.proxy.invalidate(language=language)

        finally:
            return dict(success=success, msg=msg)
Ejemplo n.º 5
0
def get_root_resource(request):

    path_info = request.path_info
    log.debug('get_root_resource: %s', path_info)

    # Getting url_parts and for each part associating a Resource
    # On request.path_info applying strip('/') remove the initial / so
    # with the following split('/') we obtain a list just with parts
    url_parts = [UrlPart(part=url_part, resource=Resource())
                 for url_part in path_info.strip('/').split('/')
                 if url_part]

    log.debug('url_parts: %s', url_parts)

    if not url_parts:
        # URL is '/'.
        log.debug('Return NoLanguage context.')
        return NoLanguage()

    need_auth = False
    if url_parts[0].part == 'admin':
        log.debug("Admin Panel Request: removing admin.")
        url_parts = url_parts[1:]
        path_info = path_info.replace('/admin', '')
        need_auth = True

    language = Language.get_by_lang(request.db_session, url_parts[0].part)
    if language is None:
        # language not found, return a 404
        log.debug("No language found.")
        raise HTTPNotFound()
    else:
        request.language = language

    if len(url_parts) == 1:
        # URL is like '/{lang}'.
        log.debug('Get Context by Language %s.', url_parts[0].part)
        url_parts[0] = UrlPart(part=url_parts[0].part,
                               resource=request.language)

    else:
        # URL is like '/{lang}/{node}/[...]/{page}[.ext]
        # Get the NodeInfo from database using path_info.
        log.debug('Get Context by NodeInfo %s.', path_info)
        try:
            # Remove '.ext' from the url.
            url_parts[-1] = url_parts[-1].part
            resource = PageInfo.get_by_url(request.db_session,
                                           path_info.rsplit('.', 1)[0])
            url_parts[-1] = UrlPart(part=url_parts[-1], resource=resource)
        except NoResultFound:
            raise HTTPNotFound()
        else:
            log.debug('Found: %s', url_parts[-1])

    log.debug('UrlParts: %s', url_parts)

    # Create the resources tree.
    # The last element in resources tree is the request context.
    tmp = root = Resource()
    parent = None
    acl = [(Allow, Everyone, ALL_PERMISSIONS)]
    if need_auth:
        acl = Authenticated.__acl__

    for url_part, resource in url_parts:
        log.debug('Urlpart: %s, Resource: %s', url_part, resource)
        resource.__parent__ = parent
        resource.__acl__ = acl
        parent = resource
        tmp[url_part] = resource
        tmp = tmp[url_part]
        log.debug("Resource: %s, acl: %s, parent: %s",
                  resource, resource.__acl__, resource.__parent__)

    log.debug(root)

    return root
Ejemplo n.º 6
0
def handle_contact_form(request):
    log.debug("Building contacts form")
    result = dict(
        vars={},
        error={},
        success=True,
        message=u"Grazie per averci contattato. Le risponderemo al più presto."
    )
    form_keys = ('name', 'surname', 'email', 'phone', 'agreement', 'message')

    log.debug("Form has been submitted, validating fields")
    res = validate_name('name', request.params.get('name', '').title())
    result['success'] = res['success']
    result['error'].update(res['error'])
    res = validate_name('surname', request.params.get('surname', '').title())
    result['success'] = res['success']
    result['error'].update(res['error'])
    response_field = request.params.get('recaptcha_response_field', '')
    challenge_field = request.params.get('recaptcha_challenge_field', '')
    res = validate_captcha(response_field, challenge_field, request.remote_addr)
    result['success'] = res['success']
    result['error'].update(res['error'])

    if not email_re.match(request.params.get('email','')):
        result['error']['email'] = u"Inserisci un indirizzo email valido."
        result['success'] = False

    if not phone_re.match(request.params.get('phone', '')):
        result['error']['phone'] = u"Inserisci un numero di telefono valido."
        result['success'] = False

    if len(request.params.get('message', '')) < 10:
        result['error']['message'] = u"Inserisci almeno 10 caratteri."
        result['success'] = False

    if not request.params.get('agreement', '') == 'on':
        result['error']['agreement'] = u"Devi accettare i termini di Privacy"
        result['success'] = False

    recipients = request.db_session.query(Setting)\
                .filter(Setting.name.like(u'contact_dst_email_%')).all()
    log.debug("Recipients: %s", recipients)

    if len(recipients) > 0:
        # FIXME: use a template!
        body = u"Nome : %s \n" % (request.params.get('name'))
        body = u"%sCognome : %s \n" % (body, request.params.get('surname'))
        body = u"%sTelefono : %s \n\n" % (body, request.params.get('phone'))

        # add additional post data in the message body
        for key, value in request.params.iteritems():
            if key not in form_keys and not key.startswith("recaptcha") and\
               not key == '_lang':
                p = key.decode('utf8')
                body = u"%s%s : %s \n" % (body, p.title(), value)
                result['vars'][key] = value

        body = u"%sMessaggio : \n%s\n" % (body, request.params.get('message'))
        subject = u'[%s] Nuovo messaggio dal form di contatto' % (request.host)
        message = Message(subject=subject,
                        sender=request.params.get('email'),
                        body=body,
                        recipients=[r.value for r in recipients[0:1]],
                        cc=[r.value for r in recipients[1:]])

        if result['success']:
            log.debug('Form is valid, sending emails')
            try:
                mailer = get_mailer(request)
                mailer.send_immediately(message, fail_silently=False)

            except:
                log.exception("Errore nell'invio del messaggio. \n")
                result['message'] = \
                    u"Errore nell'invio del messaggio. " + \
                    u"Si prega di riprovare più tardi."
                result['success'] = False
        else:
            result['message'] = u"Errore nell'invio del form. " +\
                                        u"Ricontrollare i campi e riprovare."

    # get lang to translate messages
    def_lang = request.registry.settings.get('default_locale_name', 'it')
    lang = request.params.get('_lang', def_lang)
    try:
        request.language = Language.get_by_lang(request.db_session, lang)
    except:
        request.language = Language.get_by_lang(request.db_session, def_lang)

    # translate error message
    for err in result['error']:
        result['error'][err] = request.translate(result['error'][err])

    log.debug("Result: %s", result)
    return result