From 51dde9101f6bfa0c457b68a32023693e64f473b0 Mon Sep 17 00:00:00 2001
From: Allie Bopp <aebopp@umich.edu>
Date: Tue, 14 Jul 2020 16:02:53 -0400
Subject: [PATCH] leader can approve/deny member requests

---
 servicePoints/templates/hourError.html        |  17 ++++++++
 servicePoints/templates/index.html            |   6 +--
 servicePoints/templates/viewRequests.html     |  35 +++++++++++++++
 .../views/__pycache__/accounts.cpython-36.pyc | Bin 12005 -> 13239 bytes
 servicePoints/views/accounts.py               |  41 ++++++++++++++++++
 sql/schema.sql                                |   2 +-
 var/servicePoints.sqlite3                     | Bin 32768 -> 32768 bytes
 7 files changed, 97 insertions(+), 4 deletions(-)
 create mode 100644 servicePoints/templates/hourError.html
 create mode 100644 servicePoints/templates/viewRequests.html

diff --git a/servicePoints/templates/hourError.html b/servicePoints/templates/hourError.html
new file mode 100644
index 0000000..61628d1
--- /dev/null
+++ b/servicePoints/templates/hourError.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+  <head>
+      <link rel="stylesheet" type="text/css" href="/css/style.css">
+      <title>ServicePoints</title>
+  </head>
+
+  <body>
+    <p>
+      Please submit the numerical form of the number of hours you'd like to assign:
+      1, 2, 3, 4, ...
+    </p>
+    <form action="/accounts/hourError/" method="post" enctype="multipart/form-data">
+      <input type="submit" name="return" value="Return to View Member Requests"/>
+    </form>
+  </body>
+</html>
diff --git a/servicePoints/templates/index.html b/servicePoints/templates/index.html
index 52cf883..f0c4ffc 100644
--- a/servicePoints/templates/index.html
+++ b/servicePoints/templates/index.html
@@ -78,10 +78,10 @@
 
         {% if leader == 1 %}
         <a href="/accounts/viewMemberPoints/">
-            <img src=/images/view.png alt="mask">
+            <img src=/images/view.png alt="view">
         </a>
-        <a href="/accounts/mask/">
-            <img src=/images/requests.png alt="mask">
+        <a href="/accounts/viewRequests/">
+            <img src=/images/requests.png alt="requests">
         </a>
         {% endif %}
     </p>
diff --git a/servicePoints/templates/viewRequests.html b/servicePoints/templates/viewRequests.html
new file mode 100644
index 0000000..0fdfe3e
--- /dev/null
+++ b/servicePoints/templates/viewRequests.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <a href="/">Home</a>
+    </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="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="text" name="reason" />
+            <input type="submit" name = "deny" value="deny" />
+         </form>
+      </p>
+    {% endfor %}
+</body>
+</html>
diff --git a/servicePoints/views/__pycache__/accounts.cpython-36.pyc b/servicePoints/views/__pycache__/accounts.cpython-36.pyc
index a936282d588a76d6f91fe8266db2ec3c2b01c054..b03320044795d6266b104aa0e7e976c03badcd88 100644
GIT binary patch
delta 2034
zcmZWqO;A%;6u#%>@8v=GF$pB_fENTL7!bvdKgC~ulnP=Ir9}lH_bCY^X>Sr08lX;S
z$C-+wbGI%!)0xh6(~ixeUAXL${y5WBX1eG&cI~Ei#)a)UNvLtmoA=#w&;L31+?Qup
zez?A~&*jqYx~gV>I?LEoR`#<ZeH`E9)`Ok@w3?1+MbyRp+{W$K74Fzncmr?TU|E><
zaGf`8Fxd~^ca(|u@_hxdUNY@_Et6KIqb>{lFn_n8(o$0C&w@Os%nX;dr(av}5&m95
zwXGyOQzjebV+C0|Kg-8A*mMVn^DKBS_gML+W__i8&s;d1NXJvjJvSoe%?b14w3)<B
zc)L~&i3)rNsMtYZj6;e=VbOjc#D1idsD&$wig>{-g`IWLE{2N~xBA&COWC6Ks3Xgw
zDkYU+5y&dQxPx@oqon>~*^_dXOjJKMZ55_iybc&W$k*_#;La>$G4qmM(KUs)at*^M
zWnn5Xj6z{nEg4I+GRs!287r@}F+a<|0cK(S+exicRxT2vNa0lv70Rv5RawRu7&u@k
z+qQhwp0T5SHLuCo3gH|XN7RMkR9>4=Be3dBRdG+od9Rpuu?%;yjG*_du(Nf>1WnSk
zm7DS9Y5PZsWGcc}ItPbFhbD)N;fe7vLzIrhm^wW)F=P}~j3b8=ans0K5c7_3B7Q9*
zVtF;5j-5`VMKbSPz-35?gveXdNmHzJpGTJilLqmVMaRgOmv=bjF;B%hITM4J$;!S9
z=LSz;Y_duk=ZCgUiUEr`kSsnIGck+Q&4dwD#0Z+^Ex1`3DFrI#88TvKY~B<h15Iv3
z!e+?07FjY2#%0xAN+nC>EtzxN6zKToLP9vHHR^T)Ue=aRXwO0_wj{bxBM4%gmTFOr
zi>M)R6L<*x^3jg^@w_DxPl;M$>>xNu&`6*l1hu@C@)c)@Ge$tYn0D~_LOb!KkmVy7
zCO9P_;G3!}Pv<-2Cl4bqr4qIu4JidYV27F#PXo0;(_T|F(7=wU;-i6>K<k$vuh!P*
z*4%@jUch}&6V>wHHlI8as*=w=y)Y>QULBs~j(QIPJj>mxQvoi^+x2mHE}z#o!WCKR
z`xR#7EB`UuUUcwE8vZ|E7WV^+6XZa{w{TTH(%WQRV~gSjd7$wj%pv1Yk2rzq4S2(o
zDiTyj4OpSTUGcpBOq3=|9@oeH#gwc5AGX4w;CalGL!TH$H-Wbtj>>lZ3*e|S;tswg
zHKnWR0bDDk*l6oRAHDKv(=1$<qb;rO*j#e)09nz!VG1U=Aa6B~Lj<J(uWf!Qk>LGr
z$fNRA^B63myrcTW8<M5m?Un#QOnzmo1%^pfM@}tRIi3og8m-0i5pj7k@WMSsTE+fo
z*c}gubnZ;+@8B}gFwX>~E5b6=_Sn9HWUyBL>GMiUdp~?4kGHqf-Xb}T)3i057W>39
z9;eSnU)veE*?tVdxu4tb10>|kt}U%_tpxt{FuA`o3+wX7&JVpQ@^Fd3OCSi6vLiSF
z8Mz#sgp2Z*pn+q8BPtzTF1RDTT_doWo9+4>kp0*0op2B5#VcDvhrAcb`V>Jo!Cit$
z84LB;){xA}FGIUwO>Tw0hLlWpcfPZM+%0MWmB5rL8e8H8cZnuk#0LbQ5ftv?9il#!
zzje2Pkbigg*3gIx2Las`aYgp__>Rz+2<l(4dkaKG36==r1Ze{5lGr4m<O*>`r+mNJ
zeNyd@C3t$tJc_B|zZ3#psqLqdu9rns^k$Dk@6!)9)atFeN3GDS^a@?m9r&p7Nss40
D)ZN)m

delta 997
zcmZ9KO-vI}5XW~G+LA3Tm9|=7Ybh<rXQge30u?aE4-i2<L|84g@R|w&#aGZ^#6%z-
zG$xSY=*>i<iD>LWO*|Pd#zaEmMH0Lije0W1_;vCPkO1z>{&x01^XARY&Xf4ZuqS9T
zDG&deBJU4L(g$hNl`iZCaVO{JJiiK94$Ga9G+WFtXdE=LJf>s%xXcVUWu`Lcj5G}x
zg2&sZf%#d0UNv<+G$>p)xu|H<jv7|G8sb_H32pfBxZG=IM_8jc%*&udDrrjnkndSi
z+Kw>5QGDtMLlc@^4xK^N_9zw1sRnqN8qUoCXvYhABhE#tIa@$V%LE1VpvVejf(6XL
zI}p@G=)@)U0IZ<hxdJDIU9VR}^k)h8?p%N_eC6_@(dClAOIYr@1t*12XZ=H2GbpP}
zxzd5}$1nLephtMCalvh|O7MS#hD+`_IJKTIPZt!s4S2U80;kd9EwBzpljqE|i&`zo
zB4-#wo>u4;UbkJ>H<U;)>lS|mUwDqe8R0L=a%}NLQwP0nfIf^DUI8b5Ds(|V>Wh9_
zeH&#dqHG)R!Bp0+w_wu5nadKVqIfrcD}D|Md{ENm9~DB0!X2d75<-MJLOo%apcl~6
z`^R~JkF5TUZXr}*TWLLXr{+p$0T}8lInI}Bik6lbiD_wL7Zdoqd>Y2^az&4QfU>j^
z?1VVsEPkzMhx544*IC$1!eK&%z_KMdHqK%rW34>i9E-9T=S@P!Hme<9`%DnQcfLlL
zN_lo)12G==D?KocZz@~tThs8Xl&}f?exEKW%<IVfWst;K{~Z{>J%Qq?38CJmj?o87
zvRMoeC#|HAJH>;y5H1n22$O_yoDX;*j?V&>T{M)uhR{Lq6KJ@&kFcLWeP8Q(n5+mP
zO6VsH5~!Jcia=HJ37j-IvNA%$2{t|ys}to($p#z^=6kYLTZU0Jt438(4QtD$qor;W
KZ>4IPn)45<iQH%a

diff --git a/servicePoints/views/accounts.py b/servicePoints/views/accounts.py
index 5da6780..ee8fbae 100644
--- a/servicePoints/views/accounts.py
+++ b/servicePoints/views/accounts.py
@@ -172,6 +172,39 @@ def viewMemberPoints():
         return render_template('viewMemberPoints.html', **context)
     return flask.redirect(flask.url_for('login'))
 
+@servicePoints.app.route('/accounts/viewRequests/', methods=['GET', 'POST'])
+def viewRequests():
+    if 'username' in flask.session:
+        if flask.request.method == 'POST':
+            if 'deny' in flask.request.form:
+                post = flask.request.form["postid"]
+                servicePoints.model.get_db().execute('DELETE FROM requests WHERE postid =:one ', 
+                {"one": post})
+            if 'confirm' in flask.request.form:
+                try:
+                    numHours = int(flask.request.form["numHours"])
+                except:
+                    return flask.redirect(flask.url_for('hourError'))
+                post = flask.request.form["postid"]
+                user = flask.request.form["user"]
+                hours = servicePoints.model.get_db().execute('SELECT hours FROM users WHERE username =:one ', 
+                {"one": user})
+                dbHours = hours.fetchone()
+                dbHours["hours"] += numHours
+                servicePoints.model.get_db().execute('UPDATE users SET hours =:one WHERE username =:two ', 
+                {"one": dbHours["hours"], "two": user})
+                servicePoints.model.get_db().execute('DELETE FROM requests WHERE postid =:one ', 
+                {"one": post})
+
+        username = flask.session["username"]
+        cursor = servicePoints.model.get_db()
+        leaderCur = cursor.execute('SELECT postid, member, service, filename FROM requests WHERE '
+                    'leader =:who',
+                    {"who": username})
+        results = leaderCur.fetchall()
+        context = {'requests': results}
+        return render_template('viewRequests.html', **context)
+    return flask.redirect(flask.url_for('login'))
 
 @servicePoints.app.route('/', methods=['GET', 'POST'])
 def index():
@@ -253,6 +286,14 @@ def duplicateOrgName():
     context = {}
     return render_template('duplicateOrgName.html', **context)
 
+@servicePoints.app.route('/accounts/hourError/', methods=['GET', 'POST'])
+def hourError():
+    if flask.request.method == 'POST':
+        return flask.redirect(flask.url_for('viewRequests'))
+    context = {}
+    return render_template('hourError.html', **context)
+
+
 @servicePoints.app.route('/accounts/duplicateTutor/', methods=['GET', 'POST'])
 def duplicateTutor():
     if flask.request.method == 'POST':
diff --git a/sql/schema.sql b/sql/schema.sql
index fab44f6..1e08c1e 100644
--- a/sql/schema.sql
+++ b/sql/schema.sql
@@ -6,7 +6,7 @@ CREATE TABLE users(
 		email VARCHAR(40) NOT NULL,
 		orgName VARCHAR(40) NOT NULL,
 		password VARCHAR(256) NOT NULL,
-		hours VARCHAR(40) NOT NULL,
+		hours INTEGER NOT NULL,
 	  PRIMARY KEY(username)
 );
 
diff --git a/var/servicePoints.sqlite3 b/var/servicePoints.sqlite3
index b6ad11000aa06460c22e48c1bdf775fe143a0fe5..c7704ebcdf577154892ec824ac58a38b738e2d20 100644
GIT binary patch
delta 429
zcmYL^!Ae^}7=>pNNKBf^7$V#RT`1UXxpQac-Wdo&5s^Y^gSaYG{AcE$wxASr<Ibor
zV8~K%;S&_{1YLC%aMcHJ*`*7qyT)F@<vHJX7H2f7j7F8qWy;1Yo6C&6S^2^EUs7)k
zN&6R{wUhQW+hBiM!|B@U?^o0Jt&>WlO6y6I&<mW*+PC$0A9lC4w{|8!+3U%S7d6TU
zgb(I=#!t`Q(uIB}>7IY42M7U=4iOLG+rjsvFUMa&i)`J1DRQS#J2Xla=wu$!nE5>O
z=v=Vt!YHtL;Zlsj=Q@h$Z4jUgfbbE#$P_wIX&M4(@N>t3F}bornUB&(iQel%sZcnp
zqZ1GfWKuf~m}6E*mqL)yIxn>k7ELUq%&kCyHlWE;SZESLD1RXQVcOZh<Ktm-sZs4W
z%0uiwyeItr8P<9&TJ3jBI{#U&9|?ba78t8lyNx+{nv%t`z3kPV#FyACDIxr3+8JJP
Jx;H-i^bbdnbsYcz

literal 32768
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
P#(%o>qn(}jzo`A6MuJ(%

-- 
GitLab