diff options
| author | Ruin0x11 <ipickering2@gmail.com> | 2020-05-04 15:15:30 -0700 |
|---|---|---|
| committer | Ruin0x11 <ipickering2@gmail.com> | 2020-05-04 15:15:51 -0700 |
| commit | 6b8e3f251f69c9d7d560148100cdb8df941a81c2 (patch) | |
| tree | 2370acc1c3119b506ad016e4350d482af98908fb /server | |
| parent | ffba010ae4b6efebd791a077125df92ef57274d0 (diff) | |
Implement pool merging
Diffstat (limited to 'server')
| -rw-r--r-- | server/szurubooru/func/pools.py | 47 |
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): |