Spaces:
Running
Running
| import json | |
| from datetime import datetime | |
| import config | |
| import os # Import os for path handling | |
| # Initialize Nextcloud client | |
| # nc = Nextcloud( | |
| # nextcloud_url=config.NEXTCLOUD_URL, | |
| # nc_auth_user=config.NEXTCLOUD_USERNAME, | |
| # nc_auth_pass=config.NEXTCLOUD_PASSWORD | |
| # ) | |
| NEXTCLOUD_NOTES_PATH = "/gpu_poor_release_notes.json" | |
| LOCAL_CACHE_FILE = "release_notes.json" | |
| def load_release_notes(): | |
| """Load release notes from Nextcloud with local file fallback.""" | |
| nc = config.get_nextcloud_client() # Use the singleton client | |
| try: | |
| # Try to load from Nextcloud | |
| remote_data = nc.files.download(NEXTCLOUD_NOTES_PATH) | |
| if remote_data: | |
| notes = json.loads(remote_data.decode('utf-8')) | |
| # Ensure the directory for the local cache file exists | |
| os.makedirs(os.path.dirname(LOCAL_CACHE_FILE) or '.', exist_ok=True) | |
| # Update local cache | |
| with open(LOCAL_CACHE_FILE, 'w') as f: | |
| json.dump(notes, f, indent=2) | |
| return notes | |
| except Exception as e: | |
| print(f"Could not load release notes from Nextcloud: {e}") | |
| # Try local cache | |
| try: | |
| with open(LOCAL_CACHE_FILE, 'r') as f: | |
| return json.load(f) | |
| except Exception as e: | |
| print(f"Could not load from local cache: {e}") | |
| # Return empty notes if both attempts fail | |
| return { | |
| "last_updated": datetime.now().isoformat(), | |
| "notes": [] | |
| } | |
| def get_release_notes_html(): | |
| """Generate HTML display of release notes.""" | |
| notes_data = load_release_notes() | |
| html = f""" | |
| <style> | |
| .release-notes {{ | |
| font-family: Arial, sans-serif; | |
| max-width: 800px; | |
| margin: 0 auto; | |
| }} | |
| .release-note {{ | |
| background: rgba(255, 255, 255, 0.05); | |
| border-radius: 8px; | |
| padding: 15px; | |
| margin-bottom: 20px; | |
| }} | |
| .note-date {{ | |
| font-size: 0.9em; | |
| color: #888; | |
| margin-bottom: 8px; | |
| }} | |
| .note-content {{ | |
| white-space: pre-wrap; | |
| line-height: 1.6; | |
| }} | |
| .last-updated {{ | |
| font-size: 0.8em; | |
| color: #666; | |
| text-align: right; | |
| margin-top: 20px; | |
| font-style: italic; | |
| }} | |
| </style> | |
| <div class="release-notes"> | |
| """ | |
| # Add notes in reverse chronological order | |
| for note in sorted(notes_data["notes"], key=lambda x: x["date"], reverse=True): | |
| html += f""" | |
| <div class="release-note"> | |
| <div class="note-date">π {note["date"]}</div> | |
| <div class="note-content">{note["content"]}</div> | |
| </div> | |
| """ | |
| html += f""" | |
| <div class="last-updated"> | |
| Last updated: {notes_data["last_updated"].split("T")[0]} | |
| </div> | |
| </div> | |
| """ | |
| return html |