summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorRuin0x11 <ipickering2@gmail.com>2020-05-04 15:15:30 -0700
committerRuin0x11 <ipickering2@gmail.com>2020-05-04 15:15:51 -0700
commit6b8e3f251f69c9d7d560148100cdb8df941a81c2 (patch)
tree2370acc1c3119b506ad016e4350d482af98908fb /server
parentffba010ae4b6efebd791a077125df92ef57274d0 (diff)
Implement pool merging
Diffstat (limited to 'server')
-rw-r--r--server/szurubooru/func/pools.py47
1 files changed, 11 insertions, 36 deletions
diff --git a/server/szurubooru/func/pools.py b/server/szurubooru/func/pools.py
index 4fc4d36..854650a 100644
--- a/server/szurubooru/func/pools.py
+++ b/server/szurubooru/func/pools.py
@@ -6,7 +6,6 @@ from szurubooru import config, db, model, errors, rest
from szurubooru.func import util, pool_categories, serialization, posts
-
class PoolNotFoundError(errors.NotFoundError):
pass
@@ -35,6 +34,10 @@ class InvalidPoolDescriptionError(errors.ValidationError):
pass
+class InvalidPoolRelationError(errors.ValidationError):
+ pass
+
+
def _verify_name_validity(name: str) -> None:
if util.value_exceeds_column_size(name, model.PoolName.name):
raise InvalidPoolNameError('Name is too long.')
@@ -211,45 +214,18 @@ def merge_pools(source_pool: model.Pool, target_pool: model.Pool) -> None:
raise InvalidPoolRelationError('Cannot merge pool with itself.')
def merge_posts(source_pool_id: int, target_pool_id: int) -> None:
- pass
- # alias1 = model.PostPool
- # alias2 = sa.orm.util.aliased(model.PostPool)
- # update_stmt = (
- # sa.sql.expression.update(alias1)
- # .where(alias1.pool_id == source_pool_id))
- # update_stmt = (
- # update_stmt
- # .where(
- # ~sa.exists()
- # .where(alias1.post_id == alias2.post_id)
- # .where(alias2.pool_id == target_pool_id)))
- # update_stmt = update_stmt.values(pool_id=target_pool_id)
- # db.session.execute(update_stmt)
-
- def merge_relations(
- table: model.Base, source_pool_id: int, target_pool_id: int) -> None:
- alias1 = table
- alias2 = sa.orm.util.aliased(table)
+ alias1 = model.PoolPost
+ alias2 = sa.orm.util.aliased(model.PoolPost)
update_stmt = (
sa.sql.expression.update(alias1)
- .where(alias1.parent_id == source_pool_id)
- .where(alias1.child_id != target_pool_id)
- .where(
- ~sa.exists()
- .where(alias2.child_id == alias1.child_id)
- .where(alias2.parent_id == target_pool_id))
- .values(parent_id=target_pool_id))
- db.session.execute(update_stmt)
-
+ .where(alias1.pool_id == source_pool_id))
update_stmt = (
- sa.sql.expression.update(alias1)
- .where(alias1.child_id == source_pool_id)
- .where(alias1.parent_id != target_pool_id)
+ update_stmt
.where(
~sa.exists()
- .where(alias2.parent_id == alias1.parent_id)
- .where(alias2.child_id == target_pool_id))
- .values(child_id=target_pool_id))
+ .where(alias1.post_id == alias2.post_id)
+ .where(alias2.pool_id == target_pool_id)))
+ update_stmt = update_stmt.values(pool_id=target_pool_id)
db.session.execute(update_stmt)
merge_posts(source_pool.pool_id, target_pool.pool_id)
@@ -316,7 +292,6 @@ def update_pool_description(pool: model.Pool, description: str) -> None:
pool.description = description or None
-
def update_pool_posts(pool: model.Pool, post_ids: List[int]) -> None:
assert pool
if _check_post_duplication(post_ids):