Refactor imports and improve code organization: streamline import statements and enhance readability in parks/views.py

This commit is contained in:
pacnpal
2025-02-21 20:37:03 -05:00
parent 4d145ebabe
commit 5278ad39d0

View File

@@ -1,3 +1,24 @@
from .querysets import get_base_park_queryset
from search.mixins import HTMXFilterableMixin
from reviews.models import Review
from location.models import Location
from media.models import Photo
from moderation.models import EditSubmission
from moderation.mixins import EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin
from core.views import SlugRedirectMixin
from .filters import ParkFilter
from .forms import ParkForm
from .models import Park, ParkArea
from django.http import HttpResponseRedirect, HttpResponse, HttpRequest, JsonResponse
from django.core.exceptions import ObjectDoesNotExist
from django.contrib import messages
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Q, Count, QuerySet
from django.urls import reverse
from django.shortcuts import get_object_or_404, render
from decimal import InvalidOperation
from django.views.generic import DetailView, ListView, CreateView, UpdateView
import requests import requests
from decimal import Decimal, ROUND_DOWN from decimal import Decimal, ROUND_DOWN
from typing import Any, Optional, cast, Literal from typing import Any, Optional, cast, Literal
@@ -8,26 +29,6 @@ PARK_LIST_ITEM_TEMPLATE = "parks/partials/park_list_item.html"
REQUIRED_FIELDS_ERROR = "Please correct the errors below. Required fields are marked with an asterisk (*)." REQUIRED_FIELDS_ERROR = "Please correct the errors below. Required fields are marked with an asterisk (*)."
ALLOWED_ROLES = ["MODERATOR", "ADMIN", "SUPERUSER"] ALLOWED_ROLES = ["MODERATOR", "ADMIN", "SUPERUSER"]
from django.views.generic import DetailView, ListView, CreateView, UpdateView
from decimal import InvalidOperation
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.db.models import Q, Count, QuerySet
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.contenttypes.models import ContentType
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponseRedirect, HttpResponse, HttpRequest, JsonResponse
from .models import Park, ParkArea
from .forms import ParkForm
from .filters import ParkFilter
from core.views import SlugRedirectMixin
from moderation.mixins import EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin
from moderation.models import EditSubmission
from media.models import Photo
from location.models import Location
from reviews.models import Review
from search.mixins import HTMXFilterableMixin
ViewMode = Literal["grid", "list"] ViewMode = Literal["grid", "list"]
@@ -79,8 +80,8 @@ def normalize_osm_result(result: dict) -> dict:
# Get postal code with fallbacks # Get postal code with fallbacks
postal_code = (address.get('postcode') or postal_code = (address.get('postcode') or
address.get('postal_code') or address.get('postal_code') or
'') '')
return { return {
'display_name': name or result.get('display_name', ''), 'display_name': name or result.get('display_name', ''),
@@ -96,23 +97,24 @@ def normalize_osm_result(result: dict) -> dict:
'postal_code': postal_code, 'postal_code': postal_code,
} }
def get_view_mode(request: HttpRequest) -> ViewMode: def get_view_mode(request: HttpRequest) -> ViewMode:
"""Get the current view mode from request, defaulting to grid""" """Get the current view mode from request, defaulting to grid"""
view_mode = request.GET.get('view_mode', 'grid') view_mode = request.GET.get('view_mode', 'grid')
return cast(ViewMode, 'list' if view_mode == 'list' else 'grid') return cast(ViewMode, 'list' if view_mode == 'list' else 'grid')
from .querysets import get_base_park_queryset
def add_park_button(request: HttpRequest) -> HttpResponse: def add_park_button(request: HttpRequest) -> HttpResponse:
"""Return the add park button partial template""" """Return the add park button partial template"""
return render(request, "parks/partials/add_park_button.html") return render(request, "parks/partials/add_park_button.html")
def park_actions(request: HttpRequest, slug: str) -> HttpResponse: def park_actions(request: HttpRequest, slug: str) -> HttpResponse:
"""Return the park actions partial template""" """Return the park actions partial template"""
park = get_object_or_404(Park, slug=slug) park = get_object_or_404(Park, slug=slug)
return render(request, "parks/partials/park_actions.html", {"park": park}) return render(request, "parks/partials/park_actions.html", {"park": park})
def get_park_areas(request: HttpRequest) -> HttpResponse: def get_park_areas(request: HttpRequest) -> HttpResponse:
"""Return park areas as options for a select element""" """Return park areas as options for a select element"""
park_id = request.GET.get('park') park_id = request.GET.get('park')
@@ -131,6 +133,7 @@ def get_park_areas(request: HttpRequest) -> HttpResponse:
except Park.DoesNotExist: except Park.DoesNotExist:
return HttpResponse('<option value="">Invalid park selected</option>') return HttpResponse('<option value="">Invalid park selected</option>')
def location_search(request: HttpRequest) -> JsonResponse: def location_search(request: HttpRequest) -> JsonResponse:
"""Search for locations using OpenStreetMap Nominatim API""" """Search for locations using OpenStreetMap Nominatim API"""
query = request.GET.get("q", "") query = request.GET.get("q", "")
@@ -153,7 +156,8 @@ def location_search(request: HttpRequest) -> JsonResponse:
if response.status_code == 200: if response.status_code == 200:
results = response.json() results = response.json()
normalized_results = [normalize_osm_result(result) for result in results] normalized_results = [normalize_osm_result(
result) for result in results]
valid_results = [ valid_results = [
r for r in normalized_results r for r in normalized_results
if r["lat"] is not None and r["lon"] is not None if r["lat"] is not None and r["lon"] is not None
@@ -162,6 +166,7 @@ def location_search(request: HttpRequest) -> JsonResponse:
return JsonResponse({"results": []}) return JsonResponse({"results": []})
def reverse_geocode(request: HttpRequest) -> JsonResponse: def reverse_geocode(request: HttpRequest) -> JsonResponse:
"""Reverse geocode coordinates using OpenStreetMap Nominatim API""" """Reverse geocode coordinates using OpenStreetMap Nominatim API"""
try: try:
@@ -311,6 +316,7 @@ def search_parks(request: HttpRequest) -> HttpResponse:
response['HX-Trigger'] = 'searchError' response['HX-Trigger'] = 'searchError'
return response return response
class ParkCreateView(LoginRequiredMixin, CreateView): class ParkCreateView(LoginRequiredMixin, CreateView):
model = Park model = Park
form_class = ParkForm form_class = ParkForm
@@ -324,7 +330,8 @@ class ParkCreateView(LoginRequiredMixin, CreateView):
data["opening_date"] = data["opening_date"].isoformat() data["opening_date"] = data["opening_date"].isoformat()
if data.get("closing_date"): if data.get("closing_date"):
data["closing_date"] = data["closing_date"].isoformat() data["closing_date"] = data["closing_date"].isoformat()
decimal_fields = ["latitude", "longitude", "size_acres", "average_rating"] decimal_fields = ["latitude", "longitude",
"size_acres", "average_rating"]
for field in decimal_fields: for field in decimal_fields:
if data.get(field): if data.get(field):
data[field] = str(data[field]) data[field] = str(data[field])
@@ -375,7 +382,8 @@ class ParkCreateView(LoginRequiredMixin, CreateView):
location_type="park", location_type="park",
latitude=form.cleaned_data["latitude"], latitude=form.cleaned_data["latitude"],
longitude=form.cleaned_data["longitude"], longitude=form.cleaned_data["longitude"],
street_address=form.cleaned_data.get("street_address", ""), street_address=form.cleaned_data.get(
"street_address", ""),
city=form.cleaned_data.get("city", ""), city=form.cleaned_data.get("city", ""),
state=form.cleaned_data.get("state", ""), state=form.cleaned_data.get("state", ""),
country=form.cleaned_data.get("country", ""), country=form.cleaned_data.get("country", ""),
@@ -389,7 +397,8 @@ class ParkCreateView(LoginRequiredMixin, CreateView):
Photo.objects.create( Photo.objects.create(
image=photo_file, image=photo_file,
uploaded_by=self.request.user, uploaded_by=self.request.user,
content_type=ContentType.objects.get_for_model(Park), content_type=ContentType.objects.get_for_model(
Park),
object_id=self.object.id, object_id=self.object.id,
) )
uploaded_count += 1 uploaded_count += 1
@@ -444,7 +453,8 @@ class ParkUpdateView(LoginRequiredMixin, UpdateView):
data["opening_date"] = data["opening_date"].isoformat() data["opening_date"] = data["opening_date"].isoformat()
if data.get("closing_date"): if data.get("closing_date"):
data["closing_date"] = data["closing_date"].isoformat() data["closing_date"] = data["closing_date"].isoformat()
decimal_fields = ["latitude", "longitude", "size_acres", "average_rating"] decimal_fields = ["latitude", "longitude",
"size_acres", "average_rating"]
for field in decimal_fields: for field in decimal_fields:
if data.get(field): if data.get(field):
data[field] = str(data[field]) data[field] = str(data[field])
@@ -516,7 +526,8 @@ class ParkUpdateView(LoginRequiredMixin, UpdateView):
Photo.objects.create( Photo.objects.create(
image=photo_file, image=photo_file,
uploaded_by=self.request.user, uploaded_by=self.request.user,
content_type=ContentType.objects.get_for_model(Park), content_type=ContentType.objects.get_for_model(
Park),
object_id=self.object.id, object_id=self.object.id,
) )
uploaded_count += 1 uploaded_count += 1
@@ -651,5 +662,3 @@ class ParkAreaDetailView(
def get_redirect_url_kwargs(self) -> dict[str, str]: def get_redirect_url_kwargs(self) -> dict[str, str]:
area = cast(ParkArea, self.object) area = cast(ParkArea, self.object)
return {"park_slug": area.park.slug, "area_slug": area.slug} return {"park_slug": area.park.slug, "area_slug": area.slug}