Example #1
0
def update_tag_names(tag, names):
    names = util.icase_unique([name for name in names if name])
    if not len(names):
        raise InvalidTagNameError('At least one name must be specified.')
    for name in names:
        _verify_name_validity(name)
    expr = sqlalchemy.sql.false()
    for name in names:
        if util.value_exceeds_column_size(name, db.TagName.name):
            raise InvalidTagNameError('Name is too long.')
        expr = expr | db.TagName.name.ilike(name)
    if tag.tag_id:
        expr = expr & (db.TagName.tag_id != tag.tag_id)
    existing_tags = db.session.query(db.TagName).filter(expr).all()
    if len(existing_tags):
        raise TagAlreadyExistsError(
            'One of names is already used by another tag.')
    tag_names_to_remove = []
    for tag_name in tag.names:
        if not _check_name_intersection([tag_name.name], names):
            tag_names_to_remove.append(tag_name)
    for tag_name in tag_names_to_remove:
        tag.names.remove(tag_name)
    for name in names:
        if not _check_name_intersection(_get_plain_names(tag), [name]):
            tag.names.append(db.TagName(name))
Example #2
0
def update_pool_names(pool: model.Pool, names: List[str]) -> None:
    # sanitize
    assert pool
    names = util.icase_unique([name for name in names if name])
    if not len(names):
        raise InvalidPoolNameError("At least one name must be specified.")
    for name in names:
        _verify_name_validity(name)

    # check for existing pools
    expr = sa.sql.false()
    for name in names:
        expr = expr | (sa.func.lower(model.PoolName.name) == name.lower())
    if pool.pool_id:
        expr = expr & (model.PoolName.pool_id != pool.pool_id)
    existing_pools = db.session.query(model.PoolName).filter(expr).all()
    if len(existing_pools):
        raise PoolAlreadyExistsError(
            "One of names is already used by another pool.")

    # remove unwanted items
    for pool_name in pool.names[:]:
        if not _check_name_intersection([pool_name.name], names, True):
            pool.names.remove(pool_name)
    # add wanted items
    for name in names:
        if not _check_name_intersection(_get_names(pool), [name], True):
            pool.names.append(model.PoolName(name, -1))

    # set alias order to match the request
    for i, name in enumerate(names):
        for pool_name in pool.names:
            if pool_name.name.lower() == name.lower():
                pool_name.order = i
Example #3
0
def update_tag_names(tag: model.Tag, names: List[str]) -> None:
    # sanitize
    assert tag
    names = util.icase_unique([name for name in names if name])
    if not len(names):
        raise InvalidTagNameError('최소 하나의 이름은 지정해야 합니다.')
    for name in names:
        _verify_name_validity(name)

    # check for existing tags
    expr = sa.sql.false()
    for name in names:
        expr = expr | (sa.func.lower(model.TagName.name) == name.lower())
    if tag.tag_id:
        expr = expr & (model.TagName.tag_id != tag.tag_id)
    existing_tags = db.session.query(model.TagName).filter(expr).all()
    if len(existing_tags):
        raise TagAlreadyExistsError('이름 중 하나가 다른 태그에서 이미 사용중입니다.')

    # remove unwanted items
    for tag_name in tag.names[:]:
        if not _check_name_intersection([tag_name.name], names, True):
            tag.names.remove(tag_name)
    # add wanted items
    for name in names:
        if not _check_name_intersection(_get_names(tag), [name], True):
            tag.names.append(model.TagName(name, -1))

    # set alias order to match the request
    for i, name in enumerate(names):
        for tag_name in tag.names:
            if tag_name.name.lower() == name.lower():
                tag_name.order = i
Example #4
0
def get_or_create_tags_by_names(
    names: List[str],
) -> Tuple[List[model.Tag], List[model.Tag]]:
    names = util.icase_unique(names)
    existing_tags = get_tags_by_names(names)
    new_tags = []
    tag_category_name = tag_categories.get_default_category_name()
    for name in names:
        found = False
        for existing_tag in existing_tags:
            if _check_name_intersection(
                _get_names(existing_tag), [name], False
            ):
                found = True
                break
        if not found:
            new_tag = create_tag(
                names=[name],
                category_name=tag_category_name,
                suggestions=[],
                implications=[],
            )
            db.session.add(new_tag)
            new_tags.append(new_tag)
    return existing_tags, new_tags
Example #5
0
def get_pools_by_names(names: List[str]) -> List[model.Pool]:
    names = util.icase_unique(names)
    if len(names) == 0:
        return []
    return (db.session.query(model.Pool).join(model.PoolName).filter(
        sa.sql.or_(
            sa.func.lower(model.PoolName.name) == name.lower()
            for name in names)).all())
Example #6
0
def get_tags_by_names(names):
    names = util.icase_unique(names)
    if len(names) == 0:
        return []
    expr = sqlalchemy.sql.false()
    for name in names:
        expr = expr | db.TagName.name.ilike(name)
    return db.session.query(db.Tag).join(db.TagName).filter(expr).all()
Example #7
0
def get_or_create_pools_by_names(
    names: List[str], ) -> Tuple[List[model.Pool], List[model.Pool]]:
    names = util.icase_unique(names)
    existing_pools = get_pools_by_names(names)
    new_pools = []
    pool_category_name = pool_categories.get_default_category_name()
    for name in names:
        found = False
        for existing_pool in existing_pools:
            if _check_name_intersection(_get_names(existing_pool), [name],
                                        False):
                found = True
                break
        if not found:
            new_pool = create_pool(names=[name],
                                   category_name=pool_category_name,
                                   post_ids=[])
            db.session.add(new_pool)
            new_pools.append(new_pool)
    return existing_pools, new_pools
Example #8
0
def get_or_create_tags_by_names(names):
    names = util.icase_unique(names)
    for name in names:
        _verify_name_validity(name)
    existing_tags = get_tags_by_names(names)
    new_tags = []
    tag_category_name = _get_default_category_name()
    for name in names:
        found = False
        for existing_tag in existing_tags:
            if _check_name_intersection(_get_plain_names(existing_tag), [name]):
                found = True
                break
        if not found:
            new_tag = create_tag(
                names=[name],
                category_name=tag_category_name,
                suggestions=[],
                implications=[])
            db.session.add(new_tag)
            new_tags.append(new_tag)
    return existing_tags, new_tags
Example #9
0
def test_icase_unique(input, output):
    assert util.icase_unique(input) == output