Initial commit - fetch Discourse category topics

This commit is contained in:
Marta Sienkiewicz 2026-01-11 15:56:30 +01:00
commit 1d8e18247d
6 changed files with 92 additions and 0 deletions

41
README.md Normal file
View file

@ -0,0 +1,41 @@
# HS3 Baza zasobów Dashboard
Skrypt, który generuje podsumowanie [Bazy Wiedzy zasobów Hackerspace Trójmiasto](https://kb.hs3.pl/docs) w formie statycznej strony internetowej.
## Sposób działania
1. Baza Wiedzy znajduje się na Discourse Hackerspace Trójmiasto i jest dostępna publicznie. Projekt wykorzystuje Discourse REST API do pobrania listy zasobów.
1. Lista zasobów zapisana jest w pliku csv `zasoby.csv`.
1. Skrypt tworzy statyczną stronę internetową na podstawie pliku `.csv`.
1. Strona jest hostowana przy pomocy GitHub Pages.
## Możliwości generatora bazy zasobów csv
- pobieranie listy wszystkich zasobów z wybranej kategorii
- pobieranie ID, tagów i treści posta każdego zasobu
- wyłuskanie z treści posta informacji:
- nazwa przedmiotu
- miejsce zamieszkania
- ilość
- opiekunowie
- oto jak powinien wyglądać ostateczny wpis:
```
ID, nazwa, miejsce, ilość, opiekunowie, tagi
```
## Możliwości dashboard'u
- filtrowanie bazy zasobów po tagach
- sortowanie alfabetyczne bazy zasobów po dowolnej kolumnie
- linki do zasobu na Discourse w ID zasobu
- łatwa zmiana ilości kolumn dashboardu
## Co chcę dodać w przyszłości
- wizualizacja statystyk z bazy zasobów
- generowanie drugiego pliku csv służącego do wygenerowania naklejek z kodem QR
## Dokumentacja
- [Discourse REST API](https://docs.discourse.org/)

5
dashboard.py Normal file
View file

@ -0,0 +1,5 @@
'''
Class to generate a static website based on a csv file
'''
class Dashboard():
pass

32
discourse.py Normal file
View file

@ -0,0 +1,32 @@
'''
Class to generate a csv file based on data fetched via Discourse REST API
'''
import requests
import json
class Discourse():
def __init__(self, url):
self.url = url
def get_category_data(self, category_id: str) -> requests.Response:
"""Get data related to a Discourse category"""
headers = {
"content-type": "application/json",
}
url = f"{self.url}/c/{category_id}.json"
res = requests.get(url, headers)
res.raise_for_status()
res_json = json.loads(res.text)
return res_json
def get_category_topics(self, category_id: str) -> requests.Response:
"""Get topics from a Discourse category"""
cat_data = self.get_category_data(category_id)
for topic in cat_data["topic_list"]["topics"]:
print(f'{topic["id"]}, {topic["title"]}, {topic["tags"]}, {self.url}t/{topic["id"]}')
if __name__=="__main__":
dis = Discourse("https://kb.hs3.pl/")
dis.get_category_topics(9)

12
main.py Normal file
View file

@ -0,0 +1,12 @@
DISCOURSE_URL = "https://kb.hs3.pl/" # Database is hosted here
DISCOURSE_CATEGORY = 9 # Database is stored in this Discourse category
from discourse import Discourse
if __name__ == "__main__":
print(f"Discourse database: f{DISCOURSE_URL}/{DISCOURSE_CATEGORY}")
print("Fetching database data to zasoby.csv...")
dis = Discourse(DISCOURSE_URL)
print("Generating HTML dashboard...")
print("Done!")

2
requirements.txt Normal file
View file

@ -0,0 +1,2 @@
requests==2.32.5
Jinja2==3.1.6

0
zasoby.csv Normal file
View file