def GetTournaments(): if (loglvl == 1): print("GetTournaments") #Debugging:Die Funktion wurde aufgerufen #Abfrage nach den Turnieren in den naechsten 6 Wochen, die noch nicht verarbeitet wurden. cursor = cnxTurnier.cursor( ) #Erstelle ein MySQL Cursor Objekt, welches in der Lage ist SQL Queries auszufuehren query = ( "SELECT ID From turnier WHERE Datum BETWEEN %s AND %s AND casted = 0" ) # %s sind Platzhalter. today = datetime.date.today() nextDate = datetime.date.today() + datetime.timedelta( weeks=6) #Heute + 6 Wochen if (loglvl == 2): print("Query: " + query + " Heute: " + str(today) + " Ende: " + str(nextDate)) #Debugge ggf. die SQL Query cursor.execute( query, (today, nextDate) ) #Fuehre die SQL Abfrage aus und ersetze die %s Platzhalter durch die angegebenen Variablen in den Klammern tournaments = formatize.format( cursor.fetchall() ) #Uebergib das im Cursor gespeicherte Ergebnis aufgrund des eigenartigen Datenformats "(1,)" an die Funktion zur Formatierung und Speichere die Werte in der Variable (Typ: Liste) cursor.close( ) #Schließe den Cursor um eine Timeout der Datenbank zu verhindern if (loglvl == 1): print("TurnierIDs: " + str(tournaments)) #Debugging return tournaments #Gib die Liste der Turniere zurueck Format: "(TurnierID, TurnierID,...)"
def FindFencers(altersklassen, weapons, TurID): #Finde Fechter fuer auf die diese Bedingungen zutreffen if (loglvl ==1): print("FindFencers") cursor = cnxTurnier.cursor() matchingFencers = list() #Die Fechter deren Waffe und Altersklasse mit der des Turniers uebereinstimmen (Liste) for rowAK in altersklassen: #Iteriere ueber die Liste der Alterklassen if (loglvl ==1): #Einige Debugging Infos print("") print("Turnier ID: " + str(TurID)) print("Altersklasse ID: " + str(rowAK)) queryZeitraum = ("SELECT Beginn , Ende FROM jahrgaenge WHERE ID =") queryZeitraum += str(rowAK) #Appende die Jahrgangs ID an die Query if (loglvl == 2): print ("Zeitraum: " + queryZeitraum) cursor.execute(queryZeitraum) zeitraum = cursor.fetchall() #Da hier zwei Werte zurueck gegeben werden ist ein Formatieren nicht noetig for rowZ in zeitraum: #Speichere den Zeitraum in lesbareren Variablen beginn = rowZ[0] ende = rowZ[1] if (loglvl ==1): print("Beginn: " + str(beginn) + " Ende: " + str(ende)) queryFencers = ("SELECT DISTINCT ID From fechter as f JOIN fechterwaffe AS fw ON f.ID = fw.FechterID WHERE Jahrgang BETWEEN %s AND %s AND WaffeID =") #Alle Fechter deren Geburtsjahr innerhalb der erfragten Altersklasse liegt und ihre Waffe übereinstimmt if (len(weapons) == 1): #Ist das Turnier fuer eine oder zwei Waffen? queryFencers += str(weapons[0]) #Appende die ID der Waffe if (loglvl ==2): print("Eine WaffenID: " + str(queryFencers)) if (len(weapons) == 2): #Wenn ein Turnier fuer deide Waffen verfuegbar ist, frage auch beide ab. Durch DISTINCT erscheint jeder Fechter nur einmal queryFencers += str(weapons[0]) + " OR WaffeID =" + str(weapons[1]) if (loglvl ==2): print("Zwei WaffenIDs: " + str(queryFencers)) else: #Should never happen, sonst informiere welches Turnier keine Waffen hat und beende exit("[ERR]Keine Waffe angegeben in diesem Turnier "+ str(TurID)) cursor.execute(queryFencers, (beginn , ende)) #Fuege Beginn und Ende beim Between (%s) ein matchingFencers.extend(formatize.format(cursor.fetchall())) #Haenge die neuen Fechter an die matchingFencers Liste an. if (loglvl ==1): print("matchingFencers: " + str(matchingFencers)) print("") cursor.close() #Sorge dafuer, dass fuer dieses Turnier jeder Fechter nur einmal vorhanden ist #Eine Mehrfachselection kann durch Ueberschneidungen in den Altersklassen entstehen #set ist ein Datentyp, in dem jeder Wert nur einmal vorhanden sein kann uniqueFencers = list(set(matchingFencers)) return uniqueFencers
def CheckWeapon(TurID): #Frage die Waffen fuer ein Turnier ab if (loglvl ==1): print("CheckWeapon") cursor = cnxTurnier.cursor() query = ("SELECT WaffeID FROM waffetur WHERE TurnierID =") query += str(TurID) #Da ein insert via %s fehlschlug der Umweg ueber append if (loglvl == 2): print ("Query: " + query) cursor.execute(query) weapon = formatize.format(cursor.fetchall()) #Fromatiere und gib eine Liste im Format "(WaffeID,WaffeID,...)" zurueck cursor.close() return weapon
def GetAge(TurID): #Frage die Altersklassen fuer dieses Turnier ab if (loglvl == 1): print("GetAge") cursor = cnxTurnier.cursor() query = ("SELECT JahrgID FROM altersklassen WHERE TurnierID =") query += str(TurID) #Da ein insert via %s fehlschlug der Umweg ueber append if (loglvl == 2): print ("Query: " + query) cursor.execute(query) alterskl = formatize.format(cursor.fetchall()) #Auch hier wieder die Formatierung if (loglvl == 1): print ("Altersklassen:" + alterskl) #Debugging cursor.close() return alterskl #Gib die Altersklassen zurueck Format: Liste "(altersklID, altersklID,...)"
def CheckWeapon(TurID): #Frage die Waffen fuer ein Turnier ab if (loglvl == 1): print("CheckWeapon") cursor = cnxTurnier.cursor() query = ("SELECT WaffeID FROM waffetur WHERE TurnierID =") query += str( TurID) #Da ein insert via %s fehlschlug der Umweg ueber append if (loglvl == 2): print("Query: " + query) cursor.execute(query) weapon = formatize.format( cursor.fetchall() ) #Fromatiere und gib eine Liste im Format "(WaffeID,WaffeID,...)" zurueck cursor.close() return weapon
def GetAge(TurID): #Frage die Altersklassen fuer dieses Turnier ab if (loglvl == 1): print("GetAge") cursor = cnxTurnier.cursor() query = ("SELECT JahrgID FROM altersklassen WHERE TurnierID =") query += str( TurID) #Da ein insert via %s fehlschlug der Umweg ueber append if (loglvl == 2): print("Query: " + query) cursor.execute(query) alterskl = formatize.format( cursor.fetchall()) #Auch hier wieder die Formatierung if (loglvl == 1): print("Altersklassen:" + alterskl) #Debugging cursor.close() return alterskl #Gib die Altersklassen zurueck Format: Liste "(altersklID, altersklID,...)"
def GetTournaments(): if (loglvl ==1): print("GetTournaments")#Debugging:Die Funktion wurde aufgerufen #Abfrage nach den Turnieren in den naechsten 6 Wochen, die noch nicht verarbeitet wurden. cursor = cnxTurnier.cursor() #Erstelle ein MySQL Cursor Objekt, welches in der Lage ist SQL Queries auszufuehren query = ("SELECT ID From turnier WHERE Datum BETWEEN %s AND %s AND casted = 0") # %s sind Platzhalter. today = datetime.date.today() nextDate = datetime.date.today() + datetime.timedelta(weeks=6) #Heute + 6 Wochen if (loglvl == 2): print ("Query: " + query + " Heute: " + str(today) + " Ende: " + str(nextDate))#Debugge ggf. die SQL Query cursor.execute(query, (today, nextDate)) #Fuehre die SQL Abfrage aus und ersetze die %s Platzhalter durch die angegebenen Variablen in den Klammern tournaments = formatize.format(cursor.fetchall()) #Uebergib das im Cursor gespeicherte Ergebnis aufgrund des eigenartigen Datenformats "(1,)" an die Funktion zur Formatierung und Speichere die Werte in der Variable (Typ: Liste) cursor.close() #Schließe den Cursor um eine Timeout der Datenbank zu verhindern if (loglvl ==1): print("TurnierIDs: " + str(tournaments)) #Debugging return tournaments #Gib die Liste der Turniere zurueck Format: "(TurnierID, TurnierID,...)"
def Inform(informQuery, TurID): #Schreibe die Emails if (loglvl == 1): print("Inform") if (loglvl == 1): print("Fechter IDs " + str(informQuery) + " fuer TurnierID: " + str(TurID)) #Hole weitere Turnierangaben cursor = cnxTurnier.cursor() #Frage nun die Daten des Turniers ab, welche fuer eine Mail noetig sind queryTournament = ( "SELECT Name , Ausschreibung , Pflichtturnier , Datum , Ort FROM turnier WHERE ID =" ) queryTournament += str(TurID) if (loglvl == 2): print(queryTournament) cursor.execute(queryTournament) turnier = formatize.format(cursor.fetchall()) TurName = turnier[0] TurLink = turnier[1] TurPflicht = turnier[2] TurDatum = turnier[3].strftime( "%a, den %d. %b %Y" ) #Formatiere das Datum nach Tag, den TT. Monat YYYY TurOrt = turnier[4] if (loglvl == 1): print(TurName) print(TurLink) print(TurPflicht) print(TurDatum) print(TurOrt) print("Die Daten des Turniers: " + str(turnier)) #####Erstelle die Email##### mail = "Hallo zusammen, \n" mail += "In kürze steht ein neues Turnier an:\n" mail += "Das " + str(TurName) + ".\n" mail += "Es findet am " + str(TurDatum) + " in " + str( TurOrt) + " statt.\n" mail += "Eine Ausschreibung findet sich unter folgendem Link: <a href='" + str( TurLink) + "'>" + str(TurLink) + "</a>\n" if (TurPflicht == 1): mail += "Dieses Turnier ist ein wichtiges lokales Turnier und es ist ärgerlich dieses zu verpassen\n" #Fuege einen besonderen Hinweis auf wichtige bzw. ortsnahe Turniere hinzu mail += "Bitte meldet euch rechtzeitig zurück, ob ihr starten könnt\n" mail += "Mit Fechtergruß\n" mail += "--)--------" mail += "Das Turniermanagmentsystem des FC Lütjensee" mail = mail.decode('utf-8') #Konvertiere den Text zu utf-8 if (loglvl == 1): print(mail) if (test == 0): #Sollen Mails versendet werden? try: #Versuche eine Verbindung zum Mailserver herzustellen s = smtplib.SMTP('localhost') except: quit("Der Mailserver konnte nicht erreicht werden") msg = MIMEText(mail, 'plain', 'utf-8') msg["Subject"] = "Ein Turnier kommt: " + str(TurName) msg["From"] = "*****@*****.**" for fechter in informQuery: if (loglvl == 1): print("FechterID: " + str(fechter)) queryMail = ("SELECT Email FROM fechter WHERE ID=" ) #Hole die Mailadresse des Fechters queryMail += str(fechter) if (loglvl == 2): print(queryMail) cursor.execute(queryMail) dump = formatize.format( cursor.fetchall()) #Formatiere die Mailadresse email = str( dump[0].decode("utf-8") ) #Formatiere die Mailadresse zu utf-8 um Probleme mit dem @ zu verhindern if (loglvl == 1): print("Emailadresse: " + email) #Verfollstaendige das Mail-Formular msg["To"] = email ##Versende die Email## s.sendmail("*****@*****.**", email, msg.as_string()) # s.quit() ##Schließe die Verbindung zum Mailserver else: print( mail ) #Schreibe die Mail in die Konsole sofern dies mit test != 0 erwünscht ist cursor.close()
def FindFencers( altersklassen, weapons, TurID): #Finde Fechter fuer auf die diese Bedingungen zutreffen if (loglvl == 1): print("FindFencers") cursor = cnxTurnier.cursor() matchingFencers = list( ) #Die Fechter deren Waffe und Altersklasse mit der des Turniers uebereinstimmen (Liste) for rowAK in altersklassen: #Iteriere ueber die Liste der Alterklassen if (loglvl == 1): #Einige Debugging Infos print("") print("Turnier ID: " + str(TurID)) print("Altersklasse ID: " + str(rowAK)) queryZeitraum = ("SELECT Beginn , Ende FROM jahrgaenge WHERE ID =") queryZeitraum += str(rowAK) #Appende die Jahrgangs ID an die Query if (loglvl == 2): print("Zeitraum: " + queryZeitraum) cursor.execute(queryZeitraum) zeitraum = cursor.fetchall( ) #Da hier zwei Werte zurueck gegeben werden ist ein Formatieren nicht noetig for rowZ in zeitraum: #Speichere den Zeitraum in lesbareren Variablen beginn = rowZ[0] ende = rowZ[1] if (loglvl == 1): print("Beginn: " + str(beginn) + " Ende: " + str(ende)) queryFencers = ( "SELECT DISTINCT ID From fechter as f JOIN fechterwaffe AS fw ON f.ID = fw.FechterID WHERE Jahrgang BETWEEN %s AND %s AND WaffeID =" ) #Alle Fechter deren Geburtsjahr innerhalb der erfragten Altersklasse liegt und ihre Waffe übereinstimmt if (len(weapons) == 1): #Ist das Turnier fuer eine oder zwei Waffen? queryFencers += str(weapons[0]) #Appende die ID der Waffe if (loglvl == 2): print("Eine WaffenID: " + str(queryFencers)) if ( len(weapons) == 2 ): #Wenn ein Turnier fuer deide Waffen verfuegbar ist, frage auch beide ab. Durch DISTINCT erscheint jeder Fechter nur einmal queryFencers += str(weapons[0]) + " OR WaffeID =" + str(weapons[1]) if (loglvl == 2): print("Zwei WaffenIDs: " + str(queryFencers)) else: #Should never happen, sonst informiere welches Turnier keine Waffen hat und beende exit("[ERR]Keine Waffe angegeben in diesem Turnier " + str(TurID)) cursor.execute( queryFencers, (beginn, ende)) #Fuege Beginn und Ende beim Between (%s) ein matchingFencers.extend(formatize.format(cursor.fetchall( ))) #Haenge die neuen Fechter an die matchingFencers Liste an. if (loglvl == 1): print("matchingFencers: " + str(matchingFencers)) print("") cursor.close() #Sorge dafuer, dass fuer dieses Turnier jeder Fechter nur einmal vorhanden ist #Eine Mehrfachselection kann durch Ueberschneidungen in den Altersklassen entstehen #set ist ein Datentyp, in dem jeder Wert nur einmal vorhanden sein kann uniqueFencers = list(set(matchingFencers)) return uniqueFencers
cursor = cnxTurnier.cursor() #################SAEBEL############################################################################################################################################### querySabour = ("SELECT Name, Ausschreibung, Datum, Ort, ID FROM turnier AS t JOIN waffetur AS wt ON t.ID = wt.TurnierID WHERE Kalender=0 AND WaffeID=0") cursor.execute(querySabour) SabourEvents = cursor.fetchall() WaffeID = 0 for event in SabourEvents: #Gehe fuer jedes gefundene Turnier einzeln vor Turnier = event[0].encode('utf-8') #Auch hier wieder das Codieren in utf-8 um eventuelle Umlaute verarbeiten zu koennen Ausschreibung = str(event[1]) Datum = str(event[2]) Ort = event[3].encode('utf-8') querySabourJahrg = ("SELECT JahrgName FROM turnier AS t JOIN altersklassen AS ak ON t.ID = ak.TurnierID JOIN jahrgaenge AS jg ON ak.JahrgID = jg.ID WHERE t.ID=") querySabourJahrg += str(event[4]) cursor.execute(querySabourJahrg) Jahrgaenge = str(formatize.format(cursor.fetchall())) if (loglvl == 1): print Turnier + " " + Ausschreibung + " " + Datum + " " + Ort + " " + Jahrgaenge #Sende die Saebelturniere an den Kalender PushEvent(WaffeID, Turnier, Ausschreibung, Datum, Ort, Jahrgaenge) #Speichere ab, dass dieses Turnier im Saebelkalender gespeichert wurde MarkTournament(event[4], WaffeID ) #################Florett############################################################################################################################################## queryFleur = ("SELECT Name, Ausschreibung, Datum, Ort, ID FROM turnier AS t JOIN waffetur AS wt ON t.ID = wt.TurnierID WHERE Kalender=0 AND WaffeID=1") cursor.execute(queryFleur) FleurEvents = cursor.fetchall() WaffeID = 1
def Inform(informQuery, TurID): #Schreibe die Emails if (loglvl ==1): print("Inform") if (loglvl ==1): print("Fechter IDs " + str(informQuery) + " fuer TurnierID: " + str(TurID)) #Hole weitere Turnierangaben cursor = cnxTurnier.cursor() #Frage nun die Daten des Turniers ab, welche fuer eine Mail noetig sind queryTournament = ("SELECT Name , Ausschreibung , Pflichtturnier , Datum , Ort FROM turnier WHERE ID =") queryTournament += str(TurID) if (loglvl == 2): print(queryTournament) cursor.execute(queryTournament) turnier = formatize.format(cursor.fetchall()) TurName = turnier[0] TurLink = turnier[1] TurPflicht = turnier[2] TurDatum = turnier[3].strftime("%a, den %d. %b %Y") #Formatiere das Datum nach Tag, den TT. Monat YYYY TurOrt = turnier[4] if (loglvl == 1): print(TurName) print(TurLink) print(TurPflicht) print(TurDatum) print(TurOrt) print("Die Daten des Turniers: " + str(turnier)) #####Erstelle die Email##### mail = "Hallo zusammen, \n" mail += "In kürze steht ein neues Turnier an:\n" mail += "Das " + str(TurName) + ".\n" mail += "Es findet am " + str(TurDatum) + " in " + str(TurOrt) + " statt.\n" mail += "Eine Ausschreibung findet sich unter folgendem Link: <a href='" + str(TurLink) + "'>" +str(TurLink) + "</a>\n" if (TurPflicht == 1): mail += "Dieses Turnier ist ein wichtiges lokales Turnier und es ist ärgerlich dieses zu verpassen\n" #Fuege einen besonderen Hinweis auf wichtige bzw. ortsnahe Turniere hinzu mail += "Bitte meldet euch rechtzeitig zurück, ob ihr starten könnt\n" mail += "Mit Fechtergruß\n" mail += "Das Turniermanagmentsystem des FC Lütjensee" mail = mail.decode('utf-8') #Konvertiere den Text zu utf-8 if (loglvl == 1): print(mail) try: #Versuche eine Verbindung zum Mailserver herzustellen s = smtplib.SMTP('localhost') except: quit("Der Mailserver konnte nicht erreicht werden") msg = MIMEText(mail, 'plain', 'utf-8') msg["Subject"] = "Ein Turnier kommt: " + str(TurName) msg["From"] = "*****@*****.**" for fechter in informQuery: if (loglvl == 1): print("FechterID: " + str(fechter)) queryMail = ("SELECT Email FROM fechter WHERE ID=") #Hole die Mailadresse des Fechters queryMail += str(fechter) if (loglvl == 2): print(queryMail) cursor.execute(queryMail) dump = formatize.format(cursor.fetchall()) #Formatiere die Mailadresse email = str(dump[0].decode("utf-8")) #Formatiere die Mailadresse zu utf-8 um Probleme mit dem @ zu verhindern if (loglvl == 1): print("Emailadresse: " + email) #Verfollstaendige das Mail-Formular msg["To"] = email ##Versende die Email## s.sendmail("*****@*****.**", [email] , msg.as_string()) # s.quit() ##Schließe die Verbindung zum Mailserver cursor.close()