def get_info( ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response: post_feature = posts.try_get_current_post_feature() ret = { 'postCount': posts.get_post_count(), 'diskUsage': _get_disk_usage(), 'serverTime': datetime.utcnow(), 'config': { 'name': config.config['name'], 'userNameRegex': config.config['user_name_regex'], 'passwordRegex': config.config['password_regex'], 'tagNameRegex': config.config['tag_name_regex'], 'tagCategoryNameRegex': config.config['tag_category_name_regex'], 'defaultUserRank': config.config['default_rank'], 'enableSafety': config.config['enable_safety'], 'contactEmail': config.config['contact_email'], 'canSendMails': bool(config.config['smtp']['host']), 'privileges': util.snake_case_to_lower_camel_case_keys( config.config['privileges']), }, } if auth.has_privilege(ctx.user, 'posts:view:featured'): ret['featuredPost'] = ( posts.serialize_post(post_feature.post, ctx.user) if post_feature else None) ret['featuringUser'] = ( users.serialize_user(post_feature.user, ctx.user) if post_feature else None) ret['featuringTime'] = post_feature.time if post_feature else None return ret
def get(self, ctx): featured_post = posts.try_get_featured_post() return { 'postCount': posts.get_post_count(), 'diskUsage': self._get_disk_usage(), 'featuredPost': posts.serialize_post(featured_post, ctx.user), }
def get_info(ctx, _params=None): post_feature = posts.try_get_current_post_feature() return { 'postCount': posts.get_post_count(), 'diskUsage': _get_disk_usage(), 'featuredPost': posts.serialize_post(post_feature.post, ctx.user) if post_feature else None, 'featuringTime': post_feature.time if post_feature else None, 'featuringUser': users.serialize_user(post_feature.user, ctx.user) if post_feature else None, 'serverTime': datetime.datetime.utcnow(), 'config': { 'userNameRegex': config.config['user_name_regex'], 'passwordRegex': config.config['password_regex'], 'tagNameRegex': config.config['tag_name_regex'], 'tagCategoryNameRegex': config.config['tag_category_name_regex'], 'defaultUserRank': config.config['default_rank'], 'privileges': util.snake_case_to_lower_camel_case_keys( config.config['privileges']), }, }
def _serialize_post(ctx, post): return posts.serialize_post( post, ctx.user, options=util.get_serialization_options(ctx))
def _serialize_post( ctx: rest.Context, post: Optional[model.Post]) -> rest.Response: return posts.serialize_post( post, ctx.user, options=serialization.get_serialization_options(ctx))
def test_serialize_post(user_factory, comment_factory, tag_factory, config_injector): config_injector({'data_url': 'http://example.com/'}) with patch('szurubooru.func.comments.serialize_comment'), \ patch('szurubooru.func.users.serialize_micro_user'), \ patch('szurubooru.func.posts.files.has'): files.has.return_value = True users.serialize_micro_user.side_effect \ = lambda user, auth_user: user.name comments.serialize_comment.side_effect \ = lambda comment, auth_user: comment.user.name auth_user = user_factory(name='auth user') post = model.Post() post.post_id = 1 post.creation_time = datetime(1997, 1, 1) post.last_edit_time = datetime(1998, 1, 1) post.tags = [ tag_factory(names=['tag1', 'tag2']), tag_factory(names=['tag3']) ] post.safety = model.Post.SAFETY_SAFE post.source = '4gag' post.type = model.Post.TYPE_IMAGE post.checksum = 'deadbeef' post.mime_type = 'image/jpeg' post.file_size = 100 post.user = user_factory(name='post author') post.canvas_width = 200 post.canvas_height = 300 post.flags = ['loop'] db.session.add(post) db.session.flush() db.session.add_all([ comment_factory(user=user_factory(name='commenter1'), post=post, time=datetime(1999, 1, 1)), comment_factory(user=user_factory(name='commenter2'), post=post, time=datetime(1999, 1, 2)), model.PostFavorite(post=post, user=user_factory(name='fav1'), time=datetime(1800, 1, 1)), model.PostFeature(post=post, user=user_factory(), time=datetime(1999, 1, 1)), model.PostScore(post=post, user=auth_user, score=-1, time=datetime(1800, 1, 1)), model.PostScore(post=post, user=user_factory(), score=1, time=datetime(1800, 1, 1)), model.PostScore(post=post, user=user_factory(), score=1, time=datetime(1800, 1, 1)) ]) db.session.flush() result = posts.serialize_post(post, auth_user) result['tags'].sort() assert result == { 'id': 1, 'version': 1, 'creationTime': datetime(1997, 1, 1), 'lastEditTime': datetime(1998, 1, 1), 'safety': 'safe', 'source': '4gag', 'type': 'image', 'checksum': 'deadbeef', 'fileSize': 100, 'canvasWidth': 200, 'canvasHeight': 300, 'contentUrl': 'http://example.com/posts/1.jpg', 'thumbnailUrl': 'http://example.com/generated-thumbnails/1.jpg', 'flags': ['loop'], 'tags': ['tag1', 'tag3'], 'relations': [], 'notes': [], 'user': '******', 'score': 1, 'ownFavorite': False, 'ownScore': -1, 'tagCount': 2, 'favoriteCount': 1, 'commentCount': 2, 'noteCount': 0, 'featureCount': 1, 'relationCount': 0, 'lastFeatureTime': datetime(1999, 1, 1), 'favoritedBy': ['fav1'], 'hasCustomThumbnail': True, 'mimeType': 'image/jpeg', 'comments': ['commenter1', 'commenter2'], }
def test_serialize_post_when_empty(): assert posts.serialize_post(None, None) is None
def _serialize_post(ctx: rest.Context, post: Optional[model.Post]) -> rest.Response: return posts.serialize_post( post, ctx.user, options=serialization.get_serialization_options(ctx))
def test_serialize_post( user_factory, comment_factory, tag_factory, config_injector): config_injector({'data_url': 'http://example.com/'}) with patch('szurubooru.func.comments.serialize_comment'), \ patch('szurubooru.func.users.serialize_micro_user'), \ patch('szurubooru.func.posts.files.has'): files.has.return_value = True users.serialize_micro_user.side_effect \ = lambda user, auth_user: user.name comments.serialize_comment.side_effect \ = lambda comment, auth_user: comment.user.name auth_user = user_factory(name='auth user') post = db.Post() post.post_id = 1 post.creation_time = datetime(1997, 1, 1) post.last_edit_time = datetime(1998, 1, 1) post.tags = [ tag_factory(names=['tag1', 'tag2']), tag_factory(names=['tag3']) ] post.safety = db.Post.SAFETY_SAFE post.source = '4gag' post.type = db.Post.TYPE_IMAGE post.checksum = 'deadbeef' post.mime_type = 'image/jpeg' post.file_size = 100 post.user = user_factory(name='post author') post.canvas_width = 200 post.canvas_height = 300 post.flags = ['loop'] db.session.add(post) db.session.flush() db.session.add_all([ comment_factory( user=user_factory(name='commenter1'), post=post, time=datetime(1999, 1, 1)), comment_factory( user=user_factory(name='commenter2'), post=post, time=datetime(1999, 1, 2)), db.PostFavorite( post=post, user=user_factory(name='fav1'), time=datetime(1800, 1, 1)), db.PostFeature( post=post, user=user_factory(), time=datetime(1999, 1, 1)), db.PostScore( post=post, user=auth_user, score=-1, time=datetime(1800, 1, 1)), db.PostScore( post=post, user=user_factory(), score=1, time=datetime(1800, 1, 1)), db.PostScore( post=post, user=user_factory(), score=1, time=datetime(1800, 1, 1))]) db.session.flush() result = posts.serialize_post(post, auth_user) result['tags'].sort() assert result == { 'id': 1, 'version': 1, 'creationTime': datetime(1997, 1, 1), 'lastEditTime': datetime(1998, 1, 1), 'safety': 'safe', 'source': '4gag', 'type': 'image', 'checksum': 'deadbeef', 'fileSize': 100, 'canvasWidth': 200, 'canvasHeight': 300, 'contentUrl': 'http://example.com/posts/1.jpg', 'thumbnailUrl': 'http://example.com/generated-thumbnails/1.jpg', 'flags': ['loop'], 'tags': ['tag1', 'tag3'], 'relations': [], 'notes': [], 'user': '******', 'score': 1, 'ownFavorite': False, 'ownScore': -1, 'tagCount': 2, 'favoriteCount': 1, 'commentCount': 2, 'noteCount': 0, 'featureCount': 1, 'relationCount': 0, 'lastFeatureTime': datetime(1999, 1, 1), 'favoritedBy': ['fav1'], 'hasCustomThumbnail': True, 'mimeType': 'image/jpeg', 'comments': ['commenter1', 'commenter2'], }
def get(self, ctx): auth.verify_privilege(ctx.user, 'posts:list') self._search_executor.config.user = ctx.user return self._search_executor.execute_and_serialize( ctx, lambda post: posts.serialize_post(post, ctx.user))
def test_serialize_post( user_factory, comment_factory, tag_factory, tag_category_factory, pool_factory, pool_category_factory, config_injector, ): config_injector({"data_url": "http://example.com/", "secret": "test"}) with patch("szurubooru.func.comments.serialize_comment"), patch( "szurubooru.func.users.serialize_micro_user"), patch( "szurubooru.func.posts.files.has"): files.has.return_value = True users.serialize_micro_user.side_effect = ( lambda user, auth_user: user.name) comments.serialize_comment.side_effect = ( lambda comment, auth_user: comment.user.name) auth_user = user_factory(name="auth user") post = model.Post() post.post_id = 1 post.creation_time = datetime(1997, 1, 1) post.last_edit_time = datetime(1998, 1, 1) post.tags = [ tag_factory( names=["tag1", "tag2"], category=tag_category_factory("test-cat1"), ), tag_factory(names=["tag3"], category=tag_category_factory("test-cat2")), ] post.safety = model.Post.SAFETY_SAFE post.source = "4gag" post.type = model.Post.TYPE_IMAGE post.checksum = "deadbeef" post.mime_type = "image/jpeg" post.file_size = 100 post.user = user_factory(name="post author") post.canvas_width = 200 post.canvas_height = 300 post.flags = ["loop"] db.session.add(post) db.session.flush() db.session.add_all([ comment_factory( user=user_factory(name="commenter1"), post=post, time=datetime(1999, 1, 1), ), comment_factory( user=user_factory(name="commenter2"), post=post, time=datetime(1999, 1, 2), ), model.PostFavorite( post=post, user=user_factory(name="fav1"), time=datetime(1800, 1, 1), ), model.PostFeature(post=post, user=user_factory(), time=datetime(1999, 1, 1)), model.PostScore( post=post, user=auth_user, score=-1, time=datetime(1800, 1, 1), ), model.PostScore( post=post, user=user_factory(), score=1, time=datetime(1800, 1, 1), ), model.PostScore( post=post, user=user_factory(), score=1, time=datetime(1800, 1, 1), ), ]) db.session.flush() pool1 = pool_factory( id=1, names=["pool1", "pool2"], description="desc", category=pool_category_factory("test-cat1"), ) pool1.last_edit_time = datetime(1998, 1, 1) pool1.posts.append(post) pool2 = pool_factory( id=2, names=["pool3"], description="desc2", category=pool_category_factory("test-cat2"), ) pool2.last_edit_time = datetime(1998, 1, 1) pool2.posts.append(post) db.session.add_all([pool1, pool2]) db.session.flush() result = posts.serialize_post(post, auth_user) result["tags"].sort(key=lambda tag: tag["names"][0]) assert result == { "id": 1, "version": 1, "creationTime": datetime(1997, 1, 1), "lastEditTime": datetime(1998, 1, 1), "safety": "safe", "source": "4gag", "type": "image", "checksum": "deadbeef", "fileSize": 100, "canvasWidth": 200, "canvasHeight": 300, "contentUrl": "http://example.com/posts/1_244c8840887984c4.jpg", "thumbnailUrl": "http://example.com/" "generated-thumbnails/1_244c8840887984c4.jpg", "flags": ["loop"], "tags": [ { "names": ["tag1", "tag2"], "category": "test-cat1", "usages": 1, }, { "names": ["tag3"], "category": "test-cat2", "usages": 1, }, ], "relations": [], "notes": [], "pools": [ { "id": 1, "names": ["pool1", "pool2"], "description": "desc", "category": "test-cat1", "postCount": 1, "posts": [{ "id": 1, "thumbnailUrl": "http://example.com/" "generated-thumbnails/1_244c8840887984c4.jpg", }], "version": 1, "creationTime": datetime(1996, 1, 1), "lastEditTime": datetime(1998, 1, 1), }, { "id": 2, "names": ["pool3"], "description": "desc2", "category": "test-cat2", "postCount": 1, "posts": [{ "id": 1, "thumbnailUrl": "http://example.com/" "generated-thumbnails/1_244c8840887984c4.jpg", }], "version": 1, "creationTime": datetime(1996, 1, 1), "lastEditTime": datetime(1998, 1, 1), }, ], "user": "******", "score": 1, "ownFavorite": False, "ownScore": -1, "tagCount": 2, "favoriteCount": 1, "commentCount": 2, "noteCount": 0, "featureCount": 1, "relationCount": 0, "lastFeatureTime": datetime(1999, 1, 1), "favoritedBy": ["fav1"], "hasCustomThumbnail": True, "mimeType": "image/jpeg", "comments": ["commenter1", "commenter2"], }