示例#1
0
def test_get_close_db(app):
    with app.app_context():
        db = get_db()
        assert db is get_db()

    with pytest.raises(sqlite3.ProgrammingError) as e:
        db.execute('SELECT 1')

    assert 'closed' in str(e)
示例#2
0
def index():
    db = get_db()
    conf = configparser.ConfigParser()
    conf.read(os.path.join(current_app.instance_path, 'config.ini'))

    # Komunikacja z bazą
    nauczyciele = db.execute(
        'SELECT id, imie, nazwisko, obecny FROM nauczyciele ORDER BY nazwisko, imie'
    ).fetchall()

    # Semafor pokazywania, ze mail zostal wyslany
    success = request.args.get('show_success')
    if success:
        pass
    else:
        success = 0

    # Opcjonalne ogłoszenie
    ogloszenie = ''
    if conf['ogloszenie']['pokaz'] != str(0):
        ogloszenie = conf['ogloszenie']['tresc'].split('\n')

    # View
    return render_template('zapisy/index.html',
                           nauczyciele=nauczyciele,
                           show_success=int(success),
                           ogloszenie=ogloszenie)
示例#3
0
def confirm_email(given_confirmation_code):
    db = get_db()
    confirmation_code_present = db.execute(
        'SELECT COUNT(*) FROM wizyty WHERE kod_potwierdzajacy_email=?',
        (given_confirmation_code, )).fetchone()[0]

    if confirmation_code_present:
        db.execute(
            'UPDATE wizyty SET potwierdzony_email=1 WHERE kod_potwierdzajacy_email=?',
            (given_confirmation_code, ))
        db.commit()

        return 'Email został potwierdzony.'

    else:
        return 'Błędny kod.'
示例#4
0
def index():
    db = get_db()

    # Komunikacja z bazą
    nauczyciele = db.execute(
        'SELECT id, imie, nazwisko, obecny FROM nauczyciele').fetchall()

    # Semafor pokazywania, ze mail zostal wyslany
    success = request.args.get('show_success')
    if success:
        pass
    else:
        success = 0
    # View
    return render_template('zapisy/index.html',
                           nauczyciele=nauczyciele,
                           show_success=int(success))
示例#5
0
    def wordcloud():
        if request.method == "GET":
            db = get_db()
            try:
                test_grade = db.execute(
                    'SELECT id as value ,username as name FROM user order by id desc'
                ).fetchall()

                def rand_id(item):
                    item['value'] = 2 * random.random() + 1
                    return item

                return jsonify(
                    list(map(rand_id, [{
                        "name": i[1]
                    } for i in test_grade])))
            except Exception as e:
                return jsonify({"error": str(e)})
 def setUp(self):
     self.app = app.test_client()
     self.db = db.get_db()
示例#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'],
    )