From e083afc1d5f2e98bfe242e9b46cb3aeac7840a97 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 4 Feb 2026 16:40:09 +0000 Subject: [PATCH] Mock 2 --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5816 bytes config/settings.py | 26 +- .../context_processors.cpython-311.pyc | Bin 763 -> 795 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 555 bytes core/__pycache__/views.cpython-311.pyc | Bin 2833 -> 3492 bytes core/context_processors.py | 9 +- core/management/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 168 bytes core/management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 177 bytes .../__pycache__/import_mps.cpython-311.pyc | Bin 0 -> 2563 bytes core/management/commands/import_mps.py | 33 ++ core/templates/base.html | 18 +- core/templates/core/index.html | 13 +- core/templates/core/mp_list.html | 70 ++++ core/templates/registration/login.html | 51 +++ core/urls.py | 7 +- core/views.py | 15 +- mps.csv | 342 ++++++++++++++++++ staticfiles/css/custom.css | 72 +++- 20 files changed, 610 insertions(+), 46 deletions(-) create mode 100644 core/management/__init__.py create mode 100644 core/management/__pycache__/__init__.cpython-311.pyc create mode 100644 core/management/commands/__init__.py create mode 100644 core/management/commands/__pycache__/__init__.cpython-311.pyc create mode 100644 core/management/commands/__pycache__/import_mps.cpython-311.pyc create mode 100644 core/management/commands/import_mps.py create mode 100644 core/templates/core/mp_list.html create mode 100644 core/templates/registration/login.html create mode 100644 mps.csv diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 96bce5584823cd4ebfccfc40c2b36df8beaee7db..6b3afbe0d0d52c642c69dd5f379074678f95200a 100644 GIT binary patch delta 1287 zcmZuv%}*Ow5PxqmV4V7M*LH#l<|6?cf`O2j6ao#!OF#ma?iv-I)LIs^GD|QY>#Y)T zaik{qpq0`?qc+NcMv7Fm@+E&m4v~-1Dv@%^*{7)D)LHYh4=eRQYt<-=Ljscc zmw#oh&xUbvI6E{GSP(Qm&a#n!1BSj>KOcexBk}4sZe{ z5C59X4Lji5Fx4o6jllFH;$VHHjx@5KkDkf=_YQZ=x2|~jx;m_LFvC*tH5-Fjb_4BZ z<=FK*?MZT0WImf+$*tw)B>CGJIU{CrE3%Z8tmaL_*ehktmn~z|XTEP)Zw_JZUUQ=L zO*(?7B(*#xBd;5!`9VU0R+he)q?KR1b9B^)07`8x8M?N2u2M79;{U6BWrqEC zDQ|w~zvZ^ODXPh|`IEoA9#zEIRavyBv$md7l*Qb+( z{xpdlE{mB3S)9$9;lO?D~UbJ|`q}6N# zsN0R|_H^rGKX%_P?!ph->a@OtnEi@N$L5=0HRdC+=_-l7i^i%%IQ5bCD&cD`^XJh1 zc)WhuVP6Utt0Y)+yF*-!oVka-n&9@?z^QxasR@LSSEl#`_0*a;fvb{0%~L50eKh(p Qj8#JKBAAXp`RWq?2JCkvIRF3v delta 1002 zcmZuvO=uHA6yDivlXRQS=4aFNFHJOU(@omcSZ%BQ(bhsK6h#okxk%-$$%<|2ZbYeI zdg#HEAagBPd#Io&%7S?IAm}LtkrGhwCPE=651xFxwbDc%`@T2x-Z%5UnVq+TuQJk8 zNfJ4<)t^Ou_L0<1KD|zj61GfoL}r^LS(YKN&S~;2w~eglHq|jILy!j0gAk%2^l+Yo z@D`y8Mg?O8BD57+X%wQE2|^oU`xem&bZiKDLffE|wnG=hcusTOa5UH(LpMm<^TR4s$!O<~$gfaIg9=BuOMUNiVSH_mZaH3uWO&+Eo<0Oa;j2>k4Hn2uu zw4Sw1@Yv}4M*AB0V|X#_gUcUIH55*P#Imk9InBPiCc|n&bsQ$x57+p7x* z2F|Q=4Xm?Trk=Gqz`l8uEKJv{{pWcMYH5Rq8LGlLnzh_bFA4kX9wt5}dag7D@Q5*1 z@O&ImaHNu|XqFa@l6glj6;$4kFj*A}MYCkuuON{yWDJJA%7G*+crUgDaeApLoG&hG z?49>9aa-4#(?qO#rxzA3Tt=`e;uqrXwpXc^VE`oM-sR*}kYNoX( z&5@iBX(*)0EE)RBUk!RmTl&9-XH1jl@M*q~$9Q#!?a5{KKCoiV2NR^nus1VoeU9*7 z-iiHIQ^s}7*?-vl%HD)3cpFc`w{nRJ7u}7DU!~5AN;=Q9It>5n?rupzswgQ1e^&B7LN#!iDg2Wc&uLsLxvf diff --git a/config/settings.py b/config/settings.py index 291d043..7f18fe3 100644 --- a/config/settings.py +++ b/config/settings.py @@ -26,6 +26,12 @@ ALLOWED_HOSTS = [ os.getenv("HOST_FQDN", ""), ] +# Ensure Django knows it's behind a reverse proxy and using HTTPS +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +USE_X_FORWARDED_HOST = True +USE_X_FORWARDED_PORT = True +SECURE_SSL_REDIRECT = True + CSRF_TRUSTED_ORIGINS = [ origin for origin in [ os.getenv("HOST_FQDN", ""), @@ -37,14 +43,12 @@ CSRF_TRUSTED_ORIGINS = [ for host in CSRF_TRUSTED_ORIGINS ] -# Cookies must always be HTTPS-only; SameSite=Lax keeps CSRF working behind the proxy. +# Cookies must always be HTTPS-only SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True -SESSION_COOKIE_SAMESITE = "None" -CSRF_COOKIE_SAMESITE = "None" - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ +SESSION_COOKIE_SAMESITE = "Lax" +CSRF_COOKIE_SAMESITE = "Lax" +CSRF_USE_SESSIONS = True # Application definition @@ -65,11 +69,10 @@ MIDDLEWARE = [ 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', - # Disable X-Frame-Options middleware to allow Flatlogic preview iframes. - # 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -X_FRAME_OPTIONS = 'ALLOWALL' +X_FRAME_OPTIONS = 'SAMEORIGIN' ROOT_URLCONF = 'config.urls' @@ -151,8 +154,6 @@ STATIC_ROOT = BASE_DIR / 'staticfiles' STATICFILES_DIRS = [ BASE_DIR / 'static', - BASE_DIR / 'assets', - BASE_DIR / 'node_modules', ] # Email @@ -180,3 +181,6 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +LOGIN_REDIRECT_URL = 'home' +LOGOUT_REDIRECT_URL = 'home' \ No newline at end of file diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..47f752940a32078b30e286c4f30d658492fd4883 100644 GIT binary patch delta 339 zcmey(I-AXHIWI340}#{{H)qN+F)%y^abSQ2%J}R9WK3sBVMt-jVTgjzj8TkC45>^& z%$UVE@rsIm6mtqw3qur33S%&XCi6>>R=;FMs0kp76^NOE_;U)7m_Bi$#KcA`W}p=l zKU`5}zQvSZe2XnTwInsK?3Rd&Yk-e`q_3-ANPLK=uWN9Kqi?|EJB;yM{6MYjKwNA# z*_BDN-sA%(D-YWT1_;5*_8BO}pvhVU^3pAqlFZ!HTg;hxB}F_yei2CTN`@i<5StH3 z{Nk|5%}*)KNwq5y0dhf3E%pKuAD9^#8E-IfHh|#`2JQwh{J_Q_Aw8jZhUE;CIhHf6 Y=U879XIH->u6}_*Wb$1mDHf2q0QwM1TL1t6 delta 291 zcmbQu_M0_xIWI340}xbw%g>z1$iVOz#DM`ODC4sXkTIPhg&~D8han0=Ge$9{Ftsp5 zF{LmDGiWlu1S$1P2ATi|Y(N$>5PzNqB&JV1C^2!Pl_V=%nxTXp!Omiy=%zC9+ZhR# zTTJ=Ix7gBCOH%X7ZZT)(mE2+}$;?fi{FE`CO8}^W1&E7XCi^jIhAJ<0S>n0Sdx`f& z1%oRJ1|K+CdDuQMKnPa0&mhw^nTtT)E8+zaAnhv|iUdJyejxFS!zMRBr8Fniu1FZj U1-ZT0VDd>O>B;|?Bw0Yp0Deb2X8-^I diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..1f7e70bc2515dd4fe6c25583e5bcc5a5307fb7ab 100644 GIT binary patch literal 555 zcmZusJx{|h5Vey_(o(*}P>_%)3qvH-tbh;`GYd>vP>8KI5GRq70PTbXLX6$u7Zf4* z3;c&v>QH5biLDYF6XzDTKKssh@A=N>=Y@qif_TqvgAY7ERq~I@U+{g8!6RXW(U1u0 zQlYsTB}`*_s0(mG7_LEyMmS}_ff;XRUnk@hZHkFvaf4N6Dpk}qHrJVk1{A@dF8Ye%)cXEecb3e~w>0HI~B27G>JAN!t#?H;8^HbRuG0Q`K zAeXUN{U^OcH`XboBeGS@+9R@A%-Um<7}cA@hn0tuC$oUY02)JRjG%&Cy|?<*DZn0p lJp_Bot@m2JRav7r-85vTTQkZj? za+#x;85x)uQW;ZNQkhd&*RU;PW?)zi#1N3q7{!vp9?YQ0@e(AU$#{#UAh9IlB_ouR zVUVAjdW)e5WD!U*FEKaOPm}c)cS=@bUV6S>X;Dsb5y-S#tYw+0<;6v;lU*4DV)%d} zAR~&sfW!x8Mn=XP3^Er`(E|qY3#jM=8v`q6gG+}{N5~Ae3oP;%S>&&<$bVpF;%92$ K2Eig8pm6{k3qJAy diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 59da7bc4509137295927d8a3ac7514136b021d6b..ad9201fed461d49b3eda9fe587c7474dca5e88b7 100644 GIT binary patch delta 853 zcmZXR?`zXQ7{~9DCTXv0R@be|n2xy3ZRzUPb*!8FA;Q2RIvBcFLm07%I!&8-$y7$l z3hMin2qF|jkSXrXVE>1#CD2kBDB}B$;S2XdyzArm<7nkH^tZF)C`mv4`&i%qmQQNdtW7Vb|s}?w|GVAVlz7Mv#g0LdhxU{*EwJ}fh zYi!nhhB=Zc0T&AcJ%c30Llg>a3u!ZJ>(6Z~Kq^^wKMQkcmZW|%tg-zg!Gl|ekzOwn zt3(pzNTL);dXZ%Q)?v8U3&$$qL^+%&g_B-5nZHrzL07WcCRL^WYDdqZBo|xWibb&= z~+^HvNre5Kny$vqN-tsa7M%gL0e0xAm;1V_B7rHOrRG`?6{n z@}i!(r(=tjODZ=32HAX_y!TLk&ZUS`FLg|14%q(pBQliFt`Bi3+{}3L!;_ zDXAbbIXksTlX-FgyTs&1b_GVh$&1*d1dG^!Cfs7q%P%it1+p~RCyQ{X38{eu*^~40 zN>VFIirIm@$q^j3ToynE2M`xCZ=TO_g;D+k8-t|L4IzoU5(;y8X7bJ9`@qh^&-Q@< zNHn;A<(hneOM*$0cXAC+yaq^Xkp_sc1QF&y;unWaZhlH>PO4pz1CYxI#KkR>Id}_X NG#Jf4Fklj3tpMSXN!$Pc diff --git a/core/context_processors.py b/core/context_processors.py index 0bf87c3..170aeb1 100644 --- a/core/context_processors.py +++ b/core/context_processors.py @@ -1,6 +1,9 @@ import os import time +# Calculate once when the module is loaded (e.g. at server start) +DEPLOYMENT_TIMESTAMP = int(time.time()) + def project_context(request): """ Adds project-specific environment variables to the template context globally. @@ -8,6 +11,6 @@ def project_context(request): return { "project_description": os.getenv("PROJECT_DESCRIPTION", ""), "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - # Used for cache-busting static assets - "deployment_timestamp": int(time.time()), - } + # Used for cache-busting static assets - stable until server restart + "deployment_timestamp": DEPLOYMENT_TIMESTAMP, + } \ No newline at end of file diff --git a/core/management/__init__.py b/core/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/management/__pycache__/__init__.cpython-311.pyc b/core/management/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d33437e966a03867f4f9cfdbd3510ef1f8e43001 GIT binary patch literal 168 zcmZ3^%ge<81VzQonIQTxh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%UVApKQ~ps zG^sSNq*On(A~m_RB)>?%JijQrxF9h(RX;huC{;fPO4oIE6^;EZN>aR;sY}yBjX1K7*WIw6axTtq$sig literal 0 HcmV?d00001 diff --git a/core/management/commands/__init__.py b/core/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/management/commands/__pycache__/__init__.cpython-311.pyc b/core/management/commands/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f82327dda372980af7fbad2806bad41d9c6801d7 GIT binary patch literal 177 zcmZ3^%ge<81VzQonIQTxh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%SAsUKQ~ps zG^sSNq*On(A~m_RB)>?%JijQrxF9h(RX;huC{;f`JOBUy literal 0 HcmV?d00001 diff --git a/core/management/commands/__pycache__/import_mps.cpython-311.pyc b/core/management/commands/__pycache__/import_mps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ad4842e0df689df0574edba6f48c8d12e77a742 GIT binary patch literal 2563 zcmb_eU2GFa5Z?3M`9Hx9P9P+4E(uT^h)oN$6s13j z-_FeL&d!W?=KN(#iycABsGr2Ac!YkVOuYfGw~bL4t|19YOag`JXi6|iQ`p2%noY1t zF3d5=gia!fyNo0rn{KlR-GSF=VP0Zpkk9;pvXefBI7Xu?4$8@7G$jGsHi46KSUDY= ziYkeCG>KE1Slg-(OpV#t4a7BsQJ9fX*d#GwRx({iVNPN}Jx44xmD!zdCeyN_2@_MQ z5L4u&5S)2WtZSjlZ1C=YcjFI}?i!P4ZAfcakps;VdzWi=RNn1p0}%m`WAsc4PMwol24xE2?q31K7_i$lI@aXCetK{=&raV-OS zmb0EIMLr)-iC72-?_foVYqGNJV+o&*D%vt}iVcg2HCVsa)WWi25^k(CpIua$6e8m9x6@sD>l55)l;)6fvusBxf|jFM;it@T#_)z{E21 zZZH^{nIUd^=A^8R)8q8R2p^iBK0Qrrp$j5T>mgxPP4Tr5PQ{5B;iAgC3McAQDzQQ2 za3meo76?a4Vuo|UFv5$VQX{M)FDWiCQh~HYN-G6gun2=yDiIpndB&exa1x#yN9c&t>r`J2kw4n_f79tT&Z)Y z+&NS*S9W(6_)1q_6}7s1btnWY-oBMXWpAL^H3ofkVD()2g;9ekj8(dOi^5Cg?&F0} zWnllx#qz+5g;SN@{^G#P<=zv8H-7i*FMIs!p4ZkquT^^be%&`%Idr^o;BeK#_3x=7 z3Os6moq32X?H!LORCREn_C43neEL=)1d3gr&m8NnzBO0h%HA&q*ZYsI^&c%BoBag? z7`@aVF87B^uCry=*`n)gbszQ4@X^4By1$QfY?MEn-rU@L_5x#e^UwXr1u#O5a z^o@MK^P4l@c6`@S42(c8c}L6M(ULP*b_R=2>fqI8m8HsoP=jz|F1H1Dq0dL33)`QfkOyYc#}jKLLTf@KLhO+U zl&TEmO@ufjk&iRcL~Vv!z=^an2#0=+HUN?0qd>o7I?zv|Is|ZO>!~<|OJh~8lc#Zb zGAf7b`+a7Gesf5dv=~jz%YK?p{_S+~&%xgrh5j!f4r2-`YC_eEjA2B8YSPtF!ya3Q z4M$#8jsQz*oSFuJ_%Tcc*)Qo&1sy3i_X-*;Huoym%}@uPj91P*)Mp+&WnQ=FFD%b= ADgXcg literal 0 HcmV?d00001 diff --git a/core/management/commands/import_mps.py b/core/management/commands/import_mps.py new file mode 100644 index 0000000..01a1574 --- /dev/null +++ b/core/management/commands/import_mps.py @@ -0,0 +1,33 @@ +import csv +from django.core.management.base import BaseCommand +from core.models import MemberOfParliament + +class Command(BaseCommand): + help = 'Import MPs from CSV' + + def handle(self, *args, **options): + file_path = 'mps.csv' + try: + with open(file_path, mode='r', encoding='utf-8') as file: + reader = csv.DictReader(file) + count = 0 + for row in reader: + name = f"{row['First Name']} {row['Last Name']}" + party = row['Political Affiliation'] + constituency = row['Constituency'] + province = row['Province / Territory'] + + MemberOfParliament.objects.update_or_create( + name=name, + defaults={ + 'party': party, + 'constituency': constituency, + 'province': province, + } + ) + count += 1 + self.stdout.write(self.style.SUCCESS(f'Successfully imported {count} MPs')) + except FileNotFoundError: + self.stdout.write(self.style.ERROR(f'File {file_path} not found')) + except Exception as e: + self.stdout.write(self.style.ERROR(f'Error: {str(e)}')) diff --git a/core/templates/base.html b/core/templates/base.html index 023dcd6..c815bce 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -14,7 +14,7 @@ {% load static %} - + {% block head %}{% endblock %} @@ -83,7 +86,7 @@