Skip to content
Snippets Groups Projects
Commit c61daa81 authored by Andreas Valder's avatar Andreas Valder
Browse files

added navbar support for grouped links

parent a340a6d4
Branches
No related tags found
No related merge requests found
from server import * from server import *
from datetime import time from datetime import time
@register_navbar('Schnittfortschritt User', icon='spinner', iconlib='fa', userendpoint=True) @register_navbar('Schnittfortschritt User', icon='spinner', iconlib='fa', userendpoint=True, endpoint='cutprogress_user')
@app.route('/internal/user/<int:user>/cutprogress')
@mod_required
def cutprogress_user(user):
return cutprogress(user)
@register_navbar('Schnittfortschritt', icon='spinner', iconlib='fa') @register_navbar('Schnittfortschritt', icon='spinner', iconlib='fa')
@app.route('/internal/cutprogress', endpoint="cutprogress") @app.route('/internal/cutprogress', endpoint="cutprogress")
@app.route('/internal/user/<int:user>/cutprogress', endpoint='cutprogress_user')
@mod_required @mod_required
def cutprogress(user=None): def cutprogress(user=None):
allsemester = query('SELECT DISTINCT semester from courses ORDER BY semester DESC'); allsemester = query('SELECT DISTINCT semester from courses ORDER BY semester DESC');
......
...@@ -192,7 +192,7 @@ def create(table): ...@@ -192,7 +192,7 @@ def create(table):
return str(id), 200 return str(id), 200
@app.route('/internal/changelog') @app.route('/internal/changelog')
@register_navbar('Changelog', icon='book') @register_navbar('Changelog', icon='book', group='weitere')
@mod_required @mod_required
def changelog(): def changelog():
if 'page' in request.args: if 'page' in request.args:
......
...@@ -33,7 +33,7 @@ def restart_job(job_id, canceled=False): ...@@ -33,7 +33,7 @@ def restart_job(job_id, canceled=False):
modify('UPDATE jobs SET state = "ready" WHERE id = ? AND state = "failed" AND NOT canceled', job_id) modify('UPDATE jobs SET state = "ready" WHERE id = ? AND state = "failed" AND NOT canceled', job_id)
@app.route('/internal/jobs/overview') @app.route('/internal/jobs/overview')
@register_navbar('Jobs', iconlib='fa', icon='suitcase') @register_navbar('Jobs', iconlib='fa', icon='suitcase', group='weitere')
@mod_required @mod_required
def jobs_overview(): def jobs_overview():
if 'page' in request.args: if 'page' in request.args:
......
...@@ -75,26 +75,14 @@ def evalperm(perms): ...@@ -75,26 +75,14 @@ def evalperm(perms):
return cperms return cperms
return [{'type': 'public'}] return [{'type': 'public'}]
app.jinja_env.globals['navbar'] = []
# iconlib can be 'bootstrap'
# ( see: http://getbootstrap.com/components/#glyphicons )
# or 'fa'
# ( see: http://fontawesome.io/icons/ )
def register_navbar(name, iconlib='bootstrap', icon=None, userendpoint=False):
def wrapper(func):
endpoint = func.__name__
app.jinja_env.globals['navbar'].append((endpoint, name, iconlib, icon, not endpoint in mod_endpoints, userendpoint))
return func
return wrapper
from db import query, modify, show, searchquery from db import query, modify, show, searchquery
from template_helper import *
from mail import notify_mods, notify_admins from mail import notify_mods, notify_admins
from ldap import ldapauth from ldap import ldapauth
from legacy import legacy_index from legacy import legacy_index
from scheduler import sched_func from scheduler import sched_func
from template_helper import *
def render_endpoint(endpoint, flashtext=None, **kargs): def render_endpoint(endpoint, flashtext=None, **kargs):
if flashtext: if flashtext:
flash(flashtext) flash(flashtext)
...@@ -458,7 +446,7 @@ def sitemap(): ...@@ -458,7 +446,7 @@ def sitemap():
return Response(render_template('sitemap.xml', pages=pages), 200, {'Content-Type': 'application/atom+xml'} ) return Response(render_template('sitemap.xml', pages=pages), 200, {'Content-Type': 'application/atom+xml'} )
@app.route('/internal/dbstatus') @app.route('/internal/dbstatus')
@register_navbar('DB-Status', icon='ok') @register_navbar('DB-Status', icon='ok', group='weitere')
@mod_required @mod_required
def dbstatus(): def dbstatus():
hosts = set() hosts = set()
......
...@@ -3,7 +3,7 @@ import traceback ...@@ -3,7 +3,7 @@ import traceback
import os.path import os.path
@app.route('/internal/sort/log') @app.route('/internal/sort/log')
@register_navbar('Sortierlog', icon='sort-by-attributes-alt') @register_navbar('Sortierlog', icon='sort-by-attributes-alt', group='weitere')
@mod_required @mod_required
def sort_log(): def sort_log():
return render_template('sortlog.html',sortlog=query(''' return render_template('sortlog.html',sortlog=query('''
......
...@@ -20,8 +20,29 @@ app.jinja_env.globals['gitversion'] = {'hash': output[1], 'longhash': output[0], ...@@ -20,8 +20,29 @@ app.jinja_env.globals['gitversion'] = {'hash': output[1], 'longhash': output[0],
def ismod(*args): def ismod(*args):
return ('user' in session) return ('user' in session)
csrf_endpoints = [] app.jinja_env.globals['navbar'] = []
# iconlib can be 'bootstrap'
# ( see: http://getbootstrap.com/components/#glyphicons )
# or 'fa'
# ( see: http://fontawesome.io/icons/ )
def register_navbar(name, iconlib='bootstrap', icon=None, userendpoint=False, group=None, endpoint=None):
def wrapper(func):
urlendpoint = endpoint
if not endpoint:
urlendpoint = func.__name__
item = {}
item['iconlib'] = iconlib
item['icon'] = icon
item['userendpoint'] = userendpoint
item['group'] = group
item['endpoint'] = urlendpoint
item['visible'] = not urlendpoint in mod_endpoints
item['name'] = name
app.jinja_env.globals['navbar'].append(item)
return func
return wrapper
csrf_endpoints = []
def csrf_protect(func): def csrf_protect(func):
csrf_endpoints.append(func.__name__) csrf_endpoints.append(func.__name__)
@wraps(func) @wraps(func)
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<html lang="de"> <html lang="de">
<head> <head>
{% block header %} {% block header %}
<title>Video AG {% block title %}{% for endpoint, caption, iconlib, gly, visible, userendpoint in navbar if ((visible or ismod()) and (endpoint == request.endpoint)) %}- {{ caption }}{% else%}{% endfor %}{% endblock %}</title> <title>Video AG {% block title %}{% for n in navbar if ((n.visible or ismod()) and (endpoint == request.endpoint)) %}- {{ n.name }}{% endfor %}{% endblock %}</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" type="image/png" href="{{url_for('static', filename='favicon.png')}}"> <link rel="icon" type="image/png" href="{{url_for('static', filename='favicon.png')}}">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
...@@ -43,6 +43,20 @@ ...@@ -43,6 +43,20 @@
</head> </head>
<body> <body>
{% block navbar %} {% block navbar %}
{% macro navbaricon(data, user=none) -%}
<li{% if data.endpoint == request.endpoint %} class="active"{% endif %}>
<a href="{{ url_for(data.endpoint, user=user) }}" style="padding: 10px 6px;">
{% if data.gly != '' %}
{% if data.iconlib == 'bootstrap' %}
<span aria-hidden="true" class="glyphicon glyphicon-{{ data.icon }}"></span>
{% elif data.iconlib == 'fa' %}
<span aria-hidden="true" class="fa fa-{{ data.icon }}"></span>
{% endif %}
{{ data.name }}
{% endif %}
</a>
</li>
{%- endmacro %}
<nav class="hidden-print navbar navbar-default navbar-static-top" {% if config.DEBUG %} style="background-color: red" {% endif %} > <nav class="hidden-print navbar navbar-default navbar-static-top" {% if config.DEBUG %} style="background-color: red" {% endif %} >
<div class="container-fluid"> <div class="container-fluid">
<div class="navbar-header"> <div class="navbar-header">
...@@ -56,39 +70,27 @@ ...@@ -56,39 +70,27 @@
<img alt="Brand" src="{{url_for('static', filename='logo.png')}}" style="height: 44px; width: 44px" > <img alt="Brand" src="{{url_for('static', filename='logo.png')}}" style="height: 44px; width: 44px" >
</a> </a>
<ul class="nav nav-pills" style="margin-top: 5px; padding-left: 40px;"> <ul class="nav nav-pills" style="margin-top: 5px; padding-left: 40px;">
{% for endpoint, caption, iconlib, gly, visible, userendpoint in navbar if visible and (not userendpoint) %} {% for n in navbar if n.visible and (not n.userendpoint) %}
<li{% if endpoint == request.endpoint %} class="active"{% endif %}> {{ navbaricon(n) }}
<a href="{{ url_for(endpoint) }}" style="padding: 10px 6px;">
{% if gly != '' %}
{% if iconlib == 'bootstrap' %}
<span aria-hidden="true" class="glyphicon glyphicon-{{ gly }}"></span>
{% elif iconlib == 'fa' %}
<span aria-hidden="true" class="fa fa-{{ gly }}"></span>
{% endif %}
{{ caption }}
{% endif %}
</a>
</li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
<div class="collapse navbar-collapse" style="overflow-y: inherit"> <div class="collapse navbar-collapse" style="overflow-y: inherit">
<ul class="nav nav-pills" style="margin-top: 5px;"> <ul class="nav nav-pills" style="margin-top: 5px;">
{% for endpoint, caption, iconlib, gly, visible, userendpoint in navbar if (not visible) and ismod() and (not userendpoint) %} {% for n in navbar if (not n.visible) and ismod() and (not n.userendpoint) and (not n.group) %}
<li{% if endpoint == request.endpoint %} class="active"{% endif %}> {{ navbaricon(n) }}
<a href="{{ url_for(endpoint) }}" style="padding: 10px 6px;">
{% if gly != '' %}
{% if iconlib == 'bootstrap' %}
<span aria-hidden="true" class="glyphicon glyphicon-{{ gly }}"></span>
{% elif iconlib == 'fa' %}
<span aria-hidden="true" class="fa fa-{{ gly }}"></span>
{% endif %}
{{ caption }}
{% endif %}
</a>
</li>
{% endfor %} {% endfor %}
{% for grouper, list in navbar|rejectattr("group", "none")|groupby("group") %}
<li{% if request.endpoint in list|map(attribute='endpoint') %} class="active dropdown"{% endif %}>
<a data-toggle="dropdown" data-boundary="viewport" class="dropdown-toggle" style="padding: 10px 6px;">{{ grouper }}<span class="caret"></span></a>
<ul class="dropdown-menu">
{% for n in list %}
{{ navbaricon(n) }}
{% endfor %}
</ul>
</li>
{% endfor %}
<li class="col-xs-9 col-sm-4 pull-right"> <li class="col-xs-9 col-sm-4 pull-right">
<form action="{{ url_for('search') }}" role="search"> <form action="{{ url_for('search') }}" role="search">
<div class="input-group" style="margin-top: 3px"> <div class="input-group" style="margin-top: 3px">
...@@ -116,19 +118,8 @@ ...@@ -116,19 +118,8 @@
{% else %} {% else %}
<button data-toggle="dropdown" data-boundary="viewport" class="btn dropdown-toggle" style="padding: 10px 6px;">{{ session.user.givenName }} <span class="caret"></span></button> <button data-toggle="dropdown" data-boundary="viewport" class="btn dropdown-toggle" style="padding: 10px 6px;">{{ session.user.givenName }} <span class="caret"></span></button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{% for endpoint, caption, iconlib, gly, visible, userendpoint in navbar if userendpoint %} {% for n in navbar if n.userendpoint %}
<li{% if endpoint == request.endpoint %} class="active"{% endif %}> {{ navbaricon(n, user=session.user.dbid) }}
<a href="{{ url_for(endpoint, user=session.user.dbid) }}">
{% if gly != '' %}
{% if iconlib == 'bootstrap' %}
<span aria-hidden="true" class="glyphicon glyphicon-{{ gly }}"></span>
{% elif iconlib == 'fa' %}
<span aria-hidden="true" class="fa fa-{{ gly }}"></span>
{% endif %}
{{ caption }}
{% endif %}
</a>
</li>
{% endfor %} {% endfor %}
<li class="divider"></li> <li class="divider"></li>
<li><a href="{{url_for('logout', ref=request.url)}}">Logout</a></li> <li><a href="{{url_for('logout', ref=request.url)}}">Logout</a></li>
......
from server import * from server import *
from datetime import time from datetime import time
@app.route('/internal/user/<int:user>/timetable') @register_navbar('personalisierter Drehplan', icon='calendar', userendpoint=True, endpoint='timetable_user')
@register_navbar('personalisierter Drehplan', icon='calendar', userendpoint=True)
@mod_required
def timetable_user(user):
return timetable(user)
@app.route('/internal/timetable')
@register_navbar('Drehplan', icon='calendar') @register_navbar('Drehplan', icon='calendar')
@app.route('/internal/timetable')
@app.route('/internal/user/<int:user>/timetable', endpoint='timetable_user')
@mod_required @mod_required
def timetable(user=None): def timetable(user=None):
if 'kw' not in request.args: if 'kw' not in request.args:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment