153 lines
5.5 KiB
Python
153 lines
5.5 KiB
Python
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() |