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. ]
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
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)
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", )
class Account(self.Base): __tablename__ = 'account' id = sa.Column(sa.Integer, primary_key=True) balances = sa.Column(CompositeArray(self.type))
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)))