Kompletter Rewrite
This commit is contained in:
0
data/__init__.py
Normal file
0
data/__init__.py
Normal file
153
data/data_manager.py
Normal file
153
data/data_manager.py
Normal file
@@ -0,0 +1,153 @@
|
||||
import json
|
||||
import os
|
||||
from typing import List, Dict, Any
|
||||
from models.program import Program
|
||||
from models.category import CategoryManager
|
||||
|
||||
|
||||
class DataManager:
|
||||
def __init__(self, json_file: str = 'data.json'):
|
||||
self.json_file = json_file
|
||||
self.category_manager = CategoryManager()
|
||||
self.programs: List[Program] = []
|
||||
self.options: Dict[str, Any] = self._get_default_options()
|
||||
|
||||
def _get_default_options(self) -> Dict[str, Any]:
|
||||
return {
|
||||
"default_sort_column": None,
|
||||
"default_sort_reverse": False,
|
||||
"remember_last_category": False,
|
||||
"last_category": "Alle",
|
||||
"window_width": 700,
|
||||
"window_height": 550
|
||||
}
|
||||
|
||||
def load_data(self) -> bool:
|
||||
try:
|
||||
# Handle legacy file migration
|
||||
if not os.path.exists(self.json_file) and os.path.exists('program_list.json'):
|
||||
self._migrate_from_legacy_file()
|
||||
return True
|
||||
|
||||
if not os.path.exists(self.json_file):
|
||||
self._create_empty_file()
|
||||
return True
|
||||
|
||||
with open(self.json_file, encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Handle old format without options
|
||||
if "options" not in data:
|
||||
data["options"] = self._get_default_options()
|
||||
|
||||
self._load_from_data(data)
|
||||
return True
|
||||
|
||||
except (FileNotFoundError, json.JSONDecodeError) as e:
|
||||
print(f"Error loading data: {e}")
|
||||
self._create_empty_file()
|
||||
return False
|
||||
|
||||
def _migrate_from_legacy_file(self):
|
||||
with open('program_list.json', encoding='utf-8') as f:
|
||||
old_data = json.load(f)
|
||||
|
||||
if isinstance(old_data, list):
|
||||
# Old format: just a list of programs
|
||||
# Extract categories from programs
|
||||
categories = []
|
||||
for program_data in old_data:
|
||||
if "Kategorie" in program_data and program_data["Kategorie"] not in categories:
|
||||
categories.append(program_data["Kategorie"])
|
||||
|
||||
data = {
|
||||
"categories": categories,
|
||||
"programs": old_data,
|
||||
"options": self._get_default_options()
|
||||
}
|
||||
else:
|
||||
# Newer format but without options
|
||||
old_data["options"] = self._get_default_options()
|
||||
data = old_data
|
||||
|
||||
self._load_from_data(data)
|
||||
self.save_data()
|
||||
|
||||
def _create_empty_file(self):
|
||||
data = {
|
||||
"categories": [],
|
||||
"programs": [],
|
||||
"options": self._get_default_options()
|
||||
}
|
||||
self._load_from_data(data)
|
||||
self.save_data()
|
||||
|
||||
def _load_from_data(self, data: Dict[str, Any]):
|
||||
self.category_manager.load_from_data(data.get("categories", []))
|
||||
self.programs = [Program.from_dict(p) for p in data.get("programs", [])]
|
||||
self.options = data.get("options", self._get_default_options())
|
||||
|
||||
def save_data(self) -> bool:
|
||||
try:
|
||||
data = {
|
||||
"categories": self.category_manager.to_list(),
|
||||
"programs": [p.to_dict() for p in self.programs],
|
||||
"options": self.options
|
||||
}
|
||||
|
||||
with open(self.json_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error saving data: {e}")
|
||||
return False
|
||||
|
||||
def add_program(self, program: Program) -> bool:
|
||||
if program.category and not self.category_manager.has_category(program.category):
|
||||
self.category_manager.add_category(program.category)
|
||||
|
||||
self.programs.append(program)
|
||||
return self.save_data()
|
||||
|
||||
def remove_program(self, program_name: str) -> bool:
|
||||
for i, program in enumerate(self.programs):
|
||||
if program.name.strip() == program_name.strip():
|
||||
del self.programs[i]
|
||||
return self.save_data()
|
||||
return False
|
||||
|
||||
def update_program(self, old_name: str, updated_program: Program) -> bool:
|
||||
for i, program in enumerate(self.programs):
|
||||
if program.name.strip() == old_name.strip():
|
||||
if updated_program.category and not self.category_manager.has_category(updated_program.category):
|
||||
self.category_manager.add_category(updated_program.category)
|
||||
|
||||
self.programs[i] = updated_program
|
||||
return self.save_data()
|
||||
return False
|
||||
|
||||
def get_programs_by_category(self, category: str = None) -> List[Program]:
|
||||
if not category or category == "Alle":
|
||||
return self.programs
|
||||
return [p for p in self.programs if p.category == category]
|
||||
|
||||
def add_category(self, category: str) -> bool:
|
||||
if self.category_manager.add_category(category):
|
||||
return self.save_data()
|
||||
return False
|
||||
|
||||
def remove_category(self, category: str) -> bool:
|
||||
if not self.category_manager.remove_category(category):
|
||||
return False
|
||||
|
||||
# Remove category from all programs
|
||||
for program in self.programs:
|
||||
if program.category == category:
|
||||
program.category = None
|
||||
|
||||
return self.save_data()
|
||||
|
||||
def update_options(self, **kwargs):
|
||||
self.options.update(kwargs)
|
||||
return self.save_data()
|
||||
Reference in New Issue
Block a user