Make deleting review items delete recordings as well (#10707)

* Make deleting review items delete recordings as well

* Fix wrong camera bug
This commit is contained in:
Nicolas Mowen 2024-03-27 07:22:28 -06:00 committed by GitHub
parent 98a1e6ee22
commit d5989c91a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 6 deletions

View File

@ -3,6 +3,7 @@
import logging import logging
from datetime import datetime, timedelta from datetime import datetime, timedelta
from functools import reduce from functools import reduce
from pathlib import Path
import pandas as pd import pandas as pd
from flask import Blueprint, jsonify, make_response, request from flask import Blueprint, jsonify, make_response, request
@ -62,6 +63,7 @@ def review():
.order_by(ReviewSegment.start_time.desc()) .order_by(ReviewSegment.start_time.desc())
.limit(limit) .limit(limit)
.dicts() .dicts()
.iterator()
) )
return jsonify([r for r in review]) return jsonify([r for r in review])
@ -334,15 +336,53 @@ def set_not_reviewed(id):
) )
@ReviewBp.route("/reviews/<ids>", methods=("DELETE",)) @ReviewBp.route("/reviews/delete", methods=("POST",))
def delete_reviews(ids: str): def delete_reviews():
list_of_ids = ids.split(",") json: dict[str, any] = request.get_json(silent=True) or {}
list_of_ids = json.get("ids", "")
if not list_of_ids or len(list_of_ids) == 0: if not list_of_ids or len(list_of_ids) == 0:
return make_response( return make_response(
jsonify({"success": False, "message": "Not a valid list of ids"}), 404 jsonify({"success": False, "message": "Not a valid list of ids"}), 404
) )
reviews = (
ReviewSegment.select(
ReviewSegment.camera,
ReviewSegment.start_time,
ReviewSegment.end_time,
)
.where(ReviewSegment.id << list_of_ids)
.dicts()
.iterator()
)
recording_ids = []
for review in reviews:
start_time = review["start_time"]
end_time = review["end_time"]
camera_name = review["camera"]
recordings = (
Recordings.select(Recordings.id, Recordings.path)
.where(
Recordings.start_time.between(start_time, end_time)
| Recordings.end_time.between(start_time, end_time)
| (
(start_time > Recordings.start_time)
& (end_time < Recordings.end_time)
)
)
.where(Recordings.camera == camera_name)
.dicts()
.iterator()
)
for recording in recordings:
Path(recording["path"]).unlink(missing_ok=True)
recording_ids.append(recording["id"])
# delete recordings and review segments
Recordings.delete().where(Recordings.id << recording_ids).execute()
ReviewSegment.delete().where(ReviewSegment.id << list_of_ids).execute() ReviewSegment.delete().where(ReviewSegment.id << list_of_ids).execute()
return make_response(jsonify({"success": True, "message": "Delete reviews"}), 200) return make_response(jsonify({"success": True, "message": "Delete reviews"}), 200)

View File

@ -29,8 +29,7 @@ export default function ReviewActionGroup({
}, [selectedReviews, setSelectedReviews, pullLatestData]); }, [selectedReviews, setSelectedReviews, pullLatestData]);
const onDelete = useCallback(async () => { const onDelete = useCallback(async () => {
const idList = selectedReviews.join(","); await axios.post(`reviews/delete`, { ids: selectedReviews });
await axios.delete(`reviews/${idList}`);
setSelectedReviews([]); setSelectedReviews([]);
pullLatestData(); pullLatestData();
}, [selectedReviews, setSelectedReviews, pullLatestData]); }, [selectedReviews, setSelectedReviews, pullLatestData]);

View File

@ -111,7 +111,9 @@ export default function PreviewThumbnailPlayer({
} else { } else {
// the second preview is longer, return the second if it exists // the second preview is longer, return the second if it exists
if (firstIndex < allPreviews.length - 1) { if (firstIndex < allPreviews.length - 1) {
return allPreviews[firstIndex + 1]; return allPreviews.find(
(preview, idx) => idx > firstIndex && preview.camera == review.camera,
);
} }
return undefined; return undefined;