def update_post_notes(post: model.Post, notes: Any) -> None: assert post post.notes = [] for note in notes: for field in ('polygon', 'text'): if field not in note: raise InvalidPostNoteError('메모의 %r 필드가 누락되었습니다.' % field) if not note['text']: raise InvalidPostNoteError('메모의 텍스트가 반드시 필요합니다.') if not isinstance(note['polygon'], (list, tuple)): raise InvalidPostNoteError('메모의 폴리곤은 점의 리스트여야 합니다.') if len(note['polygon']) < 3: raise InvalidPostNoteError('메모의 폴리곤은 최소 3개의 점이 포함되어야 합니다.') for point in note['polygon']: if not isinstance(point, (list, tuple)): raise InvalidPostNoteError('메모의 폴리곤 점은 길이 2인 리스트여야 합니다.') if len(point) != 2: raise InvalidPostNoteError('메모의 폴리곤 점은 두 좌표축을 포함해야 합니다.') try: pos_x = float(point[0]) pos_y = float(point[1]) if not 0 <= pos_x <= 1 or not 0 <= pos_y <= 1: raise InvalidPostNoteError( '메모의 모든 폴리곤 점은 이미지 내부에 존재해야 합니다 (0 ~ 1 범위).') except ValueError: raise InvalidPostNoteError('메모의 폴리곤 점은 숫자여야 합니다.') if util.value_exceeds_column_size(note['text'], model.PostNote.text): raise InvalidPostNoteError('메모 텍스트가 너무 깁니다.') post.notes.append( model.PostNote(polygon=note['polygon'], text=str(note['text'])))
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))
def update_post_notes(post: model.Post, notes: Any) -> None: assert post post.notes = [] for note in notes: for field in ('polygon', 'text'): if field not in note: raise InvalidPostNoteError('Note is missing %r field.' % field) if not note['text']: raise InvalidPostNoteError('A note\'s text cannot be empty.') if not isinstance(note['polygon'], (list, tuple)): raise InvalidPostNoteError( 'A note\'s polygon must be a list of points.') if len(note['polygon']) < 3: raise InvalidPostNoteError( 'A note\'s polygon must have at least 3 points.') for point in note['polygon']: if not isinstance(point, (list, tuple)): raise InvalidPostNoteError( 'A note\'s polygon point must be a list of length 2.') if len(point) != 2: raise InvalidPostNoteError( 'A point in note\'s polygon must have two coordinates.') try: pos_x = float(point[0]) pos_y = float(point[1]) if not 0 <= pos_x <= 1 or not 0 <= pos_y <= 1: raise InvalidPostNoteError( 'All points must fit in the image (0..1 range).') except ValueError: raise InvalidPostNoteError( 'A point in note\'s polygon must be numeric.') if util.value_exceeds_column_size(note['text'], model.PostNote.text): raise InvalidPostNoteError('Note text is too long.') post.notes.append( model.PostNote(polygon=note['polygon'], text=str(note['text'])))
def update_post_notes(post: model.Post, notes: Any) -> None: assert post post.notes = [] for note in notes: for field in ('polygon', 'text'): if field not in note: raise InvalidPostNoteError('Note is missing %r field.' % field) if not note['text']: raise InvalidPostNoteError('A note\'s text cannot be empty.') if not isinstance(note['polygon'], (list, tuple)): raise InvalidPostNoteError( 'A note\'s polygon must be a list of points.') if len(note['polygon']) < 3: raise InvalidPostNoteError( 'A note\'s polygon must have at least 3 points.') for point in note['polygon']: if not isinstance(point, (list, tuple)): raise InvalidPostNoteError( 'A note\'s polygon point must be a list of length 2.') if len(point) != 2: raise InvalidPostNoteError( 'A point in note\'s polygon must have two coordinates.') try: pos_x = float(point[0]) pos_y = float(point[1]) if not 0 <= pos_x <= 1 or not 0 <= pos_y <= 1: raise InvalidPostNoteError( 'All points must fit in the image (0..1 range).') except ValueError: raise InvalidPostNoteError( 'A point in note\'s polygon must be numeric.') if util.value_exceeds_column_size(note['text'], model.PostNote.text): raise InvalidPostNoteError('Note text is too long.') post.notes.append( model.PostNote(polygon=note['polygon'], text=str(note['text'])))
def update_post_notes(post, notes): post.notes = [] for note in notes: for field in ('polygon', 'text'): if field not in note: raise InvalidPostNoteError('Note is missing %r field.' % field) if not note['text']: raise InvalidPostNoteError('A note\'s text cannot be empty.') if len(note['polygon']) < 3: raise InvalidPostNoteError( 'A note\'s polygon must have at least 3 points.') for point in note['polygon']: if len(point) != 2: raise InvalidPostNoteError( 'A point in note\'s polygon must have two coordinates.') try: pos_x = float(point[0]) pos_y = float(point[1]) if not 0 <= pos_x <= 1 or not 0 <= pos_y <= 1: raise InvalidPostNoteError( 'A point in note\'s polygon must be in 0..1 range.') except ValueError: raise InvalidPostNoteError( 'A point in note\'s polygon must be numeric.') if util.value_exceeds_column_size(note['text'], db.PostNote.text): raise InvalidPostNoteError('Note text is too long.') post.notes.append( db.PostNote(polygon=note['polygon'], text=note['text']))
def update_user_token_note(user_token: model.UserToken, note: str) -> None: assert user_token note = note.strip() if note is not None else '' note = None if len(note) == 0 else note if util.value_exceeds_column_size(note, model.UserToken.note): raise InvalidNoteError('Note is too long.') user_token.note = note update_user_token_edit_time(user_token)
def update_user_email(user: model.User, email: str) -> None: assert user email = email.strip() if util.value_exceeds_column_size(email, model.User.email): raise InvalidEmailError('이메일이 너무 깁니다.') if not util.is_valid_email(email): raise InvalidEmailError('잘못된 이메일입니다.') user.email = email or None
def update_user_email(user: model.User, email: str) -> None: assert user email = email.strip() if util.value_exceeds_column_size(email, model.User.email): raise InvalidEmailError('Email is too long.') if not util.is_valid_email(email): raise InvalidEmailError('E-mail is invalid.') user.email = email or None
def update_category_color(category, color): if not color: raise InvalidTagCategoryNameError('Color cannot be empty.') if not re.match(r'^#?[0-9a-z]+$', color): raise InvalidTagCategoryNameError('Invalid color.') if util.value_exceeds_column_size(color, db.TagCategory.color): raise InvalidTagCategoryColorError('Color is too long.') category.color = color
def update_user_email(user: model.User, email: str) -> None: assert user email = email.strip() if util.value_exceeds_column_size(email, model.User.email): raise InvalidEmailError('Email is too long.') if not util.is_valid_email(email): raise InvalidEmailError('E-mail is invalid.') user.email = email or None
def update_category_color(category, color): if not color: raise InvalidTagCategoryNameError('Color cannot be empty.') if not re.match(r'^#?[0-9a-z]+$', color): raise InvalidTagCategoryNameError('Invalid color.') if util.value_exceeds_column_size(color, db.TagCategory.color): raise InvalidTagCategoryColorError('Color is too long.') category.color = color
def update_category_color(category: model.TagCategory, color: str) -> None: assert category if not color: raise InvalidTagCategoryColorError("Color cannot be empty.") if not re.match(r"^#?[0-9a-z]+$", color): raise InvalidTagCategoryColorError("Invalid color.") if util.value_exceeds_column_size(color, model.TagCategory.color): raise InvalidTagCategoryColorError("Color is too long.") category.color = color
def update_category_color(category: model.TagCategory, color: str) -> None: assert category if not color: raise InvalidTagCategoryColorError('색상은 빈 값일 수 없습니다.') if not re.match(r'^#?[0-9A-Za-z]+$', color): raise InvalidTagCategoryColorError('잘못된 색상.') if util.value_exceeds_column_size(color, model.TagCategory.color): raise InvalidTagCategoryColorError('색상이 너무 깁니다.') category.color = color
def update_user_email(user, email): if email: email = email.strip() if not email: email = None if email and util.value_exceeds_column_size(email, db.User.email): raise InvalidEmailError('Email is too long.') if not util.is_valid_email(email): raise InvalidEmailError('E-mail is invalid.') user.email = email
def update_email(user, email): if email: email = email.strip() if not email: email = None if email and util.value_exceeds_column_size(email, db.User.email): raise InvalidEmailError('Email is too long.') if not util.is_valid_email(email): raise InvalidEmailError('E-mail is invalid.') user.email = email
def update_name(category, name): if not name: raise InvalidTagCategoryNameError('Name cannot be empty.') expr = db.TagCategory.name.ilike(name) if category.tag_category_id: expr = expr & (db.TagCategory.tag_category_id != category.tag_category_id) already_exists = db.session.query(db.TagCategory).filter(expr).count() > 0 if already_exists: raise TagCategoryAlreadyExistsError( 'A category with this name already exists.') if util.value_exceeds_column_size(name, db.TagCategory.name): raise InvalidTagCategoryNameError('Name is too long.') _verify_name_validity(name) category.name = name
def update_user_name(user, name): if not name: raise InvalidUserNameError('Name cannot be empty.') if util.value_exceeds_column_size(name, db.User.name): raise InvalidUserNameError('User name is too long.') other_user = try_get_user_by_name(name) if other_user and other_user.user_id != user.user_id: raise UserAlreadyExistsError('User %r already exists.' % name) name = name.strip() name_regex = config.config['user_name_regex'] if not re.match(name_regex, name): raise InvalidUserNameError('User name %r must satisfy regex %r.' % (name, name_regex)) user.name = name
def update_name(user, name, auth_user): if not name: raise InvalidUserNameError('Name cannot be empty.') if util.value_exceeds_column_size(name, db.User.name): raise InvalidUserNameError('User name is too long.') other_user = get_user_by_name(name) if other_user and other_user.user_id != auth_user.user_id: raise UserAlreadyExistsError('User %r already exists.' % name) name = name.strip() name_regex = config.config['user_name_regex'] if not re.match(name_regex, name): raise InvalidUserNameError( 'User name %r must satisfy regex %r.' % (name, name_regex)) user.name = name
def update_category_name(category, name): if not name: raise InvalidTagCategoryNameError('Name cannot be empty.') expr = db.TagCategory.name.ilike(name) if category.tag_category_id: expr = expr & (db.TagCategory.tag_category_id != category.tag_category_id) already_exists = db.session.query(db.TagCategory).filter(expr).count() > 0 if already_exists: raise TagCategoryAlreadyExistsError( 'A category with this name already exists.') if util.value_exceeds_column_size(name, db.TagCategory.name): raise InvalidTagCategoryNameError('Name is too long.') _verify_name_validity(name) category.name = name
def update_category_name(category: model.TagCategory, name: str) -> None: assert category if not name: raise InvalidTagCategoryNameError('이름은 빈 값일 수 없습니다.') expr = sa.func.lower(model.TagCategory.name) == name.lower() if category.tag_category_id: expr = expr & (model.TagCategory.tag_category_id != category.tag_category_id) already_exists = (db.session.query(model.TagCategory).filter(expr).count() > 0) if already_exists: raise TagCategoryAlreadyExistsError('동일한 이름의 카테고리자 존재합니다.') if util.value_exceeds_column_size(name, model.TagCategory.name): raise InvalidTagCategoryNameError('이름이 너무 깁니다.') _verify_name_validity(name) category.name = name cache.remove(DEFAULT_CATEGORY_NAME_CACHE_KEY)
def update_user_name(user: model.User, name: str) -> None: assert user if not name: raise InvalidUserNameError('닉네임(ID)은 빈 값일 수 없습니다.') if util.value_exceeds_column_size(name, model.User.name): raise InvalidUserNameError('닉네임(ID)이 너무 깁니다.') name = name.strip() name_regex = config.config['user_name_regex'] if not re.match(name_regex, name): raise InvalidUserNameError('닉네임(ID) %r 은(는) 다음의 정규식을 만족해야 합니다: %r' % (name, name_regex)) other_user = try_get_user_by_name(name) if other_user and other_user.user_id != user.user_id: raise UserAlreadyExistsError('사용자 %r 은(는) 이미 존재합니다.' % name) if user.name and files.has(get_avatar_path(user.name)): files.move(get_avatar_path(user.name), get_avatar_path(name)) user.name = name
def update_user_name(user: model.User, name: str) -> None: assert user if not name: raise InvalidUserNameError('Name cannot be empty.') if util.value_exceeds_column_size(name, model.User.name): raise InvalidUserNameError('User name is too long.') name = name.strip() name_regex = config.config['user_name_regex'] if not re.match(name_regex, name): raise InvalidUserNameError('User name %r must satisfy regex %r.' % (name, name_regex)) other_user = try_get_user_by_name(name) if other_user and other_user.user_id != user.user_id: raise UserAlreadyExistsError('User %r already exists.' % name) if user.name and files.has(get_avatar_path(user.name)): files.move(get_avatar_path(user.name), get_avatar_path(name)) user.name = name
def update_category_name(category, name): assert category if not name: raise InvalidTagCategoryNameError('Name cannot be empty.') expr = sqlalchemy.func.lower(db.TagCategory.name) == name.lower() if category.tag_category_id: expr = expr & ( db.TagCategory.tag_category_id != category.tag_category_id) already_exists = db.session.query(db.TagCategory).filter(expr).count() > 0 if already_exists: raise TagCategoryAlreadyExistsError( 'A category with this name already exists.') if util.value_exceeds_column_size(name, db.TagCategory.name): raise InvalidTagCategoryNameError('Name is too long.') _verify_name_validity(name) category.name = name cache.remove(DEFAULT_CATEGORY_NAME_CACHE_KEY)
def update_user_name(user: model.User, name: str) -> None: assert user if not name: raise InvalidUserNameError('Name cannot be empty.') if util.value_exceeds_column_size(name, model.User.name): raise InvalidUserNameError('User name is too long.') name = name.strip() name_regex = config.config['user_name_regex'] if not re.match(name_regex, name): raise InvalidUserNameError( 'User name %r must satisfy regex %r.' % (name, name_regex)) other_user = try_get_user_by_name(name) if other_user and other_user.user_id != user.user_id: raise UserAlreadyExistsError('User %r already exists.' % name) if user.name and files.has(get_avatar_path(user.name)): files.move(get_avatar_path(user.name), get_avatar_path(name)) user.name = name
def update_category_name(category: model.TagCategory, name: str) -> None: assert category if not name: raise InvalidTagCategoryNameError("Name cannot be empty.") expr = sa.func.lower(model.TagCategory.name) == name.lower() if category.tag_category_id: expr = expr & (model.TagCategory.tag_category_id != category.tag_category_id) already_exists = (db.session.query(model.TagCategory).filter(expr).count() > 0) if already_exists: raise TagCategoryAlreadyExistsError( "A category with this name already exists.") if util.value_exceeds_column_size(name, model.TagCategory.name): raise InvalidTagCategoryNameError("Name is too long.") _verify_name_validity(name) category.name = name cache.remove(DEFAULT_CATEGORY_NAME_CACHE_KEY)
def _verify_name_validity(name: str) -> None: if util.value_exceeds_column_size(name, model.PoolName.name): raise InvalidPoolNameError("Name is too long.") name_regex = config.config["pool_name_regex"] if not re.match(name_regex, name): raise InvalidPoolNameError("Name must satisfy regex %r." % name_regex)
def update_post_source(post: model.Post, source: Optional[str]) -> None: assert post if util.value_exceeds_column_size(source, model.Post.source): raise InvalidPostSourceError('Source is too long.') post.source = source or None
def update_pool_description(pool: model.Pool, description: str) -> None: assert pool if util.value_exceeds_column_size(description, model.Pool.description): raise InvalidPoolDescriptionError("Description is too long.") pool.description = description or None
def _verify_name_validity(name: str) -> None: if util.value_exceeds_column_size(name, model.TagName.name): raise InvalidTagNameError('Name is too long.') name_regex = config.config['tag_name_regex'] if not re.match(name_regex, name): raise InvalidTagNameError('Name must satisfy regex %r.' % name_regex)
def update_post_source(post: model.Post, source: Optional[str]) -> None: assert post if util.value_exceeds_column_size(source, model.Post.source): raise InvalidPostSourceError('Source is too long.') post.source = source or None
def update_tag_description(tag: model.Tag, description: str) -> None: assert tag if util.value_exceeds_column_size(description, model.Tag.description): raise InvalidTagDescriptionError("Description is too long.") tag.description = description or None
def update_tag_description(tag: model.Tag, description: str) -> None: assert tag if util.value_exceeds_column_size(description, model.Tag.description): raise InvalidTagDescriptionError('Description is too long.') tag.description = description or None
def update_tag_description(tag, description): assert tag if util.value_exceeds_column_size(description, db.Tag.description): raise InvalidTagDescriptionError('Description is too long.') tag.description = description
def _verify_name_validity(name: str) -> None: if util.value_exceeds_column_size(name, model.TagName.name): raise InvalidTagNameError('Name is too long.') name_regex = config.config['tag_name_regex'] if not re.match(name_regex, name): raise InvalidTagNameError('Name must satisfy regex %r.' % name_regex)
def _verify_name_validity(name: str) -> None: if util.value_exceeds_column_size(name, model.TagName.name): raise InvalidTagNameError('이름이 너무 깁니다.') name_regex = config.config['tag_name_regex'] if not re.match(name_regex, name): raise InvalidTagNameError('이름은 다음 정규식을 만족해야 합니다: %r' % name_regex)
def update_post_source(post, source): if util.value_exceeds_column_size(source, db.Post.source): raise InvalidPostSourceError('Source is too long.') post.source = source
def update_color(category, color): if not color: raise InvalidTagCategoryNameError('Color cannot be empty.') if util.value_exceeds_column_size(color, db.TagCategory.color): raise InvalidTagCategoryColorError('Color is too long.') category.color = color