Skip to content
Snippets Groups Projects
Commit 59f00564 authored by mrschnei's avatar mrschnei
Browse files

Added UI for profile and manage org webpages. Updated deleting account and org functions.

parent a1c10e84
No related branches found
No related tags found
No related merge requests found
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<b>Email: </b> <b>Email: </b>
<input type="email" placeholder="Enter Email" name="email" class="form-control" required /> <input type="email" placeholder="Enter Email" name="email" class="form-control" required maxlength="40" />
</div> </div>
<div class="form-group"> <div class="form-group">
<b>Password: </b> <b>Password: </b>
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<b>Email: </b> <b>Email: </b>
<input type="email" placeholder="Enter Email" name="email" class="form-control" required /> <input type="email" placeholder="Enter Email" name="email" class="form-control" required maxlength="40" />
</div> </div>
<div class="form-group"> <div class="form-group">
<b>Password: </b> <b>Password: </b>
......
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<a href="/">Home</a> <!-- Required meta tags -->
</head> <meta charset="utf-8">
<head> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" type="text/css" href="/css/style.css">
<title>ServicePoints</title> <!-- Bootstrap CSS -->
</head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<body> <title>Manage Org</title>
<p> </head>
<form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data">
{{org}} <body>
<input type="hidden" name="org" value="{{org}}"/>
<input type="submit" name="delete" value="delete your student org"/> <div class="jumbotron text-center" style="margin-bottom:0; ">
</form> <h1>ServicePoints!</h1>
</p> <p>Connect with your Org</p>
<p> </div>
Pending Member Requests:
</p> <nav class="navbar navbar-expand-sm navbar-dark" style="background-color:#7952b3;">
{% for member in pending %} <a class="navbar-brand" href="/">Home</a>
<p> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data"> <span class="navbar-toggler-icon"></span>
Name: {{member.fullname}} </button>
<br>Username: {{member.username}} <div class="collapse navbar-collapse" id="collapsibleNavbar">
<br>Email: {{member.email}} <ul class="navbar-nav mr-auto">
<br>Pre-Existing Hours: {{member.hours}} <li class="nav-item">
<input type="hidden" name="user" value="{{member.username}}"/> <a class="nav-link" href="/accounts/blood/">Blood Drives</a>
<input type="submit" name="add" value="Add Member"/> </li>
<input type="submit" name="deny" value="Deny Member"/> <li class="nav-item">
</form> <a class="nav-link" href="/accounts/food/">Food Drives</a>
</p> </li>
{% endfor %} <li class="nav-item">
<a class="nav-link" href="/accounts/mask/">Mask Making</a>
<p> </li>
Current Members: <li class="nav-item">
</p> <a class="nav-link" href="/accounts/tutorsu/">Tutoring</a>
{% for member in members %} </li>
{% if username == member.username %} </ul>
{{member.fullname}} ({{member.username}}) <ul class="navbar-nav">
{% else %} <li class="nav-item dropdown">
<p> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data"> Settings
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="/accounts/profile/">View Profile</a>
<a class="dropdown-item" href="/accounts/manageOrg/">Manage Org</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/accounts/logout/">Logout</a>
</div>
</li>
</ul>
</div>
</nav>
<div class="container" style="margin-top:30px">
<div class="row">
<div class="col-sm-8">
<h2>Manage Your Organization: {{org}} </h2>
<h4>Pending Member Requests:</h4>
{% for member in pending %}
<form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data">
Name: {{member.fullname}}
<br>Username: {{member.username}}
<br>Email: {{member.email}}
<br>Pre-Existing Hours: {{member.hours}}
<input type="hidden" name="user" value="{{member.username}}" />
<input type="submit" name="add" value="Add Member" />
<input type="submit" name="deny" value="Deny Member" />
</form>
{% endfor %}
{% if not pending %}
No pending memberships
{% endif %}
<h4 style="margin-top:25px;">Current Members:</h4>
{% for member in members %}
{% if username == member.username %}
{{member.fullname}} ({{member.username}}) {{member.fullname}} ({{member.username}})
<input type="hidden" name="user" value="{{member.username}}"/> {% else %}
<input type="submit" name="remove" value="remove from org"/>
</form> <form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data">
</p> {{member.fullname}} ({{member.username}})
{% endif %} <input type="hidden" name="user" value="{{member.username}}" />
{% endfor %} <input type="submit" name="remove" value="remove from org" />
</body> </form>
{% endif %}
{% endfor %}
</div>
<div class="col-sm-4">
<div>
<h2>Your Info: </h2>
<p>Full Name: {{fullname}}</p>
<p>Username: {{username}}</p>
<p>Organization: {{org}}</p>
<p>Email: {{email}}</p>
<p>Hours: {{hours}}</p>
<hr class="d-sm-none">
</div>
<p>
<a class="btn btn-default btn-lg btn-block" href="" data-toggle="modal" data-target="#deleteModal" style="background-color:#03DAC6;">Delete Your Organization</a>
</p>
</div>
</div>
</div>
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel" style="text-align:center;">Are you sure you want to delete your student organization?</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">No</button>
<a class="btn btn-primary" href="/accounts/deleteOrg/" role="button">Yes</a>
</div>
</div>
</div>
</div>
<div class="jumbotron text-center" style="margin-bottom:0; ">
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
</body>
</html> </html>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<link rel="stylesheet" type="text/css" href="/css/style.css"> <!-- Required meta tags -->
<title>Profile</title> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<a href="/">Home</a> <title>Profile</title>
<a href="/accounts/logout/" style="float: right;">logout</a>
</head> </head>
<body> <body>
<h1 style="text-align:center">Profile</h1>
<div class="jumbotron text-center" style="margin-bottom:0; ">
<h1>ServicePoints!</h1>
<p> <p>Connect with your Org</p>
Full Name: {{fullname}} </div>
</p>
{% if pending == 0 %} <nav class="navbar navbar-expand-sm navbar-dark" style="background-color:#7952b3;">
<p> <a class="navbar-brand" href="/">Home</a>
Student Organization: {{org}} <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
</p> <span class="navbar-toggler-icon"></span>
{%endif%} </button>
{% if pending == 1 %} <div class="collapse navbar-collapse" id="collapsibleNavbar">
<p> <ul class="navbar-nav mr-auto">
Student Organization: Your request is pending. Requesting to join another organization while your request is pending will cancel your original request. <li class="nav-item">
</p> <a class="nav-link" href="/accounts/blood/">Blood Drives</a>
{%endif%} </li>
</p> <li class="nav-item">
<p> <a class="nav-link" href="/accounts/food/">Food Drives</a>
Email: {{email}} </li>
</p> <li class="nav-item">
<a href="/accounts/delete/">delete account</a> <a class="nav-link" href="/accounts/mask/">Mask Making</a>
</li>
{% if leader == 0 %} <li class="nav-item">
<form action="/accounts/profile/" method="post"> <a class="nav-link" href="/accounts/tutorsu/">Tutoring</a>
<p> </li>
<label for="orgName">Select an Organization:</label> </ul>
<select name="orgName" id="orgName"> <ul class="navbar-nav">
{% for org in orgs %} <li class="nav-item dropdown">
{% if org.orgName != 'NONE' %} <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<option value="{{org.orgName}}">{{org.orgName}}</option> Settings
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="/accounts/profile/">View Profile</a>
{% if leader == 1 %}
<a class="dropdown-item" href="/accounts/manageOrg/">Manage Org</a>
{% endif %}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/accounts/logout/">Logout</a>
</div>
</li>
</ul>
</div>
</nav>
<div class="container" style="margin-top:30px">
<div class="row">
<div class="col-sm-8">
<h2>Profile</h2>
{% if pending == 0 %}
<p>
Student Organization: {{org}}
</p>
{%endif%} {%endif%}
{% endfor %} {% if pending == 1 %}
</select> <p>
<input type="submit" name="signup" value="Update Org" /> Student Organization: Your request is pending. Requesting to join another organization while your request is pending will cancel your original request.
</p> </p>
</form> {%endif%}
<form action="/accounts/profile/" method="post">
<p> {% if leader == 0 %}
<input type="submit" name="noOrg" value="Leave Organization Without Joining Another" /> <form action="/accounts/profile/" method="post">
</p> <p>
</form> <label for="orgName">Select an Organization:</label>
{% endif %} <select name="orgName" id="orgName">
{% for org in orgs %}
<form action="/accounts/profile/" method="post"> {% if org.orgName != 'NONE' %}
<p> <option value="{{org.orgName}}">{{org.orgName}}</option>
Change your full name: {%endif%}
<input type="text" name="fullname" /> {% endfor %}
<input type="submit" name="fullname" value="Change Full Name" /> </select>
</p> <input type="submit" name="signup" value="Update Org" />
</p>
</form> </form>
{% if org != 'NONE' %}
<form action="/accounts/profile/" method="post"> <form action="/accounts/profile/" method="post">
<p> <p>
Change your email: <input type="submit" name="noOrg" value="Leave Organization Without Joining Another" />
<input type="text" name="email" /> </p>
<input type="submit" name="email" value="Change Email" /> </form>
</p> {% endif %}
{% endif %}
</form>
<form action="/accounts/profile/" method="post">
<p>
Change your full name:
<input type="text" name="fullname" required maxlength="30" />
<input type="submit" name="fullname" value="Change Full Name" />
</p>
</form>
<form action="/accounts/profile/" method="post">
<p>
Change your email:
<input type="email" name="email" required maxlength="40" />
<input type="submit" name="email" value="Change Email" />
</p>
</form>
</div>
<div class="col-sm-4">
<div>
<h2>Your Info: </h2>
<p>Full Name: {{fullname}}</p>
<p>Username: {{username}}</p>
<p>Organization: {{org}}</p>
<p>Email: {{email}}</p>
<p>Hours: {{hours}}</p>
<hr class="d-sm-none">
<p>
<a class="btn btn-default btn-lg btn-block" href="" data-toggle="modal" data-target="#deleteModal" style="background-color:#03DAC6;">Delete Account</a>
</p>
</div>
</div>
</div>
</div>
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel" style="text-align:center;">Are you sure you want to delete your account?</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">No</button>
<a class="btn btn-primary" href="/accounts/delete/" role="button">Yes</a>
</div>
</div>
</div>
</div>
<div class="jumbotron text-center" style="margin-bottom:0; ">
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
</body> </body>
......
...@@ -80,16 +80,17 @@ def create(): ...@@ -80,16 +80,17 @@ def create():
flask.session['password'] = flask.request.form['password'] flask.session['password'] = flask.request.form['password']
pw = hash_pass(flask.session['password']) pw = hash_pass(flask.session['password'])
cur = servicePoints.model.get_db()
data = (flask.session['username'], flask.session['fullname'], data = (flask.session['username'], flask.session['fullname'],
flask.session['email'], 'NONE', flask.session['email'], 'NONE',
pw, 0) pw, 0)
pendingData = (flask.session['username'], flask.session['fullname'],
flask.session['email'], flask.session['orgName'], 0)
cur = servicePoints.model.get_db()
cur.execute("INSERT INTO users(username, fullname, email, orgName, " cur.execute("INSERT INTO users(username, fullname, email, orgName, "
"password, hours) VALUES (?, ?, ?, ?, ?, ?)", data) "password, hours) VALUES (?, ?, ?, ?, ?, ?)", data)
cur.execute("INSERT INTO pendingOrgs(username, fullname, email, orgName, " if flask.session['orgName'] != 'NONE':
"hours) VALUES (?, ?, ?, ?, ?)", pendingData) pendingData = (flask.session['username'], flask.session['fullname'],
flask.session['email'], flask.session['orgName'], 0)
cur.execute("INSERT INTO pendingOrgs(username, fullname, email, orgName, "
"hours) VALUES (?, ?, ?, ?, ?)", pendingData)
return flask.redirect(flask.url_for('index')) return flask.redirect(flask.url_for('index'))
...@@ -242,16 +243,29 @@ def hash_pass(password_in): ...@@ -242,16 +243,29 @@ def hash_pass(password_in):
@servicePoints.app.route('/accounts/delete/', methods=['GET', 'POST']) @servicePoints.app.route('/accounts/delete/', methods=['GET', 'POST'])
def delete(): def delete():
"""Render delete page.""" """Render delete page."""
if flask.request.method == 'POST': name = (flask.session['username'])
name = (flask.session['username']) to_add = (name,)
to_add = (name,) cur = servicePoints.model.get_db()
cur = servicePoints.model.get_db()
flask.session.clear() flask.session.clear()
cur.execute('DELETE FROM users WHERE username=?', to_add) cur.execute('DELETE FROM users WHERE username=?', to_add)
return flask.redirect(flask.url_for('login')) return flask.redirect(flask.url_for('login'))
context = {'username': flask.session['username']}
return render_template('delete.html', **context) @servicePoints.app.route('/accounts/deleteOrg/', methods=['GET', 'POST'])
def deleteOrg():
"""Render delete page."""
username = flask.session["username"]
cursor = servicePoints.model.get_db()
leaderCur = cursor.execute('SELECT orgName FROM orgs WHERE '
'username =:who',
{"who": username})
results = leaderCur.fetchone()
orgName = results["orgName"]
cursor.execute("DELETE from orgs WHERE orgName = ?", (orgName,))
cursor.execute("UPDATE users SET orgName = 'NONE' WHERE orgName = ?", (orgName,))
cursor.execute("UPDATE requests SET leader = 'pending' WHERE leader = ?",
(username,))
return flask.redirect(flask.url_for('index'))
@servicePoints.app.route('/accounts/hourError/', methods=['GET', 'POST']) @servicePoints.app.route('/accounts/hourError/', methods=['GET', 'POST'])
def hourError(): def hourError():
...@@ -381,7 +395,7 @@ def profile(): ...@@ -381,7 +395,7 @@ def profile():
cur = cursor.execute("SELECT * FROM orgs") cur = cursor.execute("SELECT * FROM orgs")
username = flask.session['username'] username = flask.session['username']
orgs = cur.fetchall() orgs = cur.fetchall()
cur = cursor.execute("SELECT fullname, email, orgName from users WHERE username = ?", (username,)) cur = cursor.execute("SELECT fullname, email, orgName, hours from users WHERE username = ?", (username,))
user = cur.fetchone() user = cur.fetchone()
studentOrgCur = cursor.execute('SELECT orgName, hours FROM users WHERE ' studentOrgCur = cursor.execute('SELECT orgName, hours FROM users WHERE '
'username =:who', 'username =:who',
...@@ -395,13 +409,15 @@ def profile(): ...@@ -395,13 +409,15 @@ def profile():
leader = 0 leader = 0
else: else:
leader = 1 leader = 1
cur = cursor.execute('SELECT * FROM pendingOrgs WHERE username =:who', {"who": username}) cur = cursor.execute('SELECT * FROM pendingOrgs WHERE username =:who', {"who": username})
tryfetch = cur.fetchone() tryfetch = cur.fetchone()
if tryfetch is None: if tryfetch is None:
pending = 0 pending = 0
else: else:
pending = 1 pending = 1
context = {"orgs": orgs, "fullname": user["fullname"], "email": user["email"],
context = {"orgs": orgs, "fullname": user["fullname"], "email": user["email"], "username": username, "hours": results["hours"],
"org": user["orgName"], "leader": leader, "pending": pending} "org": user["orgName"], "leader": leader, "pending": pending}
return render_template('userProfile.html', **context) return render_template('userProfile.html', **context)
...@@ -567,18 +583,6 @@ def manageOrg(): ...@@ -567,18 +583,6 @@ def manageOrg():
if 'username' in flask.session: if 'username' in flask.session:
username = flask.session["username"] username = flask.session["username"]
if flask.request.method == 'POST': if flask.request.method == 'POST':
if 'delete' in flask.request.form:
cursor = servicePoints.model.get_db()
leaderCur = cursor.execute('SELECT orgName FROM orgs WHERE '
'username =:who',
{"who": username})
results = leaderCur.fetchone()
orgName = results["orgName"]
cursor.execute("DELETE from orgs WHERE orgName = ?", (orgName,))
cursor.execute("UPDATE users SET orgName = 'NONE' WHERE orgName = ?", (orgName,))
cursor.execute("UPDATE requests SET leader = 'pending' WHERE leader = ?",
(username,))
return flask.redirect(flask.url_for('index'))
if 'add' in flask.request.form: if 'add' in flask.request.form:
cursor = servicePoints.model.get_db() cursor = servicePoints.model.get_db()
leaderCur = cursor.execute('SELECT orgName FROM orgs WHERE ' leaderCur = cursor.execute('SELECT orgName FROM orgs WHERE '
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment