Add mass extract support for collections & medias

master
Felix Stupp 2 years ago
parent 01c1276a90
commit bf5049ce25
Signed by: zocker
GPG Key ID: 93E1BD26F6B02FB7

@ -326,6 +326,13 @@ def time_since(date: datetime) -> str:
####
def _parse_cs_ids(cs_ids: str) -> List[int] | None:
try:
return [int(i) for i in cs_ids.split(",")]
except ValueError as e:
return None
def _select_ids(cls: Type[T], ids: Iterable[int]) -> Query[T]:
return orm.select(o for o in cls if o.id in ids)
@ -525,6 +532,27 @@ def list_long_media(seconds: int = 10 * 60) -> ResponseReturnValue:
)
@flask_app.route("/media/overview")
def list_media_overview() -> ResponseReturnValue:
data = request.args.to_dict()
ids = _parse_cs_ids(data.get("ids", "NULL"))
if not ids:
return {
"status": False,
"error": {
"msg": "Could not parse id list",
"data": {
"ids": data.get("ids"),
},
},
}
return render_template(
"media_list.htm",
media_list=_select_ids(MediaElement, ids),
check_considered=False,
)
@flask_app.route("/media/unsorted")
def list_unsorted_media() -> ResponseReturnValue:
media_list: Iterable[MediaElement] = orm.select(
@ -749,6 +777,59 @@ def api_collection_extract() -> ResponseReturnValue:
return redirect(c.info_link)
return redirect_back_or_okay()
@flask_app.route("/api/collection/extract/mass", methods=["POST"])
def api_collection_extract_mass() -> ResponseReturnValue:
data = request.form.to_dict()
if "uris" not in data:
return {
"status": False,
"error": f"Missing uri value to extract",
}
uris = [
u
for u in (u.strip() for u in data["uris"].replace("\r\n", "\n").split("\n"))
if u and not u.startswith("#")
]
coll_ids = list[int]()
errors = []
for u in uris:
try:
coll = collection_extract_uri(u)
coll_ids.append(coll.id)
orm.commit()
except Exception as e:
orm.rollback()
errors.append(
{
"uri": u,
"error": {
"type": repr(type(e)),
"args": repr(e.args),
},
}
)
if errors:
return {
"status": False,
"successful_collections": coll_ids,
"error": {
"msg": "Failed to update all collections successfully",
"data": errors,
},
}, 501
if coll_ids:
update_element_lookup_cache(coll_ids)
if coll_ids and environ_bool(data.get("redirect_to_overview", False)):
return redirect(
"/collection/overview?ids=" + ",".join(str(i) for i in coll_ids)
)
return {
"status": True,
"successful_collections": coll_ids,
}
@flask_app.route("/api/collection/<int:collection_id>", methods=["GET", "POST"])
def api_collection_element(collection_id: int) -> ResponseReturnValue:
collection: MediaCollection = MediaCollection.get(id=collection_id)
@ -880,6 +961,55 @@ def api_media_extract() -> ResponseReturnValue:
return redirect(m.info_link)
return redirect_back_or_okay()
@flask_app.route("/api/media/extract/mass", methods=["POST"])
def api_media_extract_mass() -> ResponseReturnValue:
data = request.form.to_dict()
if "uris" not in data:
return {
"status": False,
"error": f"Missing uri value to extract",
}
uris = [
u
for u in (u.strip() for u in data["uris"].replace("\r\n", "\n").split("\n"))
if u and not u.startswith("#")
]
media_ids = list[int]()
errors = []
for u in uris:
try:
media = media_extract_uri(u)
media_ids.append(media.id)
orm.commit()
except Exception as e:
orm.rollback()
errors.append(
{
"uri": u,
"error": {
"type": repr(type(e)),
"args": repr(e.args),
},
}
)
if errors:
return {
"status": False,
"successful_medias": media_ids,
"error": {
"msg": "Failed to update all medias successfully",
"data": errors,
},
}, 501
if media_ids and environ_bool(data.get("redirect_to_overview", False)):
return redirect("/media/overview?ids=" + ",".join(str(i) for i in media_ids))
return {
"status": True,
"successful_medias": media_ids,
}
@flask_app.route("/api/media/<int:media_id>", methods=["GET", "POST"])
def api_media_element(media_id: int) -> ResponseReturnValue:
element: MediaElement = MediaElement.get(id=media_id)

@ -10,15 +10,27 @@
<body>
{{ macros.body_header() }}
<h1>{{ title }}</h1>
<form method="post" action="/api/collection/extract">
{{ macros.hidden_redirect_back() }}
<input type="text" name="uri" style="width: 40em;" />
<button type="submit" name="redirect_to_object" value="true">
extract
</button>
<button type="submit" name="redirect_to_object" value="false">
extract & more
</button>
</form>
<p>
<h2>Single Collection</h2>
<form method="post" action="/api/collection/extract">
{{ macros.hidden_redirect_back() }}
<input type="text" name="uri" style="width: 40em;" />
<button type="submit" name="redirect_to_object" value="true">
extract
</button>
<button type="submit" name="redirect_to_object" value="false">
extract & more
</button>
</form>
</p>
<p>
<h2>Multiple Collections</h2>
<form method="post" action="/api/collection/extract/mass">
<textarea name="uris" cols="160" rows="8" placeholder="Enter one uri per line"></textarea>
<button type="submit" name="redirect_to_overview" value="true">
extract list
</button>
</form>
</p>
</body>
</html>

@ -10,15 +10,27 @@
<body>
{{ macros.body_header() }}
<h1>{{ title }}</h1>
<form method="post" action="/api/media/extract">
{{ macros.hidden_redirect_back() }}
<input type="text" name="uri" style="width: 40em;" />
<button type="submit" name="redirect_to_object" value="true">
extract
</button>
<button type="submit" name="redirect_to_object" value="false">
extract & more
</button>
</form>
<p>
<h2>Single Media</h2>
<form method="post" action="/api/media/extract">
{{ macros.hidden_redirect_back() }}
<input type="text" name="uri" style="width: 40em;" />
<button type="submit" name="redirect_to_object" value="true">
extract
</button>
<button type="submit" name="redirect_to_object" value="false">
extract & more
</button>
</form>
</p>
<p>
<h2>Multiple Medias</h2>
<form method="post" action="/api/media/extract/mass">
<textarea name="uris" cols="160" rows="8" placeholder="Enter one uri per line"></textarea>
<button type="submit" name="redirect_to_overview" value="true">
extract list
</button>
</form>
</p>
</body>
</html>

Loading…
Cancel
Save