def remind_to_buy(rate_limit=True): logger.info("Started sending purchase reminders") now = datetime.now() try: with open("remind_to_buy", "r+") as timer_file: lastexec = timer_file.read() lastexec = datetime(*map(int, reversed(lastexec.split("/")))) if now - lastexec < timedelta(days=15): logger.info("Buying reminders were rate-limited") if rate_limit: return else: timer_file.seek(0) timer_file.write(get_timestamp()) except Exception: logger.info(" Reminder to buy timer file was not found") with open("remind_to_buy", "w") as timer_file: timer_file.write(get_timestamp()) for user in User.query: marked_entries = get_person_marked(user.id) items_to_purchase = [] for entry in marked_entries: if entry.status == "booked" or \ entry.status == "modified": items_to_purchase.append( (entry.item, get_person_name(entry.user_id))) if len(items_to_purchase) == 0: continue email_to_send = "Tere,\n" email_to_send += "Olete märkinud, et plaanite osta allpool loetletud kingitused kuid ei ole vastavate kingituste staatust uuendanud vähemalt viisteist päeva eelnevast meeldetuletusest:\n" email_to_send += "\n" email_to_send += "Kingitus | Kellele\n" for item in items_to_purchase: email_to_send += "\"" email_to_send += item[0] email_to_send += "\" - " email_to_send += item[1] email_to_send += "\n" email_to_send += "\n" email_to_send += "Palun mitte unustada\n" email_to_send += "Jõulurakendus🎄" mail.send_message(subject="Meeldetuletus kinkide kohta", body=email_to_send, recipients=[user.email]) logger.info("Finished sending purchase reminders")
def remind_about_change(rate_limit=True): logger.info(" Started sending change reminders") now = datetime.now() try: with open("remind_about_change", "r+") as timer_file: lastexec = timer_file.read() lastexec = datetime(*map(int, reversed(lastexec.split("/")))) if now - lastexec < timedelta(hours=6): logger.info(" Changing reminders were rate-limited") if rate_limit: return else: timer_file.seek(0) timer_file.write(get_timestamp()) except Exception: logger.info(" Change reminder timer file was not found") with open("remind_about_change", "w") as timer_file: timer_file.write(get_timestamp()) for user in User.query: marked_entries = get_person_marked(user.id) items_to_purchase = [] for entry in marked_entries: if entry.status == "modified": items_to_purchase.append( (entry.item, get_person_name(entry.user_id))) if len(items_to_purchase) == 0: continue email_to_send = "Tere,\n" email_to_send += "Viimase päeva jooksul on muudetud allpool loetletud soove, on oluline, et otsustaksite kas soovite ikka kinki osta või vabastate selle teistele:\n" email_to_send += "\n" email_to_send += "Kingitus | Kellele\n" for item in items_to_purchase: email_to_send += "\"" email_to_send += item[0] email_to_send += "\" - " email_to_send += item[1] email_to_send += "\n" email_to_send += "\n" email_to_send += "Palume päeva jooksul enda otsus uuesti süsteemi sisestada\n" email_to_send += "Jõulurakendus 🎄" mail.send_message(subject="Meeldetuletus kinkide kohta", body=email_to_send, recipients=[user.email]) logger.info("Finished sending change reminders")
def send_mails(): db = sqlite3.connect(os.path.join(current_app.instance_path, 'main.sqlite')) db.row_factory = sqlite3.Row conf = configparser.ConfigParser() conf.read(os.path.join(current_app.instance_path, 'config.ini')) rodzice = db.execute( 'SELECT rodzice.email AS email_rodzica ' 'FROM wizyty JOIN rodzice ON wizyty.id_rodzica = rodzice.id ' 'GROUP BY email_rodzica').fetchall() for rodzic in rodzice: rodzic = rodzic['email_rodzica'] wizyty = db.execute( 'SELECT * ' 'FROM wizyty w JOIN nauczyciele n ' 'ON n.id=w.id_nauczyciela ' 'JOIN rodzice r ON r.id=w.id_rodzica ' 'WHERE r.email = ? AND obecny = 1', (rodzic, )).fetchall() mail.send_message( subject='Podsumowanie zapisów na dzień otwarty {}'.format( conf['dzien otwarty']['data']), html=render_template('email/podsumowanie_rodzic.html', wizyty=wizyty), recipients=[rodzic], ) nauczyciele = db.execute('SELECT * FROM nauczyciele WHERE obecny = 1') for nauczyciel in nauczyciele: wizyty = db.execute( 'SELECT imie_ucznia, nazwisko_ucznia, godzina, ' 'rodzice.imie AS imie_rodzica, rodzice.nazwisko AS nazwisko_rodzica ' 'FROM wizyty JOIN rodzice ON wizyty.id_rodzica = rodzice.id ' 'WHERE id_nauczyciela = ?', (nauczyciel['id'], )).fetchall() if nauczyciel['email'] != '?' and wizyty: mail.send_message( subject='Podsumowanie zapisów na dzień otwarty {}'.format( conf['dzien otwarty']['data']), html=render_template('email/podsumowanie_nauczyciel.html', wizyty=wizyty), recipients=[nauczyciel['email']], )
def remind_to_add(rate_limit=True): logger.info("Started sending adding reminders") now = datetime.now() try: with open("remind_to_add", "r+") as timer_file: lastexec = timer_file.read() lastexec = datetime(*map(int, reversed(lastexec.split("/")))) if now - lastexec < timedelta(days=30): logger.info(" Adding reminders were rate-limited") if rate_limit: return else: timer_file.seek(0) timer_file.write(get_timestamp()) except Exception: logger.info(" Adding reminders rate-limit file was not found") with open("remind_to_add", "w") as timer_file: timer_file.write(get_timestamp()) for user in User.query: if user.last_activity_at: if now - datetime( *map(int, user.last_activity_at.split("/"))) < timedelta( days=15): continue email_to_send = "Tere,\n" email_to_send += "Tegemist on väikese meeldetuletusega enda nimekirja koostamisele hakata mõtlema\n" email_to_send += "\n" email_to_send += "Kirja saavad kõik kasutajad kes ei ole vähemalt 15 päeva sisse loginud\n" email_to_send += "Jõulurakendus 🎄" mail.send_message(subject="Meeldetuletus kinkide kohta", body=email_to_send, recipients=[user.email]) logger.info("Finished sending adding reminders")
def send_mails(): db = sqlite3.connect(os.path.join(current_app.instance_path, 'main.sqlite')) db.row_factory = sqlite3.Row conf = configparser.ConfigParser() conf.read(os.path.join(current_app.instance_path, 'config.ini')) rodzice = db.execute('SELECT email_rodzica ' 'FROM wizyty ' 'GROUP BY email_rodzica').fetchall() for rodzic in rodzice: rodzic = rodzic['email_rodzica'] wizyty = db.execute( 'SELECT * ' 'FROM wizyty w JOIN nauczyciele n ' 'ON n.id=w.id_nauczyciela ' 'WHERE w.email_rodzica = ?', (rodzic, )).fetchall() mail.send_message( subject='Podsumowanie zapisów na dzień otwarty {}'.format( conf['dzien otwarty']['data']), html=render_template('email/podsumowanie_rodzic.html', wizyty=wizyty), recipients=[rodzic], ) nauczyciele = db.execute('SELECT * FROM nauczyciele') for nauczyciel in nauczyciele: wizyty = db.execute('SELECT * FROM wizyty WHERE id_nauczyciela = ?', (nauczyciel['id'], )) if wizyty: mail.send_message( subject='Podsumowanie zapisów na dzień otwarty {}'.format( conf['dzien otwarty']['data']), html=render_template('email/podsumowanie_nauczyciel.html', wizyty=wizyty), recipients=[nauczyciel['email']], )
def nauczyciel(id): db = get_db() conf = configparser.ConfigParser() conf.read(os.path.join(current_app.instance_path, 'config.ini')) if request.method == 'POST': print("POST osiagniety") if request.form.get('delete') == 'true': #Nauczyciel usunięty - mail do rodziców lehrer = db.execute( 'SELECT imie, nazwisko FROM nauczyciele WHERE id = ? ', (id,)).fetchone() rodzice = db.execute( 'SELECT DISTINCT id_rodzica, imie, nazwisko, email ' 'FROM wizyty JOIN rodzice ON wizyty.id_rodzica=rodzice.id ' 'WHERE id_nauczyciela = ? ', (id,)).fetchall() for rodzic in rodzice: mail.send_message( subject='Ważna zmiana: dzień otwarty {}'.format(conf['dzien otwarty']['data']), html=render_template('email/nieobecny.html', pfname=rodzic['imie'], plname=rodzic['nazwisko'], date=conf['dzien otwarty']['data'], imie_nauczyciela=lehrer['imie'], nazwisko_nauczyciela=lehrer['nazwisko'], teraz=dt.datetime.now(), ), recipients=[rodzic['email']] ) db.execute('DELETE FROM wizyty WHERE id_nauczyciela = ?', (id,)) db.execute('DELETE FROM nauczyciele WHERE id = ?', (id,)) db.commit() return redirect(url_for('admin.admin')) imie = request.form.get('fname') nazwisko = request.form.get('lname') email = request.form.get('email') obecny = request.form.get('present') # print(imie, nazwisko, email, obecny, request.form.get('delete')) error = None if imie is None: error = 'Puste imie.' elif nazwisko is None: error = 'Puste nazwisko.' elif email is None: error = 'Pusty email.' if error is not None: flash(error) print("błąd:"+error) else: #Mail przy zmmianie obecności nauczyciela lehrer = db.execute( 'SELECT imie, nazwisko, obecny FROM nauczyciele WHERE id = ? ',(id,) ).fetchone() if (lehrer['obecny']==1 and obecny=='on') or (lehrer['obecny']==0 and (not obecny=='on')): pass else: #Zmienila sie obecnosc nauczyciela rodzice = db.execute( 'SELECT DISTINCT id_rodzica, imie, nazwisko, email ' 'FROM wizyty JOIN rodzice ON wizyty.id_rodzica=rodzice.id ' 'WHERE id_nauczyciela = ? ', (id,)).fetchall() if obecny=='on': for rodzic in rodzice: mail.send_message( subject='Ważna zmiana: dzień otwarty {}'.format(conf['dzien otwarty']['data']), html=render_template('email/znow_obecny.html', pfname=rodzic['imie'], plname=rodzic['nazwisko'], date=conf['dzien otwarty']['data'], imie_nauczyciela=lehrer['imie'], nazwisko_nauczyciela=lehrer['nazwisko'], teraz=dt.datetime.now().strftime('%d/%m/%Y o godzinie %H:%M') ), recipients=[rodzic['email']] ) else: for rodzic in rodzice: mail.send_message( subject='Ważna zmiana: dzień otwarty {}'.format(conf['dzien otwarty']['data']), html=render_template('email/nieobecny.html', pfname=rodzic['imie'], plname=rodzic['nazwisko'], date=conf['dzien otwarty']['data'], imie_nauczyciela=lehrer['imie'], nazwisko_nauczyciela=lehrer['nazwisko'], teraz=dt.datetime.now().strftime('%d/%m/%Y o godzinie %H:%M') ), recipients=[rodzic['email']] ) db.execute('UPDATE nauczyciele ' 'SET imie = ?, nazwisko = ?, email = ?, obecny = ? ' 'WHERE id = ?', (imie, nazwisko, email, 1 if obecny=='on' else 0, id)) db.commit() print("Zmieniono") #Lista zapisów dla nauczyciela terminy = db.execute( 'SELECT imie_ucznia, nazwisko_ucznia, imie AS imie_rodzica, nazwisko AS nazwisko_rodzica, godzina ' 'FROM wizyty JOIN rodzice ON wizyty.id_rodzica = rodzice.id ' 'WHERE wizyty.id_nauczyciela = ? ORDER BY godzina', (id,) ).fetchall() nauczyciel = db.execute( 'SELECT imie, nazwisko, email, obecny FROM nauczyciele WHERE id = ?',(id,) ).fetchone() return render_template('admin/nauczyciel.html', terminy = terminy, nauczyciel = nauczyciel )
def nauczyciel(id): db = get_db() conf = configparser.ConfigParser() conf.read(os.path.join(current_app.instance_path, 'config.ini')) dane_nauczyciela = db.execute( 'SELECT imie, nazwisko, obecny FROM nauczyciele WHERE id = ?', (id, )).fetchone() # Przetwarzanie zapytania (rezerwacji godziny) if request.method == 'POST': imie_ucznia = request.form.get('sfname') nazwisko_ucznia = request.form.get('slname') imie_rodzica = request.form.get('pfname') nazwisko_rodzica = request.form.get('plname') email = request.form.get('email') godzina = request.form.get('hour') rodo = request.form.get('rodo') error = None captcha_response = request.form.get('g-recaptcha-response') if not imie_ucznia: error = "Brakuje imienia ucznia." elif not nazwisko_ucznia: error = "Brakuje nazwiska ucznia." elif not imie_rodzica: error = "Brakuje imienia rodzica." elif not nazwisko_rodzica: error = "Brakuje nazwiska rodzica." elif not email: error = "Brakuje adresu e-mail." elif not rodo: error = "Brakuje zgody na przetwarzanie danych osobowych." elif not godzina or not re.match( '[0-2]?\d:[0-5]\d', godzina) or godzina != re.match( '[0-2]\d:[0-5]\d', godzina).group(0): error = "Godzina jest w nieodpowiednim formacie." #google reCAPTCHA elif int(conf['captcha']['use_captcha'])==1 \ and not captcha.checkRecaptcha(captcha_response): error = "Okropny z ciebie bot!!!" # Trzeba zrobić jakoś transakcje elif not dane_nauczyciela['obecny']: error = 'Nauczyciel nie będzie obecny na dniu otwartym.' else: if db.execute( 'SELECT * FROM wizyty ' 'WHERE id_nauczyciela = ? AND godzina = ?', (id, godzina)).fetchone() is not None: error = 'Godzina jest już zajęta.' if error is not None: print(error) flash(error) else: # Rezerwowanie terminu # Zapis rodzica rodzic = db.execute('SELECT * FROM rodzice ' 'WHERE email = ?', (email, )).fetchone() if not rodzic: db.execute( 'INSERT INTO rodzice ' '(imie, nazwisko, email) ' 'VALUES (?, ?, ?)', (imie_rodzica, nazwisko_rodzica, email)) rodzic = db.execute( 'SELECT * FROM rodzice ' 'WHERE imie = ? AND nazwisko = ? AND email = ?', (imie_rodzica, nazwisko_rodzica, email)).fetchone() db.execute( 'INSERT INTO wizyty ' '(id_nauczyciela, id_rodzica, godzina, imie_ucznia, nazwisko_ucznia)' ' VALUES (?, ?, ?, ?, ?)', (id, rodzic['id'], godzina, imie_ucznia, nazwisko_ucznia)) db.commit() # Wysyłanie maila potwierdzającego mail.send_message( subject='Dzień otwarty {}'.format( conf['dzien otwarty']['data']), html=render_template( 'email/potwierdzenie.html', pfname=imie_rodzica, plname=nazwisko_rodzica, sfname=imie_ucznia, slname=nazwisko_ucznia, hour=godzina, date=conf['dzien otwarty']['data'], dane_nauczyciela=dane_nauczyciela, link=url_for('manage.auth', key=Serializer( current_app.config['SECRET_KEY']).dumps( rodzic['id']), _external=True), ), recipients=[email]) #todo: handle & log errors return redirect(url_for('index', show_success=1)) # Ustawienie wszystkich dat start = dt.datetime.strptime( conf['dzien otwarty']['data'] + ' ' + conf['dzien otwarty']['start'], '%d/%m/%Y %H:%M') koniec = dt.datetime.strptime( conf['dzien otwarty']['data'] + ' ' + conf['dzien otwarty']['koniec'], '%d/%m/%Y %H:%M') blok = conf['dzien otwarty']['blok'] blok = [int(s) for s in blok.split(':')] blok = dt.timedelta(hours=blok[0], minutes=blok[1]) # Komunikacja z bazą zajete = db.execute('SELECT godzina FROM wizyty WHERE id_nauczyciela = ?', (id, )).fetchall() zajete = [ dt.datetime.strptime( conf['dzien otwarty']['data'] + ' ' + r['godzina'], '%d/%m/%Y %H:%M') for r in zajete ] if dane_nauczyciela is None: abort(404, 'Nauczyciel o podanym ID {0} nie znaleziony :(('.format(id)) elif not dane_nauczyciela['obecny']: abort( 404, 'Nauczyciel o podanym ID {0} ' 'nie będzie obecny na dniu otwartym. :(('.format(id)) # Liczenie wolnych godzin rozklad = [] t = start while t < koniec: if t in zajete: rozklad.append({'start': t, 'koniec': t + blok, 'wolne': False}) else: rozklad.append({'start': t, 'koniec': t + blok, 'wolne': True}) t += blok return render_template( 'zapisy/nauczyciel.html', rozklad=rozklad, imie=dane_nauczyciela['imie'], nazwisko=dane_nauczyciela['nazwisko'], use_captcha=conf['captcha']['use_captcha'], captcha_sitekey=conf['captcha']['captcha_sitekey'], )
def nauczyciel(id): db = get_db() conf = configparser.ConfigParser() conf.read(os.path.join(current_app.instance_path, 'config.ini')) dane_nauczyciela = db.execute( 'SELECT imie, nazwisko, obecny FROM nauczyciele WHERE id = ?', (id, )).fetchone() # Przetwarzanie zapytania (rezerwacji godziny) if request.method == 'POST': imie_ucznia = request.form.get('sfname') nazwisko_ucznia = request.form.get('slname') imie_rodzica = request.form.get('pfname') nazwisko_rodzica = request.form.get('plname') email = request.form.get('email') godzina = request.form.get('hour') rodo = request.form.get('rodo') error = '' if not imie_ucznia: error += "Brakuje imienia ucznia." elif not nazwisko_ucznia: error += "Brakuje nazwiska ucznia." elif not imie_rodzica: error += "Brakuje imienia rodzica." elif not nazwisko_rodzica: error += "Brakuje nazwiska rodzica." elif not email: error += "Brakuje adresu e-mail." elif not rodo: error += "Brakuje zgody na przetwarzanie danych osobowych." # Trzeba zrobić jakoś transakcje elif not dane_nauczyciela['obecny']: error = 'Nauczyciel nie będzie obecny na dniu otwartym.' else: if db.execute( 'SELECT * FROM wizyty ' 'WHERE id_nauczyciela = ? AND godzina = ?', (id, godzina)).fetchone() is not None: error = 'Godzina jest już zajęta.' if error: print(error) flash(error) else: # Rezerwowanie terminu kod_potwierdzajacy_email = os.urandom(15).hex() db.execute( 'INSERT INTO wizyty ' '(id_nauczyciela, imie_rodzica, nazwisko_rodzica, email_rodzica, ' 'imie_ucznia, nazwisko_ucznia, godzina, potwierdzony_email, kod_potwierdzajacy_email)' ' VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', (id, imie_rodzica, nazwisko_rodzica, email, imie_ucznia, nazwisko_ucznia, godzina, False, kod_potwierdzajacy_email)) db.commit() # Wysyłanie maila potwierdzającego mail.send_message(subject='Dzień otwarty {}'.format( conf['dzien otwarty']['data']), html=render_template( 'email/potwierdzenie.html', pfname=imie_rodzica, plname=nazwisko_rodzica, sfname=imie_ucznia, slname=nazwisko_ucznia, hour=godzina, date=conf['dzien otwarty']['data'], dane_nauczyciela=dane_nauczyciela, confirmation_code=kod_potwierdzajacy_email, ), recipients=[email]) #todo: handle & log errors return redirect(url_for('index', show_success=1)) # Ustawienie wszystkich dat start = dt.datetime.strptime( conf['dzien otwarty']['data'] + ' ' + conf['dzien otwarty']['start'], '%d/%m/%Y %H:%M') koniec = dt.datetime.strptime( conf['dzien otwarty']['data'] + ' ' + conf['dzien otwarty']['koniec'], '%d/%m/%Y %H:%M') blok = conf['dzien otwarty']['blok'] blok = [int(s) for s in blok.split(':')] blok = dt.timedelta(hours=blok[0], minutes=blok[1]) # Komunikacja z bazą zajete = db.execute('SELECT godzina FROM wizyty WHERE id_nauczyciela = ?', (id, )).fetchall() zajete = [ dt.datetime.strptime( conf['dzien otwarty']['data'] + ' ' + r['godzina'], '%d/%m/%Y %H:%M') for r in zajete ] if dane_nauczyciela is None: abort(404, 'Nauczyciel o podanym ID {0} nie znaleziony :(('.format(id)) elif not dane_nauczyciela['obecny']: abort( 404, 'Nauczyciel o podanym ID {0} ' 'nie będzie obecny na dniu otwartym. :(('.format(id)) # Liczenie wolnych godzin rozklad = [] t = start while t < koniec: if t in zajete: rozklad.append({'start': t, 'koniec': t + blok, 'wolne': False}) else: rozklad.append({'start': t, 'koniec': t + blok, 'wolne': True}) t += blok return render_template( 'zapisy/nauczyciel.html', rozklad=rozklad, imie=dane_nauczyciela['imie'], nazwisko=dane_nauczyciela['nazwisko'], )