interface.py
1 import uuid 2 from abc import ABC, abstractmethod 3 from decimal import Decimal 4 from typing import List, Optional, Dict 5 6 from pydantic import BaseModel, Field, computed_field 7 8 from cache.store import get_provider_html 9 from models.models import ProviderVehiclesRequest, ProviderStoreItem 10 11 12 class Calculator(ABC, BaseModel): 13 vehicle_request: ProviderVehiclesRequest 14 price_per_minute: Optional[Decimal] 15 price_per_km: Optional[Decimal] 16 17 def total_price(self) -> Decimal: 18 return (self.vehicle_request.distance_kilometer * self.price_per_km) + ( 19 self.vehicle_request.time_minutes * self.price_per_minute 20 ) 21 22 23 class VehicleOption(BaseModel): 24 vehicle_image: str 25 electric: bool = Field(default=False) 26 provider: str 27 type: str 28 29 calculator: Calculator = Field(exclude=True) 30 31 @computed_field 32 @property 33 def total_price(self) -> Decimal: 34 return self.calculator.total_price().quantize(Decimal("0.00")) 35 36 @computed_field 37 @property 38 def id(self) -> str: 39 return str(uuid.uuid4()) 40 41 42 class ProviderInterface(ABC, BaseModel): 43 vehicle_request: ProviderVehiclesRequest 44 pricing_urls: Optional[List[str]] = Field(required=False, default=None) 45 free_parking: bool 46 47 def get_pricing_html(self) -> List[ProviderStoreItem]: 48 assert self.pricing_urls 49 return [get_provider_html(url) for url in self.pricing_urls] 50 51 @abstractmethod 52 async def get_vehicles_options(self) -> List[VehicleOption]: 53 raise NotImplementedError("Forgot to implement total method")