diff --git a/submissions/abdinasir97/python final project/data/airport.txt b/submissions/abdinasir97/python final project/data/airport.txt new file mode 100644 index 0000000..e69de29 diff --git a/submissions/abdinasir97/python final project/main.py b/submissions/abdinasir97/python final project/main.py new file mode 100644 index 0000000..b052927 --- /dev/null +++ b/submissions/abdinasir97/python final project/main.py @@ -0,0 +1,119 @@ +from models.airport import planes, airport +from utils.storage import DATA_PATH,load_airport,purse_seat,save_airport + +def menu_add(airport:airport)->None: + flen = input("FLEET_NUMBER:").strip() + name= input("NAME:").strip + if not flen or name: + print("fleet_number and name are required") + return + try: + seats = purse_seat(list) + except ValueError: + print("seats must be numbers sepparated by coma(e.g 33,56).") + return + fn= airport(fleet_number=flen, name=name, seats=seats) + if airport.add(fn): + print("added") + else: + print("fleet_number already exist") + +def print_airport(rows:list[airport])->None: + if not rows: + print("no airport yet") + for a in rows: + print(f"(a)") + +def menu_list(airport: airport)->None: + print_airport(airport.all()) + +def remove_menu(airport:airport)->None: + flen = input("fleet_number to remove").strip() + if airport.remove(flen): + print("removed") + else: + print("no fleet_number to remove"); + +def menu_search(airport:airport)->None: + q = input("serch(flen or name): ").strip() + found = airport.search(q) + if not found: + print("not match") + return + print_airport(found) + +def menu_update(airport:airport)->None: + flen = input("enter fleet_number to apdate" ).strip + if airport.find_by_fleet(flen) is None: + print("no plane this fleet_number") + return + new_name = input("new_name(enter to keep:)").strip + raw = input("new seats coma separated (enter to keep:type name to clear): ").strip() + name_arg = new_name if new_name else None + if raw.lower() == "None": + seat_arag: list[float] | None = [] + elif raw: + try: + seat_arag =purse_seat(raw) + except ValueError: + print("invailed seat : no thing changed ") + return + else: + seat_arag = None + if not airport.update(flen, name=name_arg,seats=seat_arag): + print("update filed") + return +print("updated") + +def print_menu()->None: + print() + print("--- airport management---") + print( "1) Add airport") + print( "2) List all") + print( "3)remove plane") + print( "3)Search") + print( "4) update airport") + print( "5) Save to file") + print( "0)quite (alse saves)") + + +def main()-> None: + airport= airport() + load_airport(DATA_PATH,airport,) + + + + +try: + while True: + print_menu() + choice = input("choice: ").strip() + if choice == "1": + menu_add(airport) + elif choice == "2": + list(airport) + elif choice == "3": + remove_menu(airport) + elif choice == "4": + menu_search(airport) + elif choice == "5": + menu_update(airport) + elif choice == "6": + save_airport(DATA_PATH, airport) + elif choice == '0': + print("have anice time ") + break +finally: + try: + save_airport(DATA_PATH.airport) + print(f"(data saved by {DATA_PATH}") + except OSError as e: + print("couldn't save:",e) + + +if __name__ =="__main__": + main() + + + + diff --git a/submissions/abdinasir97/python final project/models/__init__.py b/submissions/abdinasir97/python final project/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/abdinasir97/python final project/models/__pycache__/__init__.cpython-314.pyc b/submissions/abdinasir97/python final project/models/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..1ae8a09 Binary files /dev/null and b/submissions/abdinasir97/python final project/models/__pycache__/__init__.cpython-314.pyc differ diff --git a/submissions/abdinasir97/python final project/models/__pycache__/airport.cpython-314.pyc b/submissions/abdinasir97/python final project/models/__pycache__/airport.cpython-314.pyc new file mode 100644 index 0000000..a6a2feb Binary files /dev/null and b/submissions/abdinasir97/python final project/models/__pycache__/airport.cpython-314.pyc differ diff --git a/submissions/abdinasir97/python final project/models/airport.py b/submissions/abdinasir97/python final project/models/airport.py new file mode 100644 index 0000000..295c6ec --- /dev/null +++ b/submissions/abdinasir97/python final project/models/airport.py @@ -0,0 +1,86 @@ + + +from dataclasses import dataclass, field +@dataclass +class planes: + name: str + service: str + fleet_number:str + location:str + seats:list[float] = field(default_factory=list) +def average_seats(self)->float: + if not self.seats: + return 0.0 + return sum(self.seats) / len(self.seats) +def __str__(self)->str: + avg = self.average_seats + avg_txt = f"{avg:.2f}" if self.seats else("full seats") + return f"{self.fleet_number} | {self.name} | seats={self.seats}| avg = {avg.txt}" + +class airport: + def __init__(self)-> None: + self.planes : list[planes] = [] + +def add(self, planes: planes) -> bool: + if self.find_by_fleet(planes.fleet_number) is not None: + return "false" + self.planes.append(planes) + return True +def remove(self, fleet_number:str)->bool: + flen = fleet_number.strip + for i,s in enumerate (self.planes): + if s.fleet_number == flen: + del self.planes[i] + return True + return False + +def find_by_fleet(self, fleet_number:str)->planes | None: + flen = fleet_number.strip() + for s in self.planes: + if s.fleet_number == flen: + return s + return None + +def search(self, query:str)->list[planes]: + q = query.strip().lower() + if not q: + return [] + out :list [planes] = [] + for s in self.planes: + if q in s.fleet_number.lower() or q in s.name.lower(): + out.append(s) + return out +def all(self)->list[planes]: + return list(self.planes) + +def update( + self, + fleet_number: str, + *, + name:str | None = None, + seats: list[float] | None= None + )->bool: + s = self.find_by_fleet(fleet_number) + if s is None: + return False + if name is not None: + s.name = name + if seats is not None: + s.seats = list(seats) + return True + +def clear(self)->None: + self.planes =[] + + + + + + + + + + + + + diff --git a/submissions/abdinasir97/python final project/utils/__init__.py b/submissions/abdinasir97/python final project/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/abdinasir97/python final project/utils/__pycache__/__init__.cpython-314.pyc b/submissions/abdinasir97/python final project/utils/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..18e8e18 Binary files /dev/null and b/submissions/abdinasir97/python final project/utils/__pycache__/__init__.cpython-314.pyc differ diff --git a/submissions/abdinasir97/python final project/utils/__pycache__/storage.cpython-314.pyc b/submissions/abdinasir97/python final project/utils/__pycache__/storage.cpython-314.pyc new file mode 100644 index 0000000..2c40791 Binary files /dev/null and b/submissions/abdinasir97/python final project/utils/__pycache__/storage.cpython-314.pyc differ diff --git a/submissions/abdinasir97/python final project/utils/storage.py b/submissions/abdinasir97/python final project/utils/storage.py new file mode 100644 index 0000000..080e6bc --- /dev/null +++ b/submissions/abdinasir97/python final project/utils/storage.py @@ -0,0 +1,45 @@ +from pathlib import Path +from models.airport import planes, airport +DATA_PATH = Path(__file__).resolve().parent.parent /"data"/ "airport.txt" +FILE_HEADER = "id|name|seats" + +def purse_seat(s:str)->list[float]: + s = s.strip + if not s: + return [] + return[float(p.strip) for p in s.split(".")if p.split()] + +def is_colum_hearer_line(line:str)->bool: + return line.strip().lower().replace(" "," ") == FILE_HEADER.lower().replace(" "," ") + +def load_airport(path:Path, airport:airport)->None: + airport.clear() + try: + with open(path,"r",encoding="utf-8")as f: + for row in f: + line = row.strip() + if not line or line.startswith("#"): + continue + if is_colum_hearer_line(line): + continue + parts = line.split("|",2) + if len(parts) !=3: + continue + flen, name, seats_txt = parts[0].strip(), parts[1].strip(), parts(2) + try: + seats = purse_seat(seats_txt) + except ValueError: + continue + airport.add(planes(fleet_number = flen, name=name, seats=seats)) + + except FileNotFoundError: + pass + +def save_airport(path:Path, airport:airport)->None: + path.parent.mkdir(parents=True, exist_ok=True) + line=(f"colums:pipe-separated rows after the headerline\n f(FILE HEADER)\n") + for s in airport.all(): + seats_txt = ",".join(str(g) for g in s.seats) + line.append(f"(s.fleet_number) | (s.name)|(seats.txt)\n") + with open(path, "w", encoding="utf-8")as f: + f.writelines \ No newline at end of file