Added session support and themes
This commit is contained in:
parent
4bdaaf5e8c
commit
f80c51045e
4 changed files with 241 additions and 117 deletions
|
|
@ -74,7 +74,7 @@ def admin(paramecio_session: Annotated[str | None, Cookie()] = None):
|
|||
|
||||
if 'admin' in arr_user:
|
||||
|
||||
return "Hello world"
|
||||
return t.load_template('home.phtml', title=_('Admin'), user=arr_user)
|
||||
|
||||
else:
|
||||
raise HTTPException(status_code=404, detail="User incorrect")
|
||||
|
|
@ -352,6 +352,26 @@ def admin_recovery_passsword():
|
|||
|
||||
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
|
||||
"""
|
||||
|
||||
|
|
|
|||
211
parameciofast/modules/fastadmin/templates/admin/dashboard.phtml
Normal file
211
parameciofast/modules/fastadmin/templates/admin/dashboard.phtml
Normal 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}"> <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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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"> </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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue