From a608576bc566a4d5bef3fba02f11a14c814492f6 Mon Sep 17 00:00:00 2001 From: yisroelBaum Date: Thu, 5 Sep 2024 11:11:23 +0300 Subject: [PATCH 01/54] test commit --- newfile.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 newfile.txt diff --git a/newfile.txt b/newfile.txt new file mode 100644 index 0000000..aa39060 --- /dev/null +++ b/newfile.txt @@ -0,0 +1 @@ +newfile From 359d7e8c815409a7ca7d5f95337937f2d7b3016f Mon Sep 17 00:00:00 2001 From: yisroelBaum Date: Thu, 5 Sep 2024 11:15:09 +0300 Subject: [PATCH 02/54] delete --- newfile.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 newfile.txt diff --git a/newfile.txt b/newfile.txt deleted file mode 100644 index aa39060..0000000 --- a/newfile.txt +++ /dev/null @@ -1 +0,0 @@ -newfile From b186239f046d8ab40aff6bf5c4f2119a0458efa5 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 13 Sep 2024 12:00:06 +0300 Subject: [PATCH 03/54] donation model --- app/campaigns/models.py | 1 + app/main/models.py | 15 +++++++++++++++ app/users/models.py | 1 + python_files/db_population.py | 0 4 files changed, 17 insertions(+) create mode 100644 app/main/models.py create mode 100644 python_files/db_population.py diff --git a/app/campaigns/models.py b/app/campaigns/models.py index 228bd1f..692b2b2 100644 --- a/app/campaigns/models.py +++ b/app/campaigns/models.py @@ -11,4 +11,5 @@ class Campaign(db.Model): __tablename__ = 'campaign' id = Column('id', INTEGER(), primary_key=True) title = Column('title', TEXT(), nullable=False) + donation_id = Column(INTEGER, ForeignKey('donation.id')) #ambassadors \ No newline at end of file diff --git a/app/main/models.py b/app/main/models.py new file mode 100644 index 0000000..479cfba --- /dev/null +++ b/app/main/models.py @@ -0,0 +1,15 @@ +from app import db +from flask import current_app +from flask_login import UserMixin, current_user +from sqlalchemy import TEXT, Column, Boolean, ForeignKey, TEXT, INTEGER, VARCHAR +import jwt +from datetime import datetime, timezone, timedelta + + +class Donation(db.Model): + __tablename__ = 'donation' + id = Column('id', INTEGER(), primary_key=True, autoincrement=True) + currency_type = Column('currency_type', TEXT(), nullable=False) + amount = Column('amount', INTEGER(), nullable=False) + campaign = db.relationship('Campaign', backref='Donation', lazy='dynamic') + user = db.relationship('User', backref='Donation', lazy='dynamic') \ No newline at end of file diff --git a/app/users/models.py b/app/users/models.py index d412b08..c6cb877 100644 --- a/app/users/models.py +++ b/app/users/models.py @@ -14,6 +14,7 @@ class User(db.Model, UserMixin): email = Column('email', TEXT(), nullable=False, unique=True) password = Column('password', TEXT(), nullable=False) user_type = Column('user_type', TEXT(), nullable=False) + donation_id = Column(INTEGER, ForeignKey('donation.id')) def get_reset_token(self, expiration=600): reset_token = jwt.encode( diff --git a/python_files/db_population.py b/python_files/db_population.py new file mode 100644 index 0000000..e69de29 From 300331b2f242117cb847da816303b0f0899556bb Mon Sep 17 00:00:00 2001 From: yisroelBaum Date: Sun, 15 Sep 2024 11:14:52 +0300 Subject: [PATCH 04/54] pycache --- app/__pycache__/__init__.cpython-311.pyc | Bin 3296 -> 3552 bytes app/__pycache__/config.cpython-311.pyc | Bin 1047 -> 1075 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 437 bytes app/admin/__pycache__/routes.cpython-311.pyc | Bin 0 -> 1175 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 453 bytes .../__pycache__/routes.cpython-311.pyc | Bin 0 -> 1084 bytes app/main/__pycache__/__init__.cpython-311.pyc | Bin 431 -> 433 bytes app/main/__pycache__/routes.cpython-311.pyc | Bin 1068 -> 1070 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 435 -> 437 bytes app/users/__pycache__/forms.cpython-311.pyc | Bin 0 -> 2364 bytes app/users/__pycache__/models.cpython-311.pyc | Bin 2885 -> 2887 bytes app/users/__pycache__/routes.cpython-311.pyc | Bin 1119 -> 5148 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/admin/__pycache__/__init__.cpython-311.pyc create mode 100644 app/admin/__pycache__/routes.cpython-311.pyc create mode 100644 app/campaigns/__pycache__/__init__.cpython-311.pyc create mode 100644 app/campaigns/__pycache__/routes.cpython-311.pyc create mode 100644 app/users/__pycache__/forms.cpython-311.pyc diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc index ad90979c2ab86b8057bb519078986072d690b4c4..7eb143d51adede5f1805041d2708f67784b9ff2c 100644 GIT binary patch delta 505 zcmaDL`9PX?IWI340|Ns?QO3sLRgPrEK$~Fj0_B`89_FH zFhaE`8x|SG$$`uw7AZWaQYpMG49gf87*>N!0OMNr8io?Ev%y@3G^St%O}@#_tOpeg zoULL)i&Kk=V|-Hc^2_pLTvCg(OY#e1LQ;!Mf>H}6E3x&9Xfod7Ois)#NX$&nE7oMZ z#hRFsJ9$0ZBSxjklh{8g@Fo@%=)vWS6d4#8ZgGOd5>s+B^NN%vH*m-^a!y{rp)3WG zD^dc5pBjh|V_;w?=44=CP*9kBkwcQpfq{WR2qgAy^A`>uMztF(>K9Pa4Ho$esOSUR zWG5~Sts5-t*IA@4u}ICZyvU+@g+=uOiz-6Q^dgJm6&A${EQ%jECg*VZFltTS$u(a< i7vu#>0xQKUL~4z~oO_vWqK+Kd24;eC1l delta 286 zcmaDL{Xmj;IWI340|Ns?P2G(&zm2>%7}+A285r8xHos;JW@2QUY|kRe$Tm5W#f_zg zVS&u#KxWa&7g$6XA*^34B8;+=1DQoEQn;2eGBB)W1Q`XwDcmg#%NQ6KR)aWTT+3R+ zPy)6J%wK$K{$#zg)x{xll>)#<5wkET$qztl4_-|uV0*5lB$=I zbc@T-$k@cx%-q7#K$B@=mIBW$u3%T^AlHz1Z`a6)b3b#kfE>cgz`!th0pmhO*2zvx z*+Lv3F-`^shLsGTK_>swo4lV%LNO$@xFjgGAU`ItpdcnWKQApaU9X_Bh#jOFL~u|3 z##HAl4&!RF++xZvzQvMNoS#?33ll981F^u0Bp4VNesS33=BJeAq}mlpGcYhPGB7X{ m$4=hPEGw*Tbwfz*11mEZ(+37-E~W;y4_uQUF&nagv;qL6n@gks delta 301 zcmdnYF`a{NIWI340|NuYmW&%|kC-O%NoZIwFfdGKNMT4}%wdRv(2P-xDNHHMnT%0P zObqS}DJ(4vDXbF%MA_M1g7o@L>{Sr15-cvv$t+2=(%087&MZmQOG%oz^Roam0|Ub? zu3%T^AlHz1Z`a7lTNxKJvP}+W%JyVuU|=ZXU|?Wa$?zFu%r6~htC-N@)S}`TpVYkk zviumA)Z*-t{DPQ(%$%yc{Fuaof|%s|ytK@8y@JXjR*-fO!8Mtexz1S(#?@rG#gt!s zizTZ#Kd*=fCR!v4Vu2NjGcYjx;;_lhPbtkwwJVZhU|?WmU|=YYn0$^|mXB5Sf|}(A UW+pDC2DT3zlm9UrvVe2}0OUkWh5!Hn diff --git a/app/admin/__pycache__/__init__.cpython-311.pyc b/app/admin/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee615faf479fc143a172f246fca915ab35f4b270 GIT binary patch literal 437 zcmZ3^%ge>Uz`#(HaWjpBk%8echy%myP{wCF1_p-d3@HpLj5!Rsj8Tk?3``8Ej44d1 zOexGMEGevO*p{&}Fsx>Us%MB|PGLx4&tb`BjbdeFNZ|-((BymxlGJ3p#p#q&np#kl znOAa)H8CYOGw&8>NosCEPGU)F@h!IElEjkC&ryk0@&FAkgB{FKt1RJ$TU1_lO31_p-WPzDBu56p~=j5iphFQB3a z9D*I36Vz{r%HB{lxS_0lLqX#MCkv<6M+O#7tuG*=f%O9q1EcH(1{q9L#LvLM001aI BeFp#l literal 0 HcmV?d00001 diff --git a/app/admin/__pycache__/routes.cpython-311.pyc b/app/admin/__pycache__/routes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37ca68962124cb4418706431ffd2e9e3d3eb3ab0 GIT binary patch literal 1175 zcmZ3^%ge>Uz`#(HaWl<@iGkrUhy%mSP{!vY3=9m@8B!Qh7;_kM8KW2(L2RZRrd;MI zW-yyMhb5OaiWSUe$zjW7k7Cc|h~fbAS#vmZxuUpoxudvqd7^l7d82r9`J(v1a%?&L zxdKrFxq?xGxk6Dwxx!JxU~%>wkzCOz(Oj`8F)*JaM?6 zk0FI?86yM3YDPGpyMgC@^QkccMZEvA$tO~zZSi7C06d76y3 zSVD_ai!_;Tar)$^XXd%(7vH7zHxIO7(3QEFjnYH^7s%PqbfkfHG)fy|=Rlv`X7 zera)P(Jh|j(xRf&ypnh@k2@znJ--yf(PX+MoSc!GoE=|~SX^A5Uz8G`0Ww%DJvA@2 zD6u3JRa}$t7Dq~ANoq-EZmQocKCs6!i%W_UOEUBGl0m+PVNk4s@Mi^Ztd_t-je#MB z5j7lx88n&vs)SJu)5|Ey&Cz5m;$UE4Sjq4iWb7{!XR8=cI2FhEq~_(9<;S?B7H5~_ z7sQ057MBF27Uahy78JyQ&50?>FD*$e)+?wi5&SdsqU@^F(saGz)a25l%#z9?kmHMlKq`bmDwy(%Z?S?s3h|^ENCxDUA_)ct zhF=^ux%nxjIjMFAPpa>{tWn^IZz|6?Vc!NRc0xG(}AbkN9-C$6>fQoJ~m|wt# zZZNo9AP(JN@V!6?-C*#%fDPSXkiCG4ZZL2*fZ+p1o(9nt=?lEF7a8TQFv@*kVq`S> Uz`)38^pTl?NghQ6EDVlu0H(4-q5uE@ literal 0 HcmV?d00001 diff --git a/app/campaigns/__pycache__/__init__.cpython-311.pyc b/app/campaigns/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41e12a7a1df0217d5235b00487654e1ccc806749 GIT binary patch literal 453 zcmZ3^%ge>Uz`#(HaWhSVk%8echy%myP{wCF1_p-d3@HpLj5!Rsj8Tk?3``8Ej44d1 zOexGMEGevO*p{&}Fsx>Us%MB|PGLx4&tb`BjbdeFNZ|-((BymxlGJ3p#p#q&np#kl znOAa)GdVH0ATcvNulN>cNosCEPGU)F@h!IElEjkCbI zybxtDE>~$$PJBU8YFcK6CgUx(qWsd5)M7tPwp*-eIf=#DMa&Eg47WJqUz`#(HaWhSqiGkrUhy%mSP{!vi3=9m@8B!Qh7;_kM8KW2(L2RZRrd;MI zW-yyMhb5OaiWSUe$zjW7k7Cc|h~miQjN;7YisH)Uj^YN(vF7mP@<#FI@I;5i6NCaOAP8Bh7`_aj0_B`8R2}c z7KUXE3=FGb0t`{&DICEJn%plzBASf1m{O878EN>~lAEK+Sj5J_z_60xGsw_i7S2{NpztY< z@k!0gFUyZ{NiEJU$uEcrNi8l3N-fBbNh~OcfjOo)rYOI(B(+$tpt48^l$t;UHvdKbC%uW;*MV9_rUWnf^?l(@y5SWr*|a`!FX#DW4nxM@W!3=9mn z1VCb-5G>Zq%}+_qDK26K34@~|8|>I3c92~hAc7M_fKu`;ZctQZ$AhDz2;_z$9*`U_ zh~NVmAXuJSlwFltnyy!znp|3xSyEZV50VrB5g_;8V#+VR#R~Qj#5W=!8IYTcKq>GS zhfQvNN@-52U6DKk0|O|mi{CIXFnnNUWMsU-Aans0-C$6@fQoJ~C|*EC4;Wl75QlCs z_+B7{ZZLRWz=m!x$X-B2HyAh@!0-X1K!aq9`~H}6t21^00Qct;H2?qr delta 54 zcmdnUyq=kRIWI340|NttOzDk@-2dc^ovmU*i&Kk=V|-Hc^2_pLTvCg(OY#e10y1-| K@+NCCb^rjyH4-lX diff --git a/app/main/__pycache__/routes.cpython-311.pyc b/app/main/__pycache__/routes.cpython-311.pyc index 167bfcf533032d871fde8ff5b11f4839220fce52..c8ef39f7e5f10b7c7037632d6f40f54f517cce52 100644 GIT binary patch delta 39 vcmZ3(v5td#IWI340|Ns?QO3=U+>A_&#*=xOB-lezi%Wu13pQ&pF);xEx-kh- delta 37 tcmZ3-v4(?tIWI340|NttaQ%&q+>A_&hLd@jBv=D7bE@(->o74f0RW#F2u%P0 diff --git a/app/users/__pycache__/__init__.cpython-311.pyc b/app/users/__pycache__/__init__.cpython-311.pyc index 829a5b541102f3c16fabcedc3ed1565f62b5dbb1..9da6545b7bacd8df687bd691ca3d795cc461181f 100644 GIT binary patch delta 38 ucmdnYyp@@IIWI340|Ns?QO3=U+>DHjW|MgtCD=n!i%Wu13nptZb^-vglnJ{4 delta 36 scmdnWyqTGMIWI340|Ns?a>DHjCX;y?C0GM8bE@(t>o9f#0G+i6`v3p{ diff --git a/app/users/__pycache__/forms.cpython-311.pyc b/app/users/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79d9e821a76fd43974d6061ece7cbb16e111bb82 GIT binary patch literal 2364 zcmZ3^%ge>Uz`#(HaWgHBm4V?ghy%l{P{!wN3=9m@8B!Qh7;_kM8KW2(L2RZRrd;MI z=3JI2mR!~-)?BtIwp{io_FRrAj$Fnx445#iZb)k-7-^i zQf_g%<|bz5K-jziiN(d``9&!ZE_ZNgQf_7mjFXy^nhfReIOXT(q$cJ;q&Qs?OH#p1 zP3BviZkag{&Mh7gGbpvNG_xo*&C9xzCF3BI3n3I{3Sdy8a z=UP;hUv!JxuQWF)wJ0btFFo}ZyK7--Vopf@Emp8&H5qTQgche3X)@m8NiHoaO3f>Y zFD*_jN(OlrhT+jS2^@W?3{i|J3{gx>45`d1j7$uvEXx=e7*@knGo&-FVOqw-z_6ML zCKScW#E{CC!c3G}b|!{Yjue(w^&m_(Okp^VsjKgqq&F^%q@bNU&IdLvK514 zeI>(ZkUxGIJ6pwo0=qcICp9m>EI-C2wK%&ZzaS;$VB=^Jb|*le`hVt2vF>4LEHMPcVF!p;q@ zH-r@?*e;OTA+tkfr`#U73l<(1ggq|`dtMRtZ1A`tEI+|!0q;d&y(_|cAglx)2 zh1IVJt2elTV39J+VwAMN0rCk01H)%6Mo?BJlops6Qd!Yb2NOo>U<0Ql;!_863JXyw zi34mdDD4qWp`i4|oC0zQnp$wWV^85&!-<-v(=q+Q&BTz(lfs3TMtLE{$1Q=N)bz~a zlGGwl5`ZVwB5?)=hAJ+%%%b8F1;51H)GAJ&L@2XJ5+oxHY)m5R{o9JtJmA&4!wd zbzAB#n7LgLbiXL*enrr|!Rv;A^aSo1-Wy^z#B7Y)5_iGG<${3gMFH0<0C`fc&MVC;NBz~!QV%M}5a29FyO$}_kxsF)q_IpA~9?}*=pkZ2H!N&CRSP{`=c z^nrmPl+lCfBZT?_p*}D$xG;Kx=Av?5S#bBn#a1e~>tz)=7$R6qp@xV$I=WiD_*QUt0? zZ}GwP>ZN7oq!w|5LX`(Z@Pgt)2x^obqNoEGP(}P8C7|L09B<$#z9o=YP@o4cTJ&=B zQ&Mw^i-bXDa6_!f0TrJ`A|QRB7%Kv~z6do=e{tAAN=CaPBL)TrP{~|u$H>6&ftit! z@dktZ1yuBbiH%Y20|PAxJ_bey#tRJgxX=xT$P2`w8w`pUP|*zrl?$lo0|yJE#s>yW lVglz!kmwf>0g>lnV^jrs8J(C=`H_K*QS}RmK$8b2767SzUOoT- literal 0 HcmV?d00001 diff --git a/app/users/__pycache__/models.cpython-311.pyc b/app/users/__pycache__/models.cpython-311.pyc index 218524903d4a5502deabf32b80300c9a2dd7692a..0eec00701df8c65bb15bb9fe16998cd60d81ebaf 100644 GIT binary patch delta 58 zcmX>qc3g~mIWI340|Ns?QO3=U+|yVTOq{J^LW@(2ier3I^YY8`V_Z^;vrF;|VnR}j OOM+4hHt%O?V*>yiQxpLJ delta 56 zcmX>uc2taeIWI340|NuYl9C%6xu>zn897_Ugche37039b=H-{=$GD^xXP4v`!~|sK MROM|x$kN6J0R7ezf&c&j diff --git a/app/users/__pycache__/routes.cpython-311.pyc b/app/users/__pycache__/routes.cpython-311.pyc index 945ef39e0be4b8f9f8b20298c441cf0fce13b741..416f3b3291b901d981d731126053cecfe0fc3022 100644 GIT binary patch literal 5148 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 delta 517 zcmbQEai2qDIWI340|NsCfBlWL6-*2ak3k$5W`;68A7PlNVV0B28O52)6~&dy9mUPa zkiw9{n!}UJ8^xQ;7sZ#$AH|<55G4Q>XUh@H6^atd6^;@H^VxGmaz&yn~`3k>` zCik#Num)u2ROL-x&7!C-%D}+D$H2f)EX=^b(7^DOgMml-g0%KUZk;RKIu}@UK7(AP zDKR-$(5Rj@Ehn)!8*Fe9I|Bnl5eJCi1QDP>yu}TckI%_Z&&(_01_|?k2wo5Yvg4Lu zd1_I1RcdLvUU6!2X;EfLWf4C}QUF8a@k6TB2X|Di7+rQ z{1WA`$<0qG%}KQ@0tEobKgB;8CMO8lGCr8RUr1r{1tHGK_l5GbnHY6HFfcLdeq?4~ V5@?YFQL0xMRX(u5B*3y@lL3LBa*6-| From f20458ae1cb388ff1d5a5f99bec93b4f598d1cb5 Mon Sep 17 00:00:00 2001 From: yisroelBaum Date: Sun, 15 Sep 2024 11:21:04 +0300 Subject: [PATCH 05/54] import models to init --- app/__init__.py | 9 +++++++-- app/__pycache__/__init__.cpython-311.pyc | Bin 3552 -> 3753 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 1230 bytes app/main/__pycache__/models.cpython-311.pyc | Bin 0 -> 1468 bytes app/main/models.py | 4 ++-- app/users/__pycache__/models.cpython-311.pyc | Bin 2887 -> 2985 bytes 6 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 app/campaigns/__pycache__/models.cpython-311.pyc create mode 100644 app/main/__pycache__/models.cpython-311.pyc diff --git a/app/__init__.py b/app/__init__.py index 07fb623..7855b0e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -32,10 +32,15 @@ def create_app(): app.wsgi_app, x_for=1, x_proto=1 ) - from app.users.models import User + import app.users.models as user_models + import app.campaigns.models as campaign_models + import app.main.models as main_models + + + @login_manager.user_loader def load_user(user_id): - user = User.query.get(user_id) + user = user_models.User.query.get(user_id) if user: return user else: diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc index 7eb143d51adede5f1805041d2708f67784b9ff2c..d2ecd53624f7f7cbc0460ccb29f48adeb124f385 100644 GIT binary patch delta 953 zcmaDLy;7EUIWI340|NuYiW$$+R&3uU5=wuaE5k?5h55{6-pL~%;7$VBZ0cI;t4rCUwNa0?_$iT3g5pF9_3j>-9Icpe7 zzySnNlg1RxpvgOVJ*&1^GF%%20|PSy1A{OF1H)%O1_p+yjMEu9nX(`{7#J9`;3^j| zO%7yMnQX)+WX*hwCA2uT=oV{XX=+jBE#~yp5>4h??4`x2Me&&_w^%@oTihTrJ~uxl zHK({3WQT%6!!Nzbg=`Y60hu{fd6OrwSu1NYFfbJBF)%RvXkd82FLi}q{tCb9b$-oD z{F*D&FY+5*;WwK6g6$}qJOcwmk?iEn?ADC-li#x|f(0~HCW~=wwNhYUV7SEwvFMga zVnKmka$;^lVrF_?u^vRUNC~8bA0(BVn3)F?Rh)c=LtX6_2Tc4HFNg)#e2WvrO-#wn z%qvo!tidT?&t1e1GKeQFGbc4ZBQY-}C$;DnKTHGEueZ2Cc0f5rav+C;Tv((CVu2h| zqzq!Ig9uQXDduKiU{HVqhay>!9bCypsfi`2@reZmMQ#iX3__rYD%NM3ypr=-i1q~* zEv)DUi_rxf=mv}C1sv!r2Lqe%A_h_f z!C7#22S*xX3R?@uG6n{Q)euPr28LRu6n13w@!~M46qXc@9En`XT4qLu6qXdu9I0IC zS{5*yD@P_*ww4vl=FXAJm9J%EWMHXbSfDUDkXclec^M-E!)ivDL5vJ=85UeJlYg;@ zFoJbYR$&!kRGb{hEMk$ugQ`4*w}k=C_3SkaCEy@|SeC{V%%I6P`6jEji6-MMmeAtV zqGY%`7#J9s85kIZ85kHoyD%^?Ol6$T(8-hq(aFHTuz+!LAhXKkI5r_hrpe`OvU)|J zuqy`XQBY|3W#DWT12V8U#wRr|zbrq-CAB!aB)=dgB(=CCD79en2{vn46$S=|Vhsic zh93Sm;0XFOwTJWQUr-{g2WP2ax?RalqOH$ zluzO;;s=TIq-Ex$#%CnvrR1a*70H4u1Q`i72&}V62_&WlBEVkcWME)WfC7gi8IT!V z$wjG&C8_a=1qDS83=9lHAdkIcoNUPTOjzv#iz+g@%PKTEoBM}6$ZLL@GPhXMauSQP zi$DQa!~(K}6+~!FZsM6QpbKK^g9rlfL6Itm4>AJmfL|Oox%nxjIjMF< V-ka-q`59%j8O1*^U=l?jEdcI~r^NsO diff --git a/app/campaigns/__pycache__/models.cpython-311.pyc b/app/campaigns/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a3c83462d6a2efe1d6bfb20b89d803275ae682f GIT binary patch literal 1230 zcmZ3^%ge>Uz`$TO{aM-@Mh1q*APx+(LK&YYFfcGoXGmd4Va#F3WsG8E1hJWNm~xq; zn89r39F| zc#A0|Nt5vwcXDY_QEFaEd}2X?CgUw07`L=IwMdiw7E6e0M93{R=lq<~+`L=tPWkyc zsfl^FxZLuKQZv)@yi+TS*cccXZn1m%g}A!A2Hj#0a}09!a18R(WWL3bl30>jl9`)& zivvVf<>#f|;smi$QgccYlR@r)VUQsp_U9?!FiT~KVoYI(VoG6*VrF7UWl3RTVn}6O z#=yX^8l(!0Q<&GVp!tvutd^CDA(b6XE!!G)G_@QcwW%ProGBd37#SE=GlGp}U|?9r z#K5qc3C4@!O5qG<(B!(s;hdOTkeHdCcZ(w##$w7$2?2#-K~ZLIVo_y$c53A<){@MU zoK!bW##Cewy63IO5~;5_41I<8N`r$LHp!l;(ig zJn`{`rHMIE8Q%E#5|CyHw}_pAfuRVL>WYLwEKrCQiGWy~pa_6l5TBW{lHoJR@xRQR ztztrpQ;UjYd{XoB%kpDfQj4=o@(W@DGIOf(@?#PU3SwYBDUQj_Pf5)w)+?wi5&)SB zB0#nkr!g=vG{E5v5xEB68-n5!#AdL}NS~2DGjmSnhL8(_Ru=`Wt_WH+INjh8>TsK2 zKEq{(%S^X9ZYx4B@EBj@F}}iM+~9gcNMeH84Dkh83$#|mUR1KaqGWwh$mWWWO@lWG z7RkUY))cJ z!ifW95-4CGA;t~T%bZnSQp5w2-~|zUATd^7kgp*=mIjG}ogmA=!0?O11`;oJMJfyo z44}kOe2#&E;R7=xBjXJQp$n+!27~McRCI$uUz`&p}<5}7!CI*JbAPx+(LK&Z@FfcGoXGmd4Va#F3WsG8E1hJWNm~xq; zn89r39F|=G|g<%FoY9P0YK+<(6NRnwg&GomyGM&cMKMi`~;N#MRw3=oWjJW013l zW00RF^DT~)#FEsK%-qyl93ZkPKQHwbCy14jnp2XP3~~|-vq2f3pMZlfl_82Tg&~S5 zg)xemi6NCGg^7tFm30{d1H)>lLI#Eu<`m{NEX!CJ7*?~u1f$r%s#%#BQrXc|v#nuA z3mOivS`dkDGNxKiCWch5EN+-RDV!;cDO_u~(M;q)Q^kW-6>kb}FoP!FEe@Cbyu^~s z{JdKnDKHjOW=e=A(=G0TqRiaHqRRN})XH1DiKQj^nR&@Ysky0nCAWAXQIuR6Us73+ z>ZZwfizBZzCnqr}C-oLvVs3tEUdb(vdEI-C2wK%&ZzaSPPkkU3A`v0cts?z!3iR3zrtmO z%SyL3ZaYFRh&W#qalRtr4AW_`Abdgi!pJ3&J47#t*k2T}zanDa;C4eqd4kgv{{>z< zxK2o35DC605`0A@xWNM^?zX|}K;#7x|BE92S48|9TtKi$1?E;wkz34(1qDUmFkwy0 zNi5DT0wvd5++cQmPJVi3UJ7qFJMDA7y>Skj&3k;HGts_2BQnO(FZm*#sJ0-4A{wzqMnM6 NV7V_~5>p*G9snQwhy?%u literal 0 HcmV?d00001 diff --git a/app/main/models.py b/app/main/models.py index 479cfba..c6055de 100644 --- a/app/main/models.py +++ b/app/main/models.py @@ -11,5 +11,5 @@ class Donation(db.Model): id = Column('id', INTEGER(), primary_key=True, autoincrement=True) currency_type = Column('currency_type', TEXT(), nullable=False) amount = Column('amount', INTEGER(), nullable=False) - campaign = db.relationship('Campaign', backref='Donation', lazy='dynamic') - user = db.relationship('User', backref='Donation', lazy='dynamic') \ No newline at end of file + campaign = db.relationship('campaign', backref='donation', lazy='dynamic') + user = db.relationship('user', backref='donation', lazy='dynamic') \ No newline at end of file diff --git a/app/users/__pycache__/models.cpython-311.pyc b/app/users/__pycache__/models.cpython-311.pyc index 0eec00701df8c65bb15bb9fe16998cd60d81ebaf..1101129e18cc7bc8a9a44286fac9f95adede8f7d 100644 GIT binary patch delta 338 zcmX>uwo;sLIWI340|Ntt+4N^=rfeJeVi_4zHs>%(Gx{+xq_U*4GBKp`rtmIfWMEj$ z2vP^a%a|A#Rx^QEARNV)B9y}4!WhM$Dv%=3!mx~ifnhaB0*s>sQv`zI7TmD-%#_J9IgFWj87H6P*e!iSNMeH84Dkh8 z3$#|mUR1KaqGWwh$mWWWO@sI3PR_kjjtmS8MFt>3kAZ>V7l%!5eoARhs$G%$%(GpeKrrtq~eM)9WdrSP{fEMs6` zSPfDL#!>t!0>KQLLX)pDej`2y&%P-51aY-%CF3B&52}vz3 z2}&)P{EfwiQE0O Date: Sun, 15 Sep 2024 13:51:38 +0300 Subject: [PATCH 06/54] relationship needs to be class name not tablename --- app/main/__pycache__/models.cpython-311.pyc | Bin 1468 -> 1474 bytes app/main/models.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/main/__pycache__/models.cpython-311.pyc b/app/main/__pycache__/models.cpython-311.pyc index f08f1aeb04273122c1844940c1c66522cd515e63..3a0cb3449918a2888e5c51fec68753d198790d2f 100644 GIT binary patch delta 94 zcmdnPeTbWDIWI340|NuY_uU)0mN79pPu|F+%osZPDpQugEso^G+=9f+^t@XvrNya5 vlRcTAGpbECWNDI8Wnf?^QUej{3=9mvIBatBQ%ZAE?TYj!pJjQ?0+Im$TgMyc delta 88 zcmX@ay@#7?IWI340|Ntt#*B?z%a|CGCvRj@W-Oh2l_`s>NRokpp-7g2fnl;g^K(X( m$>uCgQpzAP6%e7yz`*c}!zMRBr8Fniu1II{WtP`0AQ=F+G8K>j diff --git a/app/main/models.py b/app/main/models.py index c6055de..659f4b9 100644 --- a/app/main/models.py +++ b/app/main/models.py @@ -11,5 +11,5 @@ class Donation(db.Model): id = Column('id', INTEGER(), primary_key=True, autoincrement=True) currency_type = Column('currency_type', TEXT(), nullable=False) amount = Column('amount', INTEGER(), nullable=False) - campaign = db.relationship('campaign', backref='donation', lazy='dynamic') - user = db.relationship('user', backref='donation', lazy='dynamic') \ No newline at end of file + campaign = db.relationship('Campaign', backref='donation', lazy='dynamic') + user = db.relationship('User', backref='donation', lazy='dynamic') \ No newline at end of file From 67264b3da66053e068dbd988cc6dd0a19508da2e Mon Sep 17 00:00:00 2001 From: yisroelBaum Date: Sun, 15 Sep 2024 15:25:27 +0300 Subject: [PATCH 07/54] add repr to class models and exploring relationships --- .../__pycache__/models.cpython-311.pyc | Bin 1230 -> 1491 bytes app/campaigns/models.py | 7 +- app/main/__pycache__/models.cpython-311.pyc | Bin 1474 -> 1732 bytes app/main/models.py | 10 +- app/main/templates/base.html | 23 +++-- app/users/__pycache__/models.cpython-311.pyc | Bin 2985 -> 3271 bytes app/users/__pycache__/routes.cpython-311.pyc | Bin 5148 -> 6079 bytes app/users/models.py | 8 +- app/users/routes.py | 17 ++- app/users/templates/test.html | 10 ++ python_files/db_population.py | 97 ++++++++++++++++++ 11 files changed, 155 insertions(+), 17 deletions(-) create mode 100644 app/users/templates/test.html diff --git a/app/campaigns/__pycache__/models.cpython-311.pyc b/app/campaigns/__pycache__/models.cpython-311.pyc index 5a3c83462d6a2efe1d6bfb20b89d803275ae682f..cd2c166f67f360ef99bd6c703c9365cd40565042 100644 GIT binary patch delta 541 zcmX@dd6}DUIWI340|NuY>x<9Qs+czNIWta_QIhrxYlrsw~1(HtTNMTIjT*I}D znSo(7Ge`u4qqtMJQ+d*uQg~WeqIgqygBdjWCVyeHslUbHlAo7Yl9``(i#??>FEKYW zS(E7&ds1R@c2R2DEtZ_bs>)kzMX4pFMS01LAfuodWHbnWR$*XZn9fkckOh@sV3^I2 z!dSzQ1y?qpgC>(-6|;h_f+kau5Ca24kq83=gC;NIEtcZcoU~$)Vui^|nJheR zam2?Lr4|&$$5#nDC*~F;W~S%q!Gr`D7#NDB7#J8D7;XrOO;NwVuXTZ6YevePEC}lY zht_A1JNz{HCOa_sI)hwzi>D|x2kgb-jLd>toGDNb7vEwoE-5OKV_;xd$xtK@a+55G z0NGIlB0ynU+%owslee9K`~;>c{0q1?cpZqmAmD#d!2gPXe}m@-7DiU>8Ok3R7+JM( z5=HWpBbaNY)Iny$ZTZDvlbfGXnv-f*q&N9J^D;|zM(qy_m_$cWPsK-&_!kg?rUL9} E03E-F)c^nh delta 285 zcmcc2eU6iFIWI340|Ntt+4N^=Zx}c7IWuyxf%psz44ZL2ZWk0<8sFD`GDySzl4I zz9?jKMaZVX8w87FCdabWN=bt>%76%21_p*-95%W6DWy57c10?azpyN`WMQ=Zz<^0~ T6!lbm1c`qE5ojukK*j+8-Ev0x diff --git a/app/campaigns/models.py b/app/campaigns/models.py index 692b2b2..4a52dd0 100644 --- a/app/campaigns/models.py +++ b/app/campaigns/models.py @@ -11,5 +11,8 @@ class Campaign(db.Model): __tablename__ = 'campaign' id = Column('id', INTEGER(), primary_key=True) title = Column('title', TEXT(), nullable=False) - donation_id = Column(INTEGER, ForeignKey('donation.id')) - #ambassadors \ No newline at end of file + donations = db.relationship('Donation', backref='campaign', lazy='dynamic') + + def __repr__(self) -> str: + return f"{self.id} - {self.title}" + # donation_id = Column(INTEGER, ForeignKey('donation.id')) \ No newline at end of file diff --git a/app/main/__pycache__/models.cpython-311.pyc b/app/main/__pycache__/models.cpython-311.pyc index 3a0cb3449918a2888e5c51fec68753d198790d2f..6b9baef0acb124368a7df204d5e74c63a194fd6f 100644 GIT binary patch delta 641 zcmX@aeT0{9IWI340|NsC>!oLDvzRyXMKdz~n4HBpE0!gdm5CvhD}{3zBLl-~Mvxj1 zUdF`0u$l?P0^ulbCWcg)N-n%Ac~ZDjdDECucv@JZ_$K=@CDvE5mlmfM>1C!=aVIC{ z79?h-=jmmp++r(AEh#O^ONLtsavcK$12Y2y!)Fr)28QVjH4IrG+rfA?LkeRJLl#^$ zln-~}Y=*h4!3>&AepSp0x(b@iMZydW3`JrL3?d9g5)2FsnvAztic@paia{nQOb%l< z4!*?^A77MOP!u0uCFqi$mspaSpQi^C5@KLrC{|@)U}#{tAtW|M{Q|$!1%9U)DOcnS zAj}ORTcRPX3mi_LL2mTZP&&*Tc9NrU?hA&CiUGsG8Y zEznvKdr`^yijwt3A)6~gHVxh%SQuHI8D}VeU;xqh$s)PQ<}6K8Y9PzuZu!MwlbfGX lnv-f*q&xXC%Nl1cMrXzk4A{wzqMnM6V7V_~5>p-6lK>|1nJ@qV delta 382 zcmX@Ydx)EFIWI340|NuY_ubFZHZg7Fi)LheGC7NJmM2#hH%J_WQ#ex?Q@GY}FJoq4 zSj`L)0pTbfCWcgGRXkW#@lH-;O4Pl@;hdOTkeHdCcZ)rxGA}VVGg*`A7JE`+a&}Q_ z+AWrx#Hz|$ETP4zMShxmlW#KzX@cyz#Z#1;lUS0OpI4lbS#XOZ8D<7cX>n@NN`}uM zcT5gtHWnxnWME(b6PyeT48=1i=dxs&-4Icp;55a5f!7YM6OtE1f-i~$Ul9pz@PLWC zZSXn}c|pYgqKN+$5&s4k5G+!gY{}Xrr3x}m4MeCjFfjb$u*uC&Da}c>E7F^Mm356X b8)E?D2L|k9M^R73N3h%%Fo~(I2xKq-yKQL= diff --git a/app/main/models.py b/app/main/models.py index 659f4b9..55502fa 100644 --- a/app/main/models.py +++ b/app/main/models.py @@ -11,5 +11,11 @@ class Donation(db.Model): id = Column('id', INTEGER(), primary_key=True, autoincrement=True) currency_type = Column('currency_type', TEXT(), nullable=False) amount = Column('amount', INTEGER(), nullable=False) - campaign = db.relationship('Campaign', backref='donation', lazy='dynamic') - user = db.relationship('User', backref='donation', lazy='dynamic') \ No newline at end of file + + user_id = Column(INTEGER, ForeignKey('user.id')) + campaign_id = Column(INTEGER, ForeignKey('campaign.id')) + + def __repr__(self) -> str: + return f"{self.id} - {self.currency_type} - {self.amount}" + # campaign = db.relationship('Campaign', backref='donation', lazy='dynamic') + # user = db.relationship('User', backref='donation', lazy='dynamic') \ No newline at end of file diff --git a/app/main/templates/base.html b/app/main/templates/base.html index b10b24b..39f6888 100644 --- a/app/main/templates/base.html +++ b/app/main/templates/base.html @@ -13,19 +13,20 @@ {% with messages = get_flashed_messages(with_categories=true) %} diff --git a/app/users/__pycache__/models.cpython-311.pyc b/app/users/__pycache__/models.cpython-311.pyc index 1101129e18cc7bc8a9a44286fac9f95adede8f7d..442408e0971af7b27325d932658d3dae9bee4d16 100644 GIT binary patch delta 754 zcmZ1}eq54wIWI340|Ntt?4@UEpEmNwF*4?C&S8{e4Cc+^1Bruh3U3Ny3f~(3Wy}l= ztC>L}ARNV?B9JPO#*`x1!V)EzB9&uKkpWMN@ZSRZf3G3(=GO-#N_Ov)U;bHIf+%3x7dnOOG=CKk{QAJ zAp|P}0|UtN&n65E4AU8E7_uPZ3=9mj8B!Q)7_#81p?oHog4qmnS%Vognf$7l6%}+9 zG?|Np85kIfL_vf&0|SF5<1Lor)SR?pkO`Bov6y*r#K#w<78J$DSMi1xrxxkKxF9XX zDhvz^4GcGg#HOfU;CH&f?=&N2PCkUSL1l{`gmr<#=`+aw&4JAEjI2dU3=9mDx3MU) z7Ab>R+^p)1l9P>DbC`-$H!ox@WOUJGU|@I&ii#plkhAna&SJX7mXn%Vo>+N{D={ZM zzbLaLBe%Fn8zjY1WWd0{aEmP^H90>ewTK0z$7FICy8)x}czfi*W9>6p)|5G=+Zw*9Nx(k{1NLFA8{H5%6yC z{J_D;>dZJp`2z!p#zJyTe#>dWs5)7VD~ZuyawnI(lo!Z!xMjaMY;yBcN^?@}iUKAd f;#y;^$!Pq60h8!3>amy*`4J@Z1w^2!0lOXmet)^s delta 446 zcmX>uxl){WIWI340|Ntt+4N^=rW<+V7#UMG=P=4Kdb6amGBKp`rtmIfWMEj$2vP&W z%a|A#Rx^QEARNV)B9y}4!WhM$Dv%=3!mx~ifnhaB0*s>sQv`z7>ZOT^KwW@DKaoHXmS*(F)%RPVoOO)&QD1#VgX5OO?KokVAPvj#9_cF zKY2071~wUxQlZI_oQbX=Q*ObX5TBV+qz^KHr?@1sBr`cTwIm}yrO1kbfng;>kpajw zJrE%XBRClt7>ao(i*oIi5t5joHbZ=Y)&i{+u@{xBuP9kx6tcM@WYggNfn_o`w*{lY zWEbuvMzzVyx#guCK?cCh`^90Co1apelWJGwKKTLn8f#@n;|~m&M2At2#e~R@Aek>9 J0!yt#Z)e7XEl{J8>A0=a@wg1JIbLSQ+L9N}D%D3M&zDA8Q8D6w4eC~>ej zXO2X!WRzsCRFo8$&y^#cD;*^bW^?DrM9DBQq%vp8GB7YqW@Z#+Nfk-qom|H#?M-n1H)=YFo%JG0Zo=aMPQBKGA0Iw)l4uIlWQ0imF3aY38R{lDv}}svaMbL zO`RyFc`0Ho49gf87*@k9V2Dyg(2B~-xw8{7*|e~U{MtiWME(@k^~XlAcAMI zFN=~aC@M9XZn2jZrxwL$rW8prFfbH@fR3_|OA?FZK!U;`K1V@fadCNmQA!anNK61kXoCno zkSt4Lk!^bME#~ypk|MAtn2QWRk{}P<;>=5}D2XpfOiwLlW?*1YP*5mR0BK^)$xqMB zE3#lf1HhKSy|9v@NC_kg*3OobpPpY@Qe@4* zz@Rhv8@Dy1(q7IA{iGy)M=LZZkRBmoWxuw!gNTssgU0wPQ%Kj4@51qTP*naDwKiz_)JH8~q> zDI`8o!hjdWRYfig3=GDbeFUT#l|de@V%0B6EiOq0r7;+0V_;wa8S%M@aqnFrlW|1-nKt z85kH+m}?kn7;Bi;uqxyvu! zQ+J(T{Sv?W3d0Nh>KFNSukh<$=QqB@Z+wy8^a{UegU8))A{0Gk;q1_8^l$NR@PEoJ zHN*Obg31jQof|4TAK00B^gc2$^XPp65g!O9xOnL^>Xu5 zQge!nz`o}PN#!PH=D|ck0dos13QG9JdTIGZxy41GGyzWdw^-A15{t7Tp@m4o;It0T z+uUIJct~aiMQV{iJt(X};0z)P%IZw{ z#kW`?;SDOczzsM+hg;Dea6Bnc2 V2L>)iy^qWcOkyY^U}11*0|35~qc#8l delta 1175 zcmdn5KSzUaIWI340|Ns?QO3m2q2lK9VLyXLlD)xRDl#BB=u2IGHB|BvDhF2)d8{& zjH6^zID;89MPGt=nvA!YQj##HcyBibYj`9~28> zAc7M_a7|v%q9n_~z`&r%bc-FND?T%&NSuLzp%~;X1%+QGli#sOu!p1;mjtC2Oy*`) zWR+uJVBp(q$Xd_LC^~r~$Hsb)nYRQoi{leZOEOaPN-~oZOHxycAQpgZVPjxmxFuAU zn3I{3Sdto_pBG str: + return f"{self.id} - {self.first_name} - {self.last_name}" + # donation_id = Column(INTEGER, ForeignKey('donation.id')) def get_reset_token(self, expiration=600): reset_token = jwt.encode( diff --git a/app/users/routes.py b/app/users/routes.py index 0afaa25..9ee9d9c 100644 --- a/app/users/routes.py +++ b/app/users/routes.py @@ -1,6 +1,8 @@ from app import db from app.users import users from app.users.models import User +from app.campaigns.models import Campaign +from app.main.models import Donation from app.users.forms import LoginForm, RegisterUserForm#, RequestResetForm, ResetPasswordForm, EditUserForm, AddUserForm from flask import render_template, redirect, url_for, flash, request from flask_login import login_required, login_user, current_user, logout_user @@ -66,4 +68,17 @@ def register_user(): login_user(user) flash('Succesfully Registered!') return redirect(url_for('main.homepage')) - return render_template('register_user.html', form=form) \ No newline at end of file + return render_template('register_user.html', form=form) + +@users.route('/test') +def testing_route(): + user = User.query.filter_by(id=1).first() + donation = Donation.query.filter_by(id=1).first() + campaign = Campaign.query.filter_by(id=1).first() + + print(campaign) + + return render_template('test.html', + user=user, + donation=donation, + campaign=campaign) \ No newline at end of file diff --git a/app/users/templates/test.html b/app/users/templates/test.html new file mode 100644 index 0000000..105670c --- /dev/null +++ b/app/users/templates/test.html @@ -0,0 +1,10 @@ +{% extends 'base.html' %} +{% block title %}User Access{% endblock title %} +{% block content %} +{{user.first_name}}
+{{donation.amount}}
+ +{% for c in campaign.donations %} +{{c}} +{% endfor %} +{% endblock %} \ No newline at end of file diff --git a/python_files/db_population.py b/python_files/db_population.py index e69de29..11ddeb3 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -0,0 +1,97 @@ +from sqlalchemy import create_engine, MetaData, Table, select, insert, func, update, bindparam, delete +import os +import csv +from datetime import datetime, timedelta +from dateutil.parser import parse +import time +import json +from werkzeug.security import generate_password_hash + + + +def insert_users(): + engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + metadata_obj = MetaData() + metadata_obj.reflect(bind=engine) + user_table = Table("user", metadata_obj, autoload_with=engine) + + with engine.connect() as conn: + conn.execute(user_table.insert().values( + first_name = "Yisroel", + last_name = "Baum", + email = "yisroel.d.baum@gmail.com", + password = generate_password_hash('12'), + user_type = "User" + )) + conn.execute(user_table.insert().values( + first_name = "Yoni", + last_name = "Gerzi", + email = "yoni@gerzi.com", + password = generate_password_hash('12'), + user_type = "User" + )) + conn.commit() + +def insert_donations(): + engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + metadata_obj = MetaData() + metadata_obj.reflect(bind=engine) + user_table = Table("user", metadata_obj, autoload_with=engine) + donation_table = Table("donation", metadata_obj, autoload_with=engine) + campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + + with engine.connect() as conn: + sruli = conn.execute(select(user_table).where(user_table.c.id == 1)).first() + yoni = conn.execute(select(user_table).where(user_table.c.id == 2)).first() + + campaign_one = conn.execute(select(campaign_table).where(campaign_table.c.id == 2)).first() + + conn.execute(donation_table.insert().values( + currency_type = "shekel", + amount = 50, + campaign_id=campaign_one.id, + user_id=sruli.id + )) + conn.commit() + +def insert_campaigns(): + engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + metadata_obj = MetaData() + metadata_obj.reflect(bind=engine) + campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + + with engine.connect() as conn: + conn.execute(campaign_table.insert().values(title="general campaign")) + conn.execute(campaign_table.insert().values(title="special campaign")) + conn.commit() + +def test_selections(): + engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + metadata_obj = MetaData() + metadata_obj.reflect(bind=engine) + user_table = Table("user", metadata_obj, autoload_with=engine) + donation_table = Table("donation", metadata_obj, autoload_with=engine) + campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + + with engine.connect() as conn: + campaign_one = conn.execute(select(campaign_table).where(campaign_table.c.id==1)).first() + donation_one = conn.execute(select(donation_table).where(donation_table.c.id==1)).first() + user_one = conn.execute(select(user_table).where(user_table.c.id==1)).first() + print(user_one.donations) + +def delete_all(): + engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + metadata_obj = MetaData() + metadata_obj.reflect(bind=engine) + user_table = Table("user", metadata_obj, autoload_with=engine) + donation_table = Table("donation", metadata_obj, autoload_with=engine) + campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + + with engine.connect() as conn: + conn.execute(delete(user_table)) + conn.execute(delete(campaign_table)) + conn.execute(delete(donation_table)) + conn.commit() + +if __name__ == '__main__': + test_selections() From 71d191098838c3d23380e6038bc2c04aa223e234 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 16 Sep 2024 14:23:24 +0300 Subject: [PATCH 08/54] ambassador map and replace relationships with integer fields --- app/__pycache__/__init__.cpython-310.pyc | Bin 1928 -> 2056 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 1241 bytes app/campaigns/models.py | 14 +++++++++++--- app/main/__pycache__/models.cpython-310.pyc | Bin 0 -> 1105 bytes app/main/models.py | 6 ++++-- app/users/__pycache__/models.cpython-310.pyc | Bin 1666 -> 1839 bytes app/users/__pycache__/routes.cpython-310.pyc | Bin 2568 -> 2973 bytes app/users/models.py | 3 ++- 8 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 app/campaigns/__pycache__/models.cpython-310.pyc create mode 100644 app/main/__pycache__/models.cpython-310.pyc diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc index 3bab4735ac86e2ef75e380d94ba900dd657c1067..477112f9ad31adf890d259b3f426c3046e6ba2c9 100644 GIT binary patch delta 750 zcmeC+?-1b4=jG*MU|?W)^80z(ijBOrjC>$2D+2=qGXn!dvCZTej7{|nIU>2DObm<+ zxni9Rj0`C(DGWK{xe^eOS|+H7WUdrcgqe|{ggZ;Rogs}eg*An(g`=6VmL-L~ggag) zg(Za}M>bcqmKCgvGe<60s+JAR=E{-Jm8fM0v$=B=ausVi7#V697AQH?ur6eTFl*T0 zEOt1H1IkiP;aSL-!kfa^!qCiE%UQ!v!kWeu%%I6Xc|DW1b21~ypHR#M^`J1wlTr)} z3>^$v3|Wi|m}(dnGS)KIFcxvwFa|TEFa$GbGWuyU-(m?ZPA!@&%Ph;klJORIX>n>% zd~SY9YEJQFduAIhO^`7h3=9l>lUtdWsYx?1FccvO83qQ1TLML?Mfs&AsqsmP#i{Y7 zMLG7916d3iRVFvHY_*aDsbGT`cuOR)pg=D?dZHkWNI?&Foy_DA Gb`tREF{az#5C z7#T{qv&7mN(il_NQrKHKni*@EQaDPusmW`32hGBt14f8@qD2oNoVuiEVpe)4{Ua^IYDSRpXEey?!wd^$v zC9G*o!3>%LlW#I&=ews{^-I--si$oY07$z4p+i7He8gVsUm6D3pspsicU7frWvgNNw^Xw)p~@AXjLE2ptfiJ9#3z So+wBsQXqmIDLwfLy9of)HH26I diff --git a/app/campaigns/__pycache__/models.cpython-310.pyc b/app/campaigns/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..805d85ba625375bebb2cf37c390b8b039fd7d292 GIT binary patch literal 1241 zcmd1j<>g{vU|_f-@*=H~nStRkh=Yt-7#J8F7#J9edl(oPQW#Pga~N_NqZk=MY^EHh zT;?cdFq=7tC6_gd70hPIVasKYV$bD>;>hKU;>_iW;sW!zqquWBP8Qd9C*i$%K7*aS=8M6eNnWKc<8B#b?xLO!exS%4!DXhT^ zn%plz?$l(w#gvky$#{!9xwNP#HLoN-v7kVc@fHt^TUwl2q{)7ZCB!u%k;^HWN5Ky04)_`=e}9H#Q}3!5y*ofMS`GI!CI18l9TFI zBm&~F6{VJx7Ud-~BE>m~&CI~S;0($tLJSNHH4Iq{vl&ttYZ$T^XEV%Y4rb6~@~dK2 z&{fc60-IbU&%nT-$#{#UI5j5?5q3o~AS*cH>yh? zKm;g?i$GC)i#e;jq=*|N#seaFL0)I|1*HdYoP#Y!awOQzknpjAq*gmnxEF&Wiid%R Rk%v)*k%Li$QHWWL0{|Da8u|bL literal 0 HcmV?d00001 diff --git a/app/campaigns/models.py b/app/campaigns/models.py index 4a52dd0..d7bdcd7 100644 --- a/app/campaigns/models.py +++ b/app/campaigns/models.py @@ -6,12 +6,20 @@ import jwt from datetime import datetime, timezone, timedelta +class AmbassadorMap(db.Model): + __tablename__ = 'ambassador_map' + id = Column('id', INTEGER(), primary_key=True) + campaign_id = Column('campaign_id', INTEGER(), nullable=False) + user_id = Column('user_id', INTEGER(), nullable=False) + + class Campaign(db.Model): __tablename__ = 'campaign' - id = Column('id', INTEGER(), primary_key=True) - title = Column('title', TEXT(), nullable=False) - donations = db.relationship('Donation', backref='campaign', lazy='dynamic') + id = Column('id', INTEGER(), primary_key=True) + title = Column('title', TEXT(), nullable=False) + + # donations = db.relationship('Donation', backref='campaign', lazy='dynamic') def __repr__(self) -> str: return f"{self.id} - {self.title}" diff --git a/app/main/__pycache__/models.cpython-310.pyc b/app/main/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..436cc8acfb611892f981641a0ea7347c345e8e87 GIT binary patch literal 1105 zcmd1j<>g{vU|@JF{31<&g@NHQh=Yt-7#J8F7#J9e>lhdqQW#Pga~N_NqZk=MY^EHh zT;?cdFq=7tC6_gdHJ2@l4a{fBVbA4=;>hKU;>_iW;>zWY;s*11qIhz7qjCU1)~HR8Qd9C*i$%K7*aS=8MB0%nWKbLSc4ffIbVWYrpb7V zDJ4mh@fLS-X;D#XUP*jnL4hXIEzZ#5)FR)^ip;!QJTRHk;?yEd_FF6=t`Q-(*qrlo zN^|pWu{-7G=cFd)-Qse~FG|f!&+|^LEMj9|V7SHZ=@;Va?izH9JMafsS(TrcdW#dpN=eNrNlXSg2^oV70tZ+D0|P@ULlk2QLljdAV-#~L zOA1peYcoR%a|&|`OD{_lTPjNmYbtv)Lke38doOboM=DDS2UrD!&zZ`S!imJ^N@Ypm zLgI6$aHsO5F{SXN@V2l-@uu(vGidVP;&92&ODxIE&%4Eu0%I{{ri5rR-Qq4N%FInH zs*KN0t-QsXSXz>wnU`FYnwy$ea*G!dWXYBBC6xuKZkmj@IPyw!auSnrQg5*(=H{2? zmE2+n1!sI_$}R5X#N2|!%=A1Ehpi~Jq_ik6nGq=zKx|e91_ozP%8_DVV5nipVwla4 z!dSzQ#R#RDW;4tM#VV6u6|;h_f+lm3AOizKkqC$oV_;y=WW2>voSKuilA%bNfq~(d zfqq7QZmND|W^qw|YL1bi* z_@dN;qWE}_nZ-;D3=C3?Rf4ea(SynQY4U-T<|XE)#>d~{ijU9DPbtj-v3cU-3riDo zpfbGi@g<<}fN+c0K@J6F9*Da^@s4nOkvK?J0+gtji%W`%WI@5HcV!eg*~x zPEaTbFfcH1Ft9KRF$zGT5Ni=gR#W5_b7Db35y<_wSkrP6i?fTEK?ZY!+3`8~>6v*& zpnO^c3i4ZA#f3SEImsERxsX&1aVQ7KGLS_@U?+2f3}DVGFDc>yN$`RQK9CrzFDUrH m7DHT#a5Tuhw>WGdp<@S%;$n~%9tIvp0Y()@4n`41F=hZe3J&K0 literal 0 HcmV?d00001 diff --git a/app/main/models.py b/app/main/models.py index 55502fa..45021a0 100644 --- a/app/main/models.py +++ b/app/main/models.py @@ -11,9 +11,11 @@ class Donation(db.Model): id = Column('id', INTEGER(), primary_key=True, autoincrement=True) currency_type = Column('currency_type', TEXT(), nullable=False) amount = Column('amount', INTEGER(), nullable=False) + user_id = Column('user_id', INTEGER(), nullable=False) + campaign_id = Column('campaign_id', INTEGER(), nullable=False) - user_id = Column(INTEGER, ForeignKey('user.id')) - campaign_id = Column(INTEGER, ForeignKey('campaign.id')) + # user_id = Column(INTEGER, ForeignKey('user.id')) + # campaign_id = Column(INTEGER, ForeignKey('campaign.id')) def __repr__(self) -> str: return f"{self.id} - {self.currency_type} - {self.amount}" diff --git a/app/users/__pycache__/models.cpython-310.pyc b/app/users/__pycache__/models.cpython-310.pyc index 85688687b87342565a5ee981e393eed577e6c91e..bfd061829269fd6fdef60d00ff1d5768284b61e0 100644 GIT binary patch delta 538 zcmZqTUC+mt&&$ijz`($;TKGlUFSd<*{)~*%CdV-rY4WD>rZJ`PrSP|~MDeAFr3j`7 zwJ=8UrwXJ9r--yLG&4pCricbJXo^pM&6r<*i>)ZNq_ik6nGs|d6oc5T3=9m;3=9m# zQVa|XH4Iq{vl&ttYZ$T^p)}KMhPkZ444O=SRm=*y3YyGCf(#4{MZzFLl!1XklkpZy zacWN5N`@jC1_p*-hWZ)#xvBb!G2OH;l4f9FxW$!PQIJ`bSdy8acZ<6ywK%mTz9c_8H4khJ zgpdWP<4;d5iAR!`nmmtroq#F>1H(&Dz!fQiT&gxXhDAzB8RTA$A`Or>wv^Q5{FKxp zW{|YbFaf zxFoS8GdVZ4BqKki$O0seFcr)Kxw(j+fq{V&6bKRw3=A9$EQ|tRC2TNs)d zqxe&Vf*CYLCjVs2pRCS&Q~4H4acWN5Ew0pxg3O}ClFaEQX$R^Ch#WcBsEtyey@*OsL O0kA3rp);AAT?GJe%u}iW diff --git a/app/users/__pycache__/routes.cpython-310.pyc b/app/users/__pycache__/routes.cpython-310.pyc index 7e8960317dd524c88107452297e160c55104ef54..1bac2aab920e3c762a0f8247f53ba31b0cef2dc0 100644 GIT binary patch delta 1424 zcmeAWnJdnh&&$ijz`(%pkThq6-;QMN-64#G#@JVAT>()siVvAn_uiGdZy&HKhn*0mv%$$&#$H^->_FG>A}RU|_h#l9E`GSR@1D3xW6? z1&PJQ<@rS^MIg(H_(2jHAc7Yp%aT}>UVMu=J+-6=>{{j`U635erMEcqQY%X03lh^) zi{wCpU_u_Gi!~=dJu?qvak1Rwt*lCnrju{5=DBNw{L4}#2vQ8T4B=F;UIYO)g)JvP zJ-@U>hk=2in2mvffsL7ik%zI!Y;rH#X-3t_k?h%QARiSOPCmu15eqWBN~kC`J+rtZ zwJ07Grg|AAxj983{hFdh93WfuK?Dnk06DG*9x6o!ATe;DfE{KI;#z0-GSo7Zu%L-Bmaw9UFqN>?Ff}tWGL*2VFxN2D zFxD`ou=KJ7Gib8bWIs5dRx*Q~ev2aontpF_B*RiQM-f_}frAPZ zDMhT{2rnqg%!4G6A_q{2p+zMx$d=5!^!TFu(vnn9kk4d6sZWSWh*5}>*eOBq~;VuEaV4C=9NFN6&JC822PfPjK9Dy4dJqZ9WZ)EgORzk(D7z}P zG+nPaHMz7Xv!t>JA0=a@wg1JIbLb<|G!eDXs9FbhnDA8Q8C^0afBS$<} zJW3qQ=FE|Zl1ODh9VIV!2u#TCo?lENw708FlaK}VlORDEsD=fDH3I1U|7jeBt6-d*^!ZNay_#s zqwM6V%%2#ACwH)HR05fCOCYm2KC!eUBQ>uiGdZy&HKhn*AjnkK$( zU|_h#l9E`GSR@JJ3xN0>1&PJQ<@rS^MWFC6;sr^lf(UMqEK6chdhsph^wg3fu Date: Mon, 16 Sep 2024 15:34:31 +0300 Subject: [PATCH 09/54] making fake data to insert --- python_files/db_population.py | 105 ++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 49 deletions(-) diff --git a/python_files/db_population.py b/python_files/db_population.py index 11ddeb3..bd1eb91 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -6,83 +6,85 @@ from dateutil.parser import parse import time import json from werkzeug.security import generate_password_hash +import random +def engineer(): + engine = create_engine('sqlite:////home/yisroel2/Desktop/Pilzno/instance/site.db') + # engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + metadata_obj = MetaData() + metadata_obj.reflect(bind=engine) + return engine, metadata_obj def insert_users(): - engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') - metadata_obj = MetaData() - metadata_obj.reflect(bind=engine) + users = [ + ['Yisroel', 'Baum', 'yisroel.d.baum@gmail.com', generate_password_hash('12'), 'Admin'], + ['Yoni', 'Gerzi', 'yoni@gerzi.com', generate_password_hash('12'), 'User'], + ['Shmuli', 'Modes', 'shmuli@modes.com', generate_password_hash('12'), 'User'], + ['Emma', 'Baum', 'emma@baum.com', generate_password_hash('12'), 'User'], + ['Yisroel', 'Factor', 'yisroel@factor.com', generate_password_hash('12'), 'User'], + ['Yaakov', 'Frager', 'yaakov@frager.com', generate_password_hash('12'), 'User'], + ['Michael', 'Oshman', 'michael@oshman.com', generate_password_hash('12'), 'User'], + ['Shalom', 'Goldberg', 'shalom@goldberg.com', generate_password_hash('12'), 'User'], + ['Daniel', 'Caller', 'daniel@caller.com', generate_password_hash('12', 'User')], + + ] + engine, metadata_obj = engineer() user_table = Table("user", metadata_obj, autoload_with=engine) with engine.connect() as conn: - conn.execute(user_table.insert().values( - first_name = "Yisroel", - last_name = "Baum", - email = "yisroel.d.baum@gmail.com", - password = generate_password_hash('12'), - user_type = "User" - )) - conn.execute(user_table.insert().values( - first_name = "Yoni", - last_name = "Gerzi", - email = "yoni@gerzi.com", - password = generate_password_hash('12'), - user_type = "User" - )) + for user in users: + conn.execute(user_table.insert().values( + first_name = user[0], + last_name = user[1], + email = user[2], + password = user[3], + user_type = user[4] + )) conn.commit() def insert_donations(): - engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') - metadata_obj = MetaData() - metadata_obj.reflect(bind=engine) - user_table = Table("user", metadata_obj, autoload_with=engine) + engine, metadata_obj = engineer() donation_table = Table("donation", metadata_obj, autoload_with=engine) - campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + currency_types = ['shekel', 'dollar'] + with engine.connect() as conn: - sruli = conn.execute(select(user_table).where(user_table.c.id == 1)).first() - yoni = conn.execute(select(user_table).where(user_table.c.id == 2)).first() - - campaign_one = conn.execute(select(campaign_table).where(campaign_table.c.id == 2)).first() - - conn.execute(donation_table.insert().values( - currency_type = "shekel", - amount = 50, - campaign_id=campaign_one.id, - user_id=sruli.id - )) + for _ in range(100): + conn.execute(donation_table.insert().values( + currency_type = currency_types[random.randint(1,2)], + amount = random.randint(1,200), + campaign_id=1, + user_id=1 + )) conn.commit() def insert_campaigns(): - engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') - metadata_obj = MetaData() - metadata_obj.reflect(bind=engine) + engine, metadata_obj = engineer() campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + campaign_titles = ['general campaign', 'yomim noraim 2024', 'pesach kibbudim 2024', 'RH kibbudim 2024'] with engine.connect() as conn: - conn.execute(campaign_table.insert().values(title="general campaign")) - conn.execute(campaign_table.insert().values(title="special campaign")) + for title in campaign_titles: + conn.execute(campaign_table.insert().values(title=title)) conn.commit() def test_selections(): - engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') - metadata_obj = MetaData() - metadata_obj.reflect(bind=engine) + engine, metadata_obj = engineer() user_table = Table("user", metadata_obj, autoload_with=engine) donation_table = Table("donation", metadata_obj, autoload_with=engine) campaign_table = Table("campaign", metadata_obj, autoload_with=engine) - with engine.connect() as conn: - campaign_one = conn.execute(select(campaign_table).where(campaign_table.c.id==1)).first() - donation_one = conn.execute(select(donation_table).where(donation_table.c.id==1)).first() - user_one = conn.execute(select(user_table).where(user_table.c.id==1)).first() - print(user_one.donations) + for x in range(10): + print(random.randrange(1,4)) + # with engine.connect() as conn: + # campaign_one = conn.execute(select(campaign_table).where(campaign_table.c.id==1)).first() + # donation_one = conn.execute(select(donation_table).where(donation_table.c.id==1)).first() + # user_one = conn.execute(select(user_table).where(user_table.c.id==1)).first() + # print(user_one) def delete_all(): - engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') - metadata_obj = MetaData() - metadata_obj.reflect(bind=engine) + engine, metadata_obj = engineer() user_table = Table("user", metadata_obj, autoload_with=engine) donation_table = Table("donation", metadata_obj, autoload_with=engine) campaign_table = Table("campaign", metadata_obj, autoload_with=engine) @@ -93,5 +95,10 @@ def delete_all(): conn.execute(delete(donation_table)) conn.commit() +def insert_all(): + insert_users() + insert_campaigns() + insert_donations() + if __name__ == '__main__': test_selections() From 25bafd04e05ebfa70d9b6f06f7ad24020971a760 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 17 Sep 2024 11:06:51 +0300 Subject: [PATCH 10/54] add admin page for viewing models --- app/admin/routes.py | 8 +++- app/admin/templates/administration.html | 51 ++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/app/admin/routes.py b/app/admin/routes.py index d3b6308..f10b042 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -1,6 +1,8 @@ from app import db from app.admin import admin from app.users.models import User +from app.campaigns.models import Campaign +from app.main.models import Donation from app.users.forms import LoginForm, RegisterUserForm#, RequestResetForm, ResetPasswordForm, EditUserForm, AddUserForm from flask import render_template, redirect, url_for, flash, request from flask_login import login_required, login_user, current_user, logout_user @@ -10,4 +12,8 @@ import os @admin.route('administration') def administration(): - return render_template('administration.html') + users = User.query.all() + campaigns = Campaign.query.all() + return render_template('administration.html', + users=users, + campaigns=campaigns) diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index 6f73217..fab3b36 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -1,2 +1,51 @@ {% extends 'base.html' %} -{% block title %}Administration{% endblock title %} \ No newline at end of file +{% block title %}Administration{% endblock title %} +{% block content %} +
+
+

Users

+ + + + + + + + + + + + {% for user in users %} + + + + + + + {% endfor %} + +
#First NameLast NameEmail
{{user.id}}{{user.first_name}}{{user.last_name}}{{user.email}}
+
+ +
+

Campaigns

+ + + + + + + + + + {% for campaign in campaigns %} + + + + + {% endfor %} + +
#Title
{{campaign.id}}{{campaign.title}}
+
+
+{% endblock content %} From bdf909c143ea05d6ba458939a619dc59bf6e2c80 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 17 Sep 2024 11:07:19 +0300 Subject: [PATCH 11/54] fix homepage url --- app/users/routes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/users/routes.py b/app/users/routes.py index 9ee9d9c..0644c2a 100644 --- a/app/users/routes.py +++ b/app/users/routes.py @@ -17,7 +17,7 @@ import os @login_required def user_page(user_id): if not int(current_user.id) == int(user_id): - return redirect(url_for('main.dashboard')) + return redirect(url_for('main.homepage')) user = User.query.filter_by(id=user_id).first() return render_template('user_page.html', user=user) @@ -27,7 +27,7 @@ def user_page(user_id): @users.route('/login', methods=('GET', 'POST')) def login(): if current_user.is_authenticated: - return redirect(url_for('main.dashboard')) + return redirect(url_for('main.homepage')) form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email=form.email.data).first() From 450b06c1854e10edec07818e84422d764dd20653 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 17 Sep 2024 11:07:57 +0300 Subject: [PATCH 12/54] add active to campaign model --- app/campaigns/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/campaigns/models.py b/app/campaigns/models.py index d7bdcd7..882de72 100644 --- a/app/campaigns/models.py +++ b/app/campaigns/models.py @@ -18,6 +18,7 @@ class Campaign(db.Model): __tablename__ = 'campaign' id = Column('id', INTEGER(), primary_key=True) title = Column('title', TEXT(), nullable=False) + active = Column('active', Boolean(), nullable=False, default=True) # donations = db.relationship('Donation', backref='campaign', lazy='dynamic') From fbdc6b4ee4ffedd992b52c6c89d47b1ad942b1f6 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 17 Sep 2024 11:08:23 +0300 Subject: [PATCH 13/54] finish drop and insert funcitons for preloading db --- python_files/db_population.py | 46 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/python_files/db_population.py b/python_files/db_population.py index bd1eb91..1f96832 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -7,6 +7,7 @@ import time import json from werkzeug.security import generate_password_hash import random + def engineer(): engine = create_engine('sqlite:////home/yisroel2/Desktop/Pilzno/instance/site.db') # engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') @@ -14,7 +15,33 @@ def engineer(): metadata_obj.reflect(bind=engine) return engine, metadata_obj - +def check_db(): + engine, metadata_obj = engineer() + user_table = Table("user", metadata_obj, autoload_with=engine) + donation_table = Table("donation", metadata_obj, autoload_with=engine) + campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + with engine.connect() as conn: + print('USERS') + users = conn.execute(select(user_table)).all() + if users: + for user in users: + print(user.first_name) + else: + print('no users') + print("DONATIONS") + donations = conn.execute(select(donation_table)).all() + if donations: + for donation in donations: + print(donation.id) + else: + print('no donations') + campaigns = conn.execute(select(campaign_table)).all() + print('CAMPAIGNS') + if campaigns: + for campaign in campaigns: + print(campaign.title) + else: + print('no campaigns') def insert_users(): users = [ @@ -26,7 +53,7 @@ def insert_users(): ['Yaakov', 'Frager', 'yaakov@frager.com', generate_password_hash('12'), 'User'], ['Michael', 'Oshman', 'michael@oshman.com', generate_password_hash('12'), 'User'], ['Shalom', 'Goldberg', 'shalom@goldberg.com', generate_password_hash('12'), 'User'], - ['Daniel', 'Caller', 'daniel@caller.com', generate_password_hash('12', 'User')], + ['Daniel', 'Caller', 'daniel@caller.com', generate_password_hash('12'), 'User'], ] engine, metadata_obj = engineer() @@ -52,10 +79,10 @@ def insert_donations(): with engine.connect() as conn: for _ in range(100): conn.execute(donation_table.insert().values( - currency_type = currency_types[random.randint(1,2)], + currency_type = currency_types[random.randint(0,1)], amount = random.randint(1,200), - campaign_id=1, - user_id=1 + campaign_id=random.randint(1,4), + user_id=random.randint(1,9) )) conn.commit() @@ -64,9 +91,13 @@ def insert_campaigns(): campaign_table = Table("campaign", metadata_obj, autoload_with=engine) campaign_titles = ['general campaign', 'yomim noraim 2024', 'pesach kibbudim 2024', 'RH kibbudim 2024'] + is_active = [True, False] with engine.connect() as conn: for title in campaign_titles: - conn.execute(campaign_table.insert().values(title=title)) + conn.execute(campaign_table.insert().values( + title=title, + active=is_active[random.randint(0,1)] + )) conn.commit() def test_selections(): @@ -101,4 +132,5 @@ def insert_all(): insert_donations() if __name__ == '__main__': - test_selections() + delete_all() + insert_all() From d0908cf65d012ceca7ad4c0a138529a26c8c8a20 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 17 Sep 2024 11:34:48 +0300 Subject: [PATCH 14/54] implementing nested blueprint for api calls --- app/__init__.py | 9 ++++---- app/campaigns/campaign_api/__init__.py | 9 ++++++++ app/campaigns/campaign_api/routes.py | 7 ++++++ .../campaign_api/templates/testing.html | 22 +++++++++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 app/campaigns/campaign_api/__init__.py create mode 100644 app/campaigns/campaign_api/routes.py create mode 100644 app/campaigns/campaign_api/templates/testing.html diff --git a/app/__init__.py b/app/__init__.py index 7855b0e..897cf61 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -50,15 +50,16 @@ def create_app(): from app.users import users from app.main import main from app.campaigns import campaigns + from app.campaigns.campaign_api import campaign_api from app.admin import admin - # from app.agent_reports import agent_reports - # from app.status_reports import status_reports + + campaigns.register_blueprint(campaign_api) + app.register_blueprint(users) app.register_blueprint(main) app.register_blueprint(campaigns) app.register_blueprint(admin) - # app.register_blueprint(agent_reports) - # app.register_blueprint(status_reports) + @app.route('/') def reroute_base_url(): diff --git a/app/campaigns/campaign_api/__init__.py b/app/campaigns/campaign_api/__init__.py new file mode 100644 index 0000000..2753bee --- /dev/null +++ b/app/campaigns/campaign_api/__init__.py @@ -0,0 +1,9 @@ +from flask import Blueprint + +campaign_api = Blueprint('campaign_api', + __name__, + template_folder='templates', + static_folder='static', + url_prefix='/campaign_api') + +from app.campaigns.campaign_api import routes \ No newline at end of file diff --git a/app/campaigns/campaign_api/routes.py b/app/campaigns/campaign_api/routes.py new file mode 100644 index 0000000..094249a --- /dev/null +++ b/app/campaigns/campaign_api/routes.py @@ -0,0 +1,7 @@ +from flask import render_template +from app.campaigns.campaign_api import campaign_api + + +@campaign_api.route('testing') +def testing(): + return render_template('testing.html') \ No newline at end of file diff --git a/app/campaigns/campaign_api/templates/testing.html b/app/campaigns/campaign_api/templates/testing.html new file mode 100644 index 0000000..cd5d3ca --- /dev/null +++ b/app/campaigns/campaign_api/templates/testing.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} +{% block title %}testing{% endblock title %} + +{% block stylesheet %} + +{% endblock stylesheet %} +{% block content %} +
+
+

Testing Page

+ + +
+ +
+{% endblock content %} \ No newline at end of file From 0b17e390741b8c572fab7bb41f1009b3d47e70a6 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Wed, 18 Sep 2024 18:48:26 +0300 Subject: [PATCH 15/54] add campaign detail page route --- app/campaigns/routes.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/campaigns/routes.py b/app/campaigns/routes.py index fa4faa0..b07c22a 100644 --- a/app/campaigns/routes.py +++ b/app/campaigns/routes.py @@ -1,6 +1,7 @@ from app import db from app.campaigns import campaigns from app.users.models import User +from app.campaigns.models import Campaign # from forms import LoginForm, RequestResetForm, ResetPasswordForm, EditUserForm, AddUserForm from flask import render_template, redirect, url_for, flash, request from flask_login import login_required, login_user, current_user, logout_user @@ -10,4 +11,10 @@ import os @campaigns.route('add_campaign') def add_campaign(): - return render_template('add_campaign.html') \ No newline at end of file + return render_template('add_campaign.html') + +@campaigns.route('campaign_page/') +def campaign_page(campaign_id): + campaign = Campaign.query.filter_by(id=campaign_id).first() + return render_template('campaign_page.html', + campaign=campaign) \ No newline at end of file From 528d62010bc799d9a21722923608525b3c91a9c3 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Wed, 18 Sep 2024 18:48:35 +0300 Subject: [PATCH 16/54] add campaign detail page route --- app/campaigns/templates/campaign_page.html | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/campaigns/templates/campaign_page.html diff --git a/app/campaigns/templates/campaign_page.html b/app/campaigns/templates/campaign_page.html new file mode 100644 index 0000000..d5aba23 --- /dev/null +++ b/app/campaigns/templates/campaign_page.html @@ -0,0 +1,5 @@ +{% extends 'base.html' %} +{% block title %}{{campaign.title}}{% endblock title %} +{% block content %} +{{campaign.title}} +{% endblock content %} \ No newline at end of file From bdde079e43fd9e71462dc3f512d23e15893d9d85 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Wed, 18 Sep 2024 18:48:59 +0300 Subject: [PATCH 17/54] add campaigns to homepage --- app/main/routes.py | 8 ++++--- app/main/templates/homepage.html | 37 +++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/app/main/routes.py b/app/main/routes.py index 01b8a13..a253fd8 100644 --- a/app/main/routes.py +++ b/app/main/routes.py @@ -1,6 +1,7 @@ from app import db from app.main import main from app.users.models import User +from app.campaigns.models import Campaign # from forms import LoginForm, RequestResetForm, ResetPasswordForm, EditUserForm, AddUserForm from flask import render_template, redirect, url_for, flash, request from flask_login import login_required, login_user, current_user, logout_user @@ -12,6 +13,7 @@ import os @main.route('/homepage') -def homepage(): - - return render_template('homepage.html') \ No newline at end of file +def homepage(): + active_campaigns = Campaign.query.filter_by(active=True).all() + return render_template('homepage.html', + active_campaigns=active_campaigns) \ No newline at end of file diff --git a/app/main/templates/homepage.html b/app/main/templates/homepage.html index 8aad2a0..69dd62b 100644 --- a/app/main/templates/homepage.html +++ b/app/main/templates/homepage.html @@ -1,2 +1,37 @@ {% extends 'base.html' %} -{% block title %}Customer Search{% endblock title %} \ No newline at end of file +{% block title %}Homepage{% endblock title %} + +{% block stylesheet %} + +{% endblock stylesheet %} +{% block content %} +
+
+

Visit Campaigns

+ + + + + + + + + + {% for campaign in active_campaigns %} + + + + + {% endfor %} + +
TitleCampaign Link
{{campaign.title}}See campaign details
+
+ +
+{% endblock content %} \ No newline at end of file From 42f76f1987e5b3f8c369e88fa5eda9ed96294239 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Wed, 18 Sep 2024 18:49:08 +0300 Subject: [PATCH 18/54] cpythons --- app/__pycache__/__init__.cpython-310.pyc | Bin 2056 -> 2136 bytes app/admin/__pycache__/routes.cpython-310.pyc | Bin 858 -> 1037 bytes .../__pycache__/models.cpython-310.pyc | Bin 1241 -> 1295 bytes .../__pycache__/routes.cpython-310.pyc | Bin 790 -> 1109 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 396 bytes .../__pycache__/routes.cpython-310.pyc | Bin 0 -> 406 bytes app/main/__pycache__/routes.cpython-310.pyc | Bin 778 -> 918 bytes app/users/__pycache__/routes.cpython-310.pyc | Bin 2973 -> 2957 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/campaigns/campaign_api/__pycache__/__init__.cpython-310.pyc create mode 100644 app/campaigns/campaign_api/__pycache__/routes.cpython-310.pyc diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc index 477112f9ad31adf890d259b3f426c3046e6ba2c9..b5aa9257306c8accae8df950c27ed703682e4094 100644 GIT binary patch delta 349 zcmeAWxFNus&&$ijz`(%p)AnUr%tqc?Mm}x^1_o9J1_ovZ28QCG$uk)LMy0T%@Z>1v zD%Wx{GSsjyP^sZq$jHc0!>~Z5h850YgR|J-EKVp(HHCK}V+vmie+xr1V=Y$=LkVjd zQ!s<3z~-AwCXBp1$%(lIiJ9qn@rebQlet)`7#$|JvKTU|ZQjme!00QLSWut`Q&J3P zffN@hGB7aQ;shy3Ov%m6D^ddSg^E(sGmA@7i{g`VN>dApGV@Aqu@>c*mZWNOPZnnL zW&^1zQkfjjrp)LtxtYz-h=-AjiHnJg5d=AyxfnT^id+~N82mJ4Zn382Bo=2EF)=VO m6oJB|hy}#bnEZ%szJNA}sS6_XK!pC}iR^leE|U+idjJ5+npkuI delta 249 zcmca1&>_H^&&$ijz`(%p3$00`o*Z8OB``wGHbT8B!QhSaUdXIioniY_=S(T<$3D zT%IT%FrPh#HFqAN4F)mBa6oE`H;$&c8C=z2}U|7je zBt2P-$y{2Lfq{V+WGN2=0|OTm7b6QJ6C)EN+dobD$#G0Z^&*J{1$uCU^>Xu5Qge#I zhTY-^N#!PH=D|eSKz4#f!4A?(%P-0;E@B7S$pMmLP0L9v&W1Pw6qiNZASsZ=MIa~K z;s(pd=j5kn<`waQxW&eo&&$ijz`($;e*KL!bEb)WGK`BRY8%$)azt@3GNdr1u;y^)az%0Faz}CJ z@dihoS2fEnU`5yQj}PdnV+YZQIeaZ$ymhBz`(GQ zp-6;*fuTrbau<`ipfCdi12@P7kWm~=n$nZ+Fd5bJCl(awl@_NK73-zt7v&Zgv4V84 zF)%RPVol3QEY1d-R0OiMh!Z3Q3a28FIk&jM^6@$O>6v*&JRmt<5Wxo`_(28;mZuhF zSEZJw>lLRamlkD~R2B(BM&17BL@>7BLFx$VO9VD diff --git a/app/campaigns/__pycache__/models.cpython-310.pyc b/app/campaigns/__pycache__/models.cpython-310.pyc index 805d85ba625375bebb2cf37c390b8b039fd7d292..910fca175f8aa54508b9bbdedf9b20c0317399cf 100644 GIT binary patch delta 174 zcmcb~+0VtB&&$ijz`($8!|Y|+`Hj45nYh>(7#JKF7#NBJCdV_X7_v7rq_Cy1_cBLu zq_U)Nq;i7!%qg6`EKyu3T&dh?Oex$cJS{9yJSn`v44QnC*_rjk5|c|Z%ThI&ibNS0 z7;dqrq^2d7=9Ek}X3k}loV<`(o{@L*L1taSB6bD_h9U)!8s_4Xq9T>a^I60v^RRI7 W@-Q$ka4@hi3NQ*V3QbmI*#Q9VlP4hn delta 117 zcmeC@y2;6#&&$ijz`($8N909X<3`@KOkAuC3=9qo3=G9~lj9jxIW|WwGnpvKad-7{$UG`hd#U({WN|QBN U6uCjBb1<+l3NQ*x4rkc`03C)I`Tzg` diff --git a/app/campaigns/__pycache__/routes.cpython-310.pyc b/app/campaigns/__pycache__/routes.cpython-310.pyc index 4293027ece7245680b6e2e8969f1c2ef7bf17f62..7d8d6a222e055d10c20450647944680e88778c94 100644 GIT binary patch delta 702 zcmbQnc9nxKpO=@5fq{X6&*o*CHSw;arg@kzCOzQ81q)M=Vz?N({{A z%n^?gPi0;pk;1i*F@-yYtA(MNF-j6F!n2Sug*Sx{EFzU+$QjI_$^R1MFipl=Oesm4 zjJG(G6LSj^Gt={mH5qTQgche3X)@m8aE1y_eDs5tje&t-B}0)g0|P^m@Z{%=*7ZUR z3=BLB3=G9g3=9k$OjXh_GvW&p(^K_r;M~jr?eIN^)~R?t}?z zvKFy2FfiO=Ei6qfs=URSmYGwMS`?pDd5bkIv#7YF2;>P(rd!-F4e^;NMPgtd!3hzN z0laVpAg>63+{wYfz#zoL!pOwP_PI+_m3e_! z3g<$`6s{D`7KUcVDDf1IUN-a&-D^5)=Ey^sZEaC%6@`DHgkP4>!;#;gm`K2YPMIbjo z-2{>rV$fq?C=v!K;;_lhPbtkwwPOT1QG|hkfro*Ik%v)+NrF*;k%y6kk%Nhk5dcX# BMpys< diff --git a/app/campaigns/campaign_api/__pycache__/__init__.cpython-310.pyc b/app/campaigns/campaign_api/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f66d7e39d77f23479609c0c8c58f4d7777f96ef GIT binary patch literal 396 zcmd1j<>g{vU|`s0`!Y?9k%8ech=YvT85kHG7#J9e^%xi!QW#Pga~N_NqZk<(QW;a2 zQkhbiQ&>`1Q`mZ0qnJ||QrL4?a#^ET85vSIf*CY9UxG~1WW2@clvA2oP?VWha*HQ9 zF}ENwGd(Xpu^{snXGv;qK~7>xYVj?$;*!LY%;YLwePk7y%(wVqYU0!Kb5c@^Zt+4? z!njWMX70-6`G8<*oyK?OHzydG}&&krsX6SXBROsFfiQWh>y=p%uS7tFJcC9 zr4kDY^kDWB!&x9V6>%~!Fsx)K;$>if5WigXGxBp&^(!-ri}F)*jPzYni?d7e3-kjr zbE@+4^%DyU;7%@vvp`1a$H!;pWtPOp>lIYq;;_lhPbtkwwPOT@rT_y20}lfW6B8o@ Jvi%WY0{|o~b2tD1 literal 0 HcmV?d00001 diff --git a/app/campaigns/campaign_api/__pycache__/routes.cpython-310.pyc b/app/campaigns/campaign_api/__pycache__/routes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da862d58291f011eacbedc03296aae65201636c8 GIT binary patch literal 406 zcmd1j<>g{vU|`r{`!a0<0|Ucj5C<7EGcYhXFfcF_>oG7eq%fo~<}lq%gNIG&4rArmzMxXtKQonY5De7JpG{UP@|Fd`W6x zswU$tp5(;bg2c@9y!ga|%v4FoPzO zUlk8jhh9cWZcY(M*-C~YHUZn1)m0vm&H8HB|SlIO6=%}*)KNws5yd60*JhmnJsj}ZV{MPQx) literal 0 HcmV?d00001 diff --git a/app/main/__pycache__/routes.cpython-310.pyc b/app/main/__pycache__/routes.cpython-310.pyc index be8b20e28d1e4ac1ab8144f6ece151cafc728270..9afe769d88c29c30b3e154768d615b9ea77132a5 100644 GIT binary patch delta 564 zcmeBTo5s$U&&$ijz`($;!~SKOI`c$68OC`NwGHbT8B!QhSaUdXIiompxuUpoxudvq zd7^l7d82s2a%?$#x%^T5xdKrFxq?xGxk6DwU~%>w;arg@kzCOzQ81q)M=Vz?N({{A z%n^?gPi0;pk;1i*F@-yYr-h-JF-kIpGnhe>_a(>`nvA!YQj##w?~3#uTPr#s$m^ z8EP3ySW=j47*beznSvQKS^YvZ8E>&ACYNNErB?A~JJs10d3iN)DP zU<27frh?2U;smik(Q=C$EFYhfpPrdl#0?VW0TH|)f)C_G!Sd9i?5fn#biLx#<&3@HpL ztT{ZnyivTld{KP4{89Y50#O2Bakd=6T%jnTT;V8TFrPg~Bv&L#1kC2h5seZ}WnLhb z!nu$!g)4=-g`t@-N<4)lm_d_g;yIa#-ws)W>}O(NU~pz&U?}EbU|=X=NMUSd3}(<| z@~h&_$j?nJNK8-F%P7gs(PS)QWnf@f$xtN7z`#%>IN62CUWgB*4`cubbCECu1B0f- z!;#;gm`K2YPV2h!S0!a%p=rJ%934s)G o*yQG?l;)(`F@oGF!oa}5!@$GH!zjZf!6?AU!^pwN!OF)700CuC)&Kwi diff --git a/app/users/__pycache__/routes.cpython-310.pyc b/app/users/__pycache__/routes.cpython-310.pyc index 1bac2aab920e3c762a0f8247f53ba31b0cef2dc0..7388388c2fe97e0881d4f23cb0bc8603303e1423 100644 GIT binary patch delta 250 zcmbO$-Yd?V&&$ijz`($8#{6a4tBt%HnfQ2f6EpMlGV*g%3lh^)H=ku%%qYs(%-GBr z%uphd!d1hN!rjXh%%I6Lxs|1FvJ&f3MxDtgSOXbNCQGs9F^W#^WOHRS-F%+ShLO== zG7pDFtSAEmLzPfbYIn?iUPei7PLVbP1B0e$5eEYULy;bcU;zpUi3nH8+&u5dE9L?!vi(jY<&L>Pbw84$q(BFsUA1&9y^5r&f+IZPRKCvWFSV6>Yo!Fi3* iVe)%UTSk}3x?JA`OhHP_K!hELaGBiCCNbHY+X( Date: Thu, 19 Sep 2024 15:23:11 +0300 Subject: [PATCH 19/54] requirements --- app/__pycache__/__init__.cpython-311.pyc | Bin 3753 -> 3898 bytes app/admin/__pycache__/routes.cpython-311.pyc | Bin 1175 -> 1529 bytes .../__pycache__/models.cpython-311.pyc | Bin 1491 -> 2011 bytes .../__pycache__/routes.cpython-311.pyc | Bin 1084 -> 1649 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 483 bytes .../__pycache__/routes.cpython-311.pyc | Bin 0 -> 565 bytes app/main/__pycache__/models.cpython-311.pyc | Bin 1732 -> 1721 bytes app/main/__pycache__/routes.cpython-311.pyc | Bin 1070 -> 1350 bytes app/users/__pycache__/models.cpython-311.pyc | Bin 3271 -> 3143 bytes app/users/__pycache__/routes.cpython-311.pyc | Bin 6079 -> 6061 bytes python_files/db_population.py | 4 +- requirements.txt | 39 ++++++++++++++++++ 12 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 app/campaigns/campaign_api/__pycache__/__init__.cpython-311.pyc create mode 100644 app/campaigns/campaign_api/__pycache__/routes.cpython-311.pyc create mode 100644 requirements.txt diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc index d2ecd53624f7f7cbc0460ccb29f48adeb124f385..0dc054c5da98cd303ea99ff4cbf87394898c17de 100644 GIT binary patch delta 484 zcmZ1}yGxFDIWI340|Ns?*PGXAF&lYrFtVwzFfg=pZ+^`f$;8M#*_FkXk$ZA8OPoLo zOA2?6Qm%3>CnG}*`vR58fy|;UeFfcF(frNrL8*nXTv^2lK zf`V?a$X`H34_J7wvnX6*QCJ{zkwxzci{1qmy$3Aplb><>F|tiIPO4o|@a8&RenuHXM)3~}m_!js F3jl$?al`-s delta 377 zcmdlbw^EjOIWI340|NuYiW$$+R&3jk~ z7#1i^4rCUcY``kQ2w_FRSuJ4JM;1*+<;j7}A{Hs!%NQ9LRx^T(2H_N*7KUXE3=FG5 z95AlstYIhtTMgziq%j3EX!366XPd$}c{BTdM*GRd9BPazn`dztF!FFF78K|ursQVk z6)8{t&MD8xJz1Q~+fTjOQwUAL%{sIdM`oPA($}zc|$B&U?@-ZGCM(xSMyz>S0Ko%H)2tyEIH2Dy( to;=8?A~g_S9z=kw`o&?Bo1apelWJEKxS5}ipHaquQTzh~CQ$^^0st*lQ@Q{E diff --git a/app/admin/__pycache__/routes.cpython-311.pyc b/app/admin/__pycache__/routes.cpython-311.pyc index 37ca68962124cb4418706431ffd2e9e3d3eb3ab0..4c44e7b5afccf4731ec9f0a944e0fa13e3920098 100644 GIT binary patch delta 933 zcmbQv`IDP(IWI340|NuYoJFtFjF~6$Nig1-sBT=($dJO2!kWX8%NfN9X0zpR<#I=H z=ki4Hfcfk>yt#Z)e7XEl{J8>A0=a@wg1JIbLSQ+L9N}D%D3M&zDA8Q8D6w4eC~>ej zXO2X!WRzsCRFo8$&y^#cD;*^bW^?DrM9DBQq%vp8GB7acgPg>W!n2H#fnhZxn8U!p zkiy%-u#AC$VKq#EAxbWVJD5R}Z{i18amHI5&WX7NiJ9qnnvAzNT=Mf0OEUBGCi5^p zuV-aoU|?ooVE8#c`qsbwtTgs?zl z3S$jJ4dWW7Wy}l=t3i$f2{HsTXfpd%2`8rHX69uUmlT2hpqEjSo3oPX7Hes7YEkhm z&Sa=Ri#1t`Kwi7WT3DJ|RC$XzF(;=8zWerZW+v0g!Ckr)F51DN0indHX6z|g?( zlt-Y)tKYB7?;?-P6&{%e*Si7|Q~0h6C|wdzx+tJ>ML?y&^Dej41!;pDifT7h^**pN z@rWCIWMJYk_yQt6Ffg$iddw;J}|*V Iz`|gg01JlF#sB~S delta 595 zcmey#J)M(pIWI340|Ns?QO3pvg4(0+U$1CSwr?0|UcKhR+}~ zf0;O2#e^2878S?%q~_(9<;S?B7H5~_7sQ057MBF27Uahy78JxJrsQVk#T4b2mZTQz z6;u|9fWitya5FG46bmviFf=ec<(9f2ZE%s>@Cvu#1s201aRvqkP3c?Ai3J5kAV=Qf zOe`qSn|z#Esh%IiDh1i9mzH0YTU^8jGLM~sf#DWwT25kdHrR{tBbq2PT*ZSQzYU09CGp_5c6? diff --git a/app/campaigns/__pycache__/models.cpython-311.pyc b/app/campaigns/__pycache__/models.cpython-311.pyc index cd2c166f67f360ef99bd6c703c9365cd40565042..f331604edfa6fdb9b501e8853a55318bfcbc15bb 100644 GIT binary patch delta 948 zcmcc2eVdQ z6raKw%%I72i`OwXDY3XXF(tpqH?iOrUm~0vpPN{4izzcDWF_M*?t-Gs+{B{F`0Uim zTinTsxdn-t>3Q*)DQ+tnZ*k<6=Hw(M<)q$XFD*_jiqA~()8w4&!t5*{%D})-B*DPI zu#(|3$RU%DFj>?W34laF1SbOnLvcC-149EG-Vjk~@Vy}-HNkC$$pY~O;tM60NbX>{ zAYyw_#P*7aZG#g;&US_R3iXwmYczMHUJ!A)DB^NO#HGO-B4@cEeL?!d%q5vSR4<4) zToiG*BI3~C4uVB;3=9l1VEdCn&VgYzDC6^z$qvp|(I zL~*5XrE;e+rEs^fMDe8X1T$#z-r{hEhR!VxSU434F)%QM6bUmhFx+A-$t=l9bt@7B zao7@*OESw+HJOUUL0tBf)U?D>rks+=F-&3N$_xw)nvAztic@paiWwOg7!-=+85kHQ z|6!74l$!sh>>vV^lEAhXf&5qmGO~yRB%uPbkGZ&{ zs7MpUl?4%?&;eUfqzK}I2tiN`b)m(O95jZ4@kWvP0+$6Y3*DBuZ3w*}VtrA>`ih8k zgDWJ8EEa?>2wxbvByxx736={Yz86J&uZZ|IxP9Q5Y{8(aIWI340|NuY>x<9Qs+cD7Nia^BsNT<(!Wzt=$vN@SJjOYb8yVduKV(*` z=gb1D1gTEpNMTIjT*I}DnSo(7Ge`u4qqtMJQ+d*uQg~WeqIgqygBdjWZgDs#<`yJo zrsv(_NQSYPGE+h{8EM(bkU_QfThRaO1Ic_UL zFYp*&lNH!l zc_5AfxkFQUvKd>kiaN+ia2NjKu*uC&Da}c>E7D_NU;u?v@i~Ucm)K@oaj-LLe_+5Q SI*NKKK7z!*fCw}dVCw*=lcs_I diff --git a/app/campaigns/__pycache__/routes.cpython-311.pyc b/app/campaigns/__pycache__/routes.cpython-311.pyc index ae844414b5c5f144e7b8ef9265b8059741f0e872..8e9825d9a0f53a1df580b1004cadb236f305514c 100644 GIT binary patch delta 1001 zcmdnP@sWpbIWI340|Ns?*PGXAe#{g3Bp5$UR5z|?WJqC1Va?&l<&5IY<%;6U<&NUc z<%#0S<&EM6%dzF~3N$Nc^LiJ85kH=GJFP^{L9SQDkiizwWv78Cp9m> zEI-C2wK%&ZzaS$j4wz`Pt~`9b2C%ylHuNCU|?WjU|?WoU|{&%!N9;UouLHe5-84st6RVX6+)qE z7}hYN`h5X214BKE8Zc)W0|QcU)H0TEf`!3E3R4Z^8s=q83=FH`mIO0sviNB--eSs3 zsS<*_9OMzbjFQ|OO~zXsFi}m`A~psFhFh$KrKv@gw>Z->>vKv{i{g_iZ?UFj78REi zfkIf5=@vIkM|@^VkrV?1LovuY1%)DUkak|UEXbB3c?Jds0gxJJ1_p)(hNt}EJ$2Xl z)i3d@udu$ruYQr={0hJMb$;7R{I(bQ?XU3LH+bCTmbxIVe?vt_`U5i~kKRWHMjpK{ zAmRf9BdcB!C{i?~C)Y5UMTjI86zIY1E7r@+Pf5)whWa8cC$Tsi?BpU2P^^ListA-J zinu|}I;5i6NCa zOAKTU2&Zr^V`N}h%?M(Ha0*uo!!ia2hSeYr7)P;-r*H%_XmU@MV^rMi&B)ED!^XhC zu#(|3NcxwBvsFxJacWUE0SkmU;qVA@f(K8 c&aAeK4<^rNm7TnSwTq8|kUz`)S;=5?ALBLl-@5C?|Yp^VRV3=9m@8B!Qh7;_kM8KW2(8JHMS8B>^2 znNpZjSW;Nmuq|U{U|7uxRnHK`oWhX8p2L#M8pX=Ukirqnpvn0XB&o@Gi_W)ZBuc#FEtFTWrN8i6xoIRlNGhDm0mI@x#=_r{(9Q zq!!)cg{Xvaxk`(2;tPsW(=sbG8E>%_<(HPE7W-+k-C|A4Ni5DTVrF1qxWy44pO=`M z8XsT80^&*~78K~g>?ww`KyE4mh0RKa&mgD&a&@+f2`x@7Dvt3<&C4&#k8w#Y&MwI> zhzZEdsmjZbNh~Ocfg1y7fsBcXkI&4@EQycTE2#X%VUwGmQks)$S0u>5z`)4Bz)&2@ zz`*c$93l(lat=zrj35itD7z#?Gy1w=IPeBfbV P)Vsi-i;0T(85kGUz`)S;=5^XO1_p-5APx*OLm8g~7#J9)Go&!2Fy=7iGDa~ng4j$sOu5Wa z%!~|745`dnEKs!!Da^|l85mYG!uc#M49gf87*@js7@}BHSc4ff* zWMD{PM0G+igC>(-6%W)Dy^NCFoFb6cl?d}P0ZgzmFfbGgFfcGQFg)d! znqha5Tk8t9)&&-=B2ESd20u-TZlX-=wL5g!8s11JEBV;C41J}@&fGTvZNynu>sFc@DzMIYE0 pm_!<6t}qHu@Vv+|9I?sVpg6 zFg`DL3U?|`8dC~S3riI5#$%ZWAlW#JeVHBCXjM;>dZ}M&CAbm*&28JRj1_p*( z%*7=|Me+;`3@aIm6hNYKAVLsEa56A36rY@&%aUPrLquwV+YHME=?l^qW-iIxp?X2Y z;i8Dc6%mI9cZi(r3iTE0D>c_>?nu2L;&M^M<%)<)gZBrn$-J!Ej0%%2S=-qlR!ly| dy4#tD(V6iB19q~bsHfs1Sndm$#8d}%EC6rkPfh>; delta 389 zcmdnVdxV#7IWI340|NsC>!oLDvzRyXMKdz~n4HBpJ0_Kti6NCMg>xAr1H)=YkP;AH z#>Bv|nhC@L;V5n1C!=aVIC{ z79?h-=jlzp#dMxgX!0s%6Gr~Y_nCtnKyJGQRv4d|atp2y#9=NjDJqg>U|?9uP$b8| zz)&OuA_QRsCj$dR@$tzCEE#qW_(VF=CWOz(nvu0a@}iva6*=RJd?r`;Od8y82uVy( zn<2hHYk}5^*o#WmSCp(T3fWu{vT5-Cz{1Gt%s4}NG9RnlWCd0>rXsn?daUhi5W6Pt eX5H<~#pulVfdM<&QPflM5iIuwOk%17yBYwnVqm}k diff --git a/app/main/__pycache__/routes.cpython-311.pyc b/app/main/__pycache__/routes.cpython-311.pyc index c8ef39f7e5f10b7c7037632d6f40f54f517cce52..ba7ce08781a72c4acae3370743b2b6d87db14f53 100644 GIT binary patch delta 786 zcmZ3-ag2*^IWI340|Ns?*PGXA>dX`QBp44&R5z|?WJqC1Va?&l<&5IY<%;6U<&NUc z<%#0S<&EM6%dzF~Qk6&7}l^XV`5-f4YwqiL6g-lM3eCrTViraW?5<#Z$^G@ zYC&Rps$ND(Zq7=^TLKV?_++S0iZxk_*cccXZm|}YrWRG+;!MlTDM>AgPpZ7doS2hS z#LmFLP$bI0z)%eGlfo}UXRDad;?$zz$)ZdGtO1!hRe6(jnB>Ey85kJ&LCTyN7#JED zo{Gy)sk<(&e@R?_L&*hk{fpu@SHx|ui#uErcep6-bVc0h0*lC9ZmAjeH*{=1Ff;Pl zePm$dvHJodJ}@w{+IO9^Aotx%nxnImJ*{r{yFTXG2`c0dguR zgo;3ks)!rpD{ioSd`^CPW?m5wNC7X1-~$o-lkYQ$I|zW7f*?W&q=6~F_!etXerZW+ z5y(p`8H!{;a#9Qo48J&Ra`RJ4b5iY!)EO8UK;co$z&P2G*;e=lgXRTP^k8xWv%=&) kX3ohAn6p%v8SOqWFf-bHWM*KJyuv8)fe9u876#h^08i_#BLDyZ delta 508 zcmX@cwT^>tIWI340|Ns?QO3=*2BwL85{z3WsvFnmazt_Daz=6Haz%0Faz}A9GNdr1 zu;%dO@<#FI@I;5i6NCa zOAKTU2&Zr^V`N}h%?M(Ha0*uo!!ia2hSeYr7)P;-r*H%_XmU?{BQsfq@sK|=0|NsH ze^y{%V3^KO0@usHkiv*+S}=nqlV25YMt*K;L1KEUUPei7jwWLf8v_HwN`}uM<9``X zKEouz9+FyI5|mmn`6ZLQ8pv&Y3=9m#LJSNH4Gdq|79rA3(~l|}p@NdXWc$iTpGiz&bO7Hd&{X-R4k$R$O>AQ_OIMWPH048J&Ra`RJ4 zb5iY!ud0c{bIWI340|NuYoJFtFer@E9V`OyOoWm&1Xpq92%A3ZN!q>tQ#g`(SBGAGZ z#h)sWBG|&PjDdk+HAoK_M+v3~1v6-hOuoxhFu9QVB%|17YnF+OjB=CDvZ^x5PyWoR z#V9pdjxCo_adQt_A)|mM0|UcLkex-U3=9lKT9bJ>q@>gt7#K7;igXwl7;dqpq$cO5 zq!zJ&qzxuJau_hmPcGsxU{ssDm}3K*5=g1gEApEBfP0O#7NhY8227&EsK;VLuaa@vjIWI340|Ntt?4@UEpEmNwF*4?C&S8{h3}a$Q<;~&)Nr7+*Zwg}y-x~g9 z%nS^xnL#2T9L1j^kSdVIlp@%|5+#@-mLlB37$uY{oFdY~u#AC$VKqn*7)Obuhz2ug zicj9oRG`e^lAo7Yl9``(i#??>FEKYWS(E7&ds1R@c2R2DEtZ_bs>;b~%%>PdH-BWF z$jGQPxtUd!QF-!8RxL)!$yZo&8C5qsu@y49=rS-cyac(vNRxqqp-7K`fkBh$7F$kg zYI$PiEw03z^!%dCl8oHqB5jZqN09*o1H&!0l+@(>l++>?kRFrC-`Ncql_zU(7%-|% zj^xp{A*KlA(OW!4sX1WR7H4D@+~Q1uy1n=ob8$&gkqXEZbC9__#U+U) znaR1SB^miCMUD&%3@aImR6)|pAVLsEa56A36l+ah%ehDDhJgG8rYZajxHh;Qkh~z^ zeNn*sihy^6=Le3-*<2Bfs*{g!B{3RIR_B(N@&ajxoA!&tCO1E&G$+-rC}45|_Zn+W aM&l0*m_&zBkHv(@k06;ZAOcMd*m(d90f;C7 diff --git a/app/users/__pycache__/routes.cpython-311.pyc b/app/users/__pycache__/routes.cpython-311.pyc index d2f67ed7f45db8128bb79cfc5ba9643d48f90fb3..7f81342c0674a73eb789c58ac34abd92b75fb38c 100644 GIT binary patch delta 367 zcmdn5zgC}jIWI340|Ns?*PGXAuQu|=vheZdCT8a8W#s3k79^&pPOfCx!&o-ij8$E5 z0sln_gDVmS7x@jZ@Ecy>Fx;Ha`iE(647*;cZ3p1!*dvh*j)Svv3Q^Uxdfq_Aafq|jel#zj!shvLHeeL>PexIS|1MB5Xi}Er<{S5yq1p1WXzACzlBrGCFTw zAt1)g=r(!3umYpk<_E&_8TCNkD6#^nbOsS#Ai@$vD1itC1_p*-95%W6DWy57c12;E J*NO@;0RUgTS=0ak delta 388 zcmZ3hzh9qsIWI340|Ntt<;7=dZ#MGAvhefeCT8a8r6d+-B;_X-rA)41*~3^q*_2gX z=z@a5MG3mr;_NQ>4$pz@RBw#L2+GP-FxmSV4pgh>!&lnjpd$M96^%UJzjmBJ4nf z2#7G5tS4Z~XfQcNz>v{p^E3f5W=8kPYlRgUy*Hl|p3kTU@<)+1NTmyi@CFf9AVLX5 aC@?TE{Nk|5%}*)KNwq5q-#lAXhzS5`lVGv{ diff --git a/python_files/db_population.py b/python_files/db_population.py index 1f96832..a6acfdf 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -9,8 +9,8 @@ from werkzeug.security import generate_password_hash import random def engineer(): - engine = create_engine('sqlite:////home/yisroel2/Desktop/Pilzno/instance/site.db') - # engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + # engine = create_engine('sqlite:////home/yisroel2/Desktop/Pilzno/instance/site.db') + engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') metadata_obj = MetaData() metadata_obj.reflect(bind=engine) return engine, metadata_obj diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8fe6503 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,39 @@ +alembic==1.13.2 +amqp==5.2.0 +billiard==4.2.0 +blinker==1.8.2 +celery==5.4.0 +cffi==1.17.0 +click==8.1.7 +click-didyoumean==0.3.1 +click-plugins==1.1.1 +click-repl==0.3.0 +colorama==0.4.6 +cryptography==43.0.1 +dnspython==2.6.1 +email_validator==2.2.0 +Flask==3.0.3 +Flask-Login==0.6.3 +Flask-Mail==0.10.0 +Flask-Migrate==4.0.7 +Flask-SQLAlchemy==3.1.1 +Flask-WTF==1.2.1 +greenlet==3.0.3 +idna==3.8 +itsdangerous==2.2.0 +Jinja2==3.1.4 +jwt==1.3.1 +kombu==5.4.0 +Mako==1.3.5 +MarkupSafe==2.1.5 +prompt_toolkit==3.0.47 +pycparser==2.22 +python-dateutil==2.9.0.post0 +six==1.16.0 +SQLAlchemy==2.0.33 +typing_extensions==4.12.2 +tzdata==2024.1 +vine==5.1.0 +wcwidth==0.2.13 +Werkzeug==3.0.4 +WTForms==3.1.2 From 39e5127f3f53b4fc49fd7f297544fd56fb21b221 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:01:18 +0300 Subject: [PATCH 20/54] active campaign to html --- app/admin/templates/administration.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index fab3b36..a0d5171 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -35,6 +35,7 @@ # Title + Active @@ -42,6 +43,7 @@ {{campaign.id}} {{campaign.title}} + {{campaign.active}} {% endfor %} From 0b78e121a27be6c5878be3f5f70456d5522ad9c1 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:01:29 +0300 Subject: [PATCH 21/54] add goal to campaign --- app/campaigns/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/campaigns/models.py b/app/campaigns/models.py index 882de72..c4ad19b 100644 --- a/app/campaigns/models.py +++ b/app/campaigns/models.py @@ -19,8 +19,12 @@ class Campaign(db.Model): id = Column('id', INTEGER(), primary_key=True) title = Column('title', TEXT(), nullable=False) active = Column('active', Boolean(), nullable=False, default=True) + goal = Column('goal', INTEGER(), default=0) + + def get_donations(self): + from app.main.models import Donation + return Donation.query.filter_by(campaign_id=self.id).all() - # donations = db.relationship('Donation', backref='campaign', lazy='dynamic') def __repr__(self) -> str: return f"{self.id} - {self.title}" From 5582af5ee7ef6da4f3ad54310bd93d7cb688f70a Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:01:48 +0300 Subject: [PATCH 22/54] start campaign page --- app/campaigns/templates/campaign_page.html | 32 +++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/app/campaigns/templates/campaign_page.html b/app/campaigns/templates/campaign_page.html index d5aba23..9799862 100644 --- a/app/campaigns/templates/campaign_page.html +++ b/app/campaigns/templates/campaign_page.html @@ -1,5 +1,35 @@ {% extends 'base.html' %} {% block title %}{{campaign.title}}{% endblock title %} {% block content %} -{{campaign.title}} +
+
+
+
+
+

{{campaign.title}}

+ + + + + + + + + + + {% for campaign_donation in campaign.get_donations() %} + + + + + + {% endfor %} + +
#AmountUser
{{campaign_donation.id}}{{campaign_donation.amount}}{{campaign_donation.get_user()}}
+ +
+
+
+
+
{% endblock content %} \ No newline at end of file From 816c1d697e4937a0abdc1d11e445ed9f42c8c44b Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:02:01 +0300 Subject: [PATCH 23/54] add anonymous option to donation --- app/main/models.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/main/models.py b/app/main/models.py index 45021a0..4829f2b 100644 --- a/app/main/models.py +++ b/app/main/models.py @@ -13,11 +13,11 @@ class Donation(db.Model): amount = Column('amount', INTEGER(), nullable=False) user_id = Column('user_id', INTEGER(), nullable=False) campaign_id = Column('campaign_id', INTEGER(), nullable=False) + anonymous = Column('anonymous', Boolean(), default=False) - # user_id = Column(INTEGER, ForeignKey('user.id')) - # campaign_id = Column(INTEGER, ForeignKey('campaign.id')) - + def get_user(self): + from app.users.models import User + return User.query.filter_by(id=self.user_id).first() + def __repr__(self) -> str: - return f"{self.id} - {self.currency_type} - {self.amount}" - # campaign = db.relationship('Campaign', backref='donation', lazy='dynamic') - # user = db.relationship('User', backref='donation', lazy='dynamic') \ No newline at end of file + return f"{self.id} - {self.currency_type} - {self.amount}" \ No newline at end of file From 57c0e317cc5dce0fe01794e80e62b7ee902b7b4e Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:02:18 +0300 Subject: [PATCH 24/54] change usr repr --- app/users/models.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/users/models.py b/app/users/models.py index 6f697a7..bd9fa9c 100644 --- a/app/users/models.py +++ b/app/users/models.py @@ -14,13 +14,11 @@ class User(db.Model, UserMixin): email = Column('email', TEXT(), nullable=False, unique=True) password = Column('password', TEXT(), nullable=False) user_type = Column('user_type', TEXT(), nullable=False) - - # donations = db.relationship('Donation', backref='user', lazy='dynamic') def __repr__(self) -> str: - return f"{self.id} - {self.first_name} - {self.last_name}" + return f"{self.first_name} {self.last_name}" # donation_id = Column(INTEGER, ForeignKey('donation.id')) def get_reset_token(self, expiration=600): From 8a3d0824588f6ea97f1a32eec990885a402e4953 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:02:36 +0300 Subject: [PATCH 25/54] remove non relevant info from usr page --- app/users/templates/user_page.html | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/app/users/templates/user_page.html b/app/users/templates/user_page.html index 384348b..51bc66f 100644 --- a/app/users/templates/user_page.html +++ b/app/users/templates/user_page.html @@ -11,26 +11,7 @@
- {% if user_reports %} -

Downloadable Files:

- - - - - - - - - - - - - - -
Report TypeNumber of RowsTime CreatedRange StartRange EndDownloadDelete
- {% else %} -

No reports available.

- {% endif %} +
From ab8e276db8f55b8c88ffc95bc4ed44fb81e582c6 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:02:54 +0300 Subject: [PATCH 26/54] start adding funciton to add ambassador reltionships --- python_files/db_population.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/python_files/db_population.py b/python_files/db_population.py index a6acfdf..18be70f 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -75,12 +75,14 @@ def insert_donations(): donation_table = Table("donation", metadata_obj, autoload_with=engine) currency_types = ['shekel', 'dollar'] - + boolean_choice = [True, False] + with engine.connect() as conn: for _ in range(100): conn.execute(donation_table.insert().values( currency_type = currency_types[random.randint(0,1)], amount = random.randint(1,200), + anonymous = boolean_choice[random.randint(0,1)], campaign_id=random.randint(1,4), user_id=random.randint(1,9) )) @@ -100,19 +102,23 @@ def insert_campaigns(): )) conn.commit() +def insert_ambassador_relationships(): + engine, metadata_obj = engineer() + user_table = Table("user", metadata_obj, autoload_with=engine) + donation_table = Table("donation", metadata_obj, autoload_with=engine) + campaign_table = Table("campaign", metadata_obj, autoload_with=engine) + + with engine.connect() as conn: + campaign_ids = conn.execute(select(campaign_table.c.id)).all() + user_ids = conn.execute(select(user_table.c.id)).all() + + def test_selections(): engine, metadata_obj = engineer() user_table = Table("user", metadata_obj, autoload_with=engine) donation_table = Table("donation", metadata_obj, autoload_with=engine) campaign_table = Table("campaign", metadata_obj, autoload_with=engine) - for x in range(10): - print(random.randrange(1,4)) - # with engine.connect() as conn: - # campaign_one = conn.execute(select(campaign_table).where(campaign_table.c.id==1)).first() - # donation_one = conn.execute(select(donation_table).where(donation_table.c.id==1)).first() - # user_one = conn.execute(select(user_table).where(user_table.c.id==1)).first() - # print(user_one) def delete_all(): engine, metadata_obj = engineer() From 45e9b3a9bc73f3e511d66db0749be367167379a1 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Fri, 20 Sep 2024 12:03:02 +0300 Subject: [PATCH 27/54] cpythons --- .../__pycache__/models.cpython-311.pyc | Bin 2011 -> 2490 bytes app/main/__pycache__/models.cpython-311.pyc | Bin 1721 -> 2195 bytes app/users/__pycache__/models.cpython-311.pyc | Bin 3143 -> 3105 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/campaigns/__pycache__/models.cpython-311.pyc b/app/campaigns/__pycache__/models.cpython-311.pyc index f331604edfa6fdb9b501e8853a55318bfcbc15bb..44cb707c7091795b3c9f4374a6d907d99ef73216 100644 GIT binary patch delta 649 zcmcc3ze|{JIWI340|NuYa{aeyNh}-rdYBonO>Sg#oBWVD(1nR1l_iCXi6NDB83O~u zYLGfGPT^j|vy7R6VKp3xLL6fmam4Sg_@&p#K`XUAfhUp9`j44bx47rT8jEoF5j9DN>U{e>s4F_|f zL=8h03zW&QhItty1H)=Y7=HmPjD<|2Iz5;{lf@6>l6uBl94`5Ji6xo&d76wxq9E6? z-QrIyDA3DI%*@lv%}+_qDK64rU|_h#T3DJ|RC$XtEiS75728Lp51_p)( zh8r9@7f{g+e(|2V>-_4M_|-SKY;nK9uYQr=<_f>fb$*9S{05 z2TKfVkuHe!ibaD_cCs+5CL{l3TUK+yA~gmEh9W(XtC)*Rii!*;SF=j6i*6I zFoP!VNg`-e4+S%5viKE&Y|&)A#S&VaTBONX zB+S6TpviViAhDo8ue3O|s8}yIKP5G%xJZtHf#DWwVQFen{nti~J^6_)V_!TV3L}y2x*Hh2Q1^hs|e@ z2PfZQDikPE1{ntm1%)CN1_p-7Jv9ySF)%RrX$nrh&m3)9#L2+GP$Uf^ zR6*`%E-oo5(qv#@SjhlZ2i9C92$Ba8Al1cRCMU2gFuoxoHNkC$^$PYC>?=9faPBa@ zAmVsY#PN!VV}s`h7A98P4-9aEgOSylafb3_K32KO3ao5QMQW4vSevBuLB@hy1GeQC rhfQvNN@-52U6I-3Q><&8`52uUKQLe?JBoTLK7!@GfJsbsVCMq>pd_YP delta 251 zcmbO%xRaM}IWI340|NuYoJFtF)L1t1MKdz}VVIoF_)aK=JC!GmDTSwnC5ktNH<&?_ zZ}MEGqRDGm3b=2v6sP8-6*Dq0FiaL?F`KN%D$OV|*^5<|<1@%CKTW>L^{mlqx0s7d zii+eJ7#LPE6e%z;Fcisw2tgRZ$-ux+d~z~B+XAK!T$AsxX)`KJ=3sAp-6ApnZ)J9Gd5 diff --git a/app/users/__pycache__/models.cpython-311.pyc b/app/users/__pycache__/models.cpython-311.pyc index 4ee2b6bc5cc912ae3e0143d0a5a031cf49619274..53683c1b53466dc2b5e8741be302ccc635fdf1e3 100644 GIT binary patch delta 331 zcmX>uu~33{IWI340|NuYa+9}dZ#MGkF>^69Fff4dXO+pW%*s4-nS&WLnfz`sDrhoI z?q<%ClVV_CXkfS@BsN9=0>8-xev<_*OZ*_L3mhh!Wm!@g8RaK8v#K&GOkT-4gHdU- z6I&spixvX|!%L7=MQRKT3`N=u3=En~x7c!0Q_B-8Z*e8&q~{l9mSp4>7ioZ`IEr)` z7#MD`rKBe3r=%9KfbEZ3q_Ey2}mJNaYEBxBvhE delta 369 zcmZ1|aa@9TIWI340|NuYoJFtFer@E{W9DLIU|?WoU|{%cGTD_`SviHVh9Qdyqy&U# zGt6ZTX3%8vt72BrRnTNE5@ujvm|Vh~rJ=&Wz|g>OLr83j`UQTc3;a$qQs(4CSQ}Kf z=s{Q)IGi^BVNPXal$)Hys>&!oxr22EqvB>own9c1O$G*rmms$ksWLDy6lpOqFlaK} zV#`TQEl;ex#g&+oo?nz%l95|nqz;neDAHkIV7SGWlA4^Kl3K(9(ql0B8oL3b{A6~H zhm1;-UvgwyD1d~GK?-?_OA<>mlXFu`GV)W3Y#A6BRx%VRf~4g^gdmLIWME(@7Mk3{ zc|gXQafb2-21ZtAMoe;YGM5#j;^cW;NsKy^8M)=9TtEiE&HKe+lbfGXnv-f* Date: Sun, 22 Sep 2024 15:07:15 +0300 Subject: [PATCH 28/54] archiving campaign --- app/admin/routes.py | 2 +- app/campaigns/models.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/admin/routes.py b/app/admin/routes.py index f10b042..9e9a4c5 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -13,7 +13,7 @@ import os @admin.route('administration') def administration(): users = User.query.all() - campaigns = Campaign.query.all() + campaigns = Campaign.query.filter_by(archived=False).all() return render_template('administration.html', users=users, campaigns=campaigns) diff --git a/app/campaigns/models.py b/app/campaigns/models.py index c4ad19b..171c277 100644 --- a/app/campaigns/models.py +++ b/app/campaigns/models.py @@ -20,6 +20,7 @@ class Campaign(db.Model): title = Column('title', TEXT(), nullable=False) active = Column('active', Boolean(), nullable=False, default=True) goal = Column('goal', INTEGER(), default=0) + archived = Column('archived', Boolean(), default=False) def get_donations(self): from app.main.models import Donation From a4661a1e0b0539a23da1f280ff0603470437b7f1 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Sun, 22 Sep 2024 15:08:21 +0300 Subject: [PATCH 29/54] adding js to start work on archive buttons and change activity status --- app/admin/static/admin.js | 11 +++++ app/admin/static/administration.css | 56 +++++++++++++++++++++++++ app/admin/templates/administration.html | 13 ++++++ 3 files changed, 80 insertions(+) create mode 100644 app/admin/static/admin.js create mode 100644 app/admin/static/administration.css diff --git a/app/admin/static/admin.js b/app/admin/static/admin.js new file mode 100644 index 0000000..420e96a --- /dev/null +++ b/app/admin/static/admin.js @@ -0,0 +1,11 @@ +var archiveButtons = document.getElementsByClassName('archive-button'); +for(let i = 0; i < archiveButtons.length; i++){ + archiveButtons[i].addEventListener('click', e => { + console.log(e.target.id) + }) +} + + +// archiveButton.addEventListener('change', (e) => { +// console.log(e) +// }) \ No newline at end of file diff --git a/app/admin/static/administration.css b/app/admin/static/administration.css new file mode 100644 index 0000000..4cb7b81 --- /dev/null +++ b/app/admin/static/administration.css @@ -0,0 +1,56 @@ +.switch { + position: relative; + display: inline-block; + width: 60px; + height: 34px; +} +.switch input { + opacity: 0; + width: 0; + height: 0; +} +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} +.slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #2196F3; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + + /* Rounded sliders */ +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} \ No newline at end of file diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index a0d5171..820c204 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -1,5 +1,8 @@ {% extends 'base.html' %} {% block title %}Administration{% endblock title %} +{% block stylesheet %} + +{% endblock stylesheet %} {% block content %}
@@ -36,6 +39,8 @@ # Title Active + Change Active Status + Archive? @@ -44,10 +49,18 @@ {{campaign.id}} {{campaign.title}} {{campaign.active}} + + + + {% endfor %}
+ {% endblock content %} From fdcdcf1c4c7bb4be4df912b0a426e1598536e51c Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Sun, 22 Sep 2024 15:08:29 +0300 Subject: [PATCH 30/54] cpython --- app/admin/__pycache__/routes.cpython-310.pyc | Bin 1037 -> 1069 bytes .../__pycache__/models.cpython-310.pyc | Bin 1295 -> 1604 bytes app/main/__pycache__/models.cpython-310.pyc | Bin 1105 -> 1379 bytes app/main/static/main.css | 0 app/users/__pycache__/models.cpython-310.pyc | Bin 1839 -> 1824 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/main/static/main.css diff --git a/app/admin/__pycache__/routes.cpython-310.pyc b/app/admin/__pycache__/routes.cpython-310.pyc index f76983d855b85333124e7f19fa925d0b11a4deac..1ad2497a32dcf8cb200fd81de58b4f9beb76d2af 100644 GIT binary patch delta 169 zcmeC>Sj)ki&&$ijz`($8Nn0QkdYOY6G+F)JG#PJkBo-xSWR|6-OtxmyGGHrWVPIgm#adXJT2y(9 zIWZ@vh!rHjnUR9VEyz`#%>&cML1lA%a;au<^uqtN7wOn(GqLE;EPZt`7b F0{~mXD<}W} delta 137 zcmZ3>(aXV`&&$ijz`(%p$>3$0!bVQ6#uAnk#u|ni z#uTPr=3oX*X1~b+Oj@d}MJx;q47XSdOH+#~Z!st4N)3&&$ijz`(%Z`S*QVE6YZ{txSv+lj9jxCcj{kwMk`3;Ywv~W=P>q;pt_L z;!b5r;Z5aiW=LTJ^LbMEQutdKqIgpTQu)%DQUp_kT3Dj^Q-p&VG({#$GP~BZq~|B* z6frU|FlaIsDKaoH+~P9WHK({p1!OmCVQFen$v4@N*>!R~i!a+Pmg3Z$w8zOz5`7$zgOpakp)JbJY;ZEggW=LU6;pt_L;!WXA z;cH=t;!ELA}pSd;MjLOkv7l$Yrc$WMrse%wo!7u3^YxNn!3~T)?`J zA(%mv#jgltfF|QDmeAtVB2C63K?Vi}O}1MCi3J6ErNya5#d^8-XO8wS;s7a<1QE(0Ma;z|MMbJ0EL;#FxfIQFfceXFfbGgF)%RHFk~^zW=LVIVaQ^f z%`lfam_d`t?-!$jCR33x0|P^mC<6n7CgUxZ;?$h9l?+9)lg~0aaEX9)GchnQ2u&7e zeq|@az`$^eE488^vna77Ge7SZcTs9_YDs)aes*eJku1mWw4oG0&K8Q zS!z*cS|zgCDwAtjZ5b6N?`F-`l?Rz?05XcFxFoS8GdVZ4BqKki$Py$DHU&Y*O%7&L bVq}?I#+J&cIr$EoyZ}ND%#xeT&8`9fQCw7t delta 366 zcmZ3$x1NtTpO=@5fq{WxweX9yUmJN#n0#0n7#N%x7#NDB7#J987_t~b6JBKG@1OWm=$ytG?|M885kIfgh7NT0|SF5<1Lor)SR@H3`H`N_c1weiGd7b zVqjp9n#{rc%1)Yrf#DWcYDGb2QDRAEe%>waqSWHllK7JR?9{v>8IUnxLKdWsKRvZ1 z9!XwmvH{CF0aXSDhL<2`7b$|2t4)5#A|<5^vYVqw1Eh^DB{exeCAEkdB&{=9iB(e> zY$lih8!S|oT9lbqiEOso`awN{(} From fc90674ccc37edc3927f838176dfc261f1f53e38 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Sun, 22 Sep 2024 15:52:05 +0300 Subject: [PATCH 31/54] change activity buttons added event listeners --- app/admin/static/admin.js | 15 +++++++++------ app/admin/templates/administration.html | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/admin/static/admin.js b/app/admin/static/admin.js index 420e96a..cece628 100644 --- a/app/admin/static/admin.js +++ b/app/admin/static/admin.js @@ -1,11 +1,14 @@ -var archiveButtons = document.getElementsByClassName('archive-button'); +const archiveButtons = document.getElementsByClassName('archive-button'); +const activityButtons = document.getElementsByClassName('change-activity-btn'); + +for(let i = 0; i < activityButtons.length; i++){ + activityButtons[i].addEventListener('change', e => { + console.log(e.target.checked, e.target.id) + }) +} + for(let i = 0; i < archiveButtons.length; i++){ archiveButtons[i].addEventListener('click', e => { console.log(e.target.id) }) } - - -// archiveButton.addEventListener('change', (e) => { -// console.log(e) -// }) \ No newline at end of file diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index 820c204..64ccbbe 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -51,9 +51,9 @@ {{campaign.active}} + From f4d5e0a6902f38203e6aafcfb3899ac3d5038c38 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 23 Sep 2024 10:43:59 +0300 Subject: [PATCH 32/54] ignore pycache --- app/__pycache__/__init__.cpython-310.pyc | Bin 2136 -> 0 bytes app/__pycache__/__init__.cpython-311.pyc | Bin 3898 -> 0 bytes app/__pycache__/config.cpython-310.pyc | Bin 750 -> 0 bytes app/__pycache__/config.cpython-311.pyc | Bin 1075 -> 0 bytes app/__pycache__/models.cpython-311.pyc | Bin 2879 -> 0 bytes app/admin/__pycache__/__init__.cpython-310.pyc | Bin 348 -> 0 bytes app/admin/__pycache__/__init__.cpython-311.pyc | Bin 437 -> 0 bytes app/admin/__pycache__/routes.cpython-310.pyc | Bin 1069 -> 0 bytes app/admin/__pycache__/routes.cpython-311.pyc | Bin 1529 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 364 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 453 -> 0 bytes app/campaigns/__pycache__/models.cpython-310.pyc | Bin 1604 -> 0 bytes app/campaigns/__pycache__/models.cpython-311.pyc | Bin 2490 -> 0 bytes app/campaigns/__pycache__/routes.cpython-310.pyc | Bin 1109 -> 0 bytes app/campaigns/__pycache__/routes.cpython-311.pyc | Bin 1649 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 396 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 483 -> 0 bytes .../__pycache__/routes.cpython-310.pyc | Bin 406 -> 0 bytes .../__pycache__/routes.cpython-311.pyc | Bin 565 -> 0 bytes app/main/__pycache__/__init__.cpython-310.pyc | Bin 344 -> 0 bytes app/main/__pycache__/__init__.cpython-311.pyc | Bin 433 -> 0 bytes app/main/__pycache__/models.cpython-310.pyc | Bin 1379 -> 0 bytes app/main/__pycache__/models.cpython-311.pyc | Bin 2195 -> 0 bytes app/main/__pycache__/routes.cpython-310.pyc | Bin 918 -> 0 bytes app/main/__pycache__/routes.cpython-311.pyc | Bin 1350 -> 0 bytes app/users/__pycache__/__init__.cpython-310.pyc | Bin 348 -> 0 bytes app/users/__pycache__/__init__.cpython-311.pyc | Bin 437 -> 0 bytes app/users/__pycache__/forms.cpython-310.pyc | Bin 1448 -> 0 bytes app/users/__pycache__/forms.cpython-311.pyc | Bin 2364 -> 0 bytes app/users/__pycache__/models.cpython-310.pyc | Bin 1824 -> 0 bytes app/users/__pycache__/models.cpython-311.pyc | Bin 3105 -> 0 bytes app/users/__pycache__/routes.cpython-310.pyc | Bin 2957 -> 0 bytes app/users/__pycache__/routes.cpython-311.pyc | Bin 6061 -> 0 bytes 33 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/__pycache__/__init__.cpython-311.pyc delete mode 100644 app/__pycache__/config.cpython-310.pyc delete mode 100644 app/__pycache__/config.cpython-311.pyc delete mode 100644 app/__pycache__/models.cpython-311.pyc delete mode 100644 app/admin/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/admin/__pycache__/__init__.cpython-311.pyc delete mode 100644 app/admin/__pycache__/routes.cpython-310.pyc delete mode 100644 app/admin/__pycache__/routes.cpython-311.pyc delete mode 100644 app/campaigns/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/campaigns/__pycache__/__init__.cpython-311.pyc delete mode 100644 app/campaigns/__pycache__/models.cpython-310.pyc delete mode 100644 app/campaigns/__pycache__/models.cpython-311.pyc delete mode 100644 app/campaigns/__pycache__/routes.cpython-310.pyc delete mode 100644 app/campaigns/__pycache__/routes.cpython-311.pyc delete mode 100644 app/campaigns/campaign_api/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/campaigns/campaign_api/__pycache__/__init__.cpython-311.pyc delete mode 100644 app/campaigns/campaign_api/__pycache__/routes.cpython-310.pyc delete mode 100644 app/campaigns/campaign_api/__pycache__/routes.cpython-311.pyc delete mode 100644 app/main/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/main/__pycache__/__init__.cpython-311.pyc delete mode 100644 app/main/__pycache__/models.cpython-310.pyc delete mode 100644 app/main/__pycache__/models.cpython-311.pyc delete mode 100644 app/main/__pycache__/routes.cpython-310.pyc delete mode 100644 app/main/__pycache__/routes.cpython-311.pyc delete mode 100644 app/users/__pycache__/__init__.cpython-310.pyc delete mode 100644 app/users/__pycache__/__init__.cpython-311.pyc delete mode 100644 app/users/__pycache__/forms.cpython-310.pyc delete mode 100644 app/users/__pycache__/forms.cpython-311.pyc delete mode 100644 app/users/__pycache__/models.cpython-310.pyc delete mode 100644 app/users/__pycache__/models.cpython-311.pyc delete mode 100644 app/users/__pycache__/routes.cpython-310.pyc delete mode 100644 app/users/__pycache__/routes.cpython-311.pyc diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index b5aa9257306c8accae8df950c27ed703682e4094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2136 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�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 BeFp#l diff --git a/app/admin/__pycache__/routes.cpython-310.pyc b/app/admin/__pycache__/routes.cpython-310.pyc deleted file mode 100644 index 1ad2497a32dcf8cb200fd81de58b4f9beb76d2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1069 zcmd1j<>g{vU|=}%_kEfbGXuk85C<7EGcYhXFfcF_?_ywJNMT4}%wfo7jACR2v6*t1 za+#x;!EELnmR!~-Rxq0-hb@;qiXF^m&Ed%9jN$~d*>bpYxudvqd7^m0eD)mPT)rs2 zT>dEjT!AQoT)`;8T%jl-upCE@aIQ#{NUmsnvAztLW@(2G#PJkI49;7Bxa_A#5i2?^Abxk^Yb*BZgKkLr)TE5=y|gGNJ}tlK7He8g zVsXYT_M+6n($wM-O_p1HIUqyhK?0dYsVTR(ApFwe)S_EF$)!a_sd**wU> zgrmuHOE@_rH90%JAhEc(JijO0EEyCUFwDfjz`)ADz~BsuXDtQ>h7yJ>#sy3Z8EP3yn6ntOSW*~Mn0g^1j3ulo z%ry)(j43R=%)tzrtbT4FixP{HGcwCkQ>uhf?a|99$<0~Gbc+?_o8nuX$Iar{);xyQCIpm*f}d2V~|{<>l)q78K}%t=BKgFD*$e)+?wi5@ldu;05`M zhk=2Ci%E!)g^`JoiIMG}ru;4D#Dan%kmql4CKeRvfwdNa68tRz5FhMhz1;ki)SP07 zV?{v1a4*25z|Q6eN#!PH=D|eSK)wTuLd;3aFUl=0Vh4GN10)4b71MhQj%Mjl2E JMh+%EMgSraBdq`c diff --git a/app/admin/__pycache__/routes.cpython-311.pyc b/app/admin/__pycache__/routes.cpython-311.pyc deleted file mode 100644 index 4c44e7b5afccf4731ec9f0a944e0fa13e3920098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 zcmZ3^%ge>Uz`!tP(W^9LW(J1GAPx*OLm8j%FfcGoXGmd4Va#F3WsG8E1hJWNm~xq; zn89r39F|lt`{=gN`J zm5!1Iv$=C*qGXsDQkk=4q3&i#;aSGWz_6MT&gX4mSjND>uo@=75G9ww9n7G~_Yx$c z$#{z?B}tR<7HeWkZf2e)<1LoZ;?yEd##Gf>P5ni%U|AKw3Z|nyk0@i&FDaQj6kCQgaJ(5=&BVaTKMdWEQ0+m)v46 zEy{^c%P+dcnwFDToND$}KJkzqB~D=oU|MX;D#X zUP(Nd$DNa(o?i;#XfoXrPR>Y8&W0hlvt9ADh~2gN@7WB zNoH=U-z`3{hck;yioiZg289L;vobI+fKtNedEit~0uyIoV90`p>;fhvVK@^ttZNxc z*x*v6>SZk9MCeUntYN5OT*I`CnSo(7$ZcS$Us z$JVQFenCT9R6G%!5n z5$N&i_v`Yz$Rl%wN2bB`u7Jc8zUu-?mjsk93aDHWP-*bI%Pn<5+Tezw+6`5`53Ec) z1|J!icnrRPhz|@*tOlP!KGl@J#hh4BPz3V%EzZP(0zI(xMJx;q47UV8e6VNra`RJC zbBZC}6afjtJr9!tdH5DTNGdlmGY=-p4l)NU3Na@wzbLo3hy&y$P$WQ-Y&ImIxIv;k zAOhsmB0i8-ZcviWjt3{(B7TsZ0EiF-5kepZg5{}2*;T2f>3YSf$)!b^C6z_OAW0Dr zAqrB#lwW*{6&#%4P+ZASBnOfMmPif%BdTtG!P7|btVLpK;)E)a)qF!){|gl;f+UciQK zFvwm&MK>5Y8^G`ZBTs{9i}VFv*^7*FR~Y3!FtIWkd|+T@H2BEOz$A|%0u}}bB>><7 Bm3aUF diff --git a/app/campaigns/__pycache__/__init__.cpython-310.pyc b/app/campaigns/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 6919d93586e77c86661e8ca03a7e02b5109c382b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmd1j<>g{vU|_IVcOy-Jk%8ech=YvT85kHG7#J9e^%xi!QW#Pga~N_NqZk<(QW;a2 zQkhbiQ&>`1Q`mZ0qnJ||QrL4?a#^ET85vSIf*CY9UxG~1WW2@clvA2oP?VWha*H!L zF}ENwGd-{P7H3InZb43BNow&ew&Ie+lFZ~PE`7MPCi5+Rn1cAU{G623qFcNWWiT#R zX;DsmK~ZX2W`!o>Ew-Zk(vs9-KTWnUz`#(HaWhSVk%8echy%myP{wCF1_p-d3@HpLj5!Rsj8Tk?3``8Ej44d1 zOexGMEGevO*p{&}Fsx>Us%MB|PGLx4&tb`BjbdeFNZ|-((BymxlGJ3p#p#q&np#kl znOAa)GdVH0ATcvNulN>cNosCEPGU)F@h!IElEjkCbI zybxtDE>~$$PJBU8YFcK6CgUx(qWsd5)M7tPwp*-eIf=#DMa&Eg47WJqg{vU|{h4`#!Ceg@NHQh=Yt-7#J8F7#J9edl(oPQW#Pga~N_NqZk=MY^EHh zT;?cdFq=7tC6_gd70hPIVasKYV$bD>;>hKU;>_iW;sW!zqquWBP8Qd9C*i$%K7*aS=8M6eNnWKc<8B#b?xLO!exS%4!DXhT^ zn%plz?$l(w#gvky$#{!9xwNP#HLoN-v7kVc@fHt^TUwl2q{)7ZCB!u%k;^HWN5Ky04)_`=e}9HJWDam3bAtKIDV)75QCz7kDO})S=T712Wsc%bWl7;pg{T1Wc~baN z_*)pFcvA#Y`O=tD1XF}sSfcn-go7D0MQ(98Lqqx&2h2}Jpr8pU5(K3u){@MUoK&|W z5fFzhF}WnOELD@KNEF0nPf1NnEX^so#gd+%m{Y{az`&r%SfmJ&;z%q?&d4lFO-Tlc z!V(t~0|Nsy0|SFIC_^fMG9+UP6DUL0GBPsMFlI4jG1o9;v7|8fGA>|U$Pmn+$>Ik! z_7;areqLfpW`3R~V-YCUG}&(PCl(awQROYpw9K56)S~#L zO0aisF(>BaXfoYmDNfBv11m(tcaaQ8A8&eUNqh>_l441a6G4Rs52FZUl^86L^iUMt zVk=55DJ{xF@g&H@a8C*`Ffi0GWHHQUNMWpD$YPw$Fqb))L6ga^idjKdL6ZsWwjy~* z$Z5h7AjD~4S8>G07o`>y#mCEm90UqLA;u~}xN~5#ewqSB;vnr3AOht0A}J6Hl**8j zJ1A#^Z7X62$%3MwND0JJ1`%4IU|=pTDJs$daY0!D;u0_m@#0?VT0TH|)r?UEjvK}~lfh|UIEZoJnIBXyV cgB>Vdia{xxhk=KYhf#%*gHeQ0h*^vS0An3)&;S4c diff --git a/app/campaigns/__pycache__/models.cpython-311.pyc b/app/campaigns/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 44cb707c7091795b3c9f4374a6d907d99ef73216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2490 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 Jvi%WY0{|o~b2tD1 diff --git a/app/campaigns/campaign_api/__pycache__/__init__.cpython-311.pyc b/app/campaigns/campaign_api/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b324c651cc1c3bd25a92081c7609710f2decc576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmZ3^%ge>Uz`)S;=5?ALBLl-@5C?|Yp^VRV3=9m@8B!Qh7;_kM8KW2(8JHMS8B>^2 znNpZjSW;Nmuq|U{U|7uxRnHK`oWhX8p2L#M8pX=Ukirqnpvn0XB&o@Gi_W)ZBuc#FEtFTWrN8i6xoIRlNGhDm0mI@x#=_r{(9Q zq!!)cg{Xvaxk`(2;tPsW(=sbG8E>%_<(HPE7W-+k-C|A4Ni5DTVrF1qxWy44pO=`M z8XsT80^&*~78K~g>?ww`KyE4mh0RKa&mgD&a&@+f2`x@7Dvt3<&C4&#k8w#Y&MwI> zhzZEdsmjZbNh~Ocfg1y7fsBcXkI&4@EQycTE2#X%VUwGmQks)$S0u>5z`)4Bz)&2@ zz`*c$93l(lat=zrj35itD7z#?Gy1w=IPeBfbV P)Vsi-i;0T(85kGg{vU|`r{`!a0<0|Ucj5C<7EGcYhXFfcF_>oG7eq%fo~<}lq%gNIG&4rArmzMxXtKQonY5De7JpG{UP@|Fd`W6x zswU$tp5(;bg2c@9y!ga|%v4FoPzO zUlk8jhh9cWZcY(M*-C~YHUZn1)m0vm&H8HB|SlIO6=%}*)KNws5yd60*JhmnJsj}ZV{MPQx) diff --git a/app/campaigns/campaign_api/__pycache__/routes.cpython-311.pyc b/app/campaigns/campaign_api/__pycache__/routes.cpython-311.pyc deleted file mode 100644 index 375672999acfd85144ca9fe4038ad75dae388255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmZ3^%ge>Uz`)S;=5^XO1_p-5APx*OLm8g~7#J9)Go&!2Fy=7iGDa~ng4j$sOu5Wa z%!~|745`dnEKs!!Da^|l85mYG!uc#M49gf87*@js7@}BHSc4ff* zWMD{PM0G+igC>(-6%W)Dy^NCFoFb6cl?d}P0ZgzmFfbGgFfcGQFg)d! znqha5Tk8t9)&&-=B2ESd20u-TZlX-=wL5g!8s11JEBV;C41J}@&fGTvZNynu>sFc@DzMIYE0 pm_!<6t}qHu@Vv+g{vU|^6by^+Sk$iVOz#6iaF3=9ko3=9m#dJGH(5FF_`0GT!2J$|+4PD9X$$xy6#3 zn3;Ervm`aQASbaTwfGiWaYO2lkFC3T25kdb`cW;1H&zj`1riU+|>B^B4#i*v7kT?WPTAR z0|UcKh9X`D1_<%XNIxS#H&wqfv$!ZfHOENbCAB!aB)>pEATy^bFJC{gpaASJ{rLFI pyv&mLc)fzkTO2mI`6;D2sdkK@kP%>DVBle3VPay0K(;>uYye4ZUEBZw diff --git a/app/main/__pycache__/__init__.cpython-311.pyc b/app/main/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ced73102ba71074bf366533a58beb0bf4171dbdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmZ3^%ge>Uz`#(HaWjpDk%8echy%myP{wCF1_p-d3@HpLj5!Rsj8Tk?3``8Ej44d1 zOexGMEGevO*p{&}Fsx>Us%MB|PGLx4&tb`BjbdeFNZ|-((BymxlGJ3p#p#q&np#kl znOAa)B{wlM?-plCYHmSJVo7T8EwIEwe(C@fKTAerZW+v7aW}E!MQ0#NzBCW(Ed^TO9H6d5O8H@$p40U~XbT zfgZ^GB9PBlGJFO(?3bytRZM7cYEf~FPikI%S$>R5YH@Z+enCt~YH>+WYC(QXVnIO+ zNLx&Nd}dx|NqoFsLFF$Fo80`A(wtPgB0&ZQ21W)3hT>2L28IvJjEsyo7^E+tq6h2( y4V4qbZivd>P&K%rtbId4{R1Zphvr8H77ooXAfkcg0}lhE44OU&w}_vCfdK&geS5S3 diff --git a/app/main/__pycache__/models.cpython-310.pyc b/app/main/__pycache__/models.cpython-310.pyc deleted file mode 100644 index dd6f02158c3491960e2a713831d14f8bfc4f9bcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1379 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 IgO!gF0Qcbb4*&oF diff --git a/app/main/__pycache__/routes.cpython-311.pyc b/app/main/__pycache__/routes.cpython-311.pyc deleted file mode 100644 index ba7ce08781a72c4acae3370743b2b6d87db14f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcmZ3^%ge>Uz`)S;=5?AnGXuk85C?{tp^VQ57#J9)Go&!2Fy=7iGDa~ng4j$sOu5Wa z%wRTi4ofa;6f2m`lEaqE9>or3v*vK*az=6Haz%0Faz}CJ@jl9`+8SH-EH zk)NAdkeHsD4DuWdvoJ6)fFkd62RPzNVB!o63|a7iTEK)P3}>b=u3a-F0#OOXB()N-l`&Ulg~wB5reC+~JbA!$onYE8IGru^bttl;1Q z2gpi>A{mgJ6axdpFAkgB{FKt1RJ$T|1_lODkQal<56p~=j5ipBE})_t43Za6(G3R0 z3#jM@gXRTP^nk(T0&(aDgYN}G=mvx51#IXBgX{%Vbc2Dj0SrHIF);Boh_py`cwc0c dxWXv$fr**X?gIlequobl1|~@q5wI{gga9&gW|05@ diff --git a/app/users/__pycache__/__init__.cpython-310.pyc b/app/users/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 9125a02771ffec5cf73154347b459fa159d3a998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 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 diff --git a/app/users/__pycache__/models.cpython-310.pyc b/app/users/__pycache__/models.cpython-310.pyc deleted file mode 100644 index 6ca8841952278dd6f9edce73a826b6a599b811eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1824 zcmd1j<>g{vU|=}(`hD7THU@^rAPzESWnf@%U|?VuSjp7BXVa?%- z;!9yjVawsq<&Wae6^IhZ6^s&OWN>FlVNc;`VMyUfWy}&vWo>4O5>8<~eir->Q%}vbA(PSzT0fik~X%D}*&$#{#UI5j72B}0)c0|Ub^L;Z~W+*JL_%;KW_)Epyym(=3ylKcYw zfXtk#ynOw{f&zVzD~k1V^HWlDiuDRAZ*j!O7o`>y#m9r3UChM5z#zm}#S01#J($eP z2qp%GWRMihyzVixRJGX@5R5{4|0LzzmLvsg-4v)ED?dl^gEYZz0QdKtwTQkds3 zm2hNnrm#pdq_C#2^)lBo)i4D!XtMihGTve;sanZ+i@i8CIX^F@Sd-}%dvbnWT4qu1 zE#}mUf?Hg{uFgTOA@Sa>k+)bqf{jegG#PJkCg!B)7iE@Y6mz{#s!*8*H%}>{4E|LMsa-~)jWELfsWaj7H;x0-p zPA!Qq$YyTEQ~^o zRpQ_f#MJ4h$ylTSa-t9@@q+SXeEco0`1suXl+v8k`1o5q@$rSFi8)Xi-uUmjX++t2FC@2CYgWvG`xb`{Bna(5Wl=FGo_QE}7zG$r7&#b47$uki>i4=i diff --git a/app/users/__pycache__/models.cpython-311.pyc b/app/users/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 53683c1b53466dc2b5e8741be302ccc635fdf1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3105 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 Lm5Y%>l#dYr2rAk+ diff --git a/app/users/__pycache__/routes.cpython-311.pyc b/app/users/__pycache__/routes.cpython-311.pyc deleted file mode 100644 index 7f81342c0674a73eb789c58ac34abd92b75fb38c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6061 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 Kfq{z=l4St3H0~Mz From b6a8c6c53b910af9ea2a57cca9dd96d8792b9eec Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 23 Sep 2024 10:44:15 +0300 Subject: [PATCH 33/54] ignore pycache --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 54ba69a..1a0aa2c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /__pycache__ +**/__pycache__ /errorlog.txt /instance /logs.log From 879dda4891979fb7b0b949a9006d8d5a055abcdc Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 23 Sep 2024 12:27:57 +0300 Subject: [PATCH 34/54] adjust db population to account for each of 3 local machine paths --- python_files/db_population.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/python_files/db_population.py b/python_files/db_population.py index 18be70f..28fb6ca 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -9,8 +9,15 @@ from werkzeug.security import generate_password_hash import random def engineer(): - # engine = create_engine('sqlite:////home/yisroel2/Desktop/Pilzno/instance/site.db') - engine = create_engine('sqlite:///C:/Users/Lenovo/Desktop/Pilzno/instance/site.db') + path1 = 'C:/Users/Lenovo/Desktop/Pilzno/instance/site.db' + path2 = '/home/yisroel2/Desktop/Pilzno/instance/site.db' + path3 = '/home/ubuntu/PilznoProject/PilznoProduction/instance/site.db' + + for p in [path1, path2, path3]: + if os.path.exists(p): + path = p + break + engine = create_engine(f'sqlite:///{path}') metadata_obj = MetaData() metadata_obj.reflect(bind=engine) return engine, metadata_obj From 460a9a06cd7f9adec71f153762dc37f37a203518 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 23 Sep 2024 12:46:58 +0300 Subject: [PATCH 35/54] add default values for db pop --- python_files/db_population.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python_files/db_population.py b/python_files/db_population.py index 28fb6ca..11cd533 100644 --- a/python_files/db_population.py +++ b/python_files/db_population.py @@ -105,7 +105,9 @@ def insert_campaigns(): for title in campaign_titles: conn.execute(campaign_table.insert().values( title=title, - active=is_active[random.randint(0,1)] + active=is_active[random.randint(0,1)], + goal=5000, + archived=False )) conn.commit() From b2253499318f56a8bae63a6c0c0b991fa8b96df2 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 23 Sep 2024 19:49:07 +0300 Subject: [PATCH 36/54] update active status and archive - api calls --- app/admin/static/admin.js | 67 ++++++++++++++++++++++--- app/admin/templates/administration.html | 32 +++++++----- app/campaigns/routes.py | 20 +++++++- 3 files changed, 98 insertions(+), 21 deletions(-) diff --git a/app/admin/static/admin.js b/app/admin/static/admin.js index cece628..c1647a7 100644 --- a/app/admin/static/admin.js +++ b/app/admin/static/admin.js @@ -1,14 +1,65 @@ const archiveButtons = document.getElementsByClassName('archive-button'); const activityButtons = document.getElementsByClassName('change-activity-btn'); -for(let i = 0; i < activityButtons.length; i++){ - activityButtons[i].addEventListener('change', e => { - console.log(e.target.checked, e.target.id) - }) + + + +function deactivateArchiveButtons(){ + for (let i = 0; i < archiveButtons.length; i++){ + archiveButtons[i].disabled=true; + } +} +function activateArchiveButtons(){ + for (let i = 0; i < archiveButtons.length; i++){ + archiveButtons[i].disabled=false; + } +} +function deactivateActiveStatusCheckboxes(){ + for (let i = 0; i < activityButtons.length; i++){ + activityButtons[i].disabled=true; + } +} +function activateActiveStatusCheckboxes(){ + for (let i = 0; i < activityButtons.length; i++){ + activityButtons[i].disabled=false; + } } -for(let i = 0; i < archiveButtons.length; i++){ - archiveButtons[i].addEventListener('click', e => { - console.log(e.target.id) - }) +async function updateActiveStatus(id, status) { + deactivateActiveStatusCheckboxes() + deactivateArchiveButtons() + var result = await fetch(`/campaigns/update_active_status/${id}/${status}`, {method:'PUT'}); + var data = await result.json(); + if (status === true){ + status = 'True' + } else { + status = 'False' + } + document.getElementById(`${id}-active-status`).innerText = status; + activateActiveStatusCheckboxes() + activateArchiveButtons() + } + +async function archiveCampaign(id){ + deactivateActiveStatusCheckboxes() + deactivateArchiveButtons() + var result = await fetch(`/campaigns/archive_campaign/${id}`, {method:'PUT'}); + var data = await result.json(); + document.getElementById(`${id}-row`).remove(); + activateActiveStatusCheckboxes() + activateArchiveButtons() +} + +document.addEventListener("DOMContentLoaded", (event) => { + for(let i = 0; i < activityButtons.length; i++){ + activityButtons[i].addEventListener('change', e => { + updateActiveStatus(parseInt(e.target.value), e.target.checked) + }) + } + for(let i = 0; i < archiveButtons.length; i++){ + archiveButtons[i].addEventListener('click', e => { + archiveCampaign(parseInt(e.target.value)) + }) + } + }); diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index 64ccbbe..9c4feb0 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -45,18 +45,26 @@ {% for campaign in campaigns %} - - {{campaign.id}} - {{campaign.title}} - {{campaign.active}} - - - - - + + {{campaign.id}} + {{campaign.title}} + {{campaign.active}} + + + + + {% endfor %} diff --git a/app/campaigns/routes.py b/app/campaigns/routes.py index b07c22a..3587042 100644 --- a/app/campaigns/routes.py +++ b/app/campaigns/routes.py @@ -8,6 +8,7 @@ from flask_login import login_required, login_user, current_user, logout_user from werkzeug.security import check_password_hash, generate_password_hash from datetime import datetime import os +from time import sleep @campaigns.route('add_campaign') def add_campaign(): @@ -17,4 +18,21 @@ def add_campaign(): def campaign_page(campaign_id): campaign = Campaign.query.filter_by(id=campaign_id).first() return render_template('campaign_page.html', - campaign=campaign) \ No newline at end of file + campaign=campaign) + +@campaigns.route('update_active_status//', methods=['PUT']) +def update_active_status(id, status): + if status == 'true': + status = True + else: + status = False + Campaign.query.filter_by(id=id).update({'active':status}) + db.session.commit() + sleep(1) + return {'status':'success'} + +@campaigns.route('archive_campaign/', methods=['PUT']) +def archive_campaign(id): + Campaign.query.filter_by(id=id).update({'archived': True, 'active':False}) + db.session.commit() + return {'status':'success'} \ No newline at end of file From 3f0c84566e6df66824ad28896ae6137436b2fd06 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Mon, 23 Sep 2024 19:54:10 +0300 Subject: [PATCH 37/54] add user type to users on admin page --- app/admin/templates/administration.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index 9c4feb0..ca16f76 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -15,6 +15,7 @@ First Name Last Name Email + User Type @@ -24,6 +25,7 @@ {{user.first_name}} {{user.last_name}} {{user.email}} + {{user.user_type}} {% endfor %} From 96c553fd3649aeb60c851961a7a92aeda9a1e4f9 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 08:22:01 +0300 Subject: [PATCH 38/54] move campaign api calls to their own blueprint --- app/admin/static/admin.js | 4 ++-- app/campaigns/campaign_api/routes.py | 23 ++++++++++++++++++++--- app/campaigns/routes.py | 17 ----------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/admin/static/admin.js b/app/admin/static/admin.js index c1647a7..8f31797 100644 --- a/app/admin/static/admin.js +++ b/app/admin/static/admin.js @@ -28,7 +28,7 @@ function activateActiveStatusCheckboxes(){ async function updateActiveStatus(id, status) { deactivateActiveStatusCheckboxes() deactivateArchiveButtons() - var result = await fetch(`/campaigns/update_active_status/${id}/${status}`, {method:'PUT'}); + var result = await fetch(`/campaigns/campaign_api/update_active_status/${id}/${status}`, {method:'PUT'}); var data = await result.json(); if (status === true){ status = 'True' @@ -44,7 +44,7 @@ async function updateActiveStatus(id, status) { async function archiveCampaign(id){ deactivateActiveStatusCheckboxes() deactivateArchiveButtons() - var result = await fetch(`/campaigns/archive_campaign/${id}`, {method:'PUT'}); + var result = await fetch(`/campaigns/campaign_api/archive_campaign/${id}`, {method:'PUT'}); var data = await result.json(); document.getElementById(`${id}-row`).remove(); activateActiveStatusCheckboxes() diff --git a/app/campaigns/campaign_api/routes.py b/app/campaigns/campaign_api/routes.py index 094249a..cfbcb06 100644 --- a/app/campaigns/campaign_api/routes.py +++ b/app/campaigns/campaign_api/routes.py @@ -1,7 +1,24 @@ +from app import db from flask import render_template from app.campaigns.campaign_api import campaign_api +from app.campaigns.models import Campaign +from time import sleep -@campaign_api.route('testing') -def testing(): - return render_template('testing.html') \ No newline at end of file + +@campaign_api.route('update_active_status//', methods=['PUT']) +def update_active_status(id, status): + if status == 'true': + status = True + else: + status = False + Campaign.query.filter_by(id=id).update({'active':status}) + db.session.commit() + sleep(1) + return {'status':'success'} + +@campaign_api.route('archive_campaign/', methods=['PUT']) +def archive_campaign(id): + Campaign.query.filter_by(id=id).update({'archived': True, 'active':False}) + db.session.commit() + return {'status':'success'} \ No newline at end of file diff --git a/app/campaigns/routes.py b/app/campaigns/routes.py index 3587042..a6f4fe0 100644 --- a/app/campaigns/routes.py +++ b/app/campaigns/routes.py @@ -19,20 +19,3 @@ def campaign_page(campaign_id): campaign = Campaign.query.filter_by(id=campaign_id).first() return render_template('campaign_page.html', campaign=campaign) - -@campaigns.route('update_active_status//', methods=['PUT']) -def update_active_status(id, status): - if status == 'true': - status = True - else: - status = False - Campaign.query.filter_by(id=id).update({'active':status}) - db.session.commit() - sleep(1) - return {'status':'success'} - -@campaigns.route('archive_campaign/', methods=['PUT']) -def archive_campaign(id): - Campaign.query.filter_by(id=id).update({'archived': True, 'active':False}) - db.session.commit() - return {'status':'success'} \ No newline at end of file From fde7fdd50a2be968d3aa451c79c66377bd67dd27 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 11:41:17 +0300 Subject: [PATCH 39/54] user api init and update admin status --- app/__init__.py | 2 ++ app/users/users_api/__init__.py | 9 +++++++++ app/users/users_api/routes.py | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 app/users/users_api/__init__.py create mode 100644 app/users/users_api/routes.py diff --git a/app/__init__.py b/app/__init__.py index 897cf61..f5a7dbd 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -48,12 +48,14 @@ def create_app(): login_manager.login_view = 'users.login' from app.users import users + from app.users.users_api import users_api from app.main import main from app.campaigns import campaigns from app.campaigns.campaign_api import campaign_api from app.admin import admin campaigns.register_blueprint(campaign_api) + users.register_blueprint(users_api) app.register_blueprint(users) app.register_blueprint(main) diff --git a/app/users/users_api/__init__.py b/app/users/users_api/__init__.py new file mode 100644 index 0000000..220211f --- /dev/null +++ b/app/users/users_api/__init__.py @@ -0,0 +1,9 @@ +from flask import Blueprint + +users_api = Blueprint('users_api', + __name__, + template_folder='templates', + static_folder='static', + url_prefix='/users_api') + +from app.users.users_api import routes \ No newline at end of file diff --git a/app/users/users_api/routes.py b/app/users/users_api/routes.py new file mode 100644 index 0000000..3f4d1f4 --- /dev/null +++ b/app/users/users_api/routes.py @@ -0,0 +1,18 @@ +from app import db +from flask import render_template +from app.users.users_api import users_api +from app.users.models import User +from time import sleep + + + +@users_api.route('update_admin_status//', methods=['PUT']) +def update_admin_status(id, status): + if status == 'true': + status = 'Admin' + else: + status = 'User' + User.query.filter_by(id=id).update({'user_type':status}) + db.session.commit() + sleep(1) + return {'status':'success'} From c86acc10ca44d4e4bbd48101cd14d25b97dff631 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 11:41:46 +0300 Subject: [PATCH 40/54] admin buttons --- app/admin/static/admin.js | 55 +++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/app/admin/static/admin.js b/app/admin/static/admin.js index 8f31797..086db81 100644 --- a/app/admin/static/admin.js +++ b/app/admin/static/admin.js @@ -1,9 +1,18 @@ const archiveButtons = document.getElementsByClassName('archive-button'); const activityButtons = document.getElementsByClassName('change-activity-btn'); +const adminButtons = document.getElementsByClassName('change-admin-btn'); - - +function deactivateAdminButtons(){ + for (let i = 0; i < adminButtons.length; i++){ + adminButtons[i].disabled=true; + } +} +function activateAdminButtons(){ + for (let i = 0; i < adminButtons.length; i++){ + adminButtons[i].disabled=false; + } +} function deactivateArchiveButtons(){ for (let i = 0; i < archiveButtons.length; i++){ archiveButtons[i].disabled=true; @@ -25,9 +34,19 @@ function activateActiveStatusCheckboxes(){ } } -async function updateActiveStatus(id, status) { - deactivateActiveStatusCheckboxes() +function activateAllButtons(){ + activateAdminButtons() + activateArchiveButtons() + activateActiveStatusCheckboxes() +} +function deactivateAllButtons(){ + deactivateAdminButtons() deactivateArchiveButtons() + deactivateActiveStatusCheckboxes() +} + +async function updateActiveStatus(id, status) { + deactivateAllButtons() var result = await fetch(`/campaigns/campaign_api/update_active_status/${id}/${status}`, {method:'PUT'}); var data = await result.json(); if (status === true){ @@ -36,19 +55,28 @@ async function updateActiveStatus(id, status) { status = 'False' } document.getElementById(`${id}-active-status`).innerText = status; - activateActiveStatusCheckboxes() - activateArchiveButtons() - + activateAllButtons() } async function archiveCampaign(id){ - deactivateActiveStatusCheckboxes() - deactivateArchiveButtons() + deactivateAllButtons() var result = await fetch(`/campaigns/campaign_api/archive_campaign/${id}`, {method:'PUT'}); var data = await result.json(); document.getElementById(`${id}-row`).remove(); - activateActiveStatusCheckboxes() - activateArchiveButtons() + activateAllButtons() +} + +async function updateAdminStatus(id, status) { + deactivateAllButtons() + var result = await fetch(`/users/users_api/update_admin_status/${id}/${status}`, {method:'PUT'}); + var data = await result.json(); + if (status === true){ + status = 'True' + } else { + status = 'False' + } + document.getElementById(`${id}-admin-status`).innerText = status; + activateAllButtons() } document.addEventListener("DOMContentLoaded", (event) => { @@ -62,4 +90,9 @@ document.addEventListener("DOMContentLoaded", (event) => { archiveCampaign(parseInt(e.target.value)) }) } + for(let i = 0; i < adminButtons.length; i++){ + adminButtons[i].addEventListener('change', e => { + updateAdminStatus(parseInt(e.target.value), e.target.checked) + }) + } }); From 93dd70849a50f41a49a2616eb6d9ca16e19a0291 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 11:42:03 +0300 Subject: [PATCH 41/54] delete testing page --- .../campaign_api/templates/testing.html | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 app/campaigns/campaign_api/templates/testing.html diff --git a/app/campaigns/campaign_api/templates/testing.html b/app/campaigns/campaign_api/templates/testing.html deleted file mode 100644 index cd5d3ca..0000000 --- a/app/campaigns/campaign_api/templates/testing.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'base.html' %} -{% block title %}testing{% endblock title %} - -{% block stylesheet %} - -{% endblock stylesheet %} -{% block content %} -
-
-

Testing Page

- - -
- -
-{% endblock content %} \ No newline at end of file From 7ada4b2a6fc778373fed0447fc651d6a5c89ccde Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 11:42:21 +0300 Subject: [PATCH 42/54] create campaign form start --- app/campaigns/forms.py | 20 ++++++++ app/campaigns/routes.py | 17 +++++-- app/campaigns/templates/add_campaign.html | 56 ++++++++++++++++++++++- 3 files changed, 89 insertions(+), 4 deletions(-) diff --git a/app/campaigns/forms.py b/app/campaigns/forms.py index e69de29..52b1712 100644 --- a/app/campaigns/forms.py +++ b/app/campaigns/forms.py @@ -0,0 +1,20 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, \ + EmailField, \ + PasswordField, \ + SubmitField, \ + SelectField, \ + BooleanField,\ + DateField, IntegerField +from flask_wtf.file import FileField, FileRequired, FileAllowed +from wtforms.validators import DataRequired, ValidationError, NumberRange, EqualTo, Email +from app.campaigns.models import Campaign +from flask_login import current_user +# import logging +# logging.basicConfig(filename='logs.log', encoding='utf-8', level=logging.DEBUG) + +class CreateCampaignForm(FlaskForm): + title = StringField('Title', validators=[DataRequired()]) + active = BooleanField('Initialize as active?') + goal = IntegerField('Goal') + submit = SubmitField('Add Campaign') \ No newline at end of file diff --git a/app/campaigns/routes.py b/app/campaigns/routes.py index a6f4fe0..9697735 100644 --- a/app/campaigns/routes.py +++ b/app/campaigns/routes.py @@ -2,7 +2,7 @@ from app import db from app.campaigns import campaigns from app.users.models import User from app.campaigns.models import Campaign -# from forms import LoginForm, RequestResetForm, ResetPasswordForm, EditUserForm, AddUserForm +from app.campaigns.forms import CreateCampaignForm from flask import render_template, redirect, url_for, flash, request from flask_login import login_required, login_user, current_user, logout_user from werkzeug.security import check_password_hash, generate_password_hash @@ -10,9 +10,20 @@ from datetime import datetime import os from time import sleep -@campaigns.route('add_campaign') +@campaigns.route('add_campaign', methods=['GET', 'POST']) def add_campaign(): - return render_template('add_campaign.html') + form = CreateCampaignForm() + if form.validate_on_submit(): + campaign = Campaign( + title=form.title.data, + active=form.active.data, + goal=form.goal.data + ) + db.session.add(campaign) + db.session.commit() + return redirect(url_for('admin.administration')) + return render_template('add_campaign.html', + form=form) @campaigns.route('campaign_page/') def campaign_page(campaign_id): diff --git a/app/campaigns/templates/add_campaign.html b/app/campaigns/templates/add_campaign.html index d100737..4394370 100644 --- a/app/campaigns/templates/add_campaign.html +++ b/app/campaigns/templates/add_campaign.html @@ -1,2 +1,56 @@ {% extends 'base.html' %} -{% block title %}Add campaign{% endblock title %} \ No newline at end of file +{% block title %}Add campaign{% endblock title %} +{% block content %} +
+
+
+
+
+

Register

+
+ {{ form.hidden_tag() }} + +
+ {{ form.title.label(class="form-label") }} + {{ form.title(class="form-control") }} + {% if form.title.errors %} +
    + {% for error in form.title.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} +
+ +
+ {{ form.active.label(class="form-label") }} + {{ form.active() }} + {% if form.active.errors %} +
    + {% for error in form.active.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} +
+ +
+ {{ form.goal.label(class="form-label") }} + {{ form.goal(class="form-control") }} + {% if form.goal.errors %} +
    + {% for error in form.goal.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} +
+ + {{ form.submit(class='btn btn-primary') }} +
+
+
+
+
+
+{% endblock content %} \ No newline at end of file From 2d3c542b3211c487ea64fa49a29d965b7947dc12 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 11:42:40 +0300 Subject: [PATCH 43/54] admin change for users and add campaign button --- app/admin/templates/administration.html | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index ca16f76..b37eb93 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -15,7 +15,8 @@ First Name Last Name Email - User Type + Is Admin? + Change Admin Status @@ -25,7 +26,18 @@ {{user.first_name}} {{user.last_name}} {{user.email}} - {{user.user_type}} + {% if user.user_type == 'Admin' %}True{%else%}False{%endif%} + + + {% endfor %} @@ -33,8 +45,10 @@
-

Campaigns

- +
From d6c532ea492588d1fc186b8c00112016c74cfb75 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 12:39:42 +0300 Subject: [PATCH 44/54] admin change for users and add campaign button --- app/admin/templates/administration.html | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/app/admin/templates/administration.html b/app/admin/templates/administration.html index ca16f76..b37eb93 100644 --- a/app/admin/templates/administration.html +++ b/app/admin/templates/administration.html @@ -15,7 +15,8 @@ - + + @@ -25,7 +26,18 @@ - + + {% endfor %} @@ -33,8 +45,10 @@
-

Campaigns

- +
+

Campaigns

+ New Campaign +
First Name Last Name EmailUser TypeIs Admin?Change Admin Status
{{user.first_name}} {{user.last_name}} {{user.email}}{{user.user_type}}{% if user.user_type == 'Admin' %}True{%else%}False{%endif%} + +
From 90c0f3ae98c4a7cd1c19adee4c840b1aa40c44ed Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 12:39:53 +0300 Subject: [PATCH 45/54] arba yesodot blueprint init --- app/arba_yesodot/__init__.py | 9 +++++++++ app/arba_yesodot/routes.py | 15 +++++++++++++++ .../templates/arba_yesodot_homepage.html | 6 ++++++ 3 files changed, 30 insertions(+) create mode 100644 app/arba_yesodot/__init__.py create mode 100644 app/arba_yesodot/routes.py create mode 100644 app/arba_yesodot/templates/arba_yesodot_homepage.html diff --git a/app/arba_yesodot/__init__.py b/app/arba_yesodot/__init__.py new file mode 100644 index 0000000..5a2f80f --- /dev/null +++ b/app/arba_yesodot/__init__.py @@ -0,0 +1,9 @@ +from flask import Blueprint + +arba_yesodot = Blueprint('arba_yesodot', + __name__, + template_folder='templates', + static_folder='static', + url_prefix='/arba_yesodot') + +from app.arba_yesodot import routes \ No newline at end of file diff --git a/app/arba_yesodot/routes.py b/app/arba_yesodot/routes.py new file mode 100644 index 0000000..b677a47 --- /dev/null +++ b/app/arba_yesodot/routes.py @@ -0,0 +1,15 @@ +from app import db +from app.arba_yesodot import arba_yesodot +from app.users.models import User +from app.campaigns.models import Campaign +from app.campaigns.forms import CreateCampaignForm +from flask import render_template, redirect, url_for, flash, request +from flask_login import login_required, login_user, current_user, logout_user +from werkzeug.security import check_password_hash, generate_password_hash +from datetime import datetime +import os +from time import sleep + +@arba_yesodot.route('arba_yesodot_homepage') +def arba_yesodot_homepage(): + return render_template('arba_yesodot_homepage.html') \ No newline at end of file diff --git a/app/arba_yesodot/templates/arba_yesodot_homepage.html b/app/arba_yesodot/templates/arba_yesodot_homepage.html new file mode 100644 index 0000000..1ceb498 --- /dev/null +++ b/app/arba_yesodot/templates/arba_yesodot_homepage.html @@ -0,0 +1,6 @@ +{% extends 'base.html' %} +{% block title %}Arba Yesodot{% endblock title %} +{% block stylesheet %}{% endblock stylesheet %} +{% block content %} + +{% endblock content %} From 82cd51b805c802306955e731749b17bd1118b9f2 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 12:49:12 +0300 Subject: [PATCH 46/54] register arba yesodot blueprint --- app/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/__init__.py b/app/__init__.py index f5a7dbd..7d5261f 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -53,6 +53,7 @@ def create_app(): from app.campaigns import campaigns from app.campaigns.campaign_api import campaign_api from app.admin import admin + from app.arba_yesodot import arba_yesodot campaigns.register_blueprint(campaign_api) users.register_blueprint(users_api) @@ -61,6 +62,7 @@ def create_app(): app.register_blueprint(main) app.register_blueprint(campaigns) app.register_blueprint(admin) + app.register_blueprint(arba_yesodot) @app.route('/') From d2a04f8b5addb7b15c83343925884f9bca721ed0 Mon Sep 17 00:00:00 2001 From: ydb5755 Date: Tue, 24 Sep 2024 14:35:55 +0300 Subject: [PATCH 47/54] add archive access --- app/admin/routes.py | 6 +++++ app/admin/static/archive.js | 31 ++++++++++++++++++++++++++ app/admin/templates/archive.html | 38 ++++++++++++++++++++++++++++++++ app/main/templates/base.html | 1 + 4 files changed, 76 insertions(+) create mode 100644 app/admin/static/archive.js create mode 100644 app/admin/templates/archive.html diff --git a/app/admin/routes.py b/app/admin/routes.py index 9e9a4c5..85785d7 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -17,3 +17,9 @@ def administration(): return render_template('administration.html', users=users, campaigns=campaigns) + +@admin.route('archive') +def archive(): + archived_campaigns = Campaign.query.filter_by(archived=True).all() + return render_template('archive.html', + archived_campaigns=archived_campaigns) \ No newline at end of file diff --git a/app/admin/static/archive.js b/app/admin/static/archive.js new file mode 100644 index 0000000..2db5a59 --- /dev/null +++ b/app/admin/static/archive.js @@ -0,0 +1,31 @@ +const unArchiveButtons = document.getElementsByClassName('unarchive-button'); + + +function deactivateUnArchiveButtons(){ + for (let i = 0; i < unArchiveButtons.length; i++){ + unArchiveButtons[i].disabled=true; + } +} +function activateUnArchiveButtons(){ + for (let i = 0; i < unArchiveButtons.length; i++){ + unArchiveButtons[i].disabled=false; + } +} + + +async function unArchiveCampaign(id){ + deactivateUnArchiveButtons() + var result = await fetch(`/campaigns/campaign_api/un_archive_campaign/${id}`, {method:'PUT'}); + var data = await result.json(); + document.getElementById(`${id}-row`).remove(); + activateUnArchiveButtons() +} + + +document.addEventListener("DOMContentLoaded", (event) => { + for(let i = 0; i < unArchiveButtons.length; i++){ + unArchiveButtons[i].addEventListener('click', e => { + unArchiveCampaign(parseInt(e.target.value)) + }) + } + }); \ No newline at end of file diff --git a/app/admin/templates/archive.html b/app/admin/templates/archive.html new file mode 100644 index 0000000..0395be5 --- /dev/null +++ b/app/admin/templates/archive.html @@ -0,0 +1,38 @@ +{% extends 'base.html' %} +{% block title %}Archive{% endblock title %} +{% block stylesheet %}{% endblock stylesheet %} +{% block content %} +
+
+

Archived Campaigns

+ +
+ + + + + + + + + + + {% for campaign in archived_campaigns %} + + + + + + + + {% endfor %} + +
TitleGoalRaisedCampaign LinkUnarchive?
{{campaign.title}}{{campaign.goal}}{{campaign.get_amount_raised()}}See campaign details +
+
+ + +{% endblock content %} \ No newline at end of file diff --git a/app/main/templates/base.html b/app/main/templates/base.html index 39f6888..b105f4c 100644 --- a/app/main/templates/base.html +++ b/app/main/templates/base.html @@ -18,6 +18,7 @@ User Page {% if current_user.user_type == 'Admin' %} Admin Management + Archive {% endif %}