fossasia/open-event-orga-server

View on GitHub
app/api/roles.py

Summary

Maintainability
A
3 hrs
Test Coverage
from flask_rest_jsonapi import ResourceDetail, ResourceList

from app.api.bootstrap import api
from app.api.helpers.db import safe_query_kwargs
from app.api.helpers.errors import UnprocessableEntityError
from app.api.schema.roles import RoleSchema
from app.models import db
from app.models.role import Role
from app.models.role_invite import RoleInvite
from app.models.users_events_role import UsersEventsRoles
from app.models.users_groups_role import UsersGroupsRoles


class RoleList(ResourceList):
    """
    List and create role
    """

    decorators = (api.has_permission('is_admin', methods="POST"),)
    schema = RoleSchema
    data_layer = {'session': db.session, 'model': Role}


class RoleDetail(ResourceDetail):
    """
    Role detail by id
    """

    def before_get_object(self, view_kwargs):
        """
        before get method to get the resource id for fetching details
        :param view_kwargs:
        :return:
        """
        if view_kwargs.get('role_invite_id') is not None:
            role_invite = safe_query_kwargs(RoleInvite, view_kwargs, 'role_invite_id')
            view_kwargs['id'] = role_invite.role_id

        if view_kwargs.get('users_events_roles_id') is not None:
            users_events_role = safe_query_kwargs(
                UsersEventsRoles,
                view_kwargs,
                'users_events_roles_id',
            )
            view_kwargs['id'] = users_events_role.role_id

        if view_kwargs.get('users_groups_roles_id') is not None:
            users_groups_role = safe_query_kwargs(
                UsersGroupsRoles,
                view_kwargs,
                'users_groups_roles_id',
            )
            view_kwargs['id'] = users_groups_role.role_id

    def before_update_object(self, role, data, view_kwargs):
        """
        Method to edit object
        :param role:
        :param data:
        :param view_kwargs:
        :return:
        """
        if data.get('name'):
            if data['name'] in [
                'owner',
                'organizer',
                'coorganizer',
                'registrar',
                'moderator',
                'attendee',
                'track_organizer',
            ]:
                raise UnprocessableEntityError(
                    {'data': 'name'}, "The given name cannot be updated"
                )

    def before_delete_object(self, obj, kwargs):
        """
        method to check proper resource name before deleting
        :param obj:
        :param kwargs:
        :return:
        """
        if obj.name in [
            'owner',
            'organizer',
            'coorganizer',
            'registrar',
            'moderator',
            'attendee',
            'track_organizer',
        ]:
            raise UnprocessableEntityError(
                {'data': 'name'}, "The resource with given name cannot be deleted"
            )

    decorators = (api.has_permission('is_admin', methods="PATCH,DELETE"),)
    schema = RoleSchema
    data_layer = {
        'session': db.session,
        'model': Role,
        'methods': {
            'before_get_object': before_get_object,
            'before_delete_object': before_delete_object,
        },
    }