77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
from domain import Address
|
|
|
|
class Service:
|
|
def __init__(self,repo) -> None:
|
|
self.repo=repo
|
|
|
|
def add_address(self,id,name,number,x,y):
|
|
if not id.isdigit():
|
|
raise ValueError("Id must be a positive integer")
|
|
if len(name)<3:
|
|
raise ValueError("Name must be at least 3 characters")
|
|
if not number.isdigit() or int(number)>100:
|
|
raise ValueError("Number must be a positive integer less or equal to 100")
|
|
try:
|
|
int(x)
|
|
except:
|
|
raise ValueError("X must be an integer")
|
|
if int(x)>100 or int(x)<-100:
|
|
raise ValueError("X must be an integer between -100 and 100")
|
|
try:
|
|
int(y)
|
|
except:
|
|
raise ValueError("Y must be an integer")
|
|
if int(y)>100 or int(y)<-100:
|
|
raise ValueError("Y must be an integer between -100 and 100")
|
|
address=Address(int(id),name,int(number),int(x),int(y))
|
|
self.repo.add_address(address)
|
|
|
|
def get_addresses(self):
|
|
return self.repo.get_addresses_as_string()
|
|
|
|
def get_distance(self,x,y,dist):
|
|
"""
|
|
:params:
|
|
x - str
|
|
y - str
|
|
dist - str
|
|
|
|
:return:
|
|
to_return - list of tuples of Address and int
|
|
|
|
The function verifies the input and calculates the distance between the given position and all adresses and return the adresses with the distance smaller than the one specify
|
|
"""
|
|
try:
|
|
int(x)
|
|
except:
|
|
raise ValueError("X must be an integer")
|
|
if int(x)>100 or int(x)<-100:
|
|
raise ValueError("X must be an integer between -100 and 100")
|
|
try:
|
|
int(y)
|
|
except:
|
|
raise ValueError("Y must be an integer")
|
|
if int(y)>100 or int(y)<-100:
|
|
raise ValueError("Y must be an integer between -100 and 100")
|
|
if not dist.isdigit():
|
|
raise ValueError("Distance must be a positive integer")
|
|
data=self.repo.get_addresses()
|
|
to_return=[]
|
|
for address in data:
|
|
distance=((int(x)-address.get_x())**2+(int(y)-address.get_y())**2)**(1/2)
|
|
if distance<=int(dist):
|
|
to_return.append((address,distance))
|
|
return to_return
|
|
|
|
def get_coordinates(self):
|
|
n=0
|
|
x=0
|
|
y=0
|
|
data=self.repo.get_addresses()
|
|
for address in data:
|
|
n+=1
|
|
x+=address.get_x()
|
|
y+=address.get_y()
|
|
if n==0:
|
|
raise ValueError("There are no addresses")
|
|
return (x/n,y/n) |