File size: 4,558 Bytes
c525ad7
42d8ce6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c525ad7
 
 
42d8ce6
 
 
 
c525ad7
42d8ce6
c525ad7
42d8ce6
c525ad7
42d8ce6
c525ad7
42d8ce6
 
 
c525ad7
 
42d8ce6
 
c525ad7
 
42d8ce6
 
c525ad7
 
42d8ce6
c525ad7
42d8ce6
c525ad7
42d8ce6
 
 
c525ad7
42d8ce6
 
 
c525ad7
 
42d8ce6
c525ad7
42d8ce6
 
 
 
 
c525ad7
42d8ce6
 
 
 
 
 
 
c525ad7
 
42d8ce6
 
 
 
 
 
c525ad7
42d8ce6
c525ad7
 
 
42d8ce6
 
c525ad7
 
 
42d8ce6
 
 
 
 
c525ad7
 
42d8ce6
 
 
c525ad7
 
42d8ce6
 
 
c525ad7
 
 
42d8ce6
 
c525ad7
 
42d8ce6
 
 
 
 
 
 
 
c525ad7
 
42d8ce6
 
 
 
 
c525ad7
 
42d8ce6
 
 
 
 
 
 
 
 
 
c525ad7
 
 
42d8ce6
c525ad7
42d8ce6
 
 
c525ad7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# from lambda_mongo_utils import send_data_to_mongodb
from pymongo import MongoClient
from datetime import datetime
from prefect import task
import pandas as pd
import os

MONGODB_PASSWORD = os.getenv("MONGODB_PASSWORD")

blinded_connection_string = os.getenv("blinded_connection_string")

connection_string = blinded_connection_string.replace("<db_password>", MONGODB_PASSWORD)


@task
def generate_empty_well():
    dbclient = MongoClient(connection_string)
    db = dbclient["LCM-OT-2-SLD"]
    collection = db["wells"]
    rows = ["A", "B", "C", "D", "E", "F", "G", "H"]
    columns = [str(i) for i in range(1, 13)]
    for row in rows:
        for col in columns:
            well = f"{row}{col}"
            metadata = {"well": well, "status": "empty", "project": "OT2"}

            # send_data_to_mongodb(collection="wells", data=metadata)
            query = {"well": well}
            update_data = {"$set": metadata}
            result = collection.update_one(query, update_data, upsert=True)

    # close connection
    dbclient.close()


@task
def update_used_wells(used_wells):
    dbclient = MongoClient(connection_string)
    db = dbclient["LCM-OT-2-SLD"]
    collection = db["wells"]

    for well in used_wells:
        metadata = {"well": well, "status": "used", "project": "OT2"}
        # send_data_to_mongodb(collection="wells", data=metadata)
        query = {"well": well}
        update_data = {"$set": metadata}
        result = collection.update_one(query, update_data, upsert=True)

    # close connection
    dbclient.close()


@task
def find_unused_wells():
    dbclient = MongoClient(connection_string)
    db = dbclient["LCM-OT-2-SLD"]
    collection = db["wells"]
    query = {"status": "empty"}
    response = list(collection.find(query))
    df = pd.DataFrame(response)

    # Extract the "well" column as a list
    if "well" not in df.columns:
        raise ValueError("No available wells.")

    # Sort obtained list
    def well_sort_key(well):
        row = well[0]  # A, B, C, ...
        col = int(well[1:])  # 1, 2, ..., 12
        return (row, col)

    empty_wells = sorted(df["well"].tolist(), key=well_sort_key)
    # print(empty_wells)

    # close connection
    dbclient.close()

    # Check if there are any empty wells
    if len(empty_wells) == 0:
        raise ValueError("No empty wells found")
    # print(empty_wells)
    return empty_wells


@task
def save_result(result_data):
    dbclient = MongoClient(connection_string)
    db = dbclient["LCM-OT-2-SLD"]
    collection = db["MSE403_result"]
    # collection = db["test_result"]
    result_data["timestamp"] = datetime.utcnow()  # UTC time
    insert_result = collection.insert_one(result_data)
    inserted_id = insert_result.inserted_id
    # close connection
    dbclient.close()
    return inserted_id


def get_student_quota(student_id):
    with MongoClient(connection_string) as client:
        db = client["LCM-OT-2-SLD"]
        collection = db["student"]
        student = collection.find_one({"student_id": student_id})
        if student is None:
            raise ValueError(f"Student ID '{student_id}' not found in the database.")
        return student.get("quota", 0)


def decrement_student_quota(student_id):
    dbclient = MongoClient(connection_string)
    db = dbclient["LCM-OT-2-SLD"]
    collection = db["student"]

    student = collection.find_one({"student_id": student_id})
    if not student:
        return f"Student ID {student_id} not found."
    if student.get("quota", 0) <= 0:
        return f"Student ID {student_id} has no remaining quota."

    result = collection.update_one(
        {"student_id": student_id, "quota": {"$gt": 0}}, {"$inc": {"quota": -1}}
    )

    if result.modified_count > 0:
        return f"Student ID {student_id}'s quota update successfully."
    else:
        return f"Quota update failed for Student ID {student_id}."


def add_student_quota(student_id, quota):
    """
    Adds a new student with a given quota.
    :param student_id: The ID of the student.
    :param quota: The initial quota for the student.
    """
    dbclient = MongoClient(connection_string)
    db = dbclient["LCM-OT-2-SLD"]
    collection = db["student"]
    student_data = {"student_id": student_id, "quota": quota}
    collection.update_one(
        {"student_id": student_id}, {"$set": student_data}, upsert=True
    )
    dbclient.close()


if __name__ == "__main__":
    generate_empty_well()
    # find_unused_wells()
    # test_id = "test"
    # quota = 999
    # add_student_quota(test_id, quota)