Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions specifyweb/specify/migration_utils/update_schema_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,9 +399,7 @@ def update_table_schema_config_with_defaults(

pending_itemstr_rows.extend(item_str_rows)

for field in table.all_fields:
if field is table.idField:
continue
for field in table._all_fields(exclude_id_field=True):
field_defaults = None
if table_defaults.get('items'):
field_defaults = table_defaults['items'].get(field.name.lower())
Expand Down Expand Up @@ -664,17 +662,16 @@ def find_missing_schema_config_fields(discipline_id: int, apps=global_apps):
if table_name_lower not in container_names:
missing_tables.append(table_name)
missing_fields[table_name] = sorted(
field.name for field in table.all_fields
if field.name and field is not table.idField
field.name for field in table._all_fields(exclude_id_field=True)
if field.name
)
continue

existing_fields = existing_fields_by_table.get(table_name_lower, set())
missing_in_table = sorted( # sort for better reproducablity
field.name
for field in table.all_fields
for field in table._all_fields(exclude_id_field=True)
if field.name
and field is not table.idField
and field.name.lower() not in existing_fields
)

Expand Down
27 changes: 20 additions & 7 deletions specifyweb/specify/models_utils/load_datamodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,19 +149,32 @@ def name(self) -> str:
raise ValueError("classname is required to compute the name")
return self.classname.split(".")[-1]

def _all_fields(
self,
exclude_fields: bool = False,
exclude_relationships: bool = False,
exclude_id_field: bool = False,
exclude_virtual_fields: bool = True,
) -> Iterable[Union["Field", "Relationship"]]:
if not exclude_fields:
yield from self.fields or []
if not exclude_relationships:
yield from self.relationships or []
if not exclude_virtual_fields:
yield from self.virtual_fields or []
if not exclude_id_field and self.idField is not None:
yield self.idField

@property
def django_name(self) -> str:
return self.name.capitalize()

@property
def all_fields(self) -> list[Union["Field", "Relationship"]]:
def af() -> Iterable[Union["Field","Relationship"]]:
yield from self.fields or [] # Handle None by using an empty list
yield from self.relationships or [] # Handle None by using an empty list
if self.idField is not None:
yield self.idField

return list(af())
"""
A list of all non-virtual fields (including the ID field) and relationships for the table.
"""
return list(self._all_fields())


def is_virtual_field(self, fieldname: str) -> bool:
Expand Down
Loading