diff --git a/servicePoints/templates/delete.html b/servicePoints/templates/delete.html deleted file mode 100644 index 8ef2fd1bcd8cd8628b44023c71a99b8b73bded26..0000000000000000000000000000000000000000 --- a/servicePoints/templates/delete.html +++ /dev/null @@ -1,17 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <link rel="stylesheet" type="text/css" href="/css/style.css"> - <title>ServicePoints</title> - </head> - - <body> - <h1> - <a href="/">Back to Homepage</a> - </h1> - <p>{{username}}</p> - <form action="/accounts/delete/" method="post" enctype="multipart/form-data"> - <input type="submit" name="delete" value="confirm delete account"/> - </form> - </body> -</html> diff --git a/servicePoints/templates/manageOrg.html b/servicePoints/templates/manageOrg.html index 25eb2acbba922700d11c304e3dc2f7a96a30121f..3ecfc5ceec588a42c8b15d38e5a774afd1048026 100644 --- a/servicePoints/templates/manageOrg.html +++ b/servicePoints/templates/manageOrg.html @@ -7,6 +7,23 @@ <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> + <style> + .listing { + padding: 14px 16px; + margin: 10px 0px; + border-radius: 7px; + border: 3px solid black; + width:100%; + } + + .members { + padding: 20px 16px; + margin: 10px 0px 50px 0px; + border-radius: 7px; + border: 3px solid black; + float:left; + } + </style> <title>Manage Org</title> </head> @@ -62,43 +79,44 @@ <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> + <div class="listing"> + <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> + </div> {% 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}}) - {% else %} - - <form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data"> + <div class="members"> + {% for member in members %} + {% if username == member.username %} {{member.fullname}} ({{member.username}}) - <input type="hidden" name="user" value="{{member.username}}" /> - <input type="submit" name="remove" value="remove from org" /> - </form> - {% endif %} - {% endfor %} + {% else %} + + <form action="/accounts/manageOrg/" method="post" enctype="multipart/form-data"> + {{member.fullname}} ({{member.username}}) + <input type="hidden" name="user" value="{{member.username}}" /> + <input type="submit" name="remove" value="remove from org" /> + </form> + {% endif %} + {% endfor %} + </div> </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> diff --git a/servicePoints/templates/userProfile.html b/servicePoints/templates/userProfile.html index 23e12e128c40bb93b8c9975cd1867df70672f3eb..7bc9b6151c679cd6231fd0f65fab863234fac184 100644 --- a/servicePoints/templates/userProfile.html +++ b/servicePoints/templates/userProfile.html @@ -60,15 +60,15 @@ <div class="row"> <div class="col-sm-8"> <h2>Profile</h2> - {% if pending == 0 %} - <p> - Student Organization: {{org}} - </p> - {%endif%} - {% if pending == 1 %} - <p> - Student Organization: Your request is pending. Requesting to join another organization while your request is pending will cancel your original request. - </p> + {% if pending != '' %} + <div class="alert alert-warning alert-dismissible fade show" role="alert"> + <strong> + Your request to join {{pending}} is pending. Requesting to join another organization while your request is pending will cancel your original request. + </strong> + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> {%endif%} {% if leader == 0 %} diff --git a/servicePoints/templates/viewRequests.html b/servicePoints/templates/viewRequests.html index dc456024e8885b430f49cd9131e8372860809766..77a28bddaf35fcd0963ff53b36d3488be691d2b3 100644 --- a/servicePoints/templates/viewRequests.html +++ b/servicePoints/templates/viewRequests.html @@ -1,37 +1,126 @@ <!DOCTYPE html> <html> - <head> - <a href="/">Home</a> - </head> +<head> + <!-- Required meta tags --> + <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"> + <style> + .listing { + padding: 14px 16px; + margin: 10px 0px; + border-radius: 7px; + border: 3px solid black; + width: 100%; + } + </style> + + <title>View Requests</title> +</head> + <body> - <title>ServicePoints</title> - <p> - {{org}} members' requests: - </p> - {% for request in requests %} - <p> - {{request.member}} is requesting ServicePoints for ({{request.service}}): - </p> - <p> - <img src=/images/{{request.filename}} alt="img"> - </p> - <p> - Enter the number of hours you'd like to assign in it's numerical form (1, 2, 3...): - <form action="/accounts/viewRequests/" method="post" enctype="multipart/form-data"> - <input type="hidden" name="postid" value="{{request.postid}}"/> - <input type="hidden" name="user" value="{{request.member}}"/> - <input type="hidden" name="filename" value="{{request.filename}}"/> - <input type="text" name="numHours" /> - <input type="submit" name="confirm" value="confirm"/> - </form> - Please give an explanation as to why you're denying this request: - <form action="/accounts/viewRequests/" method="post" enctype="multipart/form-data"> - <input type="hidden" name="postid" value="{{request.postid}}"/> - <input type="hidden" name="filename" value="{{request.filename}}"/> - <input type="text" name="reason" /> - <input type="submit" name = "deny" value="deny" /> - </form> - </p> - {% endfor %} + + + <div class="jumbotron text-center" style="margin-bottom:0; "> + <h1>ServicePoints!</h1> + <p>Connect with your Org</p> + </div> + + <nav class="navbar navbar-expand-sm navbar-dark" style="background-color:#7952b3;"> + <a class="navbar-brand" href="/">Home</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="collapsibleNavbar"> + <ul class="navbar-nav mr-auto"> + <li class="nav-item"> + <a class="nav-link" href="/accounts/blood/">Blood Drives</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/accounts/food/">Food Drives</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/accounts/mask/">Mask Making</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/accounts/tutorsu/">Tutoring</a> + </li> + </ul> + <ul class="navbar-nav"> + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + 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 Member's Requests: </h2> + + {% for request in requests %} + <div class="listing"> + <h6> + {{request.member}} is requesting ServicePoints for ({{request.service}}): + </h6> + <p> + {{request.description}} + </p> + <p> + <img src=/images/{{request.filename}} alt="img"> + </p> + Enter the number of hours you'd like to assign: + <form action="/accounts/viewRequests/" method="post" enctype="multipart/form-data"> + <input type="hidden" name="postid" value="{{request.postid}}" /> + <input type="hidden" name="user" value="{{request.member}}" /> + <input type="hidden" name="filename" value="{{request.filename}}" /> + <input type="number" name="numHours" required /> + <input type="submit" name="confirm" value="confirm" /> + </form> + Or give an explanation as to why you're denying this request: + <form action="/accounts/viewRequests/" method="post" enctype="multipart/form-data"> + <input type="hidden" name="postid" value="{{request.postid}}" /> + <input type="hidden" name="filename" value="{{request.filename}}" /> + <textarea class="form-control" name="reason" rows="2" placeholder="Enter a Description" required></textarea> + <input type="submit" name="deny" value="deny" /> + </form> + </div> + {% endfor %} + {% if not requests %} + No pending Service Requests + {% endif %} + </div> + <div class="col-sm-4"> + <div> + <h2>Your Info: </h2> + <p>Username: {{username}}</p> + <p>Organization: {{org}}</p> + <p>Hours: {{hours}}</p> + <hr class="d-sm-none"> + </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> diff --git a/servicePoints/views/accounts.py b/servicePoints/views/accounts.py index 7a90133be3d517ad1d576ea641786d9b13b70501..448891fa91f7f4f779a8e15513295d8dd50166ce 100644 --- a/servicePoints/views/accounts.py +++ b/servicePoints/views/accounts.py @@ -196,11 +196,11 @@ def viewRequests(): username = flask.session["username"] cursor = servicePoints.model.get_db() - leaderCur = cursor.execute('SELECT postid, member, service, filename FROM requests WHERE ' + leaderCur = cursor.execute('SELECT postid, member, service, description, filename FROM requests WHERE ' 'leader =:who', {"who": username}) results = leaderCur.fetchall() - context = {'requests': results} + context = {'requests': results,'username': username, 'org': flask.session["orgName"], 'hours': flask.session["hours"]} return render_template('viewRequests.html', **context) return flask.redirect(flask.url_for('login')) @@ -242,18 +242,28 @@ def hash_pass(password_in): @servicePoints.app.route('/accounts/delete/', methods=['GET', 'POST']) def delete(): - """Render delete page.""" + # Delete Account name = (flask.session['username']) to_add = (name,) cur = servicePoints.model.get_db() + #if flask.session["leader"] == 1: + # leaderCur = cursor.execute('SELECT orgName FROM orgs WHERE ' + # 'username =:who',d + # {"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,)) + flask.session.clear() cur.execute('DELETE FROM users WHERE username=?', to_add) return flask.redirect(flask.url_for('login')) @servicePoints.app.route('/accounts/deleteOrg/', methods=['GET', 'POST']) def deleteOrg(): - """Render delete page.""" + # Delete Organization username = flask.session["username"] cursor = servicePoints.model.get_db() leaderCur = cursor.execute('SELECT orgName FROM orgs WHERE ' @@ -411,11 +421,11 @@ def profile(): leader = 1 cur = cursor.execute('SELECT * FROM pendingOrgs WHERE username =:who', {"who": username}) - tryfetch = cur.fetchone() - if tryfetch is None: - pending = 0 + trypending = cur.fetchone() + if trypending is None: + pending = '' else: - pending = 1 + pending = trypending["orgName"] context = {"orgs": orgs, "fullname": user["fullname"], "email": user["email"], "username": username, "hours": results["hours"], "org": user["orgName"], "leader": leader, "pending": pending} @@ -498,6 +508,7 @@ def submitPoints(): dummy, temp_filename = tempfile.mkstemp() file = flask.request.files["file"] serviceType = flask.request.form["service"] + description = flask.request.form["description"] file.save(temp_filename) # Compute filename @@ -524,8 +535,8 @@ def submitPoints(): {"who": orgName}) results = studentOrgLeader.fetchone() leader = results["username"] - cursor.execute('INSERT INTO requests(member, leader, service, filename) VALUES ' - '(:one,:two,:three,:four)', {"one": username, "two": leader, "three": serviceType, "four": hash_filename_basename}) + cursor.execute('INSERT INTO requests(member, leader, service, description, filename) VALUES ' + '(:one,:two,:three,:four,:five)', {"one": username, "two": leader, "three": serviceType, "four": description, "five": hash_filename_basename}) context = {'username': flask.session["username"], 'org': flask.session['orgName'], 'hours': flask.session["hours"], 'leader': flask.session["leader"], 'serviceMsg' :'', 'submitMsg':'Your Service has been submitted'} @@ -614,7 +625,7 @@ def manageOrg(): 'orgName =:who', {"who": orgName}) pending = pendingCur.fetchall() - context = {'org': orgName, 'members': members, 'username': username, 'pending': pending} + context = {'org': orgName, 'members': members, 'username': username, 'pending': pending, 'hours': flask.session["hours"]} return render_template('manageOrg.html', **context) return flask.redirect(flask.url_for('login')) diff --git a/sql/schema.sql b/sql/schema.sql index 938036bb925fe6c4807b1b861d82548d76b60931..c40779d1c649e68c3cf09179b8184005008e26e1 100644 --- a/sql/schema.sql +++ b/sql/schema.sql @@ -41,6 +41,7 @@ CREATE TABLE requests( member VARCHAR(20) NOT NULL, leader VARCHAR(40) NOT NULL, service VARCHAR(40) NOT NULL, + description VARCHAR(128) NOT NULL, filename VARCHAR(64) NOT NULL, PRIMARY KEY(postid) FOREIGN KEY(member) REFERENCES users(username) ON UPDATE CASCADE diff --git a/var/servicePoints.sqlite3 b/var/servicePoints.sqlite3 index cd90da82698303b8a8fd85b1572215597bfbc1d2..9930d7e352f940245a1332216043b6f9cf374fc7 100644 Binary files a/var/servicePoints.sqlite3 and b/var/servicePoints.sqlite3 differ