Skip to content

Project Design API

reptor.api.ProjectDesignsAPI.ProjectDesignsAPI

API client for interacting with SysReptor project designs.

Note

For historic reasons, the SysReptor REST API uses the term "project types" instead of "project designs".
"Project types" and "project designs" are the same thing in SysReptor.

Example
1
2
3
4
5
6
7
8
9
from reptor import Reptor

reptor = Reptor(
    server=os.environ.get("REPTOR_SERVER"),
    token=os.environ.get("REPTOR_TOKEN"),
)

# ProjectDesignsAPI is available as reptor.api.project_designs, e.g.:
reptor.api.project_designs.search()
Source code in reptor/api/ProjectDesignsAPI.py
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
class ProjectDesignsAPI(APIClient):
    """
    API client for interacting with SysReptor project designs.  

    Note:
        For historic reasons, the SysReptor REST API uses the term "project types" instead of "project designs".  
        "Project types" and "project designs" are the same thing in SysReptor.

    Example:
        ```python
        from reptor import Reptor

        reptor = Reptor(
            server=os.environ.get("REPTOR_SERVER"),
            token=os.environ.get("REPTOR_TOKEN"),
        )

        # ProjectDesignsAPI is available as reptor.api.project_designs, e.g.:
        reptor.api.project_designs.search()
        ```
    """
    def __init__(self, **kwargs) -> None:
        super().__init__(**kwargs)

        self.base_endpoint = (
            f"{self.reptor.get_config().get_server()}/api/v1/projecttypes/"
        )

        self.project_design_id = kwargs.get("project_design_id", "")
        self.object_endpoint = urljoin(self.base_endpoint, self.project_design_id)

    def create_project_design(self, name: str, scope: typing.Optional[str] = "global") -> ProjectDesign:
        """Creates a new project design with the given name.

        Args:
            name (str): Name of the project design to create.
            scope (str, optional): Scope of the project design ("global" or "private"). Defaults to "global".

        Returns:
            The created ProjectDesign object.
        """
        payload = {"name": name, "scope": scope}
        response = self.post(self.base_endpoint, json=payload)
        return ProjectDesign(response.json())

    def update_project_design(
            self,
            project_design_id: str,
            report_template: typing.Optional[str] = None,
            report_styles: typing.Optional[str] = None,
            preview_findings: typing.Optional[typing.List[FindingDataRaw]] = None,
            preview_report: typing.Optional[SectionDataRaw] = None,
        ) -> ProjectDesign:
        """Updates the project design with the given id.

            Args:
                project_design_id (str): ID of the project design to update.
                report_template (str, optional): Report design HTML source. None value means no update. Defaults to None.
                report_styles (str, optional): Report CSS styles to update. None value means no update. Defaults to None.
                preview_findings (List[FindingDataRaw], optional): Preview findings to update. Defaults to None.
                preview_report (SectionDataRaw, optional): Preview report sections to update. Defaults to None.
            Returns:
                The updated ProjectDesign object.
        """
        payload = {}
        if report_template is not None:
            payload["report_template"] = report_template
        if report_styles is not None:
            payload["report_styles"] = report_styles
        payload["report_preview_data"] = dict()
        if preview_findings is not None:
            payload["report_preview_data"]["findings"] = [finding.to_dict() for finding in preview_findings]
        if preview_report is not None:
            payload["report_preview_data"]["report"] = preview_report.to_dict()
        response = self.patch(urljoin(self.base_endpoint, project_design_id), json=payload)
        return ProjectDesign(response.json())

    def delete_project_design(self, project_design_id: str) -> None:
        """Deletes the project design with the given id.

            Args:
                project_design_id (str): ID of the project design to delete.

        Returns:
            None
        """
        self.delete(urljoin(self.base_endpoint, project_design_id))

    def search(
        self, search_term: typing.Optional[str] = "", scope: typing.Optional[str] = "global"
    ) -> typing.List[ProjectDesignOverview]:
        """Searches project designs by search term and scope.

        Args:
            search_term (typing.Optional[str], optional): Search term to look for in project designs. Defaults to "".
            scope (typing.Optional[str], optional): Search scope ("global" or "private"). Defaults to "global".

        Returns:
            List of project design overviews that match the search criteria.

        Example:
            ```python
            # Search for all project designs
            designs = reptor.api.project_designs.search()

            # Search for specific designs
            webapp_designs = reptor.api.project_designs.search("webapp")

            # Search in private scope
            private_designs = reptor.api.project_designs.search(scope="private")
            ```
        """

        url = self.base_endpoint
        params = {"search": search_term}
        if scope:
            params["scope"] = scope
        designs_raw = self.get_paginated(url, params=params)
        return [ProjectDesignOverview(item) for item in designs_raw]

    def get_project_design(self, project_design_id: typing.Optional[str] = None) -> ProjectDesign:
        """Gets the project design in context from SysReptor.

        Args:
            project_design_id (str, optional): ID of the project design to fetch. If not provided, it uses the project design of the project in context.

        Returns:
            ProjectDesign object with sections and findings.

        Example:
            ```python
            design = reptor.api.project_designs.get_project_design()
            ```
        """
        if project_design_id:
            object_endpoint = urljoin(self.base_endpoint, project_design_id)
        else:
            object_endpoint = self.object_endpoint
        response = self.get(object_endpoint)
        return ProjectDesign(response.json())

    def fetch_project_design(self, project_design_id: typing.Optional[str] = None) -> ProjectDesign:
        """Fetches the project design in context from SysReptor.

        .. deprecated::
            Use :meth:`get_project_design` instead. This method will be removed in a future version.

        Args:
            project_design_id (str, optional): ID of the project design to fetch. If not provided, it uses the project design of the project in context.

        Returns:
            ProjectDesign object with sections and findings.
        """
        self.log.warning(
            "fetch_project_design() is deprecated and will be removed in a future version. "
            "Use get_project_design() instead."
        )
        return self.get_project_design(project_design_id=project_design_id)

    @cached_property
    def project_design(self) -> ProjectDesign:
        if not self.project_design_id:
            raise ValueError("Missing Project Design ID")

        response = self.get(self.object_endpoint)
        return ProjectDesign(response.json())

create_project_design

create_project_design(name, scope='global')

Creates a new project design with the given name.

Parameters:

  • name (str) –

    Name of the project design to create.

  • scope (str, default: 'global' ) –

    Scope of the project design ("global" or "private"). Defaults to "global".

Returns:

Source code in reptor/api/ProjectDesignsAPI.py
42
43
44
45
46
47
48
49
50
51
52
53
54
def create_project_design(self, name: str, scope: typing.Optional[str] = "global") -> ProjectDesign:
    """Creates a new project design with the given name.

    Args:
        name (str): Name of the project design to create.
        scope (str, optional): Scope of the project design ("global" or "private"). Defaults to "global".

    Returns:
        The created ProjectDesign object.
    """
    payload = {"name": name, "scope": scope}
    response = self.post(self.base_endpoint, json=payload)
    return ProjectDesign(response.json())

update_project_design

update_project_design(
    project_design_id,
    report_template=None,
    report_styles=None,
    preview_findings=None,
    preview_report=None,
)

Updates the project design with the given id.

Parameters:

  • project_design_id (str) –

    ID of the project design to update.

  • report_template (str, default: None ) –

    Report design HTML source. None value means no update. Defaults to None.

  • report_styles (str, default: None ) –

    Report CSS styles to update. None value means no update. Defaults to None.

  • preview_findings (List[FindingDataRaw], default: None ) –

    Preview findings to update. Defaults to None.

  • preview_report (SectionDataRaw, default: None ) –

    Preview report sections to update. Defaults to None.

Returns: The updated ProjectDesign object.

Source code in reptor/api/ProjectDesignsAPI.py
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
def update_project_design(
        self,
        project_design_id: str,
        report_template: typing.Optional[str] = None,
        report_styles: typing.Optional[str] = None,
        preview_findings: typing.Optional[typing.List[FindingDataRaw]] = None,
        preview_report: typing.Optional[SectionDataRaw] = None,
    ) -> ProjectDesign:
    """Updates the project design with the given id.

        Args:
            project_design_id (str): ID of the project design to update.
            report_template (str, optional): Report design HTML source. None value means no update. Defaults to None.
            report_styles (str, optional): Report CSS styles to update. None value means no update. Defaults to None.
            preview_findings (List[FindingDataRaw], optional): Preview findings to update. Defaults to None.
            preview_report (SectionDataRaw, optional): Preview report sections to update. Defaults to None.
        Returns:
            The updated ProjectDesign object.
    """
    payload = {}
    if report_template is not None:
        payload["report_template"] = report_template
    if report_styles is not None:
        payload["report_styles"] = report_styles
    payload["report_preview_data"] = dict()
    if preview_findings is not None:
        payload["report_preview_data"]["findings"] = [finding.to_dict() for finding in preview_findings]
    if preview_report is not None:
        payload["report_preview_data"]["report"] = preview_report.to_dict()
    response = self.patch(urljoin(self.base_endpoint, project_design_id), json=payload)
    return ProjectDesign(response.json())

delete_project_design

delete_project_design(project_design_id)

Deletes the project design with the given id.

1
2
Args:
    project_design_id (str): ID of the project design to delete.

Returns:

  • None

    None

Source code in reptor/api/ProjectDesignsAPI.py
88
89
90
91
92
93
94
95
96
97
def delete_project_design(self, project_design_id: str) -> None:
    """Deletes the project design with the given id.

        Args:
            project_design_id (str): ID of the project design to delete.

    Returns:
        None
    """
    self.delete(urljoin(self.base_endpoint, project_design_id))

search

search(search_term='', scope='global')

Searches project designs by search term and scope.

Parameters:

  • search_term (Optional[str], default: '' ) –

    Search term to look for in project designs. Defaults to "".

  • scope (Optional[str], default: 'global' ) –

    Search scope ("global" or "private"). Defaults to "global".

Returns:

Example
1
2
3
4
5
6
7
8
# Search for all project designs
designs = reptor.api.project_designs.search()

# Search for specific designs
webapp_designs = reptor.api.project_designs.search("webapp")

# Search in private scope
private_designs = reptor.api.project_designs.search(scope="private")
Source code in reptor/api/ProjectDesignsAPI.py
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
def search(
    self, search_term: typing.Optional[str] = "", scope: typing.Optional[str] = "global"
) -> typing.List[ProjectDesignOverview]:
    """Searches project designs by search term and scope.

    Args:
        search_term (typing.Optional[str], optional): Search term to look for in project designs. Defaults to "".
        scope (typing.Optional[str], optional): Search scope ("global" or "private"). Defaults to "global".

    Returns:
        List of project design overviews that match the search criteria.

    Example:
        ```python
        # Search for all project designs
        designs = reptor.api.project_designs.search()

        # Search for specific designs
        webapp_designs = reptor.api.project_designs.search("webapp")

        # Search in private scope
        private_designs = reptor.api.project_designs.search(scope="private")
        ```
    """

    url = self.base_endpoint
    params = {"search": search_term}
    if scope:
        params["scope"] = scope
    designs_raw = self.get_paginated(url, params=params)
    return [ProjectDesignOverview(item) for item in designs_raw]

get_project_design

get_project_design(project_design_id=None)

Gets the project design in context from SysReptor.

Parameters:

  • project_design_id (str, default: None ) –

    ID of the project design to fetch. If not provided, it uses the project design of the project in context.

Returns:

  • ProjectDesign

    ProjectDesign object with sections and findings.

Example
1
design = reptor.api.project_designs.get_project_design()
Source code in reptor/api/ProjectDesignsAPI.py
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
def get_project_design(self, project_design_id: typing.Optional[str] = None) -> ProjectDesign:
    """Gets the project design in context from SysReptor.

    Args:
        project_design_id (str, optional): ID of the project design to fetch. If not provided, it uses the project design of the project in context.

    Returns:
        ProjectDesign object with sections and findings.

    Example:
        ```python
        design = reptor.api.project_designs.get_project_design()
        ```
    """
    if project_design_id:
        object_endpoint = urljoin(self.base_endpoint, project_design_id)
    else:
        object_endpoint = self.object_endpoint
    response = self.get(object_endpoint)
    return ProjectDesign(response.json())

fetch_project_design

fetch_project_design(project_design_id=None)

Fetches the project design in context from SysReptor.

.. deprecated:: Use :meth:get_project_design instead. This method will be removed in a future version.

Parameters:

  • project_design_id (str, default: None ) –

    ID of the project design to fetch. If not provided, it uses the project design of the project in context.

Returns:

  • ProjectDesign

    ProjectDesign object with sections and findings.

Source code in reptor/api/ProjectDesignsAPI.py
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
def fetch_project_design(self, project_design_id: typing.Optional[str] = None) -> ProjectDesign:
    """Fetches the project design in context from SysReptor.

    .. deprecated::
        Use :meth:`get_project_design` instead. This method will be removed in a future version.

    Args:
        project_design_id (str, optional): ID of the project design to fetch. If not provided, it uses the project design of the project in context.

    Returns:
        ProjectDesign object with sections and findings.
    """
    self.log.warning(
        "fetch_project_design() is deprecated and will be removed in a future version. "
        "Use get_project_design() instead."
    )
    return self.get_project_design(project_design_id=project_design_id)

Edit / View on GitHub