stc

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

commit 3fedc042ffe27b9edda4dbe0c5b120e06ae3aa37
parent 285fd788569d380e7d0f06e4f89e043da0ec80a3
Author: Brennen T. Mazur <brennen@madis.cool>
Date:   Wed,  1 Mar 2023 16:36:39 -0700

added role/permission functionality to admin and dashboard pages

Diffstat:
Mapp/routes.py | 36+++++++++++++++++++++++++-----------
Mapp/templates/admin/layout.html | 9++-------
Mapp/templates/dashboard/layout.html | 8+++-----
Mseeds.py | 78++++++++++++++++++++++++++++++++++++++++++++----------------------------------
4 files changed, 74 insertions(+), 57 deletions(-)

diff --git a/app/routes.py b/app/routes.py @@ -106,22 +106,33 @@ def load_user(username): @login_required def dashboard(): -# all_permissions=mongo.db.permissions_collection.find_one('current_user.role') -# dashperms=all_permissions['dashboard'] + dashperms=mongo.db.permissions_collection.find_one({'label': current_user.role},{'dashboard':1,'_id':0}) + dashperms=dashperms['dashboard'] + + clocked_in_users = mongo.db.time_collection.find({'clock_out': {'$exists':False}}) + # Move to a isUserClockedIn(default: username=current_user) + if mongo.db.time_collection.find_one({'modified_by.0': current_user.username,'clock_out':{'$exists':False}}): + clocked_out = False + else: + clocked_out = True + #End isUserClockedIn() clockinform=PunchclockinWidget() clockoutform=PunchclockoutWidget() fleetoutform=FleetCheckoutForm() fleetinform=FleetCheckinForm() - currenttime=datetime.datetime.utcnow() + + if clockoutform.validate_on_submit(): + mongo.db.time_collection.insert({'clock_out' : [datetime.datetime.utcnow()], + 'lunch' : clockoutform.lunchBox.data, + 'per_diem' : clockoutform.per_diemBox.data}) + return redirect(url_for('dashboard')) if clockinform.validate_on_submit(): - mongo.db.fleet_collection.insert_one({'clock_in' : datetime.datetime.utcnow(), - 'modified_by' : [current_user.username], - 'date' : datetime.datetime.today(), - 'project' : clockinform.project.data, - 'lunch' : clockinform.lunch.data, - 'per_diem' : clockinform.perdiem.data}) + mongo.db.time_collection.insert({'clock_in' : [datetime.datetime.utcnow()], + 'modified_by' : [current_user.username], + 'date' : datetime.datetime.today(), + 'project' : clockinform.project.data}) return redirect(url_for('dashboard')) available_projects = {'STC Webapp':'stcapp','YEP Website':'yepsite','Volunteer Day':'volday'} #not used/not working @@ -133,14 +144,17 @@ def dashboard(): 'operator':current_user.username, 'additional_notes':fleetoutform.additionalnotes.data}) return redirect(url_for('dashboard')) - return render_template('dashboard/layout.html',currenttime=currenttime,projects=available_projects,clockinform=clockinform,fleetinform=fleetinform,fleetoutform=fleetoutform,ORGNAME=OrganizationName) + return render_template('dashboard/layout.html',permissions=dashperms,projects=available_projects,clocked_out=clocked_out,clockoutform=clockoutform,clockinform=clockinform,fleetinform=fleetinform,fleetoutform=fleetoutform,ORGNAME=OrganizationName) @app.route("/admin") @login_required def admin(): + adminperms=mongo.db.permissions_collection.find_one({'label': current_user.role},{'admin':1,'_id':0}) + adminperms=adminperms['admin'] + #all_permissions=mongo.db.permissions_collection.find_one({"label":current_user.role}) #admnperms=all_permissions.admin - return render_template ('admin/layout.html',ORGNAME=OrganizationName) + return render_template ('admin/layout.html',permissions=adminperms,ORGNAME=OrganizationName) # Report Routes @app.route('/admin/agreement') diff --git a/app/templates/admin/layout.html b/app/templates/admin/layout.html @@ -1,16 +1,11 @@ {% extends 'base.html' %} -{% block title %}Management{% endblock %} +{% block title %}Admin{% endblock %} {% block content %} <section class="admin-grid"> - <!--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 db.get_collection('permissions_collection').find_one(current_user.role) --> - {%- for x in ['reports','agreements','roles','users'] %} + {%- for x in permissions %} {% include 'admin/'~x~'/widget.html' %} {%- else-%} {{ 'You do not have permission to access this page' }} diff --git a/app/templates/dashboard/layout.html b/app/templates/dashboard/layout.html @@ -4,13 +4,11 @@ {% block content %} <section class="base-grid"> - <!-- TODO: function call for permissive ACCESS, returns array of strings --> - - <!-- For loop takes getWidget()'s -> [] iterates through to include Accessabe widgets, else deny's request --> - {%- for x in ['punchclock','activeusers','fleet'] %} + <!-- for loop takes current user's dashboard permissions and iterates through to include Accessable widgets, else reports lack of permissions --> + {%- for x in permissions %} {% include '/dashboard/'~x~'/widget.html' %} {%- else %} - {{ 'You do not have permission to access this page' }}<!--reroute to login page on no access? --> + {{ 'You do not have permission to access this page' }} {%- endfor %} </section> diff --git a/seeds.py b/seeds.py @@ -36,7 +36,7 @@ user1 = { 'username': 'nikolasmmazur', 'birthday': '1999-03-26', 'password_hash': 'pbkdf2:sha256:260000$DBIF9Dfq1OcsYwSk$37f5cc231ff2c97cc7a6b60f25c767380574f1c01cc17069da4f3e7e25ba3370', - 'role': 'developer', + 'role': 'Web Developer', 'address': '275 DuPont Dr, Lander Wy 82520', 'branch': 'Lander', 'phonenumber': '3074380460', @@ -54,7 +54,7 @@ user2 = { 'username': 'brennentmazur', 'birthday': '1997-04-28', 'password_hash': 'pbkdf2:sha256:260000$ukazhSEG3m9xH2oL$5cc00ff3411f614720287c18f615d71578face70abc990ea5def89f520b0ac2c', - 'role': 'crewlead', + 'role': 'Crew Lead', 'branch': 'Dillon', 'phonenumber': 3074380491, 'address': '705 N Railroad Ave, Dillon MT, 59725', @@ -151,38 +151,48 @@ projects2 = { } # Permissions documents (only needs array list of str for each 'service') -roles = { - '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'] +crew = { + '_id':1, + 'label': 'Crew', + 'dashboard': ['punchclock'], + 'admin': [] } -} + +alead = { + '_id':2, + 'label': 'Assistant Lead', + 'dashboard': ['punchclock','fleet'], + 'admin': [] + } + +lead = { + '_id':3, + 'label': 'Crew Lead', + 'dashboard': ['punchclock','fleet','activeusers'], + 'admin': [] + } + +developer = { + '_id':4, + 'label': 'Web Developer', + 'dashboard': ['punchclock','fleet','activeusers'], + 'admin': ['agreements','reports','users','roles'] + } + +manager = { + '_id':5, + 'label': 'Project Manager', + 'dashboard': ['punchclock','fleet','activeusers'], + 'admin': ['agreements','reports','users','roles'] + } + +accountant = { + '_id':6, + 'label': 'Accountant', + 'dashboard': ['punchclock','fleet','activeusers'], + 'admin': ['agreements','reports','users'] + } + # Insert documents user_collection.insert_many([user1, user2]) @@ -190,7 +200,7 @@ time_collection.insert_many([time1, time2]) fleet_collection.insert_many([fleet1, fleet2]) agreement_collection.insert_many([agreement1, agreement2]) projects_collection.insert_many([projects1, projects2]) -permissions_collection.insert_one(roles) +permissions_collection.insert_many([crew,alead,lead,developer,manager,accountant]) # Print seeded data for x in user_collection.find():