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 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('메모의 %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 test_get_post_snapshot(post_factory, user_factory, tag_factory): user = user_factory(name='dummy-user') tag1 = tag_factory(names=['dummy-tag1']) tag2 = tag_factory(names=['dummy-tag2']) post = post_factory(id=1) related_post1 = post_factory(id=2) related_post2 = post_factory(id=3) db.session.add_all([user, tag1, tag2, post, related_post1, related_post2]) db.session.flush() score = model.PostScore() score.post = post score.user = user score.time = datetime(1997, 1, 1) score.score = 1 favorite = model.PostFavorite() favorite.post = post favorite.user = user favorite.time = datetime(1997, 1, 1) feature = model.PostFeature() feature.post = post feature.user = user feature.time = datetime(1997, 1, 1) note = model.PostNote() note.post = post note.polygon = [(1, 1), (200, 1), (200, 200), (1, 200)] note.text = 'some text' db.session.add_all([score]) db.session.flush() post.user = user post.checksum = 'deadbeef' post.source = 'example.com' post.tags.append(tag1) post.tags.append(tag2) post.relations.append(related_post1) post.relations.append(related_post2) post.scores.append(score) post.favorited_by.append(favorite) post.features.append(feature) post.notes.append(note) assert snapshots.get_post_snapshot(post) == { 'checksum': 'deadbeef', 'featured': True, 'flags': [], 'notes': [{ 'polygon': [[1, 1], [200, 1], [200, 200], [1, 200]], 'text': 'some text', }], 'relations': [2, 3], 'safety': 'safe', 'source': 'example.com', 'tags': ['dummy-tag1', 'dummy-tag2'], }
def test_get_post_snapshot(post_factory, user_factory, tag_factory): user = user_factory(name="dummy-user") tag1 = tag_factory(names=["dummy-tag1"]) tag2 = tag_factory(names=["dummy-tag2"]) post = post_factory(id=1) related_post1 = post_factory(id=2) related_post2 = post_factory(id=3) db.session.add_all([user, tag1, tag2, post, related_post1, related_post2]) db.session.flush() score = model.PostScore() score.post = post score.user = user score.time = datetime(1997, 1, 1) score.score = 1 favorite = model.PostFavorite() favorite.post = post favorite.user = user favorite.time = datetime(1997, 1, 1) feature = model.PostFeature() feature.post = post feature.user = user feature.time = datetime(1997, 1, 1) note = model.PostNote() note.post = post note.polygon = [(1, 1), (200, 1), (200, 200), (1, 200)] note.text = "some text" db.session.add_all([score]) db.session.flush() post.user = user post.checksum = "deadbeef" post.source = "example.com" post.tags.append(tag1) post.tags.append(tag2) post.relations.append(related_post1) post.relations.append(related_post2) post.scores.append(score) post.favorited_by.append(favorite) post.features.append(feature) post.notes.append(note) assert snapshots.get_post_snapshot(post) == { "checksum": "deadbeef", "featured": True, "flags": [], "notes": [{ "polygon": [[1, 1], [200, 1], [200, 200], [1, 200]], "text": "some text", }], "relations": [2, 3], "safety": "safe", "source": "example.com", "tags": ["dummy-tag1", "dummy-tag2"], }
def test_serialize_note(): note = model.PostNote() note.polygon = [[0, 1], [1, 1], [1, 0], [0, 0]] note.text = "..." assert posts.serialize_note(note) == { "polygon": [[0, 1], [1, 1], [1, 0], [0, 0]], "text": "...", }
def test_serialize_note(): note = model.PostNote() note.polygon = [[0, 1], [1, 1], [1, 0], [0, 0]] note.text = '...' assert posts.serialize_note(note) == { 'polygon': [[0, 1], [1, 1], [1, 0], [0, 0]], 'text': '...' }
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 factory(text="..."): return model.PostNote(polygon="...", text=text)
def factory(text='...'): return model.PostNote(polygon='...', text=text)
def test_cascade_deletions(post_factory, user_factory, tag_factory, comment_factory): user = user_factory() tag1 = tag_factory() tag2 = tag_factory() related_post1 = post_factory() related_post2 = post_factory() post = post_factory() comment = comment_factory(post=post, user=user) db.session.add_all( [user, tag1, tag2, post, related_post1, related_post2, comment]) db.session.flush() score = model.PostScore() score.post = post score.user = user score.time = datetime(1997, 1, 1) score.score = 1 favorite = model.PostFavorite() favorite.post = post favorite.user = user favorite.time = datetime(1997, 1, 1) feature = model.PostFeature() feature.post = post feature.user = user feature.time = datetime(1997, 1, 1) note = model.PostNote() note.post = post note.polygon = '' note.text = '' db.session.add_all([score, favorite, feature, note]) db.session.flush() post.user = user post.tags.append(tag1) post.tags.append(tag2) post.relations.append(related_post1) related_post2.relations.append(post) post.scores.append(score) post.favorited_by.append(favorite) post.features.append(feature) post.notes.append(note) db.session.commit() assert not db.session.dirty assert post.user is not None and post.user.user_id is not None assert len(post.relations) == 1 assert db.session.query(model.User).count() == 1 assert db.session.query(model.Tag).count() == 2 assert db.session.query(model.Post).count() == 3 assert db.session.query(model.PostTag).count() == 2 assert db.session.query(model.PostRelation).count() == 2 assert db.session.query(model.PostScore).count() == 1 assert db.session.query(model.PostNote).count() == 1 assert db.session.query(model.PostFeature).count() == 1 assert db.session.query(model.PostFavorite).count() == 1 assert db.session.query(model.Comment).count() == 1 db.session.delete(post) db.session.commit() assert not db.session.dirty assert db.session.query(model.User).count() == 1 assert db.session.query(model.Tag).count() == 2 assert db.session.query(model.Post).count() == 2 assert db.session.query(model.PostTag).count() == 0 assert db.session.query(model.PostRelation).count() == 0 assert db.session.query(model.PostScore).count() == 0 assert db.session.query(model.PostNote).count() == 0 assert db.session.query(model.PostFeature).count() == 0 assert db.session.query(model.PostFavorite).count() == 0 assert db.session.query(model.Comment).count() == 0