コード例 #1
0
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,
    )
コード例 #2
0
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,
    )