Files
orders/orders_app/schemas/team_schema.py
2026-01-07 09:16:11 +07:00

292 lines
14 KiB
Python

import graphene
import requests
from django.conf import settings
from ..permissions import require_scopes
class OrderType(graphene.ObjectType):
uuid = graphene.String()
name = graphene.String()
teamUuid = graphene.String()
userId = graphene.String()
status = graphene.String()
totalAmount = graphene.Float()
currency = graphene.String()
sourceLocationUuid = graphene.String()
sourceLocationName = graphene.String()
destinationLocationUuid = graphene.String()
destinationLocationName = graphene.String()
createdAt = graphene.String()
updatedAt = graphene.String()
notes = graphene.String()
orderLines = graphene.List(lambda: OrderLineType)
stages = graphene.List(lambda: StageType)
class OrderLineType(graphene.ObjectType):
uuid = graphene.String()
productUuid = graphene.String()
productName = graphene.String()
quantity = graphene.Float()
unit = graphene.String()
priceUnit = graphene.Float()
subtotal = graphene.Float()
currency = graphene.String()
notes = graphene.String()
class CompanyType(graphene.ObjectType):
uuid = graphene.String()
name = graphene.String()
taxId = graphene.String()
country = graphene.String()
countryCode = graphene.String()
active = graphene.Boolean()
class TripType(graphene.ObjectType):
uuid = graphene.String()
name = graphene.String()
sequence = graphene.Int()
company = graphene.Field(CompanyType)
plannedLoadingDate = graphene.String()
actualLoadingDate = graphene.String()
realLoadingDate = graphene.String()
plannedUnloadingDate = graphene.String()
actualUnloadingDate = graphene.String()
plannedWeight = graphene.Float()
weightAtLoading = graphene.Float()
weightAtUnloading = graphene.Float()
class StageType(graphene.ObjectType):
uuid = graphene.String()
name = graphene.String()
sequence = graphene.Int()
stageType = graphene.String()
transportType = graphene.String()
sourceLocationName = graphene.String()
sourceLatitude = graphene.Float()
sourceLongitude = graphene.Float()
destinationLocationName = graphene.String()
destinationLatitude = graphene.Float()
destinationLongitude = graphene.Float()
locationName = graphene.String()
locationLatitude = graphene.Float()
locationLongitude = graphene.Float()
selectedCompany = graphene.Field(CompanyType)
trips = graphene.List(TripType)
class TeamQuery(graphene.ObjectType):
"""Team schema - Team Access Token authentication"""
getTeamOrders = graphene.List(OrderType)
getOrder = graphene.Field(OrderType, orderUuid=graphene.String(required=True))
@require_scopes("teams:member")
def resolve_getTeamOrders(self, info):
user_id = getattr(info.context, 'user_id', None)
team_uuid = getattr(info.context, 'team_uuid', None)
if not user_id:
raise Exception("User not authenticated")
if not team_uuid:
return []
try:
url = f"http://{settings.ODOO_INTERNAL_URL}/fastapi/orders/orders/team/{team_uuid}"
response = requests.get(url, timeout=10)
if response.status_code == 200:
data = response.json()
result = []
for order_data in data:
order = OrderType(
uuid=order_data.get('uuid'),
name=order_data.get('name'),
teamUuid=order_data.get('team_uuid'),
userId=order_data.get('user_id'),
status='active',
totalAmount=order_data.get('total_amount'),
currency=order_data.get('currency'),
sourceLocationUuid=order_data.get('source_location_uuid'),
sourceLocationName=order_data.get('source_location_name'),
destinationLocationUuid=order_data.get('destination_location_uuid'),
destinationLocationName=order_data.get('destination_location_name'),
createdAt=order_data.get('created_at'),
updatedAt=order_data.get('updated_at'),
notes=order_data.get('notes', ''),
orderLines=[
OrderLineType(
uuid=line.get('uuid'),
productUuid=line.get('product_uuid'),
productName=line.get('product_name'),
quantity=line.get('quantity'),
unit=line.get('unit'),
priceUnit=line.get('price_unit'),
subtotal=line.get('subtotal'),
currency=line.get('currency'),
notes=line.get('notes', '')
) for line in order_data.get('order_lines', [])
],
stages=[
StageType(
uuid=stage.get('uuid'),
name=stage.get('name'),
sequence=stage.get('sequence'),
stageType=stage.get('stage_type'),
transportType=stage.get('transport_type'),
sourceLocationName=stage.get('source_location_name'),
destinationLocationName=stage.get('destination_location_name'),
locationName=stage.get('location_name'),
selectedCompany=CompanyType(
uuid=stage.get('selected_company', {}).get('uuid', ''),
name=stage.get('selected_company', {}).get('name', ''),
taxId=stage.get('selected_company', {}).get('tax_id', ''),
country=stage.get('selected_company', {}).get('country', ''),
countryCode=stage.get('selected_company', {}).get('country_code', ''),
active=stage.get('selected_company', {}).get('active', True)
) if stage.get('selected_company') else None,
trips=[
TripType(
uuid=trip.get('uuid'),
name=trip.get('name'),
sequence=trip.get('sequence'),
company=CompanyType(
uuid=trip.get('company', {}).get('uuid', ''),
name=trip.get('company', {}).get('name', ''),
taxId=trip.get('company', {}).get('tax_id', ''),
country=trip.get('company', {}).get('country', ''),
countryCode=trip.get('company', {}).get('country_code', ''),
active=trip.get('company', {}).get('active', True)
) if trip.get('company') else None,
plannedLoadingDate=trip.get('planned_loading_date'),
actualLoadingDate=trip.get('actual_loading_date'),
realLoadingDate=trip.get('real_loading_date'),
plannedUnloadingDate=trip.get('planned_unloading_date'),
actualUnloadingDate=trip.get('actual_unloading_date'),
plannedWeight=trip.get('planned_weight'),
weightAtLoading=trip.get('weight_at_loading'),
weightAtUnloading=trip.get('weight_at_unloading')
) for trip in stage.get('trips', [])
]
) for stage in order_data.get('stages', [])
]
)
result.append(order)
return result
else:
return []
except Exception as e:
print(f"Error calling Odoo: {e}")
return []
@require_scopes("teams:member")
def resolve_getOrder(self, info, orderUuid):
user_id = getattr(info.context, 'user_id', None)
team_uuid = getattr(info.context, 'team_uuid', None)
if not user_id or not team_uuid:
raise Exception("User not authenticated")
try:
url = f"http://{settings.ODOO_INTERNAL_URL}/fastapi/orders/orders/{orderUuid}"
response = requests.get(url, timeout=10)
if response.status_code == 200:
order_data = response.json()
if order_data.get('team_uuid') != team_uuid:
raise Exception("Access denied: order belongs to different team")
order = OrderType(
uuid=order_data.get('uuid'),
name=order_data.get('name'),
teamUuid=order_data.get('team_uuid'),
userId=order_data.get('user_id'),
status='active',
totalAmount=order_data.get('total_amount'),
currency=order_data.get('currency'),
sourceLocationUuid=order_data.get('source_location_uuid'),
sourceLocationName=order_data.get('source_location_name'),
destinationLocationUuid=order_data.get('destination_location_uuid'),
destinationLocationName=order_data.get('destination_location_name'),
createdAt=order_data.get('created_at'),
updatedAt=order_data.get('updated_at'),
notes=order_data.get('notes', ''),
orderLines=[
OrderLineType(
uuid=line.get('uuid'),
productUuid=line.get('product_uuid'),
productName=line.get('product_name'),
quantity=line.get('quantity'),
unit=line.get('unit'),
priceUnit=line.get('price_unit'),
subtotal=line.get('subtotal'),
currency=line.get('currency'),
notes=line.get('notes', '')
) for line in order_data.get('order_lines', [])
],
stages=[
StageType(
uuid=stage.get('uuid'),
name=stage.get('name'),
sequence=stage.get('sequence'),
stageType=stage.get('stage_type'),
transportType=stage.get('transport_type'),
sourceLocationName=stage.get('source_location_name'),
sourceLatitude=stage.get('source_latitude'),
sourceLongitude=stage.get('source_longitude'),
destinationLocationName=stage.get('destination_location_name'),
destinationLatitude=stage.get('destination_latitude'),
destinationLongitude=stage.get('destination_longitude'),
locationName=stage.get('location_name'),
locationLatitude=stage.get('location_latitude'),
locationLongitude=stage.get('location_longitude'),
selectedCompany=CompanyType(
uuid=stage.get('selected_company', {}).get('uuid', ''),
name=stage.get('selected_company', {}).get('name', ''),
taxId=stage.get('selected_company', {}).get('tax_id', ''),
country=stage.get('selected_company', {}).get('country', ''),
countryCode=stage.get('selected_company', {}).get('country_code', ''),
active=stage.get('selected_company', {}).get('active', True)
) if stage.get('selected_company') else None,
trips=[
TripType(
uuid=trip.get('uuid'),
name=trip.get('name'),
sequence=trip.get('sequence'),
company=CompanyType(
uuid=trip.get('company', {}).get('uuid', ''),
name=trip.get('company', {}).get('name', ''),
taxId=trip.get('company', {}).get('tax_id', ''),
country=trip.get('company', {}).get('country', ''),
countryCode=trip.get('company', {}).get('country_code', ''),
active=trip.get('company', {}).get('active', True)
) if trip.get('company') else None,
plannedLoadingDate=trip.get('planned_loading_date'),
actualLoadingDate=trip.get('actual_loading_date'),
realLoadingDate=trip.get('real_loading_date'),
plannedUnloadingDate=trip.get('planned_unloading_date'),
actualUnloadingDate=trip.get('actual_unloading_date'),
plannedWeight=trip.get('planned_weight'),
weightAtLoading=trip.get('weight_at_loading'),
weightAtUnloading=trip.get('weight_at_unloading')
) for trip in stage.get('trips', [])
]
) for stage in order_data.get('stages', [])
]
)
return order
else:
return None
except Exception as e:
print(f"Exception: {e}")
return None
team_schema = graphene.Schema(query=TeamQuery)