add requests
parent
3421ce4dff
commit
e6e87b0d9d
@ -0,0 +1,22 @@
|
||||
from sqlalchemy import UUID, Column, Float, ForeignKey, Integer, String
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
|
||||
|
||||
class EquipmentWorkscopeGroup(Base, DefaultMixin):
|
||||
__tablename__ = "oh_tr_equipment_workscope_group"
|
||||
|
||||
workscope_group_id = Column(UUID(as_uuid=True), ForeignKey('oh_ms_workscope_group.id'))
|
||||
location_tag = Column(String, nullable=False)
|
||||
|
||||
workscope_group = relationship("MasterActivity", lazy="selectin", back_populates="equipment_workscope_groups")
|
||||
equipment = relationship(
|
||||
"StandardScope",
|
||||
lazy="raise",
|
||||
primaryjoin="and_(EquipmentWorkscopeGroup.location_tag == foreign(StandardScope.location_tag))",
|
||||
uselist=False, # Add this if it's a one-to-one relationship
|
||||
)
|
||||
@ -1,202 +0,0 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Union
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
from sqlalchemy import Delete, Select, and_, desc, func, not_, or_
|
||||
from sqlalchemy.dialects.postgresql import insert
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from src.auth.service import CurrentUser
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.overhaul_scope.model import OverhaulScope
|
||||
from src.scope_equipment.enum import ScopeEquipmentType
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
|
||||
from .model import MasterEquipment, MasterEquipmentTree, ScopeEquipment
|
||||
from .schema import ScopeEquipmentCreate, ScopeEquipmentUpdate
|
||||
|
||||
|
||||
async def get_by_assetnum(*, db_session: DbSession, assetnum: str):
|
||||
query = (
|
||||
Select(ScopeEquipment)
|
||||
.filter(ScopeEquipment.assetnum == assetnum)
|
||||
.options(selectinload(ScopeEquipment.master_equipment))
|
||||
)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.unique().scalars().one_or_none()
|
||||
|
||||
|
||||
async def get_all(*, common, scope_name: str = None):
|
||||
"""Returns all documents."""
|
||||
query = Select(ScopeEquipment).options(
|
||||
selectinload(ScopeEquipment.master_equipment)
|
||||
)
|
||||
|
||||
query = query.order_by(desc(ScopeEquipment.created_at))
|
||||
|
||||
if scope_name:
|
||||
query = query.where(ScopeEquipment.scope_overhaul == scope_name)
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
return results
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, scope_equipment_in: ScopeEquipmentCreate):
|
||||
"""Creates a new document."""
|
||||
# scope_equipment = ScopeEquipment(**scope_equipment_in.model_dump())
|
||||
assetnums = scope_equipment_in.assetnums
|
||||
results = []
|
||||
removal_date = scope_equipment_in.removal_date
|
||||
|
||||
if scope_equipment_in.type == ScopeEquipmentType.TEMP:
|
||||
# Search for the next or ongoing overhaul session for the given scope
|
||||
stmt = (
|
||||
Select(OverhaulScope.end_date)
|
||||
.where(
|
||||
OverhaulScope.type == scope_equipment_in.scope_name,
|
||||
(OverhaulScope.start_date <= datetime.now())
|
||||
& (OverhaulScope.end_date >= datetime.now()) # Ongoing
|
||||
| (OverhaulScope.start_date > datetime.now()), # Upcoming
|
||||
)
|
||||
.order_by(OverhaulScope.start_date.asc())
|
||||
.limit(1)
|
||||
)
|
||||
|
||||
result = await db_session.execute(stmt)
|
||||
removal_date = result.scalar_one_or_none()
|
||||
|
||||
# If no overhaul found, set a default removal date or handle the error
|
||||
if removal_date is None:
|
||||
# Handle if no overhaul session is found, set default or raise an error
|
||||
removal_date = datetime.now() + timedelta(
|
||||
days=30
|
||||
) # Example: 30 days from now
|
||||
|
||||
for assetnum in assetnums:
|
||||
stmt = insert(ScopeEquipment).values(
|
||||
assetnum=assetnum,
|
||||
scope_overhaul=scope_equipment_in.scope_name,
|
||||
type=scope_equipment_in.type,
|
||||
removal_date=removal_date,
|
||||
)
|
||||
|
||||
stmt = stmt.on_conflict_do_nothing(
|
||||
index_elements=["assetnum", "scope_overhaul"]
|
||||
)
|
||||
|
||||
await db_session.execute(stmt)
|
||||
results.append(assetnum)
|
||||
|
||||
await db_session.commit()
|
||||
return results
|
||||
|
||||
|
||||
async def update(
|
||||
*,
|
||||
db_session: DbSession,
|
||||
scope_equipment: ScopeEquipment,
|
||||
scope_equipment_in: ScopeEquipmentUpdate
|
||||
):
|
||||
"""Updates a document."""
|
||||
data = scope_equipment_in.model_dump()
|
||||
|
||||
update_data = scope_equipment_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(scope_equipment, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return scope_equipment
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, assetnum: str):
|
||||
"""Deletes a document."""
|
||||
query = Delete(ScopeEquipment).where(ScopeEquipment.assetnum == assetnum)
|
||||
await db_session.execute(query)
|
||||
await db_session.commit()
|
||||
|
||||
return assetnum
|
||||
|
||||
# query = Select(ScopeEquipment).filter(
|
||||
# ScopeEquipment.id == scope_equipment_id)
|
||||
|
||||
# scope_equipment = await db_session.execute(query)
|
||||
# scope_equipment: ScopeEquipment = scope_equipment.scalars().one_or_none()
|
||||
|
||||
# if not scope_equipment:
|
||||
# raise HTTPException(
|
||||
# status_code=status.HTTP_404_NOT_FOUND,
|
||||
# detail="A data with this id does not exist.",
|
||||
# )
|
||||
|
||||
# if not scope_equipment.scope_id:
|
||||
# await db_session.delete(scope_equipment)
|
||||
# else:
|
||||
# if scope_equipment.current_scope_id == scope_equipment.scope_id:
|
||||
# await db_session.delete(scope_equipment)
|
||||
# else:
|
||||
# scope_equipment.current_scope_id = scope_equipment.scope_id
|
||||
# await db_session.commit()
|
||||
|
||||
|
||||
async def get_by_scope_name(
|
||||
*, db_session: DbSession, scope_name: Optional[str]
|
||||
) -> Optional[ScopeEquipment]:
|
||||
"""Returns a document based on the given document id."""
|
||||
query = Select(ScopeEquipment).options(
|
||||
selectinload(ScopeEquipment.master_equipment)
|
||||
)
|
||||
|
||||
if scope_name:
|
||||
query = query.filter(ScopeEquipment.scope_overhaul == scope_name)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all()
|
||||
|
||||
|
||||
# async def get_exculed_scope_name(*, db_session: DbSession, scope_name: Union[str, list]) -> Optional[ScopeEquipment]:
|
||||
# scope = await get_scope_by_name_service(db_session=db_session, scope_name=scope_name)
|
||||
|
||||
# query = Select(ScopeEquipment)
|
||||
|
||||
# if scope:
|
||||
# query = query.filter(ScopeEquipment.current_scope_id != scope.id)
|
||||
|
||||
# else:
|
||||
# query = query.filter(ScopeEquipment.current_scope_id != None)
|
||||
|
||||
# result = await db_session.execute(query)
|
||||
# return result.scalars().all()
|
||||
|
||||
|
||||
async def get_all_master_equipment(*, common: CommonParameters, scope_name):
|
||||
equipments_scope = [
|
||||
equip.assetnum
|
||||
for equip in await get_by_scope_name(
|
||||
db_session=common.get("db_session"), scope_name=scope_name
|
||||
)
|
||||
]
|
||||
|
||||
query = Select(MasterEquipment).filter(MasterEquipment.assetnum.is_not(None))
|
||||
|
||||
# Only add not_in filter if there are items in equipments_scope
|
||||
if equipments_scope:
|
||||
query = query.filter(MasterEquipment.assetnum.not_in(equipments_scope))
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
return results
|
||||
|
||||
|
||||
async def get_equipment_level_by_no(*, db_session: DbSession, level: int):
|
||||
query = (
|
||||
Select(MasterEquipment)
|
||||
.join(MasterEquipment.equipment_tree)
|
||||
.where(MasterEquipmentTree.level_no == level)
|
||||
)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all()
|
||||
@ -1,20 +0,0 @@
|
||||
from sqlalchemy import UUID, Column, Float, ForeignKey, Integer, String
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
|
||||
|
||||
class ScopeEquipmentJob(Base, DefaultMixin):
|
||||
__tablename__ = "oh_ms_scope_equipment_job"
|
||||
|
||||
assetnum = Column(String, nullable=False)
|
||||
job_id = Column(UUID(as_uuid=True), ForeignKey("oh_ms_job.id", ondelete="cascade"))
|
||||
|
||||
job = relationship("MasterActivity", lazy="selectin")
|
||||
|
||||
overhaul_jobs = relationship(
|
||||
"OverhaulJob", back_populates="scope_equipment_job", lazy="selectin"
|
||||
)
|
||||
@ -0,0 +1,212 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Union
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
from sqlalchemy import Delete, Select, and_, desc, func, not_, or_
|
||||
from sqlalchemy.dialects.postgresql import insert
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from src.auth.service import CurrentUser
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.overhaul_scope.model import OverhaulScope
|
||||
from src.standard_scope.enum import ScopeEquipmentType
|
||||
from src.standard_scope.model import EquipmentOHHistory
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
from src.equipment_workscope_group.model import EquipmentWorkscopeGroup
|
||||
from src.workscope_group.model import MasterActivity
|
||||
from src.workscope_group_maintenance_type.model import WorkscopeOHType
|
||||
from src.overhaul_scope.model import MaintenanceType
|
||||
from src.overhaul_scope.service import get as get_overhaul
|
||||
from .model import MasterEquipment, MasterEquipmentTree, StandardScope
|
||||
from .schema import ScopeEquipmentCreate, ScopeEquipmentUpdate
|
||||
from uuid import UUID
|
||||
|
||||
async def get_by_location_tag(*, db_session: DbSession, location_tag: str):
|
||||
query = (
|
||||
Select(StandardScope)
|
||||
.filter(StandardScope.location_tag == location_tag)
|
||||
.options(selectinload(StandardScope.master_equipment))
|
||||
)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.unique().scalars().one_or_none()
|
||||
|
||||
|
||||
async def get_all(*, common, oh_scope: Optional[str] = None):
|
||||
"""Returns all documents."""
|
||||
query = Select(StandardScope).options(
|
||||
selectinload(StandardScope.master_equipment)
|
||||
)
|
||||
|
||||
query = query.order_by(desc(StandardScope.created_at)).options(selectinload(StandardScope.master_equipment))
|
||||
|
||||
if oh_scope:
|
||||
query = (
|
||||
query
|
||||
.outerjoin(StandardScope.oh_history) # Use outerjoin to handle None values
|
||||
.join(StandardScope.workscope_groups)
|
||||
.join(EquipmentWorkscopeGroup.workscope_group)
|
||||
.join(MasterActivity.oh_types)
|
||||
.join(WorkscopeOHType.oh_type)
|
||||
.filter(MaintenanceType.name == oh_scope)
|
||||
|
||||
# .filter(
|
||||
# (StandardScope.is_alternating_oh == False) |
|
||||
# (StandardScope.oh_history == None) |
|
||||
# (StandardScope.oh_history.has(EquipmentOHHistory.last_oh_type != selected_overhaul.maintenance_type.name))
|
||||
# ).distinct()
|
||||
)
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
return results
|
||||
|
||||
|
||||
async def get_by_oh_session_id(*, db_session: DbSession, oh_session_id: UUID):
|
||||
overhaul = await get_overhaul(db_session=db_session, overhaul_session_id=oh_session_id)
|
||||
|
||||
query = (
|
||||
Select(StandardScope)
|
||||
.outerjoin(StandardScope.oh_history) # Use outerjoin to handle None values
|
||||
.join(StandardScope.workscope_groups)
|
||||
.join(EquipmentWorkscopeGroup.workscope_group)
|
||||
.join(MasterActivity.oh_types)
|
||||
.join(WorkscopeOHType.oh_type)
|
||||
.filter(MaintenanceType.name == overhaul.maintenance_type.name).filter(
|
||||
(StandardScope.is_alternating_oh == False) |
|
||||
(StandardScope.oh_history == None) |
|
||||
(StandardScope.oh_history.has(EquipmentOHHistory.last_oh_type != overhaul.maintenance_type.name))
|
||||
).distinct()
|
||||
)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all(), overhaul
|
||||
|
||||
async def create(*, db_session: DbSession, scope_equipment_in: ScopeEquipmentCreate):
|
||||
"""Creates a new document."""
|
||||
# scope_equipment = StandardScope(**scope_equipment_in.model_dump())
|
||||
assetnums = scope_equipment_in.assetnums
|
||||
results = []
|
||||
removal_date = scope_equipment_in.removal_date
|
||||
|
||||
if scope_equipment_in.type == ScopeEquipmentType.TEMP:
|
||||
# Search for the next or ongoing overhaul session for the given scope
|
||||
stmt = (
|
||||
Select(OverhaulScope.end_date)
|
||||
.where(
|
||||
OverhaulScope.type == scope_equipment_in.scope_name,
|
||||
(OverhaulScope.start_date <= datetime.now())
|
||||
& (OverhaulScope.end_date >= datetime.now()) # Ongoing
|
||||
| (OverhaulScope.start_date > datetime.now()), # Upcoming
|
||||
)
|
||||
.order_by(OverhaulScope.start_date.asc())
|
||||
.limit(1)
|
||||
)
|
||||
|
||||
result = await db_session.execute(stmt)
|
||||
removal_date = result.scalar_one_or_none()
|
||||
|
||||
# If no overhaul found, set a default removal date or handle the error
|
||||
if removal_date is None:
|
||||
# Handle if no overhaul session is found, set default or raise an error
|
||||
removal_date = datetime.now() + timedelta(
|
||||
days=30
|
||||
) # Example: 30 days from now
|
||||
|
||||
for assetnum in assetnums:
|
||||
stmt = insert(StandardScope).values(
|
||||
assetnum=assetnum,
|
||||
scope_overhaul=scope_equipment_in.scope_name,
|
||||
type=scope_equipment_in.type,
|
||||
removal_date=removal_date,
|
||||
)
|
||||
|
||||
stmt = stmt.on_conflict_do_nothing(
|
||||
index_elements=["assetnum", "scope_overhaul"]
|
||||
)
|
||||
|
||||
await db_session.execute(stmt)
|
||||
results.append(assetnum)
|
||||
|
||||
await db_session.commit()
|
||||
return results
|
||||
|
||||
|
||||
async def update(
|
||||
*,
|
||||
db_session: DbSession,
|
||||
scope_equipment: StandardScope,
|
||||
scope_equipment_in: ScopeEquipmentUpdate
|
||||
):
|
||||
"""Updates a document."""
|
||||
data = scope_equipment_in.model_dump()
|
||||
|
||||
update_data = scope_equipment_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(scope_equipment, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return scope_equipment
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, assetnum: str):
|
||||
"""Deletes a document."""
|
||||
query = Delete(StandardScope).where(StandardScope.assetnum == assetnum)
|
||||
await db_session.execute(query)
|
||||
await db_session.commit()
|
||||
|
||||
return assetnum
|
||||
|
||||
async def get_by_oh_scope(
|
||||
*, db_session: DbSession, oh_scope: str
|
||||
):
|
||||
pass
|
||||
|
||||
query = (Select(StandardScope)
|
||||
.outerjoin(StandardScope.oh_history) # Use outerjoin to handle None values
|
||||
.join(StandardScope.workscope_groups)
|
||||
.join(EquipmentWorkscopeGroup.workscope_group)
|
||||
.join(MasterActivity.oh_types)
|
||||
.join(WorkscopeOHType.oh_type)
|
||||
.filter(MaintenanceType.name == oh_scope)
|
||||
# .filter(
|
||||
# (StandardScope.is_alternating_oh == False) |
|
||||
# (StandardScope.oh_history == None) |
|
||||
# (StandardScope.oh_history.has(EquipmentOHHistory.last_oh_type != selected_overhaul.maintenance_type.name))
|
||||
# ).distinct()
|
||||
)
|
||||
|
||||
results = await db_session.execute(query)
|
||||
return results.scalars().all()
|
||||
|
||||
|
||||
async def get_all_master_equipment(*, common: CommonParameters, scope_name):
|
||||
equipments_scope = [
|
||||
equip.location_tag
|
||||
for equip in await get_by_oh_scope(
|
||||
db_session=common.get("db_session"), oh_scope=scope_name
|
||||
)
|
||||
]
|
||||
|
||||
query = Select(MasterEquipment).filter(MasterEquipment.location_tag.is_not(None))
|
||||
|
||||
# Only add not_in filter if there are items in equipments_scope
|
||||
if equipments_scope:
|
||||
query = query.filter(MasterEquipment.location_tag.not_in(equipments_scope))
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
return results
|
||||
|
||||
|
||||
async def get_equipment_level_by_no(*, db_session: DbSession, level: int):
|
||||
query = (
|
||||
Select(MasterEquipment)
|
||||
.join(MasterEquipment.equipment_tree)
|
||||
.where(MasterEquipmentTree.level_no == level)
|
||||
)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all()
|
||||
@ -0,0 +1,18 @@
|
||||
from sqlalchemy import UUID, Column, Float, ForeignKey, Integer, String
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
|
||||
|
||||
class WorkscopeOHType(Base):
|
||||
__tablename__ = 'oh_tr_workscope_maintenance_type'
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True)
|
||||
workscope_group_id = Column(UUID(as_uuid=True), ForeignKey('oh_ms_workscope_group.id'))
|
||||
maintenance_type_id = Column(UUID(as_uuid=True), ForeignKey('oh_ms_maintenance_type.id'))
|
||||
|
||||
workscope_group = relationship('MasterActivity', back_populates='oh_types')
|
||||
oh_type = relationship('MaintenanceType')
|
||||
@ -0,0 +1,59 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import Delete, Select
|
||||
from sqlalchemy.orm import joinedload, selectinload
|
||||
|
||||
from src.auth.service import CurrentUser
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
|
||||
from .model import MasterActivity
|
||||
from .schema import ActivityMaster, ActivityMasterCreate
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, activity_id: str) -> Optional[ActivityMaster]:
|
||||
"""Returns a document based on the given document id."""
|
||||
result = await db_session.get(MasterActivity, activity_id)
|
||||
return result
|
||||
|
||||
|
||||
async def get_all(common: CommonParameters):
|
||||
query = Select(MasterActivity)
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, activty_in: ActivityMasterCreate):
|
||||
activity = MasterActivity(**activty_in.model_dump())
|
||||
db_session.add(activity)
|
||||
await db_session.commit()
|
||||
return activity
|
||||
|
||||
|
||||
async def update(
|
||||
*,
|
||||
db_session: DbSession,
|
||||
activity: MasterActivity,
|
||||
activity_in: ActivityMasterCreate
|
||||
):
|
||||
"""Updates a document."""
|
||||
data = activity_in.model_dump()
|
||||
|
||||
update_data = activity_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(activity, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return activity
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, activity_id: str):
|
||||
"""Deletes a document."""
|
||||
activity = await db_session.get(MasterActivity, activity_id)
|
||||
await db_session.delete(activity)
|
||||
await db_session.commit()
|
||||
Loading…
Reference in New Issue