server/tags: create snapshots for automatic tags
This commit is contained in:
parent
6a48020426
commit
fa14bf714c
4 changed files with 24 additions and 12 deletions
|
@ -1,8 +1,17 @@
|
|||
import datetime
|
||||
from szurubooru import search
|
||||
from szurubooru import db, search
|
||||
from szurubooru.api.base_api import BaseApi
|
||||
from szurubooru.func import auth, tags, snapshots
|
||||
|
||||
def _create_if_needed(tag_names, user):
|
||||
if not tag_names:
|
||||
return
|
||||
auth.verify_privilege(user, 'tags:create')
|
||||
_existing_tags, new_tags = tags.get_or_create_tags_by_names(tag_names)
|
||||
db.session.flush()
|
||||
for tag in new_tags:
|
||||
snapshots.save_entity_creation(tag, user)
|
||||
|
||||
class TagListApi(BaseApi):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
@ -23,6 +32,9 @@ class TagListApi(BaseApi):
|
|||
implications = ctx.get_param_as_list(
|
||||
'implications', required=False, default=[])
|
||||
|
||||
_create_if_needed(suggestions, ctx.user)
|
||||
_create_if_needed(implications, ctx.user)
|
||||
|
||||
tag = tags.create_tag(names, category, suggestions, implications)
|
||||
ctx.session.add(tag)
|
||||
ctx.session.flush()
|
||||
|
@ -48,12 +60,14 @@ class TagDetailApi(BaseApi):
|
|||
tag, ctx.get_param_as_string('category'))
|
||||
if ctx.has_param('suggestions'):
|
||||
auth.verify_privilege(ctx.user, 'tags:edit:suggestions')
|
||||
tags.update_tag_suggestions(
|
||||
tag, ctx.get_param_as_list('suggestions'))
|
||||
suggestions = ctx.get_param_as_list('suggestions')
|
||||
_create_if_needed(suggestions, ctx.user)
|
||||
tags.update_tag_suggestions(tag, suggestions)
|
||||
if ctx.has_param('implications'):
|
||||
auth.verify_privilege(ctx.user, 'tags:edit:implications')
|
||||
tags.update_tag_implications(
|
||||
tag, ctx.get_param_as_list('implications'))
|
||||
implications = ctx.get_param_as_list('implications')
|
||||
_create_if_needed(implications, ctx.user)
|
||||
tags.update_tag_implications(tag, implications)
|
||||
tag.last_edit_time = datetime.datetime.now()
|
||||
ctx.session.flush()
|
||||
snapshots.save_entity_modification(tag, ctx.user)
|
||||
|
|
|
@ -214,13 +214,9 @@ def update_tag_names(tag, names):
|
|||
def update_tag_implications(tag, relations):
|
||||
if _check_name_intersection(_get_plain_names(tag), relations):
|
||||
raise InvalidTagRelationError('Tag cannot imply itself.')
|
||||
related_tags, new_tags = get_or_create_tags_by_names(relations)
|
||||
db.session.flush()
|
||||
tag.implications = related_tags + new_tags
|
||||
tag.implications = get_tags_by_names(relations)
|
||||
|
||||
def update_tag_suggestions(tag, relations):
|
||||
if _check_name_intersection(_get_plain_names(tag), relations):
|
||||
raise InvalidTagRelationError('Tag cannot suggest itself.')
|
||||
related_tags, new_tags = get_or_create_tags_by_names(relations)
|
||||
db.session.flush()
|
||||
tag.suggestions = related_tags + new_tags
|
||||
tag.suggestions = get_tags_by_names(relations)
|
||||
|
|
|
@ -249,11 +249,12 @@ def test_reusing_suggestions_and_implications(test_ctx):
|
|||
}
|
||||
])
|
||||
def test_tag_trying_to_relate_to_itself(test_ctx, input):
|
||||
with pytest.raises(tags.InvalidTagRelationError):
|
||||
with pytest.raises(tags.TagAlreadyExistsError):
|
||||
test_ctx.api.post(
|
||||
test_ctx.context_factory(
|
||||
input=input,
|
||||
user=test_ctx.user_factory(rank=db.User.RANK_REGULAR)))
|
||||
db.session.rollback()
|
||||
assert tags.try_get_tag_by_name('tag') is None
|
||||
|
||||
def test_trying_to_create_tag_without_privileges(test_ctx):
|
||||
|
|
|
@ -16,6 +16,7 @@ def test_ctx(
|
|||
'tag_name_regex': '^[^!]*$',
|
||||
'tag_category_name_regex': '^[^!]*$',
|
||||
'privileges': {
|
||||
'tags:create': db.User.RANK_REGULAR,
|
||||
'tags:edit:names': db.User.RANK_REGULAR,
|
||||
'tags:edit:category': db.User.RANK_REGULAR,
|
||||
'tags:edit:suggestions': db.User.RANK_REGULAR,
|
||||
|
|
Loading…
Reference in a new issue