level0.py 8.6 KB
Newer Older
Wei Shoulin's avatar
c3  
Wei Shoulin committed
1
2
3
4
5
6
7
8
import os
import logging
import time, datetime
import shutil

from ..common.db import DBClient
from ..common.utils import *
from csst_dfs_commons.models import Result
Wei Shoulin's avatar
Wei Shoulin committed
9
from csst_dfs_commons.models.ifs import Level0Record
Wei Shoulin's avatar
c3  
Wei Shoulin committed
10
11
12
13
14
from csst_dfs_commons.models.common import from_dict_list

log = logging.getLogger('csst')

class Level0DataApi(object):
Wei Shoulin's avatar
Wei Shoulin committed
15
16
    def __init__(self, sub_system = "ifs"):
        self.sub_system = sub_system
Wei Shoulin's avatar
c3  
Wei Shoulin committed
17
18
19
20
21
22
23
        self.root_dir = os.getenv("CSST_LOCAL_FILE_ROOT", "/opt/temp/csst")
        self.db = DBClient()

    def find(self, **kwargs):
        ''' retrieve level0 records from database

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
24
25
26
27
            obs_id: [str],
            detector_no: [str],
            obs_type: [str],
            object_name: [str],
Wei Shoulin's avatar
c3  
Wei Shoulin committed
28
29
30
            obs_time : (start, end),
            qc0_status : [int],
            prc_status : [int],
Wei Shoulin's avatar
Wei Shoulin committed
31
            file_name: [str],
Wei Shoulin's avatar
c3  
Wei Shoulin committed
32
33
34
35
36
37
38
39
            limit: limits returns the number of records,default 0:no-limit

        return: csst_dfs_common.models.Result
        '''
        try:
            obs_id = get_parameter(kwargs, "obs_id")
            detector_no = get_parameter(kwargs, "detector_no")
            obs_type = get_parameter(kwargs, "obs_type")
Wei Shoulin's avatar
Wei Shoulin committed
40
            object_name = get_parameter(kwargs, "object_name")
Wei Shoulin's avatar
c3  
Wei Shoulin committed
41
42
43
44
45
46
47
            exp_time_start = get_parameter(kwargs, "obs_time", [None, None])[0]
            exp_time_end = get_parameter(kwargs, "obs_time", [None, None])[1]
            qc0_status = get_parameter(kwargs, "qc0_status")
            prc_status = get_parameter(kwargs, "prc_status")
            file_name = get_parameter(kwargs, "file_name")
            limit = get_parameter(kwargs, "limit", 0)

Wei Shoulin's avatar
Wei Shoulin committed
48
49
            sql_count = "select count(*) as c from ifs_level0_data where 1=1"
            sql_data = f"select * from ifs_level0_data where 1=1"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
50
51

            sql_condition = "" 
Wei Shoulin's avatar
Wei Shoulin committed
52
53
            if obs_id:
                sql_condition = f"{sql_condition} and obs_id='{obs_id}'"              
Wei Shoulin's avatar
c3  
Wei Shoulin committed
54
55
56
57
            if detector_no:
                sql_condition = f"{sql_condition} and detector_no='{detector_no}'"
            if obs_type:
                sql_condition = f"{sql_condition} and obs_type='{obs_type}'"
Wei Shoulin's avatar
Wei Shoulin committed
58
59
            if object_name:
                sql_condition = f"{sql_condition} and object_name='{object_name}'"                
Wei Shoulin's avatar
c3  
Wei Shoulin committed
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
            if exp_time_start:
                sql_condition = f"{sql_condition} and obs_time >='{exp_time_start}'"
            if exp_time_end:
                sql_condition = f"{sql_condition} and obs_time <='{exp_time_end}'"
            if qc0_status:
                sql_condition = f"{sql_condition} and qc0_status={qc0_status}"
            if prc_status:
                sql_condition = f"{sql_condition} and prc_status={prc_status}"   
            if file_name:
                sql_condition = f" and filename='{file_name}'"  

            sql_count = f"{sql_count} {sql_condition}"
            sql_data = f"{sql_data} {sql_condition}"

            if limit > 0:
                sql_data = f"{sql_data} limit {limit}"   

            totalCount = self.db.select_one(sql_count)
            _, records = self.db.select_many(sql_data)

            return Result.ok_data(data=from_dict_list(Level0Record, records)).append("totalCount", totalCount['c'])

        except Exception as e:
            return Result.error(message=str(e))

    def get(self, **kwargs):
        '''  fetch a record from database

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
89
90
            id : [int],
            level0_id : [str]
Wei Shoulin's avatar
c3  
Wei Shoulin committed
91
92
93

        return csst_dfs_common.models.Result
        '''
Wei Shoulin's avatar
Wei Shoulin committed
94
95
96
97
98
99
100
101
102
103
104
105
        id = get_parameter(kwargs, "id", 0)
        level0_id = get_parameter(kwargs, "level0_id", "")

        if id == 0 and level0_id == "":
            return Result.error(message="at least define id or level0_id") 

        if id != 0: 
            return self.get_by_id(id)
        if level0_id != "": 
            return self.get_by_level0_id(level0_id)

    def get_by_id(self, id: int):
Wei Shoulin's avatar
c3  
Wei Shoulin committed
106
107
        try:
            r = self.db.select_one(
Wei Shoulin's avatar
Wei Shoulin committed
108
                "select * from ifs_level0_data where id=?", (id,))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
109
110
111
            if r:
                return Result.ok_data(data=Level0Record().from_dict(r))
            else:
Wei Shoulin's avatar
Wei Shoulin committed
112
                return Result.error(message=f"id:{id} not found")  
Wei Shoulin's avatar
c3  
Wei Shoulin committed
113
114
        except Exception as e:
            log.error(e)
Wei Shoulin's avatar
Wei Shoulin committed
115
116
117
118
119
            return Result.error(message=str(e))  

    def get_by_level0_id(self, level0_id: str):
        try:
            r = self.db.select_one(
Wei Shoulin's avatar
Wei Shoulin committed
120
                "select * from ifs_level0_data where level0_id=?", (level0_id,))
Wei Shoulin's avatar
Wei Shoulin committed
121
122
123
124
125
126
127
            if r:
                return Result.ok_data(data=Level0Record().from_dict(r))
            else:
                return Result.error(message=f"level0_id:{level0_id} not found")  
        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))  
Wei Shoulin's avatar
c3  
Wei Shoulin committed
128
129
130
131
132

    def update_proc_status(self, **kwargs):
        ''' update the status of reduction

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
133
134
            id : [int],
            level0_id : [str],
Wei Shoulin's avatar
c3  
Wei Shoulin committed
135
136
137
138
            status : [int]

        return csst_dfs_common.models.Result
        '''
Wei Shoulin's avatar
Wei Shoulin committed
139
140
141
142
143
144
145
146
        id = get_parameter(kwargs, "id")
        level0_id = get_parameter(kwargs, "level0_id")
        result = self.get(id = id, level0_id = level0_id)

        if not result.success:
            return Result.error(message="not found")

        id = result.data.id
Wei Shoulin's avatar
c3  
Wei Shoulin committed
147
148
149
        status = get_parameter(kwargs, "status")
        try:
            self.db.execute(
Wei Shoulin's avatar
Wei Shoulin committed
150
                'update ifs_level0_data set prc_status=?, prc_time=? where id=?',
Wei Shoulin's avatar
Wei Shoulin committed
151
                (status, format_time_ms(time.time()), id)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
152
153
154
155
156
157
158
159
160
161
162
163
            )  
            self.db.end() 
            return Result.ok_data()
           
        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))

    def update_qc0_status(self, **kwargs):
        ''' update the status of QC0
        
        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
164
165
            id : [int],
            level0_id : [str],
Wei Shoulin's avatar
c3  
Wei Shoulin committed
166
167
            status : [int]
        '''        
Wei Shoulin's avatar
Wei Shoulin committed
168
169
170
171
172
173
174
175
        id = get_parameter(kwargs, "id")
        level0_id = get_parameter(kwargs, "level0_id")
        result = self.get(id = id, level0_id = level0_id)

        if not result.success:
            return Result.error(message="not found")

        id = result.data.id
Wei Shoulin's avatar
c3  
Wei Shoulin committed
176
177
178
        status = get_parameter(kwargs, "status")
        try:
            self.db.execute(
Wei Shoulin's avatar
Wei Shoulin committed
179
                'update ifs_level0_data set qc0_status=?, qc0_time=? where id=?',
Wei Shoulin's avatar
Wei Shoulin committed
180
                (status, format_time_ms(time.time()), id)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
181
182
183
184
185
186
187
188
189
190
191
192
            )  
            self.db.end() 
            return Result.ok_data()
           
        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))

    def write(self, **kwargs):
        ''' insert a level0 data record into database
 
        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
193
            obs_id = [str]
Wei Shoulin's avatar
c3  
Wei Shoulin committed
194
195
196
197
198
199
200
201
202
203
204
205
206
            detector_no = [str]
            obs_type = [str]        
            obs_time = [str]
            exp_time = [int]
            detector_status_id = [int]
            filename = [str]
            file_path = [str]
        return: csst_dfs_common.models.Result
        '''          
        rec = Level0Record(
            obs_id = get_parameter(kwargs, "obs_id"),
            detector_no = get_parameter(kwargs, "detector_no"),
            obs_type = get_parameter(kwargs, "obs_type"),
Wei Shoulin's avatar
Wei Shoulin committed
207
            object_name = get_parameter(kwargs, "object_name"),
Wei Shoulin's avatar
c3  
Wei Shoulin committed
208
209
210
211
212
213
            obs_time = get_parameter(kwargs, "obs_time"),
            exp_time = get_parameter(kwargs, "exp_time"),
            detector_status_id = get_parameter(kwargs, "detector_status_id"),
            filename = get_parameter(kwargs, "filename"),
            file_path = get_parameter(kwargs, "file_path")
        )
Wei Shoulin's avatar
Wei Shoulin committed
214
        rec.level0_id = f"{rec.obs_id}{rec.detector_no}"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
215
216
        try:
            existed = self.db.exists(
Wei Shoulin's avatar
Wei Shoulin committed
217
                    "select * from ifs_level0_data where filename=?",
Wei Shoulin's avatar
c3  
Wei Shoulin committed
218
219
220
221
222
223
224
                    (rec.filename,)
                )
            if existed:
                log.warning('%s existed' %(rec.filename, ))
                return Result.error(message ='%s existed' %(rec.filename, ))

            self.db.execute(
Wei Shoulin's avatar
Wei Shoulin committed
225
226
227
                'INSERT INTO ifs_level0_data (level0_id, obs_id, detector_no, object_name, obs_type, obs_time, exp_time,detector_status_id, filename, file_path,qc0_status, prc_status,create_time) \
                    VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)',
                (rec.level0_id, rec.obs_id, rec.detector_no, rec.object_name, rec.obs_type, rec.obs_time, rec.exp_time, rec.detector_status_id, rec.filename, rec.file_path,-1,-1,format_time_ms(time.time()))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
228
229
230
231
232
233
234
235
236
237
238
            )
            self.db.end()
            rec.id = self.db.last_row_id()

            return Result.ok_data(data=rec)

        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))