示例#1
0
def create_database() -> None:
    """Procedura creaza o baza de date noua, goala, ce va retine informatiile necesare despre meciurile din Hattrick,
    necesare simularii.

    Algoritm:
    ---------
    Daca fisierul deja exista in folderul 'db', atunci nu se intampla nimic si afiseaza un mesaj de eroare.
    Altfel, creaza baza de date si afiseaza un mesaj de creare cu succes.

    Parametri:
    ---------
    Niciunul.

    Intoarce:
    ---------
    Nimic."""

    if os.path.exists(global_library.database_file_path):
        dw.show_error_window_in_thread(title='Fisier existent',
                                       message='Baza de date deja exista.')
    else:
        Base.metadata.create_all(
            create_engine(global_library.database_file_uri, echo=True))
        dw.show_info_window_in_thread(title='Succes!',
                                      message='Baza de date a fost creata.')
示例#2
0
def disconnection_engine(show_confirmation_window: bool) -> None:
    """Procedura deconecteaza aplicatia de la contul Hattrick. Sterge jetoanele access token si access token secret,
     motiv pentru care utilizatorul va trebui sa reia intreg procesul de conectare la contul de Hattrick, daca vrea
     sa aiba acces la detaliile contului sau.

     Algoritm:
     ----------
     1. Descarca fisierul XML ce este generat ca urmare a deconectarii de la cont;
     2. Elimina cele doua jetoane din fisier;
     3. Salveaza noul fisier de configurare;
     4. Afiseaza un mesaj de confirmare a deconectarii.

     Parametri:
     ----------
     show_confirmation_window: bool
        arata daca va fi afisata sau nu fereastra de confirmare.

     Intoarce:
     ----------
     Nimic."""

    d.download_xml_file(file=config['DEFAULT']['INVALIDATE_TOKEN_PATH'],
                        params={},
                        destination_file=global_library.disconnect_savepath)
    config.remove_option('DEFAULT', 'ACCESS_TOKEN')
    config.remove_option('DEFAULT', 'ACCESS_TOKEN_SECRET')
    with open(file=global_library.configuration_file, mode='w') as configfile:
        config.write(configfile)
    if show_confirmation_window:
        dw.show_info_window_in_thread(
            title='Disconnection successful!',
            message='You are disconnected from your Hattrick account!')
示例#3
0
def delete_database():
    if os.path.exists(global_library.database_file_path):
        drop_database(global_library.database_file_uri)
        dw.show_info_window_in_thread(title='Succes!',
                                      message='Baza de date a fost stearsa.')
    else:
        dw.show_error_window_in_thread(title='Esec!',
                                       message='Baza de date nu exista')
def restore_database():
    restore_database_file_name = dw.restore_backup_window_in_thread()
    with z.ZipFile(restore_database_file_name, 'r') as restore:
        restore.extractall(os.path.dirname(global_library.database_file_path))
    dw.show_info_window_in_thread(
        title='Restaurare incheiata',
        message='S-a incheiat restaurarea backupului ales')
    return render_template('admin.html')
def backup_database():
    archive_name = global_library.database_backup_path + '\\backup ' + datetime.datetime.now(
    ).strftime('%Y-%m-%d %H-%M-%S') + '.zip'
    with z.ZipFile(file=archive_name, mode='w') as backup:
        backup.write(global_library.database_file_path, arcname='matches.db')
    dw.show_info_window_in_thread(
        title='Backup terminat', message='Am terminat backupul bazei de date.')
    return render_template('admin.html')
示例#6
0
def create_database():
    if os.path.exists(global_library.database_file_path):
        dw.show_error_window_in_thread(title='Fisier existent',
                                       message='Baza de date deja exista.')
    else:
        engine = create_engine(global_library.database_file_uri, echo=True)
        Base.metadata.create_all(engine)
        dw.show_info_window_in_thread(title='Succes!',
                                      message='Baza de date a fost creata.')
示例#7
0
def disconnection_engine():
    d.download_xml_file(config['DEFAULT']['INVALIDATE_TOKEN_PATH'], {},
                        global_library.disconnect_savepath)
    config.remove_option('DEFAULT', 'ACCESS_TOKEN')
    config.remove_option('DEFAULT', 'ACCESS_TOKEN_SECRET')
    with open(global_library.configuration_file, 'w') as configfile:
        config.write(configfile)
    dw.show_info_window_in_thread(
        title='Disconnection successful!',
        message='You are disconnected from your Hattrick account!')
示例#8
0
def connection_engine() -> tuple:
    """Functia realizeaza conectarea propriu-zisa la Hattrick. Functia obtine informatiile de baza despre
    utilizatorul care s-a conectat. Deoarece procesul este aproape in totalitate automat, singurul punct in care
    omul poate interveni este la introducerea PIN-ului. Fie il poate introduce gresit, fie se poate razgandi si
    nu-l mai introduce. Din aceste motive, functia intoarce True daca procesul de conectare s-a incheiat
    (adica s-au obtinut jetoanele de acces) si False in caz contrar (cel mai probabil atunci cand PIN-ul fie nu
    este introdus corect, fie utilizatorul renunta la procedura in acest punct.

    Algoritm:
    ---------
    1. Testeaza daca se poate conecta la Hattrick. Asta inseamna ca urmatoarele 2 conditii sa fie adevarate:
        1.1. Sa existe jetoanele de acces;
        1.2. Conexiunea sa fie permisa de catre Hattrick.
    2. Daca se poate conecta la Hattrick:
        2.1. Descarca informatiile de baza;
        2.2. Intoarce True.
    3. Daca nu se poate conecta la Hattrick:
        3.1. Obtine jetoanele de access (efectueaza intreaga procedura de conectare). Daca nu poate, intoarce False;
        3.2. Descarca informatiile de baza;
        3.3. Intoarce True.

    Parametri:
    ----------
    Niciunul.

    Intoarce:
    ----------
    Un tuplu format dintr-o valoare booleana si un dictionar ce retine datele de utilizator. Daca valoarea booleana
    este True, atunci dictionarul retine datele cerute. Altfel, dictionarul este gol."""

    if check_if_configuration_file_has_access_tokens(test_config=config):
        if check_if_connection_is_valid(test_config=config):
            user_data = d.download_user_info_file()
            return True, user_data
        else:
            hd.disconnection_engine(show_confirmation_window=False)
            if get_access_tokens(test_config=config):
                dw.show_info_window_in_thread(
                    title='Connection complete!',
                    message='Successfully connected to Hattrick account')
                user_data = d.download_user_info_file()
                return True, user_data
    else:
        if get_access_tokens(test_config=config):
            dw.show_info_window_in_thread(
                title='Connection complete!',
                message='Successfully connected to Hattrick account')
            user_data = d.download_user_info_file()
            return True, user_data
        else:
            return False, {}
示例#9
0
def import_matches_into_database() -> None:
    """Procedura ce ruleaza algoritmul de importare a evaluarilor necesare in baza de date, plecand de la
    fisierele XML necesare, obtinute din Hattrick. Se apeleaza engine-ul de import, transmitandu-i limita
    inferioara si cea superioara a numerelor de identificare ale meciurilor ce trebuie introduse.

    Algoritm:
    -----------
    Incearca sa importe in baza de date meciurile cu numerele de identificare ce se afla intre cele doua limite. In
    functie de exceptiile care apar, afiseaza mesajele de eroare corespunzatoare. Indiferent de reusita operatiei
    de import, se revine la pagina panoului de control.

    Parametri:
    -----------
    Niciunul.

    Intoarce:
    -----------
    Nimic.

    Exceptii:
    ------------
    ValueError:
        In casutele in care se introduc limitele specificate mai sus, nu sunt introduse valori numerice, intregi;
    IndexError:
        Una sau amandoua dintre limitele specificate mai sus au numere negative, sau 0;
    sqlalchemy.exc.IntegrityError:
        In intervalul specificat de cele doua limite exista minim un meci al carui numar de identificare exista
        in baza de date."""

    try:
        import_matches.import_engine(low_end=int(request.form['InferiorLimit']),
                                     high_end=int(request.form['SuperiorLimit']))
    except ValueError:
        dw.show_error_window_in_thread(title='Date introduse gresit!',
                                       message='Trebuie sa introduci valori numerice intregi in ambele casute!')
    except IndexError:
        dw.show_error_window_in_thread(title='Numar inexistent!',
                                       message='Numarul de identificare al unei limite (sau a ambelor) nu exista. Cel '
                                               'mai probabil ai introdus numere mai mici sau egale cu 0, sau accesul '
                                               'programului la Hattrick a fost oprit din contul utilizatorului.')
    except sqlalchemy.exc.IntegrityError:
        dw.show_error_window_in_thread(title='Meciuri existente',
                                       message='In intervalul introdus este macar un meci care este in baza de date')
    else:
        dw.show_info_window_in_thread(title='Import terminat', message='Am importat toate meciurile alese')
    return render_template('admin.html', title='Admin Control Panel')
def connection_engine():
    """Functia obtine informatiile de baza despre utilizatorul care s-a conectat.
    Deoarece procesul este aproape in totalitate automat, singurul punct in care omul poate interveni este la
    introducerea PIN-ului. Fie il poate introduce gresit, fie se poate razgandi si nu-l mai introduce.
    Din aceste motive, functia intoarce True daca procesul de conectare s-a incheiat (adica s-au obtinut jetoanele
    de acces) si False in caz contrar (cel mai probabil atunci cand PIN-ul fie nu este introdus corect, fie
    utilizatorul renunta la procedura in acest punct.
    Algoritmul de functionare:
    1. Testeaza daca se poate conecta la Hattrick. Asta inseamna ca urmatoarele 2 conditii sa fie adevarate:
      1.1. Sa existe jetoanele de acces;
      1.2. Conexiunea sa fie permisa de catre Hattrick
    2. Daca se poate conecta la Hattrick:
      2.1. Descarca informatiile de baza;
      2.2. Intoarce True
    3. Daca nu se poate conecta la Hattrick:
      3.1. Obtine jetoanele de access (efectueaza intreaga procedura de conectare). Daca nu poate, intoarce False
      3.2. Descarca informatiile de baza
      3.3. Intoarce True."""

    if check_if_configuration_file_has_access_tokens(config):
        if check_if_connection_is_valid(config):
            user_data = d.download_user_info()
            return True, user_data
        else:
            dx.download_xml_file(config['DEFAULT']['INVALIDATE_TOKEN_PATH'],
                                 {}, global_library.disconnect_savepath)
            config.remove_option('DEFAULT', 'ACCESS_TOKEN')
            config.remove_option('DEFAULT', 'ACCESS_TOKEN_SECRET')
            with open(global_library.configuration_file, 'w') as configfile:
                config.write(configfile)
            if get_access_tokens(config):
                dw.show_info_window_in_thread(
                    title='Connection complete!',
                    message='Successfully connected to Hattrick account')
                user_data = d.download_user_info()
                return True, user_data
    else:
        if get_access_tokens(config):
            dw.show_info_window_in_thread(
                title='Connection complete!',
                message='Successfully connected to Hattrick account')
            user_data = d.download_user_info()
            return True, user_data
        else:
            return False, []
示例#11
0
def restore_database() -> None:
    """Procedura reface un backup al bazei de date, ales de catre utilizator. Prin 'refacere' se intelege inlocuirea
    bazei de date existente cu una obtinuta din dezarhivarea arhivei selectate de catre utilizator.

    Algoritm:
    ----------
    Se dezarhiveaza arhiva specificata de catre utilizator in folderul 'db', inlocuind arhiva existenta acolo. La
    final, se afiseaza un mesaj de confirmare a incheierii operatiunii.

    Parametri:
    ----------
    Niciunul.

    Intoarce:
    ----------
    Nimic."""

    with z.ZipFile(file=dw.restore_backup_window_in_thread(), mode='r') as restore:
        restore.extractall(os.path.dirname(global_library.database_file_path))
    dw.show_info_window_in_thread(title='Restaurare incheiata', message='S-a incheiat restaurarea backupului ales')
    return render_template('admin.html')
示例#12
0
def delete_database() -> None:
    """Procedura sterge baza de date in care sunt retinute datele din meciurile importate din Hattrick.

    Algoritm:
    ----------
    Daca exista fisierul ce contine baza de date in folerul 'db', atunci il sterge si afiseaza un mesaj de confirmare.
    Daca nu, atunci nu face nimic si afiseaza un mesaj de eroare.

    Parametri:
    ----------
    Niciunul

    Intoarce:
    ----------
    Nimic."""

    if os.path.exists(global_library.database_file_path):
        drop_database(global_library.database_file_uri)
        dw.show_info_window_in_thread(title='Succes!', message='Baza de date a fost stearsa.')
    else:
        dw.show_error_window_in_thread(title='Esec!', message='Baza de date nu exista')
示例#13
0
def backup_database() -> None:
    """Procedura face backup la baza de date. Mai precis, o arhiveaza.
    Numele arhivei are forma: 'backup yyyy-mm-dd hh-mm-ss.zip'.

    Algoritm:
    ----------
    Se creaza arhiva, la care se adauga baza de date. Se afiseaza un mesaj de incheiere a operatiunii si se afiseaza
    pagina panoului de control.

    Parametri:
    ----------
    Niciunul.

    Intoarce:
    ----------
    Nimic."""

    with z.ZipFile(file=global_library.database_backup_path + '\\backup ' + datetime.datetime.now().strftime(
            '%Y-%m-%d %H-%M-%S') + '.zip', mode='w') as backup:
        backup.write(global_library.database_file_path,
                     arcname='matches.db')
    dw.show_info_window_in_thread(title='Backup terminat', message='Am terminat backupul bazei de date.')
    return render_template('admin.html')
示例#14
0
def import_matches_into_database():
    import_matches.import_engine(low_end=int(request.form['InferiorLimit']),
                                 high_end=int(request.form['SuperiorLimit']))
    dw.show_info_window_in_thread(title='Import terminat',
                                  message='Am importat toate meciurile alese')
    return render_template('admin.html', title='Admin Control Panel')