LORIS_timepoint.increaseTimepoint()   A
last analyzed

Complexity

Conditions 5

Size

Total Lines 31
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 31
rs 9.1832
c 0
b 0
f 0
cc 5
nop 2
1
import sys
2
import os
3
import json
4
import argparse
5
import getpass
6
import logging
7
from dotenv import load_dotenv
8
from LORIS_query import number_extraction, getCNBP, putCNBP, login
9
from LORIS_candidates import check_DCCID, checkDCCIDExist
10
11
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
12
13
14
def visit_number_extraction(string):
15
    """
16
    A wrapper for number_extraction by calling it on a string and then return the latest one.
17
    Used to deal with visitnumber list.
18
    :param string:
19
    :return:
20
    """
21
    logger = logging.getLogger('visit_number_extraction')
22
23
    number_extracted = number_extraction(string)
24
25
    #return last number from the timepoint string: usually it should be V2 or T3 things like that.
26
    if len(number_extracted) > 1:
27
        return number_extracted[len(number_extracted)-1]
28
    else:
29
        return number_extracted[0]
30
31
32
def findLatestTimePoint(token, DCCID):
33
    '''
34
    Find and return the latest timepoint. Note that since DCCID exist, the record MUST ALREADY exist within the local SQLite database!
35
    :param DCCID:
36
    :return:
37
    '''
38
    logger = logging.getLogger('')
39
    assert(check_DCCID(DCCID)) # Ensure it actually first exist.
40
41
    response_success, candidate_json = getCNBP(token, r"candidates/" + str(DCCID)) # should exist as earlier check revealed.
42
43
    # preliminary exit condition
44
    if not response_success:
45
        return response_success, None
46
47
    candidate_visits_list = candidate_json.get("Visits")
48
49
    if len(candidate_visits_list) > 0:
50
        return candidate_visits_list[len(candidate_visits_list)-1] # return the LAST TIME POINT!
51
    return None
52
53
def increaseTimepoint(token, DCCID):
54
    """
55
    Increment the existing timepoint by check if DCCID existed, then get the latest one, then increment its number by creating a new timepoint.
56
    :param token: auth token
57
    :param DCCID: the DCCID of the existing subject.
58
    :return: if creation request is successful, and what label is actually created.
59
    """
60
    #todo: must handle the special edge case where timepoint reach V10 etc where two or three more digits are there!
61
62
    # ensure valid input and subject actually exist.
63
    assert (check_DCCID(DCCID))
64
    success, subject_exist = checkDCCIDExist(token, DCCID)
65
    if not subject_exist or not success:
66
        return False, None
67
68
    latest_timepoint = findLatestTimePoint(token, DCCID)
69
70
    if latest_timepoint is None:
71
        success = createTimepoint(token, DCCID, "V1")
72
    else:
73
        visit_number = visit_number_extraction(latest_timepoint)
74
        new_visit_number = int(visit_number) + 1
75
76
        load_dotenv()
77
        prefix = os.getenv("timepoint_prefix")
78
79
        timepoint_label = prefix + str(new_visit_number)
80
81
        success = createTimepoint(token, DCCID, timepoint_label)
82
83
    return success, timepoint_label
0 ignored issues
show
introduced by
The variable timepoint_label does not seem to be defined for all execution paths.
Loading history...
84
85
86
def createTimepoint(token, DCCID, time_point):
87
    """
88
    Create a timepoint of the given DCCID subject based on the timepoint provided.
89
    :param token:
90
    :param DCCID:
91
    :param time_point:
92
    :return:
93
    """
94
    endpoint = r"/candidates/"+str(DCCID)+r"/"+time_point
95
    MetaData = {"CandID": DCCID, "Visit": time_point, "Battery":"CNBP"} # default to CNBP for NOW
96
    Meta = {"Meta": MetaData}
97
    JSON = json.dumps(Meta)
98
    success, response = putCNBP(token, endpoint, JSON)
99
    # response should be null!
100
    return success
101
102
103
# Only executed when running directly.
104
if __name__ == '__main__':
105
    # print(login())
106
    # getCNBP("projects")
107
    # assert(checkPSCIDExist("CNBP0020002"))
108
    Success, token = login()
109
    # createTimePoint(token, 559776, "V9")
110
    success, latest_timepoint = increaseTimepoint(token, 635425)
111
    print (success)
112
    print (latest_timepoint)
113
    # print("Test complete")