Files
vrobbler/vrobbler/apps/trails/models.py

78 lines
2.3 KiB
Python

from dataclasses import dataclass
from typing import Optional
from django.apps import apps
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from locations.models import GeoLocation
from scrobbles.dataclasses import BaseLogData, WithPeopleLogData
from scrobbles.mixins import ScrobblableConstants, ScrobblableMixin
BNULL = {"blank": True, "null": True}
@dataclass
class TrailLogData(BaseLogData, WithPeopleLogData):
effort: Optional[str] = None
difficulty: Optional[str] = None
class Trail(ScrobblableMixin):
class PrincipalType(models.TextChoices):
WOODS = "WOODS"
ROAD = "ROAD"
BEACH = "BEACH"
MOUNTAIN = "MOUNTAIN"
class ActivityType(models.TextChoices):
WALK = "WALK"
HIKE = "HIKE"
RUN = "RUN"
BIKE = "BIKE"
description = models.TextField(**BNULL)
trailhead_location = models.ForeignKey(
GeoLocation,
related_name="trailheads",
on_delete=models.DO_NOTHING,
**BNULL,
)
trail_terminus_location = models.ForeignKey(
GeoLocation,
related_name="trail_termini",
on_delete=models.DO_NOTHING,
**BNULL,
)
strava_id = models.CharField(max_length=255, **BNULL)
trailforks_id = models.CharField(max_length=255, **BNULL)
alltrails_id = models.CharField(max_length=255, **BNULL)
gaiagps_id = models.CharField(max_length=255, **BNULL)
principal_type = models.CharField(
max_length=10, choices=PrincipalType.choices, **BNULL
)
default_activity_type = models.CharField(
max_length=10, choices=ActivityType.choices, **BNULL
)
def get_absolute_url(self):
return reverse("trails:trail_detail", kwargs={"slug": self.uuid})
@property
def logdata_cls(self):
return TrailLogData
@property
def strings(self) -> ScrobblableConstants:
return ScrobblableConstants(verb="Moving", tags="runner")
@classmethod
def find_or_create(cls, title: str) -> "Trail":
return cls.objects.filter(title=title).first()
def scrobbles(self, user_id):
Scrobble = apps.get_model("scrobbles", "Scrobble")
return Scrobble.objects.filter(
user_id=user_id, life_event=self
).order_by("-timestamp")