def test_merge_tags_deletes_source_tag(tag_factory): source_tag = tag_factory(names=['source']) target_tag = tag_factory(names=['target']) db.session.add_all([source_tag, target_tag]) db.session.flush() tags.merge_tags(source_tag, target_tag) db.session.flush() assert tags.try_get_tag_by_name('source') is None tag = tags.get_tag_by_name('target') assert tag is not None
def test_merge_tags_doesnt_duplicate_usages(tag_factory, post_factory): source_tag = tag_factory(names=['source']) target_tag = tag_factory(names=['target']) post = post_factory() post.tags = [source_tag, target_tag] db.session.add_all([source_tag, target_tag, post]) db.session.flush() assert source_tag.post_count == 1 assert target_tag.post_count == 1 tags.merge_tags(source_tag, target_tag) db.session.flush() assert tags.try_get_tag_by_name('source') is None assert tags.get_tag_by_name('target').post_count == 1
def test_merge_tags_moves_usages(tag_factory, post_factory): source_tag = tag_factory(names=['source']) target_tag = tag_factory(names=['target']) post = post_factory() post.tags = [source_tag] db.session.add_all([source_tag, target_tag, post]) db.session.commit() assert source_tag.post_count == 1 assert target_tag.post_count == 0 tags.merge_tags(source_tag, target_tag) db.session.commit() assert tags.try_get_tag_by_name('source') is None assert tags.get_tag_by_name('target').post_count == 1
def post(self, ctx): source_tag_name = ctx.get_param_as_string('remove', required=True) or '' target_tag_name = ctx.get_param_as_string('mergeTo', required=True) or '' source_tag = tags.get_tag_by_name(source_tag_name) target_tag = tags.get_tag_by_name(target_tag_name) if source_tag.tag_id == target_tag.tag_id: raise tags.InvalidTagRelationError('Cannot merge tag with itself.') auth.verify_privilege(ctx.user, 'tags:merge') snapshots.save_entity_deletion(source_tag, ctx.user) tags.merge_tags(source_tag, target_tag) ctx.session.commit() tags.export_to_json() return tags.serialize_tag_with_details(target_tag)
def merge_tags(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: source_tag_name = ctx.get_param_as_string("remove") target_tag_name = ctx.get_param_as_string("mergeTo") source_tag = tags.get_tag_by_name(source_tag_name) target_tag = tags.get_tag_by_name(target_tag_name) versions.verify_version(source_tag, ctx, "removeVersion") versions.verify_version(target_tag, ctx, "mergeToVersion") versions.bump_version(target_tag) auth.verify_privilege(ctx.user, "tags:merge") tags.merge_tags(source_tag, target_tag) snapshots.merge(source_tag, target_tag, ctx.user) ctx.session.commit() return _serialize(ctx, target_tag)
def merge_tags(ctx, _params=None): source_tag_name = ctx.get_param_as_string('remove', required=True) or '' target_tag_name = ctx.get_param_as_string('mergeTo', required=True) or '' source_tag = tags.get_tag_by_name(source_tag_name) target_tag = tags.get_tag_by_name(target_tag_name) versions.verify_version(source_tag, ctx, 'removeVersion') versions.verify_version(target_tag, ctx, 'mergeToVersion') versions.bump_version(target_tag) auth.verify_privilege(ctx.user, 'tags:merge') tags.merge_tags(source_tag, target_tag) snapshots.merge(source_tag, target_tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, target_tag)
def merge_tags( ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: source_tag_name = ctx.get_param_as_string('remove') target_tag_name = ctx.get_param_as_string('mergeTo') source_tag = tags.get_tag_by_name(source_tag_name) target_tag = tags.get_tag_by_name(target_tag_name) versions.verify_version(source_tag, ctx, 'removeVersion') versions.verify_version(target_tag, ctx, 'mergeToVersion') versions.bump_version(target_tag) auth.verify_privilege(ctx.user, 'tags:merge') tags.merge_tags(source_tag, target_tag) snapshots.merge(source_tag, target_tag, ctx.user) ctx.session.commit() return _serialize(ctx, target_tag)
def test_merge_tags_doesnt_create_relation_loop_for_parents(tag_factory): source_tag = tag_factory(names=['source']) target_tag = tag_factory(names=['target']) target_tag.suggestions = [source_tag] target_tag.implications = [source_tag] db.session.add_all([source_tag, target_tag]) db.session.commit() assert source_tag.suggestion_count == 0 assert source_tag.implication_count == 0 assert target_tag.suggestion_count == 1 assert target_tag.implication_count == 1 tags.merge_tags(source_tag, target_tag) db.session.commit() assert tags.try_get_tag_by_name('source') is None assert tags.get_tag_by_name('target').suggestion_count == 0 assert tags.get_tag_by_name('target').implication_count == 0
def test_merge_tags_doesnt_create_relation_loop_for_children(tag_factory): source_tag = tag_factory(names=["source"]) target_tag = tag_factory(names=["target"]) source_tag.suggestions = [target_tag] source_tag.implications = [target_tag] db.session.add_all([source_tag, target_tag]) db.session.commit() assert source_tag.suggestion_count == 1 assert source_tag.implication_count == 1 assert target_tag.suggestion_count == 0 assert target_tag.implication_count == 0 tags.merge_tags(source_tag, target_tag) db.session.commit() assert tags.try_get_tag_by_name("source") is None assert tags.get_tag_by_name("target").suggestion_count == 0 assert tags.get_tag_by_name("target").implication_count == 0
def test_merge_tags_moves_child_relations(tag_factory): source_tag = tag_factory(names=['source']) target_tag = tag_factory(names=['target']) related_tag = tag_factory() source_tag.suggestions = [related_tag] source_tag.implications = [related_tag] db.session.add_all([source_tag, target_tag, related_tag]) db.session.commit() assert source_tag.suggestion_count == 1 assert source_tag.implication_count == 1 assert target_tag.suggestion_count == 0 assert target_tag.implication_count == 0 tags.merge_tags(source_tag, target_tag) db.session.commit() assert tags.try_get_tag_by_name('source') is None assert tags.get_tag_by_name('target').suggestion_count == 1 assert tags.get_tag_by_name('target').implication_count == 1
def test_merge_tags_doesnt_duplicate_child_relations(tag_factory): source_tag = tag_factory(names=["source"]) target_tag = tag_factory(names=["target"]) related_tag = tag_factory() source_tag.suggestions = [related_tag] source_tag.implications = [related_tag] target_tag.suggestions = [related_tag] target_tag.implications = [related_tag] db.session.add_all([source_tag, target_tag, related_tag]) db.session.commit() assert source_tag.suggestion_count == 1 assert source_tag.implication_count == 1 assert target_tag.suggestion_count == 1 assert target_tag.implication_count == 1 tags.merge_tags(source_tag, target_tag) db.session.commit() assert tags.try_get_tag_by_name("source") is None assert tags.get_tag_by_name("target").suggestion_count == 1 assert tags.get_tag_by_name("target").implication_count == 1
def test_merge_tags_moves_parent_relations(tag_factory): source_tag = tag_factory(names=["source"]) target_tag = tag_factory(names=["target"]) related_tag = tag_factory(names=["related"]) related_tag.suggestions = [related_tag] related_tag.implications = [related_tag] db.session.add_all([source_tag, target_tag, related_tag]) db.session.commit() assert source_tag.suggestion_count == 0 assert source_tag.implication_count == 0 assert target_tag.suggestion_count == 0 assert target_tag.implication_count == 0 tags.merge_tags(source_tag, target_tag) db.session.commit() assert tags.try_get_tag_by_name("source") is None assert tags.get_tag_by_name("related").suggestion_count == 1 assert tags.get_tag_by_name("related").suggestion_count == 1 assert tags.get_tag_by_name("target").suggestion_count == 0 assert tags.get_tag_by_name("target").implication_count == 0
def post(self, ctx): source_tag_name = ctx.get_param_as_string('remove', required=True) or '' target_tag_name = ctx.get_param_as_string('merge-to', required=True) or '' source_tag = tags.get_tag_by_name(source_tag_name) target_tag = tags.get_tag_by_name(target_tag_name) if not source_tag: raise tags.TagNotFoundError( 'Source tag %r not found.' % source_tag_name) if not target_tag: raise tags.TagNotFoundError( 'Source tag %r not found.' % target_tag_name) if source_tag.tag_id == target_tag.tag_id: raise tags.InvalidTagRelationError( 'Cannot merge tag with itself.') auth.verify_privilege(ctx.user, 'tags:merge') tags.merge_tags(source_tag, target_tag) snapshots.delete(source_tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_tag_with_details(target_tag)
def test_merge_tags_with_itself(tag_factory): source_tag = tag_factory(names=['source']) db.session.add(source_tag) db.session.flush() with pytest.raises(tags.InvalidTagRelationError): tags.merge_tags(source_tag, source_tag)