def create_post(ctx, _params=None): anonymous = ctx.get_param_as_bool('anonymous', default=False) if anonymous: auth.verify_privilege(ctx.user, 'posts:create:anonymous') else: auth.verify_privilege(ctx.user, 'posts:create:identified') content = ctx.get_file('content', required=True) tag_names = ctx.get_param_as_list('tags', required=False, default=[]) safety = ctx.get_param_as_string('safety', required=True) source = ctx.get_param_as_string('source', required=False, default=None) if ctx.has_param('contentUrl') and not source: source = ctx.get_param_as_string('contentUrl') relations = ctx.get_param_as_list('relations', required=False) or [] notes = ctx.get_param_as_list('notes', required=False) or [] flags = ctx.get_param_as_list('flags', required=False) or [] post, new_tags = posts.create_post( content, tag_names, None if anonymous else ctx.user) if len(new_tags): auth.verify_privilege(ctx.user, 'tags:create') posts.update_post_safety(post, safety) posts.update_post_source(post, source) posts.update_post_relations(post, relations) posts.update_post_notes(post, notes) posts.update_post_flags(post, flags) if ctx.has_file('thumbnail'): posts.update_post_thumbnail(post, ctx.get_file('thumbnail')) ctx.session.add(post) ctx.session.flush() snapshots.create(post, None if anonymous else ctx.user) for tag in new_tags: snapshots.create(tag, None if anonymous else ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_post(ctx, post)
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 create_post(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: anonymous = ctx.get_param_as_bool('anonymous', default=False) if anonymous: auth.verify_privilege(ctx.user, 'posts:create:anonymous') else: auth.verify_privilege(ctx.user, 'posts:create:identified') content = ctx.get_file('content') tag_names = ctx.get_param_as_string_list('tags', default=[]) safety = ctx.get_param_as_string('safety') source = ctx.get_param_as_string('source', default='') if ctx.has_param('contentUrl') and not source: source = ctx.get_param_as_string('contentUrl', default='') relations = ctx.get_param_as_int_list('relations', default=[]) notes = ctx.get_param_as_list('notes', default=[]) flags = ctx.get_param_as_string_list('flags', default=[]) post, new_tags = posts.create_post(content, tag_names, None if anonymous else ctx.user) if len(new_tags): auth.verify_privilege(ctx.user, 'tags:create') posts.update_post_safety(post, safety) posts.update_post_source(post, source) posts.update_post_relations(post, relations) posts.update_post_notes(post, notes) posts.update_post_flags(post, flags) if ctx.has_file('thumbnail'): posts.update_post_thumbnail(post, ctx.get_file('thumbnail')) ctx.session.add(post) ctx.session.flush() snapshots.create(post, None if anonymous else ctx.user) for tag in new_tags: snapshots.create(tag, None if anonymous else ctx.user) ctx.session.commit() return _serialize_post(ctx, post)
def create_snapshots_for_post( post: model.Post, new_tags: List[model.Tag], user: Optional[model.User]): snapshots.create(post, user) for tag in new_tags: snapshots.create(tag, user)
def _create_if_needed(tag_names: List[str], user: model.User) -> None: if not tag_names: return _existing_tags, new_tags = tags.get_or_create_tags_by_names(tag_names) if len(new_tags): auth.verify_privilege(user, "tags:create") db.session.flush() for tag in new_tags: snapshots.create(tag, user)
def _create_if_needed(tag_names, user): if not tag_names: return _existing_tags, new_tags = tags.get_or_create_tags_by_names(tag_names) if len(new_tags): auth.verify_privilege(user, 'tags:create') db.session.flush() for tag in new_tags: snapshots.create(tag, user)
def create_pool_category(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, "pool_categories:create") name = ctx.get_param_as_string("name") color = ctx.get_param_as_string("color") category = pool_categories.create_category(name, color) ctx.session.add(category) ctx.session.flush() snapshots.create(category, ctx.user) ctx.session.commit() return _serialize(ctx, category)
def create_tag_category( ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, 'tag_categories:create') name = ctx.get_param_as_string('name') color = ctx.get_param_as_string('color') category = tag_categories.create_category(name, color) ctx.session.add(category) ctx.session.flush() snapshots.create(category, ctx.user) ctx.session.commit() 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 post(self, ctx): auth.verify_privilege(ctx.user, 'tag_categories:create') name = ctx.get_param_as_string('name', required=True) color = ctx.get_param_as_string('color', required=True) category = tag_categories.create_category(name, color) ctx.session.add(category) ctx.session.flush() snapshots.create(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_category_with_details(category)
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 test_create(tag_factory, user_factory): tag = tag_factory(names=['dummy']) db.session.add(tag) db.session.flush() with patch('szurubooru.func.snapshots.get_tag_snapshot'): snapshots.get_tag_snapshot.return_value = 'mocked' snapshots.create(tag, user_factory()) db.session.flush() results = db.session.query(model.Snapshot).all() assert len(results) == 1 assert results[0].operation == model.Snapshot.OPERATION_CREATED assert results[0].data == 'mocked'
def create_tag_category( ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, 'tag_categories:create') name = ctx.get_param_as_string('name') color = ctx.get_param_as_string('color') category = tag_categories.create_category(name, color) ctx.session.add(category) ctx.session.flush() snapshots.create(category, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, category)
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 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 post(self, ctx): auth.verify_privilege(ctx.user, 'tags:create') names = ctx.get_param_as_list('names', required=True) category = ctx.get_param_as_string('category', required=True) suggestions = ctx.get_param_as_list( 'suggestions', required=False, default=[]) implications = ctx.get_param_as_list( 'implications', required=False, default=[]) tag = tags.create_tag(names, category, suggestions, implications) ctx.session.add(tag) ctx.session.flush() snapshots.create(tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize_tag_with_details(tag)
def create_pool(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, "pools:create") names = ctx.get_param_as_string_list("names") category = ctx.get_param_as_string("category") description = ctx.get_param_as_string("description", default="") posts = ctx.get_param_as_int_list("posts", default=[]) pool = pools.create_pool(names, category, posts) pool.last_edit_time = datetime.utcnow() pools.update_pool_description(pool, description) ctx.session.add(pool) ctx.session.flush() snapshots.create(pool, ctx.user) ctx.session.commit() return _serialize(ctx, pool)
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_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 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 create_tag( ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, 'tags:create') names = ctx.get_param_as_string_list('names') category = ctx.get_param_as_string('category') description = ctx.get_param_as_string('description', default='') suggestions = ctx.get_param_as_string_list('suggestions', default=[]) implications = ctx.get_param_as_string_list('implications', default=[]) _create_if_needed(suggestions, ctx.user) _create_if_needed(implications, ctx.user) tag = tags.create_tag(names, category, suggestions, implications) tags.update_tag_description(tag, description) ctx.session.add(tag) ctx.session.flush() snapshots.create(tag, ctx.user) ctx.session.commit() return _serialize(ctx, tag)
def create_tag(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, "tags:create") names = ctx.get_param_as_string_list("names") category = ctx.get_param_as_string("category") description = ctx.get_param_as_string("description", default="") suggestions = ctx.get_param_as_string_list("suggestions", default=[]) implications = ctx.get_param_as_string_list("implications", default=[]) _create_if_needed(suggestions, ctx.user) _create_if_needed(implications, ctx.user) tag = tags.create_tag(names, category, suggestions, implications) tags.update_tag_description(tag, description) ctx.session.add(tag) ctx.session.flush() snapshots.create(tag, ctx.user) ctx.session.commit() return _serialize(ctx, tag)
def create_tag(ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: auth.verify_privilege(ctx.user, 'tags:create') names = ctx.get_param_as_string_list('names') category = ctx.get_param_as_string('category') description = ctx.get_param_as_string('description', default='') suggestions = ctx.get_param_as_string_list('suggestions', default=[]) implications = ctx.get_param_as_string_list('implications', default=[]) _create_if_needed(suggestions, ctx.user) _create_if_needed(implications, ctx.user) tag = tags.create_tag(names, category, suggestions, implications) tags.update_tag_description(tag, description) ctx.session.add(tag) ctx.session.flush() snapshots.create(tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, tag)
def create_tag(ctx, _params=None): auth.verify_privilege(ctx.user, 'tags:create') names = ctx.get_param_as_list('names', required=True) category = ctx.get_param_as_string('category', required=True) description = ctx.get_param_as_string( 'description', required=False, default=None) suggestions = ctx.get_param_as_list( 'suggestions', required=False, default=[]) 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) tags.update_tag_description(tag, description) ctx.session.add(tag) ctx.session.flush() snapshots.create(tag, ctx.user) ctx.session.commit() tags.export_to_json() return _serialize(ctx, tag)
def create_snapshots_for_post(post: model.Post, new_tags: List[model.Tag], user: Optional[model.User]): snapshots.create(post, user) for tag in new_tags: snapshots.create(tag, user)