コード例 #1
0
    def post(self):
        """
        Uploads an image using the image upload service
        ---
        tags:
          - system
        produces:
          - application/json
        parameters:
          - in: header
            name: Authorization
            description: Base64 encoded session token
            required: true
            type: string
            default: Token sessionTokenHere==
          - in: body
            name: body
            required: true
            description: JSON object containing image data that will be uploaded
            schema:
              properties:
                  data:
                      type: string
                      default: base64 encoded image data
                  mime:
                      type: string
                      default: file mime/type
                  filename:
                      type: string
                      default: filename
        responses:
          200:
            description: Image uploaded successfully
          400:
            description: Input parameter error
          403:
            description: User is not authorized to upload images
          500:
            description: A problem occurred
        """
        if (
            current_app.config["IMAGE_UPLOAD_API_URL"] is None
            or current_app.config["IMAGE_UPLOAD_API_KEY"] is None
        ):
            return {"Error": "Image upload service not defined"}, 500

        try:
            is_org_manager = (
                len(
                    OrganisationService.get_organisations_managed_by_user(
                        tm.authenticated_user_id
                    )
                )
                > 0
            )
            data = request.get_json()
            if is_org_manager:
                if data.get("filename") is None:
                    return {"Error": "Missing filename parameter"}, 400
                if data.get("mime") in ["image/png", "image/jpeg", "image/webp"]:
                    headers = {
                        "x-api-key": current_app.config["IMAGE_UPLOAD_API_KEY"],
                        "Content-Type": "application/json",
                    }
                    url = "{}?filename={}".format(
                        current_app.config["IMAGE_UPLOAD_API_URL"], data.get("filename")
                    )
                    result = requests.post(
                        url, headers=headers, data=json.dumps({"image": data})
                    )
                    if result.ok:
                        return result.json(), 201
                    else:
                        return result.json(), 400
                else:
                    return (
                        {
                            "Error": "Mimetype is not allowed. Use are 'image/png', 'image/jpeg', 'image/webp'"
                        },
                        400,
                    )
            else:
                return {"Error": "User is not admin or organisation manager"}, 403
        except Exception as e:
            error_msg = f"Image upload POST API - unhandled error: {str(e)}"
            current_app.logger.critical(error_msg)
            return {"Error": "Unable to upload image"}, 500
コード例 #2
0
    def _filter_projects(search_dto: ProjectSearchDTO, user):
        """ Filters all projects based on criteria provided by user"""
        query = ProjectSearchService.create_search_query(user)
        query = query.join(ProjectInfo).filter(
            ProjectInfo.locale.in_([search_dto.preferred_locale, "en"]))
        project_status_array = []
        if search_dto.project_statuses:
            for project_status in search_dto.project_statuses:
                project_status_array.append(
                    ProjectStatus[project_status].value)
            query = query.filter(Project.status.in_(project_status_array))
        else:
            if not search_dto.created_by:
                project_status_array = [ProjectStatus.PUBLISHED.value]
                query = query.filter(Project.status.in_(project_status_array))
        if search_dto.interests:
            query = query.join(
                project_interests,
                project_interests.c.project_id == Project.id).filter(
                    project_interests.c.interest_id.in_(search_dto.interests))
        if search_dto.created_by:
            query = query.filter(Project.author_id == search_dto.created_by)
        if search_dto.mapped_by:
            projects_mapped = UserService.get_projects_mapped(
                search_dto.mapped_by)
            query = query.filter(Project.id.in_(projects_mapped))
        if search_dto.favorited_by:
            user = UserService.get_user_by_id(search_dto.favorited_by)
            projects_favorited = user.favorites
            query = query.filter(
                Project.id.in_([project.id for project in projects_favorited]))
        if search_dto.mapper_level and search_dto.mapper_level.upper(
        ) != "ALL":
            query = query.filter(Project.mapper_level == MappingLevel[
                search_dto.mapper_level].value)

        if search_dto.organisation_name:
            query = query.filter(
                Organisation.name == search_dto.organisation_name)

        if search_dto.organisation_id:
            query = query.filter(Organisation.id == search_dto.organisation_id)

        if search_dto.team_id:
            query = query.join(ProjectTeams,
                               ProjectTeams.project_id == Project.id).filter(
                                   ProjectTeams.team_id == search_dto.team_id)

        if search_dto.campaign:
            query = query.join(Campaign, Project.campaign).group_by(
                Project.id, Campaign.name)
            query = query.filter(Campaign.name == search_dto.campaign)

        if search_dto.mapping_types:
            # Construct array of mapping types for query
            mapping_type_array = []
            for mapping_type in search_dto.mapping_types:
                mapping_type_array.append(MappingTypes[mapping_type].value)

            query = query.filter(
                Project.mapping_types.contains(mapping_type_array))

        if search_dto.text_search:
            # We construct an OR search, so any projects that contain or more of the search terms should be returned
            or_search = " | ".join(
                [x for x in search_dto.text_search.split(" ") if x != ""])
            opts = [
                ProjectInfo.text_searchable.match(
                    or_search, postgresql_regconfig="english"),
                ProjectInfo.name.like(f"%{or_search}%"),
            ]
            try:
                opts.append(Project.id == int(search_dto.text_search))
            except ValueError:
                pass

            query = query.filter(or_(*opts))

        if search_dto.country:
            # Unnest country column array.
            sq = Project.query.with_entities(
                Project.id,
                func.unnest(Project.country).label("country")).subquery()
            query = query.filter(
                sq.c.country.ilike("%{}%".format(
                    search_dto.country))).filter(Project.id == sq.c.id)

        order_by = search_dto.order_by
        if search_dto.order_by_type == "DESC":
            order_by = desc(search_dto.order_by)

        query = query.order_by(order_by).group_by(Project.id)

        if search_dto.managed_by and user.role != UserRole.ADMIN.value:
            team_projects = query.join(ProjectTeams).filter(
                ProjectTeams.role == TeamRoles.PROJECT_MANAGER.value,
                ProjectTeams.project_id == Project.id,
            )
            user_orgs_list = OrganisationService.get_organisations_managed_by_user(
                search_dto.managed_by)
            orgs_managed = [org.id for org in user_orgs_list]
            org_projects = query.filter(
                Project.organisation_id.in_(orgs_managed))
            query = org_projects.union(team_projects)

        all_results = []
        if not search_dto.omit_map_results:
            all_results = query.all()
        paginated_results = query.paginate(search_dto.page, 14, True)

        return all_results, paginated_results