Projet

Général

Profil

0001-publik-make-it-possible-to-create-publik-menu-from-p.patch

Frédéric Péters, 04 août 2020 17:46

Télécharger (10 ko)

Voir les différences:

Subject: [PATCH] publik: make it possible to create publik menu from pages
 (#45741)

 combo/apps/publik/views.py | 77 +++++++++++++++++++++++++++++++-------
 combo/data/models.py       |  8 ++--
 tests/test_publik.py       | 77 ++++++++++++++++++++++++++++++++++++--
 3 files changed, 141 insertions(+), 21 deletions(-)
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
-