def scaffold_list_columns(self): """ Return a list of columns from the model. """ columns = [] for p in self._get_model_iterator(): if hasattr(p, 'direction'): if self.column_display_all_relations or p.direction.name == 'MANYTOONE': columns.append(p.key) elif hasattr(p, 'columns'): if len(p.columns) > 1: filtered = tools.filter_foreign_columns(self.model.__table__, p.columns) if len(filtered) > 1: warnings.warn('Can not convert multiple-column properties (%s.%s)' % (self.model, p.key)) continue column = filtered[0] else: column = p.columns[0] if column.foreign_keys: continue if not self.column_display_pk and column.primary_key: continue columns.append(p.key) return columns
def scaffold_list_columns(self): """ Return a list of columns from the model. """ columns = [] for p in self._get_model_iterator(): if hasattr(p, 'direction'): if self.column_display_all_relations or p.direction.name == 'MANYTOONE': columns.append(p.key) elif hasattr(p, 'columns'): if len(p.columns) > 1: filtered = tools.filter_foreign_columns(self.model.__table__, p.columns) if len(filtered) == 0: continue elif len(filtered) > 1: warnings.warn('Can not convert multiple-column properties (%s.%s)' % (self.model, p.key)) continue column = filtered[0] else: column = p.columns[0] if column.foreign_keys: continue if not self.column_display_pk and column.primary_key: continue columns.append(p.key) return columns
def convert(self, model, mapper, prop, field_args, hidden_pk): # Properly handle forced fields if isinstance(prop, FieldPlaceholder): return form.recreate_field(prop.field) kwargs = { 'validators': [], 'filters': [] } if field_args: kwargs.update(field_args) if kwargs['validators']: # Create a copy of the list since we will be modifying it. kwargs['validators'] = list(kwargs['validators']) # Check if it is relation or property if hasattr(prop, 'direction'): return self._convert_relation(prop, kwargs) elif hasattr(prop, 'columns'): # Ignore pk/fk # Check if more than one column mapped to the property if len(prop.columns) > 1: columns = filter_foreign_columns(model.__table__, prop.columns) if len(columns) > 1: warnings.warn('Can not convert multiple-column properties (%s.%s)' % (model, prop.key)) return None column = columns[0] else: # Grab column column = prop.columns[0] form_columns = getattr(self.view, 'form_columns', None) or () # Do not display foreign keys - use relations, except when explicitly instructed if column.foreign_keys and prop.key not in form_columns: return None # Only display "real" columns if not isinstance(column, Column): return None unique = False if column.primary_key: if hidden_pk: # If requested to add hidden field, show it return fields.HiddenField() else: # By default, don't show primary keys either # If PK is not explicitly allowed, ignore it if prop.key not in form_columns: return None # Current Unique Validator does not work with multicolumns-pks if not has_multiple_pks(model): kwargs['validators'].append(UserUnique(self.session, model, column)) unique = True # If field is unique, validate it if column.unique and not unique: kwargs['validators'].append(UserUnique(self.session, model, column)) optional_types = getattr(self.view, 'form_optional_types', (Boolean,)) if ( not column.nullable and not isinstance(column.type, optional_types) and not column.default and not column.server_default ): kwargs['validators'].append(validators.InputRequired()) # Apply label and description if it isn't inline form field if self.view.model == mapper.class_: kwargs['label'] = self._get_label(prop.key, kwargs) kwargs['description'] = self._get_description(prop.key, kwargs) # Figure out default value default = getattr(column, 'default', None) value = None if default is not None: value = getattr(default, 'arg', None) if value is not None: if getattr(default, 'is_callable', False): value = lambda: default.arg(None) else: if not getattr(default, 'is_scalar', True): value = None if value is not None: kwargs['default'] = value # Check nullable if column.nullable: kwargs['validators'].append(validators.Optional()) # Override field type if necessary override = self._get_field_override(prop.key) if override: return override(**kwargs) # Check choices form_choices = getattr(self.view, 'form_choices', None) if mapper.class_ == self.view.model and form_choices: choices = form_choices.get(column.key) if choices: return form.Select2Field( choices=choices, allow_blank=column.nullable, **kwargs ) # Run converter converter = self.get_converter(column) if converter is None: return None return converter(model=model, mapper=mapper, prop=prop, column=column, field_args=kwargs) return None
def convert(self, model, mapper, prop, field_args, hidden_pk): # Properly handle forced fields if isinstance(prop, FieldPlaceholder): return form.recreate_field(prop.field) kwargs = {'validators': [], 'filters': []} if field_args: kwargs.update(field_args) if kwargs['validators']: # Create a copy of the list since we will be modifying it. kwargs['validators'] = list(kwargs['validators']) # Check if it is relation or property if hasattr(prop, 'direction'): return self._convert_relation(prop, kwargs) elif hasattr(prop, 'columns'): # Ignore pk/fk # Check if more than one column mapped to the property if len(prop.columns) > 1: columns = filter_foreign_columns(model.__table__, prop.columns) if len(columns) > 1: warnings.warn( 'Can not convert multiple-column properties (%s.%s)' % (model, prop.key)) return None column = columns[0] else: # Grab column column = prop.columns[0] form_columns = getattr(self.view, 'form_columns', None) or () # Do not display foreign keys - use relations, except when explicitly instructed if column.foreign_keys and prop.key not in form_columns: return None # Only display "real" columns if not isinstance(column, Column): return None unique = False if column.primary_key: if hidden_pk: # If requested to add hidden field, show it return fields.HiddenField() else: # By default, don't show primary keys either # If PK is not explicitly allowed, ignore it if prop.key not in form_columns: return None # Current Unique Validator does not work with multicolumns-pks if not has_multiple_pks(model): kwargs['validators'].append( UserUnique(self.session, model, column)) unique = True # If field is unique, validate it if column.unique and not unique: kwargs['validators'].append( UserUnique(self.session, model, column)) optional_types = getattr(self.view, 'form_optional_types', (Boolean, )) if (not column.nullable and not isinstance(column.type, optional_types) and not column.default and not column.server_default): kwargs['validators'].append(validators.InputRequired()) # Apply label and description if it isn't inline form field if self.view.model == mapper.class_: kwargs['label'] = self._get_label(prop.key, kwargs) kwargs['description'] = self._get_description(prop.key, kwargs) # Figure out default value default = getattr(column, 'default', None) value = None if default is not None: value = getattr(default, 'arg', None) if value is not None: if getattr(default, 'is_callable', False): value = lambda: default.arg(None) else: if not getattr(default, 'is_scalar', True): value = None if value is not None: kwargs['default'] = value # Check nullable if column.nullable: kwargs['validators'].append(validators.Optional()) # Override field type if necessary override = self._get_field_override(prop.key) if override: return override(**kwargs) # Check choices form_choices = getattr(self.view, 'form_choices', None) if mapper.class_ == self.view.model and form_choices: choices = form_choices.get(column.key) if choices: return form.Select2Field(choices=choices, allow_blank=column.nullable, **kwargs) # Run converter converter = self.get_converter(column) if converter is None: return None return converter(model=model, mapper=mapper, prop=prop, column=column, field_args=kwargs) return None
def convert(self, model, mapper, name, prop, field_args, hidden_pk): """ overriding the default convert method to change the choices system. """ # Properly handle forced fields if isinstance(prop, FieldPlaceholder): return form.recreate_field(prop.field) kwargs = { 'validators': [], 'filters': [] } if field_args: kwargs.update(field_args) if kwargs['validators']: # Create a copy of the list since we will be modifying it. kwargs['validators'] = list(kwargs['validators']) # Check if it is relation or property if hasattr(prop, 'direction') or is_association_proxy(prop): property_is_association_proxy = is_association_proxy(prop) if property_is_association_proxy: if not hasattr(prop.remote_attr, 'prop'): raise Exception('Association proxy referencing another association proxy is not supported.') prop = prop.remote_attr.prop return self._convert_relation(name, prop, property_is_association_proxy, kwargs) elif hasattr(prop, 'columns'): # Ignore pk/fk # Check if more than one column mapped to the property if len(prop.columns) > 1 and not isinstance(prop, ColumnProperty): columns = filter_foreign_columns(model.__table__, prop.columns) if len(columns) == 0: return None elif len(columns) > 1: warn('Can not convert multiple-column properties (%s.%s)' % (model, prop.key)) return None column = columns[0] else: # Grab column column = prop.columns[0] form_columns = getattr(self.view, 'form_columns', None) or () # Do not display foreign keys - use relations, except when explicitly instructed if column.foreign_keys and prop.key not in form_columns: return None # Only display "real" columns if not isinstance(column, Column): return None unique = False if column.primary_key: if hidden_pk: # If requested to add hidden field, show it return fields.HiddenField() else: # By default, don't show primary keys either # If PK is not explicitly allowed, ignore it if prop.key not in form_columns: return None # Current Unique Validator does not work with multicolumns-pks if not has_multiple_pks(model): kwargs['validators'].append(Unique(self.session, model, column)) unique = True # If field is unique, validate it if column.unique and not unique: kwargs['validators'].append(Unique(self.session, model, column)) optional_types = getattr(self.view, 'form_optional_types', (Boolean,)) if ( not column.nullable and not isinstance(column.type, optional_types) and not column.default and not column.server_default ): kwargs['validators'].append(validators.InputRequired()) # Apply label and description if it isn't inline form field if self.view.model == mapper.class_: kwargs['label'] = self._get_label(prop.key, kwargs) kwargs['description'] = self._get_description(prop.key, kwargs) # Figure out default value default = getattr(column, 'default', None) value = None if default is not None: value = getattr(default, 'arg', None) if value is not None: if getattr(default, 'is_callable', False): value = lambda: default.arg(None) # noqa: E731 else: if not getattr(default, 'is_scalar', True): value = None if value is not None: kwargs['default'] = value # Check nullable if column.nullable: kwargs['validators'].append(validators.Optional()) # Override field type if necessary override = self._get_field_override(prop.key) if override: return override(**kwargs) # Check if a list of 'form_choices' are specified # adding the default choice system from here. if mapper.class_ == self.view.model and hasattr(column, "choices"): choices = getattr(column, "choices") if choices: return form.Select2Field( choices=choices, allow_blank=column.nullable, **kwargs ) # excluded_fields = getattr(self.view, 'excluded_fields', None) # print ("excluded_fields:", excluded_fields) # if excluded_fields is not None: # if self.view.column_exclude_list is not None: # self.view.column_exclude_list.extend(excluded_fields) # else: # self.view.column_exclude_list = excluded_fields # if self.view.form_excluded_columns is not None: # self.view.form_excluded_columns.extend(excluded_fields) # else: # self.view.form_excluded_columns = excluded_fields # Run converter converter = self.get_converter(column) if converter is None: return None return converter(model=model, mapper=mapper, prop=prop, column=column, field_args=kwargs) return None