Add caching
This commit is contained in:
parent
87c232d3f9
commit
40a710f41e
|
@ -45,6 +45,20 @@ INSTALLED_APPS = [
|
||||||
"prettyjson",
|
"prettyjson",
|
||||||
"mixins",
|
"mixins",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Performance optimisations
|
||||||
|
CACHES = {
|
||||||
|
"default": {
|
||||||
|
"BACKEND": "django.core.cache.backends.redis.RedisCache",
|
||||||
|
"LOCATION": "unix:///var/run/socks/redis.sock",
|
||||||
|
"OPTIONS": {
|
||||||
|
"db": "10",
|
||||||
|
"parser_class": "redis.connection.PythonParser",
|
||||||
|
"pool_class": "redis.BlockingConnectionPool",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CRISPY_TEMPLATE_PACK = "bulma"
|
CRISPY_TEMPLATE_PACK = "bulma"
|
||||||
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
|
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
|
||||||
DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html"
|
DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html"
|
||||||
|
|
|
@ -1,339 +1,343 @@
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load has_plan %}
|
{% load has_plan %}
|
||||||
|
{% load cache %}
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en-GB">
|
<html lang="en-GB">
|
||||||
<head>
|
{% cache 600 head %}
|
||||||
<meta charset="utf-8">
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta charset="utf-8">
|
||||||
<title>Pathogen - {{ request.path_info }}</title>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<link rel="shortcut icon" href="{% static 'favicon.ico' %}">
|
<title>Pathogen - {{ request.path_info }}</title>
|
||||||
<link rel="manifest" href="{% static 'manifest.webmanifest' %}">
|
<link rel="shortcut icon" href="{% static 'favicon.ico' %}">
|
||||||
<link rel="stylesheet" href="{% static 'css/bulma.min.css' %}">
|
<link rel="manifest" href="{% static 'manifest.webmanifest' %}">
|
||||||
<link rel="stylesheet" href="{% static 'css/bulma-tooltip.min.css' %}">
|
<link rel="stylesheet" href="{% static 'css/bulma.min.css' %}">
|
||||||
<link rel="stylesheet" href="https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css">
|
<link rel="stylesheet" href="{% static 'css/bulma-tooltip.min.css' %}">
|
||||||
<link rel="stylesheet" href="{% static 'css/bulma-slider.min.css' %}">
|
<link rel="stylesheet" href="https://site-assets.fontawesome.com/releases/v6.1.1/css/all.css">
|
||||||
<link rel="stylesheet" href="{% static 'css/bulma-calendar.min.css' %}">
|
<link rel="stylesheet" href="{% static 'css/bulma-slider.min.css' %}">
|
||||||
<link rel="stylesheet" href="{% static 'css/bulma-tagsinput.min.css' %}">
|
<link rel="stylesheet" href="{% static 'css/bulma-calendar.min.css' %}">
|
||||||
<link rel="stylesheet" href="{% static 'css/bulma-switch.min.css' %}">
|
<link rel="stylesheet" href="{% static 'css/bulma-tagsinput.min.css' %}">
|
||||||
<link rel="stylesheet" href="{% static 'css/gridstack.min.css' %}">
|
<link rel="stylesheet" href="{% static 'css/bulma-switch.min.css' %}">
|
||||||
<script src="{% static 'js/bulma-calendar.min.js' %}" integrity="sha384-DThNif0xGXbopX7+PE+UabkuClfI/zELNhaVqoGLutaWB76dyMw0vIQBGmUxSfVQ" crossorigin="anonymous"></script>
|
<link rel="stylesheet" href="{% static 'css/gridstack.min.css' %}">
|
||||||
<script src="{% static 'js/bulma-slider.min.js' %}" integrity="sha384-wbyps8iLG8QzJE02viYc/27BtT5HSa11+b5V7QPR1/huVuA8f4LRTNGc82qAIeIZ" crossorigin="anonymous"></script>
|
<script src="{% static 'js/bulma-calendar.min.js' %}" integrity="sha384-DThNif0xGXbopX7+PE+UabkuClfI/zELNhaVqoGLutaWB76dyMw0vIQBGmUxSfVQ" crossorigin="anonymous"></script>
|
||||||
<script src="{% static 'js/htmx.min.js' %}" integrity="sha384-cZuAZ+ZbwkNRnrKi05G/fjBX+azI9DNOkNYysZ0I/X5ZFgsmMiBXgDZof30F5ofc" crossorigin="anonymous"></script>
|
<script src="{% static 'js/bulma-slider.min.js' %}" integrity="sha384-wbyps8iLG8QzJE02viYc/27BtT5HSa11+b5V7QPR1/huVuA8f4LRTNGc82qAIeIZ" crossorigin="anonymous"></script>
|
||||||
<script defer src="{% static 'js/remove-me.js' %}" integrity="sha384-6fHcFNoQ8QEI3ZDgw9Z/A6Brk64gF7AnFbLgdrumo8/kBbsKQ/wo7wPegj5WkzuG" crossorigin="anonymous"></script>
|
<script src="{% static 'js/htmx.min.js' %}" integrity="sha384-cZuAZ+ZbwkNRnrKi05G/fjBX+azI9DNOkNYysZ0I/X5ZFgsmMiBXgDZof30F5ofc" crossorigin="anonymous"></script>
|
||||||
<script defer src="{% static 'js/hyperscript.min.js' %}" integrity="sha384-6GYN8BDHOJkkru6zcpGOUa//1mn+5iZ/MyT6mq34WFIpuOeLF52kSi721q0SsYF9" crossorigin="anonymous"></script>
|
<script defer src="{% static 'js/remove-me.js' %}" integrity="sha384-6fHcFNoQ8QEI3ZDgw9Z/A6Brk64gF7AnFbLgdrumo8/kBbsKQ/wo7wPegj5WkzuG" crossorigin="anonymous"></script>
|
||||||
<script src="{% static 'js/bulma-tagsinput.min.js' %}"></script>
|
<script defer src="{% static 'js/hyperscript.min.js' %}" integrity="sha384-6GYN8BDHOJkkru6zcpGOUa//1mn+5iZ/MyT6mq34WFIpuOeLF52kSi721q0SsYF9" crossorigin="anonymous"></script>
|
||||||
<script src="{% static 'js/jquery.min.js' %}"></script>
|
<script src="{% static 'js/bulma-tagsinput.min.js' %}"></script>
|
||||||
<script src="{% static 'js/gridstack-all.js' %}"></script>
|
<script src="{% static 'js/jquery.min.js' %}"></script>
|
||||||
<script defer src="{% static 'js/magnet.min.js' %}"></script>
|
<script src="{% static 'js/gridstack-all.js' %}"></script>
|
||||||
<script>
|
<script defer src="{% static 'js/magnet.min.js' %}"></script>
|
||||||
document.addEventListener("restore-scroll", function(event) {
|
<script>
|
||||||
var scrollpos = localStorage.getItem('scrollpos');
|
document.addEventListener("restore-scroll", function(event) {
|
||||||
if (scrollpos) {
|
var scrollpos = localStorage.getItem('scrollpos');
|
||||||
window.scrollTo(0, scrollpos)
|
if (scrollpos) {
|
||||||
};
|
window.scrollTo(0, scrollpos)
|
||||||
});
|
};
|
||||||
|
|
||||||
document.addEventListener("htmx:beforeSwap", function(event) {
|
|
||||||
localStorage.setItem('scrollpos', window.scrollY);
|
|
||||||
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
|
||||||
|
|
||||||
// Get all "navbar-burger" elements
|
|
||||||
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
|
|
||||||
|
|
||||||
// Add a click event on each of them
|
|
||||||
$navbarBurgers.forEach( el => {
|
|
||||||
el.addEventListener('click', () => {
|
|
||||||
|
|
||||||
// Get the target from the "data-target" attribute
|
|
||||||
const target = el.dataset.target;
|
|
||||||
const $target = document.getElementById(target);
|
|
||||||
|
|
||||||
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
|
|
||||||
el.classList.toggle('is-active');
|
|
||||||
$target.classList.toggle('is-active');
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
document.addEventListener("htmx:beforeSwap", function(event) {
|
||||||
</script>
|
localStorage.setItem('scrollpos', window.scrollY);
|
||||||
<style>
|
|
||||||
.icon { border-bottom: 0px !important;}
|
|
||||||
.wrap {
|
|
||||||
/* white-space: pre-wrap;
|
|
||||||
white-space: -moz-pre-wrap;
|
|
||||||
white-space: -pre-wrap;
|
|
||||||
white-space: -o-pre-wrap; */
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
.nowrap-parent {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nowrap-child {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.slider-output {
|
|
||||||
width: 4rem !important;
|
|
||||||
}
|
|
||||||
.htmx-indicator{
|
|
||||||
opacity:0;
|
|
||||||
transition: opacity 500ms ease-in;
|
|
||||||
}
|
|
||||||
.htmx-request .htmx-indicator{
|
|
||||||
opacity:1
|
|
||||||
}
|
|
||||||
.htmx-request.htmx-indicator{
|
|
||||||
opacity:1
|
|
||||||
}
|
|
||||||
.dropdown-content {
|
|
||||||
height: 20em;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
table.relays-table tr:nth-of-type(2n) td {
|
|
||||||
border-bottom: 3px solid grey;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltiptext {
|
});
|
||||||
visibility: hidden;
|
</script>
|
||||||
background-color: black;
|
<script>
|
||||||
color: #fff;
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
text-align: center;
|
|
||||||
padding: 5px 0;
|
|
||||||
border-radius: 6px;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rounded-tooltip:hover .tooltiptext {
|
// Get all "navbar-burger" elements
|
||||||
visibility: visible;
|
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
|
||||||
}
|
|
||||||
|
|
||||||
#sentiment-container {
|
// Add a click event on each of them
|
||||||
position: fixed;
|
$navbarBurgers.forEach( el => {
|
||||||
top: 0;
|
el.addEventListener('click', () => {
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
height: 100vh;
|
|
||||||
width: 100vw;
|
|
||||||
z-index: -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table {
|
// Get the target from the "data-target" attribute
|
||||||
background: transparent !important;
|
const target = el.dataset.target;
|
||||||
}
|
const $target = document.getElementById(target);
|
||||||
|
|
||||||
tr {
|
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
|
||||||
transition: all 0.2s ease-in-out;
|
el.classList.toggle('is-active');
|
||||||
}
|
$target.classList.toggle('is-active');
|
||||||
|
|
||||||
tr:hover {
|
});
|
||||||
cursor:pointer;
|
});
|
||||||
background-color:rgba(221, 224, 255, 0.3) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.panel-block {
|
});
|
||||||
transition: all 0.2s ease-in-out;
|
</script>
|
||||||
}
|
<style>
|
||||||
|
.icon { border-bottom: 0px !important;}
|
||||||
|
.wrap {
|
||||||
|
/* white-space: pre-wrap;
|
||||||
|
white-space: -moz-pre-wrap;
|
||||||
|
white-space: -pre-wrap;
|
||||||
|
white-space: -o-pre-wrap; */
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
.nowrap-parent {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.nowrap-child {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.slider-output {
|
||||||
|
width: 4rem !important;
|
||||||
|
}
|
||||||
|
.htmx-indicator{
|
||||||
|
opacity:0;
|
||||||
|
transition: opacity 500ms ease-in;
|
||||||
|
}
|
||||||
|
.htmx-request .htmx-indicator{
|
||||||
|
opacity:1
|
||||||
|
}
|
||||||
|
.htmx-request.htmx-indicator{
|
||||||
|
opacity:1
|
||||||
|
}
|
||||||
|
.dropdown-content {
|
||||||
|
height: 20em;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
table.relays-table tr:nth-of-type(2n) td {
|
||||||
|
border-bottom: 3px solid grey;
|
||||||
|
}
|
||||||
|
|
||||||
a.panel-block:hover {
|
.tooltiptext {
|
||||||
cursor:pointer;
|
visibility: hidden;
|
||||||
background-color:rgba(221, 224, 255, 0.3) !important;
|
background-color: black;
|
||||||
}
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
padding: 5px 0;
|
||||||
|
border-radius: 6px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
.panel, .box, .modal {
|
.rounded-tooltip:hover .tooltiptext {
|
||||||
background-color:rgba(250, 250, 250, 0.5) !important;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
.modal, .modal.box{
|
|
||||||
background-color:rgba(210, 210, 210, 0.9) !important;
|
|
||||||
}
|
|
||||||
.modal-background{
|
|
||||||
background-color:rgba(255, 255, 255, 0.3) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.has-background-grey-lighter{
|
#sentiment-container {
|
||||||
background-color:rgba(219, 219, 219, 0.5) !important;
|
position: fixed;
|
||||||
}
|
top: 0;
|
||||||
.navbar {
|
right: 0;
|
||||||
background-color:rgba(0, 0, 0, 0.03) !important;
|
bottom: 0;
|
||||||
}
|
left: 0;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
z-index: -2;
|
||||||
|
}
|
||||||
|
|
||||||
.grid-stack-item-content {
|
.table {
|
||||||
display: flex !important;
|
background: transparent !important;
|
||||||
flex-direction: column !important;
|
}
|
||||||
overflow-x: hidden !important;
|
|
||||||
overflow-y: hidden !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel {
|
tr {
|
||||||
display: flex !important;
|
transition: all 0.2s ease-in-out;
|
||||||
flex-direction: column !important;
|
}
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel-block {
|
tr:hover {
|
||||||
overflow-y:auto;
|
cursor:pointer;
|
||||||
overflow-x:auto;
|
background-color:rgba(221, 224, 255, 0.3) !important;
|
||||||
min-height: 90%;
|
}
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.floating-window {
|
a.panel-block {
|
||||||
/* background-color:rgba(210, 210, 210, 0.6) !important; */
|
transition: all 0.2s ease-in-out;
|
||||||
display: flex !important;
|
}
|
||||||
flex-direction: column !important;
|
|
||||||
overflow-x: hidden !important;
|
|
||||||
overflow-y: hidden !important;
|
|
||||||
max-height: 300px;
|
|
||||||
z-index: 9000;
|
|
||||||
position: absolute;
|
|
||||||
top: 50px;
|
|
||||||
left: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.floating-window .panel {
|
a.panel-block:hover {
|
||||||
background-color:rgba(250, 250, 250, 0.8) !important;
|
cursor:pointer;
|
||||||
}
|
background-color:rgba(221, 224, 255, 0.3) !important;
|
||||||
|
}
|
||||||
|
|
||||||
.float-right {
|
.panel, .box, .modal {
|
||||||
float: right;
|
background-color:rgba(250, 250, 250, 0.5) !important;
|
||||||
padding-right: 5px;
|
}
|
||||||
padding-left: 5px;
|
.modal, .modal.box{
|
||||||
}
|
background-color:rgba(210, 210, 210, 0.9) !important;
|
||||||
.grid-stack-item:hover .ui-resizable-handle {
|
}
|
||||||
display: block !important;
|
.modal-background{
|
||||||
}
|
background-color:rgba(255, 255, 255, 0.3) !important;
|
||||||
.ui-resizable-handle {
|
}
|
||||||
z-index: 39 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.small-field {
|
.has-background-grey-lighter{
|
||||||
overflow: hidden;
|
background-color:rgba(219, 219, 219, 0.5) !important;
|
||||||
text-overflow: ellipsis;
|
}
|
||||||
overflow-y: hidden;
|
.navbar {
|
||||||
}
|
background-color:rgba(0, 0, 0, 0.03) !important;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
.grid-stack-item-content {
|
||||||
<!-- Piwik --> {# Yes it's in the source, fight me #}
|
display: flex !important;
|
||||||
<script type="text/javascript">
|
flex-direction: column !important;
|
||||||
var _paq = _paq || [];
|
overflow-x: hidden !important;
|
||||||
_paq.push(['trackPageView']);
|
overflow-y: hidden !important;
|
||||||
_paq.push(['enableLinkTracking']);
|
}
|
||||||
(function() {
|
|
||||||
_paq.push(['setTrackerUrl', 'https://api-a6fe73d3464641fe99ba77e5fdafa19c.s.zm.is']);
|
|
||||||
_paq.push(['setSiteId', 4]);
|
|
||||||
_paq.push(['setApiToken', 'je4TjsrunIM9uD4jrr_DGXJP4_b_Kq6ABhulOLo_Old']);
|
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://c87zpt9a74m181wto33r.s.zm.is/embed.js'; s.parentNode.insertBefore(g,s);
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
<!-- End Piwik Code -->
|
|
||||||
|
|
||||||
</head>
|
.panel {
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-block {
|
||||||
|
overflow-y:auto;
|
||||||
|
overflow-x:auto;
|
||||||
|
min-height: 90%;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-window {
|
||||||
|
/* background-color:rgba(210, 210, 210, 0.6) !important; */
|
||||||
|
display: flex !important;
|
||||||
|
flex-direction: column !important;
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
overflow-y: hidden !important;
|
||||||
|
max-height: 300px;
|
||||||
|
z-index: 9000;
|
||||||
|
position: absolute;
|
||||||
|
top: 50px;
|
||||||
|
left: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-window .panel {
|
||||||
|
background-color:rgba(250, 250, 250, 0.8) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float-right {
|
||||||
|
float: right;
|
||||||
|
padding-right: 5px;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
.grid-stack-item:hover .ui-resizable-handle {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
.ui-resizable-handle {
|
||||||
|
z-index: 39 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-field {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<!-- Piwik --> {# Yes it's in the source, fight me #}
|
||||||
|
<script type="text/javascript">
|
||||||
|
var _paq = _paq || [];
|
||||||
|
_paq.push(['trackPageView']);
|
||||||
|
_paq.push(['enableLinkTracking']);
|
||||||
|
(function() {
|
||||||
|
_paq.push(['setTrackerUrl', 'https://api-a6fe73d3464641fe99ba77e5fdafa19c.s.zm.is']);
|
||||||
|
_paq.push(['setSiteId', 4]);
|
||||||
|
_paq.push(['setApiToken', 'je4TjsrunIM9uD4jrr_DGXJP4_b_Kq6ABhulOLo_Old']);
|
||||||
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://c87zpt9a74m181wto33r.s.zm.is/embed.js'; s.parentNode.insertBefore(g,s);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<!-- End Piwik Code -->
|
||||||
|
|
||||||
|
</head>
|
||||||
|
{% endcache %}
|
||||||
<body>
|
<body>
|
||||||
|
{% cache 600 nav request.user.id %}
|
||||||
<nav class="navbar" role="navigation" aria-label="main navigation">
|
<nav class="navbar" role="navigation" aria-label="main navigation">
|
||||||
<div class="navbar-brand">
|
<div class="navbar-brand">
|
||||||
<a class="navbar-item" href="{% url 'home' %}">
|
|
||||||
<img src="{% static 'logo.svg' %}" width="112" height="28" alt="logo">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="bar">
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="bar" class="navbar-menu">
|
|
||||||
<div class="navbar-start">
|
|
||||||
<a class="navbar-item" href="{% url 'home' %}">
|
<a class="navbar-item" href="{% url 'home' %}">
|
||||||
Search
|
<img src="{% static 'logo.svg' %}" width="112" height="28" alt="logo">
|
||||||
</a>
|
</a>
|
||||||
<a class="navbar-item" href="{% url 'rules' type='page' %}">
|
|
||||||
Rules
|
|
||||||
</a>
|
|
||||||
{% if user.is_authenticated %}
|
|
||||||
<div class="navbar-item has-dropdown is-hoverable">
|
|
||||||
<a class="navbar-link">
|
|
||||||
Account
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="navbar-dropdown">
|
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="bar">
|
||||||
<a class="navbar-item" href="{% url 'billing' %}">
|
<span aria-hidden="true"></span>
|
||||||
Billing
|
<span aria-hidden="true"></span>
|
||||||
</a>
|
<span aria-hidden="true"></span>
|
||||||
<a class="navbar-item" href="{% url 'notifications_update' type='page' %}">
|
|
||||||
Notifications
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if user.is_superuser %}
|
|
||||||
<div class="navbar-item has-dropdown is-hoverable">
|
|
||||||
<a class="navbar-link">
|
|
||||||
Threshold
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="navbar-dropdown">
|
|
||||||
<a class="navbar-item" href="{% url 'threshold_irc_overview' %}">
|
|
||||||
IRC
|
|
||||||
</a>
|
|
||||||
<a class="navbar-item" href="#">
|
|
||||||
Discord
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if perms.core.use_insights %}
|
|
||||||
<div class="navbar-item has-dropdown is-hoverable">
|
|
||||||
<a class="navbar-link">
|
|
||||||
Insights
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="navbar-dropdown">
|
|
||||||
{% for index in user.allowed_indices %}
|
|
||||||
{% if index != "meta" %}
|
|
||||||
<a class="navbar-item" href="{% url 'insights' index=index %}">
|
|
||||||
{{ index }}
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<a class="navbar-item add-button">
|
|
||||||
Install
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="navbar-end">
|
<div id="bar" class="navbar-menu">
|
||||||
<div class="navbar-item">
|
<div class="navbar-start">
|
||||||
<div class="buttons">
|
<a class="navbar-item" href="{% url 'home' %}">
|
||||||
{% if not user.is_authenticated %}
|
Search
|
||||||
<a class="button is-info" href="{% url 'signup' %}">
|
</a>
|
||||||
Sign up
|
<a class="navbar-item" href="{% url 'rules' type='page' %}">
|
||||||
|
Rules
|
||||||
|
</a>
|
||||||
|
{% if user.is_authenticated %}
|
||||||
|
<div class="navbar-item has-dropdown is-hoverable">
|
||||||
|
<a class="navbar-link">
|
||||||
|
Account
|
||||||
</a>
|
</a>
|
||||||
<a class="button" href="{% url 'login' %}">
|
|
||||||
Log in
|
<div class="navbar-dropdown">
|
||||||
|
<a class="navbar-item" href="{% url 'billing' %}">
|
||||||
|
Billing
|
||||||
|
</a>
|
||||||
|
<a class="navbar-item" href="{% url 'notifications_update' type='page' %}">
|
||||||
|
Notifications
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if user.is_superuser %}
|
||||||
|
<div class="navbar-item has-dropdown is-hoverable">
|
||||||
|
<a class="navbar-link">
|
||||||
|
Threshold
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if user.is_authenticated %}
|
<div class="navbar-dropdown">
|
||||||
<a class="button" href="{% url 'logout' %}">Logout</a>
|
<a class="navbar-item" href="{% url 'threshold_irc_overview' %}">
|
||||||
{% endif %}
|
IRC
|
||||||
|
</a>
|
||||||
|
<a class="navbar-item" href="#">
|
||||||
|
Discord
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if perms.core.use_insights %}
|
||||||
|
<div class="navbar-item has-dropdown is-hoverable">
|
||||||
|
<a class="navbar-link">
|
||||||
|
Insights
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="navbar-dropdown">
|
||||||
|
{% for index in user.allowed_indices %}
|
||||||
|
{% if index != "meta" %}
|
||||||
|
<a class="navbar-item" href="{% url 'insights' index=index %}">
|
||||||
|
{{ index }}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<a class="navbar-item add-button">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="navbar-end">
|
||||||
|
<div class="navbar-item">
|
||||||
|
<div class="buttons">
|
||||||
|
{% if not user.is_authenticated %}
|
||||||
|
<a class="button is-info" href="{% url 'signup' %}">
|
||||||
|
Sign up
|
||||||
|
</a>
|
||||||
|
<a class="button" href="{% url 'login' %}">
|
||||||
|
Log in
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if user.is_authenticated %}
|
||||||
|
<a class="button" href="{% url 'logout' %}">Logout</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</nav>
|
||||||
</nav>
|
{% endcache %}
|
||||||
<script>
|
<script>
|
||||||
let deferredPrompt;
|
let deferredPrompt;
|
||||||
const addBtn = document.querySelector('.add-button');
|
const addBtn = document.querySelector('.add-button');
|
||||||
|
|
|
@ -22,3 +22,6 @@ msgpack
|
||||||
apscheduler
|
apscheduler
|
||||||
django-prettyjson
|
django-prettyjson
|
||||||
git+https://git.zm.is/XF/django-crud-mixins
|
git+https://git.zm.is/XF/django-crud-mixins
|
||||||
|
# For caching
|
||||||
|
redis
|
||||||
|
hiredis
|
||||||
|
|
Loading…
Reference in New Issue