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 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 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 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 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
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_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)
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_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_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(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)
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_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/{}/theme/'.format(phase.identifier) actual = frontend_urls.get_post_url(proposals_en_fr[0]) assert expected in actual
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_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 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(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
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_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 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 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 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 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
def get_url(self): from assembl.lib.frontend_urls import FrontendUrls frontendUrls = FrontendUrls(self.discussion) return frontendUrls.get_post_url(self)
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
def get_url(self, request=None): from assembl.lib.frontend_urls import FrontendUrls frontendUrls = FrontendUrls(self) return frontendUrls.get_discussion_url(request)
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
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
def frontend_include(config): FrontendUrls.register_frontend_admin_routes(config)
def backbone_include(config): FrontendUrls.register_frontend_routes(config) config.add_route('styleguide', '/styleguide') config.add_route('test', '/test')
def legacy_backbone_include(config): FrontendUrls.register_legacy_routes(config)