Ejemplo n.º 1
0
    def _get_allowed_sender_options(cls, user):
        sender_options = {
            'user': {
                'email': user.email,
                'checked': False,
                'enabled': user.is_email_activated(),
                'reason': _("Email isn't activated"),
            },
            'system': {
                'email': config.get('adhocracy.email.from'),
                'checked': False,
                'enabled': config.get_bool(
                    'allow_system_email_in_mass_messages'),
                'reason': _("Not permitted in system settings"),
            },
            'support': {
                'email': config.get('adhocracy.registration_support_email'),
                'checked': False,
                'enabled': (config.get('adhocracy.registration_support_email')
                            is not None),
                'reason': _("adhocracy.registration_support_email not set"),
            }
        }

        if sender_options['user']['enabled']:
            sender_options['user']['checked'] = True
        elif sender_options['system']['enabled']:
            sender_options['system']['checked'] = True

        return sender_options
Ejemplo n.º 2
0
def staticpages_api_address():
    ret = instance_staticpages_api_address()
    if ret == '':
        ret = config.get('adhocracy_service.staticpages.rest_api_address')
    if ret == '':
        ret = config.get('adhocracy_service.rest_api_address')
    return ret
Ejemplo n.º 3
0
    def _get_allowed_sender_options(cls, user):
        sender_options = {
            'user': {
                'email': user.email,
                'checked': False,
                'enabled': user.is_email_activated(),
                'reason': _("Email isn't activated"),
            },
            'system': {
                'email': config.get('adhocracy.email.from'),
                'checked': False,
                'enabled':
                config.get_bool('allow_system_email_in_mass_messages'),
                'reason': _("Not permitted in system settings"),
            },
            'support': {
                'email':
                config.get('adhocracy.registration_support_email'),
                'checked':
                False,
                'enabled': (config.get('adhocracy.registration_support_email')
                            is not None),
                'reason':
                _("adhocracy.registration_support_email not set"),
            }
        }

        if sender_options['user']['enabled']:
            sender_options['user']['checked'] = True
        elif sender_options['system']['enabled']:
            sender_options['system']['checked'] = True

        return sender_options
Ejemplo n.º 4
0
def staticpages_api_address():
    ret = instance_staticpages_api_address()
    if ret == '':
        ret = config.get('adhocracy_service.staticpages.rest_api_address')
    if ret == '':
        ret = config.get('adhocracy_service.rest_api_address')
    return ret
Ejemplo n.º 5
0
    def index(self, format='html'):

        if c.instance:
            redirect(h.entity_url(c.instance))

        if format == 'rss':
            return EventController().all(format='rss')

        name = config.get('adhocracy.redirect_startpage_to_instance')
        if name != u'':
            # get_entity_or_abort does no work for instances
            instance = model.Instance.find(name)
            if instance is not None:
                redirect(h.entity_url(instance))

        data = {}

        instances_in_root = config.get_int(
            'adhocracy.startpage.instances.list_length')
        if instances_in_root > 0:
            data['instances'] = model.Instance.all(limit=instances_in_root)
        elif instances_in_root == -1:
            data['instances'] = model.Instance.all()

        add_static_content(data, u'adhocracy.static_index_path')
        c.body_css_classes += data.get('css_classes', [])
        c.body_css_classes.append('added_static_content')
        if data['title'] is None:
            data['title'] = config.get('adhocracy.site.name')

        proposals_number = config.get_int(
            'adhocracy.startpage.proposals.list_length')

        if proposals_number > 0:
            proposals = model.Proposal.all_q()\
                .join(model.Instance).filter(not_(
                    model.Instance.key.in_(model.Instance.SPECIAL_KEYS)))\
                .order_by(model.Proposal.create_time.desc())

            data['new_proposals_pager'] = pager.proposals(
                proposals, size=proposals_number,
                default_sort=sorting.entity_newest,
                enable_pages=False,
                enable_sorts=False)
        else:
            data['new_proposals_pager'] = None

        if config.get_bool('adhocracy.show_stats_on_frontpage'):
            data['stats_global'] = {
                "members": model.User.all_q().count(),
                "comments": model.Comment.all_q().count(),
                "proposals": model.Proposal.all_q().count(),
                "votes": model.Vote.all_q().count(),
            }

        if format == 'overlay':
            return render('index.html', data, overlay=True)
        else:
            return render('index.html', data)
Ejemplo n.º 6
0
def create_oauth(key=None, secret=None):
    token = None
    if key and secret:
        token = oauth.OAuthToken(key, secret)
    return OAuthApi(
        consumer_key=config.get('adhocracy.twitter.consumer_key'),
        consumer_secret=config.get('adhocracy.twitter.consumer_secret'),
        access_token=token)
Ejemplo n.º 7
0
def create_oauth(key=None, secret=None):
    token = None
    if key and secret:
        token = oauth.OAuthToken(key, secret)
    return OAuthApi(consumer_key=config.get('adhocracy.twitter.consumer_key'),
                    consumer_secret=config.get(
                        'adhocracy.twitter.consumer_secret'),
                    access_token=token)
Ejemplo n.º 8
0
    def test_is_local_url_subdomain(self):
        from adhocracy.lib import helpers as h
        from adhocracy import config

        self.assert_(h.site.relative_urls() ^ h.site.is_local_url(
            u'//subdomain.' + config.get(u'adhocracy.domain')))
        self.assert_(not h.site.is_local_url(
            u'//subsub.sub.' + config.get(u'adhocracy.domain')))
Ejemplo n.º 9
0
 def __init__(self):
     self.staticpages_api_token = config.get(
         'adhocracy_service.staticpages.rest_api_token',
         config.get('adhocracy_service.rest_api_token'))
     self.staticpages_api_address = staticpages_api_address()
     self.staticpages_verify = config.get_bool(
         'adhocracy_service.staticpages.verify_ssl',
         config.get_bool('adhocracy_service.verify_ssl'))
     self.staticpages_headers = {"X-API-Token": self.staticpages_api_token}
Ejemplo n.º 10
0
    def test_is_local_url_subdomain(self):
        from adhocracy.lib import helpers as h
        from adhocracy import config

        self.assert_(h.site.relative_urls()
                     ^ h.site.is_local_url(u'//subdomain.' +
                                           config.get(u'adhocracy.domain')))
        self.assert_(not h.site.is_local_url(u'//subsub.sub.' +
                                             config.get(u'adhocracy.domain')))
Ejemplo n.º 11
0
 def __init__(self):
     self.staticpages_api_token = config.get(
         'adhocracy_service.staticpages.rest_api_token',
         config.get('adhocracy_service.rest_api_token'))
     self.staticpages_api_address = staticpages_api_address()
     self.staticpages_verify = config.get_bool(
         'adhocracy_service.staticpages.verify_ssl',
         config.get_bool('adhocracy_service.verify_ssl'))
     self.staticpages_headers = {"X-API-Token": self.staticpages_api_token}
Ejemplo n.º 12
0
def get_captchasdotnet():
    return CaptchasDotNet(
        client=config.get('captchasdotnet.user_name'),
        secret=config.get('captchasdotnet.secret'),
        alphabet=config.get('captchasdotnet.alphabet'),
        letters=config.get_int('captchasdotnet.letters'),
        width=240,
        height=80,
        random_repository=config.get('captchasdotnet.random_repository'),
        cleanup_time=3600)
Ejemplo n.º 13
0
def velruse_url(path):
    return (
        aconfig.get("velruse.protocol")
        + "://"
        + aconfig.get("velruse.domain")
        + ":"
        + aconfig.get("velruse.port")
        + "/velruse/"
        + path.strip("/")
    )
Ejemplo n.º 14
0
def post_login_url(user):
    from adhocracy.lib.helpers import base_url
    url = config.get('adhocracy.post_login_url')
    if url is None:
        return base_url('/user/%s/dashboard' % user.user_name)

    instance = config.get('adhocracy.post_login_instance')
    if instance is None:
        return base_url(url)
    else:
        return base_url(url, Instance.find(instance))
Ejemplo n.º 15
0
def post_logout_url():
    from adhocracy.lib.helpers import base_url
    url = config.get('adhocracy.post_logout_url')
    if url is None:
        return base_url()

    instance = config.get('adhocracy.post_logout_instance')
    if instance is None:
        return base_url(url)
    else:
        return base_url(url, Instance.find(instance))
Ejemplo n.º 16
0
def get_captchasdotnet():
    return CaptchasDotNet(
        client=config.get('captchasdotnet.user_name'),
        secret=config.get('captchasdotnet.secret'),
        alphabet=config.get('captchasdotnet.alphabet'),
        letters=config.get_int('captchasdotnet.letters'),
        width=240,
        height=80,
        random_repository=config.get('captchasdotnet.random_repository'),
        cleanup_time=3600
    )
Ejemplo n.º 17
0
def post_login_url(user):
    from adhocracy.lib.helpers import base_url
    url = config.get('adhocracy.post_login_url')
    if url is None:
        return base_url('/user/%s/dashboard' % user.user_name)

    instance = config.get('adhocracy.post_login_instance')
    if instance is None:
        return base_url(url)
    else:
        return base_url(url, Instance.find(instance))
Ejemplo n.º 18
0
def get_captcha_type():
    captcha_type = config.get('adhocracy.captcha_type')

    if ((captcha_type == 'captchasdotnet'
         and config.get('captchasdotnet.user_name')
         and config.get('captchasdotnet.secret')) or
        (captcha_type == 'recaptcha' and config.get('recaptcha.public_key')
         and config.get('recaptcha.private_key'))):
        return captcha_type
    else:
        return None
Ejemplo n.º 19
0
def make_key(iden, args, kwargs):
    instance = args[0].instance
    instance_w = instance and instance.thumbnailbadges_width or ""
    instance_h = instance and instance.thumbnailbadges_height or ""
    sig = iden[:200]\
        + cache.util.make_tag(config.get("adhocracy.thumbnailbadges.width"))\
        + cache.util.make_tag(config.get("adhocracy.thumbnailbadges.height"))\
        + cache.util.make_tag(instance_w)\
        + cache.util.make_tag(instance_h)\
        + cache.util.make_tag(args) \
        + cache.util.make_tag(kwargs)
    return sha1(sig).hexdigest()
Ejemplo n.º 20
0
def make_key(iden, args, kwargs):
    instance = args[0].instance
    instance_w = instance and instance.thumbnailbadges_width or ""
    instance_h = instance and instance.thumbnailbadges_height or ""
    sig = iden[:200]\
        + cache.util.make_tag(config.get("adhocracy.thumbnailbadges.width"))\
        + cache.util.make_tag(config.get("adhocracy.thumbnailbadges.height"))\
        + cache.util.make_tag(instance_w)\
        + cache.util.make_tag(instance_h)\
        + cache.util.make_tag(args) \
        + cache.util.make_tag(kwargs)
    return sha1(sig).hexdigest()
Ejemplo n.º 21
0
def get_captcha_type():
    captcha_type = config.get('adhocracy.captcha_type')

    if ((captcha_type == 'captchasdotnet'
         and config.get('captchasdotnet.user_name')
         and config.get('captchasdotnet.secret'))
        or
        (captcha_type == 'recaptcha'
         and config.get('recaptcha.public_key')
         and config.get('recaptcha.private_key'))):
        return captcha_type
    else:
        return None
Ejemplo n.º 22
0
    def __init__(self, app, config):
        self.app = app

        dsn = aconfig.get('adhocracy.sentry.dsn', config=config)
        if not dsn:
            raise Exception(
                'Sentry misconfigured. Please add adhocracy.sentry.dsn '
                'to your adhocracy config.')

        self.client = Client(dsn)

        handler = SentryHandler(
            self.client, level=aconfig.get('adhocracy.sentry.loglevel'))
        setup_logging(handler)
Ejemplo n.º 23
0
    def test_is_local_url_domain(self):
        from adhocracy.lib import helpers as h
        from adhocracy import config

        self.assert_(
            h.site.is_local_url('//' + config.get(u'adhocracy.domain')))
        self.assert_(not h.site.is_local_url('http://evil.com'))
Ejemplo n.º 24
0
    def get_session(self):
        ses = session.get(SESSION_KEY, {})
        if ses and config.get("adhocracy.session.implementation") == "cookie":
            import pickle

            ses = pickle.loads(ses)
        return ses
Ejemplo n.º 25
0
 def _export(self, o):
     res = {}
     if self._opt_personal:
         res.update(
             {
                 "id": o.id,
                 "user_name": o.user_name,
                 "display_name": o.display_name,
                 "bio": o.bio,
                 "email": o.email,
                 "gender": o.gender,
                 "locale": encode_locale(o.locale),
             }
         )
         if config.get("adhocracy.user.optional_attributes"):
             res["optional_attributes"] = o.optional_attributes
     if self._opt_password:
         res.update(
             {
                 "adhocracy_activation_code": o.activation_code,
                 "adhocracy_reset_code": o.reset_code,
                 "adhocracy_password": o.password,
                 "adhocracy_banned": o.banned,
                 "adhocracy_welcome_code": o.welcome_code,
             }
         )
     if self._opt_badges:
         res["badges"] = [getattr(b, BadgeTransform._ID_KEY) for b in o.badges]
     return res
Ejemplo n.º 26
0
    def show(self, id, format=u'html'):
        if not c.instance.display_category_pages:
            abort(404)
        require.proposal.index()
        query = self.form_result.get('proposals_q')

        category = get_entity_or_abort(model.CategoryBadge, id)

        pages = model.Page.all_q(instance=c.instance,
                                 functions=model.Page.LISTED) \
            .join(model.DelegateableBadges) \
            .filter(model.DelegateableBadges.badge_id == category.id) \
            .all()
        pages = filter(lambda p: p.parent is None, pages)
        pages_pager = pager.NamedPager('pages',
                                       pages,
                                       tiles.page.smallrow,
                                       enable_pages=False,
                                       enable_sorts=False)

        default_sorting = config.get(
            'adhocracy.listings.instance_proposal.sorting')
        proposals_pager = pager.solr_proposal_pager(
            c.instance, {'text': query},
            default_sorting=default_sorting,
            extra_filter={'facet.delegateable.badgecategory': category.id})

        data = {
            'category': category,
            'pages_pager': pages_pager,
            'proposals_pager': proposals_pager,
        }
        return render('/category/show.html',
                      data,
                      overlay=format == u'overlay')
Ejemplo n.º 27
0
    def create(cls, key, label, user, description=None, locale=None):
        from group import Group
        from membership import Membership
        from page import Page

        instance = Instance(unicode(key).lower(), label, user)
        instance.description = description
        instance.default_group = Group.by_code(Group.INSTANCE_DEFAULT)
        if locale is not None:
            instance.locale = locale
        meta.Session.add(instance)
        supervisor_group = Group.by_code(Group.CODE_SUPERVISOR)
        membership = Membership(user, instance, supervisor_group,
                                approved=True)
        meta.Session.add(membership)
        if config.get_bool('adhocracy.create_initial_instance_page'):
            Page.create(instance, label, u"", user)

        # Autojoin the user in instances
        config_autojoin = config.get('adhocracy.instances.autojoin')
        if (config_autojoin and
                (config_autojoin == 'ALL' or
                 key in (k.strip() for k in config_autojoin.split(',')))):
            users = adhocracy.model.User.all()
            for u in users:
                autojoin_membership = Membership(u, instance,
                                                 instance.default_group)
                meta.Session.add(autojoin_membership)

        meta.Session.flush()
        return instance
Ejemplo n.º 28
0
def user_language(user, fallbacks=[]):
    # find out the locale
    locale = None
    if user and user.locale:
        locale = user.locale

    if locale is None:
        locale = Locale.parse(Locale.negotiate(fallbacks, LOCALE_STRINGS_DASH,
                                               sep='-',
                                               aliases=A2_LOCALE_ALIASES)) \
            or get_default_locale()

    # determinate from which path we load the translations
    translations_config = {
        'pylons.paths': {
            'root': _get_translations_root()
        },
        'pylons.package': config.get('pylons.package')
    }

    # set language and fallback
    set_lang(str(locale), pylons_config=translations_config)
    add_fallback(str(get_default_locale()), pylons_config=translations_config)
    formencode.api.set_stdtranslation(domain="FormEncode",
                                      languages=[locale.language])
    return locale
Ejemplo n.º 29
0
 def _export(self, o):
     res = {}
     if self._opt_personal:
         res.update({
             'id': o.id,
             'user_name': o.user_name,
             'display_name': o.display_name,
             'bio': o.bio,
             'email': o.email,
             'gender': o.gender,
             'locale': encode_locale(o.locale),
         })
         if config.get('adhocracy.user.optional_attributes'):
             res['optional_attributes'] = o.optional_attributes
     if self._opt_password:
         res.update({
             'adhocracy_activation_code': o.activation_code,
             'adhocracy_reset_code': o.reset_code,
             'adhocracy_password': o.password,
             'adhocracy_banned': o.banned,
             'adhocracy_welcome_code': o.welcome_code,
         })
     if self._opt_badges:
         res['badges'] = [getattr(b, BadgeTransform._ID_KEY)
                          for b in o.badges]
     return res
Ejemplo n.º 30
0
    def create(cls, user_name, email, password=None, locale=None,
               openid_identity=None, global_admin=False, display_name=None,
               autojoin=True, shibboleth_persistent_id=None):
        """
        Create a user. If user_name is None, a random user name is generated.
        """
        from group import Group
        from membership import Membership

        import adhocracy.lib.util as util
        if password is None:
            password = util.random_token()

        import adhocracy.i18n as i18n
        if locale is None:
            locale = i18n.get_default_locale()

        while user_name is None:
            # Note: This can theoretically lead to IntegrityErrors if the same
            # username is generated at the same time. This is very unlikely
            # though.
            from adhocracy.lib.util import random_username
            try_user_name = random_username()
            if cls.find(try_user_name) is None:
                user_name = try_user_name
                from adhocracy.lib import helpers as h
                h.flash(_('The random username %s has been assigned to you.') %
                        user_name, 'success')

        user = User(user_name, email, password, locale,
                    display_name=display_name)
        meta.Session.add(user)

        # Add the global default group
        default_group = Group.by_code(Group.CODE_DEFAULT)
        default_membership = Membership(user, None, default_group)
        meta.Session.add(default_membership)

        # Autojoin the user in instances
        config_autojoin = config.get('adhocracy.instances.autojoin')
        if autojoin and config_autojoin:
            user.fix_autojoin(commit=False)

        if global_admin:
            admin_group = Group.by_code(Group.CODE_ADMIN)
            admin_membership = Membership(user, None, admin_group)
            meta.Session.add(admin_membership)

        if openid_identity is not None:
            from adhocracy.model.openid import OpenID
            openid = OpenID(unicode(openid_identity), user)
            meta.Session.add(openid)

        if shibboleth_persistent_id is not None:
            from adhocracy.model.shibboleth import Shibboleth
            shib = Shibboleth(shibboleth_persistent_id, user)
            meta.Session.add(shib)

        meta.Session.flush()
        return user
Ejemplo n.º 31
0
    def create(cls, key, label, user, description=None, locale=None):
        from group import Group
        from membership import Membership
        from page import Page

        instance = Instance(unicode(key).lower(), label, user)
        instance.description = description
        instance.default_group = Group.by_code(Group.INSTANCE_DEFAULT)
        if locale is not None:
            instance.locale = locale
        meta.Session.add(instance)
        supervisor_group = Group.by_code(Group.CODE_SUPERVISOR)
        membership = Membership(user, instance, supervisor_group,
                                approved=True)
        meta.Session.add(membership)
        if config.get_bool('adhocracy.create_initial_instance_page'):
            Page.create(instance, label, u"", user)

        # Autojoin the user in instances
        config_autojoin = config.get('adhocracy.instances.autojoin')
        if (config_autojoin and
                (config_autojoin == 'ALL' or
                 key in (k.strip() for k in config_autojoin.split(',')))):
            users = adhocracy.model.User.all()
            for u in users:
                autojoin_membership = Membership(u, instance,
                                                 instance.default_group)
                meta.Session.add(autojoin_membership)

        meta.Session.flush()
        return instance
Ejemplo n.º 32
0
    def show(self, id, format=u'html'):
        if not c.instance.display_category_pages:
            abort(404)
        require.proposal.index()
        query = self.form_result.get('proposals_q')

        category = get_entity_or_abort(model.CategoryBadge, id)

        pages = model.Page.all_q(instance=c.instance,
                                 functions=model.Page.LISTED) \
            .join(model.DelegateableBadges) \
            .filter(model.DelegateableBadges.badge_id == category.id) \
            .all()
        pages = filter(lambda p: p.parent is None, pages)
        pages_pager = pager.NamedPager('pages', pages, tiles.page.smallrow,
                                       enable_pages=False, enable_sorts=False)

        default_sorting = config.get(
            'adhocracy.listings.instance_proposal.sorting')
        proposals_pager = pager.solr_proposal_pager(
            c.instance,
            {'text': query},
            default_sorting=default_sorting,
            extra_filter={'facet.delegateable.badgecategory': category.id})

        data = {
            'category': category,
            'pages_pager': pages_pager,
            'proposals_pager': proposals_pager,
        }
        return render('/category/show.html', data,
                      overlay=format == u'overlay')
Ejemplo n.º 33
0
    def test_is_local_url_domain(self):
        from adhocracy.lib import helpers as h
        from adhocracy import config

        self.assert_(h.site.is_local_url(
            '//' + config.get(u'adhocracy.domain')))
        self.assert_(not h.site.is_local_url('http://evil.com'))
Ejemplo n.º 34
0
def get_default_locale():
    try:
        if c.instance and c.instance.locale:
            return c.instance.locale
        locale = config.get('adhocracy.language')
        return babel.Locale.parse(locale)
    except TypeError:
        return babel.Locale.parse('en_US')
Ejemplo n.º 35
0
def create_store():
    log.debug("Creating SQL-based OpenID store...")
    conn_str = config.get('sqlalchemy.url')
    if conn_str is None:
        raise ValueError("OpenID connection")
    db_type = conn_str.split(':')[0]
    store_cls = SQL_STORES.get(db_type)
    return store_cls(meta.engine.raw_connection())
Ejemplo n.º 36
0
def get_default_locale():
    try:
        if c.instance and c.instance.locale:
            return c.instance.locale
        locale = config.get('adhocracy.language')
        return babel.Locale.parse(locale)
    except TypeError:
        return babel.Locale.parse('en_US')
Ejemplo n.º 37
0
def email_subject(message, recipient, _format=None):
    if _format is None:
        _format = _(u"[{site_name}] Message from {sender_name}: {subject}")
    return _format.format(**{
        'subject': message.subject,
        'sender_name': message.creator.name,
        'site_name': config.get('adhocracy.site.name'),
    })
Ejemplo n.º 38
0
def shorten_url(url):
    try:
        query = urlencode({
            'login': config.get('adhocracy.bitly.login',
                                DEFAULT_SHORTENER_USER),
            'apiKey': config.get('adhocracy.bitly.key',
                                 DEFAULT_SHORTENER_KEY),
            'longUrl': url.encode('utf-8'),
            'format': 'json',
            'version': '2.0.1'})
        request_url = SHORTENER_URL + "?" + str(query)
        data = json.loads(urlopen(request_url).read())
        if not data['statusCode'] == 'OK':
            return url
        return data['results'][url]['shortUrl']
    except:
        return url
Ejemplo n.º 39
0
def create_store():
    log.debug("Creating SQL-based OpenID store...")
    conn_str = config.get('sqlalchemy.url')
    if conn_str is None:
        raise ValueError("OpenID connection")
    db_type = conn_str.split(':')[0]
    store_cls = SQL_STORES.get(db_type)
    return store_cls(meta.engine.raw_connection())
Ejemplo n.º 40
0
    def new(self, format=u'html'):

        data = {}
        protocol = config.get('adhocracy.protocol').strip()
        domain = config.get('adhocracy.domain').strip()

        if config.get_bool('adhocracy.relative_urls'):
            data['url_pre'] = '%s://%s/i/' % (protocol, domain)
            data['url_post'] = ''
            data['url_right_align'] = False
        else:
            data['url_pre'] = '%s://' % protocol
            data['url_post'] = '.%s' % domain
            data['url_right_align'] = True

        return render("/instance/new.html", data,
                      overlay=format == u'overlay')
Ejemplo n.º 41
0
Archivo: mail.py Proyecto: alkadis/vcv
def to_mail(to_name,
            to_email,
            subject,
            body,
            headers={},
            decorate_body=True,
            email_from=None,
            reply_to=None,
            name_from=None):
    try:
        if email_from is None:
            email_from = config.get('adhocracy.email.from')
        if name_from is None:
            name_from = config.get('adhocracy.site.name')

        if decorate_body:
            body = (
                _(u"Hi %s,") % to_name + u"\r\n\r\n%s\r\n\r\n" % body +
                _(u"Cheers,\r\n\r\n"
                  u"    the %s Team\r\n") % config.get('adhocracy.site.name'))

        # wrap body, but leave long words (e.g. links) intact
        body = u'\n'.join(
            textwrap.fill(line, break_long_words=False, break_on_hyphens=False)
            for line in body.split(u'\n'))

        msg = MIMEText(body.encode(ENCODING), 'plain', ENCODING)

        for k, v in headers.items():
            msg[k] = v

        subject = Header(subject.encode(ENCODING), ENCODING)
        msg['Subject'] = subject
        msg['From'] = _("%s <%s>") % (name_from, email_from)
        to = Header(u"%s <%s>" % (to_name, to_email), ENCODING)
        msg['To'] = to
        if reply_to is not None:
            msg['Reply-To'] = reply_to
        msg['']
        msg['Date'] = email.Utils.formatdate(time())
        msg['X-Mailer'] = "Adhocracy SMTP %s" % version.get_version()
        # log.debug("MAIL\r\n" + msg.as_string())
        send(email_from, to_email, msg.as_string())
    except Exception:
        log.exception("Sending mail failed.")
Ejemplo n.º 42
0
def email_subject(message, recipient, _format=None):
    if _format is None:
        _format = _(u"[{site_name}] Message from {sender_name}: {subject}")
    return _format.format(
        **{
            'subject': message.subject,
            'sender_name': message.creator.name,
            'site_name': config.get('adhocracy.site.name'),
        })
Ejemplo n.º 43
0
def render_external_navigation(current_key):
    if not use_external_navigation():
        return None
    api = RESTAPI()
    base = config.get('adhocracy.external_navigation_base')
    try:
        result = api.staticpages_get(base=base)
    except ConnectionError as e:
        log.error('Error while connecting to static pages backend: %s' % e)
        return None
    if not result.ok:
        log.error('Error while fetching static pages: %s %s'
                  % (result.status_code, result.reason))
        return None
    try:
        nav = result.json()
    except JSONDecodeError as e:
        log.error('Error while decoding static pages: %s' % e)
        return None
    instance = c.instance if instance_staticpages_api_address() else None
    if nav is None or not nav.get('children'):
        log.error('External navigation not found for configured languages')
        return None

    def render_navigation_item(item, path='', toplevel=False):
        from adhocracy.lib.templating import render_def

        if path != '':
            path = '%s/%s' % (path, item['name'])
        else:
            path = item['name']

        url = _url.build(instance, 'static', path, format='html')

        contains_current = (path == current_key)
        if item['children']:
            children, contained_list = izip(
                *map(lambda child: render_navigation_item(child, path),
                     item['children']))
            contains_current = contains_current or any(contained_list)
        else:
            children = []

        html = render_def('static/tiles.html', 'navigation_item',
                          href=url,
                          title=item['title'],
                          current=toplevel and contains_current,
                          children=children)

        return (html, contains_current)

    html_list, _ = izip(
        *map(lambda child: render_navigation_item(child, toplevel=True),
             nav['children']))
    return '\n'.join(html_list)
Ejemplo n.º 44
0
def _get_translations_root():
    translations_module = config.get('adhocracy.translations')
    translations_module_loader = pkgutil.get_loader(translations_module)
    if translations_module_loader is None:
        raise ValueError(('Cannot import the module "%s" configured for '
                          '"adhocracy.translations". Make sure it is an '
                          'importable module (and contains the '
                          'translation files in a subdirectory '
                          '"i18n"') % translations_module)

    return translations_module_loader.filename
Ejemplo n.º 45
0
def _get_translations_root():
    translations_module = config.get('adhocracy.translations')
    translations_module_loader = pkgutil.get_loader(translations_module)
    if translations_module_loader is None:
        raise ValueError(('Cannot import the module "%s" configured for '
                          '"adhocracy.translations". Make sure it is an '
                          'importable module (and contains the '
                          'translation files in a subdirectory '
                          '"i18n"') % translations_module)

    return translations_module_loader.filename
Ejemplo n.º 46
0
def render_footer_column(instance, column):
    if not config.get_bool('adhocracy.customize_footer'):
        return None
    path = u'footer_' + unicode(column)
    if instance and\
       instance.key in config.get('adhocracy.instance_footers'):
        path = u'%s_%s' % (path, instance.key)
    page = staticpage.get_static_page(path)
    if page is None:
        return None
    else:
        return page.body
Ejemplo n.º 47
0
def shorten_url(url):
    try:
        query = urlencode({
            'login':
            config.get('adhocracy.bitly.login', DEFAULT_SHORTENER_USER),
            'apiKey':
            config.get('adhocracy.bitly.key', DEFAULT_SHORTENER_KEY),
            'longUrl':
            url.encode('utf-8'),
            'format':
            'json',
            'version':
            '2.0.1'
        })
        request_url = SHORTENER_URL + "?" + str(query)
        data = json.loads(urlopen(request_url).read())
        if not data['statusCode'] == 'OK':
            return url
        return data['results'][url]['shortUrl']
    except:
        return url
Ejemplo n.º 48
0
Archivo: mail.py Proyecto: alkadis/vcv
def to_mail(
    to_name, to_email, subject, body, headers={}, decorate_body=True, email_from=None, reply_to=None, name_from=None
):
    try:
        if email_from is None:
            email_from = config.get("adhocracy.email.from")
        if name_from is None:
            name_from = config.get("adhocracy.site.name")

        if decorate_body:
            body = (
                _(u"Hi %s,") % to_name
                + u"\r\n\r\n%s\r\n\r\n" % body
                + _(u"Cheers,\r\n\r\n" u"    the %s Team\r\n") % config.get("adhocracy.site.name")
            )

        # wrap body, but leave long words (e.g. links) intact
        body = u"\n".join(
            textwrap.fill(line, break_long_words=False, break_on_hyphens=False) for line in body.split(u"\n")
        )

        msg = MIMEText(body.encode(ENCODING), "plain", ENCODING)

        for k, v in headers.items():
            msg[k] = v

        subject = Header(subject.encode(ENCODING), ENCODING)
        msg["Subject"] = subject
        msg["From"] = _("%s <%s>") % (name_from, email_from)
        to = Header(u"%s <%s>" % (to_name, to_email), ENCODING)
        msg["To"] = to
        if reply_to is not None:
            msg["Reply-To"] = reply_to
        msg[""]
        msg["Date"] = email.Utils.formatdate(time())
        msg["X-Mailer"] = "Adhocracy SMTP %s" % version.get_version()
        # log.debug("MAIL\r\n" + msg.as_string())
        send(email_from, to_email, msg.as_string())
    except Exception:
        log.exception("Sending mail failed.")
Ejemplo n.º 49
0
def add_static_content(data, config_key, title_key=u"title", body_key=u"body", css_classes_key=u"css_classes"):

    static_path = config.get(config_key)
    if static_path is not None:
        page = get_static_page(static_path)
        if page is None:
            data[title_key] = data[body_key] = None
        else:
            data[title_key] = page.title
            data[body_key] = render_body(page.body)
            data[css_classes_key] = page.css_classes
    else:
        data[title_key] = data[body_key] = None
Ejemplo n.º 50
0
    def oembed(self, format=u'json'):
        if 'url' not in request.params:
            return ret_abort(u"Required parameter 'url' is missing", code=400)

        u = urlparse.urlparse(request.params.get('url'))

        # validate input url
        if (u.scheme != config.get('adhocracy.protocol')
                or u.netloc != config.get('adhocracy.domain')):
            return ret_abort(u"URL not supported", code=404)

        # set format to overlay
        path = re.sub('(\.[^./]*)?$', '.overlay', u.path)
        new_url = urlparse.ParseResult(u.scheme, u.netloc, path,
                                       u.params, u.query, u.fragment)
        new_url = urlparse.urlunparse(new_url)

        width = min(640, int(request.params.get('maxwidth', 640)))
        height = int(request.params.get('maxheight', 750))

        html = ('<iframe src="%s" width="%i "height="%i"'
                ' frameborder="0"></iframe>' % (new_url, width, height))

        data = {
            'type': 'rich',
            'version': '1.0',
            'width': width,
            'height': height,
            'html': html,
            'provider_name': config.get('adhocracy.site.name'),
            'provider_url': h.base_url(instance=None, absolute=True),
        }

        if format == u'json':
            return render_json(data)
        else:
            ret_abort(u"The format parameter must be one of: {json}.",
                      code=501)
Ejemplo n.º 51
0
    def oembed(self, format=u'json'):
        if 'url' not in request.params:
            return ret_abort(u"Required parameter 'url' is missing", code=400)

        u = urlparse.urlparse(request.params.get('url'))

        # validate input url
        if (u.scheme != config.get('adhocracy.protocol')
                or u.netloc != config.get('adhocracy.domain')):
            return ret_abort(u"URL not supported", code=404)

        # set format to overlay
        path = re.sub('(\.[^./]*)?$', '.overlay', u.path)
        new_url = urlparse.ParseResult(u.scheme, u.netloc, path, u.params,
                                       u.query, u.fragment)
        new_url = urlparse.urlunparse(new_url)

        width = min(640, int(request.params.get('maxwidth', 640)))
        height = int(request.params.get('maxheight', 750))

        html = ('<iframe src="%s" width="%i "height="%i"'
                ' frameborder="0"></iframe>' % (new_url, width, height))

        data = {
            'type': 'rich',
            'version': '1.0',
            'width': width,
            'height': height,
            'html': html,
            'provider_name': config.get('adhocracy.site.name'),
            'provider_url': h.base_url(instance=None, absolute=True),
        }

        if format == u'json':
            return render_json(data)
        else:
            ret_abort(u"The format parameter must be one of: {json}.",
                      code=501)
Ejemplo n.º 52
0
def local_datetime(dt):
    """
    Calculates a datetime object with the configured timezone information set
    from a given datetime ``dt``.
    """
    tz_setting = config.get('adhocracy.timezone', FALLBACK_TZ)
    try:
        tz = pytz.timezone(tz_setting)
    except pytz.UnknownTimeZoneError:
        log.warn('Invalid time zone setting: %s' % tz_setting)
        tz = pytz.timezone(FALLBACK_TZ)

    if dt.tzinfo is None:
        return tz.fromutc(dt)
    else:
        return dt.astimezone(tz)
Ejemplo n.º 53
0
def local_datetime(dt):
    """
    Calculates a datetime object with the configured timezone information set
    from a given datetime ``dt``.
    """
    tz_setting = config.get('adhocracy.timezone', FALLBACK_TZ)
    try:
        tz = pytz.timezone(tz_setting)
    except pytz.UnknownTimeZoneError:
        log.warn('Invalid time zone setting: %s' % tz_setting)
        tz = pytz.timezone(FALLBACK_TZ)

    if dt.tzinfo is None:
        return tz.fromutc(dt)
    else:
        return dt.astimezone(tz)
Ejemplo n.º 54
0
    def fix_autojoin(self):
        config_autojoin = config.get('adhocracy.instances.autojoin')
        if not config_autojoin:
            return ret_abort('autojoin is not enabled')

        users = model.User.all()
        added = 0
        for user in users:
            added += user.fix_autojoin(commit=False)
        if added > 0:
            model.meta.Session.commit()
            flash(
                _('Autojoin fixed - added %s memberships.') % added, 'success')
        else:
            flash(_('No need to fix autojoin.'), 'success')

        return redirect(base_url('/admin'))
Ejemplo n.º 55
0
    def _register(self, persistent_id):

        # initializing user data dict
        user_data = {}

        user_data['email'] = get_attribute(request, 'shib-email', None)

        if config.get_bool('adhocracy.force_randomized_user_names'):
            user_data['username'] = None
        else:
            user_data['username'] = get_attribute(request, 'shib-username')

        user_data['display_name'] = self._get_display_name()

        locale_attribute = config.get("adhocracy.shibboleth.locale.attribute")
        if locale_attribute is not None:
            user_data['locale'] = get_attribute(request, locale_attribute)

        # what to do
        if request.method == 'GET':
            if config.get_bool('adhocracy.shibboleth.register_form'):
                # render a form for missing uaser data
                return self._register_form(defaults=user_data)
            else:
                # register_form is False -> user data should be complete
                return self._create_user_and_login(persistent_id, **user_data)

        else:  # POST
            check_csrf()

            try:
                form_result = ShibbolethRegisterForm().to_python(request.POST)

                user_data['username'] = form_result.get(
                    'username', user_data['username'])
                user_data['display_name'] = form_result.get(
                    'display_name', user_data['display_name'])
                user_data['email'] = form_result.get('email',
                                                     user_data['email'])

                return self._create_user_and_login(persistent_id, **user_data)

            except formencode.Invalid, i:
                return self._register_form(errors=i.unpack_errors())
Ejemplo n.º 56
0
Archivo: sinks.py Proyecto: alkadis/vcv
def twitter_sink(pipeline):
    twitter_enabled = bool(config.get('adhocracy.twitter.username', ''))
    for notification in pipeline:
        user = notification.user
        if (twitter_enabled and user.twitter
                and notification.priority >= user.twitter.priority):
            notification.language_context()
            short_url = microblog.shorten_url(notification.link)
            remaining_length = TWITTER_LENGTH - \
                (1 + len(short_url) + len(TRUNCATE_EXT))
            tweet = text.truncate(notification.subject, remaining_length,
                                  TRUNCATE_EXT, False)
            tweet += ' ' + short_url

            log.debug("twitter DM to %s: %s" %
                      (user.twitter.screen_name, tweet))
            api = microblog.create_default()
            api.PostDirectMessage(user.twitter.screen_name, tweet)
        else:
            yield notification
Ejemplo n.º 57
0
 def fix_autojoin(self, commit=True):
     from membership import Membership
     config_autojoin = config.get('adhocracy.instances.autojoin')
     if config_autojoin == 'ALL':
         instances = Instance.all(include_hidden=True)
     else:
         instance_keys = [key.strip() for key in config_autojoin.split(",")]
         instances = meta.Session.query(Instance)\
             .filter(Instance.key.in_(instance_keys)).all()
     to_join = set(instances)
     added = 0
     for m in self.memberships:
         to_join.discard(m.instance)
     for instance in to_join:
         autojoin_membership = Membership(self, instance,
                                          instance.default_group)
         meta.Session.add(autojoin_membership)
         added += 1
     if commit:
         meta.Session.commit()
     return added