stc

a simple time card webapp
git clone _git@git.brennen.work:stc.git
Log | Files | Refs | README

commit 140bfa802c23c591a7401a6e2cc38238862b8900
parent 5575f7bd9038ebad4773964eba8165d25ddece84
Author: Brennen T. Mazur <brennen@madis.cool>
Date:   Sun, 12 Feb 2023 21:25:34 -0700

add user, roles, and permissions forms and layouts

Diffstat:
Mapp/forms.py | 35++++++++++++++++++++++++++---------
Mapp/routes.py | 11+++++++++--
Mapp/templates/admin/layout.html | 5++++-
Aapp/templates/admin/roles/updateroles.html | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Mapp/templates/admin/roles/widget.html | 6+++---
Aapp/templates/admin/users/inactiveusers.html | 27+++++++++++++++++++++++++++
Aapp/templates/admin/users/newuser.html | 27+++++++++++++++++++++++++++
Aapp/templates/admin/users/widget.html | 6++++++
Mseeds.py | 34+++++++++++++++++++++++++++++++---
9 files changed, 186 insertions(+), 18 deletions(-)

diff --git a/app/forms.py b/app/forms.py @@ -14,23 +14,40 @@ class LoginForm(FlaskForm): class NewUserForm(FlaskForm): fname = StringField('First Name', validators=[DataRequired()]) - mname = StringField('Middle Initial', validators=[DataRequired()]) + mname = StringField('Middle Initial', validators=[DataRequired(),length(max=1)]) lname = StringField('Last Name', validators=[DataRequired()]) birthday = DateField('Birthday',validators=[DataRequired()])# Ought to change this to some validation for age range accepted role = SelectField('Role',validators=[DataRequired()]) address = StringField('Address',validators=[DataRequired()])# Require some sort of validator for check... branch = SelectField('Branch',validators=[DataRequired(),length(max=200)]) - phonenumber = TelField('Phonenumber',validators=[DataRequired()])# Require some sort of validator for check... + phonenumber = TelField('Phonenumber',validators=[DataRequired(),length(max=12)])# Require some sort of validator for check... email = EmailField('Email',validators=[DataRequired()])# Require some sort of validator for check... payPeriod = StringField('Pay Period Override',validators=[optional()])# May not need this at all? payValue = FloatField('Pay Value Override',validators=[optional()])# Require some sort of validator for check... - setActive = BooleanField('Active',validators=[optional()])# Require some sort of validator for check... + setActive = BooleanField('Active',default="checked")# Require some sort of validator for check... createNewUser = SubmitField('Create New User') class PunchclockWidget(FlaskForm): - projectsSel = SelectField('Project', validators=[DataRequired()]) - #clockin = currenttime - lunchBox = BooleanField('Lunch') - perdiumBox = BooleanField('Perdium') - # IFF user.role is_in(trusted_role[]) then allow lunch minute definition - clockin = SubmitField('Clock In') + projectsSel = SelectField('Project', validators=[DataRequired()]) + #clockin = currenttime + lunchBox = BooleanField('Lunch') + perdiumBox = BooleanField('Perdium') + # IFF user.role is_in(trusted_role[]) then allow lunch minute definition + clockin = SubmitField('Clock In') + +class NewRoleForm(FlaskForm): + rolename = StringField('Role Name', validators=[DataRequired()]) + +class DashPermissionsForm(FlaskForm):# for each module make Boolean field. Gets passed to fn writing to permissions_collection SET MANUALLY CURRENTLY + punchclock = BooleanField('Punch Clock',default="checked") + activecrew = BooleanField('Active Crew List') + fleet = BooleanField('Fleet') + ###### End Modules ##### + updaterole = SubmitField('Update')#Update to take role name for pass to write fn + +class AdmnPermissionsForm(FlaskForm):# for each module make Boolean field. Gets passed to fn writing to permissions_collection SET MANUALLY CURRENTLY + agreements = BooleanField('Agreements') + reports = BooleanField('Reports') + manageusers = BooleanField('Manage Users') + ###### End Modules ##### + updaterole = SubmitField('Update')#Update to take role name for pass to write fn diff --git a/app/routes.py b/app/routes.py @@ -3,7 +3,7 @@ from app import app from flask_pymongo import PyMongo from flask_login import LoginManager from flask import render_template, url_for, request, flash, redirect -from app.forms import LoginForm, PunchclockWidget, NewUserForm +from app.forms import LoginForm, PunchclockWidget, NewUserForm, AdmnPermissionsForm, DashPermissionsForm from flask import request from werkzeug.urls import url_parse from werkzeug.security import generate_password_hash, check_password_hash @@ -129,8 +129,15 @@ def hours():#userid goes into call to db to get user[] -> then returns formatted @app.route("/admin/roles") #@login_required def roles(): + admnform = AdmnPermissionsForm() + dashform = DashPermissionsForm() + return render_template('admin/roles/updateroles.html',dashform=dashform,admnform=admnform,ORGNAME=OrganizationName) + +@app.route("/admin/newuser") +#@login_required +def newuser(): form = NewUserForm() - return render_template('admin/roles/index.html',form=form,ORGNAME=OrganizationName) + return render_template('admin/users/newuser.html',form=form,ORGNAME=OrganizationName) @app.route("/admin/agreement") @login_required diff --git a/app/templates/admin/layout.html b/app/templates/admin/layout.html @@ -9,7 +9,10 @@ <!--functioncall checking role for admin. while loop return permissioned 'widgets' --> <!-- returned values from admin check is array of permissive ACCESS else return 'missing permissions response' --> - {%- for x in ['reports','agreements','roles'] %} + + +<!-- for x in db.get_collection('permissions_collection').find_one(current_user.role) --> + {%- for x in ['reports','agreements','roles','users'] %} {% include 'admin/'~x~'/widget.html' %} {%- else-%} {{ 'You do not have permission to access this page' }} diff --git a/app/templates/admin/roles/updateroles.html b/app/templates/admin/roles/updateroles.html @@ -0,0 +1,53 @@ +{% extends 'base.html' %} + +{% block title %}Current Activeated Users{% endblock %} + +{% block navigation %}<a id="navi" href="/admin"><div id="back"><Back</div></a>{% endblock %} + +{% block content %} + +<table> + <tr> + <th>User Role</th> + {% for field in dashform %} + <th>{{ field.label }}</th> + {% endfor %} + </tr> + <form action="" method="post" novalidate> + {{ dashform.hidden_tag() }} + {% for error in dashform.errors %} + <span style="color:red;">[{{ error }}]</span> + {% endfor %} + {% for role in ['Crew','Crew Lead','Project Manager','Developer','Accountant'] %} + <tr><td>{{ role }}</td> + {% for field in dashform %} + <td>{{ field }}</td> + {% endfor %} + </tr> + {% endfor %} + </form> +</table> + +<table> + <tr> + <th>User Role</th> + {% for field in admnform %} + <th>{{ field.label }}</th> + {% endfor %} + </tr> + <form action="" method="post" novalidate> + {{ admnform.hidden_tag() }} + {% for error in admnform.errors %} + <span style="color:red;">[{{ error }}]</span> + {% endfor %} + {% for role in ['Crew','Crew Lead','Project Manager','Developer','Accountant'] %} + <tr><td>{{ role }}</td> + {% for field in admnform %} + <td>{{ field }}</td> + {% endfor %} + </tr> + {% endfor %} + </form> +</table> + +{% endblock %} diff --git a/app/templates/admin/roles/widget.html b/app/templates/admin/roles/widget.html @@ -1,6 +1,6 @@ -<section class="permissions"> +<section class="admin-sidebar"><!-- did not change css tag yet... --> <h3>Permissions by</h3> - <input type="submit" value="Role"> + <input type="submit" value="Roles"> <input type="submit" value="Employee"> - <input type="submit" value="Page"><!-- may not be necessary with role above... --> + <!-- <input type="submit" value="Page"> --> </section> diff --git a/app/templates/admin/users/inactiveusers.html b/app/templates/admin/users/inactiveusers.html @@ -0,0 +1,27 @@ +{% extends 'base.html' %} + +{% block title %}Add new Employee{% endblock %} + +{% block navigation %}<a id="navi" href="/admin"><div id="back"><Back</div></a>{% endblock %} + +{% block content %} + <form action="" method="post" novalidate> + {{ form.hidden_tag() }} + {% for error in form.errors %} + <span style="color:red;">[{{ error }}]</span> + {% endfor %} + {{ form.fname.label }}{{ form.fname() }}<br> + {{ form.mname.label }}{{ form.mname(size=1) }}<br> + {{ form.lname.label }}{{ form.lname() }}<br> + {{ form.birthday.label }}{{ form.birthday() }}<br> + {{ form.role.label }}{{ form.role() }}<br> + {{ form.address.label }}{{ form.address() }}<br> + {{ form.branch.label }}{{ form.branch() }}<br> + {{ form.phonenumber.label }}{{ form.phonenumber() }}<br> + {{ form.email.label }}{{ form.email() }}<br> + {{ form.payPeriod.label }}{{ form.payPeriod() }}<br> + {{ form.payValue.label }}{{ form.payValue() }}<br> + {{ form.setActive() }}{{ form.setActive.label }}<br> + {{ form.createNewUser() }} + </form> +{% endblock %} diff --git a/app/templates/admin/users/newuser.html b/app/templates/admin/users/newuser.html @@ -0,0 +1,27 @@ +{% extends 'base.html' %} + +{% block title %}Add new Employee{% endblock %} + +{% block navigation %}<a id="navi" href="/admin"><div id="back"><Back</div></a>{% endblock %} + +{% block content %} + <form action="" method="post" novalidate> + {{ form.hidden_tag() }} + {% for error in form.errors %} + <span style="color:red;">[{{ error }}]</span> + {% endfor %} + {{ form.fname.label }}{{ form.fname() }}<br> + {{ form.mname.label }}{{ form.mname(size=1) }}<br> + {{ form.lname.label }}{{ form.lname() }}<br> + {{ form.birthday.label }}{{ form.birthday() }}<br> + {{ form.role.label }}{{ form.role() }}<br> + {{ form.address.label }}{{ form.address() }}<br> + {{ form.branch.label }}{{ form.branch() }}<br> + {{ form.phonenumber.label }}{{ form.phonenumber() }}<br> + {{ form.email.label }}{{ form.email() }}<br> + {{ form.payPeriod.label }}{{ form.payPeriod() }}<br> + {{ form.payValue.label }}{{ form.payValue() }}<br> + {{ form.setActive() }}{{ form.setActive.label }}<br> + {{ form.createNewUser() }} + </form> +{% endblock %} diff --git a/app/templates/admin/users/widget.html b/app/templates/admin/users/widget.html @@ -0,0 +1,6 @@ +<section class="admin-sidebar"> + <h3>Users</h3> + <input type="submit" value="Active"> <!--sends active tag to route changes available users in dropdown --> + <input type="submit" value="Inactive"> <!-- sends inactive tag to route for available users dropdown --> + <a href="{{ url_for('newuser') }}"><input type="submit" value="New"></a> <!-- separate newuser.html pg? --> +</section> diff --git a/seeds.py b/seeds.py @@ -152,10 +152,38 @@ projects2 = { # Permissions documents (only needs array list of str for each 'service') roles = { - 'punchclock': ['Crew','Crew Lead', 'Project Manager','Developer'], - 'fleet': ['Crew Lead', 'Project Manager'], - 'admin': ['Project Manager', 'Developer'] + 'crew': { + 'label': 'Crew', + 'dashboard': ['punchclock'], + 'admin': [] + }, + 'asistcrewlead': { + 'label': 'Assistant Lead', + 'dashboard': ['punchclock','fleet'], + 'admin': [] + }, + 'crewlead': { + 'label': 'Crew Lead', + 'dashboard': ['punchclock','fleet','activecrew'], + 'admin': [] + }, + 'developer': { + 'label': 'Web Developer', + 'dashboard': ['punchclock','fleet','activecrew'], + 'admin': ['agreements','reports','users'] + }, + 'projectmanager': { + 'label': 'Project Manager', + 'dashboard': ['punchclock','fleet','activecrew'], + 'admin': ['agreements','reports','users'] + }, + 'accounting': { + 'label': 'Accountant', + 'dashboard': ['punchclock','fleet','activecrew'], + 'admin': ['agreements','reports','users'] + } } + # Insert documents user_collection.insert_many([user1, user2]) time_collection.insert_many([time1, time2])