starting working on ui for multiple users
This commit is contained in:
parent
71b5f17f83
commit
63f9f4b536
@ -64,8 +64,12 @@ def home():
|
|||||||
return render_template("main/home.html")
|
return render_template("main/home.html")
|
||||||
|
|
||||||
|
|
||||||
|
@public_route
|
||||||
@main.route("/app_view?<app_id>", methods=["GET"])
|
@main.route("/app_view?<app_id>", methods=["GET"])
|
||||||
def app_view(app_id):
|
def app_view(app_id):
|
||||||
|
settings = Settings.query.first()
|
||||||
|
if not check_groups(settings.home_access_groups, current_user):
|
||||||
|
return redirect(url_for("user_system.login"))
|
||||||
app_db = Apps.query.filter_by(id=app_id).first()
|
app_db = Apps.query.filter_by(id=app_id).first()
|
||||||
return render_template("main/app-view.html", url=f"{app_db.prefix}{app_db.url}")
|
return render_template("main/app-view.html", url=f"{app_db.prefix}{app_db.url}")
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ from flask_login import current_user
|
|||||||
from flask import render_template, request, Blueprint, jsonify, redirect, url_for
|
from flask import render_template, request, Blueprint, jsonify, redirect, url_for
|
||||||
from dashmachine.user_system.forms import UserForm
|
from dashmachine.user_system.forms import UserForm
|
||||||
from dashmachine.user_system.utils import add_edit_user
|
from dashmachine.user_system.utils import add_edit_user
|
||||||
|
from dashmachine.user_system.models import User
|
||||||
from dashmachine.main.utils import row2dict, public_route, check_groups
|
from dashmachine.main.utils import row2dict, public_route, check_groups
|
||||||
from dashmachine.main.read_config import read_config
|
from dashmachine.main.read_config import read_config
|
||||||
from dashmachine.main.models import Files, TemplateApps
|
from dashmachine.main.models import Files, TemplateApps
|
||||||
@ -29,6 +30,7 @@ def settings():
|
|||||||
|
|
||||||
config_form = ConfigForm()
|
config_form = ConfigForm()
|
||||||
user_form = UserForm()
|
user_form = UserForm()
|
||||||
|
# user_form.role.choices = [(role, role) for role in settings_db.roles.split(",")]
|
||||||
with open(os.path.join(user_data_folder, "config.ini"), "r") as config_file:
|
with open(os.path.join(user_data_folder, "config.ini"), "r") as config_file:
|
||||||
config_form.config.data = config_file.read()
|
config_form.config.data = config_file.read()
|
||||||
files_html = load_files_html()
|
files_html = load_files_html()
|
||||||
@ -36,6 +38,8 @@ def settings():
|
|||||||
t_apps = TemplateApps.query.all()
|
t_apps = TemplateApps.query.all()
|
||||||
for t_app in t_apps:
|
for t_app in t_apps:
|
||||||
template_apps.append(f"{t_app.name}&&{t_app.icon}")
|
template_apps.append(f"{t_app.name}&&{t_app.icon}")
|
||||||
|
|
||||||
|
users = User.query.all()
|
||||||
return render_template(
|
return render_template(
|
||||||
"settings_system/settings.html",
|
"settings_system/settings.html",
|
||||||
config_form=config_form,
|
config_form=config_form,
|
||||||
@ -43,6 +47,7 @@ def settings():
|
|||||||
user_form=user_form,
|
user_form=user_form,
|
||||||
template_apps=",".join(template_apps),
|
template_apps=",".join(template_apps),
|
||||||
version=version,
|
version=version,
|
||||||
|
users=users,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -93,7 +98,13 @@ def edit_user():
|
|||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
if form.password.data != form.confirm_password.data:
|
if form.password.data != form.confirm_password.data:
|
||||||
return jsonify(data={"err": "Passwords don't match"})
|
return jsonify(data={"err": "Passwords don't match"})
|
||||||
add_edit_user(form.username.data, form.password.data)
|
if not form.id.data:
|
||||||
|
new = True
|
||||||
|
else:
|
||||||
|
new = False
|
||||||
|
add_edit_user(
|
||||||
|
form.username.data, form.password.data, user_id=form.id.data, new=new
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
err_str = ""
|
err_str = ""
|
||||||
for fieldName, errorMessages in form.errors.items():
|
for fieldName, errorMessages in form.errors.items():
|
||||||
|
@ -4,6 +4,11 @@ d.className += " active theme-primary";
|
|||||||
$( document ).ready(function() {
|
$( document ).ready(function() {
|
||||||
initTCdrop('#images-tcdrop');
|
initTCdrop('#images-tcdrop');
|
||||||
$("#config-wiki-modal").modal();
|
$("#config-wiki-modal").modal();
|
||||||
|
$("#user-modal").modal({
|
||||||
|
onCloseEnd: function () {
|
||||||
|
$("#edit-user-form").trigger('reset');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$("#save-config-btn").on('click', function(e) {
|
$("#save-config-btn").on('click', function(e) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@ -58,7 +63,7 @@ $( document ).ready(function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#edit-user-btn").on('click', function(e) {
|
$("#save-user-btn").on('click', function(e) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: $(this).attr('data-url'),
|
url: $(this).attr('data-url'),
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
@ -75,4 +80,12 @@ $( document ).ready(function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(".edit-user-btn").on('click', function(e) {
|
||||||
|
$("#user-modal").modal('open');
|
||||||
|
$("#user-form-username").val($(this).attr("data-username"));
|
||||||
|
$("#user-form-role").val($(this).attr("data-role"));
|
||||||
|
$("#user-form-id").val($(this).attr("data-id"));
|
||||||
|
M.updateTextFields();
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
@ -1,7 +1,8 @@
|
|||||||
{% extends "main/layout.html" %}
|
{% extends "main/layout.html" %}
|
||||||
{% from 'global_macros.html' import input, button %}
|
{% from 'global_macros.html' import input, button, select %}
|
||||||
{% from 'main/tcdrop.html' import tcdrop %}
|
{% from 'main/tcdrop.html' import tcdrop %}
|
||||||
{% from 'settings_system/config-readme.html' import ConfigReadme %}
|
{% from 'settings_system/config-readme.html' import ConfigReadme %}
|
||||||
|
{% from 'settings_system/user.html' import UserTab with context %}
|
||||||
{% block page_vendor_css %}
|
{% block page_vendor_css %}
|
||||||
{% endblock page_vendor_css %}
|
{% endblock page_vendor_css %}
|
||||||
|
|
||||||
@ -133,51 +134,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="user" class="col s12">
|
<div id="user" class="col s12">
|
||||||
<div class="row">
|
{{ UserTab() }}
|
||||||
<h5>User</h5>
|
|
||||||
|
|
||||||
<form id="edit-user-form">
|
|
||||||
{{ user_form.hidden_tag() }}
|
|
||||||
|
|
||||||
{{ input(
|
|
||||||
label="Username",
|
|
||||||
id="user-form-username",
|
|
||||||
size="s12",
|
|
||||||
form_obj=user_form.username,
|
|
||||||
val=current_user.username
|
|
||||||
) }}
|
|
||||||
|
|
||||||
{{ input(
|
|
||||||
label="Password",
|
|
||||||
id="user-form-password",
|
|
||||||
form_obj=user_form.password,
|
|
||||||
size="s12"
|
|
||||||
) }}
|
|
||||||
|
|
||||||
{{ input(
|
|
||||||
label="Confirm Password",
|
|
||||||
id="user-form-confirm_password",
|
|
||||||
form_obj=user_form.confirm_password,
|
|
||||||
required='required',
|
|
||||||
size="s12"
|
|
||||||
) }}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{{ button(
|
|
||||||
icon="save",
|
|
||||||
float="left",
|
|
||||||
id="edit-user-btn",
|
|
||||||
data={'url': url_for('settings_system.edit_user')},
|
|
||||||
text="save"
|
|
||||||
) }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-4">
|
|
||||||
<h5>DashMachine</h5>
|
|
||||||
<p class="mb-2">version: {{ version }}</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
88
dashmachine/templates/settings_system/user.html
Normal file
88
dashmachine/templates/settings_system/user.html
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
{% macro UserTab() %}
|
||||||
|
<div id="user-modal" class="modal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="row mt-2">
|
||||||
|
<div class="col s12">
|
||||||
|
<form id="edit-user-form">
|
||||||
|
{{ user_form.hidden_tag() }}
|
||||||
|
|
||||||
|
{# {{ select(#}
|
||||||
|
{# id='user-form-role',#}
|
||||||
|
{# form_obj=user_form.role,#}
|
||||||
|
{# size="s12",#}
|
||||||
|
{# label='Role'#}
|
||||||
|
{# ) }}#}
|
||||||
|
|
||||||
|
{{ input(
|
||||||
|
label="Username",
|
||||||
|
id="user-form-username",
|
||||||
|
size="s12",
|
||||||
|
form_obj=user_form.username
|
||||||
|
) }}
|
||||||
|
|
||||||
|
{{ input(
|
||||||
|
label="Password",
|
||||||
|
id="user-form-password",
|
||||||
|
form_obj=user_form.password,
|
||||||
|
size="s12"
|
||||||
|
) }}
|
||||||
|
|
||||||
|
{{ input(
|
||||||
|
label="Confirm Password",
|
||||||
|
id="user-form-confirm_password",
|
||||||
|
form_obj=user_form.confirm_password,
|
||||||
|
required='required',
|
||||||
|
size="s12"
|
||||||
|
) }}
|
||||||
|
|
||||||
|
{{ user_form.id(class="hide", id="user-form-id") }}
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{{ button(
|
||||||
|
icon="save",
|
||||||
|
float="left",
|
||||||
|
id="save-user-btn",
|
||||||
|
class="mb-2",
|
||||||
|
data={'url': url_for('settings_system.edit_user')},
|
||||||
|
text="save"
|
||||||
|
) }}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mt-2">
|
||||||
|
<div class="col s12">
|
||||||
|
<h5>Users
|
||||||
|
<a href="#user-modal" class="modal-trigger">
|
||||||
|
<i class="material-icons-outlined theme-secondary-text icon-btn ml-2 toggle-config-help" style="position: relative; top: 4px;">add</i>
|
||||||
|
</a>
|
||||||
|
</h5>
|
||||||
|
{% for user in users %}
|
||||||
|
<div class="card theme-surface-1">
|
||||||
|
<div class="card-content">
|
||||||
|
<span style="font-size: 1.3rem">
|
||||||
|
{{ user.username }}
|
||||||
|
<span class="theme-secondary-text">{{ user.role }}</span>
|
||||||
|
</span>
|
||||||
|
<span class="right pb-2">
|
||||||
|
<i class="material-icons-outlined icon-btn edit-user-btn"
|
||||||
|
data-role="{{ user.role }}"
|
||||||
|
data-id="{{ user.id }}"
|
||||||
|
data-username="{{ user.username }}">edit</i>
|
||||||
|
<i class="material-icons-outlined icon-btn">close</i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="row mt-4">
|
||||||
|
<h5>DashMachine</h5>
|
||||||
|
<p class="mb-2">version: {{ version }}</p>
|
||||||
|
</div>
|
||||||
|
{% endmacro %}
|
@ -1,9 +1,5 @@
|
|||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
from wtforms import (
|
from wtforms import StringField, PasswordField, BooleanField, SelectField
|
||||||
StringField,
|
|
||||||
PasswordField,
|
|
||||||
BooleanField,
|
|
||||||
)
|
|
||||||
from wtforms.validators import DataRequired, Length
|
from wtforms.validators import DataRequired, Length
|
||||||
|
|
||||||
|
|
||||||
@ -12,6 +8,10 @@ class UserForm(FlaskForm):
|
|||||||
|
|
||||||
password = PasswordField(validators=[DataRequired(), Length(min=8, max=120)])
|
password = PasswordField(validators=[DataRequired(), Length(min=8, max=120)])
|
||||||
|
|
||||||
|
# role = SelectField()
|
||||||
|
|
||||||
|
id = StringField()
|
||||||
|
|
||||||
confirm_password = PasswordField()
|
confirm_password = PasswordField()
|
||||||
|
|
||||||
remember = BooleanField()
|
remember = BooleanField()
|
||||||
|
40
migrations/versions/8f5a046465e8_.py
Normal file
40
migrations/versions/8f5a046465e8_.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: 8f5a046465e8
|
||||||
|
Revises: 45ebff47af9f
|
||||||
|
Create Date: 2020-02-06 19:51:14.594434
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = "8f5a046465e8"
|
||||||
|
down_revision = "45ebff47af9f"
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_table("api_calls")
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.create_table(
|
||||||
|
"api_calls",
|
||||||
|
sa.Column("id", sa.INTEGER(), nullable=False),
|
||||||
|
sa.Column("name", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("resource", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("method", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("payload", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("authentication", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("username", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("password", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.Column("value_template", sa.VARCHAR(), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint("id"),
|
||||||
|
)
|
||||||
|
# ### end Alembic commands ###
|
Loading…
x
Reference in New Issue
Block a user