from marshmallow import Schema, ValidationError, fields, post_load, validate from apollo_save_push_receipts.constants import PushMessageStatus class PushMessage: class ReceiptSchema(Schema): id = fields.Int(required=True) status = fields.Str(required=True, validate=validate.OneOf(PushMessageStatus.ALL)) receipt = fields.Str(required=False, data_key="details", missing=None) receipt_id = fields.Str(missing=None) device_id = fields.Int(missing=None) created_at = fields.DateTime(missing=None) expo_token = fields.String() @post_load def validate_receipt(self, data, **kwargs): status, receipt = data["status"], data.get("receipt") if status == PushMessageStatus.FAILED and receipt is None: raise ValidationError(f"Details are required when status is {PushMessageStatus.FAILED}") # cut long text if receipt: data["receipt"] = receipt[:255] return data class Update(Schema): id = fields.Int(required=True) status = fields.Str(required=True, validate=validate.OneOf(PushMessageStatus.ALL)) receipt = fields.Str(required=False, missing=None) receipt_id = fields.Str(missing=None) class Deactivate(Schema): device_id = fields.Str() expo_token = fields.String()