updated announcement download to new jvs calendar structure

This commit is contained in:
marko
2023-03-05 19:12:11 +01:00
parent fbafed809d
commit f44efe29db
7 changed files with 234 additions and 0 deletions

1
submodules/wkOrg Submodule

Submodule submodules/wkOrg added at 41fe0c5a45

14
wkOrg/Makefile Executable file
View File

@@ -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:

82
wkOrg/checkDownloads.py Executable file
View File

@@ -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()

55
wkOrg/getCSV.py Executable file
View File

@@ -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])

41
wkOrg/newNoticeCheck.py Executable file
View File

@@ -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()

40
wkOrg/readMe.md Executable file
View File

@@ -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)

1
wkOrg/wkScraper-JvsCal.py Symbolic link
View File

@@ -0,0 +1 @@
../submodules/wkOrg/src/wkScraper/wkScraper-JvsCal.py