From f44efe29db2ff6611a23dffeaae500fd28a9da1a Mon Sep 17 00:00:00 2001 From: marko Date: Sun, 5 Mar 2023 19:12:11 +0100 Subject: [PATCH] updated announcement download to new jvs calendar structure --- submodules/wkOrg | 1 + wkOrg/Makefile | 14 +++++++ wkOrg/checkDownloads.py | 82 +++++++++++++++++++++++++++++++++++++++ wkOrg/getCSV.py | 55 ++++++++++++++++++++++++++ wkOrg/newNoticeCheck.py | 41 ++++++++++++++++++++ wkOrg/readMe.md | 40 +++++++++++++++++++ wkOrg/wkScraper-JvsCal.py | 1 + 7 files changed, 234 insertions(+) create mode 160000 submodules/wkOrg create mode 100755 wkOrg/Makefile create mode 100755 wkOrg/checkDownloads.py create mode 100755 wkOrg/getCSV.py create mode 100755 wkOrg/newNoticeCheck.py create mode 100755 wkOrg/readMe.md create mode 120000 wkOrg/wkScraper-JvsCal.py diff --git a/submodules/wkOrg b/submodules/wkOrg new file mode 160000 index 0000000..41fe0c5 --- /dev/null +++ b/submodules/wkOrg @@ -0,0 +1 @@ +Subproject commit 41fe0c5a45ec7a480fd3b10719560b4b47ce4fdb diff --git a/wkOrg/Makefile b/wkOrg/Makefile new file mode 100755 index 0000000..cf611ea --- /dev/null +++ b/wkOrg/Makefile @@ -0,0 +1,14 @@ +.PHONY: all +all: dlCheck + +# Download der Ausschreibungen und ablegen im Downloadordner +.PHONY: download +download: + python wkScraper-JvsCal.py + +.PHONY: dlCheck +dlCheck: download + ./newNoticeCheck.py + +.PHONY: clean +clean: diff --git a/wkOrg/checkDownloads.py b/wkOrg/checkDownloads.py new file mode 100755 index 0000000..95074f3 --- /dev/null +++ b/wkOrg/checkDownloads.py @@ -0,0 +1,82 @@ +#! /usr/bin/env python3 + +# Python Script zum testen, ob neue Ausschreibungen hinzugekommen sind, oder bereits vorhandene sich geändert haben (kein herunterladen, es wird im Downloadordner wkOrgConfig.downpath gesucht) + +# Name und Pfad der Datenbank als Variablen +import wkOrgConfig +import wkOrgAssis + +import os +import os.path +import sqlite3 + +# Init der Datenbankverbindung +if os.path.isfile(wkOrgConfig.db['pathname']+wkOrgConfig.db['filename']): + dbConn = sqlite3.connect( + wkOrgConfig.db['pathname']+wkOrgConfig.db['filename']) + dbConn.text_factory = str + dbCur = dbConn.cursor() +else: + print("Keine Datenbank vorhanden!") + exit(-1) + +# Hole Liste der Dateinamen im downloadVerzeichnis +filenames = os.listdir(wkOrgConfig.downPath) +# print filenames + +# Für jeden Dateinamen: +for filename in filenames: + # Finde alle Einträge (id, dateiname, sha256 , wkID) zu diesen Dateinamen in der downloadTabelle -> dlList + dbCur.execute( + 'SELECT id, dateiname, sha512 , wkID FROM downloads WHERE dateiname=?', (filename, )) + ausschr = dbCur.fetchall() + +# Falls dlList leer: (heißt ausschreibung wurde noch nicht zugeordnet) + if ausschr == []: + # füge Ausschreibung zur downloadTabelle hinzu (merke dir die ID) + ausschrID = wkOrgAssis.dbAddDownload( + dbCur, filename, wkOrgAssis.aFilesSHA512(wkOrgConfig.downPath+filename)) + dbConn.commit() +# füge Wettkämpfe zur wkTabelle hinzu, merke die wkIDs + print("Ausschreibung: "+filename) + os.system('mupdf "'+wkOrgConfig.downPath + + filename + '" >/dev/null 2>/dev/null &') + wkIDs = wkOrgAssis.dbAddWks(dbCur, ausschrID) + dbConn.commit() +# update die wkIDs in der Ausschreibung in der downloadTabelle + dbCur.execute('UPDATE downloads SET wkID=? WHERE id=?', + (' '.join(str(wkIDs)), ausschrID)) + dbConn.commit() +# Sonst: + else: + # (auch wenn mehrere dl mit diesem Dateinamen in der + # downloadDatenbank gefunden werden, wir nehmen immer nur den + # ersten) + # Falls wkID == NULL: + if ausschr[0][3] == 'NULL': + # füge Wettkämpfe zur wkTabelle hinzu, merke die wkIDs + wkIDs = dbAddWks(dbCur, ausschr[0][0]) +# update die wkIDs dieser Ausschreibung + dbCur.execute('UPDATE downloads SET wkIDs=? WHERE id=?', + (' '.join(wkIDs), ausschr[0][0])) + dbConn.commit() +# Sonst: + else: + # Falls wkID != 0: + if ausschr[0][3] != '0': + # Falls sich der Hash geändert hat: + if ausschr[0][2] != wkOrgAssis.aFilesSHA512(wkOrgConfig.downPath+filename): + # Finde alle wkEinträge, die diese AusschreibungsID haben: + dbCur.execute( + 'SELECT (wkId) FROM downloads WHERE dateiname=?', (filename,)) + wkListList = dbCur.fetchall() +# Für jeden diesen Eintrag: + for wkList in wkListList: + # Berichtige die Wettkampfdaten + for wk in wkList: + print("Ups: kein dbUpdateWk") +# wkOrgAssis.dbUpdateWk(wk) + +# Aufräumen +dbConn.commit() +dbConn.close() diff --git a/wkOrg/getCSV.py b/wkOrg/getCSV.py new file mode 100755 index 0000000..549d39d --- /dev/null +++ b/wkOrg/getCSV.py @@ -0,0 +1,55 @@ +#! /usr/bin/env python3 + +# Python Script zum exportieren der anstehenden Wettkämpfe als cvs +# und Kopieren der Ausschreibungen in das zugehörige Verzeichnis zur +# Synchro mit dem online download ordner + +# Name und Pfad der Datenbank als Variablen +import wkOrgConfig +import wkOrgAssis + +import os +import os.path +import sqlite3 +import time +import shutil +import dateutil.parser +import sys + +# Init der Datenbankverbindung +if os.path.isfile(wkOrgConfig.db['pathname']+wkOrgConfig.db['filename']): + dbConn = sqlite3.connect(wkOrgConfig.db['pathname']+wkOrgConfig.db['filename']) + dbConn.text_factory = str + dbCur = dbConn.cursor() +else: + print ("Keine Datenbank vorhanden!") + exit(-1) + +# Abfrage aller anstehenden Wettkämpfe +dbCur.execute('SELECT id FROM wk WHERE datum>=?', (time.strftime("%Y-%m-%d"), ) ) +wkIds = dbCur.fetchall() + +for wkId in wkIds: + dbCur.execute('SELECT name, datum, ak, adrID, dlID FROM wk WHERE id=?', (wkId[0], ) ) + wkInfos = dbCur.fetchall() + dbCur.execute('SELECT dateiname FROM downloads WHERE id=?', (wkInfos[0][4], )) + ausschr = dbCur.fetchall() + dbCur.execute('SELECT ort, lat, lon FROM adressen WHERE id=?', (wkInfos[0][3], )) + addr = dbCur.fetchall() + if not addr: + addr = [["","",""]] + + + +# Schreibweisen korrigieren + ausschrFilename = ausschr[0][0] + ausschrFilename = ausschrFilename.replace(" ", "%20") + + sys.stderr.write("wkInfos: "+str(wkInfos)+"\n") + # Reihenfolge der Spalten auf dem Server: + # lfdeNr Datum Veranstaltung Altersklassen Ort Ausschreibung Routenplaner + + print ("0," + wkInfos[0][1] + "," + wkInfos[0][0] + "," + wkInfos[0][2] + "," + addr[0][0] + "," + "/downloads/Ausschreibungen/Ausschreibungen." + str(dateutil.parser.parse(wkInfos[0][1]).year) + "/" + ausschrFilename + "," + "http://www.openstreetmap.org/directions?&route=50.80722%2C12.88236%3B" + addr[0][1] + "%2C" + addr[0][2] + ",," ) + if not os.path.exists('Ausschreibungen/Ausschreibungen.'+str(dateutil.parser.parse(wkInfos[0][1]).year)): + os.makedirs('Ausschreibungen/Ausschreibungen.'+str(dateutil.parser.parse(wkInfos[0][1]).year)) + shutil.copyfile('download/'+ausschr[0][0], 'Ausschreibungen/Ausschreibungen.'+str(dateutil.parser.parse(wkInfos[0][1]).year)+'/'+ausschr[0][0]) diff --git a/wkOrg/newNoticeCheck.py b/wkOrg/newNoticeCheck.py new file mode 100755 index 0000000..7abd7e1 --- /dev/null +++ b/wkOrg/newNoticeCheck.py @@ -0,0 +1,41 @@ +#! /usr/bin/env python3 + +# Python Script zum testen, ob neue Ausschreibungen hinzugekommen sind, oder bereits vorhandene sich geändert haben (kein herunterladen, es wird im Downloadordner wkOrgConfig.downpath gesucht) + +# Name und Pfad der Datenbank als Variablen +import wkOrgConfig +import wkOrgAssis + +import os +import os.path +import sqlite3 + +# Init der Datenbankverbindung +if os.path.isfile(wkOrgConfig.db['pathname']+wkOrgConfig.db['filename']): + dbConn = sqlite3.connect(wkOrgConfig.db['pathname']+wkOrgConfig.db['filename']) + dbConn.text_factory = str + dbCur = dbConn.cursor() +else: + print ("Keine Datenbank vorhanden!") + exit(-1) + +# Hole Liste der Dateinamen im downloadVerzeichnis +filenames = os.listdir(wkOrgConfig.downPath) +#print filenames + +# Für jeden Dateinamen: +for filename in filenames: +# Finde alle Einträge (id, dateiname, sha256 , wkID) zu diesen Dateinamen in der downloadTabelle -> dlList + dbCur.execute('SELECT id, dateiname, sha512 , wkID FROM downloads WHERE dateiname=?', (filename, ) ) + ausschr = dbCur.fetchall() + +# Falls dlList leer: (heißt ausschreibung wurde noch nicht zugeordnet) + if ausschr == []: + print("Neue Auschreibung: {}".format(filename)) +# Sonst: + else: + continue + +# Aufräumen +dbConn.commit() +dbConn.close() diff --git a/wkOrg/readMe.md b/wkOrg/readMe.md new file mode 100755 index 0000000..b6087d7 --- /dev/null +++ b/wkOrg/readMe.md @@ -0,0 +1,40 @@ +Python Scripts zur Verwaltung von Wettkampfterminen in einer SQLite Datenbank + +Die einzelnen "Programme" +- download.sh + - Skript zum Herunterladen der Ausschreibungen +- checkDownloads.py + - sucht, welche Downloaddateien noch nicht in der Datenbank erfasst sind, und lässt sie den Benutzer hinzufügen (oder zum ignorieren vormerken) +- getCVS.py + - gibt die kommenden Wettkämpfe als csv aus zum Import in die Onlinedatenbank + - die offline Datenbank kennt nicht: + - die laufenden Nummern der Wettkämpfe in der Onlinedatenbank + - den Inhalt der Onlinedatenbank + Deshalb müssen: + - die Reihenfolge der Spaltennamen muss beim Import in phpmyadmin manuell mit angegeben werden (Datum, Veranstaltung, Altersklassen, Ort, Ausschreibung, Routenplaner) + - schon in der Onlinedatenbank vorhandene Wettkämpfe entfernt werden (wird auch so bleiben müssen, bis ich eine 'Synchronisation' der beiden Datenbanken hinbekomme) + +Datenbankstruktur: + + Tabellen: + - downloads (Tabelle für alle Ausschreibungen im Downloadverzeichnis + - id INTEGER PRIMARY KEY ASC + - dateiname TEXT + - sha256 TEXT + - wkID TEXT (die IDs der Wettkämpfe dieser Ausschreibung per Whitespace getrennt) + - adressen (Tabelle für die Addressen der Wettkampforte) + - id INTEGER PRIMARY KEY ASC + - verein TEXT + - ort TEXT + - plz TEXT + - straße TEXT + - hausnr TEXT + - lat TEXT + - lon TEXT + - wk (Tabelle für die Wettkämpfe) + - id INTEGER PRIMARY KEY ASC + - name TEXT + - datum TEXT + - ak TEXT + - adrID TEXT + - ausschrID TEXT (id der ausschreibung in der downloadliste zum Wettkampf) diff --git a/wkOrg/wkScraper-JvsCal.py b/wkOrg/wkScraper-JvsCal.py new file mode 120000 index 0000000..be4adcf --- /dev/null +++ b/wkOrg/wkScraper-JvsCal.py @@ -0,0 +1 @@ +../submodules/wkOrg/src/wkScraper/wkScraper-JvsCal.py \ No newline at end of file