1
0
Files
Programm-Shortcut/data/data_manager.py
2025-09-08 17:19:22 +02:00

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()