Added session support and themes

This commit is contained in:
Antonio de la Rosa 2024-05-07 01:38:44 +02:00
parent 4bdaaf5e8c
commit f80c51045e
4 changed files with 241 additions and 117 deletions

View file

@ -74,7 +74,7 @@ def admin(paramecio_session: Annotated[str | None, Cookie()] = None):
if 'admin' in arr_user: if 'admin' in arr_user:
return "Hello world" return t.load_template('home.phtml', title=_('Admin'), user=arr_user)
else: else:
raise HTTPException(status_code=404, detail="User incorrect") raise HTTPException(status_code=404, detail="User incorrect")
@ -352,6 +352,26 @@ def admin_recovery_passsword():
return "" return ""
@admin_app.get('/change_theme')
def change_theme(theme: int, paramecio_session: Annotated[str | None, Cookie()] = None):
resp={'error': 0}
response=JSONResponse(resp)
s=URLSafeSerializer(config.secret_key)
arr_user=get_user(paramecio_session)
arr_user['theme']=theme
value_cookie=s.dumps(arr_user)
response.set_cookie(key=cookie_name, value=value_cookie)
return response
"""Function for get the number of login tries """Function for get the number of login tries
""" """

View file

@ -0,0 +1,211 @@
<%
dark_checked=''
dark_css=''
if user.get('theme', 0)==1:
dark_checked='checked'
dark_css='dark'
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>${title}</title>
<link href="${make_media_url('css/admin.css', 'admin')}" rel="stylesheet" />
<link href="${make_media_url('css/font-awesome.min.css', 'admin')}" rel="stylesheet" />
<link href="${make_media_url('css/responsive-nav.css', 'admin')}" rel="stylesheet" />
<link href="${make_media_url('css/tooltipster.bundle.min.css', 'admin')}" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<%block name="extra_css">
</%block>
<script language="Javascript" src="${make_media_url('js/jquery.min.js', 'admin')}"></script>
<script language="Javascript" src="${make_media_url('js/responsive-nav.min.js', 'admin')}"></script>
<script language="Javascript" src="${make_media_url('js/tooltipster.bundle.min.js', 'admin')}"></script>
${load_js()|n}
<%block name="extra_js">
</%block>
<%block name="extra_header">
</%block>
</head>
<body class="${dark_css}">
<div id="layer_loading"><div id="container_loading"><div class="lds-dual-ring"></div></div></div>
<div id="languages_general">
</div>
<div id="logout">
<%block name="logout"><a href="${make_url('admin/logout')}"><i class="fa fa-power-off" aria-hidden="true"></i> Logout</a></%block>
</div>
<div id="center_body">
<div id="header">
<a href="#nav" id="toggle"><i class="fa fa-bars" aria-hidden="true"></i><span>Menu</span></a>
<%block name="title_admin">
<%
from settings import config
portal_admin_name_set=('Paramecio', 'Framework!')
if hasattr(config, 'portal_admin_name_set'):
portal_admin_name_set=('Paramecio', 'Framework!')
%>
<span id="title_phango">${portal_admin_name_set[0]}</span> <span id="title_framework">${portal_admin_name_set[1]}</span>
</%block>
</div>
<div class="content_admin">
<nav id="menu" class="nav-collapse">
<ul>
<li class="menu_title"><%block name="applications"><i class="fa fa-gear" aria-hidden="true"></i>${_('Applications')}</li></%block>
<%block name="menu_list">
<%
from paramecio2.libraries.config_admin import config_admin
%>
% for admin in config_admin:
<%
class_selected=''
link_text=''
%>
% if len(admin)>=3:
<%
if admin[2]==path_module:
class_selected='selected_menu'
icon_module='fa-circle-o'
if len(admin)>3:
icon_module=admin[3]
if type(admin[0]).__name__=='function':
link_text=admin[0]()
else:
link_text=admin[0]
%>
<li><a href="${url_for(admin[2])}" class="${class_selected}">&nbsp;<i class="fa ${icon_module}" aria-hidden="true"></i>${link_text}</a></li>
% elif len(admin)==1:
<%
if type(admin[0]).__name__=='function':
link_text=admin[0]()
else:
link_text=admin[0]
%>
<li><div class="father_admin">${link_text}</div></li>
% endif
% endfor
</%block>
</ul>
</nav>
<div class="contents">
<h1>${title}</h1>
<div class="switch-btn">
<div class="switch-text">
${_('Dark theme')}
</div>
<div class="switch-slider">
<label class="switch">
<input type="checkbox" name="theme" value="1" id="theme" ${dark_checked}/>
<span class="slider round"></span>
</label>
</div>
</div>
<div class="content">
<script>setTimeout(function () { $(".flash").fadeOut(); }, 3000);</script>
<%block name="content">
</%block>
</div>
</div>
</div>
<div id="loading_ajax">
</div>
<script>
var navigation = responsiveNav(".nav-collapse", {customToggle: "#toggle"});
$('.tooltip').tooltipster({
animation: 'fade',
delay: 100,
trigger: 'click'
});
const slider = document.querySelector('input[name="theme"]');
slider.addEventListener("change", function () {
//Block button while send to ajax.
$(this).prop("disabled",true);
var dark='';
if (this.checked) {
document.body.classList.add("dark");
dark='1';
} else {
document.body.classList.remove("dark");
dark='0';
}
$.ajax({
url: "${make_url('admin/change_theme')}?theme="+dark,
type: 'GET',
data: {},
success: function (data) {
if(!data.error) {
console.log('Changed to dark in all pages');
}
else {
console.log('Cannot set dark theme in all pages!');
}
$(slider).prop("disabled",false);
},
error: function (data) {
alert('Error: '+data.status+' '+data.statusText);
$(slider).prop("disabled", false);
},
dataType: 'json'
});
});
$(document).ready(function () {
$('#layer_loading').hide();
});
</script>
<%block name="jscript_block">
</%block>
</body>
</html>

View file

@ -0,0 +1,9 @@
<%inherit file="dashboard.phtml"/>
<%block name="content">
<div class="title">
${_('Welcome to Paramecio Admin')}
</div>
<div class="cont">
${_('From here you can admin your site')}
</div>
</%block>

View file

@ -1,116 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title><%block name="title">${_('Paramecio Login')}</%block></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
<link href="${make_media_url('css/login.css', 'admin')}" rel='stylesheet' type='text/css'>
<link href="${make_media_url('css/font-awesome.min.css', 'admin')}" rel='stylesheet' type='text/css'>
<%block name="extra_css">
</%block>
<script language="Javascript" src="${make_media_url('js/jquery.min.js', 'admin')}"></script>
<%block name="extra_js">
</%block>
<%block name="ajax">
<script language="javascript">
$(document).ready( function () {
$('#login_submit').click( function () {
$('#loading').show();
$('#login_submit').prop('disabled', true);
data_form={'username': $('#username_form').val(), 'password': $('#password_form').val(), 'csrf_token': $("#csrf_token").val()};
if($('#remember_login:checked').val())
{
data_form.remember_login=$('#remember_login').val();
}
$.ajax({
url: "${url_for('admin_login')}",
method: "POST",
dataType: "json",
data: data_form
}).done(function(data) {
if(data.error==0)
{
//location.reload()
location.href="${url_for('admin')}";
}
else
{
$('#login_submit').prop('disabled', false);
//$('#csrf_token').val(data.csrf_token);
// Firefox have a horrible and stupid bug and you need attr for set de new csrf_token
$('#csrf_token').attr('value', data.csrf_token);
$('#loading').hide('slow');
if(data.hasOwnProperty('disable')) {
$('#username_error').html("${_('Error, your user is disabled, you need support of web administration')}");
} if(data.hasOwnProperty('you_cannot_login')) {
if(data.you_cannot_login) {
$('#username_error').html("${_('Error, excessive tries, wait some minutes for login again')}");
}
else {
$('#username_error').html("${_('Error, wrong username or password')}");
}
}
else {
$('#username_error').html("${_('Error, wrong username or password')}");
}
}
});
return false;
});
});
</script>
</%block>
</head>
<body>
<%block name="content">
<form id="login">
<div id="title">
${_('Paramecio Login')}
</div>
${forms|n}
<div class="form">
${_('Remember login?')} <input type="checkbox" id="remember_login" name="remember_login" value="1">
</div>
<div id="submit_block">
<input type="submit" value="${_('Login')}" class="submit" id="login_submit"/>
<span id="loading">&nbsp;</span>
</div>
% if yes_recovery_login:
<div class="form"><a href="${url_for('recovery_password')}">${_('Recovery password?')}</a></div>
% endif
<!--<div class="form">${_('Remember that only have 3 attempts')}</div>-->
</form>
</%block>
</body>
</html>