def validate()

in src/olympia/abuse/serializers.py [0:0]


    def validate(self, data):
        if not data.get('reason'):
            # If reason is not provided, message is required and can not be
            # null or blank.
            message = data.get('message')
            if not message:
                if 'message' not in data:
                    msg = serializers.Field.default_error_messages['required']
                elif message is None:
                    msg = serializers.Field.default_error_messages['null']
                else:
                    msg = serializers.CharField.default_error_messages['blank']
                raise serializers.ValidationError({'message': [msg]})

        # When the reason is "illegal", the `illegal_category` field is
        # required.
        if data.get('reason') == AbuseReport.REASONS.ILLEGAL:
            if 'illegal_category' not in data:
                msg = serializers.Field.default_error_messages['required']
                raise serializers.ValidationError({'illegal_category': [msg]})
            elif data.get('illegal_category') is None:
                msg = serializers.Field.default_error_messages['null']
                raise serializers.ValidationError({'illegal_category': [msg]})
        elif data.get('illegal_category') is not None:
            msg = (
                'This value must be omitted or set to "null" when the `reason` is not '
                '"illegal".'
            )
            raise serializers.ValidationError({'illegal_category': [msg]})

        # When the reason is "illegal", the `illegal_subcategory` field is also
        # required. In addition, the subcategory depends on the category set.
        if data.get('reason') == AbuseReport.REASONS.ILLEGAL:
            subcategory = data.get('illegal_subcategory')
            valid_subcategories = ILLEGAL_SUBCATEGORIES_BY_CATEGORY.get(
                data.get('illegal_category'), []
            )
            if 'illegal_subcategory' not in data:
                msg = serializers.Field.default_error_messages['required']
                raise serializers.ValidationError({'illegal_subcategory': [msg]})
            elif subcategory is None:
                msg = serializers.Field.default_error_messages['null']
                raise serializers.ValidationError({'illegal_subcategory': [msg]})
            elif subcategory not in valid_subcategories:
                msg = (
                    'This value cannot be used in combination with the '
                    'supplied `illegal_category`.'
                )
                raise serializers.ValidationError({'illegal_subcategory': [msg]})
        elif data.get('illegal_subcategory') is not None:
            msg = (
                'This value must be omitted or set to "null" when the `reason` is not '
                '"illegal".'
            )
            raise serializers.ValidationError({'illegal_subcategory': [msg]})

        return data