From 8622b297e314e456e7a9c01d3d1abce3d9671a0d Mon Sep 17 00:00:00 2001 From: aarohisp <112809842+aarohisp@users.noreply.github.com> Date: Sat, 28 Oct 2023 19:03:16 +0530 Subject: [PATCH 1/2] updating api for homepage product visibility --- .../apis/__pycache__/routes.cpython-311.pyc | Bin 15077 -> 14686 bytes myflask_app/apis/routes.py | 14 +- myflask_app/app/__init__.py | 3 +- .../app/__pycache__/__init__.cpython-311.pyc | Bin 992 -> 1098 bytes .../__pycache__/models.cpython-311.pyc | Bin 6307 -> 4136 bytes myflask_app/database/models.py | 40 +- .../Flask_Cors-4.0.0.dist-info/INSTALLER | 1 + .../Flask_Cors-4.0.0.dist-info/LICENSE | 7 + .../Flask_Cors-4.0.0.dist-info/METADATA | 147 +++++++ .../Flask_Cors-4.0.0.dist-info/RECORD | 17 + .../Flask_Cors-4.0.0.dist-info/REQUESTED | 0 .../Flask_Cors-4.0.0.dist-info/WHEEL | 6 + .../Flask_Cors-4.0.0.dist-info/top_level.txt | 1 + .../Lib/site-packages/flask_cors/__init__.py | 27 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1127 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 17793 bytes .../__pycache__/decorator.cpython-311.pyc | Bin 0 -> 5646 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 9303 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 226 bytes .../Lib/site-packages/flask_cors/core.py | 382 ++++++++++++++++++ .../Lib/site-packages/flask_cors/decorator.py | 137 +++++++ .../Lib/site-packages/flask_cors/extension.py | 201 +++++++++ .../Lib/site-packages/flask_cors/version.py | 1 + myflask_app/flaskenv/Scripts/activate | 2 +- myflask_app/flaskenv/Scripts/activate.bat | 2 +- myflask_app/flaskenv/pyvenv.cfg | 2 +- 26 files changed, 958 insertions(+), 32 deletions(-) create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/INSTALLER create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/LICENSE create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/METADATA create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/RECORD create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/REQUESTED create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/WHEEL create mode 100644 myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/top_level.txt create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/__init__.py create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/__init__.cpython-311.pyc create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/core.cpython-311.pyc create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/decorator.cpython-311.pyc create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/extension.cpython-311.pyc create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/version.cpython-311.pyc create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/core.py create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/decorator.py create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/extension.py create mode 100644 myflask_app/flaskenv/Lib/site-packages/flask_cors/version.py diff --git a/myflask_app/apis/__pycache__/routes.cpython-311.pyc b/myflask_app/apis/__pycache__/routes.cpython-311.pyc index fa5f3896bb0eb13fa3ddde891890f0cdfbd2940b..1da51e2bf82b902e8803bd580d57e79fe08a2f19 100644 GIT binary patch delta 3129 zcmaJ@T}&L;6`nggvoj0(&zi;S#U3C))`sQB_>U|Jn0P5kOdOM{333V(W=ys$yZFwm z!E`BpNTM`PrZ-W3T18eLQbndxtCcGErIixN4^AI!6{*rxYV*=2Rvv;CSGCec={a}s zg58i2e0%5IGw1I+_ssmG^fwy(RUl9!!1azgV7{DM4K|SZ)%KBxiC_qZoDWO{;MbcE z&V?pIT&Cp1bCHP%tksu=iRkLPCx~bDlX!)Yh)4V~^4m z{YDN-%fwdLR3a9%Ywu|YLYc5XNsTR{9oQ~g6W=F-a0UL|YuRH5*(Zq@`?FThvTb3B z2(Cc9T*FAb8Smq)+^sz^4vTwF2@t-a81gS3ur@BV2zJAk)>Q~$Zx*N@6|n;Bw9>O*zGn@!X&vrGQP)>67bdwMhnSX(>J_Dr46)CY5&wVT_M)&M zg?u_;r_@2;jpV@1QwJ<&azlm%iyEzHT-LV_rb@Ns-I;a`+c~R_}Hi6le>aO2t6*> z6l5c8MBFvY9O`0=5kFhgLejX9in6yNt?YWF{ZO^^9}s#3qW(%Q*=IYCW>X4147XfH zkK*bWLO;SItUG%6WDJ%|Bj2}7s_A*`tqYpDn6qq4%M~>HB~!z;d{MW|w00_Q!mpMu z&cIfYYSYDntxwxrOE>0ng*1CFTHn}(#*sRwR-d1rL@jgCraly>+0AICcP}pYA!q<8 zzaya&M=I!Z<_@8b);$u%CgIGwa1jW8yRO6A2VyJCuGdYor(+osWADY%YF6A3YJFLe zt;h7_aS?BYaq&6)Nj@*$=6DB@P3{_4nFsMQIl*_iYBDQcQa9pg!L{S!ZEo`p$L;c+ z)_3pT-D&Gz2_YQ6w0JY5t%vq#H&o5S?)>o4VSl#XbFE&=CX{Q9B%7#o)c=u8A*U{X z8CWgVjuo{MP{s@P81CV*qXW1Xf4*4KbZTma;sSCtV;VqZQxip|Q!?e#1qTZqMc|f? zu_qh$tqkHlXV2vdZ;vAkBRme^DAO;Q)3fsnG>anMP+R@QTMLN?FWaQ`&I zlL(lUJ9*H~W`9C!{yW)E@|E7kcO=d67U>K;pYqW&sQm)M4-qC2rr2s*oPE>O8sHR3 zn-sC0=GHTVsK67!nN5cfaFo%lpsNSTQF699hjDT*oC&`h^Nwzt9hJWs;6az32M!rd z(a)QE$t#t;E!2}R(e+No8iG82(UC9?8fQ1!Vx!f`MDM4IJ_n|NE}l#p&GIb2+rgnK zH!d~sGQ=l;1mO61@;FFbHc%DWfCQG>d&yem*X@@*B+bSSeA$f|I4YlCxq{{LF%7bm z=!ofVN0~J*EEK6>iQEQQIMZU7Ee73BAP?MWIqt$H4e#I{8jBXBhMJ$dv1zx z_w_C5bjIR2I)gLYpD{R66rZK zj0LY22L%>e=p7^qyV~0|&MSn)p*BEDbx-7Z6mW`p5?i$M33CB8J#-3{Fdw=MVBvQU zL=5rv9~>nAVLv{2l{{PN>zg9E>S$RC4H*WEIOt+N65Tn+rv|v*Iy8KweaoTYH3ipI zgZyZ3bN%(94tSUEKm5hS7zWmk(1-9e!Z^YN!VE$l;U@^MBD@A*;kVfoFFXg@2KP>F zu8^}QX|ZIR7JZ#rN7@o$StlC;;%$%M?OvC=HbgFah*ge^Htms{HiY{C)q2IX delta 3419 zcmai0YfK#16`nh@Gy7uSED%_SS@ST97cgME7~>bl5E7fD0XGHP!fR$&58mCucV+`d zOKm5Wnp9O}_gd*gQAMkkDoPsFT}8@|zNENHfAj}fs8&ZxRjKNaRH}+)N3|^VanGHF zHL6jrcE34u?&G}A+&|;L<^4bP`8*sQ%gt@-3#~W(HORcVYbcrZP52O}aEh4mPx$Fm z$^^2(i6G-SGofsFB1~!5*SU$v&9_g)9G3gEq2g1zqGl}ju&HKk()A)v-~LCnfX*rPR8nTj66hq6 zBy9v7jq3nvDI~%ef?zqOb)2auIxx+CaLp--c+ zTW9Y@o9;%NmM*SFJJzBdZw!(*okwH8Yq`^YuYc@r|JcguGpqe)*ZR+{#Llh8&aK7H zk-N^@JC8RWKfrywD+GAJGteg75$Xq8ggZMC&@JLXTk$8ZqkJ#3yN2rU*)1v<$3V*+ z6cRq$G6)HV=-LK=^>`-Rn>-!wri%=bf(!#EN#5Iz z>We@2o0<1%ErLAn*CRMR&n{?H2i~zXSP5Bygg#I+Ax!|y6cT>R!Ai)HOJ&tBRLv1SSP6N<0>1&* zXa;;aoRs#_3FA5PdUz@rihif&+cn>9Sq(L;g&N+F$Xa+LQnk(@_gB!$*qIV>ULg&U zcGqRJ&UxLJ5gCu9S_k;&`E`yP?ioqet6KeO}82t8dJ&2IRGXyyB7#h}g%WT1eJ0M<~Oyr9H1?JnKGZObNXtDEbkU-wH%qLu0f}ZuUA(IsGoelw&5yh z%q&~*v&_xuraZ0ZbBf)PyJ32>D}DBmHmO9Ar73=zDPRD89)Kx-5-4T?v<$L!lyaD6@O)h_$`y-s-*Y%wH74Aovnd)? zVfi#b8sH*8gj|zbd@MeWQhdmVa?|m$6(TGf1c2KIE^FKbub{T&)aWe&luQAOg`onU zBDb4rdY>v2_PE&RhVHXN1HE>m2;oVs(Boa`8^s^Rv4Au<>(X{-+3Cew4p4)AEf@T7 zuc2wUC1@;Bw?+=1qjG8Fm}%vY3X?aot-Q@J*->&}4eZW=S#IVEXhU{jU}?#o|1@=> z4~m`5O9E|QcM}hy;4RC=dY+au@C7*JBC%R)QIdS#I*9&6`gYH!$AO&%fGEAo(`y5@ z&0u!gDOd-S@O8AUsV=q46iyqgrYzBz&1h!XNK2yMev?*(i*B-nR3?L&#mVg~wxrZ7 zy;>;c1jQ|6GWl!|bJ-O*#Wp-c`#N(3)rvP~aj5!Jm2g&t# zlzf_Wl2~Uwa+AK!j#1`J@FSk5kZ{>0y8sNcUfL7r%{{#*pv>)d&TBfmsanEI!zbDG6~6_O1^^2asP@>^m(`VgMm>yg j(N~%oobgMt)bsMr!4>Wce#C#EBYx6>8rHd|BNOvK4{Pre diff --git a/myflask_app/apis/routes.py b/myflask_app/apis/routes.py index ba2e17a..b689f04 100644 --- a/myflask_app/apis/routes.py +++ b/myflask_app/apis/routes.py @@ -1,7 +1,7 @@ from flask import request, jsonify, current_app, send_file from app import db from sqlalchemy import or_ -from database.models import UserModel, ItemModel, OrgModel, ImageModel +from database.models import UserModel, ItemModel, ImageModel import bcrypt from io import BytesIO from PIL import Image @@ -11,7 +11,6 @@ def init_routes(app): @app.route("/api/upload", methods=["POST"]) def upload_image(): try: - org_id = request.form.get("org_id") image_file = request.files["image"] if image_file: @@ -19,7 +18,7 @@ def upload_image(): image = Image.open(BytesIO(image_data)) - new_image = ImageModel(image_data=image_data, org=OrgModel.query.get(org_id)) + new_image = ImageModel(image_data=image_data) db.session.add(new_image) db.session.commit() return jsonify({"message": "Image uploaded successfully", "status": "success"}) @@ -58,13 +57,11 @@ def register(): username = data.get("username") password = data.get("password") email = data.get("email") - role_id = data.get("role_id") - org_id = data.get("org_id") phoneno = data.get("phoneno") city = data.get("city") # Input validation - if not (name and username and password and email and role_id and org_id and phoneno and city): + if not (name and username and password and email and phoneno and city): return jsonify({"message": "Missing required fields", "status": "error"}) with app.app_context(): @@ -73,15 +70,16 @@ def register(): if user_exists is None: hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) - new_user = UserModel(uname=name, username=username, password=hashed_password, email=email, role_id=role_id, org_id=org_id, phoneno=phoneno, city=city, is_deleted=False) + new_user = UserModel(uname=name, username=username, password=hashed_password, email=email, phoneno=phoneno, city=city, is_deleted=False) db.session.add(new_user) db.session.commit() response = {"message": "You are registered and can now login", "status": "success"} else: - response = {"message": "User already exists, please login or contact admin", "status": "danger"} + response = {"message": "User already exists in the database. Please login or contact the admin.", "status": "danger"} return jsonify(response) + @app.route('/api/login', methods=["POST"]) def login(): data = request.json diff --git a/myflask_app/app/__init__.py b/myflask_app/app/__init__.py index cebad5c..3765058 100644 --- a/myflask_app/app/__init__.py +++ b/myflask_app/app/__init__.py @@ -1,4 +1,5 @@ from flask import Flask +from flask_cors import CORS from flask_sqlalchemy import SQLAlchemy import os @@ -6,7 +7,7 @@ def create_app(): app = Flask(__name__) - + cors = CORS(app) # Load configuration settings from config.py config_file_path = os.path.abspath('./config.py') app.config.from_pyfile(config_file_path) diff --git a/myflask_app/app/__pycache__/__init__.cpython-311.pyc b/myflask_app/app/__pycache__/__init__.cpython-311.pyc index 74dbf5e97fcc21efa9f48705ef9cde6c906b771d..281b0994acd5b7c8447e96c7347aa2bde2e43a33 100644 GIT binary patch delta 528 zcmY*Vy-UMD6u+0`+O##c2(`2d3VyW+3T{O!N{f>ppj(#^n$)%?O})fHX|aNfP{9z~ z95PkJKf>L~Q33@Q2RB!pylbiG?JUd`3|z#3 zRHO=epcvqghPyQ9ktOz}7*z2kDvGLbfHHv(=F5POw{*oiqD08=?H@R2bC7ntCBW`A zq*5)g1A}6QHDSm-?7YwAxhAUphP~i0`1fyeU7$PAHxNK}Y{(JvLhcSMM#4s<#RF>c z-Uzkl-3OSBON6I+z9`Fe#n5D#u-R@8a;t2PAF0->woJ?uTeC8P&nu0FFO*DT`LU8& zFINxca#h#lhGJI;E3jDkw7bi#z@~e_O{K@FEwaERg*NJiqqpMKa%Z`n??s|F{8hG- zZ5Q4XN%x5}&qF>gvnvgD3ir9pruDb-V*`hEtSfq{q8XKV oam_H*6J1*;lhkC_u__ckc>s7tiI@L6_KGH6{;PY(ZwRd44^YH)=Kufz delta 388 zcmX@b@qnFoIWI340}#lmX{Mf;$ScX{Fi~CEAc}>FA(eR(=o7Ds%1 zUSe))eEeh)CR-CWkPvrfUS>&rQGRJjYOyBsE#}06f?EQ~`FUxX>G5fqIjQjli6t3D zAf?41BPRDS88IeK-p?d2F9PJUgT$+WL<7TJF8-+;o%%ic4bETL7$l@7voYs$vEO1% z19`ZJdGZ8iF%yt?i#R|8FNgq{u#%xj6vP$=62CZXa`RJ4b5iY!B!OIzH;cn2-(r@T L%)w&E0#XJ5fcQ_^ diff --git a/myflask_app/database/__pycache__/models.cpython-311.pyc b/myflask_app/database/__pycache__/models.cpython-311.pyc index 687dd34a9c6b08a28994670fb06735824ae6d5e8..456e05f6ffda5346f1d6c158a2d71f3dce69ad4f 100644 GIT binary patch delta 899 zcmah{O=uHA6yDi1$!43MZc5XpO=~Pjy3|%I*h6V;RT^l;6sdxiO4wwl?b7XTI=d?d zJoKPPX~TF>>P=9qB0?{{h-VLif*{O6Jc+qTq&<01=OzB26@2i%oq0dsd;8|yJ^COW zxgUwh0+%PgF+5X=B+*7CvmVexvw|v938gFDA#o3FZ#KO|!z~a9qD#8;xcQz>5FT-D z$ef~wuL*N;J;GC?EOg$%?X!!FiIk_T=H zq?3P02SDH_MESu<(y37O+SBYrb^Yv|6%Q~!?lN|}7EOukVj*QRS>TE{m@_p zvLe@C(){DJo8A5@_xeyLorxYqU34{?RD#@Bg?_RGCPgB2GrBIpi>ZjT(xKQuAr5vR zWf9%BH2wp5!^JC(DzacfD=rhfz`_eQ!N#JMU&du8r>003B&7hl0eS%7DaiqVGzS(0 z7CuALOP|FuVJ2rA9H()aR$~rQ>7|y`F%~A+)Lg^1oF${g{JaI5kbYqKJ--3C0`ziq zKBDc1EiaH*ljx0jTCRtIvsh8uL{p&OxNVfh3N@PZFmEHw}qM8-kl+B$BEPhalr!92ftjvqlP0 zB`h@uDj@|r9E{{jj!ILaB9$u2EsA=olJ?@2_F%1|s;5e{7ou=!F73RrF$5x&vG&uv zH*em|d*9o)UTypKl<>VEa10rbj&{r5MZv>9U-aJP49q1)vfW`MZZXuvTdBws(N08* zO%kp!K5_AJ8*hfKWW4NQ@vlM%XUx~l_gRMdfyLjj4PRUA_z~;CK}-8tyMd97p9v*% zhB%kFHU7SVn3AV7#ze_Z91FT_G!>VJQ<5CljfhO~Uxv1UW5j6i0jpb+)A4wCA}()8 zMDvPEp=b|z#$%Fh9YN93HWO@9h_z)R9GOD$WXR{h$BmcAKo6$oD`^xkMC8TV8d9g zs;fbe779i(QNCmF6aJ%FciRG5n#p_e&K1w<>3gj!t*ZN^<~~_4x{5;m-01u@vVJ?? zpZBlyuQ#h5=d_M)u?{TV2J2C^^=u_fTKI$EM~DHg3szhZ$>-YDtl}blb;@j40bz zk(Kz~@DuQ{x_LVJN$m4!dE*w5kq9de0)xm7GEd;P9oX$Dm%;-Bf~wRlk~|rnj;9e= zQ}T4vG&w>+5Icepaj@!B6FLmDKda8ZOS2yGd5{YXAU;$N;0AzXq6PpD0o?+wNa3L- zBH=qmZ_7!lzIh{+l#?ml7>T84P%GFsg2fYKecxLkwE;bT!3?&G?zcM^dn zN*AP5GMtvB@fg{w_zb9)Ea~>i(yKl`CC?}!U(10w1rL-{{0rwbQTFgZoWh>L3BLIh zs_>_q$eAg$m$!bn69Dk3FouUu_-Ab6E;d##76iX4_%*?w8Qe7EuY@);rM(~jNILZ^ z{7e{mz2&yxGb~5?tz)*-g^6Q2#(2p_lE=|9rj=C68ht-XS=;!RSfb+uLO%Ne!Y_pf z<*ZwwH_{%;!z?UGXjWDfT>vSPN~Xh+G>Lyt*}@w|@6$^r%9jK(m0!{2$qet#MEd8q z3&M~p3~9npX0YgJm_ze3Sx?rP^W;x2x8_>cj}#mM)e+Dffy_|Rd97)oeaV*%W-sJ| z`N(o87gC*_nzJ)=x#((HxUdw=#7xjv2S+x-m! zry(DQ?T%vs+LvgN(VPXo_qke;gRa&Eg41SGUp1_H8ozVZpFu yeF6HdokbVE>lmLrW@5WHnf*X2<<<+(Z|y9KW;U?N?1u&CQo{?-Z@poWmd1bE!$MI2 diff --git a/myflask_app/database/models.py b/myflask_app/database/models.py index b64abf8..1b8ee5b 100644 --- a/myflask_app/database/models.py +++ b/myflask_app/database/models.py @@ -1,15 +1,15 @@ from app import db from sqlalchemy import Enum -class RoleModel(db.Model): - __tablename__ = 'role' +# class RoleModel(db.Model): +# __tablename__ = 'role' - role_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - role_name = db.Column(db.String(40), nullable=False) - description_role = db.Column(db.String(100)) - org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) +# role_id = db.Column(db.Integer, primary_key=True, autoincrement=True) +# role_name = db.Column(db.String(40), nullable=False) +# description_role = db.Column(db.String(100)) +# org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) - org = db.relationship('OrgModel', backref='roles') +# org = db.relationship('OrgModel', backref='roles') class UserModel(db.Model): __tablename__ = 'UserModel' @@ -21,12 +21,12 @@ class UserModel(db.Model): email = db.Column(db.String(100), unique=True) phoneno = db.Column(db.String(15), nullable=False) city = db.Column(db.String(40), nullable=False) - role_id = db.Column(db.Integer, db.ForeignKey('role.role_id'), nullable=False) + # role_id = db.Column(db.Integer, db.ForeignKey('role.role_id'), nullable=False) is_deleted = db.Column(db.Boolean, nullable=False, default=False) - org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) + # org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) - role = db.relationship('RoleModel', backref='users') - org = db.relationship('OrgModel', backref='users') + # role = db.relationship('RoleModel', backref='users') + # org = db.relationship('OrgModel', backref='users') def __repr__(self): return f'' @@ -46,22 +46,22 @@ class ItemModel(db.Model): specification = db.Column(db.String(50), nullable=False) item_check = db.Column(db.Boolean, default=False) status_item = db.Column(db.Enum('open', 'closed', 'expired', name='status_item_enum'), nullable=False, default='open') - org_id = db.Column(db.Integer, nullable=False) + # org_id = db.Column(db.Integer, nullable=False) # Define the relationship with UserModel donor = db.relationship('UserModel', backref='donated_items', foreign_keys=[donor_id]) -class OrgModel(db.Model): - __tablename__ = 'org' - org_id = db.Column(db.Integer, primary_key=True, autoincrement=True) - org_name = db.Column(db.String(100), nullable=False) - org_address = db.Column(db.String(255)) - org_contactno = db.Column(db.String(15)) +# class OrgModel(db.Model): +# __tablename__ = 'org' +# org_id = db.Column(db.Integer, primary_key=True, autoincrement=True) +# org_name = db.Column(db.String(100), nullable=False) +# org_address = db.Column(db.String(255)) +# org_contactno = db.Column(db.String(15)) class ImageModel(db.Model): __tablename__ = 'images' image_id = db.Column(db.Integer, primary_key=True, autoincrement=True) image_data = db.Column(db.LargeBinary) - org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) + # org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) - org = db.relationship('OrgModel', backref='images') + # org = db.relationship('OrgModel', backref='images') diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/INSTALLER b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/LICENSE b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/LICENSE new file mode 100644 index 0000000..46d932f --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/LICENSE @@ -0,0 +1,7 @@ +Copyright (C) 2016 Cory Dolphin, Olin College + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/METADATA b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/METADATA new file mode 100644 index 0000000..bd0c55a --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/METADATA @@ -0,0 +1,147 @@ +Metadata-Version: 2.1 +Name: Flask-Cors +Version: 4.0.0 +Summary: A Flask extension adding a decorator for CORS support +Home-page: https://github.com/corydolphin/flask-cors +Author: Cory Dolphin +Author-email: corydolphin@gmail.com +License: MIT +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +License-File: LICENSE +Requires-Dist: Flask (>=0.9) + +Flask-CORS +========== + +|Build Status| |Latest Version| |Supported Python versions| +|License| + +A Flask extension for handling Cross Origin Resource Sharing (CORS), making cross-origin AJAX possible. + +This package has a simple philosophy: when you want to enable CORS, you wish to enable it for all use cases on a domain. +This means no mucking around with different allowed headers, methods, etc. + +By default, submission of cookies across domains is disabled due to the security implications. +Please see the documentation for how to enable credential'ed requests, and please make sure you add some sort of `CSRF `__ protection before doing so! + +Installation +------------ + +Install the extension with using pip, or easy\_install. + +.. code:: bash + + $ pip install -U flask-cors + +Usage +----- + +This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. +It allows parameterization of all CORS headers on a per-resource level. +The package also contains a decorator, for those who prefer this approach. + +Simple Usage +~~~~~~~~~~~~ + +In the simplest case, initialize the Flask-Cors extension with default arguments in order to allow CORS for all domains on all routes. +See the full list of options in the `documentation `__. + +.. code:: python + + + from flask import Flask + from flask_cors import CORS + + app = Flask(__name__) + CORS(app) + + @app.route("/") + def helloWorld(): + return "Hello, cross-origin-world!" + +Resource specific CORS +^^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, you can specify CORS options on a resource and origin level of granularity by passing a dictionary as the `resources` option, mapping paths to a set of options. +See the full list of options in the `documentation `__. + +.. code:: python + + app = Flask(__name__) + cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) + + @app.route("/api/v1/users") + def list_users(): + return "user example" + +Route specific CORS via decorator +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This extension also exposes a simple decorator to decorate flask routes with. +Simply add ``@cross_origin()`` below a call to Flask's ``@app.route(..)`` to allow CORS on a given route. +See the full list of options in the `decorator documentation `__. + +.. code:: python + + @app.route("/") + @cross_origin() + def helloWorld(): + return "Hello, cross-origin-world!" + +Documentation +------------- + +For a full list of options, please see the full `documentation `__ + +Troubleshooting +--------------- + +If things aren't working as you expect, enable logging to help understand what is going on under the hood, and why. + +.. code:: python + + logging.getLogger('flask_cors').level = logging.DEBUG + + +Tests +----- + +A simple set of tests is included in ``test/``. +To run, install nose, and simply invoke ``nosetests`` or ``python setup.py test`` to exercise the tests. + +If nosetests does not work for you, due to it no longer working with newer python versions. +You can use pytest to run the tests instead. + +Contributing +------------ + +Questions, comments or improvements? +Please create an issue on `Github `__, tweet at `@corydolphin `__ or send me an email. +I do my best to include every contribution proposed in any way that I can. + +Credits +------- + +This Flask extension is based upon the `Decorator for the HTTP Access Control `__ written by Armin Ronacher. + +.. |Build Status| image:: https://api.travis-ci.org/corydolphin/flask-cors.svg?branch=master + :target: https://travis-ci.org/corydolphin/flask-cors +.. |Latest Version| image:: https://img.shields.io/pypi/v/Flask-Cors.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ +.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/Flask-Cors.svg + :target: https://img.shields.io/pypi/pyversions/Flask-Cors.svg +.. |License| image:: http://img.shields.io/:license-mit-blue.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/RECORD b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/RECORD new file mode 100644 index 0000000..9c9513b --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/RECORD @@ -0,0 +1,17 @@ +Flask_Cors-4.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Cors-4.0.0.dist-info/LICENSE,sha256=bhob3FSDTB4HQMvOXV9vLK4chG_Sp_SCsRZJWU-vvV0,1069 +Flask_Cors-4.0.0.dist-info/METADATA,sha256=iien2vLs6EIqceJgaNEJ6FPinwfjzFWSNl7XOkuyc10,5419 +Flask_Cors-4.0.0.dist-info/RECORD,, +Flask_Cors-4.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Cors-4.0.0.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110 +Flask_Cors-4.0.0.dist-info/top_level.txt,sha256=aWye_0QNZPp_QtPF4ZluLHqnyVLT9CPJsfiGhwqkWuo,11 +flask_cors/__init__.py,sha256=wZDCvPTHspA2g1VV7KyKN7R-uCdBnirTlsCzgPDcQtI,792 +flask_cors/__pycache__/__init__.cpython-311.pyc,, +flask_cors/__pycache__/core.cpython-311.pyc,, +flask_cors/__pycache__/decorator.cpython-311.pyc,, +flask_cors/__pycache__/extension.cpython-311.pyc,, +flask_cors/__pycache__/version.cpython-311.pyc,, +flask_cors/core.py,sha256=e1u_o5SOcS_gMWGjcQrkyk91uPICnzZ3AXZvy5jQ_FE,14063 +flask_cors/decorator.py,sha256=BeJsyX1wYhVKWN04FAhb6z8YqffiRr7wKqwzHPap4bw,5009 +flask_cors/extension.py,sha256=nP4Zq_BhgDVWwPdIl_f-uucNxD38pXUo-dkL-voXc58,7832 +flask_cors/version.py,sha256=61rJjfThnbRdElpSP2tm31hPmFnHJmcwoPhtqA0Bi_Q,22 diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/REQUESTED b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/WHEEL b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/WHEEL new file mode 100644 index 0000000..f771c29 --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/top_level.txt b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/top_level.txt new file mode 100644 index 0000000..27af988 --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/Flask_Cors-4.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_cors diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/__init__.py b/myflask_app/flaskenv/Lib/site-packages/flask_cors/__init__.py new file mode 100644 index 0000000..458150e --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/flask_cors/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +""" + flask_cors + ~~~~ + Flask-CORS is a simple extension to Flask allowing you to support cross + origin resource sharing (CORS) using a simple decorator. + + :copyright: (c) 2016 by Cory Dolphin. + :license: MIT, see LICENSE for more details. +""" +from .decorator import cross_origin +from .extension import CORS +from .version import __version__ + +__all__ = ['CORS', 'cross_origin'] + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +# Set initial level to WARN. Users must manually enable logging for +# flask_cors to see our logging. +rootlogger = logging.getLogger(__name__) +rootlogger.addHandler(NullHandler()) + +if rootlogger.level == logging.NOTSET: + rootlogger.setLevel(logging.WARN) diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/__init__.cpython-311.pyc b/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbfe6a2533ea6f51c208533a8038061731678871 GIT binary patch literal 1127 zcmZ8f%}X0W6ras*lFgcEwTLY(b!bg7Q0>Q|2Wf>?Z6nwSRS-g8*zAsR&Fs!Hvx%k$ z@z|pUp&okZ$x{3u`Zq)g81^Leo=XY7y2*+)We{0>|w{C00z@Nn0m+Q5SoP z=x(Z*Qa}t~eKV>kbK`+S1%M;*cBPoc>F=4Ib#oVSsY5{=U6cKh3c%^j!QP>$G1SA= zm_+Qp$b75E-Q0!maL@ifr>(C5`R0sIe+?*PotV6eEXsIf?g)v%JIPPYEq`2r4u>Y> zj_VT)@pgbc?obZ~6h=PKB!q4`UIjL2O|rb^`;-OHVw882Qsz_~4>HVYjaeA-4U@@$ zNtr$eYg`)FC2TCZF$2n`ji{3ui~0?bVI!DT13xUTK7kx#xU@L8P*_=j>y$y4G7N1Tm=597#<~1QIVDU-eWGrU!q%dulyCr{ zI%e`y5n}S*Fmai{xg2akxD6C)gyc=nCYa?$!X!dAwGawZ*X>9CVd{EfQIarum6XLr zA{i#eC&H41R>X`dEGg+!1qVxlz%0}e@=O;C7lTn6NH@V6rfpvp590*aF$oie<<*si z)llamHe$53Hy;Z>!G&!3vOGUinx|IH#a_Tm@0}oDE0^+^_<5&}(Oc81V$UwQjqZIg zeZLeT?A1$4PPxRL08jbC%dBADJ&G>PQ-mDP2@sn08<+Ykm)bRgXW3m*QqGq*#nMp~ zMd@g|qIG~=Mu0NW1dncN8{BL5Ya763zn%>Y@69%ihr7v60w_bfgYs#E@n*kvbTByn zd99UsaIk%xnQUbyca1hMPQmC27~QMxRlm6V?lG8X0nx<7nVM;-xA(U8cTUu7Q_Z%u g!BcJQL>oIueoG%~*_M`V_Ozn{?XmD-W8$O!0q0UQGXMYp literal 0 HcmV?d00001 diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/core.cpython-311.pyc b/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a73af5c736a2ef77e18ff8b5c67b1d9e89ed202e GIT binary patch literal 17793 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 literal 0 HcmV?d00001 diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/decorator.cpython-311.pyc b/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/decorator.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..601b0c563edef8c6299663b6efa56b04cba55e5c GIT binary patch literal 5646 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 literal 0 HcmV?d00001 diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/extension.cpython-311.pyc b/myflask_app/flaskenv/Lib/site-packages/flask_cors/__pycache__/extension.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d5731549f78b52bced1d0dde64faae2a2cf2764 GIT binary patch literal 9303 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 ko1apelWJGQ2DB06&|*Fy@qw9 1 or + len(origins_to_set) > 1 or + any(map(probably_regex, options.get('origins')))): + headers.add('Vary', 'Origin') + + return MultiDict((k, v) for k, v in headers.items() if v) + + +def set_cors_headers(resp, options): + """ + Performs the actual evaluation of Flask-CORS options and actually + modifies the response object. + + This function is used both in the decorator and the after_request + callback + """ + + # If CORS has already been evaluated via the decorator, skip + if hasattr(resp, FLASK_CORS_EVALUATED): + LOG.debug('CORS have been already evaluated, skipping') + return resp + + # Some libraries, like OAuthlib, set resp.headers to non Multidict + # objects (Werkzeug Headers work as well). This is a problem because + # headers allow repeated values. + if (not isinstance(resp.headers, Headers) + and not isinstance(resp.headers, MultiDict)): + resp.headers = MultiDict(resp.headers) + + headers_to_set = get_cors_headers(options, request.headers, request.method) + + LOG.debug('Settings CORS headers: %s', str(headers_to_set)) + + for k, v in headers_to_set.items(): + resp.headers.add(k, v) + + return resp + +def probably_regex(maybe_regex): + if isinstance(maybe_regex, RegexObject): + return True + else: + common_regex_chars = ['*', '\\', ']', '?', '$', '^', '[', ']', '(', ')'] + # Use common characters used in regular expressions as a proxy + # for if this string is in fact a regex. + return any((c in maybe_regex for c in common_regex_chars)) + +def re_fix(reg): + """ + Replace the invalid regex r'*' with the valid, wildcard regex r'/.*' to + enable the CORS app extension to have a more user friendly api. + """ + return r'.*' if reg == r'*' else reg + + +def try_match_any(inst, patterns): + return any(try_match(inst, pattern) for pattern in patterns) + + +def try_match(request_origin, maybe_regex): + """Safely attempts to match a pattern or string to a request origin.""" + if isinstance(maybe_regex, RegexObject): + return re.match(maybe_regex, request_origin) + elif probably_regex(maybe_regex): + return re.match(maybe_regex, request_origin, flags=re.IGNORECASE) + else: + try: + return request_origin.lower() == maybe_regex.lower() + except AttributeError: + return request_origin == maybe_regex + + +def get_cors_options(appInstance, *dicts): + """ + Compute CORS options for an application by combining the DEFAULT_OPTIONS, + the app's configuration-specified options and any dictionaries passed. The + last specified option wins. + """ + options = DEFAULT_OPTIONS.copy() + options.update(get_app_kwarg_dict(appInstance)) + if dicts: + for d in dicts: + options.update(d) + + return serialize_options(options) + + +def get_app_kwarg_dict(appInstance=None): + """Returns the dictionary of CORS specific app configurations.""" + app = (appInstance or current_app) + + # In order to support blueprints which do not have a config attribute + app_config = getattr(app, 'config', {}) + + return { + k.lower().replace('cors_', ''): app_config.get(k) + for k in CONFIG_OPTIONS + if app_config.get(k) is not None + } + + +def flexible_str(obj): + """ + A more flexible str function which intelligently handles stringifying + strings, lists and other iterables. The results are lexographically sorted + to ensure generated responses are consistent when iterables such as Set + are used. + """ + if obj is None: + return None + elif not isinstance(obj, str) and isinstance(obj, Iterable): + return ", ".join(str(item) for item in sorted(obj)) + else: + return str(obj) + + +def serialize_option(options_dict, key, upper=False): + if key in options_dict: + value = flexible_str(options_dict[key]) + options_dict[key] = value.upper() if upper else value + + +def ensure_iterable(inst): + """ + Wraps scalars or string types as a list, or returns the iterable instance. + """ + if isinstance(inst, str): + return [inst] + elif not isinstance(inst, Iterable): + return [inst] + else: + return inst + +def sanitize_regex_param(param): + return [re_fix(x) for x in ensure_iterable(param)] + + +def serialize_options(opts): + """ + A helper method to serialize and processes the options dictionary. + """ + options = (opts or {}).copy() + + for key in opts.keys(): + if key not in DEFAULT_OPTIONS: + LOG.warning("Unknown option passed to Flask-CORS: %s", key) + + # Ensure origins is a list of allowed origins with at least one entry. + options['origins'] = sanitize_regex_param(options.get('origins')) + options['allow_headers'] = sanitize_regex_param(options.get('allow_headers')) + + # This is expressly forbidden by the spec. Raise a value error so people + # don't get burned in production. + if r'.*' in options['origins'] and options['supports_credentials'] and options['send_wildcard']: + raise ValueError("Cannot use supports_credentials in conjunction with" + "an origin string of '*'. See: " + "http://www.w3.org/TR/cors/#resource-requests") + + + + serialize_option(options, 'expose_headers') + serialize_option(options, 'methods', upper=True) + + if isinstance(options.get('max_age'), timedelta): + options['max_age'] = str(int(options['max_age'].total_seconds())) + + return options diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/decorator.py b/myflask_app/flaskenv/Lib/site-packages/flask_cors/decorator.py new file mode 100644 index 0000000..b61d22f --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/flask_cors/decorator.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +""" + decorator + ~~~~ + This unit exposes a single decorator which should be used to wrap a + Flask route with. It accepts all parameters and options as + the CORS extension. + + :copyright: (c) 2016 by Cory Dolphin. + :license: MIT, see LICENSE for more details. +""" +import logging +from functools import update_wrapper +from flask import make_response, request, current_app + +from .core import get_cors_options, set_cors_headers, FLASK_CORS_EVALUATED + +LOG = logging.getLogger(__name__) + +def cross_origin(*args, **kwargs): + """ + This function is the decorator which is used to wrap a Flask route with. + In the simplest case, simply use the default parameters to allow all + origins in what is the most permissive configuration. If this method + modifies state or performs authentication which may be brute-forced, you + should add some degree of protection, such as Cross Site Request Forgery + protection. + + :param origins: + The origin, or list of origins to allow requests from. + The origin(s) may be regular expressions, case-sensitive strings, + or else an asterisk + + Default : '*' + :type origins: list, string or regex + + :param methods: + The method or list of methods which the allowed origins are allowed to + access for non-simple requests. + + Default : [GET, HEAD, POST, OPTIONS, PUT, PATCH, DELETE] + :type methods: list or string + + :param expose_headers: + The header or list which are safe to expose to the API of a CORS API + specification. + + Default : None + :type expose_headers: list or string + + :param allow_headers: + The header or list of header field names which can be used when this + resource is accessed by allowed origins. The header(s) may be regular + expressions, case-sensitive strings, or else an asterisk. + + Default : '*', allow all headers + :type allow_headers: list, string or regex + + :param supports_credentials: + Allows users to make authenticated requests. If true, injects the + `Access-Control-Allow-Credentials` header in responses. This allows + cookies and credentials to be submitted across domains. + + :note: This option cannot be used in conjunction with a '*' origin + + Default : False + :type supports_credentials: bool + + :param max_age: + The maximum time for which this CORS request maybe cached. This value + is set as the `Access-Control-Max-Age` header. + + Default : None + :type max_age: timedelta, integer, string or None + + :param send_wildcard: If True, and the origins parameter is `*`, a wildcard + `Access-Control-Allow-Origin` header is sent, rather than the + request's `Origin` header. + + Default : False + :type send_wildcard: bool + + :param vary_header: + If True, the header Vary: Origin will be returned as per the W3 + implementation guidelines. + + Setting this header when the `Access-Control-Allow-Origin` is + dynamically generated (e.g. when there is more than one allowed + origin, and an Origin than '*' is returned) informs CDNs and other + caches that the CORS headers are dynamic, and cannot be cached. + + If False, the Vary header will never be injected or altered. + + Default : True + :type vary_header: bool + + :param automatic_options: + Only applies to the `cross_origin` decorator. If True, Flask-CORS will + override Flask's default OPTIONS handling to return CORS headers for + OPTIONS requests. + + Default : True + :type automatic_options: bool + + """ + _options = kwargs + + def decorator(f): + LOG.debug("Enabling %s for cross_origin using options:%s", f, _options) + + # If True, intercept OPTIONS requests by modifying the view function, + # replicating Flask's default behavior, and wrapping the response with + # CORS headers. + # + # If f.provide_automatic_options is unset or True, Flask's route + # decorator (which is actually wraps the function object we return) + # intercepts OPTIONS handling, and requests will not have CORS headers + if _options.get('automatic_options', True): + f.required_methods = getattr(f, 'required_methods', set()) + f.required_methods.add('OPTIONS') + f.provide_automatic_options = False + + def wrapped_function(*args, **kwargs): + # Handle setting of Flask-Cors parameters + options = get_cors_options(current_app, _options) + + if options.get('automatic_options') and request.method == 'OPTIONS': + resp = current_app.make_default_options_response() + else: + resp = make_response(f(*args, **kwargs)) + + set_cors_headers(resp, options) + setattr(resp, FLASK_CORS_EVALUATED, True) + return resp + + return update_wrapper(wrapped_function, f) + return decorator diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/extension.py b/myflask_app/flaskenv/Lib/site-packages/flask_cors/extension.py new file mode 100644 index 0000000..c00cbff --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/flask_cors/extension.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +""" + extension + ~~~~ + Flask-CORS is a simple extension to Flask allowing you to support cross + origin resource sharing (CORS) using a simple decorator. + + :copyright: (c) 2016 by Cory Dolphin. + :license: MIT, see LICENSE for more details. +""" +import logging +from urllib.parse import unquote_plus +from flask import request + +from .core import ( + parse_resources, + get_cors_options, + get_regexp_pattern, + ACL_ORIGIN, + try_match, + set_cors_headers +) + + +LOG = logging.getLogger(__name__) + +class CORS(object): + """ + Initializes Cross Origin Resource sharing for the application. The + arguments are identical to :py:func:`cross_origin`, with the addition of a + `resources` parameter. The resources parameter defines a series of regular + expressions for resource paths to match and optionally, the associated + options to be applied to the particular resource. These options are + identical to the arguments to :py:func:`cross_origin`. + + The settings for CORS are determined in the following order + + 1. Resource level settings (e.g when passed as a dictionary) + 2. Keyword argument settings + 3. App level configuration settings (e.g. CORS_*) + 4. Default settings + + Note: as it is possible for multiple regular expressions to match a + resource path, the regular expressions are first sorted by length, + from longest to shortest, in order to attempt to match the most + specific regular expression. This allows the definition of a + number of specific resource options, with a wildcard fallback + for all other resources. + + :param resources: + The series of regular expression and (optionally) associated CORS + options to be applied to the given resource path. + + If the argument is a dictionary, it's keys must be regular expressions, + and the values must be a dictionary of kwargs, identical to the kwargs + of this function. + + If the argument is a list, it is expected to be a list of regular + expressions, for which the app-wide configured options are applied. + + If the argument is a string, it is expected to be a regular expression + for which the app-wide configured options are applied. + + Default : Match all and apply app-level configuration + + :type resources: dict, iterable or string + + :param origins: + The origin, or list of origins to allow requests from. + The origin(s) may be regular expressions, case-sensitive strings, + or else an asterisk. + + :note: origins must include the schema and the port (if not port 80), + e.g., + `CORS(app, origins=["http://localhost:8000", "https://example.com"])`. + + Default : '*' + :type origins: list, string or regex + + :param methods: + The method or list of methods which the allowed origins are allowed to + access for non-simple requests. + + Default : [GET, HEAD, POST, OPTIONS, PUT, PATCH, DELETE] + :type methods: list or string + + :param expose_headers: + The header or list which are safe to expose to the API of a CORS API + specification. + + Default : None + :type expose_headers: list or string + + :param allow_headers: + The header or list of header field names which can be used when this + resource is accessed by allowed origins. The header(s) may be regular + expressions, case-sensitive strings, or else an asterisk. + + Default : '*', allow all headers + :type allow_headers: list, string or regex + + :param supports_credentials: + Allows users to make authenticated requests. If true, injects the + `Access-Control-Allow-Credentials` header in responses. This allows + cookies and credentials to be submitted across domains. + + :note: This option cannot be used in conjunction with a '*' origin + + Default : False + :type supports_credentials: bool + + :param max_age: + The maximum time for which this CORS request maybe cached. This value + is set as the `Access-Control-Max-Age` header. + + Default : None + :type max_age: timedelta, integer, string or None + + :param send_wildcard: If True, and the origins parameter is `*`, a wildcard + `Access-Control-Allow-Origin` header is sent, rather than the + request's `Origin` header. + + Default : False + :type send_wildcard: bool + + :param vary_header: + If True, the header Vary: Origin will be returned as per the W3 + implementation guidelines. + + Setting this header when the `Access-Control-Allow-Origin` is + dynamically generated (e.g. when there is more than one allowed + origin, and an Origin than '*' is returned) informs CDNs and other + caches that the CORS headers are dynamic, and cannot be cached. + + If False, the Vary header will never be injected or altered. + + Default : True + :type vary_header: bool + """ + + def __init__(self, app=None, **kwargs): + self._options = kwargs + if app is not None: + self.init_app(app, **kwargs) + + def init_app(self, app, **kwargs): + # The resources and options may be specified in the App Config, the CORS constructor + # or the kwargs to the call to init_app. + options = get_cors_options(app, self._options, kwargs) + + # Flatten our resources into a list of the form + # (pattern_or_regexp, dictionary_of_options) + resources = parse_resources(options.get('resources')) + + # Compute the options for each resource by combining the options from + # the app's configuration, the constructor, the kwargs to init_app, and + # finally the options specified in the resources dictionary. + resources = [ + (pattern, get_cors_options(app, options, opts)) + for (pattern, opts) in resources + ] + + # Create a human-readable form of these resources by converting the compiled + # regular expressions into strings. + resources_human = {get_regexp_pattern(pattern): opts for (pattern,opts) in resources} + LOG.debug("Configuring CORS with resources: %s", resources_human) + + cors_after_request = make_after_request_function(resources) + app.after_request(cors_after_request) + + # Wrap exception handlers with cross_origin + # These error handlers will still respect the behavior of the route + if options.get('intercept_exceptions', True): + def _after_request_decorator(f): + def wrapped_function(*args, **kwargs): + return cors_after_request(app.make_response(f(*args, **kwargs))) + return wrapped_function + + if hasattr(app, 'handle_exception'): + app.handle_exception = _after_request_decorator( + app.handle_exception) + app.handle_user_exception = _after_request_decorator( + app.handle_user_exception) + +def make_after_request_function(resources): + def cors_after_request(resp): + # If CORS headers are set in a view decorator, pass + if resp.headers is not None and resp.headers.get(ACL_ORIGIN): + LOG.debug('CORS have been already evaluated, skipping') + return resp + normalized_path = unquote_plus(request.path) + for res_regex, res_options in resources: + if try_match(normalized_path, res_regex): + LOG.debug("Request to '%s' matches CORS resource '%s'. Using options: %s", + request.path, get_regexp_pattern(res_regex), res_options) + set_cors_headers(resp, res_options) + break + else: + LOG.debug('No CORS rule matches') + return resp + return cors_after_request diff --git a/myflask_app/flaskenv/Lib/site-packages/flask_cors/version.py b/myflask_app/flaskenv/Lib/site-packages/flask_cors/version.py new file mode 100644 index 0000000..d6497a8 --- /dev/null +++ b/myflask_app/flaskenv/Lib/site-packages/flask_cors/version.py @@ -0,0 +1 @@ +__version__ = '4.0.0' diff --git a/myflask_app/flaskenv/Scripts/activate b/myflask_app/flaskenv/Scripts/activate index ded2cd1..1c6fb1f 100644 --- a/myflask_app/flaskenv/Scripts/activate +++ b/myflask_app/flaskenv/Scripts/activate @@ -38,7 +38,7 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV="D:\Documents\GitHub\HelpHive_Backend\myflask_app\flaskenv" +VIRTUAL_ENV="D:\Documents\GitHub\HelpHive_Backend\myflask_App\flaskenv" export VIRTUAL_ENV _OLD_VIRTUAL_PATH="$PATH" diff --git a/myflask_app/flaskenv/Scripts/activate.bat b/myflask_app/flaskenv/Scripts/activate.bat index 493e623..05d94d4 100644 --- a/myflask_app/flaskenv/Scripts/activate.bat +++ b/myflask_app/flaskenv/Scripts/activate.bat @@ -8,7 +8,7 @@ if defined _OLD_CODEPAGE ( "%SystemRoot%\System32\chcp.com" 65001 > nul ) -set VIRTUAL_ENV=D:\Documents\GitHub\HelpHive_Backend\myflask_app\flaskenv +set VIRTUAL_ENV=D:\Documents\GitHub\HelpHive_Backend\myflask_App\flaskenv if not defined PROMPT set PROMPT=$P$G diff --git a/myflask_app/flaskenv/pyvenv.cfg b/myflask_app/flaskenv/pyvenv.cfg index 2c92234..b2e69c8 100644 --- a/myflask_app/flaskenv/pyvenv.cfg +++ b/myflask_app/flaskenv/pyvenv.cfg @@ -2,4 +2,4 @@ home = C:\Python311 include-system-site-packages = false version = 3.11.4 executable = C:\Python311\python.exe -command = C:\Python311\python.exe -m venv D:\Documents\GitHub\HelpHive_Backend\myflask_app\flaskenv +command = C:\Python311\python.exe -m venv D:\Documents\GitHub\HelpHive_Backend\myflask_App\flaskenv From 897a14780a60eb0bd405543fbe9cc3e8da1977c9 Mon Sep 17 00:00:00 2001 From: aarohisp <112809842+aarohisp@users.noreply.github.com> Date: Sat, 28 Oct 2023 23:37:55 +0530 Subject: [PATCH 2/2] integrated add_product api with images relation --- .../apis/__pycache__/routes.cpython-311.pyc | Bin 14686 -> 16258 bytes myflask_app/apis/routes.py | 63 ++++++++++++++---- .../__pycache__/models.cpython-311.pyc | Bin 4136 -> 5176 bytes myflask_app/database/models.py | 23 ++++--- 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/myflask_app/apis/__pycache__/routes.cpython-311.pyc b/myflask_app/apis/__pycache__/routes.cpython-311.pyc index 1da51e2bf82b902e8803bd580d57e79fe08a2f19..be495654756c8c3f0c2f4bc33934f3b5f471463c 100644 GIT binary patch delta 3992 zcmZ`+eN0=|6@T|Ve;Z>PV~qK-T@1$Hga8T9l%@&fi>!qtfSS+`>hKIT0YmS5q!F`c zl2t2zOjFt$bz7QsY|7G9t*T6@+B8jD3RM;DpW2bNB1=rwr2J7;UEQ^ns%V;a&NVg( z$}aEyIQQQ3&b{}1-Q$1Ii^ERj&xwLBzW#hqr`T7KVgiHTy)`BmSGP z3xS$4nYatnLPCfO^a}gXQps+1l(JFHzie@7s-!S4Yp+V|Nv)67ne6@{p_p%no4><41r2&J>sJ3Br;PiaJcN6JrE7I=bImed^)sf(@Y{!}LtL0A-W z8mlo(Hr(E;waYJO+^tK;)~)WGU}kUX!*zFEb*Yx4sp02RXVuKvM9T9cc+#$9#+6Lj zlC0b?=iAXI3ah*9fNP?uuTxqp@$|JxYb^xnHf>+$%I^$^L>p@E^UJUzMMcnRcF*J^ zb*#qhu|0wV^#DOFMV+wYW~Z$Y2t^Cv#YO{c-n^4|R<4=9)Ohc?o{B0;G&bp_k(cJ9 za8mC?G%_tKl%Leies8-?cCiI}HECsU*n7+#kVCx)KDJ?3NPwLv3z0o5KPvlPs(l>B z7t8~*-gzZLW8s+y-H)8OVY-j83ctCiV|t9ORs?q(z^PpbMub*`K7@k^hXAtr@fRcG zXXjp~M_8rH)6kC-T?pMctHGt{0FVzH@mW_R8D9CZt3o3C*p;fLB<^9MbOe~av02qS zF*_fV^Jmho_wu|XS^aP(oj!#&Z%2uBc(BH&J_9)YXJhm;1PXpgR-KC8#A zg1=FIgi|;_gzzK+o`7;op&V{0ZmaXvd&$hoO7$=?n_7q)`@X%YDIut6)y*c8 zxNu#BxPv#}2*j0AuIgE?!)ubY6XFmIENj>S(aGF(HZ6Rx*}Lns>JnnHI|GwavG?;j z8@pxE5dNXlbRG2bF1-1c&=&aY=4~@N=5xEG{1O#xQB$kc7kHDFZM+86T97CRaS|8f znz%Nui|gZtN&SPoc%m&{xm1>9%~kP1p8R1|`xf66x)*Plo7haL^$@z^X5%YLTWh{& zy>5V0!kcdiql$T9vu&lOWec-6JK6izGS|cBOF`M?kk#xSn{1C8r;4Wp+E$P!mtEB` zt8K8?F|bf`GBO^Co`W!y!)n+&L1$+WVrnEN?_IF>$IgYPqq6td(BJ^)*bGw;_4y?* z3j4wn*3%y71`X^5Z@ow(Y|-1AEQVdyG)HIU`EeEeFk4cfF;s(g?(wA?7cOasvdwR?HJ5B22&@7Q;y+O$uL{-O(Zv* z?#rXgnzs$VHQcC4dpk4U&a|^D`7O)Wh&d2EZ^w_o8wadFXA^& z-8_G*=JrDBnHN)zXxciJu}V?8eH{uLXc_5tfdASHajL@0ESj zcA)Waz4URt=5Rp&aWgp#$+v!|8FkO|!a2NK+u5J%o#Y4XPW`k&CRdFKQFXJE{(88b z&-sJC2k*{MLQ=ObVnH^jwd|Jvq-3PiXr`ypOtc&zC}uU>Qt0OkrTt*E?Rk`E`3I9J zJ&m7Q^WMR8JNF|ldoP#$V3rJO=rpeQ5y2R;FyU&tmQ7*US86M2K@Z20EscrWj)FJc0xRq+A zql(JyODPKAHy&yXEej!!yteK3S!iGve9q+d;ZJ~Bsf4VDl~<*4f^4|Fmy@5mn(w%p z)2>j)6-kvFMPw@u|y&F&7 z>Q8wF;7Pj%Gp@muZIG9L`)&tPo|EvTT|*hyP-^5<%5^GbJH=*dP6zyOoQu7>-dbVR z=s>JB^*N-~fUmDqS~C!!*Gjd04mJ|-nTk%jZ)Gu{Bjh-HwJBzjCGZnnT(exp{lptA zvz&-)WDQi%VnVM5*b_mIuL+jfY*0Lh5(X8OzS(4*+QO2-lThs434Y_ml$|wHPUAynjV8cmo^ zD!lm1YL&U^sJi7{S=~f*T7|+61BGt6nv*Aub2x}0w^?7Yu~1z%PcIi>a5HgibF{7c z3geA?Ti)Z?2cg}%FJMfGvadoJOeTNZ@vG|kzD8lK(R8pzTHED2=#oCN6QDnGX%E({ zT-*u2ea^6NTKmiP!-x6$_Bo(}gq~poyUz7+#hK-ZGESp&YIHUh6#4zfRS0wfKf^4i zV70dC_%sRh!ei*`Y$K#+HEkXeVm)oGLtMj{hUp?e(2%cAFX8}Cs9YEP3g%ki1vDxx zDA6;>gleI$0w|cY;M{Px{-tfd=q0bW|ACCG{IPwJ^kdY6Xbi^uosNon*qzQ*52A}j zI4@)G6MbQK2!1oXzx&JS5;}-N(C6rGgyRUq2+ttI5EO*-2ulc;5MBpR@F(C4u-ih* zrw4O17FEaS?7SLL=w)ERgDY(!Bb|FlBkSt?yZ`Ww?#0t-?e2_rcTQ~4`f>um*OH*y zQyh7gwRJrnY`p2bsYllCjJ7)`y0sG|Cm_ z-0jN$hQW={A0lvLVNBgK^vpo5H67VUuRs?Pm7x5UEqA{eS{KZV{4b}O)sXs}@Nnd! F{s*eApt=A6 delta 2916 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", methods=["GET"]) def get_image(image_id): try: @@ -130,9 +131,13 @@ def update_password(user_id): except Exception as e: return jsonify({"message": "An error occurred", "error": str(e), "status": "error"}), 500 - @app.route('/api/add_product', methods=['GET']) + @app.route('/api/add_product', methods=['POST']) def add_product(): - data = request.json + data = request.get_json() + print("Received data from frontend:", data) + + if not data: + return jsonify({"message": "Invalid JSON data", "status": "error"}), 400 item_name = data.get("item_name") descriptions = data.get("descriptions") @@ -140,11 +145,15 @@ def add_product(): donor_id = data.get("donor_id") category = data.get("category") item_address = data.get("item_address") - image_info = data.get("image_info") + image_info = json.dumps(data.get("image_info")) # Convert to JSON string specification = data.get("specification") - org_id = data.get("org_id") + + + if not all([item_name, descriptions, donor_id, category, item_address, image_info, specification]): + return jsonify({"message": "Missing required fields", "status": "error"}), 400 with current_app.app_context(): + # Create an item and associate it with the provided image_id new_item = ItemModel( item_name=item_name, descriptions=descriptions, @@ -152,9 +161,8 @@ def add_product(): donor_id=donor_id, category=category, item_address=item_address, - image_info=image_info, + image_info=image_info, # Store image_info as a JSON string specification=specification, - org_id=org_id ) db.session.add(new_item) @@ -163,12 +171,13 @@ def add_product(): response = { "message": "Item is registered in the database", "status": "success", - "product id": new_item.item_id, - "product name": new_item.item_name + "product_id": new_item.item_id, + "product_name": new_item.item_name } return jsonify(response) + @app.route('/api/get_product/', methods=['GET']) def get_product(item_id): try: @@ -185,7 +194,7 @@ def get_product(item_id): "item_address": item.item_address, "image_info": item.image_info, "specification": item.specification, - "org_id": item.org_id + # "org_id": item.org_id } return jsonify({"item": item_data, "status": "success"}) @@ -194,6 +203,34 @@ def get_product(item_id): except Exception as e: return jsonify({"message": "An error occurred", "error": str(e), "status": "error"}), 500 + + @app.route('/api/get_all_products', methods=['GET']) + def get_all_products(): + try: + products = ItemModel.query.all() + + if products: + product_list = [] + for item in products: + item_data = { + "item_id": item.item_id, + "item_name": item.item_name, + "descriptions": item.descriptions, + "time_used": item.time_used, + "donor_id": item.donor_id, + "category": item.category, + "item_address": item.item_address, + "image_info": item.image_info, + "specification": item.specification, + } + product_list.append(item_data) + + return jsonify({"products": product_list, "status": "success"}) + else: + return jsonify({"message": "No products found", "status": "error"}), 404 + + except Exception as e: + return jsonify({"message": "An error occurred", "error": str(e), "status": "error"}), 500 @app.route('/api/search_items', methods=['GET']) def search_items(): @@ -237,7 +274,7 @@ def search_items(): "item_address": item.item_address, "image_info": item.image_info, "specification": item.specification, - "org_id": item.org_id, + # "org_id": item.org_id, } item_list.append(item_data) diff --git a/myflask_app/database/__pycache__/models.cpython-311.pyc b/myflask_app/database/__pycache__/models.cpython-311.pyc index 456e05f6ffda5346f1d6c158a2d71f3dce69ad4f..c05b9d704fd752e1844b496c53156ab5e0b294c4 100644 GIT binary patch delta 1321 zcmah}%}*0S6yIIgcDvo#6~zE8#iAG~3J63)h*)amv$Ptlfi@UYI*ln*Yr1F@P3XY` zCK$o-(1S4^6fyQt15r$jClBgrH`xQ}i9bOiR}*Ju`OpT#Ox~|=K7Oz7?fdO6xmWAK z8vsNGkJBBU@sA6jiv6%~;)%#Hy$rNHWT3bZbXo;yzruK=_n)VD_ReyPrJZ9BqjgYz zV3B2*ci7AUIrLRUo#3}mv0u6ELq2zCk;7bU=7?0Gq}7FLZKtdb z%5$QSt+uh+^tW%pYUqMBxg(1un2T+T>w<2aU+wY(TNUdqi2XOB*W-Z{j3*0XVk&-P zEI~F3Jn_}HT*0QsW2u`kn!Z<%$D^^yv0JHIx0BJSxEl1-pse`G!uy7Xd|`Ci9ux`| z%2v?}dkx2P%U|sMtfM{K`n>(+g;xW*v)OPquhwa0UcJm~lzEX0OtKdA2smA9pn7&_ zZY(>RAJvA!8i?p1Vt`1dhfK5t-0V~I9ZUvkiL?i#99Rl@$mT3XCEB4Cmnfvq<16W5 z4574@xQzt71bi5R9tr1PhwjVA>aUW`E&?YBI0%pim?21ymT!!rY~- zKYvcUJfcZqT?!jgIMYq0$t8>!ww+`=zv_2I7)J*MKuY?Z9Oux z%i#BA*ovN&g|6*8|7ra`Wi7fYAd>Ozh4&yqD){F&}u{deSBS2|XcdYj*9^J`#G2ZII}G+zW$TqNC~$A%=O(LyDD4Rt6kk?4(l wUewVWN6JTMB0|gC^I;Ml)!@ObiUGffxd!Bqp11da_G0 zF#y#`O>W^-WS35n0U9s6`4XojBeS2T%wz|CmC1hGQzyUT_ML3cBggcDadSM6C!?6< z45K-g3xa3b&9U3ydO^_YqM+3kL95A!c(WNfChPG@^EbFQxE4tPEh^Fl63G(n$$N+{E-$-~5!+oLg*}Aa-#`5j#-5pC%X3YIiwpkO5#*BtWb{ z7-0)!6gx~_&u=f-;ML#-Q38_n)8v?ZQ%ILFa59guELS8@gb}24|72s~UMn+ZM(qy_ Tn8XC3DH0z+;$N^xg3Sg1*t}jp diff --git a/myflask_app/database/models.py b/myflask_app/database/models.py index 1b8ee5b..e6a0e1b 100644 --- a/myflask_app/database/models.py +++ b/myflask_app/database/models.py @@ -42,26 +42,27 @@ class ItemModel(db.Model): category = db.Column(db.Enum('clothes', 'medicine', 'furniture', 'medical supplies', 'school essentials', 'stationery', name='category_enum'), nullable=False) created_at = db.Column(db.TIMESTAMP, server_default=db.func.current_timestamp()) item_address = db.Column(db.String(100), nullable=False) - image_info = db.Column(db.String(100), nullable=False) + image_info = db.Column(db.ARRAY(db.Integer), nullable=True) specification = db.Column(db.String(50), nullable=False) item_check = db.Column(db.Boolean, default=False) status_item = db.Column(db.Enum('open', 'closed', 'expired', name='status_item_enum'), nullable=False, default='open') - # org_id = db.Column(db.Integer, nullable=False) # Define the relationship with UserModel donor = db.relationship('UserModel', backref='donated_items', foreign_keys=[donor_id]) - -# class OrgModel(db.Model): -# __tablename__ = 'org' -# org_id = db.Column(db.Integer, primary_key=True, autoincrement=True) -# org_name = db.Column(db.String(100), nullable=False) -# org_address = db.Column(db.String(255)) -# org_contactno = db.Column(db.String(15)) + images = db.relationship("ImageModel", secondary="item_image", back_populates="items") class ImageModel(db.Model): __tablename__ = 'images' image_id = db.Column(db.Integer, primary_key=True, autoincrement=True) image_data = db.Column(db.LargeBinary) - # org_id = db.Column(db.Integer, db.ForeignKey('org.org_id'), nullable=False) - # org = db.relationship('OrgModel', backref='images') + items = db.relationship("ItemModel", secondary="item_image", back_populates="images") + +class ItemImage(db.Model): + __tablename__ = 'item_image' + + item_id = db.Column(db.Integer, db.ForeignKey('Item.item_id'), primary_key=True) + image_id = db.Column(db.Integer, db.ForeignKey('images.image_id'), primary_key=True) + + items = db.relationship("ItemModel", backref=db.backref("image_assoc")) + images = db.relationship("ImageModel", backref=db.backref("item_assoc"))