mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 10:11:09 -05:00
here we go
This commit is contained in:
157
parks/views.py
157
parks/views.py
@@ -1,48 +1,76 @@
|
||||
from django.views.generic import DetailView, ListView, CreateView
|
||||
from django.views.generic import DetailView, ListView, CreateView, UpdateView
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.core.serializers.json import DjangoJSONEncoder
|
||||
from django.urls import reverse
|
||||
from django.db.models import Q
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.contrib import messages
|
||||
from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
|
||||
from .models import Park, ParkArea
|
||||
from .forms import ParkForm
|
||||
from rides.models import Ride
|
||||
from core.views import SlugRedirectMixin
|
||||
from moderation.mixins import EditSubmissionMixin, PhotoSubmissionMixin, InlineEditMixin, HistoryMixin
|
||||
from moderation.mixins import EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin
|
||||
from moderation.models import EditSubmission
|
||||
from cities_light.models import Country, Region, City
|
||||
|
||||
def get_countries(request):
|
||||
query = request.GET.get('q', '')
|
||||
countries = Country.objects.filter(name__icontains=query).values_list('name', flat=True)[:10]
|
||||
filter_parks = request.GET.get('filter_parks', 'false') == 'true'
|
||||
|
||||
# Base query
|
||||
countries = Country.objects.filter(name__icontains=query)
|
||||
|
||||
# Only filter by parks if explicitly requested
|
||||
if filter_parks:
|
||||
countries = countries.filter(park__isnull=False)
|
||||
|
||||
countries = countries.distinct().values('id', 'name')[:10]
|
||||
return JsonResponse(list(countries), safe=False)
|
||||
|
||||
def get_regions(request):
|
||||
query = request.GET.get('q', '')
|
||||
country = request.GET.get('country', '')
|
||||
filter_parks = request.GET.get('filter_parks', 'false') == 'true'
|
||||
|
||||
if not country:
|
||||
return JsonResponse([], safe=False)
|
||||
|
||||
# Base query
|
||||
regions = Region.objects.filter(
|
||||
Q(name__icontains=query) | Q(alternate_names__icontains=query),
|
||||
country__name__iexact=country
|
||||
).values_list('name', flat=True)[:10]
|
||||
)
|
||||
|
||||
# Only filter by parks if explicitly requested
|
||||
if filter_parks:
|
||||
regions = regions.filter(park__isnull=False)
|
||||
|
||||
regions = regions.distinct().values('id', 'name')[:10]
|
||||
return JsonResponse(list(regions), safe=False)
|
||||
|
||||
def get_cities(request):
|
||||
query = request.GET.get('q', '')
|
||||
region = request.GET.get('region', '')
|
||||
country = request.GET.get('country', '')
|
||||
filter_parks = request.GET.get('filter_parks', 'false') == 'true'
|
||||
|
||||
if not region or not country:
|
||||
return JsonResponse([], safe=False)
|
||||
|
||||
# Base query
|
||||
cities = City.objects.filter(
|
||||
Q(name__icontains=query) | Q(alternate_names__icontains=query),
|
||||
region__name__iexact=region,
|
||||
region__country__name__iexact=country
|
||||
).values_list('name', flat=True)[:10]
|
||||
)
|
||||
|
||||
# Only filter by parks if explicitly requested
|
||||
if filter_parks:
|
||||
cities = cities.filter(park__isnull=False)
|
||||
|
||||
cities = cities.distinct().values('id', 'name')[:10]
|
||||
return JsonResponse(list(cities), safe=False)
|
||||
|
||||
class ParkCreateView(LoginRequiredMixin, CreateView):
|
||||
@@ -50,38 +78,111 @@ class ParkCreateView(LoginRequiredMixin, CreateView):
|
||||
form_class = ParkForm
|
||||
template_name = 'parks/park_form.html'
|
||||
|
||||
def form_valid(self, form):
|
||||
# If user is moderator or above, save directly
|
||||
if self.request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']:
|
||||
self.object = form.save()
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
# Otherwise, create a submission
|
||||
cleaned_data = form.cleaned_data.copy()
|
||||
def prepare_changes_data(self, cleaned_data):
|
||||
data = cleaned_data.copy()
|
||||
# Convert model instances to IDs for JSON serialization
|
||||
if cleaned_data.get('owner'):
|
||||
cleaned_data['owner'] = cleaned_data['owner'].id
|
||||
if cleaned_data.get('country'):
|
||||
cleaned_data['country'] = cleaned_data['country'].id
|
||||
if cleaned_data.get('region'):
|
||||
cleaned_data['region'] = cleaned_data['region'].id
|
||||
if cleaned_data.get('city'):
|
||||
cleaned_data['city'] = cleaned_data['city'].id
|
||||
if data.get('owner'):
|
||||
data['owner'] = data['owner'].id
|
||||
if data.get('country'):
|
||||
data['country'] = data['country'].id
|
||||
if data.get('region'):
|
||||
data['region'] = data['region'].id
|
||||
if data.get('city'):
|
||||
data['city'] = data['city'].id
|
||||
# Convert dates to ISO format strings
|
||||
if data.get('opening_date'):
|
||||
data['opening_date'] = data['opening_date'].isoformat()
|
||||
if data.get('closing_date'):
|
||||
data['closing_date'] = data['closing_date'].isoformat()
|
||||
return data
|
||||
|
||||
def form_valid(self, form):
|
||||
changes = self.prepare_changes_data(form.cleaned_data)
|
||||
|
||||
# Create submission record
|
||||
submission = EditSubmission.objects.create(
|
||||
user=self.request.user,
|
||||
content_type=ContentType.objects.get_for_model(Park),
|
||||
submission_type='CREATE',
|
||||
changes=cleaned_data,
|
||||
changes=changes,
|
||||
reason=self.request.POST.get('reason', ''),
|
||||
source=self.request.POST.get('source', '')
|
||||
)
|
||||
|
||||
# If user is moderator or above, auto-approve
|
||||
if self.request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']:
|
||||
self.object = form.save()
|
||||
submission.object_id = self.object.id
|
||||
submission.status = 'APPROVED'
|
||||
submission.handled_by = self.request.user
|
||||
submission.save()
|
||||
messages.success(self.request, f'Successfully created {self.object.name}')
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
messages.success(self.request, 'Your park submission has been sent for review')
|
||||
return HttpResponseRedirect(reverse('parks:park_list'))
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('parks:park_detail', kwargs={'slug': self.object.slug})
|
||||
|
||||
class ParkDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, InlineEditMixin, HistoryMixin, DetailView):
|
||||
class ParkUpdateView(LoginRequiredMixin, UpdateView):
|
||||
model = Park
|
||||
form_class = ParkForm
|
||||
template_name = 'parks/park_form.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['is_edit'] = True
|
||||
return context
|
||||
|
||||
def prepare_changes_data(self, cleaned_data):
|
||||
data = cleaned_data.copy()
|
||||
# Convert model instances to IDs for JSON serialization
|
||||
if data.get('owner'):
|
||||
data['owner'] = data['owner'].id
|
||||
if data.get('country'):
|
||||
data['country'] = data['country'].id
|
||||
if data.get('region'):
|
||||
data['region'] = data['region'].id
|
||||
if data.get('city'):
|
||||
data['city'] = data['city'].id
|
||||
# Convert dates to ISO format strings
|
||||
if data.get('opening_date'):
|
||||
data['opening_date'] = data['opening_date'].isoformat()
|
||||
if data.get('closing_date'):
|
||||
data['closing_date'] = data['closing_date'].isoformat()
|
||||
return data
|
||||
|
||||
def form_valid(self, form):
|
||||
changes = self.prepare_changes_data(form.cleaned_data)
|
||||
|
||||
# Create submission record
|
||||
submission = EditSubmission.objects.create(
|
||||
user=self.request.user,
|
||||
content_type=ContentType.objects.get_for_model(Park),
|
||||
object_id=self.object.id,
|
||||
submission_type='EDIT',
|
||||
changes=changes,
|
||||
reason=self.request.POST.get('reason', ''),
|
||||
source=self.request.POST.get('source', '')
|
||||
)
|
||||
|
||||
# If user is moderator or above, auto-approve
|
||||
if self.request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']:
|
||||
self.object = form.save()
|
||||
submission.status = 'APPROVED'
|
||||
submission.handled_by = self.request.user
|
||||
submission.save()
|
||||
messages.success(self.request, f'Successfully updated {self.object.name}')
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
messages.success(self.request, f'Your changes to {self.object.name} have been sent for review')
|
||||
return HttpResponseRedirect(reverse('parks:park_detail', kwargs={'slug': self.object.slug}))
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('parks:park_detail', kwargs={'slug': self.object.slug})
|
||||
|
||||
class ParkDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin, DetailView):
|
||||
model = Park
|
||||
template_name = 'parks/park_detail.html'
|
||||
context_object_name = 'park'
|
||||
@@ -104,7 +205,7 @@ class ParkDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixi
|
||||
def get_redirect_url_pattern(self):
|
||||
return 'parks:park_detail'
|
||||
|
||||
class ParkAreaDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, InlineEditMixin, HistoryMixin, DetailView):
|
||||
class ParkAreaDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin, DetailView):
|
||||
model = ParkArea
|
||||
template_name = 'parks/area_detail.html'
|
||||
context_object_name = 'area'
|
||||
@@ -149,7 +250,7 @@ class ParkListView(ListView):
|
||||
country = self.request.GET.get('country', '').strip()
|
||||
region = self.request.GET.get('region', '').strip()
|
||||
city = self.request.GET.get('city', '').strip()
|
||||
status = self.request.GET.get('status', '').strip()
|
||||
statuses = self.request.GET.getlist('status')
|
||||
|
||||
if search:
|
||||
queryset = queryset.filter(
|
||||
@@ -166,8 +267,8 @@ class ParkListView(ListView):
|
||||
if city:
|
||||
queryset = queryset.filter(city__name__icontains=city)
|
||||
|
||||
if status:
|
||||
queryset = queryset.filter(status=status)
|
||||
if statuses:
|
||||
queryset = queryset.filter(status__in=statuses)
|
||||
|
||||
return queryset
|
||||
|
||||
@@ -178,7 +279,7 @@ class ParkListView(ListView):
|
||||
'country': self.request.GET.get('country', ''),
|
||||
'region': self.request.GET.get('region', ''),
|
||||
'city': self.request.GET.get('city', ''),
|
||||
'status': self.request.GET.get('status', '')
|
||||
'statuses': self.request.GET.getlist('status')
|
||||
}
|
||||
return context
|
||||
|
||||
|
||||
Reference in New Issue
Block a user