Create models.py from the Benchling schema

from benchling_sdk.benchling import Benchling
from benchling_sdk.auth.client_credentials_oauth2 import ClientCredentialsOAuth2

benchling = Benchling(
    url="https://navatx.benchling.com/",
    auth_method=ClientCredentialsOAuth2(client_id="***", client_secret="***"),
)
Hide code cell content
dicts = []
for tables in benchling.schemas.list_entity_schemas():
    for table in tables:
        # skip archived tables
        if table.archive_record is None:
            table_dict = table.to_dict()
            # remove archived fields
            fields = [
                field
                for field in table_dict["fieldDefinitions"]
                if field["archiveRecord"] is None
            ]
            table_dict["fieldDefinitions"] = fields
            dicts.append(table_dict)

dicts
[{'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2022-08-22T11:34:08.528872+00:00',
  'type': 'dna_oligo',
  'prefix': 'BAR',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_WQes737H',
    'isMulti': False,
    'isRequired': False,
    'name': 'Description'}],
  'id': 'ts_1uiYEYn2',
  'name': 'Barcode'},
 {'constraint': {'fieldDefinitionNames': ['5th Lipid Component ID',
    'Cholesterol ID',
    'Ionizable Lipid ID',
    '5th Lipid Component Mole %',
    'Phospholipid Mole %',
    'Phospholipid ID',
    'Cholesterol Mole %',
    'Targeting Epitope Identity',
    'PEG Lipid ID',
    'Ionizable Lipid Mole %',
    'PEG Lipid Mole %'],
   'hasUniqueResidues': False},
  'containableType': 'ENTITY',
  'modifiedAt': '2024-12-05T18:28:35.698769+00:00',
  'type': 'custom_entity',
  'prefix': 'LNP',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_5dLaZUrg',
    'isMulti': False,
    'isRequired': False,
    'name': 'LNP Number'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_qxLhhT5f',
    'isMulti': False,
    'isRequired': False,
    'name': 'Chemical Class'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_QgSqJqsp',
    'isMulti': False,
    'isRequired': False,
    'name': 'Screen Number'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_OQFCU52d',
    'isMulti': False,
    'isRequired': False,
    'name': 'Iteration Number'},
   {'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_ElG5qbHB',
    'isMulti': False,
    'isRequired': False,
    'name': 'Ionizable Lipid ID'},
   {'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_32meslYt',
    'isMulti': False,
    'isRequired': False,
    'name': 'Cholesterol ID'},
   {'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_lZsszEEc',
    'isMulti': False,
    'isRequired': False,
    'name': 'PEG Lipid ID'},
   {'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_eOtamHGD',
    'isMulti': False,
    'isRequired': False,
    'name': 'Phospholipid ID'},
   {'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_7sKKs1V1',
    'isMulti': False,
    'isRequired': False,
    'name': '5th Lipid Component ID'},
   {'schemaId': 'ts_drSMKjvw',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_oWx1d15h',
    'isMulti': False,
    'isRequired': False,
    'name': 'Targeting Epitope Identity'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_gisP4Avd',
    'isMulti': False,
    'isRequired': False,
    'name': 'Ionizable Lipid Mole %'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_ZbEx2son',
    'isMulti': False,
    'isRequired': False,
    'name': 'Cholesterol Mole %'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_STI7YlA5',
    'isMulti': False,
    'isRequired': False,
    'name': 'PEG Lipid Mole %'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_eV4MRGXC',
    'isMulti': False,
    'isRequired': False,
    'name': 'Phospholipid Mole %'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_tngXJEnJ',
    'isMulti': False,
    'isRequired': False,
    'name': '5th Lipid Component Mole %'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_Zsw871e8',
    'isMulti': False,
    'isRequired': False,
    'name': 'Lipid : RNA mass ratio'}],
  'id': 'ts_knQGQg9N',
  'name': 'LNP Identity'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-05-30T16:03:44.427042+00:00',
  'type': 'custom_entity',
  'prefix': 'LIB',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_SKDXt9OA',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_KTy77wRx',
    'isMulti': True,
    'isRequired': False,
    'name': 'LNPs'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_BmSR74f5',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_WGrcKS53',
    'isMulti': False,
    'isRequired': False,
    'name': 'Date (YYMMDD)'},
   {'schemaId': 'ts_1uiYEYn2',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_1IQoFa8L',
    'isMulti': True,
    'isRequired': False,
    'name': 'Naked Barcodes'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_LHef0Bpv',
    'isMulti': False,
    'isRequired': False,
    'name': 'Description'},
   {'schemaId': 'ts_knQGQg9N',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_l58hOeet',
    'isMulti': True,
    'isRequired': False,
    'name': 'Legacy LNPs'}],
  'id': 'ts_2NxifJ5J',
  'name': 'LNP Library'},
 {'constraint': None,
  'containableType': 'NONE',
  'modifiedAt': '2024-09-06T17:40:57.211047+00:00',
  'type': 'custom_entity',
  'prefix': 'ST',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_I6koD8qr',
    'isMulti': False,
    'isRequired': True,
    'name': 'Date (YYMMDD)'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_kUR4hOHk',
    'isMulti': False,
    'isRequired': False,
    'name': 'Description'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_n90Kp89N',
    'isMulti': False,
    'isRequired': False,
    'name': 'Total Animals'},
   {'dropdownId': 'sfs_Yky86aXE',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_FOZssOE9',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study Type'},
   {'dropdownId': 'sfs_7bYAqcM2',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_NN2nj1BD',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study Site'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_MDQyvqGa',
    'isMulti': False,
    'isRequired': False,
    'name': 'Sharepoint Directory'}],
  'id': 'ts_SxJbODKl',
  'name': 'Study'},
 {'constraint': None,
  'containableType': 'NONE',
  'modifiedAt': '2024-10-03T14:13:38.976593+00:00',
  'type': 'custom_entity',
  'prefix': 'GP',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_nKLMSg3c',
    'isMulti': False,
    'isRequired': True,
    'name': 'Study'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_JdS0bH2Y',
    'isMulti': False,
    'isRequired': False,
    'name': 'Group number'},
   {'schemaId': 'ts_SKDXt9OA',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_A5NBDSrW',
    'isMulti': False,
    'isRequired': False,
    'name': 'Treatment (LNP)'},
   {'schemaId': 'ts_2NxifJ5J',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_WTE1Xn9o',
    'isMulti': False,
    'isRequired': False,
    'name': 'Treatment (Library)'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_bSLw4gCf',
    'isMulti': False,
    'isRequired': False,
    'name': 'Quantity (n)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_shT4IaKC',
    'isMulti': False,
    'isRequired': True,
    'name': 'Dose (mg/kg)'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_oMCQY1Io',
    'isMulti': False,
    'isRequired': False,
    'name': 'Description'}],
  'id': 'ts_dxeqbvub',
  'name': 'Group'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-09-17T18:04:52.397327+00:00',
  'type': 'custom_entity',
  'prefix': 'M',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_dxeqbvub',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_XW0Ilagd',
    'isMulti': False,
    'isRequired': False,
    'name': 'Group'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_cFHUb9Rm',
    'isMulti': False,
    'isRequired': False,
    'name': 'Animal Replicate Number'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_nOk72xZ7',
    'isMulti': True,
    'isRequired': False,
    'name': 'Study'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_u43PGpr3',
    'isMulti': False,
    'isRequired': False,
    'name': 'Termination Date'},
   {'dropdownId': 'sfs_gYd55ha4',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_tgqJFpgm',
    'isMulti': False,
    'isRequired': False,
    'name': 'Strain'},
   {'dropdownId': 'sfs_W7V54wft',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_JgNKStsL',
    'isMulti': False,
    'isRequired': False,
    'name': 'Sex'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_kKtzZy04',
    'isMulti': False,
    'isRequired': False,
    'name': 'DOB'},
   {'dropdownId': 'sfs_7bYAqcM2',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_2Jav8g1B',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study Site'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_dBLceQrT',
    'isMulti': False,
    'isRequired': False,
    'name': 'Ear Tag'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_JVcycT9G',
    'isMulti': False,
    'isRequired': False,
    'name': 'Notes'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_juqDCY0P',
    'isMulti': False,
    'isRequired': False,
    'name': 'Timepoint (h)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_GgGw7j9X',
    'isMulti': False,
    'isRequired': False,
    'name': 'Timepoint (days)'}],
  'id': 'ts_AAtzcSml',
  'name': 'Mouse'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-09T15:00:51.545397+00:00',
  'type': 'custom_entity',
  'prefix': 'Tissue',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_e5PD05Iv',
    'isMulti': False,
    'isRequired': False,
    'name': 'Animal'},
   {'dropdownId': 'sfs_Gb5O6dZg',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_ZvcnZzro',
    'isMulti': False,
    'isRequired': False,
    'name': 'Tissue Type'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_UdcAb7rn',
    'isMulti': False,
    'isRequired': False,
    'name': 'Tissue Replicate Number'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_DnLIQUel',
    'isMulti': False,
    'isRequired': False,
    'name': 'Collection Date'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_FE8J0piP',
    'isMulti': False,
    'isRequired': False,
    'name': 'Comment'}],
  'id': 'ts_gAH1FB2U',
  'name': 'Tissue'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-21T13:24:01.192987+00:00',
  'type': 'rna_sequence',
  'prefix': 'MRNA',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_SJvMf2LB',
    'isMulti': False,
    'isRequired': False,
    'name': 'Description'},
   {'schemaId': 'ts_gou22D2s',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_juk02m60',
    'isMulti': False,
    'isRequired': False,
    'name': 'Plasmid'},
   {'dropdownId': 'sfs_kD8D1unh',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_dyPRor1O',
    'isMulti': False,
    'isRequired': False,
    'name': 'CleanCap'},
   {'schemaId': 'ts_yBmcsYkz',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_z0XhlJ8r',
    'isMulti': False,
    'isRequired': False,
    'name': "5' UTR"},
   {'schemaId': 'ts_lcalxsB0',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_ja5D40q3',
    'isMulti': False,
    'isRequired': False,
    'name': "3' UTR"},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_NK7dzAkF',
    'isMulti': False,
    'isRequired': False,
    'name': 'Notes'}],
  'id': 'ts_DPw9EeOA',
  'name': 'mRNA'},
 {'constraint': {'fieldDefinitionNames': [], 'hasUniqueResidues': False},
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-23T13:32:24.738967+00:00',
  'type': 'molecule',
  'prefix': 'NAVA-',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'dropdownId': 'sfs_uKD3uKsW',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_9QDmjgoS',
    'isMulti': False,
    'isRequired': False,
    'name': 'Type'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_0SFaMhRD',
    'isMulti': False,
    'isRequired': False,
    'name': 'Number of Ionizable Amines'},
   {'type': 'blob_link',
    'archiveRecord': None,
    'id': 'tsf_i3UdbnhL',
    'isMulti': True,
    'isRequired': False,
    'name': 'Structure'},
   {'dropdownId': 'sfs_N0jBeprk',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_DeVI9auF',
    'isMulti': False,
    'isRequired': False,
    'name': 'Has this lipid been previously screened?'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_PgFOgMJC',
    'isMulti': False,
    'isRequired': False,
    'name': 'Design Series'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_gMs9FX8g',
    'isMulti': False,
    'isRequired': False,
    'name': 'Design Set'}],
  'id': 'ts_5tdksa9q',
  'name': 'Compound'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-06-11T15:01:20.946128+00:00',
  'type': 'custom_entity',
  'prefix': 'SC',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_gAH1FB2U',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_CzPRw6X4',
    'isMulti': True,
    'isRequired': False,
    'name': 'Tissue'},
   {'schemaId': 'ts_oC3bbUz0',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_EncUzkW8',
    'isMulti': False,
    'isRequired': True,
    'name': 'HTO used'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_qDN0j49U',
    'isMulti': False,
    'isRequired': False,
    'name': 'Cell Count from Rhapsody'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_67nLzbzx',
    'isMulti': False,
    'isRequired': False,
    'name': 'Viability'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_7rWL3xmM',
    'isMulti': False,
    'isRequired': False,
    'name': 'Actual Cell Count'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_ZMk520Wm',
    'isMulti': False,
    'isRequired': False,
    'name': 'Amount to Pool'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_6MCkoCjs',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study'},
   {'schemaId': 'ts_dxeqbvub',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_L9lTp6cu',
    'isMulti': True,
    'isRequired': False,
    'name': 'Group'}],
  'id': 'ts_eVzQXeki',
  'name': 'Tagged Single Cell Seq Sample'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-06-11T15:03:33.144533+00:00',
  'type': 'custom_entity',
  'prefix': 'TPool',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_eVzQXeki',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_62e0A7mx',
    'isMulti': True,
    'isRequired': False,
    'name': 'Tagged Single Cell Tissues'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_2t9xW2FP',
    'isMulti': False,
    'isRequired': False,
    'name': 'Date'},
   {'schemaId': 'ts_fkQwtf0q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_xg5X0i4s',
    'isMulti': True,
    'isRequired': False,
    'name': 'Individual ADTs used'},
   {'schemaId': 'ts_ZGYsOghk',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_grJ9edv2',
    'isMulti': True,
    'isRequired': False,
    'name': 'ADT pools used'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_JiJU1cvR',
    'isMulti': False,
    'isRequired': False,
    'name': 'Ratio to pool'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_QqRI6EhO',
    'isMulti': False,
    'isRequired': False,
    'name': 'Cell Count from Rhapsody'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_MD3E1p9D',
    'isMulti': False,
    'isRequired': False,
    'name': 'Viability'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_bjf0oyPJ',
    'isMulti': False,
    'isRequired': False,
    'name': 'Actual Cell count'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_AxqBDEZt',
    'isMulti': False,
    'isRequired': False,
    'name': 'Amount to pool'}],
  'id': 'ts_W3z7lr0x',
  'name': 'Tissue Pool'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-08T14:23:54.768198+00:00',
  'type': 'custom_entity',
  'prefix': 'P',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_dxeqbvub',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_JloQVf41',
    'isMulti': False,
    'isRequired': False,
    'name': 'Group'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_bW4tcIS6',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_Hu7MlJs9',
    'isMulti': False,
    'isRequired': False,
    'name': 'Experimental Number'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_UTyZovGM',
    'isMulti': False,
    'isRequired': False,
    'name': 'Labcorp Number'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_y62rN7k2',
    'isMulti': False,
    'isRequired': False,
    'name': 'Termination Date'},
   {'dropdownId': 'sfs_gYd55ha4',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_ZY1FG0OG',
    'isMulti': False,
    'isRequired': False,
    'name': 'Strain'},
   {'dropdownId': 'sfs_km12N2Dm',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_fu3XeNKb',
    'isMulti': False,
    'isRequired': False,
    'name': 'Species'},
   {'dropdownId': 'sfs_W7V54wft',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_QSgwgETp',
    'isMulti': False,
    'isRequired': False,
    'name': 'Sex'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_vEpody2C',
    'isMulti': False,
    'isRequired': False,
    'name': 'DOB'}],
  'id': 'ts_dIZFTVxd',
  'name': 'Primate'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-11-19T16:21:34.715899+00:00',
  'type': 'dna_oligo',
  'prefix': 'ADT',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_K2VXu9Va',
    'isMulti': False,
    'isRequired': False,
    'name': 'Concentration'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_WMfO8rIL',
    'isMulti': False,
    'isRequired': False,
    'name': 'Clone'},
   {'dropdownId': 'sfs_ZpWZgwRj',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_IrB8L6Kq',
    'isMulti': False,
    'isRequired': False,
    'name': 'Species reactivity'},
   {'dropdownId': 'sfs_N0jBeprk',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_k8sXILnM',
    'isMulti': False,
    'isRequired': False,
    'name': 'Payload [SENTseq align]'}],
  'id': 'ts_fkQwtf0q',
  'name': 'ADT Barcodes'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2023-02-14T17:43:54.682364+00:00',
  'type': 'dna_oligo',
  'prefix': 'HTO',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_whPHe483',
    'isMulti': False,
    'isRequired': False,
    'name': 'Antibody'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_3OYP67zN',
    'isMulti': False,
    'isRequired': False,
    'name': 'Concentration'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_4zgqcpn0',
    'isMulti': False,
    'isRequired': False,
    'name': 'Clone'},
   {'dropdownId': 'sfs_ZpWZgwRj',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_NAENDxCl',
    'isMulti': False,
    'isRequired': False,
    'name': 'Species reactivity'}],
  'id': 'ts_oC3bbUz0',
  'name': 'HTO barcodes'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-05-07T14:59:04.126599+00:00',
  'type': 'dna_oligo',
  'prefix': 'INDEX',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_Lv2BpHLQ',
    'isMulti': False,
    'isRequired': False,
    'name': 'Index Name'}],
  'id': 'ts_Lap0ZOVS',
  'name': 'Index for sequencing'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2023-02-14T17:09:54.414672+00:00',
  'type': 'custom_entity',
  'prefix': 'ADTP',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_fkQwtf0q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_RGMUYghW',
    'isMulti': True,
    'isRequired': False,
    'name': 'ADT antibodies'}],
  'id': 'ts_ZGYsOghk',
  'name': 'ADT Pool'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-08-21T01:35:17.985221+00:00',
  'type': 'custom_entity',
  'prefix': 'SEQ',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_DGG83G6e',
    'isMulti': True,
    'isRequired': True,
    'name': 'Sample'},
   {'dropdownId': 'sfs_fAY4pMHw',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_zjP2Owdi',
    'isMulti': False,
    'isRequired': True,
    'name': 'Type of library'},
   {'schemaId': 'ts_PsAqwRwQ',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_axWBtqbW',
    'isMulti': False,
    'isRequired': False,
    'name': 'Index Set'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_srTfnhdT',
    'isMulti': False,
    'isRequired': False,
    'name': 'Concentration (ng/ul)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_8tfGeLnl',
    'isMulti': False,
    'isRequired': False,
    'name': 'Size (bp)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_7ng97sWw',
    'isMulti': False,
    'isRequired': False,
    'name': 'Molarity (nM)'},
   {'dropdownId': 'sfs_vTHvkHvE',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_Pm1LzAqq',
    'isMulti': False,
    'isRequired': False,
    'name': '[Sort and Seq Only] Sample Type'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_26IygshO',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study'},
   {'dropdownId': 'sfs_N0jBeprk',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_6fPFyNzY',
    'isMulti': False,
    'isRequired': False,
    'name': 'Size Selected'}],
  'id': 'ts_7g7TEkdV',
  'name': 'Sequencing Library'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-05-07T14:59:04.126599+00:00',
  'type': 'custom_entity',
  'prefix': 'IDXST',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'dropdownId': 'sfs_H3QISjyb',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_S4nn4FK9',
    'isMulti': False,
    'isRequired': False,
    'name': 'Index Type'},
   {'schemaId': 'ts_Lap0ZOVS',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_24ADopY2',
    'isMulti': False,
    'isRequired': False,
    'name': 'Index Barcode'},
   {'schemaId': 'ts_Lap0ZOVS',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_LF2JyWFm',
    'isMulti': False,
    'isRequired': False,
    'name': 'i7 Index'},
   {'schemaId': 'ts_Lap0ZOVS',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_4ZUkdjjQ',
    'isMulti': False,
    'isRequired': False,
    'name': 'i5 Index Type 1'},
   {'schemaId': 'ts_Lap0ZOVS',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_OOW0Whx1',
    'isMulti': False,
    'isRequired': False,
    'name': 'i5 Index Type 2'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_pCkSKptk',
    'isMulti': False,
    'isRequired': False,
    'name': 'Index Barcode Sequence'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_onRLeubn',
    'isMulti': False,
    'isRequired': False,
    'name': 'i7 Sequence'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_ua3DUl94',
    'isMulti': False,
    'isRequired': False,
    'name': 'i5 Type 1 Sequence'}],
  'id': 'ts_PsAqwRwQ',
  'name': 'NGS - Index Set'},
 {'constraint': None,
  'containableType': 'NONE',
  'modifiedAt': '2024-11-23T19:29:43.423869+00:00',
  'type': 'custom_entity',
  'prefix': 'AnalysisRun',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_eUCM8ulc',
    'isMulti': False,
    'isRequired': True,
    'name': 'Pipeline Name'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_UGA4h5Jz',
    'isMulti': False,
    'isRequired': False,
    'name': 'Pipeline Version'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_h48ZfzLl',
    'isMulti': False,
    'isRequired': False,
    'name': 'Assay Run ID'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_3gohWFWM',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_4qGZC7jS',
    'isMulti': False,
    'isRequired': True,
    'name': 'Seqera Workflow ID'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_BC13yPrz',
    'isMulti': False,
    'isRequired': False,
    'name': 'Run Name'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_IZCOqbUa',
    'isMulti': False,
    'isRequired': False,
    'name': 'User Name'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_DNUsv6LK',
    'isMulti': False,
    'isRequired': False,
    'name': 'Success'},
   {'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'integer',
    'archiveRecord': None,
    'id': 'tsf_uDG40xI3',
    'isMulti': False,
    'isRequired': False,
    'name': 'Exit Status'},
   {'type': 'datetime',
    'archiveRecord': None,
    'id': 'tsf_EAe71p29',
    'isMulti': False,
    'isRequired': False,
    'name': 'Complete'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_5Cs0pOVb',
    'isMulti': False,
    'isRequired': False,
    'name': 'Duration'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_BiieqHGI',
    'isMulti': False,
    'isRequired': False,
    'name': 'Error Message'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_smj2kl8p',
    'isMulti': False,
    'isRequired': False,
    'name': 'Commit ID'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_eImoljwZ',
    'isMulti': False,
    'isRequired': False,
    'name': 'Revision'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_Myanc9kw',
    'isMulti': False,
    'isRequired': False,
    'name': 'Stub Run'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_EtNHGCxi',
    'isMulti': False,
    'isRequired': False,
    'name': 'Nextflow Version'}],
  'id': 'ts_Ov5Ssrvp',
  'name': 'Analysis Run'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-08-06T20:38:49.088745+00:00',
  'type': 'custom_entity',
  'prefix': 'SEQPOOL',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_7g7TEkdV',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_XliPhqGN',
    'isMulti': True,
    'isRequired': False,
    'name': 'Sequencing libraries'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_57HPHRDK',
    'isMulti': False,
    'isRequired': False,
    'name': 'Concentration (ng/ul)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_frbHMDsO',
    'isMulti': False,
    'isRequired': False,
    'name': 'Size (bp)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_jgHo39GX',
    'isMulti': False,
    'isRequired': False,
    'name': 'Concentration (nM)'},
   {'dropdownId': 'sfs_Yi7ODqam',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_VwCjUsoI',
    'isMulti': False,
    'isRequired': False,
    'name': 'Flowcell Lanes'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_ZWXrKwZC',
    'isMulti': True,
    'isRequired': False,
    'name': 'Study'}],
  'id': 'ts_78vdlwZv',
  'name': 'Pooled Sequencing Libraries'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-22T16:49:33.889857+00:00',
  'type': 'custom_entity',
  'prefix': 'CLSAM',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_Dakn3Z8X',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_row1XyQO',
    'isMulti': False,
    'isRequired': True,
    'name': 'Parent Cell Line'},
   {'schemaId': 'ts_dxeqbvub',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_6ukjKkbw',
    'isMulti': False,
    'isRequired': False,
    'name': 'Group'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_nNC6koiz',
    'isMulti': False,
    'isRequired': False,
    'name': 'Date Generated'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_VngBcF5M',
    'isMulti': False,
    'isRequired': False,
    'name': 'Collection Date'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_bKFlcxLM',
    'isMulti': False,
    'isRequired': False,
    'name': 'Legacy Parent Cell Type (deprecated)'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_x0zgpd8B',
    'isMulti': False,
    'isRequired': False,
    'name': 'Legacy Genotype (deprecated)'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_NJExlAcX',
    'isMulti': False,
    'isRequired': False,
    'name': 'Legacy Selection (deprecated)'},
   {'dropdownId': 'sfs_km12N2Dm',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_RDzv5GET',
    'isMulti': False,
    'isRequired': False,
    'name': 'Legacy Species (deprecated)'}],
  'id': 'ts_sAwl22iX',
  'name': 'Cell Line Sample'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-18T17:18:04.083135+00:00',
  'type': 'custom_entity',
  'prefix': 'LNP_Form',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_knQGQg9N',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_TIjKtffo',
    'isMulti': False,
    'isRequired': True,
    'name': 'LNP Identity'},
   {'schemaId': 'ts_mFCULlud',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_iyC1PwBT',
    'isMulti': False,
    'isRequired': False,
    'name': 'Formulation Process'},
   {'schemaId': 'ts_lnlBaKVy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_jZsYFV5D',
    'isMulti': False,
    'isRequired': False,
    'name': 'Ionizable Lipid Lot'},
   {'schemaId': 'ts_lnlBaKVy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_PBkqWNqY',
    'isMulti': False,
    'isRequired': False,
    'name': 'Cholesterol Lot'},
   {'schemaId': 'ts_lnlBaKVy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_tlPwxjdb',
    'isMulti': False,
    'isRequired': False,
    'name': 'PEG Lot'},
   {'schemaId': 'ts_lnlBaKVy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_k9OK9At3',
    'isMulti': False,
    'isRequired': False,
    'name': 'Phospholipid Lot'},
   {'schemaId': 'ts_lnlBaKVy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_6zLSCuMB',
    'isMulti': False,
    'isRequired': False,
    'name': '5th Lipid Component Lot'},
   {'schemaId': 'ts_M3LvHMYt',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_bJx0svJa',
    'isMulti': False,
    'isRequired': False,
    'name': 'Targeting Epitope Lot'},
   {'schemaId': 'ts_Ir94d6f6',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_iVuqBIAq',
    'isMulti': False,
    'isRequired': True,
    'name': 'mRNA Lot'},
   {'schemaId': 'ts_5XM82jI0',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_xzWMONKE',
    'isMulti': False,
    'isRequired': False,
    'name': 'sgRNA Lot'},
   {'schemaId': 'ts_1uiYEYn2',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_K3z0L5HJ',
    'isMulti': False,
    'isRequired': False,
    'name': 'Barcode'},
   {'schemaId': 'ts_SxJbODKl',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_drC8vlal',
    'isMulti': False,
    'isRequired': False,
    'name': 'Study'},
   {'type': 'long_text',
    'archiveRecord': None,
    'id': 'tsf_eoShmc6B',
    'isMulti': False,
    'isRequired': False,
    'name': 'Notes'}],
  'id': 'ts_SKDXt9OA',
  'name': 'LNP Formulation'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-09-05T13:57:06.354217+00:00',
  'type': 'molecule',
  'prefix': 'CMPD_LOT',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_sv3U7SiL',
    'isMulti': False,
    'isRequired': True,
    'name': 'Compound'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_vs83rqP8',
    'isMulti': False,
    'isRequired': False,
    'name': 'Vendor'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_jMZLmCcX',
    'isMulti': False,
    'isRequired': True,
    'name': 'Formula Mass'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_FEWw3Hqp',
    'isMulti': False,
    'isRequired': False,
    'name': 'Salt'},
   {'type': 'blob_link',
    'archiveRecord': None,
    'id': 'tsf_wKn73jaP',
    'isMulti': True,
    'isRequired': False,
    'name': 'Initial NMR'},
   {'type': 'blob_link',
    'archiveRecord': None,
    'id': 'tsf_S2iZyxOS',
    'isMulti': True,
    'isRequired': False,
    'name': 'Initial LCMS'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_55c9CxmY',
    'isMulti': False,
    'isRequired': False,
    'name': 'Purity (%)'},
   {'decimalPrecision': None,
    'legalTextDropdownId': None,
    'numericMax': None,
    'numericMin': None,
    'unit': None,
    'type': 'float',
    'archiveRecord': None,
    'id': 'tsf_LNDwM0eC',
    'isMulti': False,
    'isRequired': False,
    'name': 'Total Synthesis Amount (mg)'},
   {'type': 'entry_link',
    'archiveRecord': None,
    'id': 'tsf_8zMDyhhW',
    'isMulti': True,
    'isRequired': False,
    'name': 'Reaction Path'},
   {'type': 'blob_link',
    'archiveRecord': None,
    'id': 'tsf_THKeZLET',
    'isMulti': True,
    'isRequired': False,
    'name': 'additional attachments'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_izuD017N',
    'isMulti': False,
    'isRequired': False,
    'name': 'Vendor and SKU / Catalog #'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_BjdWiRlZ',
    'isMulti': False,
    'isRequired': False,
    'name': 'Vendor Lot'}],
  'id': 'ts_lnlBaKVy',
  'name': 'Compound Lot'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-31T17:49:25.018763+00:00',
  'type': 'custom_entity',
  'prefix': 'sgRNA_LOT',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_czIy2Vjy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_CM4PhWAd',
    'isMulti': False,
    'isRequired': False,
    'name': 'sgRNA'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_camaLxw9',
    'isMulti': False,
    'isRequired': True,
    'name': 'Vendor'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_9acIcMDt',
    'isMulti': False,
    'isRequired': True,
    'name': 'SKU / Catalog #'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_GUoXUJTK',
    'isMulti': False,
    'isRequired': False,
    'name': 'Lot #'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_bv4IzYEl',
    'isMulti': False,
    'isRequired': False,
    'name': 'Notes'}],
  'id': 'ts_5XM82jI0',
  'name': 'sgRNA Lot'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-09-28T13:21:22.212852+00:00',
  'type': 'custom_entity',
  'prefix': 'MRNA_LOT',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_8A0aURYn',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_P9KSgato',
    'isMulti': False,
    'isRequired': False,
    'name': 'Plasmid Lot'},
   {'schemaId': 'ts_gou22D2s',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_wiDft2x1',
    'isMulti': False,
    'isRequired': False,
    'name': 'Plasmid'},
   {'type': 'date',
    'archiveRecord': None,
    'id': 'tsf_qlK3274M',
    'isMulti': False,
    'isRequired': False,
    'name': 'Manufacture Date'},
   {'schemaId': 'ts_DPw9EeOA',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_alqi8J2F',
    'isMulti': False,
    'isRequired': True,
    'name': 'mRNA'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_RGtPj5fl',
    'isMulti': False,
    'isRequired': False,
    'name': 'Vendor'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_39dxMhXq',
    'isMulti': False,
    'isRequired': False,
    'name': 'Vendor Lot'}],
  'id': 'ts_Ir94d6f6',
  'name': 'mRNA lot'},
 {'constraint': None,
  'containableType': 'NONE',
  'modifiedAt': '2024-12-20T17:17:50.879949+00:00',
  'type': 'custom_entity',
  'prefix': 'CL',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_evASvWYk',
    'isMulti': False,
    'isRequired': False,
    'name': 'Description'},
   {'schemaId': 'ts_Dakn3Z8X',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_7Hnz9oYk',
    'isMulti': False,
    'isRequired': False,
    'name': 'Parent Cell Line'},
   {'dropdownId': 'sfs_km12N2Dm',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_CfeR0nE9',
    'isMulti': False,
    'isRequired': False,
    'name': 'Species'},
   {'dropdownId': 'sfs_Gb5O6dZg',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_8m7w7mG7',
    'isMulti': False,
    'isRequired': False,
    'name': 'Tissue type'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_DnEG7E5l',
    'isMulti': False,
    'isRequired': False,
    'name': 'Donor ID'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_I1Ixbb2z',
    'isMulti': False,
    'isRequired': False,
    'name': 'Vendor'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_BKyVbVK9',
    'isMulti': False,
    'isRequired': False,
    'name': 'SKU'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_0gPFuIhv',
    'isMulti': False,
    'isRequired': False,
    'name': 'Lot Number'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_FW29m82c',
    'isMulti': False,
    'isRequired': False,
    'name': 'Gender'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_QIT9UxZt',
    'isMulti': False,
    'isRequired': False,
    'name': 'Age'},
   {'type': 'text',
    'archiveRecord': None,
    'id': 'tsf_rFmL5jpZ',
    'isMulti': False,
    'isRequired': False,
    'name': 'Selection'}],
  'id': 'ts_Dakn3Z8X',
  'name': 'Parent Cell Line'},
 {'constraint': None,
  'containableType': 'NONE',
  'modifiedAt': '2024-12-09T18:40:36.854993+00:00',
  'type': 'custom_entity',
  'prefix': 'T',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_fBarfSIv',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_plSazIIq',
    'isMulti': False,
    'isRequired': False,
    'name': 'Antibody'},
   {'schemaId': 'ts_5tdksa9q',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_qJd35eEI',
    'isMulti': False,
    'isRequired': False,
    'name': 'Compound'},
   {'schemaId': 'ts_L2DJaJx9',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_s8bwqMOf',
    'isMulti': False,
    'isRequired': False,
    'name': 'Protein'},
   {'dropdownId': 'sfs_Gb5O6dZg',
    'type': 'dropdown',
    'archiveRecord': None,
    'id': 'tsf_HlrZzGuS',
    'isMulti': True,
    'isRequired': True,
    'name': 'Targeted Tissue Type'},
   {'schemaId': 'ts_jEsGNyak',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_KoKpsvZy',
    'isMulti': False,
    'isRequired': True,
    'name': 'Conjugation Functional Group'},
   {'schemaId': 'ts_u6w73rdb',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_3aj5p77n',
    'isMulti': False,
    'isRequired': True,
    'name': 'Conjugation Process'}],
  'id': 'ts_drSMKjvw',
  'name': 'Targeting Epitope Identity'},
 {'constraint': None,
  'containableType': 'ENTITY',
  'modifiedAt': '2024-10-14T11:41:59.357729+00:00',
  'type': 'custom_entity',
  'prefix': 'TE_LOT',
  'registryId': 'src_8XcPMnUA',
  'archiveRecord': None,
  'fieldDefinitions': [{'schemaId': 'ts_drSMKjvw',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_ixnFHOJg',
    'isMulti': False,
    'isRequired': False,
    'name': 'Targeting Epitope Identity'},
   {'schemaId': 'ts_MnrO7Dkt',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_iqkZJbOq',
    'isMulti': False,
    'isRequired': False,
    'name': 'Antibody Lot'},
   {'schemaId': 'ts_lnlBaKVy',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_7sdMftAw',
    'isMulti': False,
    'isRequired': False,
    'name': 'Compound Lot'},
   {'schemaId': 'ts_BKGW6eAL',
    'type': 'entity_link',
    'archiveRecord': None,
    'id': 'tsf_t5vtpQQe',
    'isMulti': False,
    'isRequired': False,
    'name': 'Protein Lot'}],
  'id': 'ts_M3LvHMYt',
  'name': 'Targeting Epitope Lot'}]
from sentseqdb.benchling import create_models_py

models_py_content = create_models_py(benchling)
! Table Tissue: Manually create a ForeignKey 'animal' field related to 'Animal'
! Table SequencingLibrary: Manually create a ManyToManyField 'sample' field related to 'TissuePool'
# Print or save the generated models.py content
print(models_py_content)
# auto-generated models.py file
import bionty.models as bt_models
from django.db import models
from lamindb.models import Artifact, CanCurate, FeatureSet, Record, TracksUpdates
from lamindb.base.fields import DateField, FloatField, IntegerField, TextField, CharField, ForeignKey, OneToOneField

    
class Barcode(Record, CanCurate, TracksUpdates):
    """Barcode.

    - schema_id: ts_1uiYEYn2
    - schema_type: dna_oligo
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_1uiYEYn2"
    _benchling_schema_name = "Barcode"
    _benchling_schema_type = "dna_oligo"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    description = TextField(null=True)
    """A text field."""


class LNPIdentity(Record, CanCurate, TracksUpdates):
    """LNP Identity.

    - schema_id: ts_knQGQg9N
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_knQGQg9N"
    _benchling_schema_name = "LNP Identity"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    lnp_number = IntegerField(null=True)
    """A integer field."""
    chemical_class = CharField(null=True)
    """A char field."""
    screen_number = IntegerField(null=True)
    """A integer field."""
    iteration_number = IntegerField(null=True)
    """A integer field."""
    ionizable_lipid_id = ForeignKey("Compound", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    cholesterol_id = ForeignKey("Compound", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    peg_lipid_id = ForeignKey("Compound", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    phospholipid_id = ForeignKey("Compound", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    n5th_lipid_component_id = ForeignKey("Compound", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    targeting_epitope_identity = ForeignKey("TargetingEpitopeIdentity", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.TargetingEpitopeIdentity`."""
    ionizable_lipid_mole_ = FloatField(null=True)
    """A float field."""
    cholesterol_mole_ = FloatField(null=True)
    """A float field."""
    peg_lipid_mole_ = FloatField(null=True)
    """A float field."""
    phospholipid_mole_ = FloatField(null=True)
    """A float field."""
    n5th_lipid_component_mole_ = FloatField(null=True)
    """A float field."""
    lipid_rna_mass_ratio = FloatField(null=True)
    """A float field."""


class LNPLibrary(Record, CanCurate, TracksUpdates):
    """LNP Library.

    - schema_id: ts_2NxifJ5J
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_2NxifJ5J"
    _benchling_schema_name = "LNP Library"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    lnps = models.ManyToManyField("LNPFormulation")
    """Many-to-many relationship to :class:`sentseqdb.LNPFormulation`."""
    study = ForeignKey("Study", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    date_yymmdd = CharField(null=True)
    """A char field."""
    naked_barcodes = models.ManyToManyField("Barcode")
    """Many-to-many relationship to :class:`sentseqdb.Barcode`."""
    description = TextField(null=True)
    """A text field."""
    legacy_lnps = models.ManyToManyField("LNPIdentity")
    """Many-to-many relationship to :class:`sentseqdb.LNPIdentity`."""


class Study(Record, CanCurate, TracksUpdates):
    """Study.

    - schema_id: ts_SxJbODKl
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_SxJbODKl"
    _benchling_schema_name = "Study"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    date_yymmdd = CharField()
    """A char field."""
    description = TextField(null=True)
    """A text field."""
    total_animals = IntegerField(null=True)
    """A integer field."""
    study_type = CharField(null=True)
    """A char field."""
    study_site = CharField(null=True)
    """A char field."""
    sharepoint_directory = TextField(null=True)
    """A text field."""
    artifacts = models.ManyToManyField(Artifact, related_name="studies")
    """Many-to-many relationship to Artifacts."""


class Group(Record, CanCurate, TracksUpdates):
    """Group.

    - schema_id: ts_dxeqbvub
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_dxeqbvub"
    _benchling_schema_name = "Group"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    study = ForeignKey("Study", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    group_number = IntegerField(null=True)
    """A integer field."""
    treatment_lnp = ForeignKey("LNPFormulation", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.LNPFormulation`."""
    treatment_library = ForeignKey("LNPLibrary", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.LNPLibrary`."""
    quantity_n = IntegerField(null=True)
    """A integer field."""
    dose_mgkg = FloatField()
    """A float field."""
    description = TextField(null=True)
    """A text field."""


class Mouse(Record, CanCurate, TracksUpdates):
    """Mouse.

    - schema_id: ts_AAtzcSml
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_AAtzcSml"
    _benchling_schema_name = "Mouse"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    group = ForeignKey("Group", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Group`."""
    animal_replicate_number = IntegerField(null=True)
    """A integer field."""
    study = models.ManyToManyField("Study")
    """Many-to-many relationship to :class:`sentseqdb.Study`."""
    termination_date = DateField(null=True)
    """A date field."""
    strain = CharField(null=True)
    """A char field."""
    sex = CharField(null=True)
    """A char field."""
    dob = DateField(null=True)
    """A date field."""
    study_site = CharField(null=True)
    """A char field."""
    ear_tag = CharField(null=True)
    """A char field."""
    notes = TextField(null=True)
    """A text field."""
    timepoint_h = FloatField(null=True)
    """A float field."""
    timepoint_days = FloatField(null=True)
    """A float field."""


class Tissue(Record, CanCurate, TracksUpdates):
    """Tissue.

    - schema_id: ts_gAH1FB2U
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_gAH1FB2U"
    _benchling_schema_name = "Tissue"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    bionty = OneToOneField(bt_models.Tissue, on_delete=models.PROTECT, null=True, related_name="sentseqdb_tissue")
    """OneToOne relationship to :class:`bionty.Tissue`."""
    animal = ForeignKey("Animal", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Animal`."""
    tissue_type = CharField(null=True)
    """A char field."""
    tissue_replicate_number = IntegerField(null=True)
    """A integer field."""
    collection_date = DateField(null=True)
    """A date field."""
    comment = TextField(null=True)
    """A text field."""


class mRNA(Record, CanCurate, TracksUpdates):
    """mRNA.

    - schema_id: ts_DPw9EeOA
    - schema_type: rna_sequence
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_DPw9EeOA"
    _benchling_schema_name = "mRNA"
    _benchling_schema_type = "rna_sequence"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    description = TextField(null=True)
    """A text field."""
    cleancap = CharField(null=True)
    """A char field."""
    notes = CharField(null=True)
    """A char field."""


class Compound(Record, CanCurate, TracksUpdates):
    """Compound.

    - schema_id: ts_5tdksa9q
    - schema_type: molecule
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_5tdksa9q"
    _benchling_schema_name = "Compound"
    _benchling_schema_type = "molecule"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    type = CharField(null=True)
    """A char field."""
    number_of_ionizable_amines = IntegerField(null=True)
    """A integer field."""
    structure = TextField(null=True)
    """A text field."""
    has_this_lipid_been_previously_screened = CharField(null=True)
    """A char field."""
    design_series = CharField(null=True)
    """A char field."""
    design_set = CharField(null=True)
    """A char field."""


class TaggedSingleCellSeqSample(Record, CanCurate, TracksUpdates):
    """Tagged Single Cell Seq Sample.

    - schema_id: ts_eVzQXeki
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_eVzQXeki"
    _benchling_schema_name = "Tagged Single Cell Seq Sample"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    tissue = models.ManyToManyField("Tissue")
    """Many-to-many relationship to :class:`sentseqdb.Tissue`."""
    hto_used = ForeignKey("HTObarcodes", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.HTObarcodes`."""
    cell_count_from_rhapsody = FloatField(null=True)
    """A float field."""
    viability = FloatField(null=True)
    """A float field."""
    actual_cell_count = FloatField(null=True)
    """A float field."""
    amount_to_pool = FloatField(null=True)
    """A float field."""
    study = ForeignKey("Study", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    group = models.ManyToManyField("Group")
    """Many-to-many relationship to :class:`sentseqdb.Group`."""


class TissuePool(Record, CanCurate, TracksUpdates):
    """Tissue Pool.

    - schema_id: ts_W3z7lr0x
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_W3z7lr0x"
    _benchling_schema_name = "Tissue Pool"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    tagged_single_cell_tissues = models.ManyToManyField("TaggedSingleCellSeqSample")
    """Many-to-many relationship to :class:`sentseqdb.TaggedSingleCellSeqSample`."""
    date = DateField(null=True)
    """A date field."""
    individual_adts_used = models.ManyToManyField("ADTBarcodes")
    """Many-to-many relationship to :class:`sentseqdb.ADTBarcodes`."""
    adt_pools_used = models.ManyToManyField("ADTPool")
    """Many-to-many relationship to :class:`sentseqdb.ADTPool`."""
    ratio_to_pool = FloatField(null=True)
    """A float field."""
    cell_count_from_rhapsody = FloatField(null=True)
    """A float field."""
    viability = FloatField(null=True)
    """A float field."""
    actual_cell_count = FloatField(null=True)
    """A float field."""
    amount_to_pool = FloatField(null=True)
    """A float field."""


class Primate(Record, CanCurate, TracksUpdates):
    """Primate.

    - schema_id: ts_dIZFTVxd
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_dIZFTVxd"
    _benchling_schema_name = "Primate"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    group = ForeignKey("Group", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Group`."""
    study = ForeignKey("Study", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    experimental_number = CharField(null=True)
    """A char field."""
    labcorp_number = CharField(null=True)
    """A char field."""
    termination_date = DateField(null=True)
    """A date field."""
    strain = CharField(null=True)
    """A char field."""
    species = CharField(null=True)
    """A char field."""
    sex = CharField(null=True)
    """A char field."""
    dob = DateField(null=True)
    """A date field."""


class ADTBarcodes(Record, CanCurate, TracksUpdates):
    """ADT Barcodes.

    - schema_id: ts_fkQwtf0q
    - schema_type: dna_oligo
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_fkQwtf0q"
    _benchling_schema_name = "ADT Barcodes"
    _benchling_schema_type = "dna_oligo"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    concentration = FloatField(null=True)
    """A float field."""
    clone = CharField(null=True)
    """A char field."""
    species_reactivity = CharField(null=True)
    """A char field."""
    payload_sentseq_align = CharField(null=True)
    """A char field."""
    artifacts = models.ManyToManyField(Artifact, related_name="adtbarcodes")
    """Many-to-many relationship to Artifacts."""
    feature_sets = models.ManyToManyField(FeatureSet, related_name="adtbarcodes")
    """Many-to-many relationship to FeatureSets."""


class HTObarcodes(Record, CanCurate, TracksUpdates):
    """HTO barcodes.

    - schema_id: ts_oC3bbUz0
    - schema_type: dna_oligo
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_oC3bbUz0"
    _benchling_schema_name = "HTO barcodes"
    _benchling_schema_type = "dna_oligo"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    antibody = CharField(null=True)
    """A char field."""
    concentration = FloatField(null=True)
    """A float field."""
    clone = CharField(null=True)
    """A char field."""
    species_reactivity = CharField(null=True)
    """A char field."""
    artifacts = models.ManyToManyField(Artifact, related_name="htobarcodes")
    """Many-to-many relationship to Artifacts."""
    feature_sets = models.ManyToManyField(FeatureSet, related_name="htobarcodes")
    """Many-to-many relationship to FeatureSets."""


class Indexforsequencing(Record, CanCurate, TracksUpdates):
    """Index for sequencing.

    - schema_id: ts_Lap0ZOVS
    - schema_type: dna_oligo
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_Lap0ZOVS"
    _benchling_schema_name = "Index for sequencing"
    _benchling_schema_type = "dna_oligo"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    index_name = CharField(null=True)
    """A char field."""


class ADTPool(Record, CanCurate, TracksUpdates):
    """ADT Pool.

    - schema_id: ts_ZGYsOghk
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_ZGYsOghk"
    _benchling_schema_name = "ADT Pool"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    adt_antibodies = models.ManyToManyField("ADTBarcodes")
    """Many-to-many relationship to :class:`sentseqdb.ADTBarcodes`."""


class SequencingLibrary(Record, CanCurate, TracksUpdates):
    """Sequencing Library.

    - schema_id: ts_7g7TEkdV
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_7g7TEkdV"
    _benchling_schema_name = "Sequencing Library"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    sample = models.ManyToManyField("TissuePool")
    """Many-to-many relationship to :class:`sentseqdb.TissuePool`."""
    type_of_library = CharField()
    """A char field."""
    index_set = ForeignKey("NGS_IndexSet", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.NGS_IndexSet`."""
    concentration_ngul = FloatField(null=True)
    """A float field."""
    size_bp = FloatField(null=True)
    """A float field."""
    molarity_nm = FloatField(null=True)
    """A float field."""
    sort_and_seq_only_sample_type = CharField(null=True)
    """A char field."""
    study = ForeignKey("Study", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    size_selected = CharField(null=True)
    """A char field."""


class NGS_IndexSet(Record, CanCurate, TracksUpdates):
    """NGS - Index Set.

    - schema_id: ts_PsAqwRwQ
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_PsAqwRwQ"
    _benchling_schema_name = "NGS - Index Set"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    index_type = CharField(null=True)
    """A char field."""
    index_barcode = ForeignKey("Indexforsequencing", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Indexforsequencing`."""
    i7_index = ForeignKey("Indexforsequencing", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Indexforsequencing`."""
    i5_index_type_1 = ForeignKey("Indexforsequencing", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Indexforsequencing`."""
    i5_index_type_2 = ForeignKey("Indexforsequencing", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Indexforsequencing`."""
    index_barcode_sequence = CharField(null=True)
    """A char field."""
    i7_sequence = CharField(null=True)
    """A char field."""
    i5_type_1_sequence = CharField(null=True)
    """A char field."""


class AnalysisRun(Record, CanCurate, TracksUpdates):
    """Analysis Run.

    - schema_id: ts_Ov5Ssrvp
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_Ov5Ssrvp"
    _benchling_schema_name = "Analysis Run"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    pipeline_name = CharField()
    """A char field."""
    pipeline_version = CharField(null=True)
    """A char field."""
    assay_run_id = CharField(null=True)
    """A char field."""
    study = ForeignKey("Study", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    seqera_workflow_id = CharField()
    """A char field."""
    run_name = CharField(null=True)
    """A char field."""
    user_name = CharField(null=True)
    """A char field."""
    success = CharField(null=True)
    """A char field."""
    exit_status = IntegerField(null=True)
    """A integer field."""
    complete = CharField(null=True)
    """A char field."""
    duration = CharField(null=True)
    """A char field."""
    error_message = CharField(null=True)
    """A char field."""
    commit_id = CharField(null=True)
    """A char field."""
    revision = CharField(null=True)
    """A char field."""
    stub_run = CharField(null=True)
    """A char field."""
    nextflow_version = CharField(null=True)
    """A char field."""


class PooledSequencingLibraries(Record, CanCurate, TracksUpdates):
    """Pooled Sequencing Libraries.

    - schema_id: ts_78vdlwZv
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_78vdlwZv"
    _benchling_schema_name = "Pooled Sequencing Libraries"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    sequencing_libraries = models.ManyToManyField("SequencingLibrary")
    """Many-to-many relationship to :class:`sentseqdb.SequencingLibrary`."""
    concentration_ngul = FloatField(null=True)
    """A float field."""
    size_bp = FloatField(null=True)
    """A float field."""
    concentration_nm = FloatField(null=True)
    """A float field."""
    flowcell_lanes = CharField(null=True)
    """A char field."""
    study = models.ManyToManyField("Study")
    """Many-to-many relationship to :class:`sentseqdb.Study`."""


class CellLineSample(Record, CanCurate, TracksUpdates):
    """Cell Line Sample.

    - schema_id: ts_sAwl22iX
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_sAwl22iX"
    _benchling_schema_name = "Cell Line Sample"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    parent_cell_line = ForeignKey("ParentCellLine", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.ParentCellLine`."""
    group = ForeignKey("Group", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Group`."""
    date_generated = DateField(null=True)
    """A date field."""
    collection_date = DateField(null=True)
    """A date field."""
    legacy_parent_cell_type_deprecated = CharField(null=True)
    """A char field."""
    legacy_genotype_deprecated = CharField(null=True)
    """A char field."""
    legacy_selection_deprecated = CharField(null=True)
    """A char field."""
    legacy_species_deprecated = CharField(null=True)
    """A char field."""


class LNPFormulation(Record, CanCurate, TracksUpdates):
    """LNP Formulation.

    - schema_id: ts_SKDXt9OA
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_SKDXt9OA"
    _benchling_schema_name = "LNP Formulation"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    lnp_identity = ForeignKey("LNPIdentity", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.LNPIdentity`."""
    ionizable_lipid_lot = ForeignKey("CompoundLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.CompoundLot`."""
    cholesterol_lot = ForeignKey("CompoundLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.CompoundLot`."""
    peg_lot = ForeignKey("CompoundLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.CompoundLot`."""
    phospholipid_lot = ForeignKey("CompoundLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.CompoundLot`."""
    n5th_lipid_component_lot = ForeignKey("CompoundLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.CompoundLot`."""
    targeting_epitope_lot = ForeignKey("TargetingEpitopeLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.TargetingEpitopeLot`."""
    mrna_lot = ForeignKey("mRNAlot", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.mRNAlot`."""
    sgrna_lot = ForeignKey("sgRNALot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.sgRNALot`."""
    barcode = ForeignKey("Barcode", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Barcode`."""
    study = ForeignKey("Study", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Study`."""
    notes = TextField(null=True)
    """A text field."""
    artifacts = models.ManyToManyField(Artifact, related_name="lnpformulations")
    """Many-to-many relationship to Artifacts."""
    feature_sets = models.ManyToManyField(FeatureSet, related_name="lnpformulations")
    """Many-to-many relationship to FeatureSets."""


class CompoundLot(Record, CanCurate, TracksUpdates):
    """Compound Lot.

    - schema_id: ts_lnlBaKVy
    - schema_type: molecule
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_lnlBaKVy"
    _benchling_schema_name = "Compound Lot"
    _benchling_schema_type = "molecule"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    compound = ForeignKey("Compound", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    vendor = CharField(null=True)
    """A char field."""
    formula_mass = FloatField()
    """A float field."""
    salt = CharField(null=True)
    """A char field."""
    initial_nmr = TextField(null=True)
    """A text field."""
    initial_lcms = TextField(null=True)
    """A text field."""
    purity_ = FloatField(null=True)
    """A float field."""
    total_synthesis_amount_mg = FloatField(null=True)
    """A float field."""
    reaction_path = TextField(null=True)
    """A text field."""
    additional_attachments = TextField(null=True)
    """A text field."""
    vendor_and_sku_catalog_ = CharField(null=True)
    """A char field."""
    vendor_lot = CharField(null=True)
    """A char field."""


class sgRNALot(Record, CanCurate, TracksUpdates):
    """sgRNA Lot.

    - schema_id: ts_5XM82jI0
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_5XM82jI0"
    _benchling_schema_name = "sgRNA Lot"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    vendor = CharField()
    """A char field."""
    sku_catalog_ = CharField()
    """A char field."""
    lot_ = CharField(null=True)
    """A char field."""
    notes = CharField(null=True)
    """A char field."""


class mRNAlot(Record, CanCurate, TracksUpdates):
    """mRNA lot.

    - schema_id: ts_Ir94d6f6
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_Ir94d6f6"
    _benchling_schema_name = "mRNA lot"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    manufacture_date = DateField(null=True)
    """A date field."""
    mrna = ForeignKey("mRNA", on_delete=models.PROTECT)
    """ForeignKey relationship to :class:`sentseqdb.mRNA`."""
    vendor = CharField(null=True)
    """A char field."""
    vendor_lot = CharField(null=True)
    """A char field."""


class ParentCellLine(Record, CanCurate, TracksUpdates):
    """Parent Cell Line.

    - schema_id: ts_Dakn3Z8X
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_Dakn3Z8X"
    _benchling_schema_name = "Parent Cell Line"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    description = CharField(null=True)
    """A char field."""
    parent_cell_line = ForeignKey("ParentCellLine", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.ParentCellLine`."""
    species = CharField(null=True)
    """A char field."""
    tissue_type = CharField(null=True)
    """A char field."""
    donor_id = CharField(null=True)
    """A char field."""
    vendor = CharField(null=True)
    """A char field."""
    sku = CharField(null=True)
    """A char field."""
    lot_number = CharField(null=True)
    """A char field."""
    gender = CharField(null=True)
    """A char field."""
    age = CharField(null=True)
    """A char field."""
    selection = CharField(null=True)
    """A char field."""


class TargetingEpitopeIdentity(Record, CanCurate, TracksUpdates):
    """Targeting Epitope Identity.

    - schema_id: ts_drSMKjvw
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_drSMKjvw"
    _benchling_schema_name = "Targeting Epitope Identity"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    compound = ForeignKey("Compound", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Compound`."""
    targeted_tissue_type = TextField()
    """A text field."""


class TargetingEpitopeLot(Record, CanCurate, TracksUpdates):
    """Targeting Epitope Lot.

    - schema_id: ts_M3LvHMYt
    - schema_type: custom_entity
    """

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    _benchling_schema_id = "ts_M3LvHMYt"
    _benchling_schema_name = "Targeting Epitope Lot"
    _benchling_schema_type = "custom_entity"

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field."""
    targeting_epitope_identity = ForeignKey("TargetingEpitopeIdentity", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.TargetingEpitopeIdentity`."""
    compound_lot = ForeignKey("CompoundLot", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.CompoundLot`."""


class Animal(Record, CanCurate, TracksUpdates):
    """Primate or Mouse, not part of Benchling schema."""

    class Meta(Record.Meta, TracksUpdates.Meta):
        abstract = False

    id = models.AutoField(primary_key=True)
    """Internal id, valid only in one DB instance."""
    uid = CharField(unique=True)
    """A universal ID of the record, same as Benchling ID of Primate or Mouse record."""
    name = CharField()
    """Name of the record, same as Benchling "Name" field, required."""
    primate = ForeignKey("Primate", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Primate`."""
    mouse = ForeignKey("Mouse", on_delete=models.PROTECT, null=True)
    """ForeignKey relationship to :class:`sentseqdb.Mouse`."""
with open("../../sentseqdb/models.py", "w") as f:
    f.write(models_py_content)
# create the first migration
# !lamin init --storage ./test-sentseqdb --schema sentseqdb,bionty
# !lamin migrate create
# !lamin migrate deploy