S allius/issue394 (#400)
* store logging path in Config class * rename template files and page files * jump to referer page - after changing the language, we jump to the referer page, if the attribute exists * build and send list of log-files * rename Download page into Log files * initialize log-path in test config * improve dashboard unit tests - add log file tests - check content-languages after language switch * initialize config structure for log-file tests * add test log file to project * add sub_dir to test log path - non files must be skipped. To test this we add a sub directory to the test log directory * add german translations * set quart debug flag for debug versions * update changelog
This commit is contained in:
@@ -75,8 +75,8 @@ async def data_fetch():
|
||||
"proxy-cnt": f"<h3>{Infos.get_counter('ProxyMode_Cnt')}</h3>",
|
||||
"emulation-cnt": f"<h3>{Infos.get_counter('EmuMode_Cnt')}</h3>",
|
||||
}
|
||||
data["conn-table"] = await render_template('conn_table.html.j2',
|
||||
data["conn-table"] = await render_template('templ_conn_table.html.j2',
|
||||
table=get_table_data())
|
||||
|
||||
data["notes-list"] = await render_template('notes_list.html.j2')
|
||||
data["notes-list"] = await render_template('templ_notes_list.html.j2')
|
||||
return data
|
||||
|
||||
@@ -38,5 +38,8 @@ def utility_processor():
|
||||
async def set_language(language=None):
|
||||
if language in LANGUAGES:
|
||||
session['language'] = language
|
||||
return redirect('../#')
|
||||
|
||||
rsp = redirect(request.referrer if request.referrer else '../#')
|
||||
rsp.content_language = language
|
||||
return rsp
|
||||
return abort(404)
|
||||
|
||||
52
app/src/web/log_files.py
Normal file
52
app/src/web/log_files.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from quart import render_template
|
||||
from quart_babel import format_datetime, format_decimal
|
||||
from quart.helpers import send_from_directory
|
||||
from werkzeug.utils import secure_filename
|
||||
from cnf.config import Config
|
||||
import os
|
||||
|
||||
from . import web
|
||||
|
||||
|
||||
def _get_file(file):
|
||||
'''build one row for the connection table'''
|
||||
entry = {}
|
||||
entry['name'] = file.name
|
||||
stat = file.stat()
|
||||
entry['size'] = format_decimal(stat.st_size)
|
||||
entry['date'] = stat.st_mtime
|
||||
entry['created'] = format_datetime(stat.st_ctime, format="short")
|
||||
entry['modified'] = format_datetime(stat.st_mtime, format="short")
|
||||
return entry
|
||||
|
||||
|
||||
def get_list_data():
|
||||
'''build the connection table'''
|
||||
file_list = []
|
||||
with os.scandir(Config.get_log_path()) as it:
|
||||
for entry in it:
|
||||
if entry.is_file():
|
||||
file_list.append(_get_file(entry))
|
||||
|
||||
file_list.sort(key=lambda x: x['date'], reverse=True)
|
||||
return file_list
|
||||
|
||||
|
||||
@web.route('/file-fetch')
|
||||
async def file_fetch():
|
||||
data = {
|
||||
"update-time": format_datetime(format="medium"),
|
||||
}
|
||||
data["file-list"] = await render_template('templ_log_files_list.html.j2',
|
||||
dir_list=get_list_data())
|
||||
|
||||
data["notes-list"] = await render_template('templ_notes_list.html.j2')
|
||||
return data
|
||||
|
||||
|
||||
@web.route('/send-file/<file>')
|
||||
async def send(file):
|
||||
return await send_from_directory(
|
||||
directory=Config.get_log_path(),
|
||||
file_name=secure_filename(file),
|
||||
as_attachment=True)
|
||||
@@ -7,10 +7,17 @@ from . import web
|
||||
@web.route('/')
|
||||
async def index():
|
||||
return await render_template(
|
||||
'index.html.j2',
|
||||
fetch_url=url_for('web.data_fetch'))
|
||||
'page_index.html.j2',
|
||||
fetch_url=url_for('.data_fetch'))
|
||||
|
||||
|
||||
@web.route('/page')
|
||||
async def empty():
|
||||
return await render_template('empty.html.j2')
|
||||
|
||||
|
||||
@web.route('/logging')
|
||||
async def logging():
|
||||
return await render_template(
|
||||
'page_logging.html.j2',
|
||||
fetch_url=url_for('.file_fetch'))
|
||||
|
||||
@@ -55,16 +55,16 @@
|
||||
</div>
|
||||
<div class="w3-bar-block">
|
||||
<button href="#" class="w3-bar-item w3-button w3-padding-16 w3-hide-large w3-dark-grey w3-hover-black" onclick="w3_close()" title="close menu"><i class="fa fa-remove fa-fw"></i> Close Menu</button>
|
||||
<a href="{{ url_for('web.index')}}" class="w3-bar-item w3-button w3-padding {% block menu1_class %}{% endblock %}"><i class="fa fa-network-wired fa-fw"></i> {{_('Connections')}}</a>
|
||||
<a href="{{ url_for('web.empty')}}" class="w3-bar-item w3-button w3-padding {% block menu2_class %}{% endblock %}"><i class="fa fa-database fa-fw"></i> MQTT</a>
|
||||
<a href="{{ url_for('web.empty')}}" class="w3-bar-item w3-button w3-padding"><i class="fa fa-file-export fa-fw {% block menu3_class %}{% endblock %}"></i> Downloads</a>
|
||||
<a href="{{ url_for('.index')}}" class="w3-bar-item w3-button w3-padding {% block menu1_class %}{% endblock %}"><i class="fa fa-network-wired fa-fw"></i> {{_('Connections')}}</a>
|
||||
<a href="{{ url_for('.empty')}}" class="w3-bar-item w3-button w3-padding {% block menu2_class %}{% endblock %}"><i class="fa fa-database fa-fw"></i> MQTT</a>
|
||||
<a href="{{ url_for('.logging')}}" class="w3-bar-item w3-button w3-padding {% block menu3_class %}{% endblock %}"><i class="fa fa-file-export fa-fw"></i> {{_('Log Files')}}</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<!-- Overlay effect when opening sidebar on small screens -->
|
||||
<button class="w3-overlay w3-hide-large w3-animate-opacity" onclick="w3_close()" style="cursor:pointer" title="close side menu" id="myOverlay"></button>
|
||||
|
||||
|
||||
<!-- !PAGE CONTENT! -->
|
||||
<div class="w3-main" style="margin-left:250px;margin-top:43px;">
|
||||
|
||||
|
||||
11
app/src/web/templates/page_logging.html.j2
Normal file
11
app/src/web/templates/page_logging.html.j2
Normal file
@@ -0,0 +1,11 @@
|
||||
{% extends 'base.html.j2' %}
|
||||
|
||||
{% block title %} TSUN Proxy - Downloads {% endblock title%}
|
||||
{% block menu3_class %}w3-blue{% endblock %}
|
||||
{% block headline %}<i class="fa fa-file-export fa-fw"></i> {{_('Log Files')}}{% endblock headline %}
|
||||
{% block content %}
|
||||
<div class="w3-container" id="file-list"></div>
|
||||
{% endblock content%}
|
||||
|
||||
{% block footer %}{% endblock footer %}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
{% endif %}
|
||||
{%- endmacro%}
|
||||
|
||||
<h5>Connections</h5>
|
||||
<h5>{{_('Connections')}}</h5>
|
||||
<table class="w3-table w3-striped w3-bordered w3-border w3-hoverable w3-white">
|
||||
{% if table.thead is defined%}
|
||||
<thead>
|
||||
31
app/src/web/templates/templ_log_files_list.html.j2
Normal file
31
app/src/web/templates/templ_log_files_list.html.j2
Normal file
@@ -0,0 +1,31 @@
|
||||
<div class="w3-row-padding w3-margin-bottom">
|
||||
{% for file in dir_list %}
|
||||
<div class="w3-quarter w3-margin-bottom">
|
||||
|
||||
<div class="w3-card-4">
|
||||
<header class="w3-container w3-blue">
|
||||
<h4>{{file.name}}</h4>
|
||||
</header>
|
||||
|
||||
<table class="w3-table">
|
||||
{% for idx, name in [('created',_('Created')), ('modified', _('Modified')), ('size', _('Size'))]%}
|
||||
<tr>
|
||||
<td>{{_(name)}}:</td>
|
||||
<td>{{file[idx]}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<footer class="w3-blue">
|
||||
<a href="{{ url_for('web.send',file=file.name)}}" class="w3-button w3-hover-blue w3-hover-text-black"><i class="fa fa-file-export"></i> {{_('Download File')}}</a>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% if 0 == (loop.index%4) and not last %}
|
||||
</div>
|
||||
<div class="w3-row-padding w3-margin-bottom">
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user