|
2 | 2 | import datetime |
3 | 3 | import traceback |
4 | 4 | from functools import partial |
5 | | -from http import HTTPStatus |
6 | 5 | from typing import Annotated, Any, Literal, Sequence, Type, TypeVar, Union, Callable, cast |
7 | | -from wsgiref.handlers import format_date_time |
8 | 6 | from fastapi import APIRouter, Depends, HTTPException, status, Query, Path |
9 | 7 | from sqlalchemy import and_, func |
10 | 8 | from sqlalchemy.sql.operators import is_ |
|
25 | 23 | from database.model.concept.concept import AIoDConcept |
26 | 24 | from database.model.platform.platform import Platform |
27 | 25 | from database.model.platform.platform_names import PlatformName |
28 | | -from database.model.resource_read_and_create import ( |
29 | | - resource_create, |
30 | | - resource_read, |
31 | | -) |
32 | 26 | from database.model.serializers import deserialize_resource_relationships |
33 | 27 | from database.review import Submission, SubmissionCreate |
34 | 28 | from database.session import DbSession |
35 | 29 | from dependencies.filtering import ResourceFilters, ResourceFiltersParams |
36 | 30 | from dependencies.pagination import Pagination, PaginationParams |
37 | 31 | from error_handling import as_http_exception |
| 32 | +from database.model.ai_asset.distribution import Distribution |
38 | 33 | from versioning import Version, VersionedResource |
39 | 34 |
|
40 | 35 | from http import HTTPStatus |
41 | | -from pydantic import BaseModel |
42 | 36 | import base64 |
43 | 37 |
|
44 | 38 | RESOURCE = TypeVar("RESOURCE", bound=AIResource) |
@@ -488,6 +482,7 @@ def register_resource( |
488 | 482 | detail="No permission to set platform or platform resource identifier.", |
489 | 483 | ) |
490 | 484 |
|
| 485 | + _raise_if_contains_binary_blob(resource_create) |
491 | 486 | try: |
492 | 487 | with DbSession() as session: |
493 | 488 | try: |
@@ -544,6 +539,7 @@ def put_resource( |
544 | 539 | with DbSession() as session: |
545 | 540 | try: |
546 | 541 | resource: Any = self._retrieve_resource(session, identifier) |
| 542 | + _raise_if_contains_binary_blob(resource_create_instance) |
547 | 543 | if not ( |
548 | 544 | user_can_write(user, resource.aiod_entry) |
549 | 545 | or user.has_role(f"update_{self.resource_name_plural}") |
@@ -872,3 +868,15 @@ def _raise_error_on_invalid_schema(possible_schemas, schema): |
872 | 868 | detail=f"Invalid schema {schema}. Expected {' or '.join(possible_schemas)}", |
873 | 869 | status_code=status.HTTP_400_BAD_REQUEST, |
874 | 870 | ) |
| 871 | + |
| 872 | + |
| 873 | +def _raise_if_contains_binary_blob(item): |
| 874 | + if not hasattr(item, "media") or not (media := getattr(item, "media")): |
| 875 | + return |
| 876 | + |
| 877 | + for item in media: |
| 878 | + if isinstance(item, Distribution) and item.binary_blob: |
| 879 | + raise HTTPException( |
| 880 | + status_code=HTTPStatus.BAD_REQUEST, |
| 881 | + detail="Setting `binary_blob` is forbidden. Consider using `content_url` instead.", |
| 882 | + ) |
0 commit comments