def test_category_cache(app, authed_client):
    category = ForumCategory.from_pk(1)
    cache.cache_model(category, timeout=60)
    category = ForumCategory.from_pk(1)
    assert category.name == 'Site'
    assert category.description == 'General site discussion'
    assert cache.ttl(category.cache_key) < 61
def test_new_category(app, authed_client):
    category = ForumCategory.new(name='NewCategory',
                                 description=None,
                                 position=100)
    assert category.name == 'NewCategory'
    assert category.description is None
    assert category.position == 100
    assert ForumCategory.from_cache(category.cache_key).id == category.id == 6
예제 #3
0
    def post(self, request, slug, format=None):
        topic = self.get_object(slug)

        serializer = CategorySerializer(data=request.data)
        if serializer.is_valid():
            name = request.data['name']
            category = ForumCategory(
                name=name,
                topic=topic,
            )
            category.save()
            serializer = CategorySerializer(category)
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
예제 #4
0
def view_categories(include_dead: bool = False) -> flask.Response:
    """
    This endpoint allows users to view the available forum categories
    and the forums in each category, along with some information about
    each forum.

    .. :quickref: ForumCategory; View forum categories.

    **Example response**:

    .. parsed-literal::

       {
         "status": "success",
         "response": [
           "<ForumCategory>",
           "<ForumCategory>"
         ]
       }

    :>json list response: A list of forum categories

    :statuscode 200: View successful
    :statuscode 401: View unsuccessful
    """
    categories = ForumCategory.get_all(
        include_dead=include_dead
        and flask.g.user.has_permission('forums_forums_modify'))
    return flask.jsonify(categories)
예제 #5
0
def delete_category(id: int) -> flask.Response:
    """
    This is the endpoint for forum category deletion . The ``forums_forums_modify`` permission
    is required to access this endpoint. The category must have no forums assigned to it
    in order to delete it.

    .. :quickref: ForumCategory; Delete a forum category.

    **Example response**:

    .. parsed-literal::

       {
         "status": "success",
         "response": "ForumCategory 1 (Site) has been deleted."
       }

    :>json str response: The deleted forum category message

    :statuscode 200: Deletion successful
    :statuscode 400: Deletion unsuccessful
    :statuscode 404: Forum category does not exist
    """
    category = ForumCategory.from_pk(id, _404=True)
    if category.forums:
        raise APIException(
            'You cannot delete a forum category while it still has forums assigned to it.'
        )
    category.deleted = True
    db.session.commit()
    return flask.jsonify(
        f'ForumCategory {id} ({category.name}) has been deleted.')
def test_delete_category(app, authed_client):
    add_permissions(app, 'forums_view', 'forums_forums_modify')
    response = authed_client.delete('/forums/categories/5')
    check_json_response(response,
                        'ForumCategory 5 (uWhatMate) has been deleted.')
    category = ForumCategory.from_pk(5, include_dead=True)
    assert category.deleted
def test_category_get_all(app, authed_client):
    categories = ForumCategory.get_all()
    assert len(categories) == 3

    for category in categories:
        if category.name == 'Site' and category.id == 1:
            break
    else:
        raise AssertionError('A real forum not called')
def test_category_get_all_cached(app, authed_client):
    cache.set(ForumCategory.__cache_key_all__, [1, 3], timeout=60)
    categories = ForumCategory.get_all()
    assert len(categories) == 2

    for category in categories:
        if category.name == 'Site' and category.id == 1:
            break
    else:
        raise AssertionError('A real forum not called')
예제 #9
0
def modify_forum(
    id: int,
    name: Optional_[str] = None,
    category_id: Optional_[int] = None,
    description: Union[str, bool, None] = False,
    position: Optional_[int] = None,
) -> flask.Response:
    """
    This is the endpoint for forum editing. The ``forums_forums_modify`` permission
    is required to access this endpoint. The name, category, description,
    and position of a forum can be changed here.

    .. :quickref: Forum; Edit a forum.

    **Example request**:

    .. parsed-literal::

       PUT /forums/6 HTTP/1.1

       {
         "name": "Support",
         "description": "The place for **very** confused share bears.",
         "position": 99
       }


    **Example response**:

    .. parsed-literal::

       {
         "status": "success",
         "response": "<Forum>"
       }

    :>json dict response: The edited forum

    :statuscode 200: Editing successful
    :statuscode 400: Editing unsuccessful
    :statuscode 404: Forum does not exist
    """
    forum = Forum.from_pk(id, _404=True)
    if name:
        forum.name = name
    if category_id and ForumCategory.is_valid(category_id, error=True):
        forum.category_id = category_id
    if description is not False:
        assert not isinstance(description, bool)
        forum.description = description
    if position is not None:
        forum.position = position
    db.session.commit()
    return flask.jsonify(forum)
def test_serialize_no_perms(app, authed_client):
    category = ForumCategory.from_pk(1)
    data = NewJSONEncoder().default(category)
    check_dictionary(
        data,
        {
            'id': 1,
            'name': 'Site',
            'description': 'General site discussion',
            'position': 1,
        },
    )
    assert 'forums' in data and len(data['forums']) == 2
def test_serialize_very_detailed(app, authed_client):
    add_permissions(app, 'forums_forums_modify')
    category = ForumCategory.from_pk(1)
    data = NewJSONEncoder().default(category)
    check_dictionary(
        data,
        {
            'id': 1,
            'name': 'Site',
            'description': 'General site discussion',
            'position': 1,
            'deleted': False,
        },
    )
    assert 'forums' in data and len(data['forums']) == 2
def test_edit_category_skips(app, authed_client):
    add_permissions(app, 'forums_view', 'forums_forums_modify')
    response = authed_client.put('/forums/categories/1',
                                 data=json.dumps({'position': 0}))
    check_json_response(
        response,
        {
            'id': 1,
            'name': 'Site',
            'description': 'General site discussion',
            'position': 0,
        },
    )
    category = ForumCategory.from_pk(1)
    assert category.position == 0
예제 #13
0
def edit_category(id: int,
                  name: str = None,
                  description: str = None,
                  position: int = None) -> flask.Response:
    """
    This is the endpoint for forum category editing. The ``forums_forums_modify`` permission
    is required to access this endpoint. The name, description, and position of a forum
    category can be changed here.

    .. :quickref: ForumCategory; Edit a forum category.

    **Example request**:

    .. parsed-literal::

       PUT /forums/categories/6 HTTP/1.1

       {
         "name": "Support",
         "description": "The place for **very** confused share bears.",
         "position": 99
       }


    **Example response**:

    .. parsed-literal::

       {
         "status": "success",
         "response": "<ForumCategory>"
       }

    :>json dict response: The edited forum category

    :statuscode 200: Editing successful
    :statuscode 400: Editing unsuccessful
    :statuscode 404: Forum category does not exist
    """
    category = ForumCategory.from_pk(id, _404=True)
    if name:
        category.name = name
    if description:
        category.description = description
    if position is not None:
        category.position = position
    db.session.commit()
    return flask.jsonify(category)
def test_serialize_nested(app, authed_client):
    add_permissions(app, 'forums_forums_modify')
    category = ForumCategory.from_pk(1)
    data = category.serialize(nested=True)
    check_dictionary(
        data,
        {
            'id': 1,
            'name': 'Site',
            'description': 'General site discussion',
            'forums': None,
            'position': 1,
            'deleted': False,
        },
        strict=True,
    )
def test_edit_category(app, authed_client):
    add_permissions(app, 'forums_view', 'forums_forums_modify')
    response = authed_client.put(
        '/forums/categories/1',
        data=json.dumps({
            'name': 'Bite',
            'description': 'Very New Description'
        }),
    )
    check_json_response(
        response,
        {
            'id': 1,
            'name': 'Bite',
            'description': 'Very New Description'
        },
    )
    category = ForumCategory.from_pk(1)
    assert category.id == 1
    assert category.name == 'Bite'
    assert category.description == 'Very New Description'
예제 #16
0
def add_category(name: str,
                 description: str = None,
                 position: int = 0) -> flask.Response:
    """
    This is the endpoint for forum category creation. The ``forums_forums_modify`` permission
    is required to access this endpoint.

    .. :quickref: ForumCategory; Create a forum category.

    **Example request**:

    .. parsed-literal::

       POST /forums/categories HTTP/1.1

       {
         "name": "Support",
         "description": "The place for confused share bears.",
         "position": 6
       }

    **Example response**:

    .. parsed-literal::

       {
         "status": "success",
         "response": "<ForumCategory>"
       }

    :>json dict response: The newly created forum category

    :statuscode 200: Creation successful
    :statuscode 400: Creation unsuccessful
    """
    category = ForumCategory.new(name=name,
                                 description=description,
                                 position=position)
    return flask.jsonify(category)
예제 #17
0
 def test_unicode_method(self):
     cat = ForumCategory(title="Software")
     self.assertEquals(str(cat), cat.title)
def test_category_from_pk(app, authed_client):
    category = ForumCategory.from_pk(1)
    assert category.name == 'Site'
    assert category.description == 'General site discussion'