Initial commit - fetch Discourse category topics
This commit is contained in:
commit
1d8e18247d
6 changed files with 92 additions and 0 deletions
41
README.md
Normal file
41
README.md
Normal 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
5
dashboard.py
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
'''
|
||||||
|
Class to generate a static website based on a csv file
|
||||||
|
'''
|
||||||
|
class Dashboard():
|
||||||
|
pass
|
||||||
32
discourse.py
Normal file
32
discourse.py
Normal 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
12
main.py
Normal 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
2
requirements.txt
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
requests==2.32.5
|
||||||
|
Jinja2==3.1.6
|
||||||
0
zasoby.csv
Normal file
0
zasoby.csv
Normal file
|
|
Loading…
Add table
Add a link
Reference in a new issue