def make_table(tdef): provide_system = not (os.getenv('SKIP_SYSTEM_COLUMNS', 'false').lower() == 'true') tname = tdef["name"] if provide_system: system_columns = Table.system_column_defs() system_keys = Table.system_key_defs() # customize the system column templates... for col in system_columns: cname = col['name'] col['comment'] = { 'RID': 'Immutable record identifier (system-generated).', 'RCT': 'Record creation time (system-generated).', 'RMT': 'Record last-modification time (system-generated).', 'RCB': 'Record created by (system-generated).', 'RMB': 'Record last-modified by (system-generated).', }[cname] display_names = { 'RCT': 'Creation Time', 'RMT': 'Modification Time', 'RCB': 'Created By', 'RMB': 'Modified By', } if cname != 'RID': col['annotations'] = { tag.display: { "name": display_names[cname] } } system_fkeys = [ ForeignKey.define( [cname], 'public', 'ERMrest_Client', ['ID'], constraint_names=[['CFDE', '%s_%s_fkey' % (tname, cname)]]) for cname in ['RCB', 'RMB'] ] else: system_columns = [] system_keys = [] system_fkeys = [] tcomment = tdef.get("description") tdef_resource = tdef tdef = tdef_resource.pop("schema") keys = [] keysets = set() pk = tdef.pop("primaryKey", None) if isinstance(pk, str): pk = [pk] if isinstance(pk, list): keys.append(make_key(tname, pk)) keysets.add(frozenset(pk)) tdef_fields = tdef.pop("fields", None) for cdef in tdef_fields: if cdef.get("constraints", {}).pop("unique", False): kcols = [cdef["name"]] if frozenset(kcols) not in keysets: keys.append(make_key(tname, kcols)) keysets.add(frozenset(kcols)) tdef_fkeys = tdef.pop("foreignKeys", []) title = tdef_resource.get("title", None) annotations = { resource_tag: tdef_resource, schema_tag: tdef, } if title is not None: annotations[tag.display] = {"name": title} return Table.define( tname, column_defs=system_columns + [make_column(cdef) for cdef in tdef_fields], key_defs=system_keys + keys, fkey_defs=system_fkeys + [make_fkey(tname, fkdef) for fkdef in tdef_fkeys], comment=tcomment, provide_system=False, annotations=annotations, )
def make_table(tdef, configurator, trusted=False, history_capture=False): provide_system = not (os.getenv('SKIP_SYSTEM_COLUMNS', 'false').lower() == 'true') tname = tdef["name"] if provide_system: system_columns = Table.system_column_defs() # bypass bug in deriva-py producing invalid default constraint name for system key #system_keys = Table.system_key_defs() system_keys = [make_key(tname, ['RID'])] # customize the system column templates... for col in system_columns: cname = col['name'] col['comment'] = { 'RID': 'Immutable record identifier (system-generated).', 'RCT': 'Record creation time (system-generated).', 'RMT': 'Record last-modification time (system-generated).', 'RCB': 'Record created by (system-generated).', 'RMB': 'Record last-modified by (system-generated).', }[cname] display_names = { 'RCT': 'Creation Time', 'RMT': 'Modification Time', 'RCB': 'Created By', 'RMB': 'Modified By', } if cname != 'RID': col['annotations'] = { tag.display: { "name": display_names[cname] } } system_fkeys = [ ForeignKey.define( [cname], 'public', 'ERMrest_Client', ['ID'], constraint_names=[[schema_name, make_id(tname, cname, 'fkey')]]) for cname in ['RCB', 'RMB'] ] else: system_columns = [] system_keys = [] system_fkeys = [] tcomment = tdef.get("description") tdef_resource = tdef tdef = tdef_resource.pop("schema") keys = [] keysets = set() pk = tdef.pop("primaryKey", None) if isinstance(pk, str): pk = [pk] if isinstance(pk, list): keys.append(make_key(tname, pk)) keysets.add(frozenset(pk)) tdef_fields = tdef.pop("fields", None) for cdef in tdef_fields: if cdef.get("constraints", {}).pop("unique", False): kcols = [cdef["name"]] if frozenset(kcols) not in keysets: keys.append(make_key(tname, kcols)) keysets.add(frozenset(kcols)) tdef_fkeys = tdef.pop("foreignKeys", []) title = tdef_resource.get("title", None) annotations = { resource_tag: tdef_resource, schema_tag: tdef, } if title is not None: annotations[tag.display] = {"name": title} pre_annotations = tdef_resource.get("deriva", {}) for k, t in tag.items(): if k == 'history_capture': annotations[t] = pre_annotations.pop( 'history_capture', history_capture) if trusted else history_capture elif k in pre_annotations and trusted: annotations[t] = pre_annotations.pop(k) acls = acls_union( configurator.schema_table_acls.get((schema_name, tname), {}), pre_annotations.pop('acls', {})) acl_bindings = aclbindings_merge( configurator.schema_table_aclbindings.get((schema_name, tname), {}), pre_annotations.pop('acl_bindings', {})) return Table.define( tname, column_defs=system_columns + [make_column(tname, cdef, configurator) for cdef in tdef_fields], key_defs=system_keys + keys, fkey_defs=system_fkeys + [make_fkey(tname, fkdef) for fkdef in tdef_fkeys], comment=tcomment, provide_system=False, annotations=annotations, acls=acls, acl_bindings=acl_bindings, )