Skip to content
Extraits de code Groupes Projets
survey_maker.py 5,69 ko
Newer Older
  • Learn to ignore specific revisions
  • Brieuc Dubois's avatar
    Brieuc Dubois a validé
    import pandas as pd
    import requests
    import os
    
    
    API_URL = input("APP (API) URL: ")
    
    API_PATH = "/tmp-api/v1"
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    LOCAL_ITEMS_FOLDER = "../../frontend/static/surveys/items"
    REMOTE_ITEMS_FOLDER = "/surveys/items"
    
    # PARSE ITEMS
    
    df_items = pd.read_csv("items.csv", dtype=str)
    
    items = []
    for i, row in df_items.iterrows():
        row = row.dropna()
        id_ = int(row["id"])
    
        o = {"id": id_, "question": None, "correct": None}
        items.append(o)
    
        if "question" in row:
            o["question"] = f'text:{row["question"]}'
        elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/q.mp3"):
            o["question"] = f"audio:{REMOTE_ITEMS_FOLDER}/{id_}/q.mp3"
        elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/q.jpeg"):
            o["question"] = f"image:{REMOTE_ITEMS_FOLDER}/{id_}/q.jpeg"
        else:
            print(f"Failed to find a question for item {id_}")
    
        if "correct" in row:
            o["correct"] = int(row["correct"])
        else:
            print(f"Failed to find corect for item {id_}")
    
    
        if os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_dropdown.txt"):
            with open(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_dropdown.txt", "r") as file:
                options = file.read().split(",")
            options = [option.strip() for option in options]
            o[f"option1"] = f"dropdown:{', '.join(options)}"
        elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_radio.txt"):
            with open(f"{LOCAL_ITEMS_FOLDER}/{id_}/1_radio.txt", "r") as file:
                options = file.read().split(",")
            options = [option.strip() for option in options]
            o[f"option1"] = f"radio:{', '.join(options)}"
        else:
            for j in range(1, 9):
                op = f"option{j}"
                if op in row:
                    o[op] = "text:" + row[op]
                elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/{j}.mp3"):
                    o[op] = f"audio:{REMOTE_ITEMS_FOLDER}/{id_}/{j}.mp3"
                elif os.path.isfile(f"{LOCAL_ITEMS_FOLDER}/{id_}/{j}.jpeg"):
                    o[op] = f"image:{REMOTE_ITEMS_FOLDER}/{id_}/{j}.jpeg"
        # print(o)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    # PARSE GROUPS
    
    groups = []
    with open("groups.csv") as file:
        file.readline()
        for line in file.read().split("\n"):
            if not line:
                continue
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            id_, title, demo_, *its = line.split(",")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            id_ = int(id_)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            demo_ = True if demo_.lower() == "true" else False
    
            its = [int(x) for x in its if x]
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            groups.append({"id": id_, "title": title, "demo": demo_, "items_id": its})
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    # PARSE SURVEYS
    
    surveys = []
    with open("surveys.csv") as file:
        file.readline()
        for line in file.read().split("\n"):
            if not line:
                continue
            id_, title, *gps = line.split(",")
            id_ = int(id_)
    
            gps = [int(x) for x in gps if x]
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            surveys.append({"id": id_, "title": title, "groups_id": gps})
    
    # SESSION DATA
    
    username = input("Email: ")
    password = input("Password: ")
    
    session = requests.session()
    
    
    response_code = session.post(
        f"{API_URL}{API_PATH}/auth/login", json={"email": username, "password": password}
    ).status_code
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    assert (
    
        response_code == 200
    ), f"Probably wrong username or password. Status code: {response_code}"
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    # CREATE ITEMS
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    for item in items:
        assert session.delete(
    
            f'{API_URL}{API_PATH}/surveys/items/{item["id"]}'
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        ).status_code in [404, 204], f'Failed to delete item {item["id"]}'
    
        r = session.post(f"{API_URL}{API_PATH}/surveys/items", json=item)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        if r.status_code not in [201]:
            print(f'Failed to create item {item["id"]}: {r.text}')
    
            continue
        else:
            n_items += 1
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    else:
    
        print(f"Successfully created {n_items}/{len(items)} items")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    # CREATE GROUPS
    
    
    n_groups = 0
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    for group in groups:
        group = group.copy()
        its = group.pop("items_id")
        assert session.delete(
    
            f'{API_URL}{API_PATH}/surveys/groups/{group["id"]}'
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        ).status_code in [404, 204], f'Failed to delete group {group["id"]}'
    
        r = session.post(f"{API_URL}{API_PATH}/surveys/groups", json=group)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        if r.status_code not in [201]:
            print(f'Failed to create group {group["id"]}: {r.text}')
    
            continue
        else:
            n_groups += 1
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
        for it in its:
            assert session.delete(
    
                f'{API_URL}{API_PATH}/surveys/groups/{group["id"]}/items/{it}'
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            ).status_code in [
                404,
                204,
            ], f'Failed to delete item {it} from group {group["id"]}'
            r = session.post(
    
                f'{API_URL}{API_PATH}/surveys/groups/{group["id"]}/items',
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
                json={"question_id": it},
            )
            if r.status_code not in [201]:
                print(f'Failed to add item {it} to group {group["id"]}: {r.text}')
    
                continue
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    else:
    
        print(f"Successfully created {n_groups}/{len(groups)} groups")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    # CREATE SURVEYS
    
    
    n_surveys = 0
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    for survey in surveys:
        survey = survey.copy()
        gps = survey.pop("groups_id")
    
        assert session.delete(
            f'{API_URL}{API_PATH}/surveys/{survey["id"]}'
        ).status_code in [
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            404,
            204,
        ], f'Failed to delete survey {survey["id"]}'
    
        r = session.post(f"{API_URL}{API_PATH}/surveys", json=survey)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        if r.status_code not in [201]:
            print(f'Failed to create suvey {survey["id"]}: {r.text}')
    
            continue
        else:
            n_surveys += 1
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
        for gp in gps:
            assert session.delete(
    
                f'{API_URL}{API_PATH}/surveys/{survey["id"]}/groups/{gp}'
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            ).status_code in [
                404,
                204,
            ], f'Failed to delete gp {gp} from survey {survey["id"]}'
            r = session.post(
    
                f'{API_URL}{API_PATH}/surveys/{survey["id"]}/groups', json={"group_id": gp}
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            )
            if r.status_code not in [201]:
                print(f'Failed to add group {gp} to survey {survey["id"]}: {r.text}')
                break
    
    else:
    
        print(f"Successfully created {n_surveys}/{len(surveys)} surveys")