web_kbn: relative paths
This commit is contained in:
parent
63ff5dd151
commit
8314dc42dc
@ -248,7 +248,7 @@ async def render(req: web.Request,
|
|||||||
|
|
||||||
@routes.get('/')
|
@routes.get('/')
|
||||||
async def index0(req: web.Request):
|
async def index0(req: web.Request):
|
||||||
raise web.HTTPFound('/main.cgi')
|
raise web.HTTPFound('main.cgi')
|
||||||
|
|
||||||
|
|
||||||
@routes.get('/main.cgi')
|
@routes.get('/main.cgi')
|
||||||
@ -256,7 +256,7 @@ async def index(req: web.Request):
|
|||||||
tabs = ['zones', 'list']
|
tabs = ['zones', 'list']
|
||||||
tab = req.query.get('tab', None)
|
tab = req.query.get('tab', None)
|
||||||
if tab and (tab not in tabs or tab == tabs[0]):
|
if tab and (tab not in tabs or tab == tabs[0]):
|
||||||
raise web.HTTPFound('/main.cgi')
|
raise web.HTTPFound('main.cgi')
|
||||||
if tab is None:
|
if tab is None:
|
||||||
tab = tabs[0]
|
tab = tabs[0]
|
||||||
|
|
||||||
@ -284,7 +284,7 @@ async def modems(req: web.Request):
|
|||||||
context=dict(modems=ModemsConfig()))
|
context=dict(modems=ModemsConfig()))
|
||||||
|
|
||||||
|
|
||||||
@routes.get('/modems/info.ajx')
|
@routes.get('/modems_info.ajx')
|
||||||
async def modems_ajx(req: web.Request):
|
async def modems_ajx(req: web.Request):
|
||||||
mc = ModemsConfig()
|
mc = ModemsConfig()
|
||||||
modem = req.query.get('id', None)
|
modem = req.query.get('id', None)
|
||||||
@ -303,7 +303,7 @@ async def modems_ajx(req: web.Request):
|
|||||||
return http.ajax_ok({'html': html})
|
return http.ajax_ok({'html': html})
|
||||||
|
|
||||||
|
|
||||||
@routes.get('/modems/verbose.cgi')
|
@routes.get('/modems_verbose.cgi')
|
||||||
async def modems_verbose(req: web.Request):
|
async def modems_verbose(req: web.Request):
|
||||||
modem = req.query.get('id', None)
|
modem = req.query.get('id', None)
|
||||||
if modem not in ModemsConfig().keys():
|
if modem not in ModemsConfig().keys():
|
||||||
@ -356,7 +356,7 @@ async def sms_post(req: web.Request):
|
|||||||
phone = fd.get('phone', None)
|
phone = fd.get('phone', None)
|
||||||
text = fd.get('text', None)
|
text = fd.get('text', None)
|
||||||
|
|
||||||
return_url = f'/sms.cgi?id={modem}&outbox={int(is_outbox)}'
|
return_url = f'sms.cgi?id={modem}&outbox={int(is_outbox)}'
|
||||||
phone = re.sub('\s+', '', phone)
|
phone = re.sub('\s+', '', phone)
|
||||||
|
|
||||||
if len(phone) > 4:
|
if len(phone) > 4:
|
||||||
@ -383,7 +383,7 @@ async def inverter(req: web.Request):
|
|||||||
cl = get_inverter_client()
|
cl = get_inverter_client()
|
||||||
cl.exec('set-output-source-priority',
|
cl.exec('set-output-source-priority',
|
||||||
arguments=(val.upper(),))
|
arguments=(val.upper(),))
|
||||||
raise web.HTTPFound('/inverter.cgi')
|
raise web.HTTPFound('inverter.cgi')
|
||||||
|
|
||||||
status, rated, html = await asyncio.get_event_loop().run_in_executor(None, get_inverter_data)
|
status, rated, html = await asyncio.get_event_loop().run_in_executor(None, get_inverter_data)
|
||||||
return await render(req, 'inverter',
|
return await render(req, 'inverter',
|
||||||
@ -408,7 +408,7 @@ async def pump(req: web.Request):
|
|||||||
action = req.query.get('set', None)
|
action = req.query.get('set', None)
|
||||||
if action in ('on', 'off'):
|
if action in ('on', 'off'):
|
||||||
getattr(cl, action)()
|
getattr(cl, action)()
|
||||||
raise web.HTTPFound('/pump.cgi')
|
raise web.HTTPFound('pump.cgi')
|
||||||
|
|
||||||
status = cl.status()
|
status = cl.status()
|
||||||
return await render(req, 'pump',
|
return await render(req, 'pump',
|
||||||
@ -468,7 +468,7 @@ async def cams(req: web.Request):
|
|||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
@routes.get('/routing/main.cgi')
|
@routes.get('/routing_main.cgi')
|
||||||
async def routing_main(req: web.Request):
|
async def routing_main(req: web.Request):
|
||||||
upstream = get_current_upstream()
|
upstream = get_current_upstream()
|
||||||
|
|
||||||
@ -479,7 +479,7 @@ async def routing_main(req: web.Request):
|
|||||||
modem = mc[set_upstream_to]
|
modem = mc[set_upstream_to]
|
||||||
new_upstream = str(modem['gateway_ip'] if 'gateway_ip' in modem else modem['ip'])
|
new_upstream = str(modem['gateway_ip'] if 'gateway_ip' in modem else modem['ip'])
|
||||||
openwrt.set_upstream(new_upstream)
|
openwrt.set_upstream(new_upstream)
|
||||||
raise web.HTTPFound('/routing/main.cgi')
|
raise web.HTTPFound('routing_main.cgi')
|
||||||
|
|
||||||
context = dict(
|
context = dict(
|
||||||
upstream=upstream,
|
upstream=upstream,
|
||||||
@ -489,7 +489,7 @@ async def routing_main(req: web.Request):
|
|||||||
return await render(req, 'routing_main', title=lang('routing'), context=context)
|
return await render(req, 'routing_main', title=lang('routing'), context=context)
|
||||||
|
|
||||||
|
|
||||||
@routes.get('/routing/rules.cgi')
|
@routes.get('/routing_rules.cgi')
|
||||||
async def routing_rules(req: web.Request):
|
async def routing_rules(req: web.Request):
|
||||||
mc = ModemsConfig()
|
mc = ModemsConfig()
|
||||||
|
|
||||||
@ -520,7 +520,7 @@ async def routing_rules(req: web.Request):
|
|||||||
if not validate_ipv4(ip_without_mask):
|
if not validate_ipv4(ip_without_mask):
|
||||||
raise ValueError(f'invalid ip \'{ip}\'')
|
raise ValueError(f'invalid ip \'{ip}\'')
|
||||||
|
|
||||||
base_url = '/routing/rules.cgi'
|
base_url = 'routing_rules.cgi'
|
||||||
if action in ('add', 'del'):
|
if action in ('add', 'del'):
|
||||||
try:
|
try:
|
||||||
validate_input()
|
validate_input()
|
||||||
@ -544,7 +544,7 @@ async def routing_rules(req: web.Request):
|
|||||||
context=context)
|
context=context)
|
||||||
|
|
||||||
|
|
||||||
@routes.get('/routing/dhcp.cgi')
|
@routes.get('/routing_dhcp.cgi')
|
||||||
async def routing_dhcp(req: web.Request):
|
async def routing_dhcp(req: web.Request):
|
||||||
leases = openwrt.get_dhcp_leases()
|
leases = openwrt.get_dhcp_leases()
|
||||||
return await render(req, 'routing_dhcp',
|
return await render(req, 'routing_dhcp',
|
||||||
|
@ -238,7 +238,7 @@ class ModemStatusUpdater {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fetch() {
|
fetch() {
|
||||||
ajax.get('/modems/info.ajx', {
|
ajax.get('modems_info.ajx', {
|
||||||
id: this.id
|
id: this.id
|
||||||
}).then(({response}) => {
|
}).then(({response}) => {
|
||||||
const {html} = response;
|
const {html} = response;
|
||||||
@ -268,7 +268,7 @@ var Inverter = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_tick: function() {
|
_tick: function() {
|
||||||
ajax.get('/inverter.ajx')
|
ajax.get('inverter.ajx')
|
||||||
.then(({response}) => {
|
.then(({response}) => {
|
||||||
if (response) {
|
if (response) {
|
||||||
var el = document.getElementById('inverter_status');
|
var el = document.getElementById('inverter_status');
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{% macro breadcrumbs(history) %}
|
{% macro breadcrumbs(history) %}
|
||||||
<nav aria-label="breadcrumb">
|
<nav aria-label="breadcrumb">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item"><a href="/main.cgi">{{ "main"|lang }}</a></li>
|
<li class="breadcrumb-item"><a href="main.cgi">{{ "main"|lang }}</a></li>
|
||||||
{% for item in history %}
|
{% for item in history %}
|
||||||
<li class="breadcrumb-item"{% if loop.last %} aria-current="page"{% endif %}>
|
<li class="breadcrumb-item"{% if loop.last %} aria-current="page"{% endif %}>
|
||||||
{% if item.link %}<a href="{{ item.link }}">{% endif %}
|
{% if item.link %}<a href="{{ item.link }}">{% endif %}
|
||||||
|
@ -5,12 +5,12 @@
|
|||||||
{{ breadcrumbs([{'text': "cams"|lang}]) }}
|
{{ breadcrumbs([{'text': "cams"|lang}]) }}
|
||||||
{% elif mode.type == 'zone' %}
|
{% elif mode.type == 'zone' %}
|
||||||
{{ breadcrumbs([
|
{{ breadcrumbs([
|
||||||
{'link': '/cams.cgi', 'text': "cams"|lang},
|
{'link': 'cams.cgi', 'text': "cams"|lang},
|
||||||
{'text': mode.zone|lang('ipcam_zones')}
|
{'text': mode.zone|lang('ipcam_zones')}
|
||||||
]) }}
|
]) }}
|
||||||
{% elif mode.type == 'single' %}
|
{% elif mode.type == 'single' %}
|
||||||
{{ breadcrumbs([
|
{{ breadcrumbs([
|
||||||
{'link': '/cams.cgi', 'text': "cams"|lang},
|
{'link': 'cams.cgi', 'text': "cams"|lang},
|
||||||
{'text': mode.cam|lang('ipcam')}
|
{'text': mode.cam|lang('ipcam')}
|
||||||
]) }}
|
]) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -23,16 +23,16 @@
|
|||||||
|
|
||||||
<h6>{{ "internet"|lang }}</h6>
|
<h6>{{ "internet"|lang }}</h6>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item"><a href="/modems.cgi">{{ "modems"|lang }}</a></li>
|
<li class="list-group-item"><a href="modems.cgi">{{ "modems"|lang }}</a></li>
|
||||||
<li class="list-group-item"><a href="/routing/main.cgi">{{ "routing"|lang }}</a></li>
|
<li class="list-group-item"><a href="routing/main.cgi">{{ "routing"|lang }}</a></li>
|
||||||
<li class="list-group-item"><a href="/sms.cgi">{{ "sms"|lang }}</a></li>
|
<li class="list-group-item"><a href="sms.cgi">{{ "sms"|lang }}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h6 class="mt-4">{{ "misc"|lang }}</h6>
|
<h6 class="mt-4">{{ "misc"|lang }}</h6>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item"><a href="/inverter.cgi">{{ "inverter"|lang }}</a> (<a href="{{ inverter_grafana_url }}">Grafana</a>)</li>
|
<li class="list-group-item"><a href="inverter.cgi">{{ "inverter"|lang }}</a> (<a href="{{ inverter_grafana_url }}">Grafana</a>)</li>
|
||||||
{# <li class="list-group-item"><a href="/pump.cgi">{{ "pump"|lang }}</a></li>#}
|
{# <li class="list-group-item"><a href="pump.cgi">{{ "pump"|lang }}</a></li>#}
|
||||||
{# <li class="list-group-item"><a href="/sensors.cgi">{{ "sensors"|lang }}</a> (<a href="{{ sensors_grafana_url }}">Grafana</a>)</li>#}
|
{# <li class="list-group-item"><a href="sensors.cgi">{{ "sensors"|lang }}</a> (<a href="{{ sensors_grafana_url }}">Grafana</a>)</li>#}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<nav class="mt-4">
|
<nav class="mt-4">
|
||||||
@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
<div class="camzones" id="cam_zones"{% if tab_selected != 'zones' %} style="display: none"{% endif %}>
|
<div class="camzones" id="cam_zones"{% if tab_selected != 'zones' %} style="display: none"{% endif %}>
|
||||||
{% for zone in camzones %}
|
{% for zone in camzones %}
|
||||||
<a href="/cams.cgi?zone={{ zone }}" class="camzone">
|
<a href="cams.cgi?zone={{ zone }}" class="camzone">
|
||||||
<div class="camzone_text">{{ zone|lang('ipcam_zones') }}</div>
|
<div class="camzone_text">{{ zone|lang('ipcam_zones') }}</div>
|
||||||
</a>
|
</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -53,7 +53,7 @@
|
|||||||
|
|
||||||
<div class="list-group cams_list_group" id="cam_list"{% if tab_selected != 'list' %} style="display: none"{% endif %}>
|
<div class="list-group cams_list_group" id="cam_list"{% if tab_selected != 'list' %} style="display: none"{% endif %}>
|
||||||
{% for id in allcams %}
|
{% for id in allcams %}
|
||||||
<a href="/cams.cgi?id={{ id }}" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
|
<a href="cams.cgi?id={{ id }}" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
|
||||||
{{ id|lang('ipcam') }}
|
{{ id|lang('ipcam') }}
|
||||||
<span class="icon-right">
|
<span class="icon-right">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-3">
|
<div class="pt-3">
|
||||||
<a href="/inverter.cgi?do=set-osp&value={{ 'sub' if rated.output_source_priority == 'Solar-Battery-Utility' else 'sbu' }}">
|
<a href="inverter.cgi?do=set-osp&value={{ 'sub' if rated.output_source_priority == 'Solar-Battery-Utility' else 'sbu' }}">
|
||||||
<button type="button" class="btn btn-primary">{{ "inverter_switch_to"|lang }} <b>{{ 'Solar-Utility-Battery' if rated.output_source_priority == 'Solar-Battery-Utility' else 'Solar-Battery-Utility' }}</b></button>
|
<button type="button" class="btn btn-primary">{{ "inverter_switch_to"|lang }} <b>{{ 'Solar-Utility-Battery' if rated.output_source_priority == 'Solar-Battery-Utility' else 'Solar-Battery-Utility' }}</b></button>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,4 +10,4 @@
|
|||||||
<span class="text-secondary">{{ "modem_connection_time"|lang }}:</span> {{ modem_data.connected_time }}<br>
|
<span class="text-secondary">{{ "modem_connection_time"|lang }}:</span> {{ modem_data.connected_time }}<br>
|
||||||
<span class="text-secondary">{{ "modem_tx_rx"|lang }}:</span> {{ modem_data.downloaded }} / {{ modem_data.uploaded }}
|
<span class="text-secondary">{{ "modem_tx_rx"|lang }}:</span> {{ modem_data.downloaded }} / {{ modem_data.uploaded }}
|
||||||
<br>
|
<br>
|
||||||
<a href="/modems/verbose.cgi?id={{ modem }}">{{ "modem_verbose_info"|lang }}</a>
|
<a href="modems_verbose.cgi?id={{ modem }}">{{ "modem_verbose_info"|lang }}</a>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{{ breadcrumbs([
|
{{ breadcrumbs([
|
||||||
{'link': '/modems.cgi', 'text': 'modems'|lang},
|
{'link': 'modems.cgi', 'text': 'modems'|lang},
|
||||||
{'text': modem_name}
|
{'text': modem_name}
|
||||||
]) }}
|
]) }}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
{{ breadcrumbs([{'text': 'pump'|lang}]) }}
|
{{ breadcrumbs([{'text': 'pump'|lang}]) }}
|
||||||
|
|
||||||
<form action="/pump.cgi" method="get">
|
<form action="pump.cgi" method="get">
|
||||||
<input type="hidden" name="set" value="{{ 'off' if status == 'on' else 'on' }}" />
|
<input type="hidden" name="set" value="{{ 'off' if status == 'on' else 'on' }}" />
|
||||||
{{ "pump_now_is"|lang }}
|
{{ "pump_now_is"|lang }}
|
||||||
{% if status == 'on' %}
|
{% if status == 'on' %}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
{{ breadcrumbs([{'text': 'routing'|lang}]) }}
|
{{ breadcrumbs([{'text': 'routing'|lang}]) }}
|
||||||
|
|
||||||
{% set routing_tabs = [
|
{% set routing_tabs = [
|
||||||
{'tab': 'main', 'url': '/routing/main.cgi', 'label': 'routing_main'|lang},
|
{'tab': 'main', 'url': 'routing_main.cgi', 'label': 'routing_main'|lang},
|
||||||
{'tab': 'rules', 'url': '/routing/rules.cgi', 'label': 'routing_rules'|lang},
|
{'tab': 'rules', 'url': 'routing_rules.cgi', 'label': 'routing_rules'|lang},
|
||||||
{'tab': 'dhcp', 'url': '/routing/dhcp.cgi', 'label': 'DHCP'}
|
{'tab': 'dhcp', 'url': 'routing_dhcp.cgi', 'label': 'DHCP'}
|
||||||
] %}
|
] %}
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
{% for modem in modems %}
|
{% for modem in modems %}
|
||||||
{% if modem != upstream %}
|
{% if modem != upstream %}
|
||||||
<div class="pt-1 pb-2">
|
<div class="pt-1 pb-2">
|
||||||
<a href="/routing/main.cgi?set-upstream-to={{ modem }}">
|
<a href="routing_main.cgi?set-upstream-to={{ modem }}">
|
||||||
<button type="button" class="btn btn-primary">{{ "routing_switch_to"|lang }} <b>{{ (modem|lang('modems'))['full'] }}</b></button>
|
<button type="button" class="btn btn-primary">{{ "routing_switch_to"|lang }} <b>{{ (modem|lang('modems'))['full'] }}</b></button>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,14 +10,14 @@
|
|||||||
|
|
||||||
{% if ips %}
|
{% if ips %}
|
||||||
{% for ip in ips %}
|
{% for ip in ips %}
|
||||||
<div>{{ ip }} (<a href="/routing/rules.cgi?action=del&set={{ set }}&ip={{ ip }}" onclick="return confirm('{{ 'routing_deleting_confirmation'|lang|format(ip, set) }}')">{{ "routing_del"|lang }}</a>)</div>
|
<div>{{ ip }} (<a href="routing_rules.cgi?action=del&set={{ set }}&ip={{ ip }}" onclick="return confirm('{{ 'routing_deleting_confirmation'|lang|format(ip, set) }}')">{{ "routing_del"|lang }}</a>)</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="text-secondary">{{ "routing_no_records"|lang }}</span>
|
<span class="text-secondary">{{ "routing_no_records"|lang }}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div style="max-width: 300px">
|
<div style="max-width: 300px">
|
||||||
<form method="get" action="/routing/rules.cgi">
|
<form method="get" action="routing_rules.cgi">
|
||||||
<input type="hidden" name="action" value="add">
|
<input type="hidden" name="action" value="add">
|
||||||
<input type="hidden" name="set" value="{{ set }}">
|
<input type="hidden" name="set" value="{{ set }}">
|
||||||
<div class="input-group mt-2">
|
<div class="input-group mt-2">
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<nav>
|
<nav>
|
||||||
<div class="nav nav-tabs" id="nav-tab">
|
<div class="nav nav-tabs" id="nav-tab">
|
||||||
{% for modem in modems.keys() %}
|
{% for modem in modems.keys() %}
|
||||||
{% if selected_modem != modem %}<a href="/sms.cgi?id={{ modem }}" class="text-decoration-none">{% endif %}
|
{% if selected_modem != modem %}<a href="sms.cgi?id={{ modem }}" class="text-decoration-none">{% endif %}
|
||||||
<button class="nav-link{% if modem == selected_modem %} active{% endif %}" type="button">{{ (modem|lang('modems'))['short'] }}</button>
|
<button class="nav-link{% if modem == selected_modem %} active{% endif %}" type="button">{{ (modem|lang('modems'))['short'] }}</button>
|
||||||
{% if selected_modem != modem %}</a>{% endif %}
|
{% if selected_modem != modem %}</a>{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -26,7 +26,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<form method="post" action="/sms.cgi">
|
<form method="post" action="sms.cgi">
|
||||||
<input type="hidden" name="modem" value="{{ selected_modem }}">
|
<input type="hidden" name="modem" value="{{ selected_modem }}">
|
||||||
<div class="form-floating mb-3">
|
<div class="form-floating mb-3">
|
||||||
<input type="text" name="phone" class="form-control" id="inputPhone" placeholder="+7911xxxyyzz">
|
<input type="text" name="phone" class="form-control" id="inputPhone" placeholder="+7911xxxyyzz">
|
||||||
@ -45,9 +45,9 @@
|
|||||||
<h6 class="text-primary mt-4">
|
<h6 class="text-primary mt-4">
|
||||||
{{ "sms_latest"|lang }}
|
{{ "sms_latest"|lang }}
|
||||||
{% if not is_outbox %}
|
{% if not is_outbox %}
|
||||||
<b>{{ "sms_inbox"|lang }}</b> <span class="text-black-50">|</span> <a href="/sms.cgi?id={{ selected_modem }}&outbox=1">{{ "sms_outbox"|lang }}</a>
|
<b>{{ "sms_inbox"|lang }}</b> <span class="text-black-50">|</span> <a href="sms.cgi?id={{ selected_modem }}&outbox=1">{{ "sms_outbox"|lang }}</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="/sms.cgi?id={{ selected_modem }}">{{ "sms_inbox"|lang }}</a> <span class="text-black-50">|</span> <b>{{ "sms_outbox"|lang }}</b>
|
<a href="sms.cgi?id={{ selected_modem }}">{{ "sms_inbox"|lang }}</a> <span class="text-black-50">|</span> <b>{{ "sms_outbox"|lang }}</b>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</h6>
|
</h6>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user