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']
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']
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
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)
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()
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)
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
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)
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)
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
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
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
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
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
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
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']
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
def get_url(self): from assembl.lib.frontend_urls import FrontendUrls frontendUrls = FrontendUrls(self.discussion) return frontendUrls.get_post_url(self)
def get_url(self, request=None): from assembl.lib.frontend_urls import FrontendUrls frontendUrls = FrontendUrls(self) return frontendUrls.get_discussion_url(request)