Skip to content

Commit 1e24a8b

Browse files
committed
parking lot code
1 parent 74d76c5 commit 1e24a8b

8 files changed

Lines changed: 538 additions & 0 deletions

File tree

Parking Lot/code/__init__.py

Whitespace-only changes.

Parking Lot/code/enums.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from enum import Enum
2+
3+
class VehicleType(Enum):
4+
MOTORBIKE, CAR, TRUCK, = 1, 2, 3
5+
6+
class RateType(Enum):
7+
PER_HOUR, PER_DAY, = 1, 2
8+
9+
class ParkingLotType(Enum):
10+
MALL, STADIUM, AIRPORT = 1, 2 ,3

Parking Lot/code/main.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from enums import *
2+
from rates import FlatRate, DynamicRate
3+
from vehicles import MoterBike, Car, Truck
4+
from parkingSpots import MoterBikeSpot, CarParkingSpot, TruckParkingSpot
5+
from parkingLots import MallParkingLot, AirportParkingLot
6+
7+
8+
def main():
9+
fkat_rate= FlatRate(10)
10+
interval_rates=(("0-4",30),("4-12",60))
11+
interval_rates=(("0-1",0),("1-8",40), ("8-60",40))
12+
per_hour_rates=(RateType.PER_HOUR, 100 )
13+
per_day_rates=(RateType.PER_DAY, 100 )
14+
dy__rate= DynamicRate(interval_rates, per_hour_rates)
15+
16+
moterBike = MoterBike("123")
17+
18+
res= dy__rate.calculate_price(43.05)
19+
20+
21+
moterBike = MoterBike("123")
22+
car = Car("car_123")
23+
truck = Truck("truck_123")
24+
25+
26+
spot = MoterBikeSpot(100, dy__rate)
27+
carspots = CarParkingSpot(100, dy__rate)
28+
mall_parking = AirportParkingLot("Airport", "noida")
29+
mall_parking.add_moter_bike_parking_spot(spot)
30+
mall_parking.add_car_parking_spot(carspots)
31+
ticket = mall_parking.park_vehicle(moterBike)
32+
mall_parking.unpark_vehicle(moterBike, ticket)
33+
34+
if __name__ == '__main__':
35+
main()

Parking Lot/code/parkingLots.py

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
from abc import ABC, abstractmethod
2+
from enums import *
3+
import datetime
4+
5+
class ParkingTicket(ABC):
6+
def __init__(self,token):
7+
self.token= token
8+
self.ammount = 0
9+
self.issued_at = datetime.datetime.now()
10+
self.payed = False
11+
self.payedAt= None
12+
13+
14+
class ParkingLot(ABC):
15+
16+
def __init__(self,name,location):
17+
self.name=name
18+
self.location=location
19+
20+
21+
def addVehicleToSpot(self, spot, vehicle):
22+
parkingTicket = None
23+
token = spot.assign_vehicle(vehicle)
24+
if token != "OutOfCapcity":
25+
parkingTicket = ParkingTicket(token)
26+
return parkingTicket
27+
28+
def removeVehicleFromSpot(self, spot, ticket):
29+
spot.remove_vehicle(ticket.token)
30+
now = datetime.datetime.now()
31+
duration = now - ticket.issued_at
32+
duration_in_s = duration.total_seconds()
33+
hours= duration_in_s / 3600
34+
# hours = divmod(duration_in_s, 3600)[0]
35+
return spot.pricingModel.calculate_price(hours)
36+
37+
38+
39+
40+
@abstractmethod
41+
def park_vehicle(self, vehicle):
42+
pass
43+
44+
@abstractmethod
45+
def unpark_vehicle(self, vehicle):
46+
pass
47+
48+
@abstractmethod
49+
def add_moter_bike_parking_spot(self, spot):
50+
pass
51+
52+
@abstractmethod
53+
def add_car_parking_spot(self, spot):
54+
pass
55+
56+
@abstractmethod
57+
def add_truck_parking_spot(self, spot):
58+
pass
59+
60+
61+
class MallParkingLot(ParkingLot):
62+
def __init__(self,name,location):
63+
super().__init__(name, location)
64+
65+
def add_moter_bike_parking_spot(self, spot):
66+
self.moter_bike_spots = spot
67+
68+
def add_car_parking_spot(self, spot):
69+
self.car_spots = spot
70+
71+
def add_truck_parking_spot(self, spot):
72+
self.truck_sports = spot
73+
74+
def park_vehicle(self, vehicle):
75+
switcher = {
76+
VehicleType.MOTORBIKE: self.addVehicleToSpot(self.moter_bike_spots, vehicle),
77+
VehicleType.CAR: self.addVehicleToSpot(self.car_spots, vehicle),
78+
VehicleType.TRUCK: self.addVehicleToSpot(self.truck_sports, vehicle),
79+
}
80+
ticket = switcher.get(vehicle.vehical_type, lambda: 'Wrong vehicle type!')
81+
if ticket is None :
82+
return "No Space Available"
83+
return ticket
84+
85+
def unpark_vehicle(self, vehicle, ticket):
86+
switcher = {
87+
VehicleType.MOTORBIKE: self.removeVehicleFromSpot(self.moter_bike_spots, ticket),
88+
VehicleType.CAR: self.removeVehicleFromSpot(self.car_spots, ticket),
89+
VehicleType.TRUCK: self.removeVehicleFromSpot(self.truck_sports, ticket),
90+
}
91+
price = switcher.get(vehicle.vehical_type, lambda: 'Wrong vehicle type!')
92+
return price
93+
94+
class StadiumParkingLot(ParkingLot):
95+
def __init__(self,name,location):
96+
super().__init__(name, location)
97+
98+
def add_moter_bike_parking_spot(self, spot):
99+
self.moter_bike_spots = spot
100+
101+
def add_car_parking_spot(self, spot):
102+
self.car_spots = spot
103+
104+
def add_truck_parking_spot(self, spot):
105+
return "not supported"
106+
107+
def park_vehicle(self, vehicle):
108+
switcher = {
109+
VehicleType.MOTORBIKE: self.addVehicleToSpot(self.moter_bike_spots, vehicle),
110+
VehicleType.CAR: self.addVehicleToSpot(self.car_spots, vehicle),
111+
VehicleType.TRUCK: "Not Supported",
112+
}
113+
ticket = switcher.get(vehicle.vehical_type, lambda: 'Wrong vehicle type!')
114+
if ticket is None :
115+
return "No Space Available"
116+
return ticket
117+
118+
def unpark_vehicle(self, vehicle, ticket):
119+
switcher = {
120+
VehicleType.MOTORBIKE: self.removeVehicleFromSpot(self.moter_bike_spots, ticket),
121+
VehicleType.CAR: self.removeVehicleFromSpot(self.car_spots, ticket),
122+
VehicleType.TRUCK: "Not Supported",
123+
}
124+
price = switcher.get(vehicle.vehical_type, lambda: 'Wrong vehicle type!')
125+
return price
126+
127+
class AirportParkingLot(ParkingLot):
128+
def __init__(self,name,location):
129+
super().__init__(name, location)
130+
131+
def add_moter_bike_parking_spot(self, spot):
132+
self.moter_bike_spots = spot
133+
134+
def add_car_parking_spot(self, spot):
135+
self.car_spots = spot
136+
137+
def add_truck_parking_spot(self, spot):
138+
return "not supported"
139+
140+
def park_vehicle(self, vehicle):
141+
switcher = {
142+
VehicleType.MOTORBIKE: self.addVehicleToSpot(self.moter_bike_spots, vehicle),
143+
VehicleType.CAR: self.addVehicleToSpot(self.car_spots, vehicle),
144+
VehicleType.TRUCK: "Not Supported",
145+
}
146+
ticket = switcher.get(vehicle.vehical_type, lambda: 'Wrong vehicle type!')
147+
if ticket is None :
148+
return "No Space Available"
149+
return ticket
150+
151+
def unpark_vehicle(self, vehicle, ticket):
152+
switcher = {
153+
VehicleType.MOTORBIKE: self.removeVehicleFromSpot(self.moter_bike_spots, ticket),
154+
VehicleType.CAR: self.removeVehicleFromSpot(self.car_spots, ticket),
155+
VehicleType.TRUCK: "Not Supported",
156+
}
157+
price = switcher.get(vehicle.vehical_type, lambda: 'Wrong vehicle type!')
158+
return price

Parking Lot/code/parkingSpots.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from abc import ABC, abstractmethod
2+
from enums import *
3+
4+
class ParkingSpot(ABC):
5+
def __init__(self,capcity):
6+
self.capcity = capcity
7+
self.spots={"%.3d" % num: None for num in range(self.capcity)}
8+
9+
def is_free(self):
10+
return self.capcity > 0
11+
12+
def assign_vehicle(self, vehicle):
13+
if self.is_free():
14+
for key,val in self.spots.items():
15+
if val is None :
16+
self.spots[key]= vehicle
17+
self.capcity=self.capcity-1
18+
return key
19+
else:
20+
return "OutOfCapcity"
21+
22+
23+
def remove_vehicle(self, ticket):
24+
self.spots[ticket]=None
25+
self.capcity+=1
26+
27+
class MoterBikeSpot(ParkingSpot):
28+
def __init__(self,capcity, pricingModel):
29+
super().__init__(capcity)
30+
self.parking_type = VehicleType.MOTORBIKE
31+
self.pricingModel = pricingModel
32+
33+
class CarParkingSpot(ParkingSpot):
34+
def __init__(self,capcity,pricingModel):
35+
super().__init__(capcity)
36+
self.parking_type = VehicleType.CAR
37+
self.pricingModel = pricingModel
38+
39+
class TruckParkingSpot(ParkingSpot):
40+
def __init__(self,capcity,pricingModel):
41+
super().__init__(capcity)
42+
self.parking_type = VehicleType.TRUCK
43+
self.pricingModel = pricingModel

Parking Lot/code/rates.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from abc import ABC, abstractmethod
2+
from abc import ABCMeta, abstractmethod
3+
import math
4+
import datetime
5+
from enums import *
6+
7+
class Rate(metaclass=ABCMeta):
8+
@abstractmethod
9+
def calculate_price(self):
10+
pass
11+
12+
class FlatRate(Rate):
13+
14+
def __init__(self,rate):
15+
"""
16+
Parameters
17+
----------
18+
rate : float
19+
price based on per hour
20+
21+
"""
22+
self.rate = rate
23+
24+
def calculate_price(self, hour):
25+
return self.rate*hour
26+
27+
28+
class DynamicRate(Rate):
29+
30+
def __init__(self,interval_rates,dynamic_rate):
31+
"""
32+
Parameters
33+
----------
34+
interval_rates : tupple
35+
price for different time interval in form for tupple ex: (("0-4",30),("4-12",60))
36+
dynamic_rate : tupple
37+
price after fixed interval has crossed ex: (RateType.PER_HOUR, 100 )
38+
"""
39+
40+
self.interval_rates = interval_rates
41+
self.dynamic_rate = dynamic_rate
42+
43+
def calculate_price(self, hours):
44+
price = 0
45+
46+
if self.dynamic_rate[0] == RateType.PER_HOUR:
47+
for rate in self.interval_rates:
48+
if hours > 0:
49+
range = rate[0].split("-")
50+
total_hour_in_range = float(range[1])-float(range[0])
51+
price+=rate[1]
52+
hours-=total_hour_in_range
53+
else:
54+
break
55+
hours= math.ceil(hours)
56+
57+
if hours > 0 :
58+
price += hours*self.dynamic_rate[1]
59+
60+
else:
61+
if hours >= 24 :
62+
days = math.ceil(hours/24)
63+
return days*self.dynamic_rate[1]
64+
65+
else:
66+
for rate in self.interval_rates:
67+
range = rate[0].split("-")
68+
if float(range[0]) <= hours <= float(range[1]):
69+
price=rate[1]
70+
return price
71+
72+
return price

0 commit comments

Comments
 (0)