def update_tag(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: tag = _get_tag(params) versions.verify_version(tag, ctx) versions.bump_version(tag) if ctx.has_param('names'): auth.verify_privilege(ctx.user, 'tags:edit:names') tags.update_tag_names(tag, ctx.get_param_as_string_list('names')) if ctx.has_param('category'): auth.verify_privilege(ctx.user, 'tags:edit:category') tags.update_tag_category_name( tag, ctx.get_param_as_string('category')) if ctx.has_param('description'): auth.verify_privilege(ctx.user, 'tags:edit:description') tags.update_tag_description( tag, ctx.get_param_as_string('description')) if ctx.has_param('suggestions'): auth.verify_privilege(ctx.user, 'tags:edit:suggestions') suggestions = ctx.get_param_as_string_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') implications = ctx.get_param_as_string_list('implications') _create_if_needed(implications, ctx.user) tags.update_tag_implications(tag, implications) tag.last_edit_time = datetime.utcnow() ctx.session.flush() snapshots.modify(tag, ctx.user) ctx.session.commit() return _serialize(ctx, tag)
def update_tag(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: tag = _get_tag(params) versions.verify_version(tag, ctx) versions.bump_version(tag) if ctx.has_param("names"): auth.verify_privilege(ctx.user, "tags:edit:names") tags.update_tag_names(tag, ctx.get_param_as_string_list("names")) if ctx.has_param("category"): auth.verify_privilege(ctx.user, "tags:edit:category") tags.update_tag_category_name(tag, ctx.get_param_as_string("category")) if ctx.has_param("description"): auth.verify_privilege(ctx.user, "tags:edit:description") tags.update_tag_description(tag, ctx.get_param_as_string("description")) if ctx.has_param("suggestions"): auth.verify_privilege(ctx.user, "tags:edit:suggestions") suggestions = ctx.get_param_as_string_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") implications = ctx.get_param_as_string_list("implications") _create_if_needed(implications, ctx.user) tags.update_tag_implications(tag, implications) tag.last_edit_time = datetime.utcnow() ctx.session.flush() snapshots.modify(tag, ctx.user) ctx.session.commit() return _serialize(ctx, tag)
def put(self, ctx, tag_name): tag = tags.get_tag_by_name(tag_name) if not tag: raise tags.TagNotFoundError('Tag %r not found.' % tag_name) if ctx.has_param('names'): auth.verify_privilege(ctx.user, 'tags:edit:names') tags.update_names(tag, ctx.get_param_as_list('names')) if ctx.has_param('category'): auth.verify_privilege(ctx.user, 'tags:edit:category') tags.update_category_name(tag, ctx.get_param_as_string('category')) if ctx.has_param('suggestions'): auth.verify_privilege(ctx.user, 'tags:edit:suggestions') tags.update_suggestions(tag, ctx.get_param_as_list('suggestions')) if ctx.has_param('implications'): auth.verify_privilege(ctx.user, 'tags:edit:implications') tags.update_implications(tag, ctx.get_param_as_list('implications')) tag.last_edit_time = datetime.datetime.now() snapshots.modify(tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_tag_with_details(tag)
def test_get_data(fake_datetime, tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('2016-04-19 13:00:00'): snapshots.create(tag, user) tag.names = [db.TagName('changed')] with fake_datetime('2016-04-19 13:10:01'): snapshots.modify(tag, user) assert snapshots.get_data(tag) == [ { 'time': datetime.datetime(2016, 4, 19, 13, 10, 1), 'data': { 'names': ['changed'], 'category': 'dummy', 'suggestions': [], 'implications': [], }, }, { 'time': datetime.datetime(2016, 4, 19, 13, 0, 0), 'data': { 'names': ['dummy'], 'category': 'dummy', 'suggestions': [], 'implications': [], }, }, ]
def update_tag(ctx, params): tag = tags.get_tag_by_name(params['tag_name']) versions.verify_version(tag, ctx) versions.bump_version(tag) if ctx.has_param('names'): auth.verify_privilege(ctx.user, 'tags:edit:names') tags.update_tag_names(tag, ctx.get_param_as_list('names')) if ctx.has_param('category'): auth.verify_privilege(ctx.user, 'tags:edit:category') tags.update_tag_category_name( tag, ctx.get_param_as_string('category')) if ctx.has_param('description'): auth.verify_privilege(ctx.user, 'tags:edit:description') tags.update_tag_description( tag, ctx.get_param_as_string('description', default=None)) if ctx.has_param('suggestions'): auth.verify_privilege(ctx.user, 'tags:edit: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') 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.utcnow() ctx.session.flush() snapshots.modify(tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, tag)
def test_merging_deletion_to_modification_or_creation( fake_datetime, tag_factory, user_factory, initial_operation): tag = tag_factory(names=['dummy'], category_name='dummy') user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('13:00:00'): initial_operation(tag, user) tag.names = [db.TagName('changed')] with fake_datetime('14:00:00'): snapshots.modify(tag, user) tag.names = [db.TagName('changed again')] with fake_datetime('14:00:01'): snapshots.delete(tag, user) assert db.session.query(db.Snapshot).count() == 2 results = db.session \ .query(db.Snapshot) \ .order_by(db.Snapshot.snapshot_id.asc()) \ .all() assert results[1].operation == db.Snapshot.OPERATION_DELETED assert results[1].data == { 'names': ['changed again'], 'category': 'dummy', 'suggestions': [], 'implications': [], }
def test_modify_saves_non_empty_diffs(post_factory, user_factory): if 'sqlite' in db.sessionmaker.kw['bind'].driver: pytest.xfail( 'SQLite doesn\'t support transaction isolation, ' 'which is required to retrieve original entity') post = post_factory() post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text='old')] user = user_factory() db.session.add_all([post, user]) db.session.commit() post.source = 'new source' post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text='new')] db.session.flush() snapshots.modify(post, user) db.session.flush() results = db.session.query(model.Snapshot).all() assert len(results) == 1 assert results[0].data == { 'type': 'object change', 'value': { 'source': { 'type': 'primitive change', 'old-value': None, 'new-value': 'new source', }, 'notes': { 'type': 'list change', 'removed': [ {'polygon': [[0, 0], [0, 1], [1, 1]], 'text': 'old'}], 'added': [ {'polygon': [[0, 0], [0, 1], [1, 1]], 'text': 'new'}], }, }, }
def test_modify_doesnt_save_empty_diffs(tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.commit() snapshots.modify(tag, user) db.session.flush() assert db.session.query(model.Snapshot).count() == 0
def set_tag_category_as_default(ctx, params): auth.verify_privilege(ctx.user, 'tag_categories:set_default') category = tag_categories.get_category_by_name( params['category_name'], lock=True) tag_categories.set_default_category(category) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, category)
def set_tag_category_as_default( ctx: rest.Context, params: Dict[str, str]) -> rest.Response: auth.verify_privilege(ctx.user, 'tag_categories:set_default') category = tag_categories.get_category_by_name( params['category_name'], lock=True) tag_categories.set_default_category(category) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() return _serialize(ctx, category)
def set_pool_category_as_default(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: auth.verify_privilege(ctx.user, "pool_categories:set_default") category = pool_categories.get_category_by_name(params["category_name"], lock=True) pool_categories.set_default_category(category) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() return _serialize(ctx, category)
def set_tag_category_as_default( ctx: rest.Context, params: Dict[str, str]) -> rest.Response: auth.verify_privilege(ctx.user, 'tag_categories:set_default') category = tag_categories.get_category_by_name( params['category_name'], lock=True) tag_categories.set_default_category(category) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, category)
def test_not_merging_operations_by_different_users( fake_datetime, tag_factory, user_factory): tag = tag_factory(names=['dummy']) user1, user2 = [user_factory(), user_factory()] db.session.add_all([tag, user1, user2]) db.session.flush() with fake_datetime('13:00:00'): snapshots.create(tag, user1) tag.names = [db.TagName('changed')] snapshots.modify(tag, user2) assert db.session.query(db.Snapshot).count() == 2
def set_featured_post(ctx, _params=None): auth.verify_privilege(ctx.user, 'posts:feature') post_id = ctx.get_param_as_int('id', required=True) post = posts.get_post_by_id(post_id) featured_post = posts.try_get_featured_post() if featured_post and featured_post.post_id == post.post_id: raise posts.PostAlreadyFeaturedError( 'Post %r is already featured.' % post_id) posts.feature_post(post, ctx.user) snapshots.modify(post, ctx.user) ctx.session.commit() return _serialize_post(ctx, post)
def test_merging_modification_to_creation(tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() snapshots.create(tag, user) tag.names = [db.TagName('changed')] snapshots.modify(tag, user) results = db.session.query(db.Snapshot).all() assert len(results) == 1 assert results[0].operation == db.Snapshot.OPERATION_CREATED assert results[0].data['names'] == ['changed']
def set_featured_post(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, 'posts:feature') post_id = ctx.get_param_as_int('id') post = posts.get_post_by_id(post_id) featured_post = posts.try_get_featured_post() if featured_post and featured_post.post_id == post.post_id: raise posts.PostAlreadyFeaturedError('짤 %r 는 이미 대문짤임.' % post_id) posts.feature_post(post, ctx.user) snapshots.modify(post, ctx.user) ctx.session.commit() return _serialize_post(ctx, post)
def test_not_merging_due_to_time_difference( fake_datetime, tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('13:00:00'): snapshots.create(tag, user) tag.names = [db.TagName('changed')] with fake_datetime('13:10:01'): snapshots.modify(tag, user) assert db.session.query(db.Snapshot).count() == 2
def set_featured_post( ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, 'posts:feature') post_id = ctx.get_param_as_int('id') post = posts.get_post_by_id(post_id) featured_post = posts.try_get_featured_post() if featured_post and featured_post.post_id == post.post_id: raise posts.PostAlreadyFeaturedError( 'Post %r is already featured.' % post_id) posts.feature_post(post, ctx.user) snapshots.modify(post, ctx.user) ctx.session.commit() return _serialize_post(ctx, post)
def test_not_adding_snapshot_if_data_doesnt_change( fake_datetime, tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('13:00:00'): snapshots.create(tag, user) with fake_datetime('14:00:00'): snapshots.modify(tag, user) results = db.session.query(db.Snapshot).all() assert len(results) == 1 assert results[0].operation == db.Snapshot.OPERATION_CREATED assert results[0].data['names'] == ['dummy']
def update_post(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: post = _get_post(params) versions.verify_version(post, ctx) versions.bump_version(post) if ctx.has_file("content"): auth.verify_privilege(ctx.user, "posts:edit:content") posts.update_post_content( post, ctx.get_file( "content", use_video_downloader=auth.has_privilege( ctx.user, "uploads:use_downloader"), ), ) if ctx.has_param("tags"): auth.verify_privilege(ctx.user, "posts:edit:tags") new_tags = posts.update_post_tags(post, ctx.get_param_as_string_list("tags")) if len(new_tags): auth.verify_privilege(ctx.user, "tags:create") db.session.flush() for tag in new_tags: snapshots.create(tag, ctx.user) if ctx.has_param("safety"): auth.verify_privilege(ctx.user, "posts:edit:safety") posts.update_post_safety(post, ctx.get_param_as_string("safety")) if ctx.has_param("source"): auth.verify_privilege(ctx.user, "posts:edit:source") posts.update_post_source(post, ctx.get_param_as_string("source")) elif ctx.has_param("contentUrl"): posts.update_post_source(post, ctx.get_param_as_string("contentUrl")) if ctx.has_param("relations"): auth.verify_privilege(ctx.user, "posts:edit:relations") posts.update_post_relations(post, ctx.get_param_as_int_list("relations")) if ctx.has_param("notes"): auth.verify_privilege(ctx.user, "posts:edit:notes") posts.update_post_notes(post, ctx.get_param_as_list("notes")) if ctx.has_param("flags"): auth.verify_privilege(ctx.user, "posts:edit:flags") posts.update_post_flags(post, ctx.get_param_as_string_list("flags")) if ctx.has_file("thumbnail"): auth.verify_privilege(ctx.user, "posts:edit:thumbnail") posts.update_post_thumbnail(post, ctx.get_file("thumbnail")) post.last_edit_time = datetime.utcnow() ctx.session.flush() snapshots.modify(post, ctx.user) ctx.session.commit() return _serialize_post(ctx, post)
def test_merging_deletion_all_the_way_deletes_all_snapshots( fake_datetime, tag_factory, user_factory, expected_operation): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('13:00:00'): snapshots.create(tag, user) tag.names = [db.TagName('changed')] with fake_datetime('13:00:01'): snapshots.modify(tag, user) tag.names = [db.TagName('changed again')] with fake_datetime('13:00:02'): snapshots.delete(tag, user) assert db.session.query(db.Snapshot).count() == 0
def test_merging_resets_merging_time_window( fake_datetime, tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('13:00:00'): snapshots.create(tag, user) tag.names = [db.TagName('changed')] with fake_datetime('13:09:59'): snapshots.modify(tag, user) tag.names = [db.TagName('changed again')] with fake_datetime('13:19:59'): snapshots.modify(tag, user) results = db.session.query(db.Snapshot).all() assert len(results) == 1 assert results[0].data['names'] == ['changed again']
def put(self, ctx, category_name): category = tag_categories.get_category_by_name(category_name) if not category: raise tag_categories.TagCategoryNotFoundError( 'Tag category %r not found.' % category_name) if ctx.has_param('name'): auth.verify_privilege(ctx.user, 'tag_categories:edit:name') tag_categories.update_name( category, ctx.get_param_as_string('name')) if ctx.has_param('color'): auth.verify_privilege(ctx.user, 'tag_categories:edit:color') tag_categories.update_color( category, ctx.get_param_as_string('color')) snapshots.modify(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_category_with_details(category)
def update_pool_category(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: category = pool_categories.get_category_by_name(params["category_name"], lock=True) versions.verify_version(category, ctx) versions.bump_version(category) if ctx.has_param("name"): auth.verify_privilege(ctx.user, "pool_categories:edit:name") pool_categories.update_category_name(category, ctx.get_param_as_string("name")) if ctx.has_param("color"): auth.verify_privilege(ctx.user, "pool_categories:edit:color") pool_categories.update_category_color(category, ctx.get_param_as_string("color")) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() return _serialize(ctx, category)
def update_tag_category(ctx, params): category = tag_categories.get_category_by_name( params['category_name'], lock=True) versions.verify_version(category, ctx) versions.bump_version(category) if ctx.has_param('name'): auth.verify_privilege(ctx.user, 'tag_categories:edit:name') tag_categories.update_category_name( category, ctx.get_param_as_string('name')) if ctx.has_param('color'): auth.verify_privilege(ctx.user, 'tag_categories:edit:color') tag_categories.update_category_color( category, ctx.get_param_as_string('color')) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, category)
def update_tag_category( ctx: rest.Context, params: Dict[str, str]) -> rest.Response: category = tag_categories.get_category_by_name( params['category_name'], lock=True) versions.verify_version(category, ctx) versions.bump_version(category) if ctx.has_param('name'): auth.verify_privilege(ctx.user, 'tag_categories:edit:name') tag_categories.update_category_name( category, ctx.get_param_as_string('name')) if ctx.has_param('color'): auth.verify_privilege(ctx.user, 'tag_categories:edit:color') tag_categories.update_category_color( category, ctx.get_param_as_string('color')) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() return _serialize(ctx, category)
def update_post(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: post = _get_post(params) versions.verify_version(post, ctx) versions.bump_version(post) if ctx.has_file('content'): auth.verify_privilege(ctx.user, 'posts:edit:content') posts.update_post_content(post, ctx.get_file('content')) if ctx.has_param('tags'): auth.verify_privilege(ctx.user, 'posts:edit:tags') new_tags = posts.update_post_tags( post, ctx.get_param_as_string_list('tags')) if len(new_tags): auth.verify_privilege(ctx.user, 'tags:create') db.session.flush() for tag in new_tags: snapshots.create(tag, ctx.user) if ctx.has_param('safety'): auth.verify_privilege(ctx.user, 'posts:edit:safety') posts.update_post_safety(post, ctx.get_param_as_string('safety')) if ctx.has_param('source'): auth.verify_privilege(ctx.user, 'posts:edit:source') posts.update_post_source(post, ctx.get_param_as_string('source')) elif ctx.has_param('contentUrl'): posts.update_post_source(post, ctx.get_param_as_string('contentUrl')) if ctx.has_param('relations'): auth.verify_privilege(ctx.user, 'posts:edit:relations') posts.update_post_relations( post, ctx.get_param_as_int_list('relations')) if ctx.has_param('notes'): auth.verify_privilege(ctx.user, 'posts:edit:notes') posts.update_post_notes(post, ctx.get_param_as_list('notes')) if ctx.has_param('flags'): auth.verify_privilege(ctx.user, 'posts:edit:flags') posts.update_post_flags(post, ctx.get_param_as_string_list('flags')) if ctx.has_file('thumbnail'): auth.verify_privilege(ctx.user, 'posts:edit:thumbnail') posts.update_post_thumbnail(post, ctx.get_file('thumbnail')) post.last_edit_time = datetime.utcnow() ctx.session.flush() snapshots.modify(post, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_post(ctx, post)
def test_merging_modifications(fake_datetime, tag_factory, user_factory): tag = tag_factory(names=['dummy']) user = user_factory() db.session.add_all([tag, user]) db.session.flush() with fake_datetime('13:00:00'): snapshots.create(tag, user) tag.names = [db.TagName('changed')] with fake_datetime('14:00:00'): snapshots.modify(tag, user) tag.names = [db.TagName('changed again')] with fake_datetime('14:00:01'): snapshots.modify(tag, user) results = db.session.query(db.Snapshot).all() assert len(results) == 2 assert results[0].operation == db.Snapshot.OPERATION_CREATED assert results[1].operation == db.Snapshot.OPERATION_MODIFIED assert results[0].data['names'] == ['dummy'] assert results[1].data['names'] == ['changed again']
def update_tag_category( ctx: rest.Context, params: Dict[str, str]) -> rest.Response: category = tag_categories.get_category_by_name( params['category_name'], lock=True) versions.verify_version(category, ctx) versions.bump_version(category) if ctx.has_param('name'): auth.verify_privilege(ctx.user, 'tag_categories:edit:name') tag_categories.update_category_name( category, ctx.get_param_as_string('name')) if ctx.has_param('color'): auth.verify_privilege(ctx.user, 'tag_categories:edit:color') tag_categories.update_category_color( category, ctx.get_param_as_string('color')) ctx.session.flush() snapshots.modify(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, category)
def update_post(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: post = _get_post(params) versions.verify_version(post, ctx) versions.bump_version(post) if ctx.has_file('content'): auth.verify_privilege(ctx.user, 'posts:edit:content') posts.update_post_content(post, ctx.get_file('content')) if ctx.has_param('tags'): auth.verify_privilege(ctx.user, 'posts:edit:tags') new_tags = posts.update_post_tags( post, ctx.get_param_as_string_list('tags')) if len(new_tags): auth.verify_privilege(ctx.user, 'tags:create') db.session.flush() for tag in new_tags: snapshots.create(tag, ctx.user) if ctx.has_param('safety'): auth.verify_privilege(ctx.user, 'posts:edit:safety') posts.update_post_safety(post, ctx.get_param_as_string('safety')) if ctx.has_param('source'): auth.verify_privilege(ctx.user, 'posts:edit:source') posts.update_post_source(post, ctx.get_param_as_string('source')) elif ctx.has_param('contentUrl'): posts.update_post_source(post, ctx.get_param_as_string('contentUrl')) if ctx.has_param('relations'): auth.verify_privilege(ctx.user, 'posts:edit:relations') posts.update_post_relations( post, ctx.get_param_as_int_list('relations')) if ctx.has_param('notes'): auth.verify_privilege(ctx.user, 'posts:edit:notes') posts.update_post_notes(post, ctx.get_param_as_list('notes')) if ctx.has_param('flags'): auth.verify_privilege(ctx.user, 'posts:edit:flags') posts.update_post_flags(post, ctx.get_param_as_string_list('flags')) if ctx.has_file('thumbnail'): auth.verify_privilege(ctx.user, 'posts:edit:thumbnail') posts.update_post_thumbnail(post, ctx.get_file('thumbnail')) post.last_edit_time = datetime.utcnow() ctx.session.flush() snapshots.modify(post, ctx.user) ctx.session.commit() return _serialize_post(ctx, post)
def test_modify_saves_non_empty_diffs(post_factory, user_factory): if "sqlite" in db.session.get_bind().driver: pytest.xfail("SQLite doesn't support transaction isolation, " "which is required to retrieve original entity") post = post_factory() post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text="old")] user = user_factory() db.session.add_all([post, user]) db.session.commit() post.source = "new source" post.notes = [model.PostNote(polygon=[(0, 0), (0, 1), (1, 1)], text="new")] db.session.flush() with patch("szurubooru.func.snapshots._post_to_webhooks"): snapshots.modify(post, user) db.session.flush() results = db.session.query(model.Snapshot).all() assert len(results) == 1 assert results[0].data == { "type": "object change", "value": { "source": { "type": "primitive change", "old-value": None, "new-value": "new source", }, "notes": { "type": "list change", "removed": [{ "polygon": [[0, 0], [0, 1], [1, 1]], "text": "old" }], "added": [{ "polygon": [[0, 0], [0, 1], [1, 1]], "text": "new" }], }, }, }
def update_pool(ctx: rest.Context, params: Dict[str, str]) -> rest.Response: pool = _get_pool(params) versions.verify_version(pool, ctx) versions.bump_version(pool) if ctx.has_param("names"): auth.verify_privilege(ctx.user, "pools:edit:names") pools.update_pool_names(pool, ctx.get_param_as_string_list("names")) if ctx.has_param("category"): auth.verify_privilege(ctx.user, "pools:edit:category") pools.update_pool_category_name(pool, ctx.get_param_as_string("category")) if ctx.has_param("description"): auth.verify_privilege(ctx.user, "pools:edit:description") pools.update_pool_description(pool, ctx.get_param_as_string("description")) if ctx.has_param("posts"): auth.verify_privilege(ctx.user, "pools:edit:posts") posts = ctx.get_param_as_int_list("posts") pools.update_pool_posts(pool, posts) pool.last_edit_time = datetime.utcnow() ctx.session.flush() snapshots.modify(pool, ctx.user) ctx.session.commit() return _serialize(ctx, pool)