From b5079bdfdacc73ed4a89d7c3b7cdcb163031fc66 Mon Sep 17 00:00:00 2001 From: Joachim Date: Mon, 10 Mar 2025 18:06:17 +0100 Subject: [PATCH] initial --- .env.template | 2 + .gitignore | 15 + README.WIN.md | 82 +++ README.md | 128 ++++ forgejo_exporter.py | 459 +++++++++++++ forgejo_issues/___placeholder | 1 + forgejo_issues/_metadata.json | 1157 +++++++++++++++++++++++++++++++++ update.bat | 59 ++ update.sh | 61 ++ 9 files changed, 1964 insertions(+) create mode 100644 .env.template create mode 100644 .gitignore create mode 100644 README.WIN.md create mode 100644 README.md create mode 100644 forgejo_exporter.py create mode 100644 forgejo_issues/___placeholder create mode 100644 forgejo_issues/_metadata.json create mode 100644 update.bat create mode 100644 update.sh diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..f57746d --- /dev/null +++ b/.env.template @@ -0,0 +1,2 @@ +FORGEJO_URL = "https://git.rpi-virtuell.de" +FORGEJO_TOKEN = "dein-token" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3be967 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.git/ +.venv/ +__pycache__ +*.pyc +*.pyo +*.pyd +*.pyw +*.pyz +*.pyzw +*.pyc +*.log + + +/forgejo_issues/*.md +.env diff --git a/README.WIN.md b/README.WIN.md new file mode 100644 index 0000000..0e525ca --- /dev/null +++ b/README.WIN.md @@ -0,0 +1,82 @@ +# Einrichtung einer geplanten Aufgabe in Windows für automatische Updates + +Um das Forgejo-to-Markdown Update-Skript regelmäßig automatisch auszuführen, kannst du den Windows Task Scheduler (Aufgabenplanung) verwenden. Hier ist eine Schritt-für-Schritt-Anleitung: + +## Vorbereitung + +1. Speichere die beiden Skripte in einem Ordner deiner Wahl: + - `forgejo_exporter.py` (Python-Skript) + - `update_forgejo.bat` (Batch-Skript) + - `.env` + +2. Stelle sicher, dass Python installiert ist und der `python`-Befehl im Pfad verfügbar ist + +## Erstellen einer geplanten Aufgabe + +1. Öffne die **Aufgabenplanung**: + - Drücke `Win + R`, gib `taskschd.msc` ein und drücke Enter + - Oder suche im Startmenü nach "Aufgabenplanung" + +2. Klicke im rechten Bereich auf **Aufgabe erstellen...** + +3. Im Tab **Allgemein**: + - Gib einen **Namen** ein (z.B. "Forgejo Issues Update") + - Optional: Füge eine Beschreibung hinzu + - Wähle **Mit höchsten Privilegien ausführen** (falls dein Benutzer über Administratorrechte verfügt) + - Wähle unter "Konfigurieren für:" dein Betriebssystem + +4. Im Tab **Trigger**: + - Klicke auf **Neu...** + - Wähle unter "Beginnen" die Option **Nach einem Zeitplan** + - Stelle die Häufigkeit ein (z.B. **Täglich** um 3:00 Uhr) + - Aktiviere **Aktiviert** + - Klicke auf **OK** + +5. Im Tab **Aktionen**: + - Klicke auf **Neu...** + - Aktion: **Programm starten** + - Programm/Skript: Gib den vollständigen Pfad zu `update_forgejo.bat` ein oder klicke auf **Durchsuchen...** um die Datei auszuwählen + - Starten in: Gib den Ordner ein, in dem sich das Skript befindet + - Klicke auf **OK** + +6. Im Tab **Bedingungen**: + - Du kannst hier optionale Einstellungen vornehmen, z.B. nur ausführen, wenn der Computer am Netzwerk angeschlossen ist + +7. Im Tab **Einstellungen**: + - Wähle **Aufgabe so bald wie möglich nach einem verpassten Start ausführen** + - Wähle **Bei Bedarf aufwecken** + - Klicke auf **OK**, um die Aufgabe zu erstellen + +## Testen der geplanten Aufgabe + +1. Finde deine neu erstellte Aufgabe in der Liste +2. Rechtsklick auf die Aufgabe und wähle **Ausführen** +3. Überprüfe, ob die Aufgabe erfolgreich ausgeführt wurde: + - Prüfe das Logfile (`forgejo_update.log`) + - Überprüfe, ob neue Dateien im Ausgabeordner erstellt wurden + +## Fehlerbehebung + +Falls die geplante Aufgabe nicht wie erwartet funktioniert: + +1. **Problem**: Die Aufgabe wird gestartet, aber Python-Fehler treten auf + - **Lösung**: Überprüfe, ob alle erforderlichen Python-Pakete installiert sind (`pip install requests`) + +2. **Problem**: Die Aufgabe wird gar nicht ausgeführt + - **Lösung**: Überprüfe die Ereignisanzeige (Event Viewer) auf Fehler + +3. **Problem**: Das Skript kann nicht auf die Ausgabeordner zugreifen + - **Lösung**: Stelle sicher, dass der Benutzer, unter dem die Aufgabe ausgeführt wird, Schreibrechte für den Zielordner hat + +4. **Problem**: Das Batch-Skript wird nicht gefunden + - **Lösung**: Verwende absolute Pfade im Task Scheduler anstelle von relativen Pfaden + +## Alternative: Ausführen beim Windows-Start + +Wenn du möchtest, dass das Skript bei jedem Windows-Start ausgeführt wird: + +1. Erstelle eine Verknüpfung zu `update_forgejo.bat` +2. Drücke `Win + R`, gib `shell:startup` ein und drücke Enter +3. Kopiere die Verknüpfung in den geöffneten Ordner + +Dies führt das Skript jedes Mal aus, wenn du dich bei Windows anmeldest. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8016df7 --- /dev/null +++ b/README.md @@ -0,0 +1,128 @@ +# Forgejo Issues zu Markdown Export - Anleitung + +Diese Anleitung erklärt, wie du den Forgejo-to-Markdown Exporter einrichten und verwenden kannst, um Issues in Markdown-Dateien zu exportieren und sie für Knowledge-Management-Tools wie MSTY zu nutzen. + +## Überblick + +Der Exporter bietet folgende Funktionen: + +- Export aller Issues eines Repositories oder einer Organisation in Markdown-Dateien +- Inkrementelle Updates (nur geänderte Issues werden aktualisiert) +- Einbeziehung von Kommentaren und Metadaten +- Formatierung als strukturierte Markdown-Dokumente +- Erstellung einer Indexdatei für den einfachen Zugriff + +## Installation + +### Voraussetzungen + +- Python 3.11 oder höher +- Internetverbindung zum Forgejo-Server +- Berechtigungen zum Lesen der Forgejo-Issues + +### Einrichtung + +1. Speichere das Skript +Am besten installierst du den Exporter über den befehl `git clone https://git.rpi-virtuell.de/joachim-happel/git_issue_importer.git` danach wechselst eu in das Verzeichnis mit `cd git_issue_importer` + +2. Kopiere die Datei .env.template nach .env und setze die URl zu deiner forgejo Instanz: + +```text +FORGEJO_URL = "https://git.rpi-virtuell.de" +FORGEJO_TOKEN = "dein-token" +``` +den Token kannst du unter https://git.rpi-virtuell.de/user/settings/applications generieren + +3. Installiere die erforderlichen Abhängigkeiten: + +```bash +pip install requests python-dotenv +``` + + +## Verwendung + +### Grundlegende Verwendung + +Führe das Skript mit den erforderlichen Parametern aus: + +```bash +python forgejo_exporter.py --owner "Comenius-Institut" --repo "FOERBICO" --output "./forgejo_issues" +``` + +### Alle verfügbaren Parameter + +``` +--owner : Repository-Besitzer (Benutzer oder Organisation) [erforderlich] +--repo : Repository-Name oder 'all' für alle Repositories [erforderlich] +--output : Ausgabeordner für Markdown-Dateien [Standard: ./forgejo_issues] +--comments : Kommentare einbeziehen [optional Flag] +--closed : Geschlossene Issues einbeziehen [optional Flag] +``` + +### Beispiele + +**Export eines einzelnen Repositories mit Kommentaren:** +```bash +python forgejo_exporter.py --owner "Comenius-Institut" --repo "FOERBICO" --output "./forgejo_issues" --comments +``` + +**Export aller Repositories einer Organisation inkl. geschlossener Issues:** +```bash +python forgejo_exporter.py --owner "Comenius-Institut" --repo "all" --output "./forgejo_issues" --closed +``` + +**Export mit allen Optionen:** +```bash +python forgejo_exporter.py --owner "Comenius-Institut" --repo "FOERBICO" --output "./forgejo_issues" --comments --closed +``` + +## Automatisierung + +Um die Aktualisierung zu automatisieren, kannst du das bereitgestellte Bash-Skript verwenden: + +1. Speichere das Bash-Skript als `update_forgejo.sh` +2. Mache es ausführbar: `chmod +x update_forgejo.sh` +3. Passe die Einstellungen im Skript an (Repository-Besitzer, Repository-Name) +4. Führe es manuell aus oder richte einen Cron-Job ein + +### Einrichtung eines Cron-Jobs für regelmäßige Updates + +Öffne die Crontab-Konfiguration: +```bash +crontab -e +``` + +Füge eine Zeile für tägliche Aktualisierungen hinzu: +``` +# Aktualisiere Forgejo-Issues jeden Tag um 3:00 Uhr +0 3 * * * /pfad/zu/update_forgejo.sh +``` + +## Ausgabestruktur + +Nach der Ausführung des Skripts enthält der Ausgabeordner folgende Dateien: + +- `index.md`: Eine Übersicht aller Issues, gruppiert nach Repository +- `_metadata.json`: Metadaten für inkrementelle Updates (nicht löschen!) +- Einzelne Markdown-Dateien für jedes Issue, mit dem Namensformat: + `{repository_owner}_{repository_name}__issue_{number}_{title}.md` + +### Struktur einer Issue-Datei + +Jede generierte Markdown-Datei enthält: + +1. **Titel und Issue-ID** +2. **Metadaten** (Repository, Autor, Status, Daten, URL) +3. **Labels** (falls vorhanden) +4. **Milestone** (falls vorhanden) +5. **Beschreibung** des Issues +6. **Kommentare** (wenn mit `--comments` aktiviert) + +## Integration mit Knowledge-Management-Tools + +### Verwendung mit MSTY + +1. Wähle den Ausgabeordner als Knowledge Stack in MSTY +2. Klicke auf Compose (kann einige Minuten dauern) +3. Führe das Update-Skript und Compose regelmäßig aus, um die Wissensdatenbank aktuell zu halten diff --git a/forgejo_exporter.py b/forgejo_exporter.py new file mode 100644 index 0000000..f97c91b --- /dev/null +++ b/forgejo_exporter.py @@ -0,0 +1,459 @@ +import os +import sys +import json +import argparse +import datetime +import requests +import hashlib +from pathlib import Path +from typing import Dict, List, Any, Optional +from dotenv import load_dotenv +load_dotenv() + +# Konfiguration +FORGEJO_URL = os.getenv("FORGEJO_URL", "https://forgejo.de") +API_BASE = f"{FORGEJO_URL}/api/v1" + +# Für die Authentifizierung (falls erforderlich) +TOKEN = os.getenv("FORGEJO_TOKEN") + +class ForgejoMarkdownExporter: + def __init__( + self, + repo_owner: str, + repo_name: str, + output_dir: str, + include_comments: bool = True, + include_closed: bool = True, + fetch_all_repos: bool = False + ): + self.repo_owner = repo_owner + self.repo_name = repo_name + self.output_dir = output_dir + self.include_comments = include_comments + self.include_closed = include_closed + self.fetch_all_repos = fetch_all_repos + self.metadata_file = os.path.join(output_dir, "_metadata.json") + + # Erstelle den Ausgabeordner, falls er nicht existiert + os.makedirs(output_dir, exist_ok=True) + + def get_headers(self) -> Dict[str, str]: + """Gibt die HTTP-Header für die API-Anfragen zurück""" + headers = { + "User-Agent": "ForgejoMarkdownExporter/1.0", + "Accept": "application/json" + } + + # Füge Token hinzu, falls vorhanden + if "TOKEN" in globals() and TOKEN: + headers["Authorization"] = f"token {TOKEN}" + + return headers + + def fetch_repos(self) -> List[Dict[str, Any]]: + """Ruft alle Repositories des angegebenen Besitzers ab""" + if not self.fetch_all_repos: + # Wenn wir nur ein spezifisches Repo wollen + return [{ + "owner": {"username": self.repo_owner}, + "name": self.repo_name, + "full_name": f"{self.repo_owner}/{self.repo_name}" + }] + + repos_url = f"{API_BASE}/orgs/{self.repo_owner}/repos" + try: + response = requests.get(repos_url, headers=self.get_headers()) + response.raise_for_status() + return response.json() + except Exception as e: + print(f"Fehler beim Abrufen der Repositories: {e}") + # Fallback auf ein einzelnes Repo + return [{ + "owner": {"username": self.repo_owner}, + "name": self.repo_name, + "full_name": f"{self.repo_owner}/{self.repo_name}" + }] + + def fetch_issues(self, repo_full_name: str) -> List[Dict[str, Any]]: + """Ruft alle Issues eines Repositories ab""" + issues = [] + page = 1 + per_page = 50 + + while True: + issues_url = f"{API_BASE}/repos/{repo_full_name}/issues?page={page}&per_page={per_page}&state={'all' if self.include_closed else 'open'}" + try: + response = requests.get(issues_url, headers=self.get_headers()) + response.raise_for_status() + page_issues = response.json() + + if not page_issues: + break + + issues.extend(page_issues) + page += 1 + except Exception as e: + print(f"Fehler beim Abrufen der Issues für {repo_full_name}: {e}") + break + + return issues + + def fetch_comments(self, repo_full_name: str, issue_number: int) -> List[Dict[str, Any]]: + """Ruft alle Kommentare zu einem Issue ab""" + if not self.include_comments: + return [] + + comments_url = f"{API_BASE}/repos/{repo_full_name}/issues/{issue_number}/comments" + try: + response = requests.get(comments_url, headers=self.get_headers()) + response.raise_for_status() + return response.json() + except Exception as e: + print(f"Fehler beim Abrufen der Kommentare für Issue #{issue_number}: {e}") + return [] + + def generate_markdown(self, issue: Dict[str, Any], comments: List[Dict[str, Any]], repo_full_name: str) -> str: + """Erstellt Markdown-Inhalt für ein Issue""" + # Basisinformationen + issue_number = issue.get('number', 'unknown') + title = issue.get('title', 'No Title') + state = issue.get('state', 'unknown') + created_at = issue.get('created_at', 'unknown') + updated_at = issue.get('updated_at', 'unknown') + html_url = issue.get('html_url', '') + + # Benutzerinformationen + author = "Unbekannt" + if issue.get('user') and issue['user'].get('username'): + author = issue['user']['username'] + + # Erstelle Markdown-Header + markdown = f"# [{repo_full_name}] Issue #{issue_number}: {title}\n\n" + + # Metadaten-Bereich + markdown += "## Metadaten\n\n" + markdown += f"- **Issue ID:** {issue_number}\n" + markdown += f"- **Repository:** {repo_full_name}\n" + markdown += f"- **Autor:** {author}\n" + markdown += f"- **Status:** {state}\n" + markdown += f"- **Erstellt am:** {created_at}\n" + markdown += f"- **Aktualisiert am:** {updated_at}\n" + markdown += f"- **URL:** {html_url}\n\n" + + # Labels + if issue.get('labels') and len(issue['labels']) > 0: + markdown += "## Labels\n\n" + for label in issue['labels']: + markdown += f"- {label.get('name', 'Unbekanntes Label')}\n" + markdown += "\n" + + # Milestone + if issue.get('milestone'): + milestone = issue['milestone'] + markdown += "## Milestone\n\n" + markdown += f"- **Titel:** {milestone.get('title', 'Kein Titel')}\n" + markdown += f"- **Status:** {milestone.get('state', 'unbekannt')}\n" + + if milestone.get('due_on'): + markdown += f"- **Fälligkeitsdatum:** {milestone.get('due_on')}\n" + + if milestone.get('description'): + markdown += f"\n**Beschreibung:**\n\n{milestone.get('description')}\n\n" + else: + markdown += "\n" + + # Inhalt des Issues + markdown += "## Beschreibung\n\n" + if issue.get('body'): + markdown += f"{issue['body']}\n\n" + else: + markdown += "_Keine Beschreibung vorhanden._\n\n" + + # Kommentare + if comments and len(comments) > 0: + markdown += "## Kommentare\n\n" + for i, comment in enumerate(comments, 1): + user = "Unbekannt" + if comment.get('user') and comment['user'].get('username'): + user = comment['user']['username'] + + created_at = comment.get('created_at', 'Unbekanntes Datum') + body = comment.get('body', 'Kein Inhalt') + + markdown += f"### Kommentar {i} von {user} am {created_at}\n\n" + markdown += f"{body}\n\n" + markdown += "---\n\n" + + return markdown + + def save_issue_to_file(self, issue: Dict[str, Any], repo_full_name: str) -> str: + """Speichert ein Issue als Markdown-Datei und gibt den Dateipfad zurück""" + issue_number = issue.get('number', 'unknown') + title = issue.get('title', 'No Title').replace('/', '-').replace('\\', '-') + + # Erstelle einen sicheren Dateinamen + safe_title = ''.join(c if c.isalnum() or c in [' ', '-', '_'] else '_' for c in title) + filename = f"{repo_full_name.replace('/', '_')}__issue_{issue_number}_{safe_title[:50]}.md" + filepath = os.path.join(self.output_dir, filename) + + # Hole Kommentare + comments = self.fetch_comments(repo_full_name, issue_number) + + # Erstelle Markdown + markdown_content = self.generate_markdown(issue, comments, repo_full_name) + + # Speichere in Datei + with open(filepath, 'w', encoding='utf-8') as f: + f.write(markdown_content) + + print(f"Issue #{issue_number} gespeichert: {filepath}") + return filepath + + def calculate_issue_hash(self, issue: Dict[str, Any], comments: List[Dict[str, Any]]) -> str: + """Berechnet einen Hash für ein Issue und seine Kommentare zur Erkennung von Änderungen""" + # Kombiniere relevante Daten für den Hash + hash_data = { + "issue_id": issue.get('id'), + "title": issue.get('title'), + "body": issue.get('body'), + "state": issue.get('state'), + "updated_at": issue.get('updated_at'), + "comments": [ + { + "id": comment.get('id'), + "body": comment.get('body'), + "updated_at": comment.get('updated_at') + } + for comment in comments + ] + } + + # Erstelle einen JSON-String und hashe ihn + json_str = json.dumps(hash_data, sort_keys=True) + return hashlib.md5(json_str.encode('utf-8')).hexdigest() + + def load_metadata(self) -> Dict[str, Any]: + """Lädt Metadaten aus einer Datei, falls vorhanden""" + if not os.path.exists(self.metadata_file): + return {"issues": {}, "last_update": None} + + try: + with open(self.metadata_file, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + print(f"Fehler beim Laden der Metadaten: {e}") + return {"issues": {}, "last_update": None} + + def save_metadata(self, metadata: Dict[str, Any]): + """Speichert Metadaten in einer Datei""" + try: + with open(self.metadata_file, 'w', encoding='utf-8') as f: + json.dump(metadata, f, indent=2) + except Exception as e: + print(f"Fehler beim Speichern der Metadaten: {e}") + + def export(self) -> int: + """Exportiert alle Issues und gibt die Anzahl der aktualisierten Issues zurück""" + start_time = datetime.datetime.now() + + # Lade vorherige Metadaten + metadata = self.load_metadata() + issue_hashes = metadata.get("issues", {}) + + # Hole Repositories + repos = self.fetch_repos() + + # Zähler für Statistiken + total_issues = 0 + new_issues = 0 + updated_issues = 0 + unchanged_issues = 0 + + # Liste der aktuellen Issue-IDs für Bereinigung + current_issue_ids = [] + + # Verarbeite jedes Repository + for repo in repos: + repo_full_name = repo.get('full_name') + if not repo_full_name: + continue + + print(f"\nVerarbeite Repository: {repo_full_name}") + + # Hole Issues + issues = self.fetch_issues(repo_full_name) + print(f" {len(issues)} Issues gefunden") + + # Verarbeite jedes Issue + for issue in issues: + issue_id = str(issue.get('id', '')) + if not issue_id: + continue + + total_issues += 1 + current_issue_ids.append(issue_id) + + # Hole Kommentare + comments = self.fetch_comments(repo_full_name, issue.get('number', 0)) + + # Berechne Hash zur Erkennung von Änderungen + current_hash = self.calculate_issue_hash(issue, comments) + + # Prüfe, ob sich das Issue geändert hat + if issue_id in issue_hashes and issue_hashes[issue_id]["hash"] == current_hash: + unchanged_issues += 1 + print(f" Issue #{issue.get('number')} unverändert - überspringe") + continue + + # Issue ist neu oder hat sich geändert + filepath = self.save_issue_to_file(issue, repo_full_name) + + # Aktualisiere die Metadaten + if issue_id in issue_hashes: + updated_issues += 1 + else: + new_issues += 1 + + issue_hashes[issue_id] = { + "hash": current_hash, + "number": issue.get('number'), + "repo": repo_full_name, + "title": issue.get('title'), + "file": os.path.basename(filepath), + "updated_at": issue.get('updated_at'), + "state": issue.get('state') + } + + # Entferne gelöschte Issues aus der Metadatendatei + deleted_issues = [] + for issue_id in list(issue_hashes.keys()): + if issue_id not in current_issue_ids: + # Lösche die zugehörige Datei + file_path = os.path.join(self.output_dir, issue_hashes[issue_id].get("file", "")) + if os.path.exists(file_path): + try: + os.remove(file_path) + print(f"Gelöschtes Issue entfernt: {file_path}") + except Exception as e: + print(f"Fehler beim Löschen der Datei {file_path}: {e}") + + deleted_issues.append(issue_id) + del issue_hashes[issue_id] + + # Aktualisiere Metadaten + metadata["issues"] = issue_hashes + metadata["last_update"] = datetime.datetime.now().isoformat() + self.save_metadata(metadata) + + # Statistiken ausgeben + end_time = datetime.datetime.now() + duration = (end_time - start_time).total_seconds() + + print("\n" + "="*50) + print(f"Export abgeschlossen in {duration:.2f} Sekunden") + print(f"Verarbeitete Issues: {total_issues}") + print(f"Neue Issues: {new_issues}") + print(f"Aktualisierte Issues: {updated_issues}") + print(f"Unveränderte Issues: {unchanged_issues}") + print(f"Gelöschte Issues: {len(deleted_issues)}") + print("="*50) + + # Erstelle eine index.md mit Zusammenfassung + self.create_index_file(total_issues, new_issues, updated_issues, deleted_issues) + + return new_issues + updated_issues + + def create_index_file(self, total: int, new: int, updated: int, deleted: List[str]): + """Erstellt eine Index-Datei mit einer Übersicht aller Issues""" + index_path = os.path.join(self.output_dir, "index.md") + + # Lade Metadaten + metadata = self.load_metadata() + issues = metadata.get("issues", {}) + last_update = metadata.get("last_update", "Unbekannt") + + try: + with open(index_path, 'w', encoding='utf-8') as f: + f.write(f"# Forgejo Issues Übersicht\n\n") + f.write(f"Letzte Aktualisierung: {last_update}\n\n") + + # Statistiken + f.write("## Statistiken\n\n") + f.write(f"- **Gesamtzahl der Issues:** {total}\n") + f.write(f"- **Neue Issues bei letzter Aktualisierung:** {new}\n") + f.write(f"- **Aktualisierte Issues bei letzter Aktualisierung:** {updated}\n") + f.write(f"- **Gelöschte Issues bei letzter Aktualisierung:** {len(deleted)}\n\n") + + # Gruppiere nach Repository + repos = {} + for issue_id, issue_data in issues.items(): + repo = issue_data.get("repo", "Unbekannt") + if repo not in repos: + repos[repo] = [] + repos[repo].append(issue_data) + + # Sortiere Issues nach Nummer innerhalb jedes Repos + for repo in repos: + repos[repo].sort(key=lambda x: x.get("number", 0)) + + # Liste alle Issues nach Repository gruppiert auf + f.write("## Issues nach Repository\n\n") + + for repo, repo_issues in sorted(repos.items()): + f.write(f"### {repo}\n\n") + + # Offene Issues + open_issues = [i for i in repo_issues if i.get("state") == "open"] + if open_issues: + f.write("#### Offene Issues\n\n") + for issue in open_issues: + number = issue.get("number", "?") + title = issue.get("title", "Kein Titel") + file = issue.get("file", "") + f.write(f"- [#{number}: {title}]({file})\n") + f.write("\n") + + # Geschlossene Issues + closed_issues = [i for i in repo_issues if i.get("state") == "closed"] + if closed_issues: + f.write("#### Geschlossene Issues\n\n") + for issue in closed_issues: + number = issue.get("number", "?") + title = issue.get("title", "Kein Titel") + file = issue.get("file", "") + f.write(f"- [#{number}: {title}]({file})\n") + f.write("\n") + + f.write("\n") + + print(f"Index-Datei erstellt: {index_path}") + + except Exception as e: + print(f"Fehler beim Erstellen der Index-Datei: {e}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Exportiert Forgejo-Issues in Markdown-Dateien") + parser.add_argument("--owner", required=True, help="Repository-Besitzer (Benutzer oder Organisation)") + parser.add_argument("--repo", required=True, help="Repository-Name oder 'all' für alle Repositories") + parser.add_argument("--output", default="./forgejo_issues", help="Ausgabeordner für Markdown-Dateien") + parser.add_argument("--comments", action="store_true", help="Kommentare einbeziehen") + parser.add_argument("--closed", action="store_true", help="Geschlossene Issues einbeziehen") + + args = parser.parse_args() + + fetch_all = args.repo.lower() == "all" + repo_name = "" if fetch_all else args.repo + + exporter = ForgejoMarkdownExporter( + repo_owner=args.owner, + repo_name=repo_name, + output_dir=args.output, + include_comments=args.comments, + include_closed=args.closed, + fetch_all_repos=fetch_all + ) + + num_updated = exporter.export() + print(f"\nErgebnis: {num_updated} Issues wurden aktualisiert oder neu hinzugefügt.") \ No newline at end of file diff --git a/forgejo_issues/___placeholder b/forgejo_issues/___placeholder new file mode 100644 index 0000000..945c9b4 --- /dev/null +++ b/forgejo_issues/___placeholder @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/forgejo_issues/_metadata.json b/forgejo_issues/_metadata.json new file mode 100644 index 0000000..db00618 --- /dev/null +++ b/forgejo_issues/_metadata.json @@ -0,0 +1,1157 @@ +{ + "issues": { + "700": { + "hash": "2f2da386644d899545bc77e12b66f27c", + "number": 300, + "repo": "Comenius-Institut/FOERBICO", + "title": "Korrekturen f\u00fcr den Artikel \"OER meets Fachdidaktik\"", + "file": "Comenius-Institut_FOERBICO__issue_300_Korrekturen f\u00fcr den Artikel _OER meets Fachdidakti.md", + "updated_at": "2025-03-10T16:13:07Z", + "state": "open" + }, + "695": { + "hash": "6fbb75ba1b2540b2724a61f70cbf643e", + "number": 298, + "repo": "Comenius-Institut/FOERBICO", + "title": "Online-Fortbildungsreihe zu OER in der Hochschullehre f\u00fcr Theologie & Religionsp\u00e4dagogik", + "file": "Comenius-Institut_FOERBICO__issue_298_Online-Fortbildungsreihe zu OER in der Hochschulle.md", + "updated_at": "2025-03-07T15:53:38Z", + "state": "open" + }, + "694": { + "hash": "86a5457c9bcd1fe95f71efe54dec611e", + "number": 297, + "repo": "Comenius-Institut/FOERBICO", + "title": "Ergebnisse der Teilnehmenden Beobachtung", + "file": "Comenius-Institut_FOERBICO__issue_297_Ergebnisse der Teilnehmenden Beobachtung.md", + "updated_at": "2025-03-07T15:53:38Z", + "state": "open" + }, + "692": { + "hash": "f397ef023f5d6b0a7bca6131f763ad8e", + "number": 295, + "repo": "Comenius-Institut/FOERBICO", + "title": "Fortbildungen innerhalb der Communities besuchen und teilnehmend beobachten.", + "file": "Comenius-Institut_FOERBICO__issue_295_Fortbildungen innerhalb der Communities besuchen u.md", + "updated_at": "2025-03-07T15:49:35Z", + "state": "open" + }, + "690": { + "hash": "b70e8c1a21149c908cb7b49b0a00f121", + "number": 293, + "repo": "Comenius-Institut/FOERBICO", + "title": "ALPIKA Wuppertal 17.-19.09. 2025 Leitendentagung", + "file": "Comenius-Institut_FOERBICO__issue_293_ALPIKA Wuppertal 17_-19_09_ 2025 Leitendentagung.md", + "updated_at": "2025-03-07T13:42:04Z", + "state": "open" + }, + "689": { + "hash": "7b9fadd15aa0b780ef13dbfcc2bfb7d8", + "number": 292, + "repo": "Comenius-Institut/FOERBICO", + "title": "Fortbildungen im reliLab", + "file": "Comenius-Institut_FOERBICO__issue_292_Fortbildungen im reliLab.md", + "updated_at": "2025-03-07T14:55:18Z", + "state": "open" + }, + "688": { + "hash": "d1f91c9494abcf54ce769570c0f75f4b", + "number": 291, + "repo": "Comenius-Institut/FOERBICO", + "title": "Klassische Fortbildungsschiene", + "file": "Comenius-Institut_FOERBICO__issue_291_Klassische Fortbildungsschiene.md", + "updated_at": "2025-03-07T14:55:30Z", + "state": "open" + }, + "687": { + "hash": "274363505d29dd6bc555be8236805912", + "number": 290, + "repo": "Comenius-Institut/FOERBICO", + "title": "Werkstatt Schiene", + "file": "Comenius-Institut_FOERBICO__issue_290_Werkstatt Schiene.md", + "updated_at": "2025-03-07T14:55:38Z", + "state": "open" + }, + "686": { + "hash": "490453a8e392e2944894558873556142", + "number": 289, + "repo": "Comenius-Institut/FOERBICO", + "title": "Caf\u00e8 Schiene", + "file": "Comenius-Institut_FOERBICO__issue_289_Caf\u00e8 Schiene.md", + "updated_at": "2025-03-07T14:55:47Z", + "state": "open" + }, + "685": { + "hash": "dcbf82e7d7c2059ed3f9175d802c499e", + "number": 288, + "repo": "Comenius-Institut/FOERBICO", + "title": "AG Redaktionsnetzwerke WLO", + "file": "Comenius-Institut_FOERBICO__issue_288_AG Redaktionsnetzwerke WLO.md", + "updated_at": "2025-03-06T16:03:41Z", + "state": "open" + }, + "683": { + "hash": "911b1c861b8ce16e410227afaccfc6c3", + "number": 287, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Workflow / Dokumentation f\u00fcr die Erstellung von Blogartikeln", + "file": "Comenius-Institut_FOERBICO__issue_287_Webseite_ Workflow - Dokumentation f\u00fcr die Erstell.md", + "updated_at": "2025-03-05T11:08:26Z", + "state": "open" + }, + "682": { + "hash": "e0d4c0008641c8c6c176a711748aec16", + "number": 286, + "repo": "Comenius-Institut/FOERBICO", + "title": "mit \"nostr\" experimentieren", + "file": "Comenius-Institut_FOERBICO__issue_286_mit _nostr_ experimentieren.md", + "updated_at": "2025-03-04T16:04:42Z", + "state": "open" + }, + "675": { + "hash": "75e5c81eb037edde1df637db26a9255e", + "number": 280, + "repo": "Comenius-Institut/FOERBICO", + "title": "3. Juni 2025 1. Demo-Tag des Projekts MOERFI - Demo-Tage und Mapping von (OER-f\u00f6rderlichen) BildungsInfrastrukturen", + "file": "Comenius-Institut_FOERBICO__issue_280_3_ Juni 2025 1_ Demo-Tag des Projekts MOERFI - Dem.md", + "updated_at": "2025-03-04T07:43:46Z", + "state": "open" + }, + "671": { + "hash": "6c27dbe4a48ab96fd5824e99aeb56901", + "number": 278, + "repo": "Comenius-Institut/FOERBICO", + "title": "add-new-teamphotos", + "file": "Comenius-Institut_FOERBICO__issue_278_add-new-teamphotos.md", + "updated_at": "2025-03-10T09:56:04Z", + "state": "open" + }, + "670": { + "hash": "84fb9ca8a27018e480008c1182b44468", + "number": 277, + "repo": "Comenius-Institut/FOERBICO", + "title": "Wie definieren wir OEP? (OE_COM Projekte Arbeitspapier)", + "file": "Comenius-Institut_FOERBICO__issue_277_Wie definieren wir OEP_ _OE_COM Projekte Arbeitspa.md", + "updated_at": "2025-03-06T20:55:10Z", + "state": "open" + }, + "669": { + "hash": "9229f99f66f706e7cd234f14e40aec55", + "number": 276, + "repo": "Comenius-Institut/FOERBICO", + "title": "Konsultation Community Hub", + "file": "Comenius-Institut_FOERBICO__issue_276_Konsultation Community Hub.md", + "updated_at": "2025-03-06T05:28:00Z", + "state": "open" + }, + "668": { + "hash": "4d8b244a22a5eb1f2cf2107623fb86cd", + "number": 275, + "repo": "Comenius-Institut/FOERBICO", + "title": "Blogpost KI im Religionsunterricht", + "file": "Comenius-Institut_FOERBICO__issue_275_Blogpost KI im Religionsunterricht.md", + "updated_at": "2025-03-04T08:12:23Z", + "state": "open" + }, + "662": { + "hash": "8b105a1dd1b13f578ff320a9722aae19", + "number": 273, + "repo": "Comenius-Institut/FOERBICO", + "title": "Analyse bestehender Fortbildungsformate", + "file": "Comenius-Institut_FOERBICO__issue_273_Analyse bestehender Fortbildungsformate.md", + "updated_at": "2025-03-07T15:04:02Z", + "state": "open" + }, + "660": { + "hash": "0a9cc5d7b8b14172b0a83dbd5dda6b5b", + "number": 271, + "repo": "Comenius-Institut/FOERBICO", + "title": "Anfrage twillo OER-Rechtsfragen", + "file": "Comenius-Institut_FOERBICO__issue_271_Anfrage twillo OER-Rechtsfragen.md", + "updated_at": "2025-02-25T16:10:43Z", + "state": "open" + }, + "658": { + "hash": "67fdfcfc2236794f51e1dee2b8fc49b9", + "number": 269, + "repo": "Comenius-Institut/FOERBICO", + "title": "Call for Ideas HackathOERn in G\u00f6ttingen - Deadline 23. M\u00e4rz 2025", + "file": "Comenius-Institut_FOERBICO__issue_269_Call for Ideas HackathOERn in G\u00f6ttingen - Deadline.md", + "updated_at": "2025-02-21T15:06:51Z", + "state": "open" + }, + "651": { + "hash": "433f9cef4859de050ff1b44d42615a1d", + "number": 267, + "repo": "Comenius-Institut/FOERBICO", + "title": "Pr\u00e4sentation der Ergebnisse der abschlie\u00dfenden summativen Evaluation (=> AP 11)", + "file": "Comenius-Institut_FOERBICO__issue_267_Pr\u00e4sentation der Ergebnisse der abschlie\u00dfenden sum.md", + "updated_at": "2025-02-18T10:13:12Z", + "state": "open" + }, + "650": { + "hash": "9d165568281268e59395e0db52435f7f", + "number": 266, + "repo": "Comenius-Institut/FOERBICO", + "title": "Reflexion der Erfahrungen mehrdimensional verschr\u00e4nkter OER-Prinzipien (=> AP 8), die im religionsbezogenen Bereich entwickelt werden (=>AP 7)", + "file": "Comenius-Institut_FOERBICO__issue_266_Reflexion der Erfahrungen mehrdimensional verschr\u00e4.md", + "updated_at": "2025-02-18T10:12:28Z", + "state": "open" + }, + "649": { + "hash": "461b6ad0c4449f486aa4d9b5376bab03", + "number": 265, + "repo": "Comenius-Institut/FOERBICO", + "title": "Ergebnisse der Begleitforschung und der Projekterfahrung in der Community of Communities werden pr\u00e4sentiert", + "file": "Comenius-Institut_FOERBICO__issue_265_Ergebnisse der Begleitforschung und der Projekterf.md", + "updated_at": "2025-02-18T10:10:01Z", + "state": "open" + }, + "648": { + "hash": "343c63ee9c3b66d80ef406881c29837b", + "number": 264, + "repo": "Comenius-Institut/FOERBICO", + "title": "Diskussion der mehrdimensional verschr\u00e4nkten OER-Prinzipien, die im religionsbezogenen Bereich entwickelt werden (=> AP 7), zur Diskussion", + "file": "Comenius-Institut_FOERBICO__issue_264_Diskussion der mehrdimensional verschr\u00e4nkten OER-P.md", + "updated_at": "2025-02-18T10:08:46Z", + "state": "open" + }, + "647": { + "hash": "40126ef02581928dbfa5850ce7a76582", + "number": 263, + "repo": "Comenius-Institut/FOERBICO", + "title": "Forschungsbericht: Auswertung des DBR-Prozesses (vgl. AP-7)", + "file": "Comenius-Institut_FOERBICO__issue_263_Forschungsbericht_ Auswertung des DBR-Prozesses _v.md", + "updated_at": "2025-02-18T10:04:40Z", + "state": "open" + }, + "646": { + "hash": "ea2fbc81636af32b3168e540b18fde7f", + "number": 262, + "repo": "Comenius-Institut/FOERBICO", + "title": "wissenschaftliche Grundlegung (1) Planung, Konzeption, Implementation, Nutzung, Verbreitung von Bildungsmedien in der F\u00e4chergruppe Religion / Ethik; (2) Bildungsmedien in der religionsbezogenen Bildung", + "file": "Comenius-Institut_FOERBICO__issue_262_wissenschaftliche Grundlegung _1_ Planung_ Konzept.md", + "updated_at": "2025-02-18T10:03:53Z", + "state": "open" + }, + "645": { + "hash": "86c0520f25f2654ae526542677b80c54", + "number": 261, + "repo": "Comenius-Institut/FOERBICO", + "title": "Projektbegleitend gef\u00fchrter Blog (beginnend ab Monat 3) dient als Basis f\u00fcr abschlie\u00dfenden Outcomes zur Nachnutzung", + "file": "Comenius-Institut_FOERBICO__issue_261_Projektbegleitend gef\u00fchrter Blog _beginnend ab Mon.md", + "updated_at": "2025-02-18T10:01:11Z", + "state": "open" + }, + "644": { + "hash": "b6143be1f51d927cb0d01c8d85abfc1d", + "number": 260, + "repo": "Comenius-Institut/FOERBICO", + "title": "Anforderungs- und Bedarfsmanagement: Verkn\u00fcpfung hin zu OER/OEP-Communities und -Standards", + "file": "Comenius-Institut_FOERBICO__issue_260_Anforderungs- und Bedarfsmanagement_ Verkn\u00fcpfung h.md", + "updated_at": "2025-02-18T09:50:09Z", + "state": "open" + }, + "643": { + "hash": "7156e76a21721395bd833ff1ab3033ff", + "number": 259, + "repo": "Comenius-Institut/FOERBICO", + "title": "Die wissenschaftlichen Open-Access-Angebote aus der Fachgruppe (z.B.: WiReLex, theo-web, rpb, oerf, religion-unterrichten) werden kontaktiert und in die OER/OEP-Strategieentwicklung eingebunden", + "file": "Comenius-Institut_FOERBICO__issue_259_Die wissenschaftlichen Open-Access-Angebote aus de.md", + "updated_at": "2025-02-18T09:56:11Z", + "state": "open" + }, + "642": { + "hash": "7390202dd69cecd69bb989c9419df811", + "number": 258, + "repo": "Comenius-Institut/FOERBICO", + "title": "Etablierung eines Incubator-Gef\u00fchls (Ryder et al. 2020)", + "file": "Comenius-Institut_FOERBICO__issue_258_Etablierung eines Incubator-Gef\u00fchls _Ryder et al_ .md", + "updated_at": "2025-02-18T09:47:03Z", + "state": "open" + }, + "641": { + "hash": "d163fd5d9e26fa27e22f24b3af7e0b6a", + "number": 257, + "repo": "Comenius-Institut/FOERBICO", + "title": "ggf. Bereitstellung von Mitteln f\u00fcr die Teilnahme an Workshops; Unterst\u00fctzung bei Einwerbung von Mitteln f\u00fcr die Projekte", + "file": "Comenius-Institut_FOERBICO__issue_257_ggf_ Bereitstellung von Mitteln f\u00fcr die Teilnahme .md", + "updated_at": "2025-02-18T09:46:19Z", + "state": "open" + }, + "640": { + "hash": "e4ab8a9d62fef401e34700875fcd2f78", + "number": 256, + "repo": "Comenius-Institut/FOERBICO", + "title": "Unterst\u00fctzung f\u00fcr die Qualifikation und Implementierung der Projekte in die religionsp\u00e4dagogischen OER-Plattformen", + "file": "Comenius-Institut_FOERBICO__issue_256_Unterst\u00fctzung f\u00fcr die Qualifikation und Implementi.md", + "updated_at": "2025-02-18T09:45:44Z", + "state": "open" + }, + "639": { + "hash": "ecd590f6362b299b79760c5900dc758f", + "number": 255, + "repo": "Comenius-Institut/FOERBICO", + "title": "Support der vorhandenen und entstehenden Projekte in kleinen Gruppen sowie individuell", + "file": "Comenius-Institut_FOERBICO__issue_255_Support der vorhandenen und entstehenden Projekte .md", + "updated_at": "2025-02-18T09:45:03Z", + "state": "open" + }, + "638": { + "hash": "2e167d466dabc9fb83ebee5a0636d15b", + "number": 254, + "repo": "Comenius-Institut/FOERBICO", + "title": "Identifizierung + Gewinnung von universit\u00e4ren und hochschulischen Projekten, die bei ihrer Einbindung in OER-Strukturen (Zug\u00e4nglichkeit, Nachnutzung) begleitet werden", + "file": "Comenius-Institut_FOERBICO__issue_254_Identifizierung _ Gewinnung von universit\u00e4ren und .md", + "updated_at": "2025-02-18T09:44:25Z", + "state": "open" + }, + "637": { + "hash": "2fa746406117800c671f88726275dcbd", + "number": 253, + "repo": "Comenius-Institut/FOERBICO", + "title": "Einbindung von Personen und Akteuren in die Community of Communities", + "file": "Comenius-Institut_FOERBICO__issue_253_Einbindung von Personen und Akteuren in die Commun.md", + "updated_at": "2025-02-18T09:42:48Z", + "state": "open" + }, + "636": { + "hash": "259e7b4af34c1d8bc323dcc483367a0d", + "number": 252, + "repo": "Comenius-Institut/FOERBICO", + "title": "Wissenschaftlich-religionsp\u00e4dagogische OER/OEP-Akteure zu einer \u00f6kumenisch-interreligi\u00f6sen Assoziierten Arbeitsgruppe OER/OEP verbinden", + "file": "Comenius-Institut_FOERBICO__issue_252_Wissenschaftlich-religionsp\u00e4dagogische OER-OEP-Akt.md", + "updated_at": "2025-02-18T09:42:12Z", + "state": "open" + }, + "635": { + "hash": "c559e85a34a521b6dafc37238de5570b", + "number": 251, + "repo": "Comenius-Institut/FOERBICO", + "title": "Gewinnen von Projekten und Personen f\u00fcr Netzwerkarbeit innerhalb der gesamten Community (auch phasenvernetzend)", + "file": "Comenius-Institut_FOERBICO__issue_251_Gewinnen von Projekten und Personen f\u00fcr Netzwerkar.md", + "updated_at": "2025-03-10T16:50:46Z", + "state": "open" + }, + "634": { + "hash": "212e2cd4e070a9ba9a29354eba5faabc", + "number": 250, + "repo": "Comenius-Institut/FOERBICO", + "title": "Evaluation der Erfahrungen, Konzeption des weiteren Vorgehens", + "file": "Comenius-Institut_FOERBICO__issue_250_Evaluation der Erfahrungen_ Konzeption des weitere.md", + "updated_at": "2025-03-07T15:50:08Z", + "state": "open" + }, + "633": { + "hash": "176b810203b6550554a352c2337976e9", + "number": 249, + "repo": "Comenius-Institut/FOERBICO", + "title": "Identifikation von Problemstellungen und L\u00f6sungsans\u00e4tzen", + "file": "Comenius-Institut_FOERBICO__issue_249_Identifikation von Problemstellungen und L\u00f6sungsan.md", + "updated_at": "2025-02-18T09:39:28Z", + "state": "open" + }, + "632": { + "hash": "325d29887525a4e76c42283242564f33", + "number": 248, + "repo": "Comenius-Institut/FOERBICO", + "title": "Erprobung des Prozesses der Implementierung von bestehenden Projekten in die religionsp\u00e4dagogischen OER-Strukturen entlang der im Projekt erschlossenen Standards", + "file": "Comenius-Institut_FOERBICO__issue_248_Erprobung des Prozesses der Implementierung von be.md", + "updated_at": "2025-02-18T09:37:14Z", + "state": "open" + }, + "631": { + "hash": "df773b6dd1898c2ccddea0f731835988", + "number": 247, + "repo": "Comenius-Institut/FOERBICO", + "title": "Support des entstehenden Netzwerkes durch Unterst\u00fctzung in Qualifikationen, bspw. durch Angebote von Studium Digitale, Goethe Universit\u00e4t, mit Schwerpunkt OER; durch zielgenauen Zugriff auf das HowTo von OERinfo etc.", + "file": "Comenius-Institut_FOERBICO__issue_247_Support des entstehenden Netzwerkes durch Unterst\u00fc.md", + "updated_at": "2025-03-06T21:50:05Z", + "state": "open" + }, + "630": { + "hash": "b87fba5a9a290400df94ddcf17455005", + "number": 246, + "repo": "Comenius-Institut/FOERBICO", + "title": "Definieren von konkreten Angebots- und Unterst\u00fctzungsstrukturen f\u00fcr das Netzwerk", + "file": "Comenius-Institut_FOERBICO__issue_246_Definieren von konkreten Angebots- und Unterst\u00fctzu.md", + "updated_at": "2025-03-06T20:49:17Z", + "state": "open" + }, + "629": { + "hash": "65eb83775d6ff4c9ea652d8fbbd0e8e4", + "number": 245, + "repo": "Comenius-Institut/FOERBICO", + "title": "Identifikation von interessierten, hochschulisch arbeitenden Akteur:innen und Projekten, aus deren Bedarf und Dialog heraus Identifikation von Themen und Aspekten f\u00fcr Qualifizierung und Wissenstransfer", + "file": "Comenius-Institut_FOERBICO__issue_245_Identifikation von interessierten_ hochschulisch a.md", + "updated_at": "2025-02-18T09:34:09Z", + "state": "open" + }, + "628": { + "hash": "a633fbd37fb915fb297da2a6f58889f4", + "number": 244, + "repo": "Comenius-Institut/FOERBICO", + "title": "Beteiligung an den Tagungen und Austauschformaten im Rahmen von FOERBICO", + "file": "Comenius-Institut_FOERBICO__issue_244_Beteiligung an den Tagungen und Austauschformaten .md", + "updated_at": "2025-02-18T09:33:36Z", + "state": "open" + }, + "627": { + "hash": "c0e8e388b5305752bfb6147e4cb8bee3", + "number": 243, + "repo": "Comenius-Institut/FOERBICO", + "title": "Teilnahme an Tagungen", + "file": "Comenius-Institut_FOERBICO__issue_243_Teilnahme an Tagungen.md", + "updated_at": "2025-03-06T21:46:49Z", + "state": "open" + }, + "626": { + "hash": "71e0407f0fbe9be254e65b565e6ac875", + "number": 242, + "repo": "Comenius-Institut/FOERBICO", + "title": "Kontakt zu den wissenschaftlich-religionsp\u00e4dagogischen Communities (AKRK/GWR)", + "file": "Comenius-Institut_FOERBICO__issue_242_Kontakt zu den wissenschaftlich-religionsp\u00e4dagogis.md", + "updated_at": "2025-03-06T22:00:59Z", + "state": "open" + }, + "625": { + "hash": "41ffc8db2dcec495af8eae91095083d1", + "number": 241, + "repo": "Comenius-Institut/FOERBICO", + "title": "Vorbereitung von Materialien und Andock-Punkten f\u00fcr die Brokert\u00e4tigkeit, Etablierung eines Projektblogs", + "file": "Comenius-Institut_FOERBICO__issue_241_Vorbereitung von Materialien und Andock-Punkten f\u00fc.md", + "updated_at": "2025-02-18T09:31:20Z", + "state": "open" + }, + "624": { + "hash": "48a844c277b74edbc71938dec3096aef", + "number": 240, + "repo": "Comenius-Institut/FOERBICO", + "title": "Dokumentation des DBR-Prozesses, d.h. der Analyse bestehender Standards (Prozesse und Materialien), der Qualit\u00e4tsformate und -praktiken in den Communities sowie des evaluativen Prozesses", + "file": "Comenius-Institut_FOERBICO__issue_240_Dokumentation des DBR-Prozesses_ d_h_ der Analyse .md", + "updated_at": "2025-02-18T09:28:15Z", + "state": "open" + }, + "623": { + "hash": "d22734df10b0606fcc65d4adbfaa5640", + "number": 239, + "repo": "Comenius-Institut/FOERBICO", + "title": "Einbezug der M\u00f6glichkeit eines Pr\u00fcf-Aspekts als \u201canerkanntes Lehrmittel\u201d", + "file": "Comenius-Institut_FOERBICO__issue_239_Einbezug der M\u00f6glichkeit eines Pr\u00fcf-Aspekts als _a.md", + "updated_at": "2025-02-18T09:25:24Z", + "state": "open" + }, + "622": { + "hash": "5d782f0afd2b11177b85c087af9dd6de", + "number": 238, + "repo": "Comenius-Institut/FOERBICO", + "title": "Pr\u00fcfung der Bedeutung und ggf. Implementierung von Rating Tools in den Qualit\u00e4tssicherungsprozess der OER", + "file": "Comenius-Institut_FOERBICO__issue_238_Pr\u00fcfung der Bedeutung und ggf_ Implementierung von.md", + "updated_at": "2025-02-18T09:24:21Z", + "state": "open" + }, + "621": { + "hash": "5cc6fdc18bfb4d967dfdab41a2a39541", + "number": 237, + "repo": "Comenius-Institut/FOERBICO", + "title": "Evaluation des Prozesses und weitere Adaption der Standards", + "file": "Comenius-Institut_FOERBICO__issue_237_Evaluation des Prozesses und weitere Adaption der .md", + "updated_at": "2025-02-18T09:21:50Z", + "state": "open" + }, + "620": { + "hash": "7253d957ecc17ae61cc34682ae1240f8", + "number": 236, + "repo": "Comenius-Institut/FOERBICO", + "title": "Anwendung der Standards und Implementierung in die OER-Communities sowie in weitere universit\u00e4re Projekte", + "file": "Comenius-Institut_FOERBICO__issue_236_Anwendung der Standards und Implementierung in die.md", + "updated_at": "2025-02-18T09:21:20Z", + "state": "open" + }, + "619": { + "hash": "778b0268225cad38517d1e3eae690ddc", + "number": 235, + "repo": "Comenius-Institut/FOERBICO", + "title": "Vorstellung des 1. Zyklus auf der Zwischenfazit-Tagung (Jan 2026)", + "file": "Comenius-Institut_FOERBICO__issue_235_Vorstellung des 1_ Zyklus auf der Zwischenfazit-Ta.md", + "updated_at": "2025-02-18T09:18:44Z", + "state": "open" + }, + "618": { + "hash": "181622cbff736bb276826679c633e9f0", + "number": 234, + "repo": "Comenius-Institut/FOERBICO", + "title": "Evaluation des Prozesses und Adaption der Standards", + "file": "Comenius-Institut_FOERBICO__issue_234_Evaluation des Prozesses und Adaption der Standard.md", + "updated_at": "2025-02-18T09:18:05Z", + "state": "open" + }, + "617": { + "hash": "fc51b1fcf57634331821135b9a12c873", + "number": 233, + "repo": "Comenius-Institut/FOERBICO", + "title": "Qualit\u00e4tsentwicklung von Fortbildungen (aus dem Forschungsprozess FAU heraus)", + "file": "Comenius-Institut_FOERBICO__issue_233_Qualit\u00e4tsentwicklung von Fortbildungen _aus dem Fo.md", + "updated_at": "2025-02-18T09:16:03Z", + "state": "open" + }, + "616": { + "hash": "46b274905a2351bf6d40f88ea663f912", + "number": 232, + "repo": "Comenius-Institut/FOERBICO", + "title": "Anwendung der Standards und ihrer Implementierung in narrt, relilab, ALPIKA", + "file": "Comenius-Institut_FOERBICO__issue_232_Anwendung der Standards und ihrer Implementierung .md", + "updated_at": "2025-02-18T09:16:23Z", + "state": "open" + }, + "615": { + "hash": "5cb2180730b33d484e94ecd5e61bd63b", + "number": 231, + "repo": "Comenius-Institut/FOERBICO", + "title": "Anwendung der Standards und ihrer Implementierung in die Projekte der Goethe-Universit\u00e4t und der FAU", + "file": "Comenius-Institut_FOERBICO__issue_231_Anwendung der Standards und ihrer Implementierung .md", + "updated_at": "2025-02-18T09:13:14Z", + "state": "open" + }, + "612": { + "hash": "088f3a2323b946f043c00eb53b8f1967", + "number": 228, + "repo": "Comenius-Institut/FOERBICO", + "title": "Erhebung von Qualit\u00e4tssicherungsprozessen und -standards in OER-Communities", + "file": "Comenius-Institut_FOERBICO__issue_228_Erhebung von Qualit\u00e4tssicherungsprozessen und -sta.md", + "updated_at": "2025-03-07T15:22:33Z", + "state": "open" + }, + "611": { + "hash": "fcdbac0c22a75de8d567e3a712cff71e", + "number": 227, + "repo": "Comenius-Institut/FOERBICO", + "title": "Einarbeitung in die Datenlage OER/OEP-Communities und Literatur", + "file": "Comenius-Institut_FOERBICO__issue_227_Einarbeitung in die Datenlage OER-OEP-Communities .md", + "updated_at": "2025-03-07T15:24:47Z", + "state": "open" + }, + "607": { + "hash": "00c4a075deeb27002907ff1ae39c3360", + "number": 225, + "repo": "Comenius-Institut/FOERBICO", + "title": "moreBNE Camp 8.4.2025 - Universit\u00e4t Passau", + "file": "Comenius-Institut_FOERBICO__issue_225_moreBNE Camp 8_4_2025 - Universit\u00e4t Passau.md", + "updated_at": "2025-02-17T09:34:46Z", + "state": "open" + }, + "606": { + "hash": "2fa342430ac2a09bc5aaf690432556be", + "number": 224, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Design, Aussehen, \"corporate identity\"", + "file": "Comenius-Institut_FOERBICO__issue_224_Webseite_ Design_ Aussehen_ _corporate identity_.md", + "updated_at": "2025-02-12T10:36:46Z", + "state": "open" + }, + "605": { + "hash": "ccab49eb326ba4c3a2b8be3b059f5e29", + "number": 223, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Nutzerf\u00fchrung, Men\u00fcleiste, Header, Footer", + "file": "Comenius-Institut_FOERBICO__issue_223_Webseite_ Nutzerf\u00fchrung_ Men\u00fcleiste_ Header_ Foote.md", + "updated_at": "2025-02-12T10:36:46Z", + "state": "open" + }, + "604": { + "hash": "8c2276058b81dad63c890ced0fc4b0bd", + "number": 222, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Feed(s) kontrollieren: aktueller RSS-Feed gibt alle Seiten aus, weitere?", + "file": "Comenius-Institut_FOERBICO__issue_222_Webseite_ Feed_s_ kontrollieren_ aktueller RSS-Fee.md", + "updated_at": "2025-02-17T11:35:47Z", + "state": "open" + }, + "603": { + "hash": "d603fb88ba55acbd9e88ba8abfeb1292", + "number": 221, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Metadaten (welche Standards, was/wie taggen, was/wie ausgaben) (LS, JL)", + "file": "Comenius-Institut_FOERBICO__issue_221_Webseite_ Metadaten _welche Standards_ was-wie tag.md", + "updated_at": "2025-02-12T10:38:22Z", + "state": "open" + }, + "602": { + "hash": "bff7c55d75e9b5b446fbdc99fd4d56f1", + "number": 220, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Kalender / Termine (CU, GB)", + "file": "Comenius-Institut_FOERBICO__issue_220_Webseite_ Kalender - Termine _CU_ GB_.md", + "updated_at": "2025-02-12T09:41:55Z", + "state": "open" + }, + "601": { + "hash": "84f0491a8765b60fc2ff6b8af5c492f7", + "number": 219, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Barrierefreiheit / -armut mitdenken (GB)", + "file": "Comenius-Institut_FOERBICO__issue_219_Webseite_ Barrierefreiheit - -armut mitdenken _GB_.md", + "updated_at": "2025-02-11T14:24:12Z", + "state": "open" + }, + "600": { + "hash": "7e25f7ccea5cf9c191393860d9a63c3e", + "number": 218, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Workflow f\u00fcr die Aktualisierung der Webseite _durch jede*n_ (LS)", + "file": "Comenius-Institut_FOERBICO__issue_218_Webseite_ Workflow f\u00fcr die Aktualisierung der Webs.md", + "updated_at": "2025-03-05T11:13:31Z", + "state": "open" + }, + "599": { + "hash": "28b75b71bb8968c01531e4b69043a563", + "number": 217, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: technische Schulden (LS, all)", + "file": "Comenius-Institut_FOERBICO__issue_217_Webseite_ technische Schulden _LS_ all_.md", + "updated_at": "2025-02-19T17:02:51Z", + "state": "open" + }, + "598": { + "hash": "ba76ce032c519d2c8306c302fad083b9", + "number": 216, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: einfache Suchfunktion (LS)", + "file": "Comenius-Institut_FOERBICO__issue_216_Webseite_ einfache Suchfunktion _LS_.md", + "updated_at": "2025-02-11T14:37:24Z", + "state": "open" + }, + "597": { + "hash": "7a0e840c252f15d98b607ccf9052f96e", + "number": 215, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Filterfunktion / Tags beim Blog ; Schlagw\u00f6rter aus den Metadaten (GB)", + "file": "Comenius-Institut_FOERBICO__issue_215_Webseite_ Filterfunktion - Tags beim Blog _ Schlag.md", + "updated_at": "2025-02-11T14:24:12Z", + "state": "open" + }, + "596": { + "hash": "2a74d594e998eb8009a522c08be329d9", + "number": 214, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: kann man die Metadaten sichtbar machen (VP)", + "file": "Comenius-Institut_FOERBICO__issue_214_Webseite_ kann man die Metadaten sichtbar machen _.md", + "updated_at": "2025-02-11T14:24:12Z", + "state": "open" + }, + "595": { + "hash": "a3b611994a55c0efb023f33456696290", + "number": 213, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: share Button (VP); M\u00f6glichkeit einbauen Blogbeitr\u00e4ge zu teilen (Linkedin, Mastodon...) (GB)", + "file": "Comenius-Institut_FOERBICO__issue_213_Webseite_ share Button _VP__ M\u00f6glichkeit einbauen .md", + "updated_at": "2025-02-11T14:24:12Z", + "state": "open" + }, + "594": { + "hash": "3ac9fc5a6ecb5f389e425154d89b7e2f", + "number": 212, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Sichtbarkeit der Teilprojekte, Projekthintergrund (VP)", + "file": "Comenius-Institut_FOERBICO__issue_212_Webseite_ Sichtbarkeit der Teilprojekte_ Projekthi.md", + "updated_at": "2025-02-11T14:24:12Z", + "state": "open" + }, + "593": { + "hash": "dfdf389649fc9a1f65c064babf37151d", + "number": 211, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Bei Team Kontaktm\u00f6glichkeiten hinzuf\u00fcgen (mind. E-Mail) + Institute bzw. Logos verlinken (GB)", + "file": "Comenius-Institut_FOERBICO__issue_211_Webseite_ Bei Team Kontaktm\u00f6glichkeiten hinzuf\u00fcgen.md", + "updated_at": "2025-02-11T14:24:12Z", + "state": "open" + }, + "592": { + "hash": "d8574d2cd34e538579117657076cf4cd", + "number": 210, + "repo": "Comenius-Institut/FOERBICO", + "title": "Markdown-Anleitung + Handout", + "file": "Comenius-Institut_FOERBICO__issue_210_Markdown-Anleitung _ Handout.md", + "updated_at": "2025-02-11T08:26:54Z", + "state": "open" + }, + "591": { + "hash": "fd9619b63fee7dd9bab68d3a4ee019a3", + "number": 209, + "repo": "Comenius-Institut/FOERBICO", + "title": "KlimaOER-Workshop am 17.3.25 (Gina)", + "file": "Comenius-Institut_FOERBICO__issue_209_KlimaOER-Workshop am 17_3_25 _Gina_.md", + "updated_at": "2025-02-11T08:26:54Z", + "state": "open" + }, + "589": { + "hash": "19fa22785bd1bbb425dcb4552c184038", + "number": 207, + "repo": "Comenius-Institut/FOERBICO", + "title": "WIP: add-blogpost-oer-remix-leitfaden", + "file": "Comenius-Institut_FOERBICO__issue_207_WIP_ add-blogpost-oer-remix-leitfaden.md", + "updated_at": "2025-02-10T13:09:44Z", + "state": "open" + }, + "588": { + "hash": "472aff7e827b34d825a0ebd4747336ff", + "number": 206, + "repo": "Comenius-Institut/FOERBICO", + "title": "HackathOERn 28.-30.4. in G\u00f6ttingen", + "file": "Comenius-Institut_FOERBICO__issue_206_HackathOERn 28_-30_4_ in G\u00f6ttingen.md", + "updated_at": "2025-03-06T18:14:16Z", + "state": "open" + }, + "582": { + "hash": "de535390931745e8a1d792511bf77bf1", + "number": 204, + "repo": "Comenius-Institut/FOERBICO", + "title": "Anfrage \u00fcber Austausch und Vernetzung (rpp-katholisch)", + "file": "Comenius-Institut_FOERBICO__issue_204_Anfrage \u00fcber Austausch und Vernetzung _rpp-katholi.md", + "updated_at": "2025-03-10T09:05:42Z", + "state": "open" + }, + "579": { + "hash": "12ae251505985872c73b515948ba00b1", + "number": 202, + "repo": "Comenius-Institut/FOERBICO", + "title": "Workshops OER im Blick Jena", + "file": "Comenius-Institut_FOERBICO__issue_202_Workshops OER im Blick Jena.md", + "updated_at": "2025-02-10T10:02:22Z", + "state": "open" + }, + "578": { + "hash": "598ecf0798a705d98631fbaca1cef8f1", + "number": 201, + "repo": "Comenius-Institut/FOERBICO", + "title": "WIP: mastodon-comments", + "file": "Comenius-Institut_FOERBICO__issue_201_WIP_ mastodon-comments.md", + "updated_at": "2025-02-04T14:50:24Z", + "state": "open" + }, + "577": { + "hash": "26a1f1ed32aaae5213e94fafbdb9a3b3", + "number": 200, + "repo": "Comenius-Institut/FOERBICO", + "title": "WIP: F\u00f6rderung durch BMBF auch im Impressum explizit erw\u00e4hnen", + "file": "Comenius-Institut_FOERBICO__issue_200_WIP_ F\u00f6rderung durch BMBF auch im Impressum expliz.md", + "updated_at": "2025-03-05T11:08:26Z", + "state": "open" + }, + "575": { + "hash": "7e585ebb6d3d88adf7188cd7f6a07e36", + "number": 199, + "repo": "Comenius-Institut/FOERBICO", + "title": "Community-Kalender", + "file": "Comenius-Institut_FOERBICO__issue_199_Community-Kalender.md", + "updated_at": "2025-02-11T14:16:55Z", + "state": "open" + }, + "573": { + "hash": "9dddcf499541ff7b0d72045d396f1dcb", + "number": 197, + "repo": "Comenius-Institut/FOERBICO", + "title": "Unterseite oer.community - Toolbox", + "file": "Comenius-Institut_FOERBICO__issue_197_Unterseite oer_community - Toolbox.md", + "updated_at": "2025-02-10T13:06:44Z", + "state": "open" + }, + "572": { + "hash": "bfc2383fd6f0444cc7ff55822ef0c87e", + "number": 196, + "repo": "Comenius-Institut/FOERBICO", + "title": "Vorbereitung - Jahresplanungs-Meeting 17.02. 18 Uhr", + "file": "Comenius-Institut_FOERBICO__issue_196_Vorbereitung - Jahresplanungs-Meeting 17_02_ 18 Uh.md", + "updated_at": "2025-02-10T16:38:55Z", + "state": "open" + }, + "568": { + "hash": "ad6b5586290b40cc6dee0bcff2ee9ba9", + "number": 194, + "repo": "Comenius-Institut/FOERBICO", + "title": "Vorbereitung Workshop \"Community-Hub\" bei OER im Blick in Jena (13. & 14.5.)", + "file": "Comenius-Institut_FOERBICO__issue_194_Vorbereitung Workshop _Community-Hub_ bei OER im B.md", + "updated_at": "2025-02-17T09:34:18Z", + "state": "open" + }, + "566": { + "hash": "642de257dc40703ff37bf9aad156fc8e", + "number": 192, + "repo": "Comenius-Institut/FOERBICO", + "title": "WIP: OER und (SDG)-Symbole - iRights", + "file": "Comenius-Institut_FOERBICO__issue_192_WIP_ OER und _SDG_-Symbole - iRights.md", + "updated_at": "2025-03-10T16:46:28Z", + "state": "open" + }, + "565": { + "hash": "644ea1dcac76bbac21aa69c6be63f994", + "number": 191, + "repo": "Comenius-Institut/FOERBICO", + "title": "Strukturierte Daten f\u00fcr Bilder", + "file": "Comenius-Institut_FOERBICO__issue_191_Strukturierte Daten f\u00fcr Bilder.md", + "updated_at": "2025-01-25T06:14:08Z", + "state": "open" + }, + "563": { + "hash": "600aad3739e769ef86f2261377187038", + "number": 189, + "repo": "Comenius-Institut/FOERBICO", + "title": "OER-Akteuren in hochschulischen RelP\u00e4d-Community : Termin zu Sinnfluencer-Material von Uni Passau", + "file": "Comenius-Institut_FOERBICO__issue_189_OER-Akteuren in hochschulischen RelP\u00e4d-Community _.md", + "updated_at": "2025-01-21T11:09:28Z", + "state": "open" + }, + "562": { + "hash": "6571e1a6e18575eb2f76261730f0a4f0", + "number": 188, + "repo": "Comenius-Institut/FOERBICO", + "title": "White Paper --> Planung f\u00fcr Blogbeitr\u00e4ge", + "file": "Comenius-Institut_FOERBICO__issue_188_White Paper --_ Planung f\u00fcr Blogbeitr\u00e4ge.md", + "updated_at": "2025-03-06T22:08:48Z", + "state": "open" + }, + "561": { + "hash": "a4f7b812b2de52819e37ca11318d90c8", + "number": 187, + "repo": "Comenius-Institut/FOERBICO", + "title": "Religionsp\u00e4dagogische Qualit\u00e4tskriterien und Standards f\u00fcr OER", + "file": "Comenius-Institut_FOERBICO__issue_187_Religionsp\u00e4dagogische Qualit\u00e4tskriterien und Stand.md", + "updated_at": "2025-03-07T15:26:37Z", + "state": "open" + }, + "555": { + "hash": "ea71c8e3c3b93906fb8ae5ca5f9f3ccd", + "number": 182, + "repo": "Comenius-Institut/FOERBICO", + "title": "Zwischenbericht DLR / BMBF", + "file": "Comenius-Institut_FOERBICO__issue_182_Zwischenbericht DLR - BMBF.md", + "updated_at": "2025-02-06T10:52:51Z", + "state": "open" + }, + "536": { + "hash": "cc8a3c2e11819d0c4456bb295b7c77b7", + "number": 181, + "repo": "Comenius-Institut/FOERBICO", + "title": "OER-Tagung 2026 (dabei: alle)", + "file": "Comenius-Institut_FOERBICO__issue_181_OER-Tagung 2026 _dabei_ alle_.md", + "updated_at": "2025-02-10T09:57:11Z", + "state": "open" + }, + "534": { + "hash": "f43f549b4e026f30302c762aea16fd9a", + "number": 179, + "repo": "Comenius-Institut/FOERBICO", + "title": "Feinkorrekturen der Transkripte", + "file": "Comenius-Institut_FOERBICO__issue_179_Feinkorrekturen der Transkripte.md", + "updated_at": "2025-03-07T14:53:36Z", + "state": "open" + }, + "533": { + "hash": "b5aa6adf33c272fb12db034e76686e13", + "number": 178, + "repo": "Comenius-Institut/FOERBICO", + "title": "Artikel schreiben - Basiserhebung", + "file": "Comenius-Institut_FOERBICO__issue_178_Artikel schreiben - Basiserhebung.md", + "updated_at": "2025-03-07T14:53:46Z", + "state": "open" + }, + "531": { + "hash": "4290f7540d249abddb71050091bde208", + "number": 176, + "repo": "Comenius-Institut/FOERBICO", + "title": "Ver\u00f6ffentlichung der Forschung in der Open Science Community", + "file": "Comenius-Institut_FOERBICO__issue_176_Ver\u00f6ffentlichung der Forschung in der Open Science.md", + "updated_at": "2025-03-07T14:54:01Z", + "state": "open" + }, + "530": { + "hash": "4988f66bbef49def67b911b63aefa7be", + "number": 175, + "repo": "Comenius-Institut/FOERBICO", + "title": "Analyse der Codes mit Hilfe der Qualitativen Inhaltsanalyse", + "file": "Comenius-Institut_FOERBICO__issue_175_Analyse der Codes mit Hilfe der Qualitativen Inhal.md", + "updated_at": "2025-03-07T16:07:39Z", + "state": "open" + }, + "527": { + "hash": "2a98bcb0f2bcddf6e9076eeba72c2e17", + "number": 174, + "repo": "Comenius-Institut/FOERBICO", + "title": "Technischer Entwicklungsschwerpunkt - Bezug auf rpi-virtuell", + "file": "Comenius-Institut_FOERBICO__issue_174_Technischer Entwicklungsschwerpunkt - Bezug auf rp.md", + "updated_at": "2025-01-13T08:23:04Z", + "state": "open" + }, + "509": { + "hash": "08289328334df1050902ba4ac78b9a97", + "number": 164, + "repo": "Comenius-Institut/FOERBICO", + "title": "\"DS_Store\" Dateien entfernen / inhaltliche-technische Schulden", + "file": "Comenius-Institut_FOERBICO__issue_164__DS_Store_ Dateien entfernen - inhaltliche-technis.md", + "updated_at": "2025-02-04T15:10:26Z", + "state": "open" + }, + "499": { + "hash": "ff73cb757b581c6cc952b8f656a306f9", + "number": 158, + "repo": "Comenius-Institut/FOERBICO", + "title": "upload von bildern und gr\u00f6\u00dferen daten via git bringt Fehlermeldung", + "file": "Comenius-Institut_FOERBICO__issue_158_upload von bildern und gr\u00f6\u00dferen daten via git brin.md", + "updated_at": "2025-01-06T09:22:17Z", + "state": "open" + }, + "487": { + "hash": "e014e1e0f4a2d7e8490fa9a7e7073b2e", + "number": 147, + "repo": "Comenius-Institut/FOERBICO", + "title": "Urheberrecht: rechtssichere Verwendung von \"gemeinfrei\" Bildern der wikimedia commons", + "file": "Comenius-Institut_FOERBICO__issue_147_Urheberrecht_ rechtssichere Verwendung von _gemein.md", + "updated_at": "2024-11-28T15:12:39Z", + "state": "open" + }, + "485": { + "hash": "2aed1689b13205ec8cfeae841db2a1e7", + "number": 145, + "repo": "Comenius-Institut/FOERBICO", + "title": "OERcamp Termine 2025 / FOERBICO Teilnahme? (was: R\u00fcckblick OERcamp Essen)", + "file": "Comenius-Institut_FOERBICO__issue_145_OERcamp Termine 2025 - FOERBICO Teilnahme_ _was_ R.md", + "updated_at": "2025-02-17T09:40:47Z", + "state": "open" + }, + "466": { + "hash": "c7b7e9d730b5a33042bc0a565bf382b2", + "number": 140, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Kommentare erm\u00f6glichen? wenn ja, wie?", + "file": "Comenius-Institut_FOERBICO__issue_140_Webseite_ Kommentare erm\u00f6glichen_ wenn ja_ wie_.md", + "updated_at": "2025-02-11T14:06:54Z", + "state": "open" + }, + "465": { + "hash": "b5eba744bf491aa821480a3c8a3c27ad", + "number": 139, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite: Deployment per \"Actions\"", + "file": "Comenius-Institut_FOERBICO__issue_139_Webseite_ Deployment per _Actions_.md", + "updated_at": "2025-03-05T11:13:31Z", + "state": "open" + }, + "464": { + "hash": "056b4a4450eab499427fd3597764c295", + "number": 138, + "repo": "Comenius-Institut/FOERBICO", + "title": "Webseite erweitern", + "file": "Comenius-Institut_FOERBICO__issue_138_Webseite erweitern.md", + "updated_at": "2025-02-12T10:48:43Z", + "state": "open" + }, + "460": { + "hash": "322cddd0f65aac04cf94cd1307727493", + "number": 134, + "repo": "Comenius-Institut/FOERBICO", + "title": "OER Material von Unis sammeln und distribuieren", + "file": "Comenius-Institut_FOERBICO__issue_134_OER Material von Unis sammeln und distribuieren.md", + "updated_at": "2024-11-22T06:35:31Z", + "state": "open" + }, + "456": { + "hash": "9691ebec98aebff36b274f3244f93881", + "number": 130, + "repo": "Comenius-Institut/FOERBICO", + "title": "Ordnerstruktur Blog im Git", + "file": "Comenius-Institut_FOERBICO__issue_130_Ordnerstruktur Blog im Git.md", + "updated_at": "2024-11-20T10:15:08Z", + "state": "open" + }, + "455": { + "hash": "9f58d7dca3f29d20b5be75626ba704e9", + "number": 129, + "repo": "Comenius-Institut/FOERBICO", + "title": "OER im Blick 2025 - 13. & 14. Mai 2025 in Jena (Phillip, Laura, Gina)", + "file": "Comenius-Institut_FOERBICO__issue_129_OER im Blick 2025 - 13_ _ 14_ Mai 2025 in Jena _Ph.md", + "updated_at": "2025-02-10T10:03:15Z", + "state": "open" + }, + "438": { + "hash": "e2b6045c6e6c7bd99f8e51eb5a2132b5", + "number": 126, + "repo": "Comenius-Institut/FOERBICO", + "title": "GTPN-Tagungsbeitrag von Manfred", + "file": "Comenius-Institut_FOERBICO__issue_126_GTPN-Tagungsbeitrag von Manfred.md", + "updated_at": "2024-11-11T15:41:53Z", + "state": "open" + }, + "436": { + "hash": "f32b25f7780b05e526bdda0b6b87086c", + "number": 124, + "repo": "Comenius-Institut/FOERBICO", + "title": "Mitmachen-Seite gestalten", + "file": "Comenius-Institut_FOERBICO__issue_124_Mitmachen-Seite gestalten.md", + "updated_at": "2025-02-21T07:23:05Z", + "state": "open" + }, + "435": { + "hash": "64390f447c3e05aa775368f26d01bb4f", + "number": 123, + "repo": "Comenius-Institut/FOERBICO", + "title": "Statistiken f\u00fcr Blog (mit SSG)", + "file": "Comenius-Institut_FOERBICO__issue_123_Statistiken f\u00fcr Blog _mit SSG_.md", + "updated_at": "2024-11-11T10:04:39Z", + "state": "open" + }, + "434": { + "hash": "98c6d466aa383ea35f72a44ae6115c07", + "number": 122, + "repo": "Comenius-Institut/FOERBICO", + "title": "SSG Hugo - verschiedene Designs", + "file": "Comenius-Institut_FOERBICO__issue_122_SSG Hugo - verschiedene Designs.md", + "updated_at": "2024-11-11T10:04:16Z", + "state": "open" + }, + "433": { + "hash": "1d18239dcbf1b7968c8b778ec3c5feb2", + "number": 121, + "repo": "Comenius-Institut/FOERBICO", + "title": "Beitr\u00e4ge auch auf OER Info ver\u00f6ffentlichen", + "file": "Comenius-Institut_FOERBICO__issue_121_Beitr\u00e4ge auch auf OER Info ver\u00f6ffentlichen.md", + "updated_at": "2024-11-11T10:04:00Z", + "state": "open" + }, + "432": { + "hash": "0393afd16aa5272a44593a509d097136", + "number": 120, + "repo": "Comenius-Institut/FOERBICO", + "title": "Beitr\u00e4ge / Termine an OER Worldmap pushen", + "file": "Comenius-Institut_FOERBICO__issue_120_Beitr\u00e4ge - Termine an OER Worldmap pushen.md", + "updated_at": "2024-11-11T10:03:47Z", + "state": "open" + }, + "384": { + "hash": "23b7c31b571337140182afb57c50d6c1", + "number": 100, + "repo": "Comenius-Institut/FOERBICO", + "title": "Blogpost OEP erkl\u00e4ren", + "file": "Comenius-Institut_FOERBICO__issue_100_Blogpost OEP erkl\u00e4ren.md", + "updated_at": "2025-01-02T10:30:25Z", + "state": "open" + }, + "358": { + "hash": "c52cddc8491b97c05dba70e4f4f01338", + "number": 81, + "repo": "Comenius-Institut/FOERBICO", + "title": "FOERBICO in OER-Worldmap", + "file": "Comenius-Institut_FOERBICO__issue_81_FOERBICO in OER-Worldmap.md", + "updated_at": "2025-03-04T06:17:08Z", + "state": "open" + }, + "354": { + "hash": "161b1878a2258200bb8e2838cac3edd9", + "number": 78, + "repo": "Comenius-Institut/FOERBICO", + "title": "ueberuns.md aktualisiert", + "file": "Comenius-Institut_FOERBICO__issue_78_ueberuns_md aktualisiert.md", + "updated_at": "2024-10-21T14:35:18Z", + "state": "open" + }, + "351": { + "hash": "b467201f10cb541f92284227c1a48566", + "number": 75, + "repo": "Comenius-Institut/FOERBICO", + "title": "Adressliste GwR einpflegen", + "file": "Comenius-Institut_FOERBICO__issue_75_Adressliste GwR einpflegen.md", + "updated_at": "2024-09-20T04:24:03Z", + "state": "open" + }, + "245": { + "hash": "c5dda66313f11a8fff4809564e0da5c5", + "number": 33, + "repo": "Comenius-Institut/FOERBICO", + "title": "Vereinbarung f\u00fcr Working out Loud", + "file": "Comenius-Institut_FOERBICO__issue_33_Vereinbarung f\u00fcr Working out Loud.md", + "updated_at": "2024-10-24T11:29:43Z", + "state": "open" + }, + "168": { + "hash": "c8dff7d5794fa9ec97005d279a7bd528", + "number": 32, + "repo": "Comenius-Institut/FOERBICO", + "title": "OER-Editor (dupliziert #22)", + "file": "Comenius-Institut_FOERBICO__issue_32_OER-Editor _dupliziert _22_.md", + "updated_at": "2025-02-10T12:07:10Z", + "state": "open" + }, + "140": { + "hash": "b959e85d64a2985a9ff231ec375be139", + "number": 30, + "repo": "Comenius-Institut/FOERBICO", + "title": "Bildbeschreibung bei Titelbildern von WordPress-Beitr\u00e4gen", + "file": "Comenius-Institut_FOERBICO__issue_30_Bildbeschreibung bei Titelbildern von WordPress-Be.md", + "updated_at": "2025-02-15T13:40:34Z", + "state": "open" + }, + "123": { + "hash": "bdb0196bc2a39f09519da60bae868307", + "number": 28, + "repo": "Comenius-Institut/FOERBICO", + "title": "Bibelstellen OER rechtskonform verwenden (Wissenssammlung)", + "file": "Comenius-Institut_FOERBICO__issue_28_Bibelstellen OER rechtskonform verwenden _Wissenss.md", + "updated_at": "2025-02-15T13:39:31Z", + "state": "open" + }, + "105": { + "hash": "45af7e7303128452927d5aeba86fdcda", + "number": 27, + "repo": "Comenius-Institut/FOERBICO", + "title": "Fotos und Bilder in WordPress - Anleitung aus CI-Wiki offenzug\u00e4nglich machen", + "file": "Comenius-Institut_FOERBICO__issue_27_Fotos und Bilder in WordPress - Anleitung aus CI-W.md", + "updated_at": "2024-07-11T12:46:46Z", + "state": "open" + }, + "103": { + "hash": "9a3fcaad7fbd4db0d6c234959f0aff75", + "number": 26, + "repo": "Comenius-Institut/FOERBICO", + "title": "Dezentrales ID-Verfahren", + "file": "Comenius-Institut_FOERBICO__issue_26_Dezentrales ID-Verfahren.md", + "updated_at": "2025-03-04T15:30:22Z", + "state": "open" + }, + "98": { + "hash": "db1c8c5dffeaa41fb9e55cfee8cb6e03", + "number": 23, + "repo": "Comenius-Institut/FOERBICO", + "title": "OER-Policy an den beteiligten Institutitonen", + "file": "Comenius-Institut_FOERBICO__issue_23_OER-Policy an den beteiligten Institutitonen.md", + "updated_at": "2024-07-03T08:36:44Z", + "state": "open" + }, + "89": { + "hash": "cafa1b70bc3377e99bebcea54600af37", + "number": 22, + "repo": "Comenius-Institut/FOERBICO", + "title": "Markdown-Editor f\u00fcr OER (veraltet - Duplikat von #32)", + "file": "Comenius-Institut_FOERBICO__issue_22_Markdown-Editor f\u00fcr OER _veraltet - Duplikat von _.md", + "updated_at": "2025-02-10T12:14:09Z", + "state": "open" + }, + "702": { + "hash": "dbd747277d597e24c3dfbe48f87d7b2a", + "number": 302, + "repo": "Comenius-Institut/FOERBICO", + "title": "Ver\u00f6ffentlichungs-Routine zu OERSI via Gitlab von yaml aus Blogposts von oer.community", + "file": "Comenius-Institut_FOERBICO__issue_302_Ver\u00f6ffentlichungs-Routine zu OERSI via Gitlab von .md", + "updated_at": "2025-03-10T16:38:16Z", + "state": "open" + }, + "701": { + "hash": "e83563203d764a029bcd0946e11d0399", + "number": 301, + "repo": "Comenius-Institut/FOERBICO", + "title": "Beratung und Begleitung Podcastreihe zum Seminar \"Glaube und Handeln\"", + "file": "Comenius-Institut_FOERBICO__issue_301_Beratung und Begleitung Podcastreihe zum Seminar _.md", + "updated_at": "2025-03-10T16:50:46Z", + "state": "open" + } + }, + "last_update": "2025-03-10T18:05:04.439680" +} \ No newline at end of file diff --git a/update.bat b/update.bat new file mode 100644 index 0000000..68317c0 --- /dev/null +++ b/update.bat @@ -0,0 +1,59 @@ +@echo off +:: Automatisches Update-Skript für Forgejo Issues (Windows) +:: Dieses Skript kann als geplante Aufgabe eingerichtet werden, um Issues regelmäßig zu aktualisieren + +:: Konfiguration +set SCRIPT_DIR=%~dp0 +set PYTHON_SCRIPT=%SCRIPT_DIR%forgejo_exporter.py +set OUTPUT_DIR=%SCRIPT_DIR%forgejo_issues +set LOG_FILE=%SCRIPT_DIR%forgejo_update.log + +:: Forgejo-Einstellungen +set REPO_OWNER=Comenius-Institut +set REPO_NAME=FOERBICO +:: Setze REPO_NAME=all um alle Repositories des Besitzers zu exportieren + +:: Optionen +set INCLUDE_COMMENTS=true +set INCLUDE_CLOSED=true + +:: Funktion zur Protokollierung +echo [%date% %time%] Starte Forgejo-Issues Update >> "%LOG_FILE%" + +:: Prüfe, ob das Python-Skript existiert +if not exist "%PYTHON_SCRIPT%" ( + echo [%date% %time%] FEHLER: Python-Skript nicht gefunden: %PYTHON_SCRIPT% >> "%LOG_FILE%" + exit /b 1 +) + +:: Erstelle den Ausgabeordner, falls er nicht existiert +if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%" + +:: Baue die Befehlszeile +cd "%SCRIPT_DIR%" +set CMD=python "forgejo_exporter.py" --owner "%REPO_OWNER%" --repo "%REPO_NAME%" --output "%OUTPUT_DIR%" + +if "%INCLUDE_COMMENTS%"=="true" ( + set CMD=%CMD% --comments +) + +if "%INCLUDE_CLOSED%"=="true" ( + set CMD=%CMD% --closed +) + +:: Führe das Skript aus +echo [%date% %time%] Führe Befehl aus: %CMD% >> "%LOG_FILE%" +%CMD% >> "%LOG_FILE%" 2>&1 + +if %ERRORLEVEL% EQU 0 ( + echo [%date% %time%] Update erfolgreich abgeschlossen >> "%LOG_FILE%" +) else ( + echo [%date% %time%] FEHLER: Update fehlgeschlagen mit Exit-Code %ERRORLEVEL% >> "%LOG_FILE%" +) + +echo [%date% %time%] Update beendet >> "%LOG_FILE%" +echo ================================================== >> "%LOG_FILE%" + +:: Ausgabe auf der Konsole, wenn manuell ausgeführt +echo Forgejo Issues Update abgeschlossen. +echo Siehe Logdatei für Details: %LOG_FILE% \ No newline at end of file diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..cf767b1 --- /dev/null +++ b/update.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Automatisches Update-Skript für Forgejo Issues +# Dieses Skript kann als Cron-Job ausgeführt werden, um Issues regelmäßig zu aktualisieren + +# Konfiguration +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +PYTHON_SCRIPT="$SCRIPT_DIR/forgejo_exporter.py" +OUTPUT_DIR="$SCRIPT_DIR/forgejo_issues" +LOG_FILE="$SCRIPT_DIR/forgejo_update.log" + +# Forgejo-Einstellungen +REPO_OWNER="Comenius-Institut" # Ändere dies zu deinem Repository-Besitzer +REPO_NAME="FOERBICO" # Ändere dies zu deinem Repository-Namen +# Setze REPO_NAME="all" um alle Repositories des Besitzers zu exportieren + +# Optionen +INCLUDE_COMMENTS=true # Auf true setzen, um Kommentare einzubeziehen +INCLUDE_CLOSED=true # Auf true setzen, um geschlossene Issues einzubeziehen + +# Funktion zur Protokollierung +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" +} + +# Starte die Protokollierung +log "Starte Forgejo-Issues Update" + +# Prüfe, ob das Python-Skript existiert +if [ ! -f "$PYTHON_SCRIPT" ]; then + log "FEHLER: Python-Skript nicht gefunden: $PYTHON_SCRIPT" + exit 1 +fi + +# Erstelle den Ausgabeordner, falls er nicht existiert +mkdir -p "$OUTPUT_DIR" + +# Baue die Befehlszeile +CMD="python3 $PYTHON_SCRIPT --owner $REPO_OWNER --repo $REPO_NAME --output $OUTPUT_DIR" + +if [ "$INCLUDE_COMMENTS" = true ]; then + CMD="$CMD --comments" +fi + +if [ "$INCLUDE_CLOSED" = true ]; then + CMD="$CMD --closed" +fi + +# Führe das Skript aus +log "Führe Befehl aus: $CMD" +eval $CMD >> "$LOG_FILE" 2>&1 +RESULT=$? + +if [ $RESULT -eq 0 ]; then + log "Update erfolgreich abgeschlossen" +else + log "FEHLER: Update fehlgeschlagen mit Exit-Code $RESULT" +fi + +log "Update beendet" +echo "==================================================" \ No newline at end of file