From 0ef73ff181afaefa26461ea37a87e9d5f1aae450 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 25 Jan 2026 00:05:22 +0000 Subject: [PATCH] Autosave: 20260125-000522 --- core/__pycache__/admin.cpython-311.pyc | Bin 5424 -> 6089 bytes core/__pycache__/forms.cpython-311.pyc | Bin 10186 -> 11128 bytes core/__pycache__/models.cpython-311.pyc | Bin 20325 -> 21512 bytes core/__pycache__/urls.cpython-311.pyc | Bin 2419 -> 2514 bytes core/__pycache__/views.cpython-311.pyc | Bin 23935 -> 29844 bytes core/admin.py | 15 +- core/forms.py | 10 +- core/migrations/0009_voter_window_sticker.py | 18 +++ ...r_voter_window_sticker_campaignsettings.py | 31 ++++ .../0009_voter_window_sticker.cpython-311.pyc | Bin 0 -> 960 bytes ...w_sticker_campaignsettings.cpython-311.pyc | Bin 0 -> 1799 bytes core/models.py | 18 ++- core/templates/core/index.html | 124 ++++++++++------ core/templates/core/voter_detail.html | 23 ++- core/templates/core/voter_import.html | 38 +++++ core/templates/core/voter_list.html | 55 ++++---- core/urls.py | 1 + core/views.py | 132 +++++++++++++++--- core/views.py.tmp | 4 + 19 files changed, 372 insertions(+), 97 deletions(-) create mode 100644 core/migrations/0009_voter_window_sticker.py create mode 100644 core/migrations/0010_alter_voter_window_sticker_campaignsettings.py create mode 100644 core/migrations/__pycache__/0009_voter_window_sticker.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0010_alter_voter_window_sticker_campaignsettings.cpython-311.pyc create mode 100644 core/templates/core/voter_import.html create mode 100644 core/views.py.tmp diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index c6c1cfd2751b862afea3123c619d85ca40f144e5..1d14269dac3926533479a7511929df1653c3314a 100644 GIT binary patch literal 6089 zcmd5R-h1%jyzaRN|H-Ou6qWl*>T37shaP};!C_gEdVyR`tQFT>SEX|6PH7BA+oTwgkVtUMp>v1Qc zC!D07bW(cCN$Y7Rqi39~o^^71&dKX}XG9-yM)gru(Ud!i75!1MVoZHD)_UNph@$*V zU;om_rBs}x5+pUznh!`#Y6`7RwN_c=l}ar1^)JbhB#snGO}A!yIbPB9&#fgzp9wHV z`!J@7F*7jZY=AM=hcQcxxq%t41Q_Fe81uw9GBD#@fHBdBag-Rx24Etrnv->ur$@j(gosJB#yyy za5=!3>BCqc#;XG}t^^pfeHfRBad}|I)d1sYAI248TpgJ4nsx1gQe685d$FjBm}xn7 zIE7pIzDghLx(^5;3_h#^t}SP43wxyC&&GvPCR1UC$IFlIFhs zoR#gpDm`#?({yU4y<2&}JTSYZc5$IWt2CV<6Mj;dqN|poYb>HiEmeC zTPfQW#;Fi1JH@z28b-x*m|=*tVK`N*UdA|U7=N#uWq*aEe2W+@va*P=A3SazDrYpO z{Ca(Tuj;V%`jdLatFN;kSgGz+`T9Sq{JC2*OKhDS!PceoZ`AhrB;6w+K?8S|pwa%E zWak=NC)r$M3m-n;5*@7dtqn{Si79Oa$EUwj5I4uB#eT{0^MS;#1mbC{JHEMQb< z0iA1MwHHY3vFXN_`1m(LzDI41CUBi$r4uL$QpD2qD2uW9uBIof2n8%EGJe25N6J$C zqKJZsy5;&VDao1XG0QN$LzS-(+fFeVut{Xgw(A*|?bgcXzR0=ExTep zh=eUO!3|owOp6>aLSJ{4pcACm6CX70pG+<`wogV@kJfG-5(?{5@jh*9nT6$V0*~fYMP}U)E3Sox@PX ze?zy4jC9dcyG+66zXe+$W`Y0GSdUO)xd2Ci(Uu zF}NC^LJa^?oOjf~RDU%tJpjhLPo>`SA1EC>iwB|{@+*KqM*R_U0Axw1e9wl;H$;cf zw|(kft}DvZ#kziuRRG)<(seSVD@2FTb*yXOUasya6uQv0n^*-P)k5mdgw%!T5b90^ z8jQkJ}|rjL|7?*%qClhFh=Is@xM9Dy*K#cj@4_ zM6_gk`y%FgBvDNG2hDv_k8cx*)V|3r!=-+V-^1h%;41<;g#V23UBH(FB4Jt>S1}wmx9rBisalZv(mZdSU~{eb~5%kAHMPbO<|U z!mWDCsF=(sYJXvy7_W7=^U_r6)N;PzhTnnk$58q^f*t->3S`}0;41#1xN$XZ~JFb4x>CkmVH@FWqCpaFLDpf zC-t()&&wHJGequzXO^Bb>wHeOyh+Y>sS;2}ncl|RjC6(Ub!D$7yCvC)$RUZj?(jQ+=HOH3U$i=r35mHLW)@|7ko2G6c$AfTA zL<`9AjSdY&Te*HTx^k?pHr3TrO;a~Xss4DtngzMJHdT;qs$jd;xvfLDbgWYTErX6S WEer?bAsHyjG+G7EN?2Z&um1t=o7$5A delta 1769 zcma)6O>Y}j6rCB@9)FBIPt%fYk1gx~VtNWj9eOA&@E--1BDQmO-sLmXGe7bLYJK z?wdQ;8{a>X`X-r-OMG3ww`qSDAEt`Rc4#<%(vT%ZT9vwcE=t{SPkzUsg-}6FD-y?< z;f>nxt2$j#bT#KORF!M7DCfpl&klEH)x0kZSctQb*cB#x;U^X}7LuN@KaoKhxOytx zkSj85(nT-Z6IhB;Rq-UfBnr&1MV2i@fqGeRIp*?Xt|GVz<_cr3D!3wZrCm;~`GvJZ zwOE;z3M*nOlfH0;g(?d*Ur5&j#c6acQ0@OEb|Tux8zZ{(>-qw?#Q@H(zkoA z(e3yI{h_DmgNRO-!=FU5EIC=)ADNAmz3^wPBv4spbJZK2q&L-yZZ_rvyRRR1np6A;Ez=MYq(7o|?I^il3KOBVLW_(RO4WxfZ$6 zeM=9l0dksQl<3>;=Ehrgf3xQ}dqD@*nga(&)2-;7x0gBJ-K3>h@i?~NV3|?Ob~ie2 zZrbnlt}23Yo`PmFw4DP81Lh5IfC7CH^UWK+`80*%xy1!!JPmlb%VEd>(U(KG6TLb- zF7wlP_OYCrcorZ!ao?#qb}A-}XCJ4gBX9y(2s|fxAwD^NM?Ozfn}Gw-kXir~0fAn% zzyTVxoiM$FXmMT7(7IL(TIooBsMR7=z#+P9f@0ns|SoN75R@DE5BG>2A38xq-6^@+4rL z!HPO7h>rtKFpShrx9jv=*UzE4UV1Umag2a-5Fid*v{*Dp>`jz512u3I%isV@^s#=# zJBnpKihZ=LH`Y}>Y=@+AIy@HHa z8QRVngaLz>!2#CkXxh}oFyOXrnN-TWo*pI7bl%wNcbqlxec{j4mzi>2Oph3MF_vPg zn)GXC`k*LCnErR6d(ork-|cSod(Sy%*AMjA1l$ctN^v*;#}9LVDTbuT%kqvuG1>nDU|mUt diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index a81cff1886e5fce313d3b1554c1cd3f566a17db1..6f72c17710490bc276a98d7ed844dd611b509918 100644 GIT binary patch delta 2751 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 EKZ-Y>YybcN delta 1827 zcma)+draF^6vuz3v_EKR3xh&wOGjZm*1?G2O60Y{cx`Oj3dE3NwgA7M353z+w)nus zZV8)Yk{CTPYO=8y6WpZ9m_MD0(QG6x{$VyB@zrTE449Bjap-@>#Cv|FlXN88P474N z-t)QNbMLurC(pt1G??EpnG6DNU$l%3U9Wt_oCm>+WdV&SiQR&`P+8D?X@LfO*;-)H z2(oTiB$k?-%4caf)#lLYDS|)O7DUojM)e~`N{i}eKoDkmk2k;ZzJy67%!wV67&Rn$ zWF&c{b0&30BM6aMF6)Uhlc2N&w1L_308CaAW8B0id!31_Czm!$7O!7U;((G#GE2P5 z(To`_uMqF?=Fe5l?$258Jy;}Oh7C8&Qz2WzoTp1Jraj4Kv!gp6fXU}fL^tgGKNU}w zNw2cuI9pYtg1gL?XjanOx{^{E?n|CF=zEOD2V|o+E4uiz@2j93HCJ1LMkc#p_z}D6PMX zcN#3{t=f?l<_Ls@z_PxeI7scM2u`Z0dA57?5(MSAfBqJR<6~=K>7BOA%N%k zZCmkpofm$?uj{-8ON8Fw5;Mso{9r?Y(Zf=ISZ2i(SjIi|Wrjr>lH9~#{V7<)=2{zC z8h+ppaJ%6}SjBK-w~aj5D#;L+SgNnf+tb$4!~VdVjYWnP3XrUzarYFgs21)lvvPTN zEu@cA^e>X*IH$LvvuPNXaI&dS^RIx*O;6{j+dB#PhlDE0mN3{{Wmuyj$r{c!Ps5sO zJh=Bq>n#eL;Icw5>ejFqXd#08+8^I~KIJjiO4Hvdl)|V8F|q$hU~DwZR`E*94iNEn zOKhM)>t3&*bHt8_fnwKH)|4~LlJ#-9Db>yScdISWeu+0i^3v1i^v$Z^y@YjZ) z3(Bgy4X?IaAQNx2_uADA2gz0>LnBGNl=x^zr9n?~5&i5ploHB*_h#9-1XT5H&r zF*7i%24V&=3ZuVr3WM-6@ zyqK+wsYq(F7<&M>0?-gfATAbWnq0_UB`7(=^oq3Z2EPj|&KFsnudq08e!||s$geNK N&(y#Tf<nSIWI340}%Z2F3tSP#=!6x#DM`ZDC6_0jp|F8xYC89#8Nba88o#f|6(d- z6r22?Rc!MTW(Q_Q@ySow$|fhU`*OdvR1U^6QH8Gc|C7V390P F4gktd9BBXm diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2874f74cdbe29b35c50741f093c21ad1ce5453ee..c8bcb73657593ff3053ea56b542f71384964d0b7 100644 GIT binary patch delta 10704 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 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0010_alter_voter_window_sticker_campaignsettings.cpython-311.pyc b/core/migrations/__pycache__/0010_alter_voter_window_sticker_campaignsettings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11000e2296fcdfff2d1b3d86aa2b335c5132ee0f GIT binary patch literal 1799 zcmZuxJ#5=X6h4v?^)E~Qsp2|GZ8deP6p&OPDG;{^;MmO{8mEB+q)-d6wC+q%rby*T z`A6vBp+iS+?a-kpiWEgObj;8pV@3whAly`-lQ$ail&SBIqEoj%lJD-lJHGe5@7~>S zxm+4S`{V1L`D+ZJzqt~%_;~PY6$U>bjId;(h6KHA$sMJkbYhK|gk*FJVdXo7V?=33 z|DY!dLQmlfTO*F8bySHTa&@gDvvkKasP37L?J~9FU}Cw=@mkSk$I7d^#A6c?w;^N6 zkQ$1NNbF4{EMsm_+lk150a$*Ka2%^RF-Sgvyq>}rwn6GNGT|#3&Eho92w$laOBQEw z4(A6Gr~PcoxFA*v{`hKK#FKbxFn!uTteX+*GLc7;ZRetKTRj=&Pev2b2)~6(gLD7& zXDE0Up0|IJ2Xm+A47pLj=Yi)7EOjs97s!q^9ZJ}2ysXGe2Av$;hm ziwi5upEg$%{;%!WgvHiCf)?M=ZO`rJ9`SB|J^UT)N=tY9ncMn_jq-F4r$O{*9*JPl zYUp*Z=T>4Y(QG+plejE_$)?`3Jg5qNSF?z1crBLQCUnDbiDv5^Qc+-zSBcO76xdjN z(~_ACQa~QXaq(}QC6 zhz;bhq&r5_&v5pup&2}+99x4#h(}nK5{ttMlaf8BUyO2@kCLg#A-Ji3(*esbWGSxtM~(=ARP*D&c48xy-}LMr^Qvh=bA z^>LFEOZk~$sg;%<>MXM&SiHygfn{%)#xhVVma^<>NK2^Y?%U*{10qya+}3TwVKUxe zNs&4ndzM&PUSC;W{fwoZE*W11zoS($6EX+k7g+i~cY+Xdch zoYLBxE2LJhe^l3W4*kpm*P7!Ji8iI$-J|^I3Bm6T_dU30_D`NbMX73_$kXcn=Rq2! zE`FaLCNGRi7e~c~(Pa5xaX4A_KYSd%0YcwOH)QDU%MW<>jl9FVsa^R<$YUXcL@bp) zLLiR0;BMdHZo%ife-&r^(&dBgVd?U-*o#YkL-TFwm)w^ncUW@$f;TG8`{k=YFAmFB zpFi-w_|hkaUv9lDw}$1GUoc0-S%0qfTSpc!^h|{iRo68B3kai}DgB6%v1qdl9Zafzj*ar(um=r`JJ+y+G~;h(M7f2{uDo i@X>tuj?f4GS#O}8lhgqHUmT=|g-b_#;`oeNf#Dwn?f#tr literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 7a0450d..9034959 100644 --- a/core/models.py +++ b/core/models.py @@ -95,6 +95,11 @@ class Voter(models.Model): ('wants', 'Wants a yard sign'), ('has', 'Has a yard sign'), ] + WINDOW_STICKER_CHOICES = [ + ('none', 'None'), + ('wants', 'Wants Sticker'), + ('has', 'Has Sticker'), + ] tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE, related_name='voters') voter_id = models.CharField(max_length=50, blank=True) @@ -116,6 +121,7 @@ class Voter(models.Model): is_targeted = models.BooleanField(default=False) candidate_support = models.CharField(max_length=20, choices=SUPPORT_CHOICES, default='unknown') yard_sign = models.CharField(max_length=20, choices=YARD_SIGN_CHOICES, default='none') + window_sticker = models.CharField(max_length=20, choices=WINDOW_STICKER_CHOICES, default='none', verbose_name='Window Sticker Status') created_at = models.DateTimeField(auto_now_add=True) @@ -286,4 +292,14 @@ class VoterLikelihood(models.Model): unique_together = ('voter', 'election_type') def __str__(self): - return f"{self.voter} - {self.election_type}: {self.get_likelihood_display()}" \ No newline at end of file + return f"{self.voter} - {self.election_type}: {self.get_likelihood_display()}" +class CampaignSettings(models.Model): + tenant = models.OneToOneField(Tenant, on_delete=models.CASCADE, related_name='settings') + donation_goal = models.DecimalField(max_digits=12, decimal_places=2, default=170000.00) + + class Meta: + verbose_name = 'Campaign Settings' + verbose_name_plural = 'Campaign Settings' + + def __str__(self): + return f'Settings for {self.tenant.name}' diff --git a/core/templates/core/index.html b/core/templates/core/index.html index db73f03..91ce1a5 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -31,14 +31,18 @@ {% else %}
-
-

Dashboard: {{ selected_tenant.name }}

-
-
- - +
+

Dashboard: {{ selected_tenant.name }}

+ Switch Campaign +
+ + +
+
+ + + - Switch Campaign
@@ -46,60 +50,84 @@
-
-
-
Registered Voters
-

{{ metrics.total_registered_voters }}

+ +
+
+
Registered Voters
+

{{ metrics.total_registered_voters }}

+
-
+
-
-
-
Target Voters
-

{{ metrics.total_target_voters }}

+ +
+
+
Target Voters
+

{{ metrics.total_target_voters }}

+
-
+
-
-
-
Supporting
-

{{ metrics.total_supporting }}

+ +
+
+
Supporting
+

{{ metrics.total_supporting }}

+
-
+
-
-
-
Voter Addresses
-

{{ metrics.total_voter_addresses }}

+ +
+
+
Voter Addresses
+

{{ metrics.total_voter_addresses }}

+
-
+
-
-
-
Door Visits
-

{{ metrics.total_door_visits }}

+ +
+
+
Door Visits
+

{{ metrics.total_door_visits }}

+
-
+
-
-
-
Signs (Wants/Has)
-

{{ metrics.total_signs }}

+ +
+
+
Signs (Wants/Has)
+

{{ metrics.total_signs }}

+
-
+
@@ -117,4 +145,14 @@
{% endif %}
-{% endblock %} \ No newline at end of file + + +{% endblock %} diff --git a/core/templates/core/voter_detail.html b/core/templates/core/voter_detail.html index 3a3412a..f1895cf 100644 --- a/core/templates/core/voter_detail.html +++ b/core/templates/core/voter_detail.html @@ -137,7 +137,7 @@
Campaign Assets
-
+
Yard Sign Status
@@ -151,6 +151,20 @@ {% endif %}
+
+
+ Window Sticker Status +
+
+ {% if voter.window_sticker == 'has' %} + Has Sticker + {% elif voter.window_sticker == 'wants' %} + Wants Sticker + {% else %} + None + {% endif %} +
+
@@ -441,6 +455,10 @@ {{ voter_form.yard_sign }}
+
+ + {{ voter_form.window_sticker }} +