Skip to content

timelapse

Timelapse REST API ResourcesLink

Provides Flask-RESTful resources for managing timelapse datasets in PlantDB.

Timelapse Link

Timelapse(db, logger=None)

Bases: Resource

Resource for inspecting and deleting a specific timelapse container.

Source code in plantdb/server/api/timelapse.py
74
75
76
def __init__(self, db, logger=None):
    self.db: FSDB = db
    self.logger: logging.Logger = logger if logger else get_logger(self.__class__.__name__)

delete Link

delete(timelapse_id, **kwargs)

Delete a timelapse container.

Source code in plantdb/server/api/timelapse.py
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
@sanitize_ids('timelapse_id')
@rate_limit(max_requests=30, window_seconds=60)
@add_jwt_from_header
@use_guest_as_default
def delete(self, timelapse_id, **kwargs):
    """Delete a timelapse container."""
    recursive_param = request.args.get('recursive', 'false').lower()
    recursive = recursive_param in ('true', '1', 'yes')
    try:
        self.db.delete_timelapse(timelapse_id, recursive=recursive, **kwargs)
        return "", 204
    except TimeLapseNotFoundError as e:
        return {'error': str(e)}, 404
    except ValueError as e:
        return {'error': str(e)}, 409
    except PermissionError as e:
        return {'error': str(e)}, 403
    except NoAuthUserError as e:
        return {'error': str(e)}, 401
    except Exception as e:
        return {'error': f'Error deleting timelapse: {str(e)}'}, 500

get Link

get(timelapse_id, **kwargs)

Get timelapse metadata and scan counts.

Source code in plantdb/server/api/timelapse.py
78
79
80
81
82
83
84
85
86
87
88
89
90
91
@sanitize_ids('timelapse_id')
@rate_limit(max_requests=60, window_seconds=60)
@add_jwt_from_header
@use_guest_as_default
def get(self, timelapse_id, **kwargs):
    """Get timelapse metadata and scan counts."""
    try:
        tl_data = self.db.get_timelapse(timelapse_id, **kwargs)
        res = tl_data.to_dict() if hasattr(tl_data, "to_dict") else tl_data
        return res, 200
    except TimeLapseNotFoundError as e:
        return {'error': str(e)}, 404
    except Exception as e:
        return {'error': f'Error getting timelapse: {str(e)}'}, 500

TimelapseScans Link

TimelapseScans(db, logger=None)

Bases: Resource

Resource for retrieving member scans of a specific timelapse.

Source code in plantdb/server/api/timelapse.py
119
120
121
def __init__(self, db, logger=None):
    self.db: FSDB = db
    self.logger: logging.Logger = logger if logger else get_logger(self.__class__.__name__)

get Link

get(timelapse_id, **kwargs)

List member scans of a timelapse, sorted.

Source code in plantdb/server/api/timelapse.py
123
124
125
126
127
128
129
130
131
132
133
134
135
@sanitize_ids('timelapse_id')
@rate_limit(max_requests=60, window_seconds=60)
@add_jwt_from_header
@use_guest_as_default
def get(self, timelapse_id, **kwargs):
    """List member scans of a timelapse, sorted."""
    sort = request.args.get('sort', 'timelapse.scheduled')
    fuzzy = request.args.get('fuzzy', False, type=bool)
    try:
        scans_list = self.db.list_scans(query={"timelapse": {"id": timelapse_id}}, fuzzy=fuzzy, owner_only=False, sort=sort)
        return scans_list, 200
    except Exception as e:
        return {'error': f'Error retrieving timelapse scans: {str(e)}'}, 500

Timelapses Link

Timelapses(db, logger=None)

Bases: Resource

Resource for listing and creating timelapse containers.

Source code in plantdb/server/api/timelapse.py
28
29
30
def __init__(self, db, logger=None):
    self.db: FSDB = db
    self.logger: logging.Logger = logger if logger else get_logger(self.__class__.__name__)

get Link

get()

List all timelapse containers.

Source code in plantdb/server/api/timelapse.py
32
33
34
35
36
37
38
39
@rate_limit(max_requests=30, window_seconds=60)
def get(self):
    """List all timelapse containers."""
    try:
        tl_list = self.db.list_timelapses()
        return tl_list, 200
    except Exception as e:
        return {'error': f'Error retrieving timelapse list: {str(e)}'}, 500

post Link

post(**kwargs)

Create a new timelapse container.

Source code in plantdb/server/api/timelapse.py
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
@rate_limit(max_requests=30, window_seconds=60)
@add_jwt_from_header
@use_guest_as_default
def post(self, **kwargs):
    """Create a new timelapse container."""
    data = request.get_json(silent=True)
    if not data or not isinstance(data, dict):
        return {'error': 'Invalid request body: expected JSON object'}, 400

    tl_id = data.get('id') or data.get('name')
    if not tl_id:
        return {'error': "Missing 'id' field for timelapse creation"}, 400

    metadata = data.get('metadata', {})
    try:
        tl = self.db.create_timelapse(tl_id, metadata=metadata, **kwargs)
        res = tl.to_dict() if hasattr(tl, "to_dict") else tl
        return res, 201
    except TimeLapseExistsError as e:
        return {'error': str(e)}, 409
    except ValueError as e:
        return {'error': str(e)}, 400
    except PermissionError as e:
        return {'error': str(e)}, 403
    except NoAuthUserError as e:
        return {'error': str(e)}, 401
    except Exception as e:
        return {'error': f'Error creating timelapse: {str(e)}'}, 500