예제 #1
0
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")
예제 #2
0
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")
예제 #3
0
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']],
            )
예제 #4
0
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")
예제 #5
0
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']],
            )
예제 #6
0
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
    )
예제 #7
0
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'],
    )
예제 #8
0
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'],
    )