mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-12-23 15:33:45 +00:00
Refactor navbar and general frontend.
The menus of the navbar is reorganized The footer is changed into a navbar The right sidebar is placed to the left The left sidebar is deleted Header navbar and leftsidebar are now fixed Physical grouing is split into 4 views
This commit is contained in:
parent
1fd8863370
commit
fd006c505a
18 changed files with 896 additions and 609 deletions
|
@ -27,43 +27,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
{% can_create CustomInvoice %}
|
|
||||||
<a class="list-group-item list-group-item-success" href="{% url 'cotisations:new-custom-invoice' %}">
|
|
||||||
<i class="fa fa-plus"></i> {% trans "Create an invoice" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-warning" href="{% url 'cotisations:control' %}">
|
|
||||||
<i class="fa fa-eye"></i> {% trans "Control the invoices" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Facture %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index' %}">
|
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Invoices" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all CustomInvoice %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-custom-invoice' %}">
|
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Custom invoices" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all CostEstimate %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-cost-estimate' %}">
|
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Cost estimates" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Article %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-article' %}">
|
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Articles" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Banque %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-banque' %}">
|
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Banks" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Paiement %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'cotisations:index-paiement' %}">
|
|
||||||
<i class="fa fa-list-ul"></i> {% trans "Payment methods" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -27,35 +27,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
{% can_view_app logs %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:index' %}">
|
|
||||||
<i class="fa fa-clipboard"></i>
|
|
||||||
{% trans "Summary" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:stats-logs' %}">
|
|
||||||
<i class="fa fa-calendar"></i>
|
|
||||||
{% trans "Events" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:stats-general' %}">
|
|
||||||
<i class="fa fa-area-chart"></i>
|
|
||||||
{% trans "General" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:stats-models' %}">
|
|
||||||
<i class="fa fa-database"></i>
|
|
||||||
{% trans "Database" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:stats-actions' %}">
|
|
||||||
<i class="fa fa-plug"></i>
|
|
||||||
{% trans "Wiring actions" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:stats-users' %}">
|
|
||||||
<i class="fa fa-users"></i>
|
|
||||||
{% trans "Users" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'logs:stats-search-machine' %}">
|
|
||||||
<i class="fa fa-desktop"></i>
|
|
||||||
{% trans "Machine history" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -27,59 +27,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
{% can_view_all Machine %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Machines" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all MachineType %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-machinetype' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Machine types" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Extension %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-extension' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Extensions and zones" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all IpType %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-iptype' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "IP ranges" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Vlan %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-vlan' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "VLANs" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Nas %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-nas' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "NAS devices" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all machines.Service %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-service' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Services (DHCP, DNS, ...)" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Role %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-role' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Server roles" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all OuverturePortList %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'machines:index-portlist' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Ports openings" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% block title %}{% trans "Preferences" %}{% endblock %}
|
{% block title %}{% trans "Preferences" %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
<h2>{% trans "Preferences" %}</h2>
|
||||||
<div id="accordion">
|
<div id="accordion">
|
||||||
|
|
||||||
<div class="panel panel-default" id="general">
|
<div class="panel panel-default" id="general">
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
/* For the footer to be at the bottom*/
|
||||||
|
body {
|
||||||
|
padding-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
min-height: calc(100vh - 100px);
|
||||||
|
}
|
||||||
|
|
||||||
/* Footer */
|
/* Footer */
|
||||||
footer {
|
footer {
|
||||||
padding-top: 3rem;
|
padding-top: 3rem;
|
||||||
|
@ -70,10 +79,52 @@ a > i.fa {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set gray background color */
|
/* Set gray background color */
|
||||||
.sidenav {
|
@media (min-width: 768px) {
|
||||||
background-color: #f1f1f1;
|
.sidenav-right {
|
||||||
border: 1px solid #e0e0e0;
|
position: fixed;
|
||||||
border-radius: 0 0 5px 5px;
|
top:50px;
|
||||||
|
right:0;
|
||||||
|
}
|
||||||
|
.sidenav-left {
|
||||||
|
position: fixed;
|
||||||
|
top:50px;
|
||||||
|
left:0;
|
||||||
|
}
|
||||||
|
.dropdown-menu .dropdown-toggle:after {
|
||||||
|
border-top: .3em solid transparent;
|
||||||
|
border-right: 0;
|
||||||
|
border-bottom: .3em solid transparent;
|
||||||
|
border-left: .3em solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu .dropdown-menu {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu li {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-item .submenu {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
left: 100%;
|
||||||
|
top: -7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-item .submenu-left {
|
||||||
|
right: 100%;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu>li:hover {
|
||||||
|
background-color: #f1f1f1
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu>li:hover>.submenu {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {
|
.table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
@ -148,3 +199,11 @@ dl.profile-info > div {
|
||||||
[data-toggle~="collapse"] {
|
[data-toggle~="collapse"] {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Indent for submenu when collapsed */
|
||||||
|
|
||||||
|
@media (max-width:767px) {
|
||||||
|
.submenu > li {
|
||||||
|
margin-left:20px;
|
||||||
|
}
|
||||||
|
};
|
42
static/js/main.js
Normal file
42
static/js/main.js
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
function adjustHeader(){
|
||||||
|
/* This function is here to adjust the header if the header navbar
|
||||||
|
goes into two lines. This can't happen if the width is sm or less,
|
||||||
|
and we shouldn't adjust in this case. */
|
||||||
|
if ($(window).width() >= 768) {
|
||||||
|
$('body').css('padding-top', $("#navbar-header").height());
|
||||||
|
$('.sidenav-left').css('top', $("#navbar-header").height());
|
||||||
|
} else {
|
||||||
|
$('body').css('padding-top', '');
|
||||||
|
$('.sidenav-left').css('top', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function listenSubmenu() {
|
||||||
|
/* Add listeners on sm screen or less for submenus. */
|
||||||
|
if ($(window).width() < 767) {
|
||||||
|
$('.dropdown-menu a').click(function (e) {
|
||||||
|
if ($(this).next('.submenu').length) {
|
||||||
|
e.preventDefault();
|
||||||
|
$(this).next('.submenu').toggle();
|
||||||
|
}
|
||||||
|
$('.dropdown').on('hide.bs.dropdown', function () {
|
||||||
|
$(this).find('.submenu').hide();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We need to apply those functions at init and when the screen is resized. */
|
||||||
|
|
||||||
|
$(window).resize(function () {
|
||||||
|
adjustHeader();
|
||||||
|
listenSubmenu();
|
||||||
|
});
|
||||||
|
|
||||||
|
adjustHeader();
|
||||||
|
listenSubmenu();
|
||||||
|
|
||||||
|
|
||||||
|
$(document).on('click', '.dropdown-menu', function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
|
@ -3,8 +3,8 @@ Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
se veut agnostique au réseau considéré, de manière à être installable en
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
quelques clics.
|
quelques clics.
|
||||||
|
|
||||||
Copyright © 2017 Lara Kermarec
|
Copyright © 2017 Lara Kermarec
|
||||||
Copyright © 2017 Augustin Lemesle
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,7 +13,7 @@ the Free Software Foundation; either version 2 of the License, or
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
|
@ -32,327 +32,82 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% self_adhesion as var_sa %}
|
{% self_adhesion as var_sa %}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
<head prefix="og: http://ogp.me/ns#">
|
|
||||||
{# Open Graph for social media #}
|
|
||||||
<meta property="og:title" content="{{ name_website }}" />
|
|
||||||
<meta property="og:type" content="website" />
|
|
||||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/" />
|
|
||||||
<meta property="og:image" content="{% static 'images/logo_re2o.svg' %}"/>
|
|
||||||
<meta property="og:image:type" content="image/svg"/>
|
|
||||||
<meta property="og:image:alt" content="The Re2o logo"/>
|
|
||||||
<meta property="og:description" content="Networking managing website endorsed by FedeRez." />
|
|
||||||
|
|
||||||
{# Preload JavaScript #}
|
<head prefix="og: http://ogp.me/ns#">
|
||||||
{% bootstrap_javascript %}
|
{# Open Graph for social media #}
|
||||||
<script src="/static/js/typeahead/typeahead.js"></script>
|
<meta property="og:title" content="{{ name_website }}" />
|
||||||
<script src="/static/js/bootstrap-tokenfield/bootstrap-tokenfield.js"></script>
|
<meta property="og:type" content="website" />
|
||||||
<script src="{% static 'js/collapse-from-url.js' %}"></script>
|
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/" />
|
||||||
|
<meta property="og:image" content="{% static 'images/logo_re2o.svg' %}" />
|
||||||
|
<meta property="og:image:type" content="image/svg" />
|
||||||
|
<meta property="og:image:alt" content="The Re2o logo" />
|
||||||
|
<meta property="og:description" content="Networking managing website endorsed by FedeRez." />
|
||||||
|
|
||||||
{% block custom_js %}{% endblock %}
|
{# Preload JavaScript #}
|
||||||
|
{% bootstrap_javascript %}
|
||||||
|
<script src="/static/js/typeahead/typeahead.js"></script>
|
||||||
|
<script src="/static/js/bootstrap-tokenfield/bootstrap-tokenfield.js"></script>
|
||||||
|
<script src="{% static 'js/collapse-from-url.js' %}"></script>
|
||||||
|
|
||||||
{# Load CSS #}
|
{% block custom_js %}{% endblock %}
|
||||||
{% bootstrap_css %}
|
|
||||||
<link href="{% static 'css/typeaheadjs.css' %}" rel="stylesheet">
|
|
||||||
<link href="{% static 'css/bootstrap-tokenfield.css' %}" rel="stylesheet">
|
|
||||||
<link href="{% static 'css/font-awesome.min.css' %}" rel="stylesheet">
|
|
||||||
<link href="{% static 'css/base.css' %}" rel="stylesheet">
|
|
||||||
|
|
||||||
{# Favicon with iOS, Android, touchbar support #}
|
{# Load CSS #}
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="{% static 'favicon/apple-touch-icon.png' %}">
|
{% bootstrap_css %}
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="{% static 'favicon/favicon-32x32.png' %}">
|
<link href="{% static 'css/typeaheadjs.css' %}" rel="stylesheet">
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="{% static 'favicon/favicon-16x16.png' %}">
|
<link href="{% static 'css/bootstrap-tokenfield.css' %}" rel="stylesheet">
|
||||||
<link rel="manifest" href="{% static 'favicon/site.webmanifest' %}">
|
<link href="{% static 'css/font-awesome.min.css' %}" rel="stylesheet">
|
||||||
<link rel="mask-icon" href="{% static 'favicon/safari-pinned-tab.svg' %}" color="#5bbad5">
|
<link href="{% static 'css/base.css' %}" rel="stylesheet">
|
||||||
<link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}">
|
|
||||||
<meta name="theme-color" content="#ffffff">
|
|
||||||
|
|
||||||
{# Do not allow zooming on devices #}
|
{# Favicon with iOS, Android, touchbar support #}
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<link rel="apple-touch-icon" sizes="180x180" href="{% static 'favicon/apple-touch-icon.png' %}">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="{% static 'favicon/favicon-32x32.png' %}">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="{% static 'favicon/favicon-16x16.png' %}">
|
||||||
|
<link rel="manifest" href="{% static 'favicon/site.webmanifest' %}">
|
||||||
|
<link rel="mask-icon" href="{% static 'favicon/safari-pinned-tab.svg' %}" color="#5bbad5">
|
||||||
|
<link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}">
|
||||||
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
|
||||||
<title>{{ name_website }} : {% block title %}{% trans "Home" %}{% endblock %}</title>
|
{# Do not allow zooming on devices #}
|
||||||
</head>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
<body id="main">
|
<title>{{ name_website }} : {% block title %}{% trans "Home" %}{% endblock %}</title>
|
||||||
<nav class="navbar navbar-inverse navbar-static-top">
|
</head>
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="navbar-header">
|
|
||||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
</button>
|
|
||||||
<a class="navbar-brand" href="/">
|
|
||||||
<img src="{% static 'images/logo_re2o_navbar.svg' %}" height=32>
|
|
||||||
{{ name_website }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="collapse navbar-collapse" id="myNavbar">
|
|
||||||
<ul class="nav navbar-nav">
|
|
||||||
{% can_view_any_app users machines cotisations %}
|
|
||||||
<li class="dropdown">
|
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><i class="fa fa-users"></i> {% trans "Users" %}<span class="caret"></span></a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
{% can_view_app users %}
|
|
||||||
<li><a href="{% url 'users:index' %}"><i class="fa fa-user"></i> {% trans "Manage the users" %}</a></li>
|
|
||||||
<li><a href="{% url 'users:index-clubs' %}"><i class="fa fa-users"></i> {% trans "Manage the clubs" %}</a></li>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_app machines %}
|
|
||||||
<li><a href="{% url 'machines:index' %}"><i class="fa fa-desktop"></i> {% trans "Manage the machines" %}</a></li>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_app cotisations %}
|
|
||||||
<li><a href="{% url 'cotisations:index' %}"><i class="fa fa-eur"></i> {% trans "Manage the subscriptions" %}</a></li>
|
|
||||||
{% acl_end %}
|
|
||||||
|
|
||||||
{% for app, template in optionnal_templates_navbar_user_list %}
|
<body id="main">
|
||||||
{% if app != 'topologie' %}
|
|
||||||
{{ template }}
|
{% include 'nav.html' %}
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
<div class="container-fluid text-center content">
|
||||||
</ul>
|
<div class="row content">
|
||||||
</li>
|
<div class="col-sm-2 sidenav-left pt4">
|
||||||
{% acl_end %}
|
{% include 'sidebar.html' %}
|
||||||
{% can_view_app topologie %}
|
|
||||||
<li class="dropdown">
|
{% block sidebar %}
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><i class="fa fa-sitemap"></i> {% trans "Topology" %}<span class="caret"></span></a>
|
{% endblock %}
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a href="{% url 'topologie:index' %}"><i class="fa fa-microchip"></i> {% trans "Switches" %}</a></li>
|
|
||||||
<li><a href="{% url 'topologie:index-ap' %}"><i class="fa fa-wifi"></i> {% trans "Access points" %}</a></li>
|
|
||||||
<li><a href="{% url 'topologie:index-room' %}"><i class="fa fa-home"></i> {% trans "Rooms" %}</a></li>
|
|
||||||
{% for app, template in optionnal_templates_navbar_user_list %}
|
|
||||||
{% if app == 'topologie' %}
|
|
||||||
{{ template }}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_app logs %}
|
|
||||||
<li><a href="{% url 'logs:index' %}"><i class="fa fa-area-chart"></i> {% trans "Statistics" %}</a></li>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_app preferences %}
|
|
||||||
<li>
|
|
||||||
<a href="{% url 'preferences:display-options' %}">
|
|
||||||
<i class="fa fa-cogs"></i> {% trans "Administration" %}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% acl_end %}
|
|
||||||
</ul>
|
|
||||||
<ul class="nav navbar-nav navbar-right">
|
|
||||||
<li class="dropdown">
|
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><i class="fa fa-info"></i> {% trans "Information and contact" %}<span class="caret"></span></a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a href="{% url 'about' %}"><i class="fa fa-info-circle"></i> {% trans "About" %}</a></li>
|
|
||||||
<li><a href="{% url 'contact' %}"><i class="fa fa-at"></i> {% trans "Contact" %}</a></li>
|
|
||||||
{% comment %}
|
|
||||||
<li><a href="{% url 'tickets:new-ticket' %}"><i class="fa fa-ticket"></i> {% trans "Open a ticket" %}</a><li>
|
|
||||||
{% endcomment %}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{% if not request.user.is_authenticated %}
|
|
||||||
{% for template in optionnal_templates_navbar_logout_list %}
|
|
||||||
{{ template }}
|
|
||||||
{% endfor %}
|
|
||||||
{% if var_sa %}
|
|
||||||
<li>
|
|
||||||
<a href="{% url 'users:new-user' %}">
|
|
||||||
<i class="fa fa-user-plus"></i> {% trans "Sign up" %}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
<li>
|
|
||||||
<a id="toggle_login" href="{% url 'login' %}">
|
|
||||||
<i class="fa fa-sign-in"></i> {% trans "Log in" %}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% else %}
|
|
||||||
{% can_view_any_app users machines cotisations %}
|
|
||||||
<li>
|
|
||||||
<form action="{% url 'search:search' %}" class="navbar-form" role="search">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="text" class="form-control" placeholder="{% trans "Search" %}" name="q" id="search-term" {% if search_term %}value="{{ search_term }}"{% endif %}>
|
|
||||||
<div class="input-group-btn">
|
|
||||||
<button class="btn btn-default" type="submit"><i class="fa fa-search"></i></button>
|
|
||||||
<a href="{% url 'search:searchp' %}" class="btn btn-default" role="button"><i class="fa fa-plus"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</li>
|
|
||||||
{% acl_end %}
|
|
||||||
{% endif %}
|
|
||||||
{% if request.user.is_authenticated %}
|
|
||||||
<li class="dropdown">
|
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><i class="fa fa-user-circle"></i> {{ request.user.pseudo|slice:":15" }} <span class="caret"></span></a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a href="{% url 'users:mon-profil' %}"><i class="fa fa-user"></i> {% trans "My profile" %}</a></li>
|
|
||||||
<li><a id="toggle_login" href="{% url 'logout' %}"><i class="fa fa-sign-out"></i> {% trans "Log out" %}</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
<li>
|
|
||||||
{% include 'buttons/setlang.html' %}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
<div class="col-sm-offset-2 col-sm-10 text-left pt4">
|
||||||
|
{# Display django.contrib.messages as Bootstrap alerts #}
|
||||||
<div class="container-fluid text-center">
|
{% bootstrap_messages %}
|
||||||
<div class="row content">
|
{% block content %}{% endblock %}
|
||||||
<div class="col-sm-2 sidenav pt4">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="text-left list-group">
|
|
||||||
{% block sidebar %}
|
|
||||||
{% endblock %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-8 text-left pt4">
|
|
||||||
{# Display django.contrib.messages as Bootstrap alerts #}
|
|
||||||
{% bootstrap_messages %}
|
|
||||||
{% block content %}{% endblock %}
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-2 sidenav pt4">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
{% if request_user.is_authenticated %}
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h4>{{ request_user.name }} {{ request_user.surname }}</h4>
|
|
||||||
</div>
|
|
||||||
<table class="table visible-sm visible-md">
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<b>{% trans "Username" %}</b>
|
|
||||||
<br>
|
|
||||||
{{ request_user.pseudo }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<b>{% trans "Room" %}</b>
|
|
||||||
<br>
|
|
||||||
{{ request_user.room }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<b>{% trans "Internet access" %}</b>
|
|
||||||
<br>
|
|
||||||
{% if request_user.has_access %}
|
|
||||||
<i class="text-success">{% blocktrans with end_access_date=request.user.end_access|date:"d b Y" %}Until {{ end_access_date }}{% endblocktrans %}</i>
|
|
||||||
{% else %}
|
|
||||||
<i class="text-danger">{% trans "Disabled" %}</i>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<b>{% trans "Membership" %}</b>
|
|
||||||
<br>
|
|
||||||
{% if request_user.is_adherent %}
|
|
||||||
<i class="text-success">{% blocktrans with end_adhesion_date=request_user.end_adhesion|date:"d b Y" %}Until {{ end_adhesion_date }}{% endblocktrans %}</i>
|
|
||||||
{% else %}
|
|
||||||
<i class="text-danger">{% trans "Non member" %}</i>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table class="table visible-xs visible-lg">
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Username" %}</th>
|
|
||||||
<td class="text-right">{{ request_user.pseudo }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Room" %}</th>
|
|
||||||
<td class="text-right">{{ request_user.room }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Internet access" %}</th>
|
|
||||||
<td class="text-right">
|
|
||||||
{% if request_user.has_access %}
|
|
||||||
<i class="text-success">{% blocktrans with end_access_date=request.user.end_access|date:"d b Y" %}Until {{ end_access_date }}{% endblocktrans %}</i>
|
|
||||||
{% else %}
|
|
||||||
<i class="text-danger">{% trans "Disabled" %}</i>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Membership" %}</th>
|
|
||||||
<td class="text-right">
|
|
||||||
{% if request_user.is_adherent %}
|
|
||||||
<i class="text-success">{% blocktrans with end_adhesion_date=request_user.end_adhesion|date:"d b Y" %}Until {{ end_adhesion_date }}{% endblocktrans %}</i>
|
|
||||||
{% else %}
|
|
||||||
<i class="text-danger">{% trans "Non member" %}</i>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<div class="list-group">
|
|
||||||
<a class="list-group-item list-group-item-info" role="button"href="{% url 'users:mon-profil' %}">
|
|
||||||
<i class="fa fa-user-circle"></i>
|
|
||||||
{% trans "View my profile" %}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="panel-body">
|
|
||||||
<p>{% trans "You are not logged in." %}</p>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if request_user.is_authenticated %}
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h4>{% blocktrans count interfaces|length as nb %}{{ nb }} active machine{% plural %}{{ nb }} active machines{% endblocktrans %}</h4>
|
|
||||||
</div>
|
|
||||||
<ul class="list-group">
|
|
||||||
{% for interface in interfaces|slice:":5" %}
|
|
||||||
<div class="list-group-item" style="word-break: break-all">{{ interface }}</div>
|
|
||||||
{% endfor %}
|
|
||||||
{% if interfaces|length > 5 %}
|
|
||||||
<a class="list-group-item list-group-item-info" role="button" href="{% url 'users:mon-profil' %}">
|
|
||||||
<i class="fa fa-plus"></i>
|
|
||||||
{% trans "View my machines" %}
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<footer class="text-muted">
|
{% include 'footer.html' %}
|
||||||
<div class="container">
|
|
||||||
<p class="pull-right">
|
{# Load JavaScript #}
|
||||||
<a href="#">{% trans "Back to top" %}</a>
|
<script src="/static/js/konami/konami.js"></script>
|
||||||
</p>
|
<script src="/static/js/sapphire.js"></script>
|
||||||
<p>{{ name_website }} {% trans "powered by" %} Re2o 2016–2020</p>
|
<script>
|
||||||
<p>
|
// Konami activate sapphire
|
||||||
{% blocktrans trimmed %}
|
let s = Sapphire();
|
||||||
Brought to you with <i class="fa fa-heart text-danger"></i>.
|
Konami(s.activate);
|
||||||
{% endblocktrans %}
|
</script>
|
||||||
<a href="{{ request.scheme }}://{{ request.get_host }}/about/">{% trans "About this website" %}</a>.
|
{% if request.user.shortcuts_enabled %}
|
||||||
</p>
|
<script src="/static/js/shortcuts.js"></script>
|
||||||
<p>
|
{% endif %}
|
||||||
{% blocktrans trimmed %}
|
{# Read the documentation for more information #}
|
||||||
This software is under the terms of the
|
<script src="/static/js/main.js"></script>
|
||||||
<a href="http://www.gnu.org/licenses/gpl-2.0.txt" target="_blank" rel="nofollow">GPLv2</a> License.
|
</body>
|
||||||
{% endblocktrans %}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
{# Load JavaScript #}
|
|
||||||
<script src="/static/js/konami/konami.js"></script>
|
|
||||||
<script src="/static/js/sapphire.js"></script>
|
|
||||||
<script>
|
|
||||||
// Konami activate sapphire
|
|
||||||
let s = Sapphire();
|
|
||||||
Konami(s.activate);
|
|
||||||
</script>
|
|
||||||
{% if request.user.shortcuts_enabled %}
|
|
||||||
<script src="/static/js/shortcuts.js"></script>
|
|
||||||
{% endif %}
|
|
||||||
{# Read the documentation for more information #}
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
53
templates/footer.html
Normal file
53
templates/footer.html
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Lara Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
|
<nav class="navbar navbar-default navbar-static-bottom">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<p class="navbar-text">{{ name_website }} {% trans "powered by" %} Re2o 2016–2020.
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
Brought to you with <i class="fa fa-heart text-danger"></i>.
|
||||||
|
{% endblocktrans %}</p>
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'about' %}">
|
||||||
|
<i class="fa fa-info-circle"></i> {% trans "About" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="nav navbar-nav navbar-right">
|
||||||
|
<li>
|
||||||
|
<a href="#">
|
||||||
|
<i class="fa fa-arrow-up"></i> {% trans "Top" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<p class="navbar-text">{% blocktrans trimmed %}
|
||||||
|
This software is under the terms of the
|
||||||
|
<a href="http://www.gnu.org/licenses/gpl-2.0.txt" target="_blank" rel="nofollow">GPLv2</a>
|
||||||
|
License.
|
||||||
|
{% endblocktrans %}</p>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
322
templates/nav.html
Normal file
322
templates/nav.html
Normal file
|
@ -0,0 +1,322 @@
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Lara Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load static %}
|
||||||
|
{% load acl %}
|
||||||
|
{% load i18n %}
|
||||||
|
<nav class="navbar navbar-inverse navbar-fixed-top" id="navbar-header">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
<a class="navbar-brand" href="/">
|
||||||
|
<img src="{% static 'images/logo_re2o_navbar.svg' %}" height=32>
|
||||||
|
{{ name_website }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="collapse navbar-collapse" id="myNavbar">
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
{% can_view_any_app users machines %}
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa fa-users"></i>
|
||||||
|
{% trans "Users" %}<span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
{% can_view_app users %}
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-users"></i>
|
||||||
|
{% trans "Users and clubs" %} » </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index' %}"><i class="fa fa-user"></i>
|
||||||
|
{% trans "Users" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-clubs' %}"><i
|
||||||
|
class="fa fa-users"></i>
|
||||||
|
{% trans "Clubs" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-white' %}"><i
|
||||||
|
class="fa fa-user-plus"></i>
|
||||||
|
{% trans "Whitelists" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-ban' %}"><i
|
||||||
|
class="fa fa-user-times"></i>
|
||||||
|
{% trans "Bans" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:mass-archive' %}"><i
|
||||||
|
class="fa fa-archive"></i>
|
||||||
|
{% trans "Massively archive" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app machines %}
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index' %}"><i class="fa fa-laptop"></i>
|
||||||
|
{% trans "Machines" %}</a></li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app users %}
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-listright' %}"><i
|
||||||
|
class="fa fa-object-group"></i>
|
||||||
|
{% trans "Groups" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-plus"></i> {% trans "Advanced" %}
|
||||||
|
» </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-school' %}"><i
|
||||||
|
class="fa fa-graduation-cap"></i>
|
||||||
|
{% trans "Schools" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-shell' %}"><i
|
||||||
|
class="fa fa-terminal"></i>
|
||||||
|
{% trans "Shells" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% for app, template in optionnal_templates_navbar_user_list %}
|
||||||
|
{% if app != 'cotisations' and app != 'topologie' and app != 'logs' %}
|
||||||
|
{{ template }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app cotisations %}
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa fa-eur"></i>
|
||||||
|
{% trans "Treasury" %}<span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-file"></i>
|
||||||
|
{% trans "Invoices" %} » </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:control' %}"><i
|
||||||
|
class="fa fa-eye"></i>
|
||||||
|
{% trans "Control invoices" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:index' %}"><i
|
||||||
|
class="fa fa-file"></i>
|
||||||
|
{% trans "Invoices" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:index-custom-invoice' %}"><i
|
||||||
|
class="fa fa-file-text"></i>
|
||||||
|
{% trans "Cutsom invoices" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:index-cost-estimate' %}"><i
|
||||||
|
class="fa fa-files-o"></i>
|
||||||
|
{% trans "Cost estimates" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-money"></i>
|
||||||
|
{% trans "Advanced" %}
|
||||||
|
» </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:index-banque' %}"><i
|
||||||
|
class="fa fa-bank"></i>
|
||||||
|
{% trans "Banks" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:index-article' %}"><i
|
||||||
|
class="fa fa-barcode"></i>
|
||||||
|
{% trans "Articles" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'cotisations:index-paiement' %}"><i
|
||||||
|
class="fa fa-credit-card"></i>
|
||||||
|
{% trans "Payment methods" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% for app, template in optionnal_templates_navbar_user_list %}
|
||||||
|
{% if app == 'cotisations' %}
|
||||||
|
{{ template }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app topologie %}
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa fa-sitemap"></i>
|
||||||
|
{% trans "Topology" %}<span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-microchip"></i>
|
||||||
|
{% trans "Switches" %} » </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index' %}"><i
|
||||||
|
class="fa fa-microchip"></i>
|
||||||
|
{% trans "Switches" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-model-switch' %}"><i
|
||||||
|
class="fa fa-object-group"></i>
|
||||||
|
{% trans "Switch models" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-module' %}"><i
|
||||||
|
class="fa fa-puzzle-piece"></i>
|
||||||
|
{% trans "Switch modules" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-switch-bay' %}"><i class="fa fa-wrench"></i>
|
||||||
|
{% trans "Switch bays" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-stack' %}"><i class="fa fa-server"></i>
|
||||||
|
{% trans "Stacks" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-port-profile' %}"><i
|
||||||
|
class="fa fa-cog"></i>
|
||||||
|
{% trans "Port profiles" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-building"></i>
|
||||||
|
{% trans "Infrastructure" %}
|
||||||
|
» </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-dormitory' %}"><i class="fa fa-bank"></i>
|
||||||
|
{% trans "Dormitories" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-building' %}"><i class="fa fa-home"></i>
|
||||||
|
{% trans "Buildings" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-room' %}"><i
|
||||||
|
class="fa fa-bed"></i>
|
||||||
|
{% trans "Rooms" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'topologie:index-ap' %}"><i class="fa fa-wifi"></i>
|
||||||
|
{% trans "Access points" %}</a></li>
|
||||||
|
|
||||||
|
{% for app, template in optionnal_templates_navbar_user_list %}
|
||||||
|
{% if app == 'topologie' %}
|
||||||
|
{{ template }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app logs %}
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa fa-area-chart"></i>
|
||||||
|
{% trans "Statistics" %}<span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:index' %}"><i class="fa fa-clipboard"></i>
|
||||||
|
{% trans "Summary" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:stats-logs' %}"><i class="fa fa-calendar"></i>
|
||||||
|
{% trans "Events" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:stats-general' %}"><i class="fa fa-area-chart"></i>
|
||||||
|
{% trans "General" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:stats-models' %}"><i class="fa fa-database"></i>
|
||||||
|
{% trans "Database" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:stats-users' %}"><i class="fa fa-plug"></i>
|
||||||
|
{% trans "Wiring actions" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:stats-actions' %}"><i class="fa fa-users"></i>
|
||||||
|
{% trans "Users" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'logs:stats-search-machine' %}"><i class="fa fa-laptop"></i>
|
||||||
|
{% trans "Machine history" %}</a></li>
|
||||||
|
{% for app, template in optionnal_templates_navbar_user_list %}
|
||||||
|
{% if app == 'logs' %}
|
||||||
|
{{ template }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_any_app preferences users machines %}
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa fa-cogs"></i>
|
||||||
|
{% trans "Administration" %}<span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
{% can_view_app preferences %}
|
||||||
|
<li><a class="dropdown-item" href="{% url 'preferences:display-options' %}"><i
|
||||||
|
class="fa fa-cogs"></i>
|
||||||
|
{% trans "General" %}</a></li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app users %}
|
||||||
|
<li><a class="dropdown-item" href="{% url 'users:index-serviceusers' %}"><i
|
||||||
|
class="fa fa-address-book"></i>
|
||||||
|
{% trans "LDAP service users" %}</a></li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% can_view_app machines %}
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-service' %}"><i
|
||||||
|
class="fa fa-wrench"></i>
|
||||||
|
{% trans "Services" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-machinetype' %}"><i
|
||||||
|
class="fa fa-laptop"></i>
|
||||||
|
{% trans "Machine types" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="#"><i class="fa fa-globe"></i>
|
||||||
|
{% trans "Network" %} » </a>
|
||||||
|
<ul class="submenu dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-iptype' %}"><i
|
||||||
|
class="fa fa-ellipsis-h"></i>
|
||||||
|
{% trans "IP ranges" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-vlan' %}"><i
|
||||||
|
class="fa fa-object-group"></i>
|
||||||
|
{% trans "VLANs" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-extension' %}"><i
|
||||||
|
class="fa fa-wrench"></i>
|
||||||
|
{% trans "Extensions and zones" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-nas' %}"><i
|
||||||
|
class="fa fa-certificate"></i>
|
||||||
|
{% trans "NAS" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-role' %}"><i
|
||||||
|
class="fa fa-server"></i>
|
||||||
|
{% trans "Server roles" %}</a></li>
|
||||||
|
<li><a class="dropdown-item" href="{% url 'machines:index-portlist' %}"><i
|
||||||
|
class="fa fa-cog"></i>
|
||||||
|
{% trans "Ports openings" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
</ul>
|
||||||
|
<ul class="nav navbar-nav navbar-right">
|
||||||
|
<li><a href="{% url 'contact' %}"><i class="fa fa-at"></i> {% trans "Contact" %}</a>
|
||||||
|
{% if not request.user.is_authenticated %}
|
||||||
|
{% for template in optionnal_templates_navbar_logout_list %}
|
||||||
|
{{ template }}
|
||||||
|
{% endfor %}
|
||||||
|
{% if var_sa %}
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'users:new-user' %}">
|
||||||
|
<i class="fa fa-user-plus"></i> {% trans "Sign up" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
<a id="toggle_login" href="{% url 'login' %}">
|
||||||
|
<i class="fa fa-sign-in"></i> {% trans "Log in" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
{% can_view_any_app users machines cotisations %}
|
||||||
|
<li>
|
||||||
|
<form action="{% url 'search:search' %}" class="navbar-form" role="search">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" placeholder="{% trans "Search" %}" name="q"
|
||||||
|
id="search-term" {% if search_term %}value="{{ search_term }}" {% endif %}>
|
||||||
|
<div class="input-group-btn">
|
||||||
|
<button class="btn btn-default" type="submit"><i class="fa fa-search"></i></button>
|
||||||
|
<a href="{% url 'search:searchp' %}" class="btn btn-default" role="button"><i
|
||||||
|
class="fa fa-plus"></i></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</li>
|
||||||
|
{% acl_end %}
|
||||||
|
{% endif %}
|
||||||
|
{% if request.user.is_authenticated %}
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
|
||||||
|
aria-expanded="false"><i class="fa fa-user-circle"></i>
|
||||||
|
{{ request.user.pseudo|slice:":15" }} <span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="{% url 'users:mon-profil' %}"><i class="fa fa-user"></i>
|
||||||
|
{% trans "My profile" %}</a></li>
|
||||||
|
<li><a id="toggle_login" href="{% url 'logout' %}"><i class="fa fa-sign-out"></i>
|
||||||
|
{% trans "Log out" %}</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
{% include 'buttons/setlang.html' %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
136
templates/sidebar.html
Normal file
136
templates/sidebar.html
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Lara Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
<div class="panel panel-default">
|
||||||
|
{% if request_user.is_authenticated %}
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4>{{ request_user.name }} {{ request_user.surname }}</h4>
|
||||||
|
</div>
|
||||||
|
<table class="table visible-sm visible-md">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>{% trans "Username" %}</b>
|
||||||
|
<br>
|
||||||
|
{{ request_user.pseudo }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>{% trans "Room" %}</b>
|
||||||
|
<br>
|
||||||
|
{{ request_user.room }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>{% trans "Internet access" %}</b>
|
||||||
|
<br>
|
||||||
|
{% if request_user.has_access %}
|
||||||
|
<i class="text-success">{% blocktrans with end_access_date=request.user.end_access|date:"d b Y" %}Until
|
||||||
|
{{ end_access_date }}{% endblocktrans %}</i>
|
||||||
|
{% else %}
|
||||||
|
<i class="text-danger">{% trans "Disabled" %}</i>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>{% trans "Membership" %}</b>
|
||||||
|
<br>
|
||||||
|
{% if request_user.is_adherent %}
|
||||||
|
<i class="text-success">{% blocktrans with end_adhesion_date=request_user.end_adhesion|date:"d b Y" %}Until
|
||||||
|
{{ end_adhesion_date }}{% endblocktrans %}</i>
|
||||||
|
{% else %}
|
||||||
|
<i class="text-danger">{% trans "Non member" %}</i>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table class="table visible-xs visible-lg">
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{% trans "Username" %}</th>
|
||||||
|
<td class="text-right">{{ request_user.pseudo }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{% trans "Room" %}</th>
|
||||||
|
<td class="text-right">{{ request_user.room }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{% trans "Internet access" %}</th>
|
||||||
|
<td class="text-right">
|
||||||
|
{% if request_user.has_access %}
|
||||||
|
<i class="text-success">{% blocktrans with end_access_date=request.user.end_access|date:"d b Y" %}Until
|
||||||
|
{{ end_access_date }}{% endblocktrans %}</i>
|
||||||
|
{% else %}
|
||||||
|
<i class="text-danger">{% trans "Disabled" %}</i>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{% trans "Membership" %}</th>
|
||||||
|
<td class="text-right">
|
||||||
|
{% if request_user.is_adherent %}
|
||||||
|
<i class="text-success">{% blocktrans with end_adhesion_date=request_user.end_adhesion|date:"d b Y" %}Until
|
||||||
|
{{ end_adhesion_date }}{% endblocktrans %}</i>
|
||||||
|
{% else %}
|
||||||
|
<i class="text-danger">{% trans "Non member" %}</i>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="list-group">
|
||||||
|
<a class="list-group-item list-group-item-info" role="button"
|
||||||
|
href="{% url 'users:mon-profil' %}">
|
||||||
|
<i class="fa fa-user-circle"></i>
|
||||||
|
{% trans "View my profile" %}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="panel-body">
|
||||||
|
<p>{% trans "You are not logged in." %}</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if request_user.is_authenticated %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4>{% blocktrans count interfaces|length as nb %}{{ nb }} active machine{% plural %}{{ nb }}
|
||||||
|
active machines{% endblocktrans %}</h4>
|
||||||
|
</div>
|
||||||
|
<ul class="list-group">
|
||||||
|
{% for interface in interfaces|slice:":5" %}
|
||||||
|
<div class="list-group-item" style="word-break: break-all">{{ interface }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% if interfaces|length > 5 %}
|
||||||
|
<a class="list-group-item list-group-item-info" role="button"
|
||||||
|
href="{% url 'users:mon-profil' %}">
|
||||||
|
<i class="fa fa-plus"></i>
|
||||||
|
{% trans "View my machines" %}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
42
topologie/templates/topologie/index_building.html
Normal file
42
topologie/templates/topologie/index_building.html
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{% extends 'topologie/sidebar.html' %}
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Gabriel Détraz
|
||||||
|
Copyright © 2017 Lara Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load acl %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}{% trans "Topology" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>{% trans "Buildings" %}</h2>
|
||||||
|
{% can_create Building %}
|
||||||
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-building' %}">
|
||||||
|
<i class="fa fa-plus"></i> {% trans "Add a building" %}
|
||||||
|
</a>
|
||||||
|
<hr>
|
||||||
|
{% acl_end %}
|
||||||
|
{% include 'topologie/aff_building.html' with building_list=building_list %}
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -30,33 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% block title %}{% trans "Topology" %}{% endblock %}
|
{% block title %}{% trans "Topology" %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>{% trans "Stacks" %}</h2>
|
|
||||||
{% can_create Stack %}
|
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-stack' %}">
|
|
||||||
<i class="fa fa-plus"></i> {% trans "Add a stack" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% include 'topologie/aff_stacks.html' with stack_list=stack_list %}
|
|
||||||
|
|
||||||
<h2>{% trans "Switch bays" %}</h2>
|
|
||||||
{% can_create SwitchBay %}
|
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-switch-bay' %}">
|
|
||||||
<i class="fa fa-plus"></i> {% trans "Add a switch bay" %}
|
|
||||||
</a>
|
|
||||||
<hr>
|
|
||||||
{% acl_end %}
|
|
||||||
{% include 'topologie/aff_switch_bay.html' with switch_bay_list=switch_bay_list %}
|
|
||||||
|
|
||||||
<h2>{% trans "Buildings" %}</h2>
|
|
||||||
{% can_create Building %}
|
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-building' %}">
|
|
||||||
<i class="fa fa-plus"></i> {% trans "Add a building" %}
|
|
||||||
</a>
|
|
||||||
<hr>
|
|
||||||
{% acl_end %}
|
|
||||||
{% include 'topologie/aff_building.html' with building_list=building_list %}
|
|
||||||
|
|
||||||
|
|
||||||
<h2>{% trans "Dormitories" %}</h2>
|
<h2>{% trans "Dormitories" %}</h2>
|
||||||
{% can_create Dormitory %}
|
{% can_create Dormitory %}
|
||||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-dormitory' %}">
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-dormitory' %}">
|
41
topologie/templates/topologie/index_stack.html
Normal file
41
topologie/templates/topologie/index_stack.html
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{% extends 'topologie/sidebar.html' %}
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Gabriel Détraz
|
||||||
|
Copyright © 2017 Lara Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load acl %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}{% trans "Topology" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>{% trans "Stacks" %}</h2>
|
||||||
|
{% can_create Stack %}
|
||||||
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-stack' %}">
|
||||||
|
<i class="fa fa-plus"></i> {% trans "Add a stack" %}
|
||||||
|
</a>
|
||||||
|
{% acl_end %}
|
||||||
|
{% include 'topologie/aff_stacks.html' with stack_list=stack_list %}
|
||||||
|
{% endblock %}
|
||||||
|
|
42
topologie/templates/topologie/index_switch_bay.html
Normal file
42
topologie/templates/topologie/index_switch_bay.html
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{% extends 'topologie/sidebar.html' %}
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Gabriel Détraz
|
||||||
|
Copyright © 2017 Lara Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load acl %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}{% trans "Topology" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>{% trans "Switch bays" %}</h2>
|
||||||
|
{% can_create SwitchBay %}
|
||||||
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:new-switch-bay' %}">
|
||||||
|
<i class="fa fa-plus"></i> {% trans "Add a switch bay" %}
|
||||||
|
</a>
|
||||||
|
<hr>
|
||||||
|
{% acl_end %}
|
||||||
|
{% include 'topologie/aff_switch_bay.html' with switch_bay_list=switch_bay_list %}
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -23,36 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index-room' %}">
|
|
||||||
<i class="fa fa-home"></i>
|
|
||||||
{% trans "Rooms and premises" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index' %}">
|
|
||||||
<i class="fa fa-microchip"></i>
|
|
||||||
{% trans "Switches" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index-module' %}">
|
|
||||||
<i class="fa fa-microchip"></i>
|
|
||||||
{% trans "Switch modules" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index-port-profile' %}">
|
|
||||||
<i class="fa fa-cogs"></i>
|
|
||||||
{% trans "Port profiles" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index-ap' %}">
|
|
||||||
<i class="fa fa-wifi"></i>
|
|
||||||
{% trans "Access points" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index-physical-grouping' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Physical grouping" %}
|
|
||||||
</a>
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'topologie:index-model-switch' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Switch models and constructors" %}
|
|
||||||
</a>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -49,9 +49,24 @@ urlpatterns = [
|
||||||
url(r"^edit_switch/(?P<switchid>[0-9]+)$", views.edit_switch, name="edit-switch"),
|
url(r"^edit_switch/(?P<switchid>[0-9]+)$", views.edit_switch, name="edit-switch"),
|
||||||
url(r"^new_stack/$", views.new_stack, name="new-stack"),
|
url(r"^new_stack/$", views.new_stack, name="new-stack"),
|
||||||
url(
|
url(
|
||||||
r"^index_physical_grouping/$",
|
r"^index_stack/$",
|
||||||
views.index_physical_grouping,
|
views.index_stack,
|
||||||
name="index-physical-grouping",
|
name="index-stack",
|
||||||
|
),
|
||||||
|
url(
|
||||||
|
r"^index_switch_bay/$",
|
||||||
|
views.index_switch_bay,
|
||||||
|
name="index-switch-bay",
|
||||||
|
),
|
||||||
|
url(
|
||||||
|
r"^index_building/$",
|
||||||
|
views.index_building,
|
||||||
|
name="index-building",
|
||||||
|
),
|
||||||
|
url(
|
||||||
|
r"^index_dormitory/$",
|
||||||
|
views.index_dormitory,
|
||||||
|
name="index-dormitory",
|
||||||
),
|
),
|
||||||
url(r"^edit_stack/(?P<stackid>[0-9]+)$", views.edit_stack, name="edit-stack"),
|
url(r"^edit_stack/(?P<stackid>[0-9]+)$", views.edit_stack, name="edit-stack"),
|
||||||
url(r"^del_stack/(?P<stackid>[0-9]+)$", views.del_stack, name="del-stack"),
|
url(r"^del_stack/(?P<stackid>[0-9]+)$", views.del_stack, name="del-stack"),
|
||||||
|
|
|
@ -242,35 +242,12 @@ def index_ap(request):
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@can_view_all(Stack, Building, Dormitory, SwitchBay)
|
@can_view_all(SwitchBay)
|
||||||
def index_physical_grouping(request):
|
def index_switch_bay(request):
|
||||||
"""View used to display the list of stacks (display all switches)."""
|
"""View used to display the list of switch bays."""
|
||||||
stack_list = Stack.objects.prefetch_related(
|
|
||||||
"switch_set__interface_set__domain__extension"
|
|
||||||
)
|
|
||||||
building_list = Building.objects.all().select_related("dormitory")
|
|
||||||
dormitory_list = Dormitory.objects.all().prefetch_related("building_set")
|
|
||||||
switch_bay_list = SwitchBay.objects.select_related(
|
switch_bay_list = SwitchBay.objects.select_related(
|
||||||
"building__dormitory"
|
"building__dormitory"
|
||||||
).prefetch_related("switch_set__interface_set__domain")
|
).prefetch_related("switch_set__interface_set__domain")
|
||||||
stack_list = SortTable.sort(
|
|
||||||
stack_list,
|
|
||||||
request.GET.get("col"),
|
|
||||||
request.GET.get("order"),
|
|
||||||
SortTable.TOPOLOGIE_INDEX_STACK,
|
|
||||||
)
|
|
||||||
building_list = SortTable.sort(
|
|
||||||
building_list,
|
|
||||||
request.GET.get("col"),
|
|
||||||
request.GET.get("order"),
|
|
||||||
SortTable.TOPOLOGIE_INDEX_BUILDING,
|
|
||||||
)
|
|
||||||
dormitory_list = SortTable.sort(
|
|
||||||
dormitory_list,
|
|
||||||
request.GET.get("col"),
|
|
||||||
request.GET.get("order"),
|
|
||||||
SortTable.TOPOLOGIE_INDEX_DORMITORY,
|
|
||||||
)
|
|
||||||
switch_bay_list = SortTable.sort(
|
switch_bay_list = SortTable.sort(
|
||||||
switch_bay_list,
|
switch_bay_list,
|
||||||
request.GET.get("col"),
|
request.GET.get("col"),
|
||||||
|
@ -279,15 +256,64 @@ def index_physical_grouping(request):
|
||||||
)
|
)
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"topologie/index_physical_grouping.html",
|
"topologie/index_switch_bay.html",
|
||||||
{
|
{
|
||||||
"stack_list": stack_list,
|
|
||||||
"switch_bay_list": switch_bay_list,
|
"switch_bay_list": switch_bay_list,
|
||||||
"building_list": building_list,
|
|
||||||
"dormitory_list": dormitory_list,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@can_view_all(Stack)
|
||||||
|
def index_stack(request):
|
||||||
|
"""View used to display the list of stacks (display all switches)."""
|
||||||
|
stack_list = Stack.objects.prefetch_related(
|
||||||
|
"switch_set__interface_set__domain__extension"
|
||||||
|
)
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"topologie/index_stack.html",
|
||||||
|
{
|
||||||
|
"stack_list": stack_list,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@can_view_all(Building)
|
||||||
|
def index_building(request):
|
||||||
|
"""View used to display the list of buildings"""
|
||||||
|
building_list = Building.objects.all().select_related("dormitory")
|
||||||
|
building_list = SortTable.sort(
|
||||||
|
building_list,
|
||||||
|
request.GET.get("col"),
|
||||||
|
request.GET.get("order"),
|
||||||
|
SortTable.TOPOLOGIE_INDEX_BUILDING,
|
||||||
|
)
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"topologie/index_building.html",
|
||||||
|
{
|
||||||
|
"building_list": building_list,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@can_view_all(Dormitory)
|
||||||
|
def index_dormitory(request):
|
||||||
|
"""View used to display the list of dormitories."""
|
||||||
|
dormitory_list = Dormitory.objects.all().prefetch_related("building_set")
|
||||||
|
dormitory_list = SortTable.sort(
|
||||||
|
dormitory_list,
|
||||||
|
request.GET.get("col"),
|
||||||
|
request.GET.get("order"),
|
||||||
|
SortTable.TOPOLOGIE_INDEX_DORMITORY,
|
||||||
|
)
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"topologie/index_dormitory.html",
|
||||||
|
{
|
||||||
|
"dormitory_list": dormitory_list,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@can_view_all(ModelSwitch, ConstructorSwitch)
|
@can_view_all(ModelSwitch, ConstructorSwitch)
|
||||||
|
@ -440,7 +466,7 @@ def new_stack(request):
|
||||||
if stack.is_valid():
|
if stack.is_valid():
|
||||||
stack.save()
|
stack.save()
|
||||||
messages.success(request, _("The stack was created."))
|
messages.success(request, _("The stack was created."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-stack"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": stack, "action_name": _("Add")}, "topologie/topo.html", request
|
{"topoform": stack, "action_name": _("Add")}, "topologie/topo.html", request
|
||||||
)
|
)
|
||||||
|
@ -455,7 +481,7 @@ def edit_stack(request, stack, **_kwargs):
|
||||||
if stack.changed_data:
|
if stack.changed_data:
|
||||||
stack.save()
|
stack.save()
|
||||||
messages.success(request, _("The stack was edited."))
|
messages.success(request, _("The stack was edited."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-stack"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": stack, "action_name": _("Edit")}, "topologie/topo.html", request
|
{"topoform": stack, "action_name": _("Edit")}, "topologie/topo.html", request
|
||||||
)
|
)
|
||||||
|
@ -480,7 +506,7 @@ def del_stack(request, stack, **_kwargs):
|
||||||
% stack
|
% stack
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-stack"))
|
||||||
return form({"objet": stack}, "topologie/delete.html", request)
|
return form({"objet": stack}, "topologie/delete.html", request)
|
||||||
|
|
||||||
|
|
||||||
|
@ -847,7 +873,7 @@ def new_switch_bay(request):
|
||||||
if switch_bay.is_valid():
|
if switch_bay.is_valid():
|
||||||
switch_bay.save()
|
switch_bay.save()
|
||||||
messages.success(request, _("The switch bay was created."))
|
messages.success(request, _("The switch bay was created."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-switch-bay"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": switch_bay, "action_name": _("Add")},
|
{"topoform": switch_bay, "action_name": _("Add")},
|
||||||
"topologie/topo.html",
|
"topologie/topo.html",
|
||||||
|
@ -864,7 +890,7 @@ def edit_switch_bay(request, switch_bay, **_kwargs):
|
||||||
if switch_bay.changed_data:
|
if switch_bay.changed_data:
|
||||||
switch_bay.save()
|
switch_bay.save()
|
||||||
messages.success(request, _("The switch bay was edited."))
|
messages.success(request, _("The switch bay was edited."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-switch-bay"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": switch_bay, "action_name": _("Edit")},
|
{"topoform": switch_bay, "action_name": _("Edit")},
|
||||||
"topologie/topo.html",
|
"topologie/topo.html",
|
||||||
|
@ -891,7 +917,7 @@ def del_switch_bay(request, switch_bay, **_kwargs):
|
||||||
% switch_bay
|
% switch_bay
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-switch-bay"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": switch_bay, "objet_name": _("switch bay")},
|
{"objet": switch_bay, "objet_name": _("switch bay")},
|
||||||
"topologie/delete.html",
|
"topologie/delete.html",
|
||||||
|
@ -907,7 +933,7 @@ def new_building(request):
|
||||||
if building.is_valid():
|
if building.is_valid():
|
||||||
building.save()
|
building.save()
|
||||||
messages.success(request, _("The building was created."))
|
messages.success(request, _("The building was created."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-building"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": building, "action_name": _("Add")},
|
{"topoform": building, "action_name": _("Add")},
|
||||||
"topologie/topo.html",
|
"topologie/topo.html",
|
||||||
|
@ -924,7 +950,7 @@ def edit_building(request, building, **_kwargs):
|
||||||
if building.changed_data:
|
if building.changed_data:
|
||||||
building.save()
|
building.save()
|
||||||
messages.success(request, _("The building was edited."))
|
messages.success(request, _("The building was edited."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-building"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": building, "action_name": _("Edit")}, "topologie/topo.html", request
|
{"topoform": building, "action_name": _("Edit")}, "topologie/topo.html", request
|
||||||
)
|
)
|
||||||
|
@ -949,7 +975,7 @@ def del_building(request, building, **_kwargs):
|
||||||
% building
|
% building
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-building"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": building, "objet_name": _("building")},
|
{"objet": building, "objet_name": _("building")},
|
||||||
"topologie/delete.html",
|
"topologie/delete.html",
|
||||||
|
@ -965,7 +991,7 @@ def new_dormitory(request):
|
||||||
if dormitory.is_valid():
|
if dormitory.is_valid():
|
||||||
dormitory.save()
|
dormitory.save()
|
||||||
messages.success(request, _("The dormitory was created."))
|
messages.success(request, _("The dormitory was created."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-dormitory"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": dormitory, "action_name": _("Add")},
|
{"topoform": dormitory, "action_name": _("Add")},
|
||||||
"topologie/topo.html",
|
"topologie/topo.html",
|
||||||
|
@ -982,7 +1008,7 @@ def edit_dormitory(request, dormitory, **_kwargs):
|
||||||
if dormitory.changed_data:
|
if dormitory.changed_data:
|
||||||
dormitory.save()
|
dormitory.save()
|
||||||
messages.success(request, _("The dormitory was edited."))
|
messages.success(request, _("The dormitory was edited."))
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-dormitory"))
|
||||||
return form(
|
return form(
|
||||||
{"topoform": dormitory, "action_name": _("Edit")},
|
{"topoform": dormitory, "action_name": _("Edit")},
|
||||||
"topologie/topo.html",
|
"topologie/topo.html",
|
||||||
|
@ -1009,7 +1035,7 @@ def del_dormitory(request, dormitory, **_kwargs):
|
||||||
% dormitory
|
% dormitory
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
return redirect(reverse("topologie:index-physical-grouping"))
|
return redirect(reverse("topologie:index-dormitory"))
|
||||||
return form(
|
return form(
|
||||||
{"objet": dormitory, "objet_name": _("dormitory")},
|
{"objet": dormitory, "objet_name": _("dormitory")},
|
||||||
"topologie/delete.html",
|
"topologie/delete.html",
|
||||||
|
|
|
@ -26,73 +26,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block sidebar %}
|
{% block sidebar %}
|
||||||
{% if request.user.is_authenticated%}
|
|
||||||
{% can_create Club %}
|
|
||||||
<a class="list-group-item list-group-item-success" href="{% url 'users:new-club' %}">
|
|
||||||
<i class="fa fa-plus"></i>
|
|
||||||
{% trans "Create a club or organisation" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_create Adherent %}
|
|
||||||
<a class="list-group-item list-group-item-success" href="{% url 'users:new-user' %}">
|
|
||||||
<i class="fa fa-user-plus"></i>
|
|
||||||
{% trans "Create a user" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% endif %}
|
|
||||||
{% can_view_all Club %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-clubs' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Clubs and organisations" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Adherent %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Users" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Ban %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-ban' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Bans" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all Whitelist %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-white' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Whitelists" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all School %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-school' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Schools" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all ListShell %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-shell' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Shells" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all ListRight %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-listright' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Groups of rights" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_view_all ServiceUser %}
|
|
||||||
<a class="list-group-item list-group-item-info" href="{% url 'users:index-serviceusers' %}">
|
|
||||||
<i class="fa fa-list-ul"></i>
|
|
||||||
{% trans "Service users" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% can_change User state %}
|
|
||||||
<a class="list-group-item list-group-item-danger" href="{% url 'users:mass-archive' %}">
|
|
||||||
<i class="fa fa-archive"></i>
|
|
||||||
{% trans "Massively archive" %}
|
|
||||||
</a>
|
|
||||||
{% acl_end %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue