summaryrefslogtreecommitdiff
path: root/server/szurubooru/api/metric_api.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/szurubooru/api/metric_api.py')
-rw-r--r--server/szurubooru/api/metric_api.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/server/szurubooru/api/metric_api.py b/server/szurubooru/api/metric_api.py
new file mode 100644
index 0000000..2bba66f
--- /dev/null
+++ b/server/szurubooru/api/metric_api.py
@@ -0,0 +1,94 @@
+from math import ceil
+from typing import Optional, List, Dict
+from szurubooru import db, model, search, rest
+from szurubooru.func import (
+ auth, metrics, snapshots, serialization, tags, versions
+)
+
+
+_search_executor_config = search.configs.PostMetricSearchConfig()
+_search_executor = search.Executor(_search_executor_config)
+
+
+def _serialize_metric(
+ ctx: rest.Context, metric: model.Metric) -> rest.Response:
+ return metrics.serialize_metric(
+ metric, options=serialization.get_serialization_options(ctx)
+ )
+
+
+def _serialize_post_metric(
+ ctx: rest.Context, post_metric: model.PostMetric) -> rest.Response:
+ return metrics.serialize_post_metric(
+ post_metric, options=serialization.get_serialization_options(ctx)
+ )
+
+
+def _get_metric(params: Dict[str, str]) -> model.Metric:
+ return metrics.get_metric_by_tag_name(params["tag_name"])
+
+
+@rest.routes.get("/metrics/?")
+def get_metrics(
+ ctx: rest.Context, params: Dict[str, str] = {}) -> rest.Response:
+ auth.verify_privilege(ctx.user, "metrics:list")
+ all_metrics = metrics.get_all_metrics()
+ return {
+ "results": [_serialize_metric(ctx, metric) for metric in all_metrics]
+ }
+
+
+@rest.routes.post("/metrics/?")
+def create_metric(
+ ctx: rest.Context, params: Dict[str, str] = {}) -> rest.Response:
+ auth.verify_privilege(ctx.user, "metrics:create")
+ tag_name = ctx.get_param_as_string("tag_name")
+ tag = tags.get_tag_by_name(tag_name)
+ min = ctx.get_param_as_float("min")
+ max = ctx.get_param_as_float("max")
+
+ metric = metrics.create_metric(tag, min, max)
+ ctx.session.flush()
+ # snapshots.create(metric, ctx.user)
+ ctx.session.commit()
+ return _serialize_metric(ctx, metric)
+
+
+@rest.routes.delete("/metric/(?P<tag_name>.+)")
+def delete_metric(ctx: rest.Context, params: Dict[str, str]) -> rest.Response:
+ metric = _get_metric(params)
+ versions.verify_version(metric, ctx)
+ auth.verify_privilege(ctx.user, "metrics:delete")
+ # snapshots.delete(metric, ctx.user)
+ metrics.delete_metric(metric)
+ ctx.session.commit()
+ return {}
+
+
+@rest.routes.get("/post-metrics/?")
+def get_post_metrics(
+ ctx: rest.Context, params: Dict[str, str] = {}) -> rest.Response:
+ auth.verify_privilege(ctx.user, "metrics:list")
+ return _search_executor.execute_and_serialize(
+ ctx, lambda post_metric: _serialize_post_metric(ctx, post_metric))
+
+
+@rest.routes.get("/post-metrics/median/(?P<tag_name>.+)")
+def get_post_metrics_median(
+ ctx: rest.Context, params: Dict[str, str] = {}) -> rest.Response:
+ auth.verify_privilege(ctx.user, "metrics:list")
+ metric = _get_metric(params)
+ tag_name = params["tag_name"]
+ query_text = ctx.get_param_as_string(
+ "query",
+ default="%s:%f..%f" % (tag_name, metric.min, metric.max))
+ total_count = _search_executor.count(query_text)
+ offset = ceil(total_count/2) - 1
+ _, results = _search_executor.execute(query_text, offset, 1)
+ return {
+ "query": query_text,
+ "offset": offset,
+ "limit": 1,
+ "total": len(results),
+ "results": list([_serialize_post_metric(ctx, pm) for pm in results])
+ }