Ejemplo n.º 1
0
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.role_repo = RoleRepo()
     self.user_role_repo = UserRoleRepo()
     self.user_repo = UserRepo()
     self.permission_repo = PermissionRepo()
     self.redis_set = RedisSet()
Ejemplo n.º 2
0
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.rating_repo = VendorRatingRepo()
     self.order_repo = OrderRepo()
     self.engagement_repo = VendorEngagementRepo()
     self.vendor_repo = VendorRepo()
     self.user_repo = UserRepo()
     self.session_repo = MealSessionRepo()
Ejemplo n.º 3
0
    def __init__(self, request):
        '''
        Constructor.
        Parameters:
        -----------
            request
        '''

        BaseController.__init__(self, request)
        self.user_role_repo = UserRoleRepo()
        self.role_repo = RoleRepo()
        self.user_repo = UserRepo()
Ejemplo n.º 4
0
    def __init__(self, request):
        """
        Constructor.

        Parameters:
        -----------
            request
        """

        BaseController.__init__(self, request)
        self.user_role_repo = UserRoleRepo()
        self.role_repo = RoleRepo()
        self.user_repo = UserRepo()
        self.location_repo = LocationRepo()
        self.perm_repo = PermissionRepo()
Ejemplo n.º 5
0
class UserController(BaseController):
    '''
    User Controller.
    '''
    def __init__(self, request):
        '''
        Constructor.

        Parameters:
        -----------
            request 
        '''

        BaseController.__init__(self, request)
        self.user_role_repo = UserRoleRepo()
        self.role_repo = RoleRepo()
        self.andela_service = AndelaService()
        self.user_repo = UserRepo()

    def list_admin_users(self, admin_role_id: int = 1) -> list:
        '''
        List admin users.

        Parameters:
        -----------
        admin_role_id {int}
            Admin role ID (default: {1}).

        Returns:
        --------
        list
            List of admin users' profiles.
        '''

        user_roles = self.user_role_repo.filter_by(role_id=admin_role_id,
                                                   is_active=True)

        admin_users_list = []
        for user_role in user_roles.items:
            admin_user_profile = {}
            andela_user_profile = self.andela_service.get_user_by_email_or_id(user_role.user_id) or \
                                  self.andela_service.get_user_by_email_or_id(user_role.email)

            if andela_user_profile:
                associated_roles = [
                    user_role.role_id
                    for user_role in self.user_role_repo.filter_by(
                        user_id=user_role.user_id).items
                ]
                role_objects = Role.query.filter(
                    Role.id.in_(associated_roles)).all()
                roles = [{
                    'role_id': role.id,
                    'role_name': role.name
                } for role in role_objects]
                admin_user_profile['email'] = andela_user_profile['email']
                admin_user_profile['name'] = andela_user_profile['name']
                admin_user_profile['id'] = andela_user_profile['id']
                admin_user_profile['roles'] = roles

                admin_users_list.append(admin_user_profile)

        return self.handle_response('OK',
                                    payload={
                                        'adminUsers': admin_users_list,
                                        'meta':
                                        self.pagination_meta(user_roles)
                                    })

    def list_all_users(self):

        params = self.get_params_dict()
        page = params.get('page')
        per_page = params.get('per_page')

        users = self.user_repo.paginate(error_out=False,
                                        page=page,
                                        per_page=per_page)
        if users.items:
            user_list = [user.serialize() for user in users.items]
            for user in user_list:
                associated_roles = [
                    user_role.role_id
                    for user_role in self.user_role_repo.filter_by(
                        user_id=user['userId']).items
                ]
                role_objects = Role.query.filter(
                    Role.id.in_(associated_roles)).all()
                roles = [{
                    'id': role.id,
                    'name': role.name
                } for role in role_objects]
                user['userRoles'] = roles
                del user['userTypeId']
            return self.handle_response('OK',
                                        payload={
                                            'users': user_list,
                                            'meta': self.pagination_meta(users)
                                        })
        return self.handle_response('No users found', status_code=404)

    def delete_user(self, id):
        user = self.user_repo.get(id)
        if user:
            if user.is_deleted:
                return self.handle_response('User has already been deleted',
                                            status_code=400)

            updates = {}
            updates['is_deleted'] = True

            self.user_repo.update(user, **updates)

            return self.handle_response('User deleted',
                                        payload={"status": "success"})
        return self.handle_response('Invalid or incorrect id provided',
                                    status_code=404)

    def create_user(self):
        push_id = PushID()
        next_id = push_id.next_id()

        user_info = self.request_params('firstName', 'lastName', 'imageUrl',
                                        'slackId', 'userId', 'roleId')

        first_name, last_name, image_url, slack_id, user_id, role_id = user_info

        role = self.role_repo.find_first(id=role_id)

        if not role:
            return self.handle_response(
                f"Role with userTypeId(roleId) {role_id} does not exist",
                status_code=400)

        if self.user_repo.exists(slack_id=slack_id):
            return self.handle_response(
                f"User with slackId '{slack_id}' already exists",
                status_code=400)

        if self.user_repo.exists(user_id=user_id) and user_id is not None:
            return self.handle_response(
                f"User with userId '{user_id}' already exists",
                status_code=400)

        slack_id = slack_id if slack_id else next_id
        user_id = user_id if user_id else slack_id

        user_type = self.user_role_repo.find_first(user_id=user_id) or \
                    self.user_role_repo.new_user_role(
                        role_id=role_id, user_id=user_id, location_id=Auth.get_location(),email=None)

        user = self.user_repo.new_user(*user_info,
                                       user_id=user_id,
                                       slack_id=slack_id,
                                       user_type=user_type).serialize()

        user.__setitem__(
            'userRoles',
            [role.to_dict(only=['id', 'name', 'help', "timestamps"])])
        user.pop('userTypeId')

        return self.handle_response('OK',
                                    payload={'user': user},
                                    status_code=201)

    def list_user(self, slack_id):

        user = self.user_repo.find_first(slack_id=slack_id)

        if user:
            user_data = user.serialize()
            del user_data['userTypeId']
            user_data['userRoles'] = [
                self.role_repo.get(
                    user.user_type.role_id).to_dict(only=['id', 'name'])
            ]
            return self.handle_response('OK',
                                        payload={'user': user_data},
                                        status_code=200)

        return self.handle_response('User not found', status_code=404)

    def update_user(self, user_id):
        user = self.user_repo.get(user_id)

        if not user:
            return self.handle_response(msg="FAIL",
                                        payload={'user': '******'},
                                        status_code=404)

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={'user': '******'},
                status_code=400)

        user_info = self.request_params_dict('slackId', 'firstName',
                                             'lastName', 'userId', 'imageUrl',
                                             'roleId')

        slack_id = user_info.get('slack_id')
        user_id_sent = user_info.get('user_id')

        if slack_id and self.user_repo.check_exists_else_where(
                User, 'slack_id', slack_id, 'id', user_id):
            return self.handle_response(
                msg="FAIL",
                payload={
                    'user':
                    '******'
                },
                status_code=403)

        if user_id_sent and self.user_repo.check_exists_else_where(
                User, 'user_id', user_id_sent, 'id', user_id):
            return self.handle_response(
                msg="FAIL",
                payload={
                    'user':
                    '******'
                },
                status_code=403)

        if user_info.get('role_id'):
            role_id = user_info['role_id']
            if not self.role_repo.exists(id=role_id):
                return self.handle_response(
                    f'Role with id {role_id} doesnot exist', status_code=400)
            self.user_role_repo.update(user.user_type, role_id=role_id)

        user = self.user_repo.update(user, **user_info)
        user_data = user.serialize()

        user_data['userRoles'] = [
            self.role_repo.get(
                user.user_type.role_id).to_dict(only=['id', 'name'])
        ]

        return self.handle_response('OK',
                                    payload={'user': user_data},
                                    status_code=200)
Ejemplo n.º 6
0
class RoleController(BaseController):
    def __init__(self, request):
        BaseController.__init__(self, request)
        self.role_repo = RoleRepo()
        self.user_role_repo = UserRoleRepo()
        self.user_repo = UserRepo()
        self.permission_repo = PermissionRepo()
        self.redis_set = RedisSet()

    """ ROLES """

    def list_roles(self):
        roles = self.role_repo.filter_by(is_deleted=False)

        role_list = [role.serialize() for role in roles.items]
        return self.handle_response("OK",
                                    payload={
                                        "roles": role_list,
                                        "meta": self.pagination_meta(roles)
                                    })

    def get_role(self, role_id):
        role = self.role_repo.get(role_id)
        if role:
            return self.handle_response("OK",
                                        payload={"role": role.serialize()})
        return self.handle_response("Invalid or Missing role_id",
                                    status_code=400)

    def create_role(self):
        name, help_ = self.request_params("name", "help")
        role1 = self.role_repo.find_first(name=name)

        if not role1:
            try:
                role = self.role_repo.new_role(name=name, help_=help_)
                return self.handle_response("OK",
                                            payload={"role": role.serialize()},
                                            status_code=201)
            except Exception as e:
                return self.handle_response("Error processing: " + str(e),
                                            status_code=400)

        return self.handle_response("Role with this name already exists",
                                    status_code=400)

    def update_role(self, role_id):
        name, help_ = self.request_params("name", "help")
        role = self.role_repo.get(role_id)
        if role:
            updates = {}
            if name:
                role1 = self.role_repo.find_first(name=name)
                if role1:
                    return self.handle_response(
                        "Role with this name already exists", status_code=400)
                updates["name"] = name
            if help_:
                updates["help"] = help_

            role = self.role_repo.update(role, **updates)
            return self.handle_response("OK",
                                        payload={"role": role.serialize()})
        return self.handle_response("Invalid or incorrect role_id provided",
                                    status_code=400)

    def delete_role(self, role_id):
        role = self.role_repo.get(role_id)
        if role:
            updates = {}
            updates["is_deleted"] = True
            self.role_repo.update(role, **updates)
            return self.handle_response("role deleted",
                                        payload={"status": "success"})
        return self.handle_response("Invalid or incorrect role_id provided",
                                    status_code=404)

    """ USER ROLES """

    def get_user_roles(self, user_id):
        user_roles = self.user_role_repo.get_unpaginated(user_id=user_id)
        if user_roles:
            role_list = [role.serialize() for role in user_roles]
            return self.handle_response("OK", payload={"user_role": role_list})
        return self.handle_response("There are no roles for this user",
                                    status_code=404)

    def create_user_role(self):
        try:
            role_id, user_id = self.request_params("role_id", "user_id")
            user = self.user_repo.find_first(id=user_id)
            if user is None:
                return self.handle_response("This user record does not exist",
                                            status_code=400)
            user_id = user.id
            user_role = self.user_role_repo.get_unpaginated(role_id=role_id,
                                                            user_id=user_id,
                                                            is_deleted=False)
            if not user_role:
                role = self.role_repo.get(role_id)
                if role:
                    user_role = self.user_role_repo.new_user_role(
                        role_id=role_id,
                        user_id=user_id,
                    )
                    user_role_data = user_role.serialize()
                    user_role_data.update(
                        {"name": f"{user.first_name} {user.last_name}"})
                    return self.handle_response(
                        "OK",
                        payload={"user_role": user_role_data},
                        status_code=201)
                return self.handle_response("This role does not exist",
                                            status_code=400)
            return self.handle_response("This User has this Role already",
                                        status_code=400)
        except Exception as e:
            return self.handle_response("Error Occurred: " + str(e),
                                        status_code=400)

    def delete_user_role(self, user_role_id):
        user_role = self.user_role_repo.get(user_role_id)
        if user_role:
            updates = {}
            updates["is_deleted"] = True
            self.user_role_repo.update(user_role, **updates)
            return self.handle_response("user_role deleted for user",
                                        payload={"status": "success"})
        return self.handle_response(
            "Invalid or incorrect user_role_id provided", status_code=404)

    def disable_user_role(self):
        user_id, role_id = self.request_params("userId", "roleId")
        user_role = self.user_role_repo.get_unpaginated(user_id=user_id,
                                                        role_id=role_id)[0]
        if user_role:
            updates = {}
            updates["is_active"] = False
            self.user_role_repo.update(user_role, **updates)
            return self.handle_response("user_role disabled for user",
                                        payload={"status": "success"})
        return self.handle_response(
            "Invalid or incorrect user_role_id provided", status_code=404)

    """ PERMISSIONS """

    def get_role_permissions(self, role_id):
        permissions = self.permission_repo.get_unpaginated(
            **{"role_id": role_id})
        perm_list = [permission.serialize() for permission in permissions]
        return self.handle_response("OK",
                                    payload={
                                        "role_id": role_id,
                                        "role_permissions": perm_list
                                    })

    def get_single_permission(self, role_id, permission_id):
        permission = self.permission_repo.filter_by(role_id=role_id,
                                                    id=permission_id)
        permissions = [
            permission.serialize() for permission in permission.items
        ]
        return self.handle_response("OK", payload={"permission": permissions})

    def get_all_permissions(self):
        permissions = self.permission_repo.get_unpaginated()
        perm_list = [permission.serialize() for permission in permissions]
        return self.handle_response("OK", payload={"permissions": perm_list})

    def create_role_permission(self):
        role_id, name, keyword = self.request_params("role_id", "name",
                                                     "keyword")
        permission = self.permission_repo.get_unpaginated(name=name,
                                                          is_deleted=False,
                                                          role_id=role_id)
        if not permission:
            role = self.role_repo.get(role_id)
            if role:
                permission = self.permission_repo.new_permission(
                    role_id=role_id, name=name, keyword=keyword)
                return self.handle_response(
                    "OK",
                    payload={"permission": permission.serialize()},
                    status_code=201,
                )
            return self.handle_response("This role does not exist",
                                        status_code=400)
        return self.handle_response("This permission already exists",
                                    status_code=400)

    def update_permission(self, permission_id):
        role_id, name, keyword = self.request_params("role_id", "name",
                                                     "keyword")
        permission = self.permission_repo.get(permission_id)
        if permission:
            updates = {}
            if name:
                permission1 = self.permission_repo.find_first(name=name)
                if permission1:
                    return self.handle_response(
                        "Permission with this name already exists",
                        status_code=400)
                updates["name"] = name
            if role_id:
                updates["role_id"] = role_id
            if keyword:
                updates["keyword"] = keyword

            self.role_repo.update(permission, **updates)
            return self.handle_response(
                "OK", payload={"permission": permission.serialize()})
        return self.handle_response(
            "Invalid or incorrect permission id provided", status_code=400)

    def delete_role_permission(self, permission_id):
        permission = self.permission_repo.get(permission_id)
        if permission:
            updates = {}
            updates["is_deleted"] = True
            self.role_repo.update(permission, **updates)
            return self.handle_response("permission deleted",
                                        payload={"status": "success"})
        return self.handle_response(
            "Invalid or incorrect permission id provided", status_code=404)

    def autocomplete(self):
        params = self.get_params("q")
        rows = []
        if params:
            for value in self.redis_set.get(params[0]):
                if value:
                    rows.append(value)
        return self.handle_response(rows, status_code=200)
Ejemplo n.º 7
0
class UserController(BaseController):
    """
    User Controller.
    """
    def __init__(self, request):
        """
        Constructor.

        Parameters:
        -----------
            request
        """

        BaseController.__init__(self, request)
        self.user_role_repo = UserRoleRepo()
        self.role_repo = RoleRepo()
        self.user_repo = UserRepo()
        self.location_repo = LocationRepo()
        self.perm_repo = PermissionRepo()

    def list_admin_users(self, admin_role_id: int = 1) -> list:
        """
        List admin users.

        Parameters:
        -----------
        admin_role_id {int}
            Admin role ID (default: {1}).

        Returns:
        --------
        list
            List of admin users' profiles.
        """

        user_roles = self.user_role_repo.filter_by(role_id=admin_role_id,
                                                   is_active=True)

        admin_users_list = []
        for user_role in user_roles.items:
            admin_user_profile = {}
            user = self.user_repo.find_first(id=user_role.user_id)

            if user:
                associated_roles = [
                    user_role.role_id
                    for user_role in self.user_role_repo.filter_by(
                        user_id=user_role.user_id).items
                ]
                role_objects = Role.query.filter(
                    Role.id.in_(associated_roles)).all()
                roles = [{
                    "role_id": role.id,
                    "role_name": role.name
                } for role in role_objects]
                admin_user_profile["email"] = user.email
                admin_user_profile[
                    "name"] = f"{user.first_name} {user.last_name}"
                admin_user_profile["id"] = user.id
                admin_user_profile["roles"] = roles
                admin_user_profile["user_role_id"] = user_role.id

                admin_users_list.append(admin_user_profile)

        return self.handle_response(
            "OK",
            payload={
                "adminUsers": admin_users_list,
                "meta": self.pagination_meta(user_roles),
            },
        )

    def check_email(self, email):

        domain = email.split("@")[1]
        if domain != "webspoons.com":
            return self.handle_response(
                "Only webspoons email can be registered",
                status_code=200,
                payload={"useable": False},
            )
        if self.user_repo.exists(email=email) and email is not None:
            return self.handle_response(
                f"User with email '{email}' already exists",
                status_code=200,
                payload={"useable": False},
            )
        return self.handle_response("Email is Valid!!!",
                                    payload={"useable": True})

    def list_all_users(self):

        params = self.get_params_dict()
        print(params)
        page = params.get("page")
        per_page = params.get("per_page")
        search_type = params.get("search_type")
        search_value = params.get("search_value")

        user_list = []
        if search_type is None:
            users = self.user_repo.paginate(error_out=False,
                                            page=page,
                                            per_page=per_page)
        elif search_type == "Simple":
            users = self.user_repo.get_simple_search_paginated_options(
                search=search_value, page=page, per_page=per_page)
            print("users are ", users)
        elif search_type == "Advanced":
            experience = params.get("experience")
            skills_list = params.get("skills_list")
            location_id = params.get("location_id")
            users = self.user_repo.get_advanced_search_paginated_options(
                experience=experience,
                skills_list=skills_list,
                location_id=location_id,
                page=page,
                per_page=per_page,
            )

        if users.items:
            for user in users.items:
                user_item = user.serialize()
                user_item["location"] = user.location.serialize()
                if user.employment_date is not None:
                    user_item[
                        "employment_date"] = user.employment_date.strftime(
                            "%b %d, %Y")
                user_list.append(user_item)
            for user in user_list:
                associated_roles = [
                    user_role.role_id
                    for user_role in self.user_role_repo.filter_by(
                        user_id=user["id"]).items
                ]
                role_objects = Role.query.filter(
                    Role.id.in_(associated_roles)).all()
                roles = [{
                    "id": role.id,
                    "name": role.name
                } for role in role_objects]
                user["user_roles"] = roles

                del user["password"]
            return self.handle_response("OK",
                                        payload={
                                            "users": user_list,
                                            "meta": self.pagination_meta(users)
                                        })
        return self.handle_response("No users found",
                                    payload={"users": user_list},
                                    status_code=200)

    def delete_user(self, id):
        user = self.user_repo.get(id)
        if user:
            if user.is_deleted:
                return self.handle_response("User has already been deleted",
                                            status_code=400)

            updates = {}
            updates["is_deleted"] = True

            self.user_repo.update(user, **updates)

            return self.handle_response("User deleted",
                                        payload={"status": "success"})
        return self.handle_response("Invalid or incorrect id provided",
                                    status_code=404)

    def create_user(self):
        # push_id = PushID()
        # next_id = push_id.next_id()

        user_info = self.request_params(
            "first_name",
            "last_name",
            "email",
            "role_id",
            "gender",
            "date_of_birth",
            "location_id",
            "password",
        )

        (
            first_name,
            last_name,
            email,
            role_id,
            gender,
            date_of_birth,
            location_id,
            password,
        ) = user_info
        role = self.role_repo.find_first(id=role_id)
        if not role:
            return self.handle_response(
                f"Role with userTypeId(roleId) {role_id} does not exist",
                status_code=400,
            )
        if self.user_repo.exists(email=email) and email is not None:
            return self.handle_response(
                f"User with email '{email}' already exists", status_code=400)
        try:
            user = self.user_repo.new_user(
                first_name,
                last_name,
                email,
                gender,
                date_of_birth,
                location_id,
                password,
            ).serialize()
            del user["password"]
            user_role = self.user_role_repo.new_user_role(role_id=role_id,
                                                          user_id=user["id"])

            # get user role and set to user
            user.__setitem__(
                "user_roles",
                [
                    user_role.role.to_dict(
                        only=["id", "name", "help", "timestamps"])
                ],
            )

            return self.handle_response("OK",
                                        payload={"user": user},
                                        status_code=201)
        except Exception as e:
            return self.handle_response("User could not be created" + str(e),
                                        status_code=404)

    def register(self):

        user_info = self.request_params(
            "first_name",
            "last_name",
            "email",
            "role_id",
            "gender",
            "date_of_birth",
            "employment_date",
            "location_id",
            "password",
        )

        (
            first_name,
            last_name,
            email,
            role_id,
            gender,
            date_of_birth,
            employment_date,
            location_id,
            password,
        ) = user_info

        role = self.role_repo.find_first(id=role_id)
        if not role:
            return self.handle_response(
                f"Role with userTypeId(roleId) {role_id} does not exist",
                status_code=400,
            )
        if self.user_repo.exists(email=email) and email is not None:
            return self.handle_response(
                f"User with email '{email}' already exists", status_code=400)
        try:

            user_post = self.user_repo.new_user(
                first_name=first_name,
                last_name=last_name,
                email=email,
                gender=gender,
                date_of_birth=date_of_birth,
                location_id=location_id,
                password=password,
                employment_date=employment_date,
            )

            user = user_post.serialize()
            del user["password"]

            user_role = self.user_role_repo.new_user_role(role_id=role_id,
                                                          user_id=user["id"])

            # get user role and set to user
            user.__setitem__(
                "user_roles",
                [
                    user_role.role.to_dict(
                        only=["id", "name", "help", "timestamps"])
                ],
            )

            return self.handle_response("OK",
                                        payload={"user": user},
                                        status_code=201)
        except Exception as e:
            return self.handle_response("User could not be registered" +
                                        str(e),
                                        status_code=404)

    def list_user(self, id):

        user = self.user_repo.find_first(id=id)

        if user:
            user_data = user.serialize()
            del user_data["password"]
            user_roles = self.user_role_repo.get_unpaginated(user_id=id)

            if user_data["employment_date"] is not None:
                user_data[
                    "employment_date_formatted"] = user.employment_date.strftime(
                        "%b %d, %Y")
            user_data["user_roles"] = [
                user_role.role.to_dict(only=["id", "name"])
                for user_role in user_roles
            ]
            return self.handle_response("OK",
                                        payload={"user": user_data},
                                        status_code=200)

        return self.handle_response("User not found", status_code=404)

    def update_user_summary(self, update_id):
        (profile_summary, ) = self.request_params("profile_summary", )

        user = self.user_repo.find_first_(id=update_id)
        if not user:
            return self.handle_response(msg="FAIL",
                                        payload={"user": "******"},
                                        status_code=404)

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={"user": "******"},
                status_code=400)

        updates = {
            "profile_summary": profile_summary,
        }

        user = self.user_repo.update(user, **updates)

        user_data = user.serialize()
        del user_data["password"]
        user_roles = self.user_role_repo.get_unpaginated(user_id=update_id)
        user_data["user_roles"] = [
            user_role.role.to_dict(only=["id", "name"])
            for user_role in user_roles
        ]

        return self.handle_response("OK",
                                    payload={"user": user_data},
                                    status_code=200)

    def update_profile_image(self, update_id):
        (image_url, ) = self.request_params("image_url", )

        user = self.user_repo.find_first_(id=update_id)
        if not user:
            return self.handle_response(msg="FAIL",
                                        payload={"user": "******"},
                                        status_code=404)

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={"user": "******"},
                status_code=400)

        updates = {
            "image_url": image_url,
        }

        user = self.user_repo.update(user, **updates)

        user_data = user.serialize()
        del user_data["password"]
        user_roles = self.user_role_repo.get_unpaginated(user_id=update_id)
        user_data["user_roles"] = [
            user_role.role.to_dict(only=["id", "name"])
            for user_role in user_roles
        ]

        return self.handle_response("OK",
                                    payload={"user": user_data},
                                    status_code=200)

    def generate_presigned_url(self, file_name, expiration):
        aws_service = AwsS3Service()
        return aws_service.generate_presigned_post(file_name, expiration)

    def self_update_account_details(self, update_id):
        (
            user_id,
            password,
            location_id,
            date_of_birth,
            gender,
            experience_years,
            personal_email,
            job_title,
            phone,
        ) = self.request_params(
            "user_id",
            "password",
            "location_id",
            "date_of_birth",
            "gender",
            "experience_years",
            "personal_email",
            "job_title",
            "phone",
        )
        user = self.user_repo.find_first_(id=user_id)

        if not user:
            return self.handle_response(msg="FAIL",
                                        payload={"user": "******"},
                                        status_code=404)

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={"user": "******"},
                status_code=400)
        updates = {
            "password": generate_password_hash(password),
            "location_id": location_id,
            "date_of_birth": date_of_birth,
            "gender": gender,
            "experience_years": experience_years,
            "personal_email": personal_email,
            "job_title": job_title,
            "phone": phone,
        }
        user = self.user_repo.update(user, **updates)
        user_data = user.serialize()
        del user_data["password"]
        user_roles = self.user_role_repo.get_unpaginated(user_id=user_id)
        user_data["user_roles"] = [
            user_role.role.to_dict(only=["id", "name"])
            for user_role in user_roles
        ]

        return self.handle_response("OK",
                                    payload={"user": user_data},
                                    status_code=200)

    def update_user(self, user_id):
        user = self.user_repo.find_first_(id=user_id)

        if not user:
            return self.handle_response(msg="FAIL",
                                        payload={"user": "******"},
                                        status_code=404)

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={"user": "******"},
                status_code=400)

        user_info = self.request_params_dict(
            "role_id",
            "gender",
            "date_of_birth",
            "employment_date",
            "first_name",
            "last_name",
        )

        if user_info.get("role_id"):
            role_id = user_info["role_id"]
            if not self.role_repo.exists(id=role_id):
                return self.handle_response(
                    f"Role with id {role_id} doesnot exist", status_code=400)
            # refactor this to get value of role to be updated

            user_role = self.user_role_repo.find_first(user_id=user_id)
            self.user_role_repo.update(user_role,
                                       user_id=user_id,
                                       role_id=role_id)

        user = self.user_repo.update(user, **user_info)
        user_data = user.serialize()
        del user_data["password"]
        user_roles = self.user_role_repo.get_unpaginated(user_id=user_id)
        user_data["user_roles"] = [
            user_role.role.to_dict(only=["id", "name"])
            for user_role in user_roles
        ]

        return self.handle_response("OK",
                                    payload={"user": user_data},
                                    status_code=200)

    def update_user_info(self, user_id):
        user = self.user_repo.find_first_(id=user_id)

        if not user:
            return self.handle_response(msg="FAIL",
                                        payload={"user": "******"},
                                        status_code=404)

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={"user": "******"},
                status_code=400)

        user_info = self.request_params_dict(
            "first_name",
            "last_name",
            "job_title",
            "experience_years",
            "phone",
            "personal_email",
            "git_hub",
            "linked_in",
        )
        import pdb

        pdb.set_trace()
        user = self.user_repo.update(user, **user_info)
        user_data = user.serialize()
        del user_data["password"]
        user_roles = self.user_role_repo.get_unpaginated(user_id=user_id)
        user_data["user_roles"] = [
            user_role.role.to_dict(only=["id", "name"])
            for user_role in user_roles
        ]

        return self.handle_response("OK",
                                    payload={"user": user_data},
                                    status_code=200)

    def authenticate_user(self):
        username, password = self.request_params("username", "password")
        user = self.user_repo.find_first(email=username)

        if user is not None and check_password_hash(user.password, password):
            time_limit = datetime.datetime.utcnow() + datetime.timedelta(
                days=3)
            user_roles = self.user_role_repo.get_unpaginated(user_id=user.id)
            user_roles_list = [
                user_role.role.to_dict(only=["id", "name"])
                for user_role in user_roles
            ]
            user_data = {
                "UserInfo": {
                    "id":
                    user.id,
                    "first_name":
                    user.first_name,
                    "last_name":
                    user.last_name,
                    "email":
                    user.email,
                    "name":
                    f"{user.first_name} {user.last_name}",
                    "picture":
                    "",
                    "roles":
                    user_roles_list,
                    "date_time_now":
                    datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"),
                    "date_time_exp":
                    time_limit.strftime("%Y-%m-%d %H:%M:%S"),
                },
                "iat": datetime.datetime.utcnow(),
                "exp": time_limit,
                "aud": "webspoons.com",
                "iss": "accounts.webspoons.com",
            }
            token = Auth.encode_token(user_data)
            return self.handle_response("OK",
                                        payload={
                                            "token": token,
                                            "user": user.email
                                        },
                                        status_code=200)

        return self.handle_response("Username/password combination is wrong",
                                    status_code=400)
Ejemplo n.º 8
0
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.user_repo = UserRepo()
     self.user_education_repo = UserEducationRepo()
Ejemplo n.º 9
0
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.user_repo = UserRepo()
     self.user_skill_repo = UserSkillRepo()
     self.skill_repo = SkillRepo()
Ejemplo n.º 10
0
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.user_repo = UserRepo()
     self.user_project_repo = UserProjectRepo()
     self.user_project_skill_repo = UserProjectSkillRepo()
     self.skill_repo = SkillRepo()
Ejemplo n.º 11
0
class UserController(BaseController):
    '''
    User Controller.
    '''

    def __init__(self, request):
        '''
        Constructor.
        Parameters:
        -----------
            request
        '''

        BaseController.__init__(self, request)
        self.user_role_repo = UserRoleRepo()
        self.role_repo = RoleRepo()
        self.user_repo = UserRepo()

    def list_admin_users(self, admin_role_id: int = 1) -> list:
        '''
        List admin users.
        Parameters:
        -----------
        admin_role_id {int}
            Admin role ID (default: {1}).
        Returns:
        --------
        list
            List of admin users' profiles.
        '''

        user_roles = self.user_role_repo.filter_by(
            role_id=admin_role_id,
            is_active=True
        ).items

        admin_users_list = []
        for user_role in user_roles:
            admin_user_profile = {}

            associated_roles = [user_role.role_id for user_role in
                                self.user_role_repo.filter_by(user_id=user_role.user_id).items]
            user_objects = User.query.filter(User.id.in_(associated_roles)).all()
            users = [{'id': user.id, 'first_name': user.first_name} for user in user_objects]

            admin_users_list.append(users)

        return self.handle_response(
            'OK',
            payload={'AdminUsers': admin_users_list}
        )

    def list_all_users(self):

        params = self.get_params_dict()
        pg = int(params.get('page', 1))
        pp = int(params.get('per_page', 10))

        users = self.user_repo.paginate(error_out=False, page=pg, per_page=pp)
        if users.items:
            user_list = [user.serialize() for user in users.items]
            for user in user_list:
                associated_roles = [user_role.role_id for user_role in
                                    self.user_role_repo.filter_by(user_id=user['userId']).items]
                role_objects = Role.query.filter(Role.id.in_(associated_roles)).all()
                roles = [{'id': role.id, 'name': role.name} for role in role_objects]
                user['userRoles'] = roles
            return self.handle_response('OK', payload={'users': user_list, 'meta': self.pagination_meta(users)})
        return self.handle_response('No users found', status_code=404)

    def delete_user(self, id):
        user = self.user_repo.get(id)
        if user:
            if user.is_deleted:
                return self.handle_response('User has already been deleted', status_code=400)

            updates = {}
            updates['is_deleted'] = True

            self.user_repo.update(user, **updates)

            return self.handle_response('User deleted', payload={"status": "success"})
        return self.handle_response('Invalid or incorrect id provided', status_code=404)

    def create_user(self):
        user_info = self.request_params('email', 'firstName', 'lastName', 'password', 'is_admin')

        email, first_name, last_name, password, is_admin = user_info
        if self.user_repo.find_first(email=email) is not None:
            return self.handle_response(
                f"User with email '{email}' already exists",
                status_code=400
            )

        user = self.user_repo.new_user(*user_info)

        return self.handle_response('OK', payload={'user': user.serialize()}, status_code=201)

    def list_user(self, email):

        user = self.user_repo.find_first(email=email)
        if user:
            return self.handle_response('OK', payload={'user': user.serialize()}, status_code=200)
        return self.handle_response('User not found', status_code=404)

    def update_user(self, email):
        user = self.user_repo.get(email)

        if not user:
            return self.handle_response(
                msg="FAIL",
                payload={'user': '******'}, status_code=404
            )

        if user.is_deleted:
            return self.handle_response(
                msg="FAIL",
                payload={'user': '******'}, status_code=400
            )

        user_info = self.request_params_dict('email', 'firstName', 'lastName', 'id')

        user = self.user_repo.update(user, **user_info)

        return self.handle_response('OK', payload={'user': user.serialize()}, status_code=200)
Ejemplo n.º 12
0
class ReportsController(BaseController):
    def __init__(self, request):
        BaseController.__init__(self, request)
        self.rating_repo = VendorRatingRepo()
        self.order_repo = OrderRepo()
        self.engagement_repo = VendorEngagementRepo()
        self.vendor_repo = VendorRepo()
        self.user_repo = UserRepo()
        self.session_repo = MealSessionRepo()

    def dashboard_summary(self):
        params = self.get_params_dict()
        location = Auth.get_location()
        vendors = self.vendor_repo.get_unpaginated(is_deleted=False)
        engagements = self.engagement_repo.get_unpaginated(
            is_deleted=False, location_id=location)

        if 'all_vendor_comparison' in params:
            orders = self.order_repo.fetch_all()
            vendor_orders = []
            for vendor in vendors:
                vendor_info = {}
                vendor_info['id'] = vendor.id
                vendor_info['name'] = vendor.name
                vendor_info['collectedOrders'] = len([
                    order for order in orders.items
                    if order.order_status == 'collected' and Menu.query.get(
                        order.menu_id).vendor_engagement.vendor_id == vendor.id
                ])
                vendor_info['uncollectedOrders'] = len([
                    order for order in orders.items
                    if order.order_status == 'booked' and Menu.query.get(
                        order.menu_id).vendor_engagement.vendor_id == vendor.id
                ])
                vendor_info['cancelledOrders'] = len([
                    order for order in orders.items
                    if order.order_status == 'cancelled' and Menu.query.get(
                        order.menu_id).vendor_engagement.vendor_id == vendor.id
                ])
                vendor_orders.append(vendor_info)

            return self.handle_response('ok', payload=vendor_orders)

        str_start_date = params.get('start_date', None)
        start_date = datetime.now().date(
        ) if str_start_date is None else datetime.strptime(
            str_start_date, '%Y-%m-%d').date()

        str_end_date = params.get('end_date', None)
        end_date = (
            datetime.now().date() -
            timedelta(14)) if str_end_date is None else datetime.strptime(
                str_end_date, '%Y-%m-%d').date()

        if start_date < end_date:
            return self.handle_response(
                'Start date must not be less than end date', status_code=400)

        result = []
        orders = Order.query.filter(
            and_(Order.date_booked_for >= end_date,
                 Order.date_booked_for <= start_date))

        if orders and vendors and engagements:
            orders_collected = [
                order for order in orders if order.order_status == 'collected'
            ]
            orders_cancelled = [
                order for order in orders if order.order_status == 'cancelled'
            ]
            orders_uncollected = [
                order for order in orders if order.order_status == 'booked'
            ]

            dates = [
                date.date() for date in pd.bdate_range(end_date, start_date)
            ]
            for date in dates:
                date_info = {
                    'date':
                    date,
                    'collectedOrders':
                    len([
                        order for order in orders_collected
                        if order.date_booked_for == date
                    ]),
                    'uncollectedOrders':
                    len([
                        order for order in orders_uncollected
                        if order.date_booked_for == date
                    ]),
                    'cancelledOrders':
                    len([
                        order for order in orders_cancelled
                        if order.date_booked_for == date
                    ]),
                    'averageRating':
                    self.rating_repo.daily_average_rating(date),
                    'vendor':
                    self.engagement_repo.vendor_of_the_day(date)
                }
                result.append(date_info)

        return self.handle_response('OK', payload=result)

    def daily_taps(self):
        date_range = self.get_params_dict().get('date_range')

        if date_range is not None:
            date_range_list = date_range.split(':')
            start_date = datetime.strptime(date_range_list[0], '%Y-%m-%d')
            end_date = datetime.strptime(date_range_list[1], '%Y-%m-%d')

            if start_date < end_date:
                return self.handle_response(
                    'Start date must not be less than end date',
                    status_code=400)
        else:
            start_date = datetime.today().date()
            end_date = start_date - timedelta(days=7)
        services = MealService.query.filter(
            and_(MealService.date >= end_date, MealService.date <= start_date))
        result = []
        dates = [date.date() for date in pd.bdate_range(end_date, start_date)]
        for date in dates:
            srv_list = []
            current_services = [
                service for service in services if service.date.date() == date
            ]
            for service in current_services:
                user = self.user_repo.get(service.user_id)
                session = self.session_repo.get(service.session_id).name
                service_user = {
                    'id': user.id,
                    'name': f'{user.first_name} {user.last_name}',
                    'userId': user.user_id,
                    'slackId': user.slack_id,
                    'session': session
                }
                srv_list.append(service_user)

            date_info = {'date': str(date), 'count': len(srv_list)}

            result.append(date_info)

        return self.handle_response('OK', payload=result)
Ejemplo n.º 13
0
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.user_repo = UserRepo()
     self.user_employment_repo = UserEmploymentRepo()
     self.user_employment_skill_repo = UserEmploymentSkillRepo()
     self.skill_repo = SkillRepo()