From 9a4ceda69495257601fbea7a5a1159c1b5592251 Mon Sep 17 00:00:00 2001
From: mrschnei <mrschnei@umich.edu>
Date: Fri, 31 Jul 2020 18:33:12 -0400
Subject: [PATCH] Added UI for the view Requests page. Updated UI for profile
 and manage org pages. Deleted the delete page since it is no longer used

---
 servicePoints/templates/delete.html       |  17 ---
 servicePoints/templates/manageOrg.html    |  64 +++++----
 servicePoints/templates/userProfile.html  |  18 +--
 servicePoints/templates/viewRequests.html | 153 +++++++++++++++++-----
 servicePoints/views/accounts.py           |  33 +++--
 sql/schema.sql                            |   1 +
 var/servicePoints.sqlite3                 | Bin 45056 -> 45056 bytes
 7 files changed, 194 insertions(+), 92 deletions(-)
 delete mode 100644 servicePoints/templates/delete.html

diff --git a/servicePoints/templates/delete.html b/servicePoints/templates/delete.html
deleted file mode 100644
index 8ef2fd1..0000000
--- 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 25eb2ac..3ecfc5c 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 23e12e1..7bc9b61 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">&times;</span>
+                    </button>
+                </div>
                 {%endif%}
 
                 {% if leader == 0 %}
diff --git a/servicePoints/templates/viewRequests.html b/servicePoints/templates/viewRequests.html
index dc45602..77a28bd 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 7a90133..448891f 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 938036b..c40779d 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
GIT binary patch
delta 632
zcmXX@J#SM%5Pa|1R&0~_Vj<%yk_!W(L3exKor{1(6ACH{B<^<a3=|1c=p7?LlLpDu
zF6b$U{{j*f|G^!iqDm1_zy;Bq_O!FJvomMg=4{)1cy+6;2H)8C!FaIVeZRN8@nrXD
z??<oxvRrmocT4rMw=+ICsNdaQjr*Tho8Fzx*Z!>2Z3gERI~<&EhWm@bVriN#V>j8`
zXI%i8&EfP#&;q8>rKmM>NkGa8?J<*%Iy;$c!mOt#gF=eQ3m|8sN~9?TX)K^5ONv{J
zITgHAHi_g!@J4BFWsovQElti|iG>7(;9T^^>GF~_-g2FCP=UCLL{SPbTpLNqa|q}p
zC9+)M(%09@M@6|1Vm3c|eDvVIc#}XngD!BeN<`_LOArg2a?V<zrxwc2khxlD`llYe
zE*Epi90fO)TX5EU<Ur>7Fj8J+0AmxknF1DoC1DDAQdtKQMJlA?lgUYivQ$RrDUt;#
zVj)q82r&gj>q%rx{i>=Oc3HLAZ+5vEPJXgcr^RY$+AY=-d!<{mtBPH1hWr=X>C`R8
z04^qf3gm*fC!02JChc{_)@Al1i_hzB#n|ZHas-f1PUz9(@Z>nWNi=y_e#E)9#ZPIo
rE9NSK3><^jNjPmvkRm8&d@#ZL5>v{>Ckzf_$qsW8_g^2+Kk@y)e^{x_

delta 452
zcmZvXKWh|G5Wshjc;3e3UXBnCi@+9<>vC`Q&A#_m3y<?p83Wp+uy}9YzWbAd1b4|<
z1d@nI%8>LHHdZ#duOJA5-{HW*Dutgw_pq@LW(H>FHv_-ZdF^ywyBOc?1kJDPd$ZmA
zu=0L&e&@x?-tubHnYGqFHLk+wXY@F_-QL^`-|b!fiayW2Ecb5JL)H&if7XgMJ2`t8
zHW+JfynWRGfZkv**m=J5v>2Kck}ZKwBMObiAWDl_3Pj))`BXW9eoJa=bD@<$p>poE
zCr&yAnHmd#%5dkk<3f9tJ2JV?5|EmEnORJXC8-~IS9QRpAt{i{6uC_jZIqB835Btq
z(u{HtIiWM8MfHvh5UMOulwJ3Jvk<O#m*UFmCSW&})epAb3hN80f0h1{A9wlX;Zmc<
z&I9(1omccRd(*4cgN^%X<_`|svnt~!uSZ9D3@?YHBCf*3i%skn(_vX277x1J>2$hX
lPDdpTx67k0hV`I*uantH1@;#O#)a9R_;KO(CuaQrt3N?+gB1V(

-- 
GitLab