예제 #1
0
파일: info_api.py 프로젝트: rr-/szurubooru
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
예제 #2
0
 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),
     }
예제 #3
0
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']),
        },
    }
예제 #4
0
def _serialize_post(ctx, post):
    return posts.serialize_post(
        post,
        ctx.user,
        options=util.get_serialization_options(ctx))
예제 #5
0
파일: post_api.py 프로젝트: rr-/szurubooru
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))
예제 #6
0
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'],
        }
예제 #7
0
def test_serialize_post_when_empty():
    assert posts.serialize_post(None, None) is None
예제 #8
0
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))
예제 #9
0
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'],
        }
예제 #10
0
def test_serialize_post_when_empty():
    assert posts.serialize_post(None, None) is None
예제 #11
0
 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))
예제 #12
0
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"],
        }