def get_nested_embed_kwargs(field_name, embed_info): """Build the kwarg set for embedded model fields""" model_field, is_array = embed_info kwargs = {} # If the embedded model is an array, have the serializer treat it as such if is_array: kwargs = {'many': True} if model_field is not None: if (model_field.verbose_name and field_mapping.needs_label(model_field, field_name)): kwargs['label'] = model_field.verbose_name if model_field.help_text: kwargs['help_test'] = model_field.help_text if not model_field.editable: kwargs['read_only'] = True return kwargs # If the field is read only, finish here if model_field.has_default() or model_field.blank or model_field.null: kwargs['required'] = False if model_field.null: kwargs['allow_null'] = True if model_field.validators: kwargs['validators'] = model_field.validators # `Unique` keyword not currently supported return kwargs
def get_relation_kwargs(field_name, relation_info): """ Creating a default instance of a flat relational field. """ model_field, related_model = relation_info kwargs = {} if related_model and not issubclass(related_model, EmbeddedDocument): kwargs['queryset'] = related_model.objects if model_field: if hasattr(model_field, 'verbose_name') and needs_label( model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if hasattr(model_field, 'help_text'): kwargs['help_text'] = model_field.help_text kwargs['required'] = model_field.required if model_field.null: kwargs['allow_null'] = True if getattr(model_field, 'unique', False): validator = UniqueValidator(queryset=related_model.objects) kwargs['validators'] = [validator] return kwargs
def get_relation_kwargs(field_name, relation_info): """ Creates a default instance of a flat relational field. """ model_field, related_model = relation_info kwargs = {} if related_model: kwargs['queryset'] = related_model.objects else: kwargs['read_only'] = True if model_field: if hasattr(model_field, 'verbose_name') and needs_label(model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if hasattr(model_field, 'help_text'): kwargs['help_text'] = model_field.help_text if kwargs.get('read_only', False): # If this field is read-only, then return early. # No further keyword arguments are valid. return kwargs if model_field.default or model_field.null: kwargs['required'] = False if model_field.null: kwargs['allow_null'] = True if getattr(model_field, 'unique', False): validator = UniqueValidator(queryset=model_field.model.objects) kwargs['validators'] = [validator] return kwargs
def get_relation_kwargs(field_name, relation_info): """ Creates a default instance of a flat relational field. """ model_field, related_model = relation_info kwargs = {} if related_model: kwargs['queryset'] = related_model.objects else: kwargs['read_only'] = True if model_field: if model_field.verbose_name and needs_label(model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) help_text = model_field.help_text if help_text: kwargs['help_text'] = help_text if kwargs.get('read_only', False): # If this field is read-only, then return early. # No further keyword arguments are valid. return kwargs if model_field.default or model_field.null: kwargs['required'] = False if model_field.null: kwargs['allow_null'] = True if getattr(model_field, 'unique', False): validator = UniqueValidator( queryset=model_field.model._default_manager) kwargs['validators'] = [validator] return kwargs
def get_relation_kwargs(field_name, relation_info): """ Creating a default instance of a flat relational field. """ model_field, related_model = relation_info kwargs = {} if related_model and not issubclass(related_model, EmbeddedDocument): kwargs['queryset'] = related_model.objects if model_field: if hasattr(model_field, 'verbose_name') and needs_label(model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if hasattr(model_field, 'help_text'): kwargs['help_text'] = model_field.help_text kwargs['required'] = model_field.required if model_field.null: kwargs['allow_null'] = True if getattr(model_field, 'unique', False): validator = UniqueValidator(queryset=model_field.model.objects) kwargs['validators'] = [validator] return kwargs
def get_field_kwargs(field_name, model_field): """ Creating a default instance of a basic non-relational field. """ kwargs = {} # The following will only be used by ModelField classes. # Gets removed for everything else. kwargs['model_field'] = model_field if hasattr(model_field, 'verbose_name') and needs_label( model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if hasattr(model_field, 'help_text'): kwargs['help_text'] = model_field.help_text if isinstance(model_field, me_fields.DecimalField): precision = model_field.precision max_value = getattr(model_field, 'max_value', None) if max_value is not None: max_length = len(str(max_value)) + precision else: max_length = 65536 kwargs['decimal_places'] = precision kwargs['max_digits'] = max_length if isinstance(model_field, me_fields.GeoJsonBaseField): kwargs['geo_type'] = model_field._type if isinstance( model_field, me_fields.SequenceField ) or model_field.primary_key or model_field.db_field == '_id': # If this field is read-only, then return early. # Further keyword arguments are not valid. kwargs['read_only'] = True return kwargs if model_field.default and not isinstance(model_field, me_fields.ComplexBaseField): kwargs['default'] = model_field.default if model_field.null: kwargs['allow_null'] = True if model_field.null and isinstance(model_field, me_fields.StringField): kwargs['allow_blank'] = True if 'default' not in kwargs: kwargs['required'] = model_field.required # handle special cases - compound fields: mongoengine.ListField/DictField if kwargs['required'] is True: if isinstance(model_field, me_fields.ListField) or isinstance( model_field, me_fields.DictField): kwargs['allow_empty'] = False if model_field.choices: # If this model field contains choices, then return early. # Further keyword arguments are not valid. kwargs['choices'] = model_field.choices return kwargs if isinstance(model_field, me_fields.StringField): if model_field.regex: kwargs['regex'] = model_field.regex max_length = getattr(model_field, 'max_length', None) if max_length is not None and isinstance(model_field, me_fields.StringField): kwargs['max_length'] = max_length min_length = getattr(model_field, 'min_length', None) if min_length is not None and isinstance(model_field, me_fields.StringField): kwargs['min_length'] = min_length max_value = getattr(model_field, 'max_value', None) if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['max_value'] = max_value min_value = getattr(model_field, 'min_value', None) if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['min_value'] = min_value return kwargs
def get_field_kwargs(self, field_name, model_field): """ Creates a default instance of a basic non-relational field. """ kwargs = {} validator_kwarg = list(model_field.validators) # The following will only be used by ModelField classes. # Gets removed for everything else. kwargs['model_field'] = model_field if model_field.verbose_name and needs_label(model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if model_field.help_text: kwargs['help_text'] = model_field.help_text max_digits = getattr(model_field, 'max_digits', None) if max_digits is not None: kwargs['max_digits'] = max_digits decimal_places = getattr(model_field, 'decimal_places', None) if decimal_places is not None: kwargs['decimal_places'] = decimal_places if isinstance(model_field, models.TextField): kwargs['style'] = {'base_template': 'textarea.html'} if isinstance(model_field, models.AutoField) \ or not model_field.editable: # If this field is read-only, then return early. # Further keyword arguments are not valid. kwargs['read_only'] = True return kwargs if model_field.has_default or model_field.blank or model_field.null: kwargs['required'] = False if model_field.null and not isinstance(model_field, models.NullBooleanField): kwargs['allow_null'] = True if model_field.blank and (isinstance(model_field, models.CharField) or isinstance(model_field, models.TextField) or isinstance(model_field, columns.Text)): kwargs['allow_blank'] = True if isinstance(model_field, models.FilePathField): kwargs['path'] = model_field.path if model_field.match is not None: kwargs['match'] = model_field.match if model_field.recursive is not False: kwargs['recursive'] = model_field.recursive if model_field.allow_files is not True: kwargs['allow_files'] = model_field.allow_files if model_field.allow_folders is not False: kwargs['allow_folders'] = model_field.allow_folders if model_field.choices: # If this model field contains choices, then return early. # Further keyword arguments are not valid. kwargs['choices'] = model_field.choices return kwargs # Our decimal validation is handled in the field code, # not validator code. # (In Django 1.9+ this differs from previous style) if isinstance(model_field, models.DecimalField) and DecimalValidator: validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, DecimalValidator) ] # Ensure that max_length is passed explicitly as a keyword arg, # rather than as a validator. max_length = getattr(model_field, 'max_length', None) if max_length is not None and ( isinstance(model_field, models.CharField) or isinstance(model_field, models.TextField)): kwargs['max_length'] = max_length validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MaxLengthValidator) ] # Ensure that min_length is passed explicitly as a keyword arg, # rather than as a validator. min_length = next( (validator.limit_value for validator in validator_kwarg if isinstance(validator, validators.MinLengthValidator)), None) if min_length is not None and isinstance(model_field, models.CharField): kwargs['min_length'] = min_length validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MinLengthValidator) ] # Ensure that max_value is passed explicitly as a keyword arg, # rather than as a validator. max_value = next( (validator.limit_value for validator in validator_kwarg if isinstance(validator, validators.MaxValueValidator)), None) if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['max_value'] = max_value validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MaxValueValidator) ] # Ensure that max_value is passed explicitly as a keyword arg, # rather than as a validator. min_value = next( (validator.limit_value for validator in validator_kwarg if isinstance(validator, validators.MinValueValidator)), None) if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['min_value'] = min_value validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MinValueValidator) ] # URLField does not need to include the URLValidator argument, # as it is explicitly added in. if isinstance(model_field, models.URLField): validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.URLValidator) ] # EmailField does not need to include the validate_email argument, # as it is explicitly added in. if isinstance(model_field, models.EmailField): validator_kwarg = [ validator for validator in validator_kwarg if validator is not validators.validate_email ] # SlugField do not need to include the 'validate_slug' argument, if isinstance(model_field, models.SlugField): validator_kwarg = [ validator for validator in validator_kwarg if validator is not validators.validate_slug ] # IPAddressField do not need to include the 'validate_ipv46_address' # argument, if isinstance(model_field, models.GenericIPAddressField): validator_kwarg = [ validator for validator in validator_kwarg if validator is not validators.validate_ipv46_address ] if getattr(model_field, 'unique', False): warnings.warn('UniqueValidator is currently not supported ' 'in DjangoCassandraSerializer') if validator_kwarg: kwargs['validators'] = validator_kwarg return kwargs
def get_field_kwargs(field_name, model_field): """ Creates a default instance of a basic non-relational field. """ kwargs = {} # The following will only be used by ModelField classes. # Gets removed for everything else. kwargs['model_field'] = model_field if hasattr(model_field, 'verbose_name') and needs_label(model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if hasattr(model_field, 'help_text'): kwargs['help_text'] = model_field.help_text if isinstance(model_field, me_fields.DecimalField): precision = model_field.precision max_value = getattr(model_field, 'max_value', None) if max_value is not None: max_length = len(str(max_value)) + precision else: max_length = 65536 kwargs['decimal_places'] = precision kwargs['max_digits'] = max_length if isinstance(model_field, me_fields.GeoJsonBaseField): kwargs['geo_type'] = model_field._type if isinstance(model_field, me_fields.SequenceField) or model_field.primary_key or model_field.db_field == '_id': # If this field is read-only, then return early. # Further keyword arguments are not valid. kwargs['read_only'] = True return kwargs kwargs['required'] = model_field.required if model_field.default: kwargs['required'] = False if model_field.default and not isinstance(model_field, me_fields.ComplexBaseField): kwargs['default'] = model_field.default if model_field.null: kwargs['allow_null'] = True if model_field.choices: # If this model field contains choices, then return early. # Further keyword arguments are not valid. kwargs['choices'] = model_field.choices return kwargs max_length = getattr(model_field, 'max_length', None) if max_length is not None and isinstance(model_field, me_fields.StringField): kwargs['max_length'] = max_length min_length = getattr(model_field, 'min_length', None) if min_length is not None and isinstance(model_field, me_fields.StringField): kwargs['min_length'] = min_length max_value = getattr(model_field, 'max_value', None) if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['max_value'] = max_value min_value = getattr(model_field, 'min_value', None) if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['min_value'] = min_value return kwargs
def get_field_kwargs(self, field_name, model_field): """ Creates a default instance of a basic non-relational field. """ kwargs = {} validator_kwarg = list(model_field.validators) # The following will only be used by ModelField classes. # Gets removed for everything else. kwargs["model_field"] = model_field if model_field.verbose_name and needs_label(model_field, field_name): kwargs["label"] = capfirst(model_field.verbose_name) if model_field.help_text: kwargs["help_text"] = model_field.help_text max_digits = getattr(model_field, "max_digits", None) if max_digits is not None: kwargs["max_digits"] = max_digits decimal_places = getattr(model_field, "decimal_places", None) if decimal_places is not None: kwargs["decimal_places"] = decimal_places if isinstance(model_field, models.TextField): kwargs["style"] = {"base_template": "textarea.html"} if isinstance(model_field, models.AutoField) or not model_field.editable: # If this field is read-only, then return early. # Further keyword arguments are not valid. kwargs["read_only"] = True return kwargs if model_field.has_default or model_field.blank or model_field.null: kwargs["required"] = False if model_field.null and not isinstance(model_field, models.NullBooleanField): kwargs["allow_null"] = True if model_field.blank and ( isinstance(model_field, models.CharField) or isinstance(model_field, models.TextField) or isinstance(model_field, columns.Text) ): kwargs["allow_blank"] = True if isinstance(model_field, models.FilePathField): kwargs["path"] = model_field.path if model_field.match is not None: kwargs["match"] = model_field.match if model_field.recursive is not False: kwargs["recursive"] = model_field.recursive if model_field.allow_files is not True: kwargs["allow_files"] = model_field.allow_files if model_field.allow_folders is not False: kwargs["allow_folders"] = model_field.allow_folders if model_field.choices: # If this model field contains choices, then return early. # Further keyword arguments are not valid. kwargs["choices"] = model_field.choices return kwargs # Our decimal validation is handled in the field code, # not validator code. # (In Django 1.9+ this differs from previous style) if isinstance(model_field, models.DecimalField) and DecimalValidator: validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, DecimalValidator) ] # Ensure that max_length is passed explicitly as a keyword arg, # rather than as a validator. max_length = getattr(model_field, "max_length", None) if max_length is not None and ( isinstance(model_field, models.CharField) or isinstance(model_field, models.TextField) ): kwargs["max_length"] = max_length validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MaxLengthValidator) ] # Ensure that min_length is passed explicitly as a keyword arg, # rather than as a validator. min_length = next( ( validator.limit_value for validator in validator_kwarg if isinstance(validator, validators.MinLengthValidator) ), None, ) if min_length is not None and isinstance(model_field, models.CharField): kwargs["min_length"] = min_length validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MinLengthValidator) ] # Ensure that max_value is passed explicitly as a keyword arg, # rather than as a validator. max_value = next( ( validator.limit_value for validator in validator_kwarg if isinstance(validator, validators.MaxValueValidator) ), None, ) if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs["max_value"] = max_value validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MaxValueValidator) ] # Ensure that max_value is passed explicitly as a keyword arg, # rather than as a validator. min_value = next( ( validator.limit_value for validator in validator_kwarg if isinstance(validator, validators.MinValueValidator) ), None, ) if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs["min_value"] = min_value validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.MinValueValidator) ] # URLField does not need to include the URLValidator argument, # as it is explicitly added in. if isinstance(model_field, models.URLField): validator_kwarg = [ validator for validator in validator_kwarg if not isinstance(validator, validators.URLValidator) ] # EmailField does not need to include the validate_email argument, # as it is explicitly added in. if isinstance(model_field, models.EmailField): validator_kwarg = [validator for validator in validator_kwarg if validator is not validators.validate_email] # SlugField do not need to include the 'validate_slug' argument, if isinstance(model_field, models.SlugField): validator_kwarg = [validator for validator in validator_kwarg if validator is not validators.validate_slug] # IPAddressField do not need to include the 'validate_ipv46_address' # argument, if isinstance(model_field, models.GenericIPAddressField): validator_kwarg = [ validator for validator in validator_kwarg if validator is not validators.validate_ipv46_address ] if getattr(model_field, "unique", False): warnings.warn("UniqueValidator is current not support " "for DjangoCassandraSerializer") if validator_kwarg: kwargs["validators"] = validator_kwarg return kwargs
def get_field_kwargs(field_name, model_field): """ Creates a default instance of a basic non-relational field. """ kwargs = {} validators = [] # The following will only be used by ModelField classes. # Gets removed for everything else. kwargs['model_field'] = model_field if model_field.verbose_name and needs_label(model_field, field_name): kwargs['label'] = capfirst(model_field.verbose_name) if model_field.help_text: kwargs['help_text'] = model_field.help_text if isinstance(model_field, me_fields.DecimalField): precision = model_field.precision max_value = getattr(model_field, 'max_value', None) if max_value is not None: max_length = len(str(max_value)) + precision else: max_length = 65536 kwargs['decimal_places'] = precision kwargs['max_digits'] = max_length if isinstance( model_field, me_fields.SequenceField ) or model_field.primary_key or model_field.db_field == '_id': # If this field is read-only, then return early. # Further keyword arguments are not valid. kwargs['read_only'] = True return kwargs kwargs['required'] = model_field.required if model_field.default: kwargs['required'] = False if model_field.default and not isinstance(model_field, me_fields.ComplexBaseField): kwargs['default'] = model_field.default if model_field.null: kwargs['allow_null'] = True if model_field.choices: # If this model field contains choices, then return early. # Further keyword arguments are not valid. kwargs['choices'] = model_field.choices return kwargs max_length = getattr(model_field, 'max_length', None) if max_length is not None and isinstance(model_field, me_fields.StringField): kwargs['max_length'] = max_length min_length = getattr(model_field, 'min_length', None) if min_length is not None and isinstance(model_field, me_fields.StringField): kwargs['min_length'] = min_length max_value = getattr(model_field, 'max_value', None) if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['max_value'] = max_value min_value = getattr(model_field, 'min_value', None) if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): kwargs['min_value'] = min_value # if getattr(model_field, 'unique', False): # validator = UniqueValidator( # queryset=model_field.model._default_manager, # message=None) # validator_kwarg.append(validator) if validators: kwargs['validators'] = validators return kwargs