plan.py 6.41 KB
Newer Older
1
import json
Wei Shoulin's avatar
| bug    
Wei Shoulin committed
2
from typing import Optional, IO, Tuple, Literal, Union
Wei Shoulin's avatar
Wei Shoulin committed
3
from .common import request, Result
Wei Shoulin's avatar
plan  
Wei Shoulin committed
4
5
DateTimeTuple = Tuple[str, str]

6
7
WRITE_BATCH_SIZE = 512

Wei Shoulin's avatar
plan  
Wei Shoulin committed
8
def find(mode: Optional[str] = None,
9
10
        obs_group: Optional[str] = None,
        proposal_id: Optional[str] = None,
Wei Shoulin's avatar
Wei Shoulin committed
11
12
13
        obs_id: Optional[str] = None,
        instrument: Literal['MSC', 'IFS', 'MCI', 'HSTDM', 'CPIC'] = 'MSC', 
        obs_type: Optional[str] = None,
14
        object: Optional[str] = None,
Wei Shoulin's avatar
plan  
Wei Shoulin committed
15
        obstime: Optional[DateTimeTuple] = None,
Wei Shoulin's avatar
Wei Shoulin committed
16
        dataset: Optional[str] = None,
Wei Shoulin's avatar
plan  
Wei Shoulin committed
17
18
19
20
21
22
        page: int = 1,
        limit: int = 0) -> Result:
    """
    根据给定的参数在DFS中搜索编排数据。
    
    Args:
Wei Shoulin's avatar
Wei Shoulin committed
23
        mode (Optional[str], optional): 观测模式,如CM1-1、OM1. Defaults to None.
24
25
        obs_group (Optional[str], optional): 观测组. Defaults to None.
        proposal_id (Optional[str], optional): 提案号. Defaults to None.
Wei Shoulin's avatar
Wei Shoulin committed
26
27
28
        obs_id (Optional[str], optional): 观测ID,支持模糊搜索. Defaults to None.
        instrument (Optional[str], optional): 模块ID,如'MSC', 'IFS'. Defaults to None.
        obs_type (Optional[str], optional): 观测类型,如主巡天宽场、TOO观测、定标星场等等. Defaults to None.
29
        object (Optional[str], optional): 目标名称. Defaults to None.
Wei Shoulin's avatar
Wei Shoulin committed
30
31
        obstime (Optional[DateTimeTuple], optional): 观测时间范围. 如("2021-08-30 00:00:00", "2024-12-30 23:59:59"),Defaults to None. 
        dataset (Optional[str], optional): 数据集名称. Defaults to constants.DEFAULT_DATASET.
Wei Shoulin's avatar
plan  
Wei Shoulin committed
32
33
34
35
36
37
38
39
40
41
        page (int, optional): 页码. Defaults to 1.
        limit (int, optional): 每页数量. Defaults to 0,不限制.
    
    Returns:
        Result: 搜索结果对象.
    
    """

    params = {
        'mode': mode,
42
43
        'obs_group': obs_group,
        'proposal_id': proposal_id,
Wei Shoulin's avatar
Wei Shoulin committed
44
45
46
        'obs_id': obs_id,
        'instrument': instrument,
        'obs_type': obs_type,
47
        'object': object,
Wei Shoulin's avatar
plan  
Wei Shoulin committed
48
49
50
51
        'obs_time_start': None,
        'obs_time_end': None,
        'create_time_start': None,
        'create_time_end': None,
Wei Shoulin's avatar
Wei Shoulin committed
52
        'dataset': dataset,
Wei Shoulin's avatar
plan  
Wei Shoulin committed
53
54
55
56
57
58
59
60
61
        'page': page,
        'limit': limit,
    }
    
    if obstime is not None:
        params['obs_time_start'], params['obs_time_end'] = obstime
    
    return request.post("/api/plan", params)

Wei Shoulin's avatar
by id    
Wei Shoulin committed
62
63
64
65
66
67
68
69
70
71
72
73
def get_by_id(_id: int) -> Result:
    """
    通过计划ID获取编排数据。
    
    Args:
        _id (int): 计划ID。
    
    Returns:
        Result: 查询结果。
    
    """
    return request.get(f"/api/plan/id/{_id}")
Wei Shoulin's avatar
plan  
Wei Shoulin committed
74
75
76
77
78
79
80
81
82
83
84
85
86
87

def find_by_opid(opid: str) -> Result:
    """
    通过 plan 的 opid 查询编排数据。
    
    Args:
        opid (str): opid。
    
    Returns:
        Result: 查询结果。
    
    """
    return request.get(f"/api/plan/{opid}")

88
def load_file(local_file: Union[IO, str, list]):
Wei Shoulin's avatar
plan  
Wei Shoulin committed
89
    """
90
91
    将本地json文件、json数据流或json数据列表写入DFS中。

Wei Shoulin's avatar
plan  
Wei Shoulin committed
92
    Args:
93
94
        local_file (Union[IO, str, list]): 文件路径、数据流或JSON数据列表。

Wei Shoulin's avatar
plan  
Wei Shoulin committed
95
    Returns:
96
        any
97
98
    """
    batch_size = 512
Wei Shoulin's avatar
plan  
Wei Shoulin committed
99
100
    
    if isinstance(local_file, str):
101
102
103
104
105
106
107
108
109
110
        with open(local_file, 'r') as f:
            data = json.load(f)
    elif isinstance(local_file, IO):
        data = json.load(local_file)
    elif isinstance(local_file, list):
        data = local_file
    else:
        raise ValueError("Unsupported type for local_file")

    if not isinstance(data, list):
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
        raise ValueError("Data must be a list of JSON objects")    
def write_file(local_file: Union[IO, str, list]) -> Result:
    """
    将本地json文件、json数据流或json数据列表写入DFS中。

    Args:
        local_file (Union[IO, str, list]): 文件路径、数据流或JSON数据列表。

    Returns:
        Result: 操作的结果对象,包含操作是否成功以及相关的错误信息,成功返回数据对象。

    """
    data = load_file(local_file)
    for i in range(0, len(data), WRITE_BATCH_SIZE):
        batch_data = data[i:i + WRITE_BATCH_SIZE]
126
        response = request.post("/api/plan/file", {"plans": batch_data})
127
        if not response.success:
128
129
            return response
    return Result.ok_data(len(data))
Wei Shoulin's avatar
plan  
Wei Shoulin committed
130

131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
def write_simulate_file(local_file: Union[IO, str, list]) -> Result:
    """
    将本地json文件、json数据流或json数据列表写入DFS中。

    Args:
        local_file (Union[IO, str, list]): 文件路径、数据流或JSON数据列表。

    Returns:
        Result: 操作的结果对象,包含操作是否成功以及相关的错误信息,成功返回数据对象。

    """
    data = load_file(local_file)
    #将data中id置为-1
    for plan in data:
        plan['id'] = -1
    for i in range(0, len(data), WRITE_BATCH_SIZE):
        batch_data = data[i:i + WRITE_BATCH_SIZE]
        response = request.post("/api/plan/file", {"plans": batch_data})
        if not response.success:
            return response
    return Result.ok_data(len(data))
Wei Shoulin's avatar
plan  
Wei Shoulin committed
152
153
154
155
156
def new(data: dict) -> Result:
    """
    新建编排数据
    
    Args:
Wei Shoulin's avatar
Wei Shoulin committed
157
        data (dict): 编排数据的字典表示,如:{'id': 394, 'opid': 'xxx', 'instrument': 'MSC', ...}
Wei Shoulin's avatar
plan  
Wei Shoulin committed
158
159
160
161
162
    
    Returns:
        Result: 成功后,Result.data为写入记录,失败message为失败原因。
    
    """
163
164
165
166
167
168
    return request.post("/api/plan/new", data)

def count_plan_level0(
        instrument: Literal['MSC', 'IFS', 'MCI', 'HSTDM', 'CPIC'], 
        obs_group: str,
        obs_type: str,
169
170
171
        dataset: str,
        obs_id: Optional[str] = None,
        prc_status: Optional[int] = None) -> Result:
172
173
174
175
176
177
178
179
    """
    统计编排和0级数据数量
    
    Args:
        instrument (Literal['MSC', 'IFS', 'MCI', 'HSTDM', 'CPIC']): 后端设备,如'MSC', 'IFS'.
        obs_group (str): 观测组.
        obs_type (str): 观测类型,如主巡天宽场、TOO观测、定标星场等等.
        dataset (str): 数据集名称.
180
181
        obs_id (Optional[str]): 观测ID. Defaults to None.
        prc_status (Optional[int]): 处理状态. Defaults to None.
182
183
184
185
186
187
188
189
190
191
    
    Returns:
        Result: 操作的结果对象,包含操作是否成功以及相关的错误信息,成功返回数据对象,如:
        {'code': 200, 'message': '', 'data': {'plan_count': 30, 'level0_count': 30}}
    """
    params = {
        'obs_group': obs_group,
        'instrument': instrument,
        'obs_type': obs_type,
        'dataset': dataset,
192
193
        'obs_id': obs_id,
        'prc_status': prc_status
194
195
    }    
    return request.post("/api/plan/count", params)