Skip to content

Submission Bundle

Contained within this file are experimental interfaces for working with the Synapse Python Client. Unless otherwise noted these interfaces are subject to change at any time. Use at your own risk.

API Reference

synapseclient.models.SubmissionBundle dataclass

Bases: SubmissionBundleSynchronousProtocol

A SubmissionBundle object represents a bundle containing a Synapse Submission and its accompanying SubmissionStatus. This bundle provides convenient access to both the submission data and its current status in a single object.

https://rest-docs.synapse.org/rest/org/sagebionetworks/evaluation/model/SubmissionBundle.html

ATTRIBUTE DESCRIPTION
submission

A Submission to a Synapse Evaluation is a pointer to a versioned Entity. Submissions are immutable, so we archive a copy of the EntityBundle at the time of submission.

TYPE: Optional[Submission]

submission_status

A SubmissionStatus is a secondary, mutable object associated with a Submission. This object should be used to contain scoring data about the Submission.

TYPE: Optional[SubmissionStatus]

Retrieve submission bundles for an evaluation.

 

from synapseclient import Synapse
from synapseclient.models import SubmissionBundle

syn = Synapse()
syn.login()

# Get all submission bundles for an evaluation
bundles = SubmissionBundle.get_evaluation_submission_bundles(
    evaluation_id="9999999",
    status="SCORED"
)

for bundle in bundles:
    print(f"Submission ID: {bundle.submission.id if bundle.submission else 'N/A'}")
    print(f"Status: {bundle.submission_status.status if bundle.submission_status else 'N/A'}")

Retrieve user submission bundles for an evaluation.

 

from synapseclient import Synapse
from synapseclient.models import SubmissionBundle

syn = Synapse()
syn.login()

# Get current user's submission bundles for an evaluation
user_bundles = SubmissionBundle.get_user_submission_bundles(
    evaluation_id="9999999",
    limit=25
)

for bundle in user_bundles:
    print(f"Submission ID: {bundle.submission.id}")
    print(f"Status: {bundle.submission_status.status}")

Source code in synapseclient/models/submission_bundle.py
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
@dataclass
@async_to_sync
class SubmissionBundle(SubmissionBundleSynchronousProtocol):
    """A `SubmissionBundle` object represents a bundle containing a Synapse Submission
    and its accompanying SubmissionStatus. This bundle provides convenient access to both
    the submission data and its current status in a single object.

    <https://rest-docs.synapse.org/rest/org/sagebionetworks/evaluation/model/SubmissionBundle.html>

    Attributes:
        submission: A Submission to a Synapse Evaluation is a pointer to a versioned Entity.
            Submissions are immutable, so we archive a copy of the EntityBundle at the time of submission.
        submission_status: A SubmissionStatus is a secondary, mutable object associated with a Submission.
            This object should be used to contain scoring data about the Submission.

    Example: Retrieve submission bundles for an evaluation.
        &nbsp;
        ```python
        from synapseclient import Synapse
        from synapseclient.models import SubmissionBundle

        syn = Synapse()
        syn.login()

        # Get all submission bundles for an evaluation
        bundles = SubmissionBundle.get_evaluation_submission_bundles(
            evaluation_id="9999999",
            status="SCORED"
        )

        for bundle in bundles:
            print(f"Submission ID: {bundle.submission.id if bundle.submission else 'N/A'}")
            print(f"Status: {bundle.submission_status.status if bundle.submission_status else 'N/A'}")
        ```

    Example: Retrieve user submission bundles for an evaluation.
        &nbsp;
        ```python
        from synapseclient import Synapse
        from synapseclient.models import SubmissionBundle

        syn = Synapse()
        syn.login()

        # Get current user's submission bundles for an evaluation
        user_bundles = SubmissionBundle.get_user_submission_bundles(
            evaluation_id="9999999",
            limit=25
        )

        for bundle in user_bundles:
            print(f"Submission ID: {bundle.submission.id}")
            print(f"Status: {bundle.submission_status.status}")
        ```
    """

    submission: Optional["Submission"] = None
    """
    A Submission to a Synapse Evaluation is a pointer to a versioned Entity.
    Submissions are immutable, so we archive a copy of the EntityBundle at the time of submission.
    """

    submission_status: Optional["SubmissionStatus"] = None
    """
    A SubmissionStatus is a secondary, mutable object associated with a Submission.
    This object should be used to contain scoring data about the Submission.
    """

    def fill_from_dict(
        self,
        synapse_submission_bundle: dict[str, Union[bool, str, int, dict]],
    ) -> "SubmissionBundle":
        """
        Converts a response from the REST API into this dataclass.

        Arguments:
            synapse_submission_bundle: The response from the REST API.

        Returns:
            The SubmissionBundle object.
        """
        from synapseclient.models.submission import Submission
        from synapseclient.models.submission_status import SubmissionStatus

        submission_dict = synapse_submission_bundle.get("submission", None)
        if submission_dict:
            self.submission = Submission().fill_from_dict(submission_dict)
        else:
            self.submission = None

        submission_status_dict = synapse_submission_bundle.get("submissionStatus", None)
        if submission_status_dict:
            self.submission_status = SubmissionStatus().fill_from_dict(
                submission_status_dict
            )
        else:
            self.submission_status = None

        return self

    @skip_async_to_sync
    @classmethod
    async def get_evaluation_submission_bundles_async(
        cls,
        evaluation_id: str,
        status: Optional[str] = None,
        *,
        synapse_client: Optional[Synapse] = None,
    ) -> AsyncGenerator["SubmissionBundle", None]:
        """
        Generator to get all bundled Submissions and SubmissionStatuses for a given Evaluation.

        Arguments:
            evaluation_id: The ID of the specified Evaluation.
            status: Optionally filter submission bundles by status.
            synapse_client: If not passed in and caching was not disabled by
                `Synapse.allow_client_caching(False)` this will use the last created
                instance from the Synapse class constructor.

        Yields:
            Individual SubmissionBundle objects from each page of the response.

        Note:
            The caller must be granted the ACCESS_TYPE.READ_PRIVATE_SUBMISSION on the specified Evaluation.

        Example: Getting submission bundles for an evaluation
            &nbsp;
            ```python
            import asyncio
            from synapseclient import Synapse
            from synapseclient.models import SubmissionBundle

            syn = Synapse()
            syn.login()

            async def get_submission_bundles_example():
                bundles = []
                async for bundle in SubmissionBundle.get_evaluation_submission_bundles_async(
                    evaluation_id="9999999",
                    status="SCORED"
                ):
                    bundles.append(bundle)
                print(f"Found {len(bundles)} submission bundles")
                for bundle in bundles:
                    print(f"Submission ID: {bundle.submission.id}")

            asyncio.run(get_submission_bundles_example())
            ```
        """
        async for bundle_data in evaluation_services.get_evaluation_submission_bundles(
            evaluation_id=evaluation_id,
            status=status,
            synapse_client=synapse_client,
        ):
            bundle = cls()
            bundle.fill_from_dict(bundle_data)
            yield bundle

    @skip_async_to_sync
    @classmethod
    async def get_user_submission_bundles_async(
        cls,
        evaluation_id: str,
        *,
        synapse_client: Optional[Synapse] = None,
    ) -> AsyncGenerator["SubmissionBundle", None]:
        """
        Generator to get all user bundled Submissions and SubmissionStatuses for a specified Evaluation.

        Arguments:
            evaluation_id: The ID of the specified Evaluation.
            synapse_client: If not passed in and caching was not disabled by
                `Synapse.allow_client_caching(False)` this will use the last created
                instance from the Synapse class constructor.

        Yields:
            Individual SubmissionBundle objects from each page of the response.

        Example: Getting user submission bundles
            &nbsp;

            ```python
            import asyncio
            from synapseclient import Synapse
            from synapseclient.models import SubmissionBundle

            syn = Synapse()
            syn.login()

            async def get_user_submission_bundles_example():
                bundles = []
                async for bundle in SubmissionBundle.get_user_submission_bundles_async(
                    evaluation_id="9999999"
                ):
                    bundles.append(bundle)
                print(f"Found {len(bundles)} user submission bundles")
                for bundle in bundles:
                    print(f"Submission ID: {bundle.submission.id}")

            asyncio.run(get_user_submission_bundles_example())
            ```
        """
        async for bundle_data in evaluation_services.get_user_submission_bundles(
            evaluation_id=evaluation_id,
            synapse_client=synapse_client,
        ):
            bundle = cls()
            bundle.fill_from_dict(bundle_data)
            yield bundle

Functions

get_evaluation_submission_bundles classmethod

get_evaluation_submission_bundles(evaluation_id: str, status: Optional[str] = None, *, synapse_client: Optional[Synapse] = None) -> Generator[SubmissionBundle, None, None]

Retrieves bundled Submissions and SubmissionStatuses for a given Evaluation.

PARAMETER DESCRIPTION
evaluation_id

The ID of the specified Evaluation.

TYPE: str

status

Optionally filter submission bundles by status.

TYPE: Optional[str] DEFAULT: None

synapse_client

If not passed in and caching was not disabled by Synapse.allow_client_caching(False) this will use the last created instance from the Synapse class constructor.

TYPE: Optional[Synapse] DEFAULT: None

RETURNS DESCRIPTION
None

SubmissionBundle objects as they are retrieved from the API.

Note

The caller must be granted the ACCESS_TYPE.READ_PRIVATE_SUBMISSION on the specified Evaluation.

Getting submission bundles for an evaluation

 

from synapseclient import Synapse
from synapseclient.models import SubmissionBundle

syn = Synapse()
syn.login()

bundles = list(SubmissionBundle.get_evaluation_submission_bundles(
    evaluation_id="9999999",
    status="SCORED"
))
print(f"Found {len(bundles)} submission bundles")
for bundle in bundles:
    print(f"Submission ID: {bundle.submission.id if bundle.submission else 'N/A'}")

Source code in synapseclient/models/submission_bundle.py
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
@classmethod
def get_evaluation_submission_bundles(
    cls,
    evaluation_id: str,
    status: Optional[str] = None,
    *,
    synapse_client: Optional[Synapse] = None,
) -> Generator["SubmissionBundle", None, None]:
    """
    Retrieves bundled Submissions and SubmissionStatuses for a given Evaluation.

    Arguments:
        evaluation_id: The ID of the specified Evaluation.
        status: Optionally filter submission bundles by status.
        synapse_client: If not passed in and caching was not disabled by
            `Synapse.allow_client_caching(False)` this will use the last created
            instance from the Synapse class constructor.

    Returns:
        SubmissionBundle objects as they are retrieved from the API.

    Note:
        The caller must be granted the ACCESS_TYPE.READ_PRIVATE_SUBMISSION on the specified Evaluation.

    Example: Getting submission bundles for an evaluation
        &nbsp;
        ```python
        from synapseclient import Synapse
        from synapseclient.models import SubmissionBundle

        syn = Synapse()
        syn.login()

        bundles = list(SubmissionBundle.get_evaluation_submission_bundles(
            evaluation_id="9999999",
            status="SCORED"
        ))
        print(f"Found {len(bundles)} submission bundles")
        for bundle in bundles:
            print(f"Submission ID: {bundle.submission.id if bundle.submission else 'N/A'}")
        ```
    """
    yield from wrap_async_generator_to_sync_generator(
        async_gen_func=cls.get_evaluation_submission_bundles_async,
        evaluation_id=evaluation_id,
        status=status,
        synapse_client=synapse_client,
    )

get_user_submission_bundles classmethod

get_user_submission_bundles(evaluation_id: str, *, synapse_client: Optional[Synapse] = None) -> Generator[SubmissionBundle, None, None]

Retrieves all user bundled Submissions and SubmissionStatuses for a specified Evaluation.

PARAMETER DESCRIPTION
evaluation_id

The ID of the specified Evaluation.

TYPE: str

synapse_client

If not passed in and caching was not disabled by Synapse.allow_client_caching(False) this will use the last created instance from the Synapse class constructor.

TYPE: Optional[Synapse] DEFAULT: None

RETURNS DESCRIPTION
None

SubmissionBundle objects as they are retrieved from the API.

Getting user submission bundles

 

from synapseclient import Synapse
from synapseclient.models import SubmissionBundle

syn = Synapse()
syn.login()

bundles = list(SubmissionBundle.get_user_submission_bundles(
    evaluation_id="9999999"
))
print(f"Found {len(bundles)} user submission bundles")
for bundle in bundles:
    print(f"Submission ID: {bundle.submission.id}")

Source code in synapseclient/models/submission_bundle.py
 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
@classmethod
def get_user_submission_bundles(
    cls,
    evaluation_id: str,
    *,
    synapse_client: Optional[Synapse] = None,
) -> Generator["SubmissionBundle", None, None]:
    """
    Retrieves all user bundled Submissions and SubmissionStatuses for a specified Evaluation.

    Arguments:
        evaluation_id: The ID of the specified Evaluation.
        synapse_client: If not passed in and caching was not disabled by
            `Synapse.allow_client_caching(False)` this will use the last created
            instance from the Synapse class constructor.

    Returns:
        SubmissionBundle objects as they are retrieved from the API.

    Example: Getting user submission bundles
        &nbsp;
        ```python
        from synapseclient import Synapse
        from synapseclient.models import SubmissionBundle

        syn = Synapse()
        syn.login()

        bundles = list(SubmissionBundle.get_user_submission_bundles(
            evaluation_id="9999999"
        ))
        print(f"Found {len(bundles)} user submission bundles")
        for bundle in bundles:
            print(f"Submission ID: {bundle.submission.id}")
        ```
    """
    yield from wrap_async_generator_to_sync_generator(
        async_gen_func=cls.get_user_submission_bundles_async,
        evaluation_id=evaluation_id,
        synapse_client=synapse_client,
    )