first pylint correction
Some checks failed
Build and deploy the backend to staging / Build and push image (pull_request) Successful in 2m26s
Run linting on the backend code / Build (pull_request) Failing after 30s
Run testing on the backend code / Build (pull_request) Successful in 2m12s
Build and deploy the backend to staging / Deploy to staging (pull_request) Successful in 15s
Some checks failed
Build and deploy the backend to staging / Build and push image (pull_request) Successful in 2m26s
Run linting on the backend code / Build (pull_request) Failing after 30s
Run testing on the backend code / Build (pull_request) Successful in 2m12s
Build and deploy the backend to staging / Deploy to staging (pull_request) Successful in 15s
This commit is contained in:
@@ -1,10 +1,41 @@
|
||||
"""Definition of the Landmark class to handle visitable objects across the world."""
|
||||
|
||||
from typing import Optional, Literal
|
||||
from uuid import uuid4
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from uuid import uuid4
|
||||
|
||||
# Output to frontend
|
||||
class Landmark(BaseModel) :
|
||||
"""
|
||||
A class representing a landmark or point of interest (POI) in the context of a trip.
|
||||
|
||||
The Landmark class is used to model visitable locations, such as tourist attractions,
|
||||
natural sites, shopping locations, and start/end points in travel itineraries. It
|
||||
holds information about the landmark's attributes and supports comparisons and
|
||||
calculations, such as distance between landmarks.
|
||||
|
||||
Attributes:
|
||||
name (str): The name of the landmark.
|
||||
type (Literal): The type of the landmark, which can be one of ['sightseeing', 'nature',
|
||||
'shopping', 'start', 'finish'].
|
||||
location (tuple): A tuple representing the (latitude, longitude) of the landmark.
|
||||
osm_type (str): The OpenStreetMap (OSM) type of the landmark.
|
||||
osm_id (int): The OpenStreetMap (OSM) ID of the landmark.
|
||||
attractiveness (int): A score representing the attractiveness of the landmark.
|
||||
n_tags (int): The number of tags associated with the landmark.
|
||||
image_url (Optional[str]): A URL to an image of the landmark.
|
||||
website_url (Optional[str]): A URL to the landmark's official website.
|
||||
description (Optional[str]): A text description of the landmark.
|
||||
duration (Optional[int]): The estimated time to visit the landmark (in minutes).
|
||||
name_en (Optional[str]): The English name of the landmark.
|
||||
uuid (str): A unique identifier for the landmark, generated by default using uuid4.
|
||||
must_do (Optional[bool]): Whether the landmark is a "must-do" attraction.
|
||||
must_avoid (Optional[bool]): Whether the landmark should be avoided.
|
||||
is_secondary (Optional[bool]): Whether the landmark is secondary or less important.
|
||||
time_to_reach_next (Optional[int]): Estimated time (in minutes) to reach the next landmark.
|
||||
next_uuid (Optional[str]): UUID of the next landmark in sequence (if applicable).
|
||||
"""
|
||||
|
||||
# Properties of the landmark
|
||||
name : str
|
||||
@@ -26,12 +57,19 @@ class Landmark(BaseModel) :
|
||||
# Additional properties depending on specific tour
|
||||
must_do : Optional[bool] = False
|
||||
must_avoid : Optional[bool] = False
|
||||
is_secondary : Optional[bool] = False # TODO future
|
||||
is_secondary : Optional[bool] = False
|
||||
|
||||
time_to_reach_next : Optional[int] = 0
|
||||
next_uuid : Optional[str] = None
|
||||
|
||||
def __str__(self) -> str:
|
||||
"""
|
||||
String representation of the Landmark object.
|
||||
|
||||
Returns:
|
||||
str: A formatted string with the landmark's type, name, location, attractiveness score,
|
||||
time to the next landmark (if available), and whether the landmark is secondary.
|
||||
"""
|
||||
time_to_next_str = f", time_to_next={self.time_to_reach_next}" if self.time_to_reach_next else ""
|
||||
is_secondary_str = f", secondary" if self.is_secondary else ""
|
||||
type_str = '(' + self.type + ')'
|
||||
@@ -39,12 +77,36 @@ class Landmark(BaseModel) :
|
||||
return f'Landmark{type_str}: [{self.name} @{self.location}, score={self.attractiveness}{time_to_next_str}{is_secondary_str}]'
|
||||
|
||||
def distance(self, value: 'Landmark') -> float:
|
||||
"""
|
||||
Calculates the squared distance between this landmark and another.
|
||||
|
||||
Args:
|
||||
value (Landmark): Another Landmark object to calculate the distance to.
|
||||
|
||||
Returns:
|
||||
float: The squared Euclidean distance between the two landmarks.
|
||||
"""
|
||||
return (self.location[0] - value.location[0])**2 + (self.location[1] - value.location[1])**2
|
||||
|
||||
def __hash__(self) -> int:
|
||||
"""
|
||||
Generates a hash for the Landmark based on its name.
|
||||
|
||||
Returns:
|
||||
int: The hash of the landmark.
|
||||
"""
|
||||
return hash(self.name)
|
||||
|
||||
def __eq__(self, value: 'Landmark') -> bool:
|
||||
"""
|
||||
Checks equality between two Landmark objects based on UUID, OSM ID, and name.
|
||||
|
||||
Args:
|
||||
value (Landmark): Another Landmark object to compare.
|
||||
|
||||
Returns:
|
||||
bool: True if the landmarks are equal, False otherwise.
|
||||
"""
|
||||
# eq and hash must be consistent
|
||||
# in particular, if two objects are equal, their hash must be equal
|
||||
# uuid and osm_id are just shortcuts to avoid comparing all the properties
|
||||
|
Reference in New Issue
Block a user