0001-publik-make-it-possible-to-create-publik-menu-from-p.patch
combo/apps/publik/views.py | ||
---|---|---|
17 | 17 |
import json |
18 | 18 | |
19 | 19 |
from django.conf import settings |
20 |
from django.contrib.auth.decorators import login_required |
|
20 | 21 |
from django.http import Http404, HttpResponse |
21 | 22 | |
23 |
from combo.data.models import Page |
|
24 | ||
25 | ||
26 |
def menuitem_url(request, page, subpage=None): |
|
27 |
if subpage and subpage.redirect_url: |
|
28 |
return subpage.get_redirect_url() |
|
29 |
elif subpage: |
|
30 |
return request.build_absolute_uri('/'.join(['', page.slug, subpage.slug, ''])) |
|
31 |
if page.redirect_url: |
|
32 |
return page.get_redirect_url() |
|
33 |
return request.build_absolute_uri('/'.join(['', page.slug, ''])) |
|
34 | ||
35 | ||
36 |
@login_required |
|
22 | 37 |
def services_js(request, *args, **kwargs): |
23 | 38 |
if not getattr(settings, 'KNOWN_SERVICES', None): |
24 | 39 |
raise Http404() |
25 | 40 |
services = [] |
26 | 41 |
portal_agent_url = None |
27 | 42 |
portal_agent_title = None |
28 |
for service_id, services_dict in settings.KNOWN_SERVICES.items(): |
|
29 |
for service_slug, service in services_dict.items(): |
|
30 |
if service.get('secondary') and service_id != 'authentic': |
|
43 |
menu_items = [] |
|
44 | ||
45 |
if getattr(settings, 'PUBLIK_EXPLICIT_MENU', False): |
|
46 |
pages = Page.objects.filter( |
|
47 |
parent_id__isnull=True, |
|
48 |
exclude_from_navigation=False) |
|
49 |
second_level_pages = Page.objects.filter( |
|
50 |
parent_id__in=[x.id for x in pages], |
|
51 |
exclude_from_navigation=False) |
|
52 |
for page in pages: |
|
53 |
if not page.is_visible(request.user, ignore_superuser=True): |
|
31 | 54 |
continue |
32 |
if service.get('is-portal-agent'): |
|
33 |
portal_agent_url = service['url'] |
|
34 |
portal_agent_title = service['title'] |
|
35 |
services.append({ |
|
36 |
'title': service['title'], |
|
37 |
'slug': service_slug, |
|
38 |
'service_id': service_id, |
|
39 |
'uniq': bool(len([x for x in services_dict.values() if not x.get('secondary')]) == 1), |
|
40 |
'url': service['url'], |
|
41 |
'backoffice_menu_url': service['backoffice-menu-url'], |
|
55 |
menu_items.append( |
|
56 |
{ |
|
57 |
'label': page.title, |
|
58 |
'url': menuitem_url(request, page), |
|
59 |
'slug': page.slug if page.slug != 'index' else 'home', |
|
60 |
'icon': request.build_absolute_uri(page.picture.url) if page.picture else None, |
|
42 | 61 |
}) |
62 |
for subpage in second_level_pages: |
|
63 |
if subpage.parent_id != page.id: |
|
64 |
continue |
|
65 |
if not subpage.is_visible(request.user, ignore_superuser=True): |
|
66 |
continue |
|
67 |
menu_items.append( |
|
68 |
{ |
|
69 |
'label': subpage.title, |
|
70 |
'sub': True, |
|
71 |
'url': menuitem_url(request, page, subpage), |
|
72 |
'slug': subpage.slug, |
|
73 |
'icon': request.build_absolute_uri(subpage.picture.url) if subpage.picture else None, |
|
74 |
}) |
|
75 |
else: |
|
76 |
for service_id, services_dict in settings.KNOWN_SERVICES.items(): |
|
77 |
for service_slug, service in services_dict.items(): |
|
78 |
if service.get('secondary') and service_id != 'authentic': |
|
79 |
continue |
|
80 |
if service.get('is-portal-agent'): |
|
81 |
portal_agent_url = service['url'] |
|
82 |
portal_agent_title = service['title'] |
|
83 |
services.append({ |
|
84 |
'title': service['title'], |
|
85 |
'slug': service_slug, |
|
86 |
'service_id': service_id, |
|
87 |
'uniq': bool(len([x for x in services_dict.values() if not x.get('secondary')]) == 1), |
|
88 |
'url': service['url'], |
|
89 |
'backoffice_menu_url': service['backoffice-menu-url'], |
|
90 |
}) |
|
91 | ||
43 | 92 |
response_vars = { |
44 | 93 |
'PUBLIK_ENVIRONMENT_LABEL': settings.TEMPLATE_VARS.get('environment_label'), |
45 | 94 |
'PUBLIK_PORTAL_AGENT_URL': portal_agent_url, |
46 | 95 |
'PUBLIK_PORTAL_AGENT_TITLE': portal_agent_title, |
47 | 96 |
'PUBLIK_PORTAL_AGENT_EXTRA_CSS': settings.TEMPLATE_VARS.get( |
48 | 97 |
'portal_agent_extra_css'), |
98 |
'PUBLIK_MENU_ITEMS': menu_items, |
|
99 |
'PUBLIK_EXPLICIT_MENU': getattr(settings, 'PUBLIK_EXPLICIT_MENU', False), |
|
49 | 100 |
'COMBO_KNOWN_SERVICES': services, |
50 | 101 |
} |
51 | 102 |
response_body = '\n'.join( |
combo/data/models.py | ||
---|---|---|
71 | 71 |
pass |
72 | 72 | |
73 | 73 | |
74 |
def element_is_visible(element, user=None): |
|
74 |
def element_is_visible(element, user=None, ignore_superuser=False):
|
|
75 | 75 |
if element.public: |
76 | 76 |
if getattr(element, 'restricted_to_unlogged', None) is True: |
77 | 77 |
return (user is None or user.is_anonymous) |
78 | 78 |
return True |
79 | 79 |
if user is None or user.is_anonymous: |
80 | 80 |
return False |
81 |
if user.is_superuser: |
|
81 |
if user.is_superuser and not ignore_superuser:
|
|
82 | 82 |
return True |
83 | 83 |
page_groups = element.groups.all() |
84 | 84 |
if not page_groups: |
... | ... | |
361 | 361 |
groupnames = ', '.join([x.name for x in groups]) if groups else _('logged users') |
362 | 362 |
return _('Private (%s)') % groupnames |
363 | 363 | |
364 |
def is_visible(self, user=None): |
|
365 |
return element_is_visible(self, user=user) |
|
364 |
def is_visible(self, user=None, ignore_superuser=False):
|
|
365 |
return element_is_visible(self, user=user, ignore_superuser=ignore_superuser)
|
|
366 | 366 | |
367 | 367 |
def get_cells(self): |
368 | 368 |
return CellBase.get_cells(page=self) |
tests/test_publik.py | ||
---|---|---|
1 |
import json |
|
2 |
import re |
|
3 | ||
1 | 4 |
import pytest |
2 | 5 |
from webtest import TestApp |
3 | 6 | |
4 | 7 |
from django.conf import settings |
8 |
from django.contrib.auth.models import User, Group |
|
9 | ||
10 |
from combo.data.models import Page |
|
11 | ||
12 |
from . import test_manager |
|
5 | 13 | |
6 | 14 |
pytestmark = pytest.mark.django_db |
7 | 15 | |
8 | 16 | |
17 |
def login(app): |
|
18 |
test_manager.login(app, username='normal-user', password='normal-user') |
|
19 | ||
20 | ||
21 |
@pytest.fixture |
|
22 |
def normal_user(): |
|
23 |
try: |
|
24 |
user = User.objects.get(username='normal-user') |
|
25 |
user.groups = [] |
|
26 |
except User.DoesNotExist: |
|
27 |
user = User.objects.create_user(username='normal-user', email='', password='normal-user') |
|
28 |
return user |
|
29 | ||
30 | ||
9 | 31 |
class KnownServices(object): |
10 | 32 |
def __init__(self, known_services): |
11 | 33 |
self.known_services = known_services |
... | ... | |
18 | 40 |
settings.KNOWN_SERVICES = self.orig_value |
19 | 41 | |
20 | 42 | |
21 |
def test_services_js_no_services(app): |
|
43 |
def test_services_js_no_services(app, normal_user):
|
|
22 | 44 |
with KnownServices({}): |
23 |
resp = app.get('/__services.js', status=404) |
|
45 |
app.get('/__services.js', status=302) |
|
46 |
login(app) |
|
47 |
app.get('/__services.js', status=404) |
|
48 | ||
24 | 49 | |
25 |
def test_services_js_multiple_wcs(app): |
|
50 |
def test_services_js_multiple_wcs(app, normal_user): |
|
51 |
login(app) |
|
26 | 52 |
resp = app.get('/__services.js', status=200) |
27 | 53 |
assert resp.content_type == 'text/javascript' |
28 | 54 |
assert 'var PUBLIK_ENVIRONMENT_LABEL = null' in resp.text |
29 | 55 |
assert 'var PUBLIK_PORTAL_AGENT_URL = null' in resp.text |
30 | 56 |
assert '"uniq": false' in resp.text |
31 | 57 | |
32 |
def test_services_js_portal_agent(app): |
|
58 | ||
59 |
def test_services_js_portal_agent(app, normal_user): |
|
60 |
app.get('/__services.js', status=302) # authentication required |
|
61 |
login(app) |
|
33 | 62 |
known_services = { |
34 | 63 |
'combo': { |
35 | 64 |
'portal-agent': { |
... | ... | |
50 | 79 |
assert resp.content_type == 'text/javascript' |
51 | 80 |
assert 'var PUBLIK_PORTAL_AGENT_URL = "http://example.net";' in resp.text |
52 | 81 |
assert 'var PUBLIK_PORTAL_AGENT_TITLE = "Portal Agent"' in resp.text |
82 | ||
83 | ||
84 |
def test_services_js_explicit_menu(app, normal_user, settings): |
|
85 |
settings.PUBLIK_EXPLICIT_MENU = True |
|
86 | ||
87 |
group1 = Group.objects.create(name='plop1') |
|
88 |
group2 = Group.objects.create(name='plop2') |
|
89 | ||
90 |
index_page = Page.objects.create(title='Home', slug='index', |
|
91 |
template_name='standard', public=False, |
|
92 |
exclude_from_navigation=False) |
|
93 |
index_page.groups.set([group1]) |
|
94 |
other_page = Page.objects.create(title='Page', slug='page', |
|
95 |
template_name='standard', public=False, |
|
96 |
exclude_from_navigation=False) |
|
97 |
other_page.groups.set([group1]) |
|
98 |
sub_page = Page.objects.create(title='Subpage', slug='subpage', |
|
99 |
template_name='standard', parent=other_page, public=False, |
|
100 |
exclude_from_navigation=False) |
|
101 |
sub_page.groups.set([group2]) |
|
102 |
last_page = Page.objects.create(title='Last page', slug='lastpage', |
|
103 |
template_name='standard', public=False, |
|
104 |
exclude_from_navigation=False) |
|
105 |
last_page.groups.set([group1]) |
|
106 | ||
107 |
def get_menu_var(resp): |
|
108 |
return json.loads(re.findall('var PUBLIK_MENU_ITEMS = (.*);', resp.text)[0]) |
|
109 | ||
110 |
login(app) |
|
111 |
resp = app.get('/__services.js', status=200) |
|
112 |
assert [x['slug'] for x in get_menu_var(resp)] == [] |
|
113 | ||
114 |
normal_user.groups.set([group1]) |
|
115 |
resp = app.get('/__services.js', status=200) |
|
116 |
assert [x['slug'] for x in get_menu_var(resp)] == ['home', 'page', 'lastpage'] |
|
117 |
assert len(get_menu_var(resp)) == 3 |
|
118 | ||
119 |
normal_user.groups.set([group1, group2]) |
|
120 |
resp = app.get('/__services.js', status=200) |
|
121 |
assert [x['slug'] for x in get_menu_var(resp)] == ['home', 'page', 'subpage', 'lastpage'] |
|
53 |
- |