From 298e2a80cb41d66097e98438b60ca87e86fc5700 Mon Sep 17 00:00:00 2001 From: pacnpal <183241239+pacnpal@users.noreply.github.com> Date: Tue, 29 Oct 2024 23:11:55 -0400 Subject: [PATCH] lol --- moderation/mixins.py | 16 ++- parks/__pycache__/urls.cpython-312.pyc | Bin 880 -> 705 bytes parks/__pycache__/views.cpython-312.pyc | Bin 8966 -> 8934 bytes parks/urls.py | 2 - parks/views.py | 8 +- rides/__pycache__/urls.cpython-312.pyc | Bin 729 -> 567 bytes rides/__pycache__/views.cpython-312.pyc | Bin 8661 -> 8646 bytes rides/urls.py | 1 - rides/views.py | 6 +- static/css/tailwind.css | 8 +- templates/accounts/turnstile_widget.html | 6 +- templates/base/base.html | 132 ++++++++++---------- templates/home.html | 44 +++---- templates/parks/park_detail.html | 4 +- templates/parks/park_list.html | 4 +- templates/rides/ride_detail.html | 16 +++ templates/rides/ride_list.html | 2 +- templates/search_results.html | 68 +++++----- thrillwiki/__pycache__/urls.cpython-312.pyc | Bin 2758 -> 2648 bytes thrillwiki/urls.py | 11 +- 20 files changed, 175 insertions(+), 153 deletions(-) diff --git a/moderation/mixins.py b/moderation/mixins.py index 28008ff5..9dc8ecf1 100644 --- a/moderation/mixins.py +++ b/moderation/mixins.py @@ -6,7 +6,7 @@ from django.utils import timezone import json from .models import EditSubmission, PhotoSubmission -class EditSubmissionMixin(LoginRequiredMixin): +class EditSubmissionMixin: """ Mixin for handling edit submissions with proper moderation. """ @@ -67,6 +67,12 @@ class EditSubmissionMixin(LoginRequiredMixin): def post(self, request, *args, **kwargs): """Handle POST requests for editing""" + if not request.user.is_authenticated: + return JsonResponse({ + 'status': 'error', + 'message': 'You must be logged in to make edits.' + }, status=403) + try: data = json.loads(request.body) changes = data.get('changes', {}) @@ -101,12 +107,18 @@ class EditSubmissionMixin(LoginRequiredMixin): 'message': str(e) }, status=500) -class PhotoSubmissionMixin(LoginRequiredMixin): +class PhotoSubmissionMixin: """ Mixin for handling photo submissions with proper moderation. """ def handle_photo_submission(self, request): """Handle a photo submission based on user's role""" + if not request.user.is_authenticated: + return JsonResponse({ + 'status': 'error', + 'message': 'You must be logged in to upload photos.' + }, status=403) + if not request.FILES.get('photo'): return JsonResponse({ 'status': 'error', diff --git a/parks/__pycache__/urls.cpython-312.pyc b/parks/__pycache__/urls.cpython-312.pyc index 47b164f7e4e3220ed35c281651d10ca61fee7b23..f91255555beb7a4cc96d2a9d01d484f7bb0052f3 100644 GIT binary patch delta 281 zcmeysc92!$G%qg~0}z~FpqQ@9$iVOz#DM{JDC6@7hKU-oiY!qqObn@vDXgi?Szt{t zbr3p>cd`znv?kjc_SMV~5wL0wplUu;l^`BeH7A;CE}&`wT&jh+5vtRfqc|&hG=Qkm=7V9&Jx94$*(CeS%y(sNR#mvUr=UBs!M7~VrEWQW@`Clb4K6z zDkYoZoYHiwg2bZico54@A0ki$R0|cj#SP}9fOYz5^4#K1$x6&i&(|w0$|)`a`LGBS zR7I>n0;0B9uMB8GaS_|(1&m9jC4u6=uw^K20}>yY85tSxGRWLz5WdTxHaV6lLiHvK n#|2K^3;M1r>aOd%UetHJtnYpz_X=*0E@kK()^;0XC1X>}fL*$~+p_I;9p~Qa z)=X@SQJ;*-c`-5J!GvUegEY}scpyCRat$Ps8#O)=eK0XFO?WWjeCIM`N=@*=tR`(E+}XW;oOc9p*m<;Si%ok$#;SP5b(~cvyA)6x#jON1OR83*Rqa zUH)+}^TS}qIxu=CG-mn6Xo_8H%4XjddpOiwG=*3k(t!vN6vhftG6eZn(cX zdEZTfv!t52FNM8B4_+qTapLUlU?c5&>K`;ukcm;8kmO(o4ZU1Y%2ZdDKg`hrJ&vTm zpqa}2x`MStgJ{C`T_|gG-OxU5ucS;b1j)?JW_LKX&UP%0An1srDL6;>5pF! zZPZ9M;iuzZ90N=MAcQELPV&g!rIuDqZOv3l^Glj)Dl567M&Ac#4v+^&Ruomw8HTFq zx}tEaRGt<0jW{Y#feJW)g&r6CBh>4QI#NyvDG#;$Mo5W8TDwy-AU{#nDdj!nP699t zcHo_oW@JlddTr4#6OvGsp2G44K#6U%#{EJQR9cC$T)3UR5|G%9)-Qy>*C$s%oCTZ) zK&C_^J&Ra0)`AG4Qw1Of@f@NY2gAdGTUK@2n`39fRY&+Z)j;~6>PSMX%6?JHWGL)E zgIocSV)-_<*D0O<=VKzSd(!Vt|6;o@s$zi8gDd~nzYtEu=n4PmBBFNzJ58f&$Snbu zIXvxF5y>JW?XSwwza@{i*)ghEA8G&HO-{4^$n3mO<{T&5Evr<^Yo>Z$p_-mEwFP4wqtjPoqKhDjG!g^UUBQ&wHXH4#7;2gA#OONw`Z+)VvmBtS^2{-E<0k`>(kZ7vsR z=Vm*kmMPU%OvQO1hU2IIUq5Y+&PT-=?jhFQ^2m$#RH+BFglSEEiHEKHb=fxP0-1u=LP5QuWeNxXpi&`K@*k$SSM@*{^kc)-Nxb=#}IaJg9idV2=JlpiQ89C zJn0&!Pd#rTo_SJFK9{;2G4k_a;+Q7Z<=s5kv!_w$NRd<$TO0>ydUUN?P^(N+OP4dO zz*3lW6{w+RS5!QUwu&*D&WlybR&;8J;q+Fh3kG2>{)cOg#QE5+Jq_+|A!L@{kV8b_ zcjWz^6WB~zENTX2Y>59P@0E}emgFu^NQz;&zz02_!~I8|P$1f(uyIT(2onI?GS%h;4$b@)0n}n#jD_2=EXw6V7*$Xshs7skLW$$3k0zw{ZWL3>+ z8C}m&O;c46D+^iiy_iMw43;7s!Go}kKl4VM5sS(hL1ozY10iMZ>g;}@=*Ae4EzGvtb4h%a63zDpD$ia1V-m$M&XazA(0V!i2A7C0z8H6he4lh*$qD~1VyXOZ^}N^+jVIJ&1&rnp zc1p%BVeULa5#VL5N|-G1@45%&$gh&!(P7C{Y6N?JY$5Z!BQT#8+#n-O-!h|%)X1Gz z8Pzfd&9gT!-8zw&vzEf48?3l2h>SX35^4=U6F}GppgRD7RNMm0r5g_eZbIUXjlIu^ zB5DUPkF~(h&dW`2uF4o)GE{3lbW2g!KZ-W(8W_d0_6h!1Z+`?|$?6EWx~~>?V&AtQ zY=7UUr*IRjZdkoNhnUn3o32}S6|UbNWXm4M`EPya=1{Qz+cZlnVSZsk@vc`YRKwTQ z_>JIENjRa_FoS6lox!wFPZWs77w0iJXgY_>m3&pBqwF(286JyH6Vre2i@>I>mrRq* iQ9p^8{sZQrQ|8F5na-N|Ws|LK+91tuhhMj2pT7Z^fLBid diff --git a/parks/urls.py b/parks/urls.py index 62bbe7b9..89ff7afc 100644 --- a/parks/urls.py +++ b/parks/urls.py @@ -1,6 +1,5 @@ from django.urls import path from . import views -from rides.views import RideDetailView app_name = 'parks' @@ -8,5 +7,4 @@ urlpatterns = [ path('', views.ParkListView.as_view(), name='park_list'), path('create/', views.ParkCreateView.as_view(), name='park_create'), path('/', views.ParkDetailView.as_view(), name='park_detail'), - path('//', RideDetailView.as_view(), name='ride_detail'), ] diff --git a/parks/views.py b/parks/views.py index 15165f54..2dbcf5ce 100644 --- a/parks/views.py +++ b/parks/views.py @@ -37,10 +37,10 @@ class ParkCreateView(LoginRequiredMixin, CreateView): reason=self.request.POST.get('reason', ''), source=self.request.POST.get('source', '') ) - return HttpResponseRedirect(reverse('parks:park_list')) + return HttpResponseRedirect(reverse('park_list')) def get_success_url(self): - return reverse('parks:park_detail', kwargs={'slug': self.object.slug}) + return reverse('park_detail', kwargs={'slug': self.object.slug}) class ParkDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, InlineEditMixin, HistoryMixin, DetailView): model = Park @@ -63,7 +63,7 @@ class ParkDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixi return context def get_redirect_url_pattern(self): - return 'parks:park_detail' + return 'park_detail' class ParkAreaDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, InlineEditMixin, HistoryMixin, DetailView): model = ParkArea @@ -90,7 +90,7 @@ class ParkAreaDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmission return context def get_redirect_url_pattern(self): - return 'parks:area_detail' + return 'park_detail' def get_redirect_url_kwargs(self): return { diff --git a/rides/__pycache__/urls.cpython-312.pyc b/rides/__pycache__/urls.cpython-312.pyc index e77dfb0c1c80ccc57bee1cd18484cc3a2f39385c..e5ed3298eea9fc28526b4ca58c8063e8ae1e282e 100644 GIT binary patch delta 100 zcmcb~x}8P+G%qg~0}$L?pqPFiNIwQ~V1NzE_`GJK`bv&;rYMd|E=}&qGK{{=ewv(< k=Q8?D{>_-cB?45&2*kzylT(?zc|Nc*^D{Ma7YPA{03IV0JOBUy delta 214 zcmdnaa+6j4G%qg~0}x2JDW*F!GB7*_abSQQ%J}?YqWVfMCWchT6s}a}EP;vB^o6e-38o=_ zos2jk;b1t^qwLAVGZ!u<#Dg0T9{dALKobup&YK0J7dP2o-n_4Q@AsRJz1zLgjwE?) z?7OrP&A)pq%~aV<4=qDjcKBCUAaTe?^w zZeU;vL@VVh2=}oAK@1{z0D^If#1mo%Gt0Km{@Pc|v|ViRo$>D590Bp0&EXMolIFy8 z>s6l3pkl*Guz7hsSO9+ZlQ8`xHn_X?+5{(*{Swzu+Mv}F$aMqq(sW-sof-tQ2jDgX zQ_QQna(_{Q`S_@K2;9|uMU|wBdjCR!=(3B?ZMx@5DqbY2jt}~2z9<@?FMV4mNiX}q zADw_wDO=1CUBwE~GdjUzG!^N zm8R4K4e&jPEYZ7lVT+?lqgdvyeRzyNCLV&vX1cp)i&G^{?ZF%LPIN(l$Zsn>>k0q> delta 1042 zcmaJ=OH30%81B$*X}ew8N_d6Z2QBFOhz1cO1xmuJ0jVeuL@}FEmRejXo!KHZF(N)V zn~8}Bz1u_&+JhI5#tRn=;j;0lSK|Xbc+vT1!RW;%{qoQJ|9tcR-#7cNce_{GkR+Fd z{dU*GnT?my^-4$4gR`?L>7d2R5{l8NV;%LCpF3j6y?Lx_E84x~iEldM^qcdUm1-A5KEp1u)LQ5HqT-%&aKTA#WC+hi!LXP9@2l-oKnBx@_m28;*QI#VbVB@gCpR zsxTU$x2s;E1a0-~)?9|8QaYC+x{4K|r*wiRX{R@MlxuMiZuJ7hq0l~;)mWWjo6BON zmjr$ZPSOY7u$_;Wp)b7m8TBb&bL|iun*Rvhzv) zEx&o77zO!cl$0fW0q8CQi~)d%TogP(YpUhg46HK%3jm7@3`tSaT8fags%eVCEY;X9 z@21DJWC}{B=t^~~H}bSKw>tO#lH^s0K z9cLHuHK1`qs#0A}YlT^L&jhSMrbtKX1ExsR<$Qe_p+tGRVYC9>qAmUt{vy z%kN{iQ(xe5Yyv7dCzQ)J(@;L3kir>)`P<`)*-VywnlAb=Ff`7c5&vTg@aF-h0k}21 zF#=1S!QW0S!R8WO3%1$$7qe7;6P!m;ZV=D$*Thrs+6+hMjofTOQ@im~Iuu?OAoCk* C>G2!@ diff --git a/rides/urls.py b/rides/urls.py index 0f21d5e2..e7a90588 100644 --- a/rides/urls.py +++ b/rides/urls.py @@ -6,5 +6,4 @@ app_name = 'rides' urlpatterns = [ path('', views.RideListView.as_view(), name='ride_list'), path('create/', views.RideCreateView.as_view(), name='ride_create'), - path('//', views.RideDetailView.as_view(), name='ride_detail'), ] diff --git a/rides/views.py b/rides/views.py index c8ca8366..be3e22a5 100644 --- a/rides/views.py +++ b/rides/views.py @@ -43,10 +43,10 @@ class RideCreateView(LoginRequiredMixin, CreateView): reason=self.request.POST.get('reason', ''), source=self.request.POST.get('source', '') ) - return HttpResponseRedirect(reverse('rides:ride_list')) + return HttpResponseRedirect(reverse('ride_list')) def get_success_url(self): - return reverse('rides:ride_detail', kwargs={ + return reverse('ride_detail', kwargs={ 'park_slug': self.object.park.slug, 'ride_slug': self.object.slug }) @@ -75,7 +75,7 @@ class RideDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixi return context def get_redirect_url_pattern(self): - return 'rides:ride_detail' + return 'ride_detail' def get_redirect_url_kwargs(self): return { diff --git a/static/css/tailwind.css b/static/css/tailwind.css index c92493cb..790cbd27 100644 --- a/static/css/tailwind.css +++ b/static/css/tailwind.css @@ -2943,14 +2943,14 @@ select { --tw-gradient-stops: var(--tw-gradient-from), #eff6ff var(--tw-gradient-via-position), var(--tw-gradient-to); } -.to-secondary { - --tw-gradient-to: #e11d48 var(--tw-gradient-to-position); -} - .to-indigo-50 { --tw-gradient-to: #eef2ff var(--tw-gradient-to-position); } +.to-secondary { + --tw-gradient-to: #e11d48 var(--tw-gradient-to-position); +} + .bg-clip-text { -webkit-background-clip: text; background-clip: text; diff --git a/templates/accounts/turnstile_widget.html b/templates/accounts/turnstile_widget.html index 28be5ce4..4723c9f6 100644 --- a/templates/accounts/turnstile_widget.html +++ b/templates/accounts/turnstile_widget.html @@ -8,17 +8,15 @@ id="turnstile-widget" class="cf-turnstile" data-sitekey="{{ site_key }}" - data-theme="dark" > diff --git a/templates/base/base.html b/templates/base/base.html index 681b94a8..b3de5d28 100644 --- a/templates/base/base.html +++ b/templates/base/base.html @@ -4,7 +4,7 @@ - + {% block title %}ThrillWiki{% endblock %} @@ -101,78 +101,74 @@ - {% if user.is_authenticated %} - {% if has_moderation_access %} - - - Moderation - - {% endif %} -
- - - + {% if user.is_authenticated %} {% if has_moderation_access %} + + + Moderation + + {% endif %} +
+ - + {{ user.username.0|upper }}
+ {% endif %} + {{ user.username }} + + + +
+ + + Profile + + + + Settings + + {% if has_admin_access %} + + + Admin + + {% endif %} +
+ {% csrf_token %} + +
+
{% else %} - - + + {% endif %} diff --git a/templates/home.html b/templates/home.html index 7f80deed..08b3ae78 100644 --- a/templates/home.html +++ b/templates/home.html @@ -5,21 +5,21 @@ {% block content %} -
-
-

+
+
+

Welcome to ThrillWiki

-

+

Your ultimate guide to theme parks and attractions worldwide

@@ -27,10 +27,10 @@
-
+
-
-
+
+
{{ stats.total_parks }}
@@ -39,8 +39,8 @@
-
-
+
+
{{ stats.total_rides }}
@@ -49,8 +49,8 @@
-
-
+
+
{{ stats.total_roller_coasters }}
@@ -60,15 +60,15 @@
-
+
- diff --git a/templates/parks/park_list.html b/templates/parks/park_list.html index 489ffc84..4bb3fcf9 100644 --- a/templates/parks/park_list.html +++ b/templates/parks/park_list.html @@ -8,7 +8,7 @@

Parks

{% if user.is_authenticated %} - + Add Park {% endif %} @@ -70,7 +70,7 @@ {% endif %}

- {{ park.name }} diff --git a/templates/rides/ride_detail.html b/templates/rides/ride_detail.html index c17e758b..c48d808c 100644 --- a/templates/rides/ride_detail.html +++ b/templates/rides/ride_detail.html @@ -275,6 +275,22 @@ {% endfor %}

+ + + {% if ride.photos.exists %} +
+

Photos

+
+ {% for photo in ride.photos.all %} +
+ {{ photo.caption|default:ride.name }} +
+ {% endfor %} +
+
+ {% endif %}
diff --git a/templates/rides/ride_list.html b/templates/rides/ride_list.html index 648b5e6e..80725383 100644 --- a/templates/rides/ride_list.html +++ b/templates/rides/ride_list.html @@ -83,7 +83,7 @@

- + {{ ride.get_category_display }} +
-

Search Results

+

Search Results

{% if request.GET.q %} Results for "{{ request.GET.q }}" @@ -19,36 +19,36 @@ {% if request.GET.q %} -

-

Theme Parks

-
+
+

Theme Parks

+
{% for park in parks %} -
+
{% if park.photos.exists %} {{ park.name }} + class="object-cover w-full h-48"> {% else %} -
+
No image available
{% endif %}
-

+

+ class="text-blue-600 hover:underline dark:text-blue-400"> {{ park.name }}

-

{{ park.location }}

-
+

{{ park.location }}

+
{{ park.rides.count }} attractions {% if park.average_rating %}
- + {{ park.average_rating|floatformat:1 }}/10
{% endif %} @@ -56,7 +56,7 @@
{% empty %} -
+

No parks found matching your search.

{% endfor %} @@ -64,39 +64,39 @@
-
-

Rides & Attractions

-
+
+

Rides & Attractions

+
{% for ride in rides %} -
+
{% if ride.photos.exists %} {{ ride.name }} + class="object-cover w-full h-48"> {% else %} -
+
No image available
{% endif %}
-

+

+ class="text-blue-600 hover:underline dark:text-blue-400"> {{ ride.name }}

-

+

at {{ ride.park.name }}

- + {{ ride.get_category_display }} {% if ride.average_rating %}
- + {{ ride.average_rating|floatformat:1 }}/10
{% endif %} @@ -104,7 +104,7 @@
{% empty %} -
+

No rides found matching your search.

{% endfor %} @@ -112,26 +112,26 @@
-
-

Companies

-
+
+

Companies

+
{% for company in companies %} -
-

+
+

+ class="text-blue-600 hover:underline dark:text-blue-400"> {{ company.name }}

{% if company.headquarters %} -

{{ company.headquarters }}

+

{{ company.headquarters }}

{% endif %}
{{ company.parks.count }} parks owned
{% empty %} -
+

No companies found matching your search.

{% endfor %} diff --git a/thrillwiki/__pycache__/urls.cpython-312.pyc b/thrillwiki/__pycache__/urls.cpython-312.pyc index 4679106771cbafb0d964472803bed3a05a023e58..d50711a0d6c1297c2d67dc1e92eac26a1b076fca 100644 GIT binary patch delta 615 zcmX>mdP79xG%qg~0}#AgpqQS@!NBks#DM{EDC6@V=7}2D*i!h{2&`tBEW;=jlp+jb zLZo3d6GJLkga%vS@QD#bNv3?a7nAR&T$|=6Z3Sv*@WBtS`Qd*o^G?|S}esTa? z$>xh}jEs!plP|MB=Q0Jl1r$Za&n6$?@Yeju#=y$iAu-W>hRp`^E5g>7S!`~yaG(l+ z)l4?vTq!QUK<>Jt^+iSN>x#}76`e0Dx}Na6!V*21mn(tOl~I|Wse${0&*V}rUlwDa F6#xfNf&Tyi delta 649 zcmca1a!gd?G%qg~0}v=RDyCO(Ffcp@abQ3K%J^)-GEw8&WCJEqc77&?RF)J0Fk2AJ z76P+{!E6x_n^AOf0i$BF*czVI%n$>Ba?B~>K$1601!gvaPLWt6xtbBePmw~?C5=;; z%o@qb`xs@JSyJS|E|3GeKmo+oR7~a0QbX7PW2GpenXWuJkI7h21x-{HEUJbksty*_ zKoixR{Ef*tR0~a18)&}{%vJ=QqJySR7wl%e6#X>@tC=9`V060B<~n9aM&T;9qRf=k zV*M&EFs)Zwlr#A)%O@4l(&E&jVtt$9k|HY*GcPeW)lUBw4~QLKP?VpRnUgyC9;-Nq zaB*f{dQNKm/', accounts_views.ProfileView.as_view(), name='user_profile'), - path('user//', accounts_views.ProfileView.as_view(), name='single_user_profile'), + path('user//', accounts_views.ProfileView.as_view(), name='user_profile'), path('profile//', accounts_views.ProfileView.as_view(), name='profile'), path('settings/', accounts_views.SettingsView.as_view(), name='settings'),