예제 #1
0
def test_route_discussion_post_v2(test_app,
                                  discussion_with_2_phase_interface_v2,
                                  post_related_to_sub_idea_1, subidea_1,
                                  test_session):
    from assembl.lib.frontend_urls import FrontendUrls
    from assembl import models
    slug = discussion_with_2_phase_interface_v2.slug
    route = "/%s/posts/%s" % (slug, quote_plus(
        post_related_to_sub_idea_1.uri()))
    print route
    resp = test_app.get(route)
    assert resp.status_int == 303

    thread_phase = test_session.query(models.DiscussionPhase).filter(
        models.DiscussionPhase.identifier == "thread").all()[0]
    headers = get_response_headers(resp)
    furl = FrontendUrls(discussion_with_2_phase_interface_v2)
    idea_id = subidea_1.graphene_id()
    phase_identifier = thread_phase.identifier
    phase_id = thread_phase.graphene_id()
    post_id = post_related_to_sub_idea_1.graphene_id()
    expected_path = furl.get_frontend_url('post',
                                          phase=phase_identifier,
                                          themeId=idea_id,
                                          phaseId=phase_id,
                                          element=post_id)

    assert expected_path in headers['Location']
예제 #2
0
 def resolve_login_data(self, args, context, info):
     # if the debate is public, but has an SSO set and a prefernece to redirect publically
     # this URL would be used
     discussion_id = context.matchdict['discussion_id']
     discussion = models.Discussion.get(discussion_id)
     prefs = discussion.preferences
     next_view = args.get('next_view') or False
     auth_backend = prefs.get('authorization_server_backend') or None
     landing_page = prefs.get('landing_page') or False
     if auth_backend and landing_page:
         from assembl.views.auth.views import get_social_autologin
         route = get_social_autologin(context, discussion, next_view)
         local = False
         url = urljoin(discussion.get_base_url(), route)
     else:
         # Just a regular discussion login, but a route from perspective of React-Router
         # Do not pass any next view by default. It's responsibility of the caller
         from assembl.lib.frontend_urls import FrontendUrls
         furl = FrontendUrls(discussion)
         route = furl.get_frontend_url('ctxLogin')
         if next_view:
             route = furl.append_query_string(route, next=next_view)
         local = True
         url = route
     return URLMeta(local=local, url=url)
예제 #3
0
def test_route_discussion_idea_v2(test_app,
                                  discussion_with_2_phase_interface_v2,
                                  post_related_to_sub_idea_1, subidea_1,
                                  test_session):

    from assembl.lib.frontend_urls import FrontendUrls
    from assembl import models
    slug = discussion_with_2_phase_interface_v2.slug
    route = "/debate/%s/idea/%s" % (slug, quote_plus(subidea_1.uri()))
    print(route)
    resp = test_app.get(route)
    assert resp.status_int == 303

    thread_phase = test_session.query(models.DiscussionPhase).\
        filter_by(identifier='thread').first()
    furl = FrontendUrls(discussion_with_2_phase_interface_v2)
    headers = get_response_headers(resp)
    phase_identifier = thread_phase.identifier
    phase_id = thread_phase.graphene_id()
    idea_id = subidea_1.graphene_id()
    expected_path = furl.get_frontend_url('idea',
                                          phase=phase_identifier,
                                          phaseId=phase_id,
                                          themeId=idea_id)
    assert expected_path in headers['Location']
예제 #4
0
파일: views.py 프로젝트: srault95/assembl
def discussion_list_view(request):
    request.session.pop('discussion')
    user_id = authenticated_userid(request) or Everyone
    user = None
    if user_id != Everyone:
        user = User.get(user_id)
    roles = get_roles(user_id)
    context = get_default_context(request)
    context['discussions'] = []
    # Show even anonymous users every discussion one has access to if
    # authenticated, so they can login and read them
    discussions = discussions_with_access(Authenticated if user_id ==
                                          Everyone else user_id)
    for discussion in discussions:
        discussionFrontendUrls = FrontendUrls(discussion)
        discussion_context = {
            'topic': discussion.topic,
            'slug': discussion.slug,
            'url': discussionFrontendUrls.get_discussion_url()
        }
        if user_has_permission(discussion.id, user_id, P_ADMIN_DISC):
            discussion_context[
                'admin_url'] = discussionFrontendUrls.get_discussion_edition_url(
                )
            discussion_context['permissions_url'] = request.route_url(
                'discussion_permissions', discussion_id=discussion.id)
        context['discussions'].append(discussion_context)
    if R_SYSADMIN in roles:
        context['discussions_admin_url'] = request.route_url(
            'discussion_admin')
        context['permissions_admin_url'] = request.route_url(
            'general_permissions')
    context['user'] = user
    return context
예제 #5
0
 def resolve_login_data(self, args, context, info):
     # if the debate is public, but has an SSO set and a prefernece to redirect publically
     # this URL would be used
     discussion_id = context.matchdict['discussion_id']
     discussion = models.Discussion.get(discussion_id)
     prefs = discussion.preferences
     next_view = args.get('next_view') or False
     auth_backend = prefs.get('authorization_server_backend') or None
     landing_page = prefs.get('landing_page') or False
     if auth_backend and landing_page:
         from assembl.views.auth.views import get_social_autologin
         route = get_social_autologin(context, discussion, next_view)
         local = False
         url = urljoin(discussion.get_base_url(), route)
     else:
         # Just a regular discussion login, but a route from perspective of React-Router
         # Do not pass any next view by default. It's responsibility of the caller
         from assembl.lib.frontend_urls import FrontendUrls
         furl = FrontendUrls(discussion)
         route = furl.get_frontend_url('ctxLogin')
         if next_view:
             route = furl.append_query_string(route, next=next_view)
         local = True
         url = route
     return URLMeta(local=local, url=url)
예제 #6
0
파일: views.py 프로젝트: hypnotics/assembl
def discussion_list_view(request):
    user_id = authenticated_userid(request) or Everyone
    user = None
    if user_id != Everyone:
        user = User.get(user_id)
    roles = get_roles(user_id)
    context = get_default_context(request)
    context['discussions'] = []
    #Show even anonymous users every discussion one has access to if 
    #authenticated, so they can login and read them
    discussions = discussions_with_access(Authenticated if user_id == Everyone else user_id)
    for discussion in discussions:
        discussionFrontendUrls = FrontendUrls(discussion)
        discussion_context = {
            'topic': discussion.topic,
            'slug': discussion.slug,
            'url': discussionFrontendUrls.get_discussion_url()
        }
        if user_has_permission(discussion.id, user_id, P_ADMIN_DISC):
            discussion_context['admin_url'] = discussionFrontendUrls.get_discussion_edition_url()
            discussion_context['permissions_url'] = request.route_url(
                'discussion_permissions', discussion_id=discussion.id)
        context['discussions'].append(discussion_context)
    if R_SYSADMIN in roles:
        context['discussions_admin_url'] = request.route_url('discussion_admin')
        context['permissions_admin_url'] = request.route_url('general_permissions')
    context['user'] = user
    return context
예제 #7
0
파일: __init__.py 프로젝트: assembl/assembl
def get_discussion_url():
    from ..auth.util import get_current_discussion
    from assembl.lib.frontend_urls import FrontendUrls
    from assembl.lib.utils import get_global_base_url
    discussion = get_current_discussion()
    if discussion:
        front_end_urls = FrontendUrls(discussion)
        return front_end_urls.get_discussion_url()
    else:
        return get_global_base_url()
예제 #8
0
def test_url_to_post_v1_without_timeline(discussion, root_post_1):
    from assembl.lib.frontend_urls import (FrontendUrls,
                                           get_current_phase_identifier,
                                           current_phase_use_v1_interface)
    frontend_urls = FrontendUrls(discussion)
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is True
    assert '/debate/jacklayton2/posts/local' in\
        frontend_urls.get_post_url(root_post_1)
예제 #9
0
def get_discussion_url():
    from ..auth.util import get_current_discussion
    from assembl.lib.frontend_urls import FrontendUrls
    from assembl.lib.utils import get_global_base_url
    discussion = get_current_discussion()
    if discussion:
        front_end_urls = FrontendUrls(discussion)
        return front_end_urls.get_discussion_url()
    else:
        return get_global_base_url()
예제 #10
0
def xtest_url_to_fiction(discussion, post_published_for_bright_mirror):
    fiction = post_published_for_bright_mirror
    from assembl.lib.frontend_urls import FrontendUrls
    frontend_urls = FrontendUrls(discussion)
    phase = fiction.get_created_phase()
    expected = 'jacklayton2/debate/{}/theme/{}/fictions/{}'.format(
        phase.identifier,
        fiction.get_ideas()[0].graphene_id(), fiction.graphene_id())
    actual = frontend_urls.get_post_url(fiction)
    assert expected in actual
예제 #11
0
def test_url_to_post_v1_with_timeline(discussion, root_post_1,
                                      timeline_phase2_interface_v1):
    from assembl.lib.frontend_urls import (
        FrontendUrls,
        get_current_phase_identifier,
        current_phase_use_v1_interface
    )
    frontend_urls = FrontendUrls(discussion)
    assert get_current_phase_identifier(discussion.timeline_events) == u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is True
    assert '/debate/jacklayton2/posts/local' in frontend_urls.get_post_url(root_post_1)
예제 #12
0
def test_url_to_post_v2(discussion, root_post_en_under_positive_column_of_idea,
                        timeline_phase2_interface_v2):
    from assembl.lib.frontend_urls import (FrontendUrls,
                                           get_current_phase_identifier,
                                           current_phase_use_v1_interface)
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    frontend_urls = FrontendUrls(discussion)
    assert 'jacklayton2/debate/thread/theme/' in \
        frontend_urls.get_post_url(root_post_en_under_positive_column_of_idea)
예제 #13
0
def test_url_to_post_v2_proposal(discussion, proposals_en_fr,
                                 timeline_phase2_interface_v2):
    from assembl.lib.frontend_urls import (FrontendUrls,
                                           get_current_phase_identifier,
                                           current_phase_use_v1_interface)
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    frontend_urls = FrontendUrls(discussion)
    expected = 'jacklayton2/debate/thread/theme/'
    actual = frontend_urls.get_post_url(proposals_en_fr[0])
    assert expected in actual
예제 #14
0
def test_url_to_synthesis_post_with_timeline(discussion, synthesis_post_1,
                                             timeline_phase2_interface_v2):
    from assembl.lib.frontend_urls import (FrontendUrls,
                                           get_current_phase_identifier,
                                           current_phase_use_v1_interface)
    frontend_urls = FrontendUrls(discussion)
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    post_id = synthesis_post_1.graphene_id()
    assert '/syntheses/{id}'.format(id=post_id)\
        in frontend_urls.get_post_url(synthesis_post_1)
예제 #15
0
def test_url_to_post_v2(discussion, root_post_en_under_positive_column_of_idea,
                        timeline_phase2_interface_v2, test_session):
    from assembl.lib.frontend_urls import (
        FrontendUrls,
        get_current_phase_identifier,
        current_phase_use_v1_interface
    )
    phase = root_post_en_under_positive_column_of_idea.get_created_phase()
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    frontend_urls = FrontendUrls(discussion)
    assert 'jacklayton2/debate/{}/theme/'.format(phase.identifier) in \
        frontend_urls.get_post_url(root_post_en_under_positive_column_of_idea)
예제 #16
0
def test_url_to_synthesis_post_with_timeline(discussion, synthesis_post_1,
                                             timeline_phase2_interface_v2):
    from assembl.lib.frontend_urls import (
        FrontendUrls,
        get_current_phase_identifier,
        current_phase_use_v1_interface
    )
    frontend_urls = FrontendUrls(discussion)
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    post_id = synthesis_post_1.graphene_id()
    assert '/syntheses/{id}'.format(id=post_id)\
        in frontend_urls.get_post_url(synthesis_post_1)
예제 #17
0
def test_get_frontend_route_none(discussion, idea_with_en_fr, reply_post_1):
    from assembl.lib.frontend_urls import FrontendUrls
    route_name = None
    route_name_2 = ""
    route_name_3 = "I definitely don't exist"

    furl = FrontendUrls(discussion)

    resp = furl.get_frontend_url(route_name)
    assert resp is None

    resp = furl.get_frontend_url(route_name_2)
    assert resp is None

    resp = furl.get_frontend_url(route_name_3)
    assert resp is None
예제 #18
0
def test_url_to_post_v2_proposal(discussion, proposals_en_fr,
                                 timeline_phase2_interface_v2, test_session):
    from assembl.lib.frontend_urls import (
        FrontendUrls,
        get_current_phase_identifier,
        current_phase_use_v1_interface
    )
    proposal = proposals_en_fr[0]
    phase = proposal.get_created_phase()
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    frontend_urls = FrontendUrls(discussion)
    expected = 'jacklayton2/debate/{}/theme/'.format(phase.identifier)
    actual = frontend_urls.get_post_url(proposals_en_fr[0])
    assert expected in actual
예제 #19
0
def test_url_to_post_v2_proposal(discussion, proposals_en_fr,
                                 timeline_phase2_interface_v2, test_session):
    from assembl.lib.frontend_urls import (FrontendUrls,
                                           get_current_phase_identifier,
                                           current_phase_use_v1_interface)
    proposal = proposals_en_fr[0]
    phase = proposal.get_created_phase()
    assert get_current_phase_identifier(discussion.timeline_events) ==\
        u'thread'
    assert current_phase_use_v1_interface(discussion.timeline_events) is False
    frontend_urls = FrontendUrls(discussion)
    expected = 'jacklayton2/debate/{}/question/{}/1/#{}'.format(
        phase.identifier,
        proposal.get_ideas()[0].graphene_id(),
        proposals_en_fr[0].graphene_id())
    actual = frontend_urls.get_post_url(proposals_en_fr[0])
    assert expected in actual
예제 #20
0
def test_route_discussion_post_legacy(discussion, root_post_1, test_app):
    """/slug/posts/%id"""
    slug = discussion.slug

    from urllib import quote_plus
    # Encode the URL so that it is compatible with URLs
    url_post_id = quote_plus(root_post_1.uri())
    route = discussion_route(slug, "posts", url_post_id, backbone=True)
    resp = test_app.get(route)
    assert resp.status_int == 200

    from assembl.lib.frontend_urls import FrontendUrls
    headers = get_response_headers(resp)
    redirect_url = unquote(headers['Location'])
    print(redirect_url)
    furl = FrontendUrls(discussion)
    post_url = furl.get_relative_post_url(root_post_1)
    assert post_url in redirect_url
예제 #21
0
def test_route_discussion_idea(discussion, root_post_1, subidea_1, test_app):
    """/debate/slug/idea/%id"""
    slug = discussion.slug

    # Encode the URL so that it is compatible with URLs
    url_post_id = quote_plus(subidea_1.uri())
    route = discussion_route(slug, "idea", url_post_id, backbone=True)
    resp = test_app.get(route)
    assert resp.status_int == 200

    from assembl.lib.frontend_urls import FrontendUrls
    headers = get_response_headers(resp)
    redirect_url = headers['Location']
    print(redirect_url)
    redirect_url = unquote(redirect_url)
    furl = FrontendUrls(discussion)
    idea_url = furl.get_relative_idea_url(subidea_1)
    assert idea_url in redirect_url
예제 #22
0
def test_route_discussion_post(discussion, root_post_1, test_app):
    """/debate/slug/posts/%id"""
    slug = discussion.slug

    from urllib import quote_plus
    # Encode the URL so that it is compatible with URLs
    url_post_id = quote_plus(root_post_1.uri())
    route = discussion_route(slug, "posts", url_post_id, backbone=True)
    resp = test_app.get(route)
    assert resp.status_int == 200

    from assembl.lib.frontend_urls import FrontendUrls
    headers = get_response_headers(resp)
    redirect_url = unquote(headers['Location'])
    print redirect_url
    furl = FrontendUrls(discussion)
    post_url = furl.get_relative_post_url(root_post_1)
    assert post_url in redirect_url
예제 #23
0
def test_route_discussion_idea(discussion, root_post_1, subidea_1, test_app):
    """/debate/slug/idea/%id"""
    slug = discussion.slug

    # Encode the URL so that it is compatible with URLs
    url_post_id = quote_plus(subidea_1.uri())
    route = discussion_route(slug, "idea", url_post_id, backbone=True)
    resp = test_app.get(route)
    assert resp.status_int == 200

    from assembl.lib.frontend_urls import FrontendUrls
    headers = get_response_headers(resp)
    redirect_url = headers['Location']
    print redirect_url
    redirect_url = unquote(redirect_url)
    furl = FrontendUrls(discussion)
    idea_url = furl.get_relative_idea_url(subidea_1)
    assert idea_url in redirect_url
예제 #24
0
def test_route_discussion_idea_v2(test_app,
                                  discussion_with_2_phase_interface_v2,
                                  timeline_phase2_interface_v2,
                                  post_related_to_sub_idea_1, subidea_1):

    slug = discussion_with_2_phase_interface_v2.slug
    route = "/debate/%s/idea/%s" % (slug, quote_plus(subidea_1.uri()))
    print route
    resp = test_app.get(route)
    assert resp.status_int == 303

    from assembl.lib.frontend_urls import FrontendUrls
    furl = FrontendUrls(discussion_with_2_phase_interface_v2)
    headers = get_response_headers(resp)
    phase_id = timeline_phase2_interface_v2['identifier']
    idea_id = subidea_1.graphene_id()
    expected_path = furl.get_frontend_url('idea',
                                          phase=phase_id,
                                          themeId=idea_id)
    assert expected_path in headers['Location']
예제 #25
0
def test_get_frontend_route_post(phases, discussion, idea_with_en_fr,
                                 reply_post_1):
    from assembl.lib.frontend_urls import FrontendUrls
    route_name = "post"
    furl = FrontendUrls(discussion)

    idea_id = to_global_id('Idea', idea_with_en_fr.id)
    element = to_global_id('Post', reply_post_1)
    thread = phases['thread']
    options = {
        'slug': discussion.slug,
        'phase': thread.identifier,
        'themeId': idea_id,
        'element': element
    }
    resp = furl.get_frontend_url(route_name, **options)
    expected = "/{slug}/debate/{phase}/theme/{themeId}/#{element}".format(
        slug=discussion.slug,
        phase=thread.identifier,
        themeId=idea_id,
        element=element)
    assert resp == expected
예제 #26
0
def test_route_discussion_post_v2(
        test_app, discussion_with_2_phase_interface_v2,
        post_related_to_sub_idea_1, subidea_1, test_session):
    from assembl.lib.frontend_urls import FrontendUrls
    from assembl import models
    slug = discussion_with_2_phase_interface_v2.slug
    route = "/%s/posts/%s" % (
        slug, quote_plus(post_related_to_sub_idea_1.uri()))
    print route
    resp = test_app.get(route)
    assert resp.status_int == 303

    thread_phase = test_session.query(models.DiscussionPhase).filter(
        models.DiscussionPhase.identifier == "thread").all()[0]
    headers = get_response_headers(resp)
    furl = FrontendUrls(discussion_with_2_phase_interface_v2)
    idea_id = subidea_1.graphene_id()
    phase_identifier = thread_phase.identifier
    phase_id = thread_phase.graphene_id()
    post_id = post_related_to_sub_idea_1.graphene_id()
    expected_path = furl.get_frontend_url(
        'post', phase=phase_identifier, themeId=idea_id, phaseId=phase_id, element=post_id)

    assert expected_path in headers['Location']
예제 #27
0
def test_route_discussion_idea_v2(
    test_app, discussion_with_2_phase_interface_v2,
    post_related_to_sub_idea_1,
    subidea_1, test_session):

    from assembl.lib.frontend_urls import FrontendUrls
    from assembl import models
    slug = discussion_with_2_phase_interface_v2.slug
    route = "/debate/%s/idea/%s" % (
        slug, quote_plus(subidea_1.uri()))
    print route
    resp = test_app.get(route)
    assert resp.status_int == 303

    thread_phase = test_session.query(models.DiscussionPhase).\
        filter_by(identifier='thread').first()
    furl = FrontendUrls(discussion_with_2_phase_interface_v2)
    headers = get_response_headers(resp)
    phase_identifier = thread_phase.identifier
    phase_id = thread_phase.graphene_id()
    idea_id = subidea_1.graphene_id()
    expected_path = furl.get_frontend_url(
        'idea', phase=phase_identifier, phaseId=phase_id, themeId=idea_id)
    assert expected_path in headers['Location']
예제 #28
0
def create_get_route(request, discussion=0):
    if discussion is 0:  # None would be a known absence, don't recalculate
        from assembl.auth.util import discussion_from_request
        discussion = discussion_from_request(request)
    from assembl.lib.frontend_urls import FrontendUrls
    if discussion:
        furl = FrontendUrls(discussion)

        def get_route(name, **kwargs):
            # If the resource is a furl_* route, check for front-end
            # routes first then return potential V2/V1 route
            # NOTE: `furl_` prefix MUST be used in this context in
            # order to avoid conflicts with Pyramid routes
            # This would NOT be true if only the FrontendUrl route is
            # used
            if 'furl_' in name:
                kwargs.update({'slug': discussion.slug})
                route_name = name.split('furl_')[1]
                route = furl.get_frontend_url(route_name, **kwargs)
                if route is not None:
                    return route

            if name == "bare_slug":
                name = "new_home" if discussion.preferences['landing_page'] \
                    else "home"
            try:
                return request.route_path('contextual_' + name,
                                          discussion_slug=discussion.slug,
                                          **kwargs)
            except KeyError:
                return request.route_path(name,
                                          discussion_slug=discussion.slug,
                                          **kwargs)
    else:

        def get_route(name, **kwargs):
            # Front-end routes not under a discussion context is already
            # back-end aware
            kwargs['discussion_slug'] = kwargs.get('discussion_slug', '')
            return request.route_path(name, **kwargs)

    return get_route
예제 #29
0
파일: views.py 프로젝트: srault95/assembl
def home_view(request):
    """The main view on a discussion"""
    user_id = authenticated_userid(request) or Everyone
    context = get_default_context(request)
    discussion = context["discussion"]
    canRead = user_has_permission(discussion.id, user_id, P_READ)
    if not canRead and user_id == Everyone:
        # User isn't logged-in and discussion isn't public:
        # redirect to login page
        # need to pass the route to go to *after* login as well

        # With regards to a next_view, if explicitly stated, then
        # that is the next view. If not stated, the referer takes
        # precedence. In case of failure, login redirects to the
        # discussion which is its context.
        next_view = request.params.get('next', None)
        if not next_view and discussion:
            # If referred here from a post url, want to be able to
            # send the user back. Usually, Assembl will send the user
            # here to login on private discussions.
            referrer = request.url
            next_view = path_qs(referrer)

        if discussion.preferences['authorization_server_backend']:
            login_url = request.route_url(
                "contextual_social_auth",
                discussion_slug=discussion.slug,
                backend=discussion.preferences['authorization_server_backend'],
                _query={"next": next_view})
        elif next_view:
            login_url = request.route_url("contextual_login",
                                          discussion_slug=discussion.slug,
                                          _query={"next": next_view})
        else:
            login_url = request.route_url('contextual_login',
                                          discussion_slug=discussion.slug)
        return HTTPTemporaryRedirect(login_url)
    elif not canRead:
        # User is logged-in but doesn't have access to the discussion
        # Would use render_to_response, except for the 401
        from pyramid_jinja2 import IJinja2Environment
        jinja_env = request.registry.queryUtility(IJinja2Environment,
                                                  name='.jinja2')
        template = jinja_env.get_template('cannot_read_discussion.jinja2')
        body = template.render(get_default_context(request))
        return Response(body, 401)

    # if the route asks for a post, get post content (because this is needed for meta tags)
    route_name = request.matched_route.name
    if route_name == "purl_posts":
        post_id = FrontendUrls.getRequestedPostId(request)
        if not post_id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        post = Post.get_instance(post_id)
        if not post or post.discussion_id != discussion.id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        context['post'] = post
    elif route_name == "purl_idea":
        idea_id = FrontendUrls.getRequestedIdeaId(request)
        if not idea_id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        idea = Idea.get_instance(idea_id)
        if not idea or idea.discussion_id != discussion.id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        context['idea'] = idea

    canAddExtract = user_has_permission(discussion.id, user_id, P_ADD_EXTRACT)
    context['canAddExtract'] = canAddExtract
    context['canDisplayTabs'] = True
    preferences = discussion.preferences
    if user_id != Everyone:
        from assembl.models import UserPreferenceCollection
        user = User.get(user_id)
        preferences = UserPreferenceCollection(user_id, discussion)
        # TODO: user may not exist. Case of session with BD change.
        user.is_visiting_discussion(discussion.id)
        session = Discussion.default_db

        if '_LOCALE_' in request.cookies:
            locale = request.cookies['_LOCALE_']
            process_locale(locale, user, session,
                           LanguagePreferenceOrder.Cookie)

        elif '_LOCALE_' in request.params:
            locale = request.params['_LOCALE_']
            process_locale(locale, user, session,
                           LanguagePreferenceOrder.Parameter)
        else:
            locale = locale_negotiator(request)
            process_locale(locale, user, session,
                           LanguagePreferenceOrder.OS_Default)
    else:
        locale = request.localizer.locale_name

    target_locale = Locale.get_or_create(strip_country(locale), discussion.db)

    translation_service_data = {}
    try:
        service = discussion.translation_service()
        if service:
            translation_service_data = service.serviceData()
    except:
        pass
    context['translation_service_data_json'] = json.dumps(
        translation_service_data)
    locale_labels = json.dumps(
        DummyGoogleTranslationService.target_locale_labels_cls(target_locale))
    context['translation_locale_names_json'] = locale_labels

    context['preferences_json'] = json.dumps(dict(preferences))

    response = render_to_response('../../templates/index.jinja2',
                                  context,
                                  request=request)
    # Prevent caching the home, especially for proper login/logout
    response.cache_control.max_age = 0
    response.cache_control.prevent_auto = True
    return response
예제 #30
0
파일: post.py 프로젝트: assembl/assembl
 def get_url(self):
     from assembl.lib.frontend_urls import FrontendUrls
     frontendUrls = FrontendUrls(self.discussion)
     return frontendUrls.get_post_url(self)
예제 #31
0
파일: views.py 프로젝트: hypnotics/assembl
def home_view(request):
    user_id = authenticated_userid(request) or Everyone
    context = get_default_context(request)
    discussion = context["discussion"]
    canRead = user_has_permission(discussion.id, user_id, P_READ)
    if not canRead and user_id == Everyone:
        # User isn't logged-in and discussion isn't public:
        # redirect to login page
        login_url = request.route_url(
            'contextual_login', discussion_slug=discussion.slug)
        return HTTPSeeOther(login_url)
    elif not canRead:
        # User is logged-in but doesn't have access to the discussion
        return HTTPUnauthorized()

    # if the route asks for a post, get post content (because this is needed for meta tags)
    route_name = request.matched_route.name
    if route_name == "purl_posts":
        post_id = FrontendUrls.getRequestedPostId(request)
        if post_id:
            post = Post.get_instance(post_id)
            if post and post.discussion_id == discussion.id:
                context['post'] = post
    elif route_name == "purl_idea":
        idea_id = FrontendUrls.getRequestedIdeaId(request)
        if idea_id:
            idea = Idea.get_instance(idea_id)
            if idea and idea.discussion_id == discussion.id:
                context['idea'] = idea

    canAddExtract = user_has_permission(discussion.id, user_id, P_ADD_EXTRACT)
    context['canAddExtract'] = canAddExtract
    context['canDisplayTabs'] = True
    if user_id != Everyone:
        from assembl.models import AgentProfile
        user = AgentProfile.get(user_id)
        # TODO: user may not exist. Case of session with BD change.
        user.is_visiting_discussion(discussion.id)
        session = Discussion.db()
        current_prefs = session.query(UserLanguagePreference).\
            filter_by(user_id = user_id).all()
        user = session.query(User).filter_by(id = user_id).first()

        if '_LOCALE_' in request.cookies:
            locale = request.cookies['_LOCALE_']
            posix_locale = to_posix_format(locale)
            process_locale(posix_locale,user_id,
                           current_prefs, session,
                           LanguagePreferenceOrder.Cookie)

        elif '_LOCALE_' in request.params:
            locale = request.params['_LOCALE_']
            posix_locale = to_posix_format(locale)
            process_locale(posix_locale, user_id,
                           current_prefs, session,
                           LanguagePreferenceOrder.Parameter)
        else:
            locale = default_locale_negotiator(request)
            posix_locale = to_posix_format(locale)
            process_locale(posix_locale, user_id,
                           current_prefs, session,
                           LanguagePreferenceOrder.OS_Default)


    response = render_to_response('../../templates/index.jinja2', context, request=request)
    # Prevent caching the home, especially for proper login/logout
    response.cache_control.max_age = 0
    response.cache_control.prevent_auto = True
    return response
예제 #32
0
파일: discussion.py 프로젝트: jean/assembl
 def get_url(self, request=None):
     from assembl.lib.frontend_urls import FrontendUrls
     frontendUrls = FrontendUrls(self)
     return frontendUrls.get_discussion_url(request)
예제 #33
0
def home_view(request):
    user_id = authenticated_userid(request) or Everyone
    context = get_default_context(request)
    discussion = context["discussion"]
    request.session["discussion"] = discussion.slug
    canRead = user_has_permission(discussion.id, user_id, P_READ)
    if not canRead and user_id == Everyone:
        # User isn't logged-in and discussion isn't public:
        # redirect to login page
        # need to pass the route to go to *after* login as well

        # With regards to a next_view, if explicitly stated, then
        # that is the next view. If not stated, the referer takes
        # precedence. In case of failure, login redirects to the
        # discussion which is its context.
        next_view = request.params.get('next_view', None)
        if not next_view and discussion:
            # If referred here from a post url, want to be able to
            # send the user back. Usually, Assembl will send the user
            # here to login on private discussions.
            referrer = request.url
            next_view = path_qs(referrer)

        if next_view:
            login_url = request.route_url("contextual_login",
                                          discussion_slug=discussion.slug,
                                          _query={"next_view": next_view})
        else:
            login_url = request.route_url(
                'contextual_login', discussion_slug=discussion.slug)
        return HTTPSeeOther(login_url)
    elif not canRead:
        # User is logged-in but doesn't have access to the discussion
        # Would use render_to_response, except for the 401
        from pyramid_jinja2 import IJinja2Environment
        jinja_env = request.registry.queryUtility(
            IJinja2Environment, name='.jinja2')
        template = jinja_env.get_template('cannot_read_discussion.jinja2')
        body = template.render(get_default_context(request))
        return Response(body, 401)

    # if the route asks for a post, get post content (because this is needed for meta tags)
    route_name = request.matched_route.name
    if route_name == "purl_posts":
        post_id = FrontendUrls.getRequestedPostId(request)
        if not post_id:
            return HTTPSeeOther(request.route_url(
                'home', discussion_slug=discussion.slug))
        post = Post.get_instance(post_id)
        if not post or post.discussion_id != discussion.id:
            return HTTPSeeOther(request.route_url(
                'home', discussion_slug=discussion.slug))
        context['post'] = post
    elif route_name == "purl_idea":
        idea_id = FrontendUrls.getRequestedIdeaId(request)
        if not idea_id:
            return HTTPSeeOther(request.route_url(
                'home', discussion_slug=discussion.slug))
        idea = Idea.get_instance(idea_id)
        if not idea or idea.discussion_id != discussion.id:
            return HTTPSeeOther(request.route_url(
                'home', discussion_slug=discussion.slug))
        context['idea'] = idea

    canAddExtract = user_has_permission(discussion.id, user_id, P_ADD_EXTRACT)
    context['canAddExtract'] = canAddExtract
    context['canDisplayTabs'] = True
    preferences = discussion.preferences
    if user_id != Everyone:
        from assembl.models import UserPreferenceCollection
        user = User.get(user_id)
        preferences = UserPreferenceCollection(user_id, discussion)
        # TODO: user may not exist. Case of session with BD change.
        user.is_visiting_discussion(discussion.id)
        session = Discussion.default_db

        if '_LOCALE_' in request.cookies:
            locale = request.cookies['_LOCALE_']
            process_locale(locale, user, session,
                           LanguagePreferenceOrder.Cookie)

        elif '_LOCALE_' in request.params:
            locale = request.params['_LOCALE_']
            process_locale(locale, user, session,
                           LanguagePreferenceOrder.Parameter)
        else:
            locale = locale_negotiator(request)
            process_locale(locale, user, session,
                           LanguagePreferenceOrder.OS_Default)
    else:
        locale = request.localizer.locale_name

    target_locale = Locale.get_or_create(
        strip_country(locale), discussion.db)

    translation_service_data = {}
    try:
        service = discussion.translation_service()
        if service:
            translation_service_data = service.serviceData()
    except:
        pass
    context['translation_service_data_json'] = json.dumps(
        translation_service_data)
    locale_labels = json.dumps(
        DummyGoogleTranslationService.target_locale_labels_cls(target_locale))
    context['translation_locale_names_json'] = locale_labels

    context['preferences_json'] = json.dumps(dict(preferences))

    response = render_to_response('../../templates/index.jinja2', context,
                                  request=request)
    # Prevent caching the home, especially for proper login/logout
    response.cache_control.max_age = 0
    response.cache_control.prevent_auto = True
    return response
예제 #34
0
def home_view(request):
    user_id = authenticated_userid(request) or Everyone
    context = get_default_context(request)
    discussion = context["discussion"]
    request.session["discussion"] = discussion.slug
    canRead = user_has_permission(discussion.id, user_id, P_READ)
    if not canRead and user_id == Everyone:
        # User isn't logged-in and discussion isn't public:
        # redirect to login page
        login_url = request.route_url('contextual_login',
                                      discussion_slug=discussion.slug)
        return HTTPSeeOther(login_url)
    elif not canRead:
        # User is logged-in but doesn't have access to the discussion
        return HTTPUnauthorized()

    # if the route asks for a post, get post content (because this is needed for meta tags)
    route_name = request.matched_route.name
    if route_name == "purl_posts":
        post_id = FrontendUrls.getRequestedPostId(request)
        if not post_id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        post = Post.get_instance(post_id)
        if not post or post.discussion_id != discussion.id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        context['post'] = post
    elif route_name == "purl_idea":
        idea_id = FrontendUrls.getRequestedIdeaId(request)
        if not idea_id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        idea = Idea.get_instance(idea_id)
        if not idea or idea.discussion_id != discussion.id:
            return HTTPSeeOther(
                request.route_url('home', discussion_slug=discussion.slug))
        context['idea'] = idea

    canAddExtract = user_has_permission(discussion.id, user_id, P_ADD_EXTRACT)
    context['canAddExtract'] = canAddExtract
    context['canDisplayTabs'] = True
    if user_id != Everyone:
        from assembl.models import AgentProfile
        user = AgentProfile.get(user_id)
        # TODO: user may not exist. Case of session with BD change.
        user.is_visiting_discussion(discussion.id)
        session = Discussion.default_db
        current_prefs = session.query(UserLanguagePreference).\
            filter_by(user_id = user_id).all()
        user = session.query(User).filter_by(id=user_id).first()

        def validate_locale(l):
            return ensure_locale_has_country(to_posix_format(locale))

        if '_LOCALE_' in request.cookies:
            locale = request.cookies['_LOCALE_']
            posix_locale = validate_locale(locale)
            process_locale(posix_locale, user_id, current_prefs, session,
                           LanguagePreferenceOrder.Cookie)

        elif '_LOCALE_' in request.params:
            locale = request.params['_LOCALE_']
            posix_locale = validate_locale(locale)
            process_locale(posix_locale, user_id, current_prefs, session,
                           LanguagePreferenceOrder.Parameter)
        else:
            locale = default_locale_negotiator(request)
            posix_locale = validate_locale(locale)
            process_locale(posix_locale, user_id, current_prefs, session,
                           LanguagePreferenceOrder.OS_Default)

    response = render_to_response('../../templates/index.jinja2',
                                  context,
                                  request=request)
    # Prevent caching the home, especially for proper login/logout
    response.cache_control.max_age = 0
    response.cache_control.prevent_auto = True
    return response
예제 #35
0
def frontend_include(config):
    FrontendUrls.register_frontend_admin_routes(config)
예제 #36
0
파일: __init__.py 프로젝트: assembl/assembl
def backbone_include(config):
    FrontendUrls.register_frontend_routes(config)
    config.add_route('styleguide', '/styleguide')
    config.add_route('test', '/test')
예제 #37
0
def backbone_include(config):
    FrontendUrls.register_frontend_routes(config)
    config.add_route('styleguide', '/styleguide')
    config.add_route('test', '/test')
예제 #38
0
파일: __init__.py 프로젝트: assembl/assembl
def legacy_backbone_include(config):
    FrontendUrls.register_legacy_routes(config)
예제 #39
0
 def get_url(self):
     from assembl.lib.frontend_urls import FrontendUrls
     frontendUrls = FrontendUrls(self.discussion)
     return frontendUrls.get_post_url(self)
예제 #40
0
def legacy_backbone_include(config):
    FrontendUrls.register_legacy_routes(config)