/ backend / models / interface.py
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")