"""Schemas for contract term transfer operations.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import ValidationError, validates_schema class BulkRemoveAttachmentsRequestSchema(ma.Schema): """Request body for bulk removal of UPCs/ISRCs from contract term attachments.""" upcs = ma.List(ma.String(), load_default=[]) isrcs = ma.List(ma.String(), load_default=[]) @validates_schema def validate_at_least_one(self, data, **kwargs): """At least one of upcs or isrcs must be non-empty.""" if not data.get('upcs') and not data.get('isrcs'): raise ValidationError('At least one of upcs or isrcs must be non-empty.') class _TransferConditionSchema(ma.Schema): """A single condition row from project_transfer_term_condition.""" conditions = ma.Dict(load_default={}) term_rate = ma.Decimal(required=True, as_string=False) priority = ma.Integer(required=True) class BulkAddAttachmentsRequestSchema(ma.Schema): """Request body for bulk addition of UPCs/ISRCs to contract term attachments.""" upcs = ma.List(ma.String(), load_default=[]) isrcs = ma.List(ma.String(), load_default=[]) contract_id = ma.Integer(required=True) conditions = ma.List(ma.Nested(_TransferConditionSchema()), load_default=[]) # Label scoping (label_ids/upcs/contributors) for the destination term. # Stored verbatim on a newly created term's attachments_relations so the # contract detail page can show the account attached to the term. attachment_relations = ma.Dict(allow_none=True, load_default=None) # Staged term name, stored as the new term's contract_term_name. name = ma.String(allow_none=True, load_default=None) @validates_schema def validate_at_least_one(self, data, **kwargs): """At least one of upcs or isrcs must be non-empty.""" if not data.get('upcs') and not data.get('isrcs'): raise ValidationError('At least one of upcs or isrcs must be non-empty.') class CreateTransferTermRequestSchema(ma.Schema): """Request body for POST /account/{id}/contract-terms/transfer-create.""" # Idempotency key: the staged term this destination term is created for. The # endpoint creates at most one contract_term per project_transfer_term_id, so # retries return the already-created term instead of duplicating it. project_transfer_term_id = ma.Integer(required=True) contract_id = ma.Integer(required=True) term_type = ma.String(required=True) attachments = ma.List(ma.String(), required=True) conditions = ma.List(ma.Nested(_TransferConditionSchema()), load_default=[]) attachment_relations = ma.Dict(allow_none=True, load_default=None) name = ma.String(allow_none=True, load_default=None)