From 88ee4c251664b831d6b1b8be82401e81f0962f38 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 13 Feb 2026 01:55:39 +0000 Subject: [PATCH] Autosave: 20260213-015538 --- core/__pycache__/admin.cpython-311.pyc | Bin 106172 -> 106936 bytes core/__pycache__/models.cpython-311.pyc | Bin 32658 -> 33206 bytes core/__pycache__/urls.cpython-311.pyc | Bin 7414 -> 7772 bytes core/__pycache__/views.cpython-311.pyc | Bin 119823 -> 130614 bytes core/admin.py | 27 +- ...ignsettings_email_from_address_and_more.py | 48 +++ ...mail_from_address_and_more.cpython-311.pyc | Bin 0 -> 1720 bytes core/models.py | 7 + core/templates/core/door_visits.html | 88 ++++- core/templates/core/index.html | 1 + core/templates/core/volunteer_list.html | 52 +++ .../templates/core/voter_advanced_search.html | 52 +++ core/templates/core/yard_sign_voters.html | 352 ++++++++++++++++++ core/urls.py | 5 + core/views.py | 224 ++++++++++- door_visit_patch.py | 264 ++++++------- patch_volunteer_list_email.py | 64 ++++ patch_voter_advanced_search_email.py | 64 ++++ 18 files changed, 1092 insertions(+), 156 deletions(-) create mode 100644 core/migrations/0042_campaignsettings_email_from_address_and_more.py create mode 100644 core/migrations/__pycache__/0042_campaignsettings_email_from_address_and_more.cpython-311.pyc create mode 100644 core/templates/core/yard_sign_voters.html create mode 100644 patch_volunteer_list_email.py create mode 100644 patch_voter_advanced_search_email.py diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 950bfbe1a5cb3d649ab6783af473d6b27a947a45..eedae029d55a8cc6510538ab23f993549228208c 100644 GIT binary patch delta 777 zcmZWn&ubGw6rP=JHoKc_OlsOFX|%P1t_Zz)Q79s9m5Pv}Acb|!Owz6UBhE}HY9I#hutmexB+~j}==effProLX<=*(vbcP@^^}}X~9w1pzoue)M_KjHEde8Yu8><^;Y~3v9Q!XJN&0onU<6Zpz^>iz&;l zRDy=jEb5>zH{cp<$zs7Z?Efu`2l5--GS4!=3z5Gmj{+nj>()rENlaUOwdIX@B ziWHz1d!v_ng~L%oE^)FCTv36(pO;5KEo35DFLF)ibZ&1>Y0rt%cNK=F-F^H(T85JL zhvZofU9v7J+hA%dCFk?{kB H0&4*PVEZ0d diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 54e855180c568931fb60e6ad3d03b6f80c0b1589..2f1b65f218721beb197a985881df56df4d2fc4c5 100644 GIT binary patch delta 757 zcmbRApK)6=6W?-PUM>b8_&%>EGtqA&Usf?w0Mq2gbjQgCg4~mj6@REtWzGVt0I5n5 zOyO7~w2X;?VKop#K$H*@15k}HjGrRBMr0WyPz4Y}RfvF9;5S7Shnjk1tHi*H#9;;l z9fNL_1eyv_3>A`K6;eoMh@m-Gnu)=kAw|4}Aw^;t6Hp20!G^ID+ zD(PkvFIosRs%Sot$n*vVN>K=qsW=?!sQGRZGVoFL;YH@LqJHupQ0df9j zpnMUCSP#U-k2Wu;;9{)5A)qjU?TUcH3g-Qhnq8DMyCP|JfkkZds>%vR#wDATtIb#} aMHr1fFkliB%BIwO1c`saB3UE@3^D-9b8c*EA3dERFuUsf?=%;bi2r^yC_+>?(Le^7B}ND*vdND*4b z#K5o`h#??KC`Gu1Axbz!B$z={bo05=ZpO(jvSO1v%c~i;PiC!H%eZ^;<_Z-?k;ykI z)=p-u(qQ!1tX0LuxcOXl1ta5}&F-~kES9{CMjse3i3w#>YCeL*zhIFpk^wpZ01Hnx A#sB~S diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index c59d399fcdce28894b72d86a1005e9f6e6ba84cc..54a0b646e1ffe68efce6f1db0c1bf887ccb60055 100644 GIT binary patch delta 1566 zcmZ9MOH3O_7{^)ixmoiJkTv!$;gKli6)=yulpY{1_Cw5 zsH#+1bK%sY9ulfltt)y!J@rTrQD>z&MO9Djp_MAlsZvkvc*dKejJ2Qs|L^pm`U4F8_6{ax1 zn){`~b4D&@BqJMPgXeb~C{yA%{?ZQqA^CBHWgY zMK_Y}mltxz$Qgs*4_&UxNc!>jRoA7Ggw8gb7|MlV^!vr>Vn34-yOPy1(v>!89Bn8X zi=Qa9EPln~sZ!7MA3PR0>KezT@#^BUK+h%#Nrbv>%6R?`h!U(Ro! zI~yRL2|RxvL(GI2ff&8Qfj9F&d)7uehEHoTESRuBV1bG!Xv)`Hj{>Ak|1pgrXhM)c zkT&!AE%|!eQHr>|_|{zv%O)(7G%V9rPPFHVj_g&^<--%p7(yn52!yDc108w5omEID z140-K6AS_d?c_jL9_Y+^NcT9N31f(u5Frqu-5hu;5A>dRNZ$fB9%1O%Hes8*C>w)=SRgZO&$|w9JMoZOPJee#-&Y82s0^G#rE1m8>#QX zgEJUrO_(JxOQ!@fZ6Tg)iu6q5;2MT?6V?f=(;0!xq90sM@|-a9=uc(>!n})ARg;6l z+(iSbDlZEYLWZiP4Po9p`*7EA_e~656TAexbVU%W)-Ke85mMvM#xeLz@DcFQ_XQEQ zh~^^?X&u7;I~bNsSR$}QBLcZ+A-pC0cnbZa7RymlypKvWO^ylk0J$~I{!o}T3B6F% z^tx~x)*^L>3TYU`BWKzsE|3o_q~Xv*t_2)2n1+aAbMfGC$Ao+ zNTZHNt)s(E&QKw5J)b~Cv$bQ-CiKe67>lpe?=qJ!mCj>ER-G-mg k;nTYRKS5K1m`2ZQRCz|2S@fdDSuw}WesS)X@Ubu7f3Upc9RL6T delta 1249 zcmYk6O-vg{6vtWmsMlD*Ns1SH*EU27C44yGIxayF+X36yNeLf`1;W^F6P%V7LYs;d z+8A@Bm#EeBKyOGrghSOj;=(bfs8Xxwjr5K=x9XwosE1zLWyULYSNrt)>;3laYId}* zCjJ@gczWhcdy9SiqJOzI==-|EuRVO$x2fyP6RTUdTlycdv+h4MgUz-Z$I13JUAxH8 zYaIW5{xywtc0SRr9e>w(MPtAEW;_{tie_J*{^()}Bcf&4x?$OM-w50FsjM%I9-DuY zRqyJ4J)?PBMF+dp6>xbapJfkhJ}3D+dt&n&k~`TCHv1$S?4`|JlKt$@F4Gl|9AsX< z=?X~>vk{xSCHJs-zgfQ^`C?0(doPXd%Z)Y~nfxh?u*6}BU`h1K{+rGI;8B4hspoZs zMGlJui=t2VFE#s-qb(Xv5{D8&N%Tu$s40vzdg-k!&Xf?!9LiLOvWQ6Ia?==Y z_$X={WrPZc3PD8-OJSrbL>qC6-N5-(ger$BK~+ShaHT1Xoy2K;2`k$OI~;Zhc0^nX zZ#RYUlLB2U;@!sx-WrD*K~0QG<0{(@^tr|)C)oFfUr$O-X{R4!;JPN$q$UULhYs4v zKhUsOE5#v2kP=f$NNcCxOV6m3WkaT=Ppgn)v!+$gt8haNLifZ;l@cp>uZFP8VV7W6 z+*HatjuJj>qn=Sr%p)vtSRhysGfKJTDDlP?jn3iXI>H8r4T23ZtCTrMNj>kS$@}bg z)70lxYk_&JOZsgU?yzyo(hDjqv$AFCMHN=qo@LcbDwNeYwE#mHn?gu)NE4(*MH%lp z4>S)l6dZ1BB4jya39{lnW!!a){-ZbzUdP-rLXks}peXJsWz|vSuF2snGlL$zs+#v% zBxvdHtMCDv3tH|q6+YD1&xSepkxJ{%knTetT}WW&e;aETJBoaPF-+Y-C~znc z6vP)wdF&{?hg;N_!fEzx$fMU(bCSIb1@x&_x%JZQuaK!{RLHV(VKX|dLatS9O7pA2 aH>INhLX1OX zUQpDa7B^gK)M)F1)~b)zHlb-rZ>4IV`t)(3jjeTWpYP}WxifPoX7y}kLt_-DS2PkkUICCNm;Yu5j;;RfYkYMwbZ@!*(eW;K>nmk5*F0x2kb@^>VJ8=~enf{zZ*fR$nPhW|OCK%T<^gex9|* zgvs;>{ipw`tKC_9P1Wn%*#y_SZ3H(^i_ z+$98S+@%C-x$ISQxy8+?&nV^L)QFh!37g%cs7{@GG{JiJ7=jIM2f;1wu>`le%L#hj z;|Ml#8;q~UWM(wED=4qoJ%M0LsN~l%nU-z*^ifQ?MRKYjw!GNqo=Wxn?h6REx~CD` z?w(F?2iG`3eO?`#Y1zq7x5SoPc7^hPPx)>9^f$`Cnp49p<(76%U2ZAQ=x{Hfo_4zz z671yMo2Yybr(UGg_c-+zN`0SGC2{4JYdBR!slA-q9ao-vt$P{uaGkq~;Pvk11ov^- z395Airv@o?Bd6@~<;g#AucA8p`T2_Ya?1}nbseQ{;?y&gx|vh|MX3Xv%1J0MJm?Yb z4SP+;XrUhoF1M-r7A^;MTN5%ZO7N-E`JI}#5?5{V-qv_~_3e#nwMv}jqIn!bi#n4# z=Uy?CliW4m>EZBM>()lrO{l)ZZCPb$hb;Wc2CN*32~*e zBx^!3@->^Y-qqyxdYr8--e#BE<92Rt@OorJx001?HeZ#fblGkY%ayS?buqEBp!?RG z+*sxD{O7y>QLrvnv?wb}^F*$)rF4O~T6whe5+S=kFC8m{RLaVHB44?!Z2H(j43p@p ztCOBOm)|4PF`ePaOsVtuoz2o&D?KQjl$ zmWC#`XQzCMvggr%z8SIIpATDVUhX_u>g=uG(p&26E8W^(y7g44JXtDxeeHdv9sQ*p zUl4JZnE%G`Q-Vv)pD{%Ka?W3FM*d39Uuo`MI`TdtDwT=9%va(@zaQttG`1>dMi;p; zv?D>LA}1f95ughoi+~pIYpt#I_+Lo>;Kl6cM`-_<-tiKQ!%Q zU{cW%!J$=CmR(v&4L$_pk{~0HOMvSC66s$M_*&Sjh{=)U%nv71N{elA)p;DTyvUk` zSV8WRcPJlB8Qs~1ibnxJNVx$3EU3=GhgI-Xa(p}EQF#*Vs8 zdElZE**x|(DtDx47Vevf^X^3tir*{yW|yq&Li2NyNT<$UQ12c9rp{lH8U!FFH_5*N zj0N~aefw3BS7i_)jyY9J(9vpehf(AV8Za&5D5VoZCxTV4?e_Rx4PN!%H2qL{e&HPPk@C&Ljh$an#zR7WNq-!<`sQJ*j9rCA*5VpH{`zLO{08mU zBPX_@X>)U6?s!gU@Hw};ybW$G*5}&pk>8@`KLMDBoz1`&|IbI<_5c#FDYw1{T7m`t^A4rX8oHAWOX{vAX!_0EQ% zT0o6Uf$IIt0Xmx5%AA!RLiPTYN#;4B)t4Vqr{87ti<_HV%;nNk3$tM8nk%2IDh?C+ zL-)SE+T%jq{(r&kgo~Eo4$R3HPkq}*43T5l1Hp1h{*P%a(EqjKTsJ|jh!w+>f361S z?_Kk5)Mb`7s@|3n!uo8CUPRT-!svxSm>E49>S27o4i&M~`tA>B^yDB4L%F<|Mvczp zDa_@;RV zEJB`Pmykb97Gf04c&#F&a!SDLV8SFR#m=G}7R#w%NpHhekGG+|nKYq8S?>HcfSza5 zCuTzc8`6f^Q1b92G5lx%Rxpg8Eh>IId1kz!_-WQ!ugBFyz6J?xR~ULc(}&r51VW@> zcajn0(=leXG;~27I>uUxfz43<9D`{>3iH(U?HRs1)0j(**0O@?b}x6k1BQC{+nx(W zy0P54^i^`}>|u**Jv;J@5Kz&VIm*ffrRsQ0(%?p(_;T}cFxYqskR1nLtmj0-HfIq8ss+}UZMrbxFjbS3B5$d6=nEbE;dfrg{Iib$?9Qymj5L$X(7N_8S@enurtOGM?GBY)U0)W|4C-gLwe+ z0TuvUO+~B8F=PrGcKp>!V_QWWXF8RmZKX51sNUJ_W9H~+-Ty)PvaNJ|s9#6wSwd<9(0;_UodTQqJ@?#VrcmzQL z{v98uym0LVFEEH); z9ZBu6?Mdxs{{&^`^F?Fbla9o8B>N|YH8r^>wtIf_j_xj=dE`q7zd zsZ>j7ArrBosn$%vXzL z&07O{)B^kotv&$wFMw`k{?BYATnle3Olqd`U(?WQdW%F7KUO0O+ddF{Y+#L9aP*2Y=d+he=3mA?7e%D3vpX8$DRV0vEW@hL+Y z>-bb<#i0q}0%gyk30c!3I6AgHR@qdXtNiXz_V5b`!@$oy{rHTCnyK!Y{^{zSZDNMq zec{luJ5BCccg3`)x-Ytj+WTj#b1x7!Tk6nC9ck@pU3N@1mO{g`m4^=(3p@6V^5Nme z)GcF!L${}Qm8&aj#qhNBEwIb^N15X}Q+e)=;d$-pTP6idq}e^ENx0`yjmdhANq3Gm zcTMGVO!}4!lU*-@yr{|h17ZNHgp@}#VYAWLk|CWkg5Y{0NC37 z&XEn`l4<9&xy)$5Sm&Yp&^FWJDOSg^wRq)wcjs5~h8w!qWFy)}+h)8)lhEHRfX4`E z2_)G!`x_`OyGnWg?wqMiDHdNKrk2puP`edjTP?AsLHg@CFn2XtGx>B~rIg=uMfwJe z3dtqc0kkRy?{V5V$ZPCiSa}pev~*2$u-s|FbBJ_W0%?$z<|dycy=P1t7{jZv(~p=-a!?Mh}gdM6sXu^8ca~%ZxXA!2fGSlXV6w}6N|B}+r%Z< z$@oKCeV$l~O#Got{5e!g&jpv_kzjY;kGg{v^asbh;RZ=SvAZ60bp9DcFnoyQuvLwa zk-V1CERaU(f>b{fiRo@oigCA4xgEcVpdx}LW_d(Oe(0Wn3hjRNp`3)$&@R#A>L)P6 zrvSVFHsz}yZxBA^$|q;$a!}O|A~UaJ8tb-qs;0qF3m-LjAmZlti>*t z&5c^@f@b$FGE8~l%*u}Lg(a9N1>JYGc(i1<$5$&GS`grn3iaM*Q%_teY%$U#l)>(c zCo?5dFqtlZqX33}36YJN+~xO6=~Om9HFq=PwHLD;x*7BsH*8WZuEyo_Oq)tvI&G?_ z2{s0~U;J0Dz$kWrV+1s_^k^}@)*8749qtFHM&Y$e^3x^aab@h&!=_w^3`E$pxWMVo zM&zsqfZgTDkJL>zrSs{r$+x1nE`a-$r=DIG_aqveQR1H&W&_2v7&_^Zhf!WnCBA&( z?V=ogaZ_qqy<43=Pm|l}YxK!?x?7%^8+Udq<2KA9hC_*jDEl`Q7C-%bQCRrMpe&O- zL|*-9DkM_$fH65qS?s3n~(Ec;GY2JFj2f`8jn?Tlq8ka~9XH1W55toP-o_F4iFI z&2d-kLK%2txgs52wg{alU>Y}43ZCBtJ25$@kRZxo8JyT5#62Hd|% zZwhk(a}8swyMO5Mef0RDQu&LijG+7q=w*aS5resT?u;H|#!JY}89m+;*ur{{&_ICk z4q}0Fb_sbd%xIXpmgw^rxcsd?glQlnB5=unyGZ;?nfCTqgv!KUZVe9=0+qIGyYw_R zZ}+(En@O13dD$x@R!m3e9R6%*db-%+6^Wu!f*}We^02)1ZNeV-XNse@h|J=}y(LM4 z_Uq;3PWg@~bKhR5w6rEG&-WtclGgWC%ygiQV`(2Tu1~&qQKaM-C!b%QU4s*a8N(dcPZd=y|E0ERGTp<9ht zBM)lAkrXEMHRLj5uvhXP9^VIuA)I8B^4@QA@_BP-=#HuAG$~gQtjwMloiP9GtZ? zl_s4Ey6JwL^6qI{IV+uH>VnLl;7`|-soR^qtu*=IA#-MT=^qeF=sx}K^=3Qo*b|tE zK~5F~peY?UDtrHUSuzVFohpj<$MNTbKTDJ;=$Csl1SYy6E1Hg4osE+l^;iw_5#z6) zw1tJ1c<4XT3WgmV7cznYJHWsWA(f);qyKpcko)LQFPTR~L(WhMHuRdUy#42*P8+D1 z1Hggt}Va2|-WEDj+WH0q;Z5NSxI z2i7~8*g0@~IZXM(C%>dwKYGS*o^kFa4=^=Nvduc5mz0!?zu7LoRn`uc8f@Um{P)n| zwTNJJraz;|JjJRLs~Xff-$gctqQ1)4gGHlR66S<)Hc!>b+#p91;Xj2c%2t1MR4h{d z`kz_K@(+hA&whGW;8>^mZ!ID>3L(f&Y*aq~`?xSX&uiI6VNn?!-l(Cq3q*sp6oWyB z9>|OUj{wi1r^U+A&kBV@dEv9?Y1P{PaYoP;rTQ<5#w`L{dodW3lI1e%(FdqtHJR@r zhLJtW6JLbOVb*2F4m0c-R&6Y4Sr{Kf?~Da{4~DaiO~YeaX~tT-?#Z}^PMr#@AvtV; z#Hr}s{AE0C8r<~izW%F=bt`7EEC=oeMuyk{607AnDkh`63-jSk6M+Fwnb82bgBv6r zof@;nL?bsyT1IGof&DR2S@%shQ9AA0Rpw<;*g~gv*w!dq1P93;Ab>q^9SvdYU18=I zU87PS|JQjrP>jc9pc=79Sf?1PdJYx9dx*tX9QC7%FV+C*TEHI&c%D+$qn zQFRWNiYH=IKQ)W8FcUct-{rw{eTPX;##)76D>=K)?&CcT;ez;KI*Ik#AJ2v&Pq zEG~mmH|&pi(8FeRU4r^O*B-sX;}@890Y4|Nq<9aLkpb=`s77D z&LnXdyOt=_lW7&N#h%^!o{3HOnfgV#m|hlgKJ-Cnpa|HJXysYRp5+-LUZfi{`AG?V;h>60a;GJ_JkTiA3<|f@r!;kfz%NI_1!w z2mDh!B7EefYU41m*NQo= zmLC!o+lJ{~6%H4x#c$M>;bP3C;5|BCZlpVkK})TjnhDL(g9c_Ew#0&(dDnLr$v#?JA9JYBPyQi_7UQl zs&A>0W4In-TTK0gX_9mAN`tpXVm`WyqPC3`1)c2j-G^NGZ}KL9O#mDUxD=zX{^XFs zI28O6fHy9OvsrttLkHCWkav!PD2x~|vzMSp=009kTXb~Cj1rp*>ZmJCYNXbf)lDcIFyim+O5iF(i9p=ppcgzGI zD1xyJc4E!RJjEtL@mYB)d>`?l=h?Bwlp!>9_vQ-qstZN&%#Dw=>YlP$B9_=tN$bn+ znLA&M3j{Pc4DvGCu)%xQz!9Ify@Gli_mLL#dJ4~RNW~K%JDK-*0y02#N0#hDjiUf; zW^y262_CDN?uOwU5w_r9#iOXmyPEsOzq?&Fl+xw{a~qZh1qe@uPzzZ8Aq#`OAWW1dm4q= z8obF)&p6DRg(|Zld-SZFQ&1T+(OtSF=ZNIO6B-)*q-I)Hz`v&(dLd^|${y=w;sPQA z$3(-fzt2#gT_#3`VHrLC$tW-~yj*;2!+4w{{y7G`!kU;Dj{P=WErsUggcu?e)b&*& zDd3^%)7OKvVHmVhZ@;n-!go-xbiDeLDzS|OFI`=^FW$*S=h#6s#cw03RLQ$R@Oubo zS^9|s@3cS=%cmb09i`%jbO|Z_sL%W6KDFXXF~9PDWc&yKr}gqdfQJAc26zPEIKZO- zEIc1W>PdiZfTsYS2Ix_LdLp zyaK?~*o#!e#(Nn3G2{IVrJb(={v2QhN?t?ib%4lIIpnTIxzcIfHi1Tt^Q)OD2=N^dWHJwW|2LOSN=DsK@4lEq8L`RYhUypWZQKD2I4}(UV*TUPkh!tZ4qlbht&4i6xma{Y% z8@K4a|``BMz(o?G=tIy3pHEfU}yXhE`(J!H~kNg`$z*HMOo$4DXCsp$9O^ zKLOZeU56B}PKZcaEFZ)^LM8NG7o9O^7I$l73%zmY!`pA!Xz?xpZ(QC6)9}c~M^5B6 znRqvmQ{D-11mG@!`_Xq=eRHeNQ{U`$`*geY40^d;o!KPpaYs?@`>L}^*vb!4np`?p zi+)G?PpI}mWDoqtS+{ymlPJyN2q9h5r}ruOtvsK6yr-{8{3-1M-Ze(V7GWJNqlr#| zocyMolkTrH(29dI>6&75tE~0N$JLK^i^9q%ByP*DYQ`HzxT|PykVX$Tp8CU1v2e^mLNaKagqA`olslB6)Gs?lO$zwQVV0lJA1T$k zJ)$I6p*^Fe?SKdG+~tyV@{e~NcdAGBh^2{$5mph8O7$;$MDB*&dh_i-GnKB=IRmdY z67CPh>4%vtmwrOc^tVfYiWG*Bd(qaS+c3OhsHr8?HaGGCfV@tv`JUMAxC2w`!YW21 z0~kR57^P3DiQgaM{HLJE&1O`5o~ymz#~)Z zKBSmmV}T9A1$2Rl>}xHdjhqp@|E48WQ)(&RgnNu?Ye_C2?lhrT+R>ba=N_bX0zwG5Pl7V96425lg|g`GCSIwOF1pKc zR%-U34X+vpDxSq7FW7TP@kD=u9y2#Ld&$$Mmz)g){dx7NYs5HlN`3ztksZgY+O2+b zjTjSnOTyb+M=$OKx0C!;&&<7|CQZMid;;^=x0L#bA_~U7NTU#MHUXm~+`w?Mb!4y= zMbuO@%2ofWh$RiTA&t{nRu*kBRTJj3%F#919?TwUh~90+OLW+4BrfRPQ`fGj#E6i0 zEb4S6quz5X-BC1j6Dz1|(f>8-f7~jj6tc=&gz3<0_NJf`!t;LhiQ9xjop+naPQ>2B zC6e3K4Y!FIg{RQL*&EFriTYtDs1}K>p~ctJ>m1GWa&8~mpH#DN7t za6do;CwEtMR?m?7-~VJdMeCLZhjBQ%A6kq;teXcXQdMUgv1rx0omss~k(e>v_u zX_92l+d_TI{k#tLN+fSAtH^FVQk!zmlV?GenYl@Tjl{ zuGRYxVQZy(Q?)LySN^T%wWH!va>KuosifbnYi z5}tPg(0>TO8&SRpe^DmU9Lq*0f1>JT590f2G0S~_yNd)YnpMId8rC+QIr;|^9*0bsX zaXkq2`v=9>f-k(t6X?fagS~jXmVlNNI5~2<{9#hTEbmaQkC3_6g^G;&S($;+H1K~E zEqD*HUS!jZH&S5T4VUE$AZ##s5|-H)U~%fimq6EFLn!MAa~&8*^dW(-)Hfdy9}${Q z9~bw=)SR2!pT}6>hqj~@i1OJNf~R1I=x;W>K;>;#WYQt?6?n^EzCu}AA{i1b`~ok9 zjh=f#Oz!-OvMEs71vJltFw8~FEOxYDIK9Lohv@z=UE2DQ3)Cki|1thp*zD5i=2FlxCPSIOtHM*50ZMWG zz(+hlcrC7#?~e@qjz@g3VN6WV13lt8OH>Y=2l}%df)A`KsHI7jqzAIi+vyKo!PIRJU5~J|fbyqec$S*EsYW7m$kfTb zw7n==%#|kf&0ED}d#KfS?F<^CZKPW8q9|3H>qVUUuNOu3#7fNNcbG(+Zak!fd-gsV z>0+r1UZSW>7g`+!I4dih+o@y?eH&r)yjh|Prh}lMVc(9&%aOG}uFv)}=&eHBmNFOt3$~jzU;$EcxH`L}($j zY#kvdA>;%?y1$-ATpZ+VWot&N`bwQx-zoQD6Wsvt9nXX^+lGZ4e%+_@Rb1q4CN1Tg zLkU-7joURxrA;L18(}8N(uBSd78-|F3Dyqe#NU5OKsD9TifyRr5beTk%2)qfFBUoI zm9H3jjLqlz0D&A!c+OoGw^Ejpmk_ttM3v+7)fLYZ&lB6Gj&>&;i9KlEUrXzr81^L@ z7QF2L@%qfC$lbEZ@*t*q3&3|{AT)H_gh-T?vW#r??kyrY`##8vu~cb~sn_n-|EVu* z5qYZv4>}1zYO+gj#Td5%Kuzc$$GRPlDuJP~7mPb1+PLv|W5}Z>wR)?V*I7{5TQsh} zV0>@xrS$KKj3=f&m9M9tb)ATRev6(S$SF`8ZfVe`_eNQ7WljI3we-|yclQ&_@$~0- z1`{obNrNVUn1uAWK~oUu7z|*-zXLc-bEU)bJCN?Y1GA5axUq!32L-6wRzTki@qCAb z74`l`uVeK2m|Ex192855x*h&aCz5($e{>yiI;+PBxh5X~cnO;o(a26c5^0NcBcmxP z-Q-7ew))^I%1GZ3rN;pt1qhkX@-aMi(||sV3Mr=l)Res84!FM98|i2_yhx|U{Lglizn zC{#mIU7fI8$7W%9Id}g<4mB~-^2>!xLDNXd%f0Pc@qI7InKB6A{qx`sF z`nWho=|@7(Byc*-RgO3Kl#Do^QqPc@Uprgf8p40F3=?S0D z>xie#a5l{%@XTGLa8alq{V~*;HCT!sJ2m4G{R(yu!a_`1A!w+7mcgmt zqA>_6httSE1=m2O?lBD{7xgEP8Z-$@_CQ+JKL6?D{DG8`{**BRm@%wBW8#1g)64qP zD+UVr&tOWtHSSXrfzJR2P4SjE8F+90ida}qGnAF{@@?X{Il^Et`xBJ+j%O>5c{$1z zIhpF`_leYWckEVPqXR;|MD&kWUC)UU#XdGeIXrfRn)(Bgt{nEIsBdkg?;^f^VVXK} z6Pa5dA5T;+8Jimu+iq5u|3Hk%KAtqx%;<=3k5^Xy*9dj?4pFH1U(ZywEJ#)#xml#g z61$YChkqan)!i#a9F_icL#}#cC7DFQDxIt7CH*a6RQ|Oj`$q-SCes#p$^7d`bfB3CGip5x+eW;<=8L_LMHz0>)3ZPZjZs zeO3DK_9S$b5gHG2j+BxBMeBEUP_Dl8C$;Fcbi+CeOVZza}jAz`4!*68ne z@+maiSMbf~&9oRUcS(<(PB84WSvEJ+wNkje!oGq&spIq5DN0kjmEsQiXCLjW0!=E|x1)2$q_7Q! zRcsrz2p_Sd5u4o9w;i#bz;x&qd}y9_dI6Pm+}D|_^e<8J)n7F7+rLiG>-#FcPFqY8 zP`^Kq{_KvzFtut#wT6Rk9HTJe7DkZkUX(rzz(*N|AJ<8YMPCjjslX9lEmM~mcoQu6 z@eJ05TIR)z7SCT(x!Sq-^5x5%iCc;ZDsSq^ys6JF?#-Lpm$$G#Z((n&?Y;Qay}J+P zoQyB+i!U9>D?MU8l{fBW-nicJ3-mhsQU)^fZyk3kbJ)quVO=x(GROC4j^7tQke0K* z{Zv}%$+Xh0xW2T}{b{53#eQHb>9>tKWgCCeHvWkXZ%pg8jqkHv-fz3S^OUXnq^-Kw zRoiQ;?z6f3ZSH+Z18MoE((EVG?0sp&`qPFDn#_q6r>)uj)}ljK_KsTJXI;~8UDIn_ zb2^eU>Qs`W#p(ywn+ya;`JvQUTvm7__wxNPxPg4=uh9!o4#Qnz3|YszI6M6 zWaEEd(r?g0UEptm$(nOW+&E|79D`uXpS`em)N=h_pLIpQbw#gr#Xxe-p^O{nR_>ci z6?Fn#_QclS5tr%z`mB}x*2-RM4T{Ixns)WV)JXoNlOYX zuZ~)gs5;Zg!`VexqG(gbCKu zQ%6zBh%Ngh?etY`I~^g{kvinpZ}hLO_$p)tW-^|D zql~m89LJ-W%z3Cs@S40AAewp{svYG73gNCX|z?pfl_c0I@gybRa@I zW<Dn1*;rh|Q6ckMbU{VM4B3W+w7fQzH&ZA9#+c#1V z&Y*T*Ko34@RyM7xIA1lGU3hEdsq8T)v&Zy0F6_&m)t^0UU*f-^1~YPQEk2bo@?^%y z2iHEky*FcIU&iA8jK!xqGpbHzRQ0a8vNxluFXO8IjH~v=4W!v_?zpkzhR*$+P-GVv z0)0iFb!ESGWv_K5YqBYQSyTJ7ruJH=M%9357*zur?cVE*(154&M)&7UIF&d1WZvu( zSM*-Kwl{BfUtV>8UiA$r`;rdK57Usg!a-9GG$et2iw4cMNDWzV>$(HW{uc$=IYdML zBhHjj)So{5RQlMH>0`-DAIKkmI=}2l(czLKB?I=+0|h06$)=2Q(zY4Uwi%g&A@Jot zQcc;#0qy!7<+}RB$XCmIi&x{{%FFdcU;3K<&h$0C>1+N^+O-bawNC#RvM>VL^}Lj8 zd0+ClQT@r|dSl1=@`>kPOPN1r$u#rp(~>TkYI(yn_L2#fHzrsp?YL8Y{}mx;{0zbY zfgsJ=D!tx@nhLtsLVh?dWzy|*JuCPH`&HOQD*=wFKlqtw%H{8SX{qiluBN)?3bNkm zwpNYIQj=d5g<0_J=%X>Avdz+_&U{tat#IM!Q`htr7q3s<@~T*4)xV@~!7Iu>^{rRM ziYf9!REmd?!u>BC5YkDH-dC%?!Ryn%wx3KJxUqrWH>K|isZ~FxV>h_~4HL7>IN#-kAa^>>dydQ0a!taOn_W~0)P^LGJxR#4uA@Pi2&08_;tA1NL2!K zvOvEB$s+*o0K5zEIl$Kd{{j$%kxT-B7bS}T`2FNzNR0$=08{`>1egMF0l-B7czH>G zTZHfGx8PBlA+m9yS+)T@4)800j{*J$@EO2Y065l^I5CtlkbF4V;b@qa9$GZ%sX*X} z11-96W)}yRzl7M+@7Ztw`%)s}*9qAd(Yn%&g*mc{iV0DAnKo5@<2CWouo=Ck|K(rL zFJBjvtYWkJ>6@asbG;A?#Gr})&>O_&dFFo6IcV0icbiS(!d}zN@BSN%O%fDH34uJ5 zIc-mIZ`vmPU!QRG3)i4|yr6Im0rXrWLRlN>|A04_d0Qmm_ Diwhyb delta 19698 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 RBd;j!3^7N1%}`>@{{x}baaRBU diff --git a/core/admin.py b/core/admin.py index 51dd659..47f7a7f 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1974,4 +1974,29 @@ class VotingRecordAdmin(BaseImportAdminMixin, admin.ModelAdmin): context['form'] = form context['title'] = "Import Voting Records" context['opts'] = self.model._meta - return render(request, "admin/import_csv.html", context) \ No newline at end of file + return render(request, "admin/import_csv.html", context) +@admin.register(CampaignSettings) +class CampaignSettingsAdmin(admin.ModelAdmin): + list_display = ('tenant', 'smtp_host', 'email_from_address', 'timezone') + list_filter = ('tenant',) + search_fields = ('tenant__name', 'smtp_host', 'email_from_address') + fieldsets = ( + (None, { + 'fields': ('tenant', 'timezone', 'donation_goal') + }), + ('Twilio Settings', { + 'fields': ('twilio_account_sid', 'twilio_auth_token', 'twilio_from_number'), + 'classes': ('collapse',), + }), + ('SMTP Settings', { + 'fields': ( + 'email_from_address', + 'smtp_host', + 'smtp_port', + 'smtp_username', + 'smtp_password', + 'smtp_use_tls', + 'smtp_use_ssl', + ), + }), + ) diff --git a/core/migrations/0042_campaignsettings_email_from_address_and_more.py b/core/migrations/0042_campaignsettings_email_from_address_and_more.py new file mode 100644 index 0000000..f01bfd6 --- /dev/null +++ b/core/migrations/0042_campaignsettings_email_from_address_and_more.py @@ -0,0 +1,48 @@ +# Generated by Django 5.2.7 on 2026-02-11 15:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0041_alter_volunteer_options'), + ] + + operations = [ + migrations.AddField( + model_name='campaignsettings', + name='email_from_address', + field=models.EmailField(blank=True, max_length=254), + ), + migrations.AddField( + model_name='campaignsettings', + name='smtp_host', + field=models.CharField(blank=True, max_length=255), + ), + migrations.AddField( + model_name='campaignsettings', + name='smtp_password', + field=models.CharField(blank=True, max_length=255), + ), + migrations.AddField( + model_name='campaignsettings', + name='smtp_port', + field=models.IntegerField(default=587), + ), + migrations.AddField( + model_name='campaignsettings', + name='smtp_use_ssl', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='campaignsettings', + name='smtp_use_tls', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='campaignsettings', + name='smtp_username', + field=models.CharField(blank=True, max_length=255), + ), + ] diff --git a/core/migrations/__pycache__/0042_campaignsettings_email_from_address_and_more.cpython-311.pyc b/core/migrations/__pycache__/0042_campaignsettings_email_from_address_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfd44f3e6ed030701bf7270822c3ea14dadcce65 GIT binary patch literal 1720 zcmb_c%}*0S6rbI0x80>6j3gc;(NIw9f%0`EZPbYIi;KoXFO#7&l!g6rXRCPQV4?>P z+&p?i4EzE3U$jXNWUrpMm=ZW~P~U7>RB8~6v)#Avx9`2*do%BCKlb*T2v+*TJL_{A zp)V373vj&lXW;Q3F~k%bIZ8!w)QYMg72QKjeT`U(D@&;(U$hR|<}s?InDzt}(!0`J zP$Sc^Y5@%`&lQpGc#PYknncQH-x1jVs>qZaRTPFQDpP7oC8Z*+EhR-kY9`<4OPPd# zX)L{^ud7f1+?}`4P5gnwI5&s+A2@nq4&%6v+*a>8oWUmCo%Pq9^u-Ku zJ7omBaBhbF6Aaq983xXO617aFhhZ3!i;?j-nGP5gt?C6l8X6y;o*>i?c|cxxcHIp* zXrA90q5dj$d}`HP!NbsUYa+tjp_WY+0?#3ov49KlboUz^2Qa4RZR#$=4AK>1bGH^Q z7E*xZ6cU#@JknyBUa+{$B11T#PZm89?tX{(s5izw72>5ABxc_WLhB(+TS193j4#l- z9Y(p>vo1Ih!k+yFhPF7O0b?MO%@uM{mc-c!iA+MEn!3$F&k^#xPHpKV5#v608F#A| z7lHh|qUu;lye@LAO26=G5)jOwZ>>ALA#q4>;ma-0--L0%>{hSe--GE zDi%@^Z(zh%kFU0ljEQzi9n@DJwM}FUy)|3e%R83}I|HLTIKOtSh4ULD+fxl(ZsKwa zm)jZ5F!vCM11V0#4DH}y88f^wxSem{QWKY2xO95V)qjYAJfkwt=ti}HC!2V(g(pwX za^*OJH}G^5Pq*;&StD2jPc`vW3s0RMakib5N3g#7KwiN}(wVt}78z`bx;1Z%&BqfL z&snE;dFdAWj)HcWo#~8iDYy<${$q(}AlfNKQJ|knp@D96|JwRZMQ@{Sv1YdVNA{%Q J;1AX~?+-KjtL^{* literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 032d9ec..9efb0e3 100644 --- a/core/models.py +++ b/core/models.py @@ -435,6 +435,13 @@ class CampaignSettings(models.Model): twilio_auth_token = models.CharField(max_length=100, blank=True, default='89ec830d0fa02ab0afa6c76084865713') twilio_from_number = models.CharField(max_length=20, blank=True, default='+18556945903') timezone = models.CharField(max_length=100, default="America/Chicago", choices=[(tz, tz) for tz in sorted(zoneinfo.available_timezones())]) + smtp_host = models.CharField(max_length=255, blank=True) + smtp_port = models.IntegerField(default=587) + smtp_username = models.CharField(max_length=255, blank=True) + smtp_password = models.CharField(max_length=255, blank=True) + smtp_use_tls = models.BooleanField(default=True) + smtp_use_ssl = models.BooleanField(default=False) + email_from_address = models.EmailField(blank=True) class Meta: verbose_name = 'Campaign Settings' diff --git a/core/templates/core/door_visits.html b/core/templates/core/door_visits.html index 28c4ea2..c6e21e8 100644 --- a/core/templates/core/door_visits.html +++ b/core/templates/core/door_visits.html @@ -180,7 +180,14 @@ @@ -283,8 +290,50 @@ {% endblock %} \ No newline at end of file diff --git a/core/templates/core/voter_advanced_search.html b/core/templates/core/voter_advanced_search.html index 7f0ee6a..07a2ab0 100644 --- a/core/templates/core/voter_advanced_search.html +++ b/core/templates/core/voter_advanced_search.html @@ -116,6 +116,9 @@
@@ -331,6 +334,38 @@
+ +