| import json |
| import logging |
| import os |
|
|
| import pandas as pd |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| class DataExistsError(Exception): |
| pass |
|
|
|
|
| class DataNotFoundError(Exception): |
| pass |
|
|
|
|
| |
| class BaseManager: |
| def __init__(self, csv_file): |
| self.csv_file = csv_file |
| self.columns = ["id", "name", "desc", "params"] |
| if not os.path.exists(csv_file): |
| df = pd.DataFrame(columns=self.columns) |
| df.to_csv(self.csv_file, index=False) |
|
|
| def _load_data(self): |
| return pd.read_csv(self.csv_file) |
|
|
| def _save_data(self, df): |
| df.to_csv(self.csv_file, index=False) |
|
|
| def add_item(self, item_id, name, desc, params): |
| df = self._load_data() |
| if item_id in df["id"].values: |
| raise DataExistsError(f"Item ID {item_id} already exists.") |
| new_row = pd.DataFrame( |
| [ |
| { |
| "id": item_id, |
| "name": name, |
| "desc": desc, |
| "params": json.dumps(params, ensure_ascii=False), |
| } |
| ] |
| ) |
| df = pd.concat([df, new_row], ignore_index=True) |
| self._save_data(df) |
|
|
| def delete_item(self, item_id): |
| df = self._load_data() |
| if item_id not in df["id"].values: |
| raise DataNotFoundError(f"Item ID {item_id} not found.") |
| df = df[df["id"] != item_id] |
| self._save_data(df) |
|
|
| def update_item(self, item_id, name=None, desc=None, params=None): |
| df = self._load_data() |
| if item_id not in df["id"].values: |
| raise DataNotFoundError(f"Item ID {item_id} not found.") |
| if name: |
| df.loc[df["id"] == item_id, "name"] = name |
| if desc: |
| df.loc[df["id"] == item_id, "desc"] = desc |
| if params: |
| df.loc[df["id"] == item_id, "params"] = params |
| self._save_data(df) |
|
|
| def get_item(self, item_id): |
| df = self._load_data() |
| if item_id not in df["id"].values: |
| raise DataNotFoundError(f"Item ID {item_id} not found.") |
| item = df[df["id"] == item_id].to_dict("records")[0] |
| item["params"] = json.loads(item["params"]) |
| return item |
|
|
| def list_items(self): |
| df = self._load_data() |
| items = df.to_dict("records") |
| for item in items: |
| item["params"] = json.loads(item["params"]) |
| return items |
|
|
| def find_item_by_name(self, name): |
| df = self._load_data() |
| if name not in df["name"].values: |
| raise DataNotFoundError(f"Name {name} not found.") |
| item = df[df["name"] == name].to_dict("records")[0] |
| item["params"] = json.loads(item["params"]) |
| return item |
|
|
| def find_params_by_name(self, name): |
| try: |
| return self.find_item_by_name(name)["params"] |
| except Exception as e: |
| logger.error(e) |
| return {} |
|
|
| def find_params_by_id(self, id): |
| try: |
| return self.get_item(id)["params"] |
| except Exception as e: |
| logger.error(e) |
| return {} |
|
|
|
|
| |
| if __name__ == "__main__": |
|
|
| class SpeakerManager(BaseManager): |
| def __init__(self, csv_file): |
| super().__init__(csv_file) |
|
|
| manager = SpeakerManager("speakers.test.csv") |
|
|
| try: |
| |
| manager.add_item( |
| 1, "Speaker1", "Description for speaker 1", '{"param1": "value1"}' |
| ) |
| except DataExistsError as e: |
| print(e) |
|
|
| |
| speakers = manager.list_items() |
| print(speakers) |
|
|
| try: |
| |
| speaker = manager.get_item(1) |
| print(speaker) |
| except DataNotFoundError as e: |
| print(e) |
|
|
| try: |
| |
| manager.update_item( |
| 1, name="Updated Speaker1", desc="Updated description for speaker 1" |
| ) |
| except DataNotFoundError as e: |
| print(e) |
|
|
| try: |
| |
| manager.delete_item(1) |
| except DataNotFoundError as e: |
| print(e) |
|
|
| try: |
| |
| speaker_by_name = manager.find_item_by_name("Updated Speaker1") |
| print(speaker_by_name) |
| except DataNotFoundError as e: |
| print(e) |
|
|
| |
| speakers_by_params = manager.find_items_by_params('{"param1": "value1"}') |
| print(speakers_by_params) |
|
|