Пример #1
0
 def __init__(self, *args, **kwargs):
     self.fields = [
         Column("id", primitives.StringField),
         # xml:id (or equivalent in JSON).
         Column("extension", CompositeArray(ElementExtension()))
         # Additional Content defined by implementations.
     ]
Пример #2
0
    def include_object(object, name, type_, reflected, compare_to):
        if (
            type_ == "column"
            and not reflected
            and object.info.get("skip_autogenerate", False)
        ):
            return False

        else:
            if compare_to is None:
                # copy object to compare_to when the value of compare_to is
                # None. Without this there is no way to assign a column
                # type when generating the migrations
                compare_to = object

            if type_ == "column" and isinstance(compare_to.type, NullType):
                type_name = "fhir_"

                module = Fields
                if isinstance(object.type, PgComposite):
                    type_name = object.type.name[5:]
                    compare_to.type = module.get(type_name)()

                elif isinstance(object.type, CompositeArray):
                    type_name = object.type.item_type.name[5:]
                    compare_to.type = CompositeArray(module.get(type_name)())

                else:
                    return False

            return True
Пример #3
0
    def generate_element_definition(self):
        properties = self.element_properties()

        if len(properties) > 0:
            for prop in properties:
                name = prop.name
                nullable = True if (prop.cardinality["mini"] == 0) else False

                field_type = (CompositeArray(prop.type) if
                              (prop.cardinality["maxi"] == -1) else prop.type)

                new_column = Column(name, field_type, nullable=nullable)

                field_names = [col.name for col in self.fields]
                if name not in field_names:
                    self.fields.append(new_column)

        data_type = "fhir_%s" % self.__class__.__name__.lower()
        return PgComposite(data_type, self.fields)
Пример #4
0
    def apply_constraints(self):
        for resource in all_resources:
            self.resource_instance[resource.__tablename__.lower()] = resource

        if self.resource_name in self.resource_instance:
            res = self.resource_instance.get(self.resource_name)

            for field in self.fields:
                name = field.get("name")
                cardinality = field.get("cardinality")

                # get the column from schema definition
                col = res.__table__.columns.get(name)
                if col is not None:
                    default_type = col.type

                    if cardinality["mini"] == "1" and col.nullable:
                        col.nullable = False

                    if cardinality["maxi"] == "*" and not (isinstance(
                            col.type, CompositeArray)):

                        col.type = CompositeArray(default_type)

                    self.profiled_columns.append(col)

            # replace the schema definition with our profile definition
            for column in self.profiled_columns:
                res.__table__.columns.replace(column)

            return res

        else:
            raise Exception(
                "Missing Resource",
                "The resource is not available in this server or it has "
                "not been registered",
            )
Пример #5
0
 class Account(self.Base):
     __tablename__ = 'account'
     id = sa.Column(sa.Integer, primary_key=True)
     balances = sa.Column(CompositeArray(self.type))
Пример #6
0
 class Account(Base):
     __tablename__ = 'account'
     id = sa.Column(sa.Integer, primary_key=True)
     categories = sa.Column(CompositeArray(type_))
def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table(
        "organization",
        sa.Column("id",
                  fhir_server.elements.primitives.IdField(),
                  nullable=False),
        sa.Column("implicitRules",
                  fhir_server.elements.primitives.URIField(),
                  nullable=True),
        sa.Column("language",
                  fhir_server.elements.primitives.CodeField(),
                  nullable=True),
        sa.Column("active",
                  fhir_server.elements.primitives.BooleanField(),
                  nullable=True),
        sa.Column("name",
                  fhir_server.elements.primitives.StringField(),
                  nullable=True),
        sa.Column(
            "identifier",
            sqlalchemy_utils.types.pg_composite.CompositeArray(
                PgComposite(
                    "fhir_identifier",
                    [
                        Column(
                            "extension",
                            PgComposite(
                                "fhir_extension",
                                [
                                    Column(
                                        "url", StringField(), nullable=False),
                                    Column("value", OpenType()),
                                ],
                            ),
                        ),
                        Column("id", StringField()),
                        Column("system", URIField()),
                        Column("use", CodeField()),
                        Column("value", StringField()),
                        Column(
                            "assigner",
                            PgComposite(
                                "fhir_reference",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("display", StringField()),
                                    Column("reference", StringField()),
                                ],
                            ),
                        ),
                        Column(
                            "period",
                            PgComposite(
                                "fhir_period",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("end_time",
                                           DateTimeField(timezone=True)),
                                    Column("start_time",
                                           DateTimeField(timezone=True)),
                                ],
                            ),
                        ),
                        Column(
                            "type",
                            PgComposite(
                                "fhir_codeableconcept",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("text", StringField()),
                                    Column(
                                        "coding",
                                        CompositeArray(
                                            PgComposite(
                                                "fhir_coding",
                                                [
                                                    Column(
                                                        "extension",
                                                        PgComposite(
                                                            "fhir_extension",
                                                            [
                                                                Column(
                                                                    "url",
                                                                    StringField(
                                                                    ),
                                                                    nullable=
                                                                    False,
                                                                ),
                                                                Column(
                                                                    "value",
                                                                    OpenType()
                                                                ),
                                                            ],
                                                        ),
                                                    ),
                                                    Column(
                                                        "id", StringField()),
                                                    Column(
                                                        "code", CodeField()),
                                                    Column(
                                                        "display",
                                                        StringField()),
                                                    Column(
                                                        "system", URIField()),
                                                    Column(
                                                        "user_selected",
                                                        BooleanField()),
                                                    Column(
                                                        "version",
                                                        StringField()),
                                                ],
                                            )),
                                    ),
                                ],
                            ),
                        ),
                    ],
                )),
            nullable=True,
        ),
        sa.Column(
            "type",
            fhir_server.elements.base.complex_mixin.PgComposite(
                "fhir_codeableconcept",
                [
                    Column(
                        "extension",
                        PgComposite(
                            "fhir_extension",
                            [
                                Column("url", StringField(), nullable=False),
                                Column("value", OpenType()),
                            ],
                        ),
                    ),
                    Column("id", StringField()),
                    Column("text", StringField()),
                    Column(
                        "coding",
                        CompositeArray(
                            PgComposite(
                                "fhir_coding",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("code", CodeField()),
                                    Column("display", StringField()),
                                    Column("system", URIField()),
                                    Column("user_selected", BooleanField()),
                                    Column("version", StringField()),
                                ],
                            )),
                    ),
                ],
            ),
            nullable=True,
        ),
        sa.Column(
            "telecom",
            sqlalchemy_utils.types.pg_composite.CompositeArray(
                PgComposite(
                    "fhir_contactpoint",
                    [
                        Column(
                            "extension",
                            PgComposite(
                                "fhir_extension",
                                [
                                    Column(
                                        "url", StringField(), nullable=False),
                                    Column("value", OpenType()),
                                ],
                            ),
                        ),
                        Column("id", StringField()),
                        Column("rank", PositiveIntField()),
                        Column("system", CodeField()),
                        Column("use", CodeField()),
                        Column("value", StringField()),
                        Column(
                            "period",
                            PgComposite(
                                "fhir_period",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("end_time",
                                           DateTimeField(timezone=True)),
                                    Column("start_time",
                                           DateTimeField(timezone=True)),
                                ],
                            ),
                        ),
                    ],
                )),
            nullable=True,
        ),
        sa.Column(
            "address",
            sqlalchemy_utils.types.pg_composite.CompositeArray(
                PgComposite(
                    "fhir_address",
                    [
                        Column(
                            "extension",
                            PgComposite(
                                "fhir_extension",
                                [
                                    Column(
                                        "url", StringField(), nullable=False),
                                    Column("value", OpenType()),
                                ],
                            ),
                        ),
                        Column("id", StringField()),
                        Column("city", StringField()),
                        Column("country", StringField()),
                        Column("district", StringField()),
                        Column("line", CompositeArray(StringField())),
                        Column("postal_code", StringField()),
                        Column("state", StringField()),
                        Column("type", CodeField()),
                        Column("text", StringField()),
                        Column("use", CodeField()),
                        Column(
                            "period",
                            PgComposite(
                                "fhir_period",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("end_time",
                                           DateTimeField(timezone=True)),
                                    Column("start_time",
                                           DateTimeField(timezone=True)),
                                ],
                            ),
                        ),
                    ],
                )),
            nullable=True,
        ),
        sa.Column(
            "part_of",
            fhir_server.elements.base.complex_mixin.PgComposite(
                "fhir_reference",
                [
                    Column(
                        "extension",
                        PgComposite(
                            "fhir_extension",
                            [
                                Column("url", StringField(), nullable=False),
                                Column("value", OpenType()),
                            ],
                        ),
                    ),
                    Column("id", StringField()),
                    Column("display", StringField()),
                    Column("reference", StringField()),
                ],
            ),
            nullable=True,
        ),
        sa.Column(
            "contact",
            sqlalchemy_utils.types.pg_composite.CompositeArray(
                PgComposite(
                    "fhir_organizationcontact",
                    [
                        Column(
                            "extension",
                            PgComposite(
                                "fhir_extension",
                                [
                                    Column(
                                        "url", StringField(), nullable=False),
                                    Column("value", OpenType()),
                                ],
                            ),
                        ),
                        Column("id", StringField()),
                        Column(
                            "purpose",
                            PgComposite(
                                "fhir_codeableconcept",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("text", StringField()),
                                    Column(
                                        "coding",
                                        CompositeArray(
                                            PgComposite(
                                                "fhir_coding",
                                                [
                                                    Column(
                                                        "extension",
                                                        PgComposite(
                                                            "fhir_extension",
                                                            [
                                                                Column(
                                                                    "url",
                                                                    StringField(
                                                                    ),
                                                                    nullable=
                                                                    False,
                                                                ),
                                                                Column(
                                                                    "value",
                                                                    OpenType()
                                                                ),
                                                            ],
                                                        ),
                                                    ),
                                                    Column(
                                                        "id", StringField()),
                                                    Column(
                                                        "code", CodeField()),
                                                    Column(
                                                        "display",
                                                        StringField()),
                                                    Column(
                                                        "system", URIField()),
                                                    Column(
                                                        "user_selected",
                                                        BooleanField()),
                                                    Column(
                                                        "version",
                                                        StringField()),
                                                ],
                                            )),
                                    ),
                                ],
                            ),
                        ),
                        Column(
                            "name",
                            PgComposite(
                                "fhir_humanname",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("family",
                                           CompositeArray(StringField())),
                                    Column("given",
                                           CompositeArray(StringField())),
                                    Column("prefix",
                                           CompositeArray(StringField())),
                                    Column("suffix",
                                           CompositeArray(StringField())),
                                    Column("text", StringField()),
                                    Column("use", CodeField()),
                                    Column(
                                        "period",
                                        PgComposite(
                                            "fhir_period",
                                            [
                                                Column(
                                                    "extension",
                                                    PgComposite(
                                                        "fhir_extension",
                                                        [
                                                            Column(
                                                                "url",
                                                                StringField(),
                                                                nullable=False,
                                                            ),
                                                            Column(
                                                                "value",
                                                                OpenType()),
                                                        ],
                                                    ),
                                                ),
                                                Column("id", StringField()),
                                                Column(
                                                    "end_time",
                                                    DateTimeField(
                                                        timezone=True),
                                                ),
                                                Column(
                                                    "start_time",
                                                    DateTimeField(
                                                        timezone=True),
                                                ),
                                            ],
                                        ),
                                    ),
                                ],
                            ),
                        ),
                        Column(
                            "address",
                            PgComposite(
                                "fhir_address",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("city", StringField()),
                                    Column("country", StringField()),
                                    Column("district", StringField()),
                                    Column("line", CompositeArray(
                                        StringField())),
                                    Column("postal_code", StringField()),
                                    Column("state", StringField()),
                                    Column("type", CodeField()),
                                    Column("text", StringField()),
                                    Column("use", CodeField()),
                                    Column(
                                        "period",
                                        PgComposite(
                                            "fhir_period",
                                            [
                                                Column(
                                                    "extension",
                                                    PgComposite(
                                                        "fhir_extension",
                                                        [
                                                            Column(
                                                                "url",
                                                                StringField(),
                                                                nullable=False,
                                                            ),
                                                            Column(
                                                                "value",
                                                                OpenType()),
                                                        ],
                                                    ),
                                                ),
                                                Column("id", StringField()),
                                                Column(
                                                    "end_time",
                                                    DateTimeField(
                                                        timezone=True),
                                                ),
                                                Column(
                                                    "start_time",
                                                    DateTimeField(
                                                        timezone=True),
                                                ),
                                            ],
                                        ),
                                    ),
                                ],
                            ),
                        ),
                        Column(
                            "telecom",
                            CompositeArray(
                                PgComposite(
                                    "fhir_contactpoint",
                                    [
                                        Column(
                                            "extension",
                                            PgComposite(
                                                "fhir_extension",
                                                [
                                                    Column(
                                                        "url",
                                                        StringField(),
                                                        nullable=False,
                                                    ),
                                                    Column(
                                                        "value", OpenType()),
                                                ],
                                            ),
                                        ),
                                        Column("id", StringField()),
                                        Column("rank", PositiveIntField()),
                                        Column("system", CodeField()),
                                        Column("use", CodeField()),
                                        Column("value", StringField()),
                                        Column(
                                            "period",
                                            PgComposite(
                                                "fhir_period",
                                                [
                                                    Column(
                                                        "extension",
                                                        PgComposite(
                                                            "fhir_extension",
                                                            [
                                                                Column(
                                                                    "url",
                                                                    StringField(
                                                                    ),
                                                                    nullable=
                                                                    False,
                                                                ),
                                                                Column(
                                                                    "value",
                                                                    OpenType()
                                                                ),
                                                            ],
                                                        ),
                                                    ),
                                                    Column(
                                                        "id", StringField()),
                                                    Column(
                                                        "end_time",
                                                        DateTimeField(
                                                            timezone=True),
                                                    ),
                                                    Column(
                                                        "start_time",
                                                        DateTimeField(
                                                            timezone=True),
                                                    ),
                                                ],
                                            ),
                                        ),
                                    ],
                                )),
                        ),
                    ],
                )),
            nullable=True,
        ),
        sa.Column(
            "meta",
            fhir_server.elements.base.complex_mixin.PgComposite(
                "fhir_meta",
                [
                    Column(
                        "extension",
                        PgComposite(
                            "fhir_extension",
                            [
                                Column("url", StringField(), nullable=False),
                                Column("value", OpenType()),
                            ],
                        ),
                    ),
                    Column("id", StringField()),
                    Column("version_id", IdField()),
                    Column("last_updated", InstantField(timezone=True)),
                    Column("profile", CompositeArray(URIField())),
                    Column(
                        "security",
                        CompositeArray(
                            PgComposite(
                                "fhir_coding",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("code", CodeField()),
                                    Column("display", StringField()),
                                    Column("system", URIField()),
                                    Column("user_selected", BooleanField()),
                                    Column("version", StringField()),
                                ],
                            )),
                    ),
                    Column(
                        "tag",
                        CompositeArray(
                            PgComposite(
                                "fhir_coding",
                                [
                                    Column(
                                        "extension",
                                        PgComposite(
                                            "fhir_extension",
                                            [
                                                Column("url",
                                                       StringField(),
                                                       nullable=False),
                                                Column("value", OpenType()),
                                            ],
                                        ),
                                    ),
                                    Column("id", StringField()),
                                    Column("code", CodeField()),
                                    Column("display", StringField()),
                                    Column("system", URIField()),
                                    Column("user_selected", BooleanField()),
                                    Column("version", StringField()),
                                ],
                            )),
                    ),
                ],
            ),
            nullable=True,
        ),
        sa.PrimaryKeyConstraint("id"),
    )
    ### end Alembic commands ###

    conn = op.get_bind()
    for resource in all_resources:
        conn.execute(
            sa.sql.text("""
            DROP INDEX IF EXISTS {0}_meta_version_id;

            CREATE UNIQUE INDEX {0}_meta_version_id ON {0} (
                ((meta).version_id));

            DROP TRIGGER IF EXISTS meta_version_id_concurrency ON {0};

            CREATE TRIGGER meta_version_id_concurrency BEFORE INSERT OR UPDATE ON {0}
            FOR EACH ROW EXECUTE PROCEDURE meta_version_id_concurrency();
            """.format(resource.__tablename__)))

    profiled_resources = {
        con.get("resource"): con.get("fields")
        for con in constraints
    }
    for resource, const in profiled_resources.items():
        for c in const:
            field = c.get("name")
            mini = str(c.get("cardinality").get("mini"))
            maxi = str(c.get("cardinality").get("maxi"))
            conn.execute(
                sa.sql.text("""
                DROP TRIGGER IF EXISTS validate_meta_fields_{1} ON {0};

                CREATE TRIGGER validate_meta_fields_{1} BEFORE INSERT OR UPDATE ON {0}
                FOR EACH ROW EXECUTE PROCEDURE validate_meta_fields({1}, '{2}', '{3}');
                """.format(resource.lower(), field, mini, maxi)))