class User(BaseTable): __tablename__ = "users" id = db.Column(db.BigInteger, primary_key=True, autoincrement=True) username = db.Column(db.String(50), nullable=False) email = db.Column(db.EmailType, nullable=False) is_active = db.Column(db.Boolean(), default=True) is_superuser = db.Column(db.Boolean(), default=False) first_name = db.Column(db.String(255)) last_name = db.Column(db.String(255)) phone_number = db.Column(db.Unicode(20)) country_code = db.Column(db.Unicode(20)) hashed_password = db.Column(db.String(), nullable=False) uq_username = db.UniqueConstraint("username") uq_email = db.UniqueConstraint("email") ix_username = db.Index(f"ix_{__tablename__}_username", "username") ix_email = db.Index(f"ix_{__tablename__}_email", "email") oauth2_clients = relationship("OAuth2Client", back_populates="owner_id") @classmethod async def get_by_email(cls, email: str) -> Optional[User]: return await cls.query.where(User.email == email).gino.first() @classmethod async def get_by_username(cls, username: str) -> Optional[User]: return await cls.query.where(User.username == username).gino.first() @classmethod async def get_by_email_or_username(cls, email_or_username: str, prefer: str = None) -> Optional[User]: if prefer == "email": result = await cls.get_by_email(email_or_username ) or await cls.get_by_username( email_or_username) else: result = await cls.get_by_username( email_or_username) or await cls.get_by_email(email_or_username) return result @classmethod async def authenticate(cls, email_or_username: str, password: str, prefer: str = None) -> Optional[User]: user = await cls.get_by_email_or_username(email_or_username, prefer=prefer) if not user: return None if not verify_password(password, user.hashed_password): return None return user @classmethod def create(cls, **values): password: Optional[str] = values.pop("password", None) if password: values["hashed_password"] = get_password_hash(password) return super().create(**values)
class TestModel(BaseTable): __tablename__ = "test" id = db.Column(db.BigInteger, primary_key=True, autoincrement=True) username = db.Column(db.String(50), nullable=False) email = db.Column(db.EmailType, nullable=False) is_active = db.Column(db.Boolean(), default=True) is_superuser = db.Column(db.Boolean(), default=False) first_name = db.Column(db.String(255)) last_name = db.Column(db.String(255)) phone_number = db.Column(db.Unicode(20)) country_code = db.Column(db.Unicode(20)) hashed_password = db.Column(db.String()) uq_username = db.UniqueConstraint("username") uq_email = db.UniqueConstraint("email") ix_username = db.Index("ix_test_username", "username") ix_email = db.Index("ix_test_email", "email")
class IPTest(WellBase): __tablename__ = "ip_tests" test_number = db.Column(db.Integer(), primary_key=True) test_date = db.Column(db.Date(), index=True) type_code = db.Column(db.String(10)) test_method = db.Column(db.String()) completion = db.Column(db.Integer()) oil = db.Column(db.Integer()) oil_per10k = db.Column(db.Integer()) oil_uom = db.Column(db.String(10)) gas = db.Column(db.Integer()) gas_per10k = db.Column(db.Integer()) gas_uom = db.Column(db.String(10)) water = db.Column(db.Integer()) water_per10k = db.Column(db.Integer()) water_uom = db.Column(db.String(10)) choke = db.Column(db.String(25)) depth_top = db.Column(db.Integer()) depth_top_uom = db.Column(db.String(10)) depth_base = db.Column(db.Integer()) depth_base_uom = db.Column(db.String(10)) sulfur = db.Column(db.Boolean()) oil_gravity = db.Column(db.Float()) oil_gravity_uom = db.Column(db.String(10)) gor = db.Column(db.Integer()) gor_uom = db.Column(db.String(10)) perf_upper = db.Column(db.Integer()) perf_upper_uom = db.Column(db.String(10)) perf_lower = db.Column(db.Integer()) perf_lower_uom = db.Column(db.String(10)) perfll = db.Column(db.Integer()) perfll_uom = db.Column(db.String(10))
class ProdStat(Base): __tablename__ = "prodstats" api10 = db.Column(db.String(10), primary_key=True) name = db.Column(db.String(50), primary_key=True, index=True) value = db.Column(db.Numeric(19, 2)) property_name = db.Column(db.String(50), index=True) aggregate_type = db.Column(db.String(25), index=True) is_peak_norm = db.Column(db.Boolean()) is_ll_norm = db.Column(db.Boolean()) ll_norm_value = db.Column(db.Integer()) includes_zeroes = db.Column(db.Boolean()) start_date = db.Column(db.Date()) end_date = db.Column(db.Date()) start_month = db.Column(db.Integer()) end_month = db.Column(db.Integer()) comments = db.Column(db.JSONB(), nullable=False, server_default="{}") ix_prodstat_api10_prop_agg = db.Index("ix_prodstat_api10_prop_agg", "api10", "property_name", "aggregate_type")
class WellDepth(WellBase): __tablename__ = "depths" name = db.Column(db.String(50), index=True, primary_key=True) value = db.Column(db.Integer()) property_name = db.Column(db.String(50), index=True) aggregate_type = db.Column(db.String(25), index=True) grid_id = db.Column(db.Integer(), index=True) formation = db.Column(db.String(50), index=True) into_formation_feet = db.Column(db.Integer()) into_formation_percent = db.Column(db.Float()) above_next_formation_feet = db.Column(db.Integer()) above_next_formation_percent = db.Column(db.Float()) overlap_feet = db.Column(db.Integer()) overlap_percent = db.Column(db.Float()) in_target = db.Column(db.Boolean()) assignment_method = db.Column(db.String()) # TODO: enum
class SurveyPoint(WellBase): __tablename__ = "survey_points" md = db.Column(db.Integer(), primary_key=True) tvd = db.Column(db.Integer()) dip = db.Column(db.Float()) sequence = db.Column(db.Integer()) theta = db.Column(db.Float()) is_in_lateral = db.Column(db.Boolean(), nullable=False, default=False) is_heel_point = db.Column(db.Boolean(), nullable=False, default=False) is_mid_point = db.Column(db.Boolean(), nullable=False, default=False) is_toe_point = db.Column(db.Boolean(), nullable=False, default=False) is_soft_corner = db.Column(db.Boolean(), nullable=False, default=False) is_hard_corner = db.Column(db.Boolean(), nullable=False, default=False) is_kop = db.Column(db.Boolean(), nullable=False, default=False) geom = db.Column(db.Geometry("POINT", srid=4326, spatial_index=False)) ix_lateral_partial = db.Index( "ix_lateral_partial", "api14", "is_in_lateral", postgresql_where=(is_in_lateral), ) ix_heel_partial = db.Index( "ix_heel_partial", "api14", "is_heel_point", postgresql_where=(is_heel_point), ) ix_mid_partial = db.Index( "ix_mid_partial", "api14", "is_mid_point", postgresql_where=(is_mid_point), ) ix_toe_partial = db.Index( "ix_toe_partial", "api14", "is_toe_point", postgresql_where=(is_toe_point), ) ix_survey_point_geom = db.Index("ix_survey_point_geom", "geom", postgresql_using="gist")
class WellHeader(WellBase): __tablename__ = "wells" api10 = db.Column(db.String(10), index=True) well_name = db.Column(db.String()) hole_direction = db.Column(db.String(1)) status = db.Column(db.String(50)) is_producing = db.Column(db.Boolean(), index=True) operator = db.Column(db.String(), index=True) operator_alias = db.Column(db.String(), index=True) hist_operator = db.Column(db.String(), index=True) hist_operator_alias = db.Column(db.String(), index=True) tvd = db.Column(db.Integer()) md = db.Column(db.Integer()) perfll = db.Column(db.Integer()) lateral_length = db.Column(db.Integer()) ground_elev = db.Column(db.Integer()) kb_elev = db.Column(db.Integer()) comp_date = db.Column(db.Date()) spud_date = db.Column(db.Date()) permit_date = db.Column(db.Date()) permit_number = db.Column(db.String()) permit_status = db.Column(db.String()) rig_release_date = db.Column(db.Date()) # rr_date last_activity_date = db.Column(db.Date()) basin = db.Column(db.String(50), index=True) # basin sub_basin = db.Column(db.String(50), index=True) # basin state = db.Column(db.String(50)) # state_name state_code = db.Column(db.String(10)) # state_name county = db.Column(db.String(50), index=True) # county_name county_code = db.Column(db.String(10)) # county_name provider_status = db.Column(db.String(50)) provider = db.Column(db.String()) provider_last_update_at = db.Column(db.DateTime(timezone=True)) basin_holedir_isprod_idx = db.Index("ix_well_basin_holedir_isprod", "basin", "hole_direction", "is_producing") basin_status_idx = db.Index("ix_well_basin_status", "basin", "status")