"""Rule schemas.""" from marshmallow import fields from marshmallow import Schema from marshmallow import validates_schema from marshmallow import ValidationError from marshmallow.validate import Length from vector_job_rules.constants import error class UpdateRuleSchema(Schema): """Update Rule Schema.""" rule_id = fields.Int(required=True) priority = fields.Int(required=False) description = fields.Str(required=False, validate=[Length(max=255)]) updated_by = fields.Int(required=True) @validates_schema(pass_original=True) def validate_unique_priority_per_rule(self, data, original_data): """Validate unique priority values in payload.""" rule_ids = [] priorities = [] try: if type(original_data) is list: rule_ids = [int(x['rule_id']) for x in original_data] rule_ids_unique = len(rule_ids) == len(set(rule_ids)) if not rule_ids_unique: raise ValidationError(error.ERROR_MESSAGE_RULE_ID_NOT_UNIQUE) else: rule_ids.append(int(data['rule_id'])) except (ValueError, TypeError, KeyError): pass if data.get('priority'): try: if type(original_data) is list: priorities = [int(x['priority']) for x in original_data] priorities_unique = len(priorities) == len(set(priorities)) if not priorities_unique: raise ValidationError(error.ERROR_MESSAGE_PRIORITY_NOT_UNIQUE) else: priorities.append(int(data['priority'])) priority_per_rule = len(set(priorities)) == len(set(rule_ids)) if not priority_per_rule: raise ValidationError( error.ERROR_MESSAGE_RULE_ID_AND_PRIORITY_REQUIRED ) except KeyError: raise ValidationError(error.ERROR_MESSAGE_RULE_ID_AND_PRIORITY_REQUIRED)