Untitled
unknown
plain_text
a year ago
21 kB
12
Indexable
from datetime import datetime
from typing import List, Optional
from sqlalchemy import update
from strawberry import mutation, type
from app.graphql.schema import Info
from app.graphql.types.product_type import (
ProductType,
ProductDataInput,
)
from app.graphql.types import UserType, UserRoleType
from app.models import User, FieldDetail, Validation, Product, ProductCountry
from app.actions.product_helper.product_helper import (
authUsrAndgetRqstStusId,
auth_and_get_delete_status,
update_last_approved_product,
update_product_country,
add_update_multiple_content_for_product_downstream,
add_downstream_product,
save_all_published_record,
)
@type
class SaveProductDataPayload:
field_details: List[ProductType]
success: bool
message: str = ""
@type
class DeleteProductDataPayload:
field_details: List[ProductType]
success: bool
message: str = ""
# Mutation for inserting data into MdmProduct and MdmProductField
@type
class ProductsMutation:
@mutation
async def save_product_data(self, info: Info, input: ProductDataInput) -> SaveProductDataPayload:
print("Starting save_product_data") # Debug statement
try:
user_regions = []
current_user = info.context.current_user.login
# Fetch the user
user = info.context.session.query(User).filter(User.login == current_user).first()
if not user:
return SaveProductDataPayload(field_details=[], success=False, message="User not found")
print(f"User found: {user.id}") # Debug statement
# Fetch user roles
user_roles = await info.context.load_user_roles_by_user_id.load(user.id)
print(f"User roles: {user_roles}") # Debug statement
is_super_admin = 'Super Admin' in user_roles
is_regional_admin = 'Regional Admin' in user_roles
print(f"is_super_admin: {is_super_admin}, is_regional_admin: {is_regional_admin}") # Debug statement
if is_regional_admin:
# Fetch user regions
query_result = await info.context.load_regions_by_user_id.load(user.id)
user_regions = [region.region_id for region in query_result]
print(f"User regions: {user_regions}") # Debug statement
if not user_regions:
return SaveProductDataPayload(field_details=[], success=False, message="You don't have proper region/role, please logout and login again")
for row in input.rows_data:
print(f"Processing row: {row}") # Debug statement
# Check REGION_ID
regionId = None if str(input.region_id).strip() == "" else int(input.region_id)
if regionId is None:
return SaveProductDataPayload(field_details=[], success=False, message="There is some issue with region, please logout and login again")
print(f"regionId : {regionId}") # Debug statement
# Check REQUEST_STATUS_ID
requestStatusId = -1 if str(row.request_status_id).strip() == "" else int(row.request_status_id)
createdById = None
createdDate = None
if requestStatusId in [-1, 7, 8, 10]:
createdById = current_user
createdDate = datetime.now()
else:
createdById = None if str(row.created_by_id).strip() == "" else str(row.created_by_id)
timestamp = str(row.created_date).strip()
date = None
if timestamp:
try:
date = datetime.strptime(timestamp, "%d-%b-%Y %H:%M:%S")
except ValueError:
date = datetime.fromisoformat(timestamp.replace("Z", "+00:00"))
createdDate = date if date else None
print(f"requestStatusId: {requestStatusId}, createdById: {createdById}, createdDate: {createdDate}") # Debug statement
# Print arguments before function call
print(f"Calling authUsrAndgetRqstStusId with submit_type: {input.submit_type}, requestStatusId: {requestStatusId}, is_regional_admin: {is_regional_admin}, is_super_admin: {is_super_admin}")
requestStatusId = authUsrAndgetRqstStusId(input.submit_type, requestStatusId, regionId in user_regions and is_regional_admin, is_super_admin)
print(f"New requestStatusId: {requestStatusId}") # Debug statement
# Prepare static and dynamic fields (excluding record_id for static_data)
static_data = {field: getattr(row, field) for field in row.__dict__.keys() if field != "record_id" and field != "product_fields" and field not in ["dwn_7", "dwn_8"]}
dynamic_data = {key: getattr(row, key) for key in row.__dict__.keys() if key == "product_fields"}
special_fields = {key: getattr(row, key) for key in row.__dict__.keys() if key in ["dwn_7", "dwn_8"]}
print("STATIC DATA: ", static_data)
print("DYNAMIC DATA: ", dynamic_data)
print("SPECIAL STATIC DATA: ", special_fields)
# Add calculated fields to static_data
# static_data["REQUEST_STATUS_ID"] = requestStatusId
# static_data["CREATED_BY_ID"] = createdById
# static_data["CREATED_DATE"] = createdDate
static_data["request_status_id"] = requestStatusId
static_data["created_by_id"] = createdById
static_data["created_date"] = createdDate
# Calculate seriesId and lastActive
series_id = int(row.series_id) if str(row.series_id).strip() else 1
series_id = series_id + 1 if requestStatusId in [4, 6] else series_id
last_active = 1 if requestStatusId == 7 else 0
static_data["series_id"] = series_id
static_data["last_active"] = last_active
# Check if the product and country combination exists in mdm_product_country
product_country = info.context.session.query(ProductCountry).filter(
ProductCountry.product_name == row.product_name,
ProductCountry.country_id == row.country_id,
ProductCountry.is_deleted == False
).first()
if product_country:
# Use the existing MDM_ID
static_data["mdm_id"] = product_country.id
else:
# Insert a new record into mdm_product_country
new_product_country = ProductCountry(
product_name=row.product_name,
country_id=row.country_id,
is_deleted=False
)
info.context.session.add(new_product_country)
info.context.session.commit()
info.context.session.refresh(new_product_country)
static_data["mdm_id"] = new_product_country.id
# Check if MDM_ID is provided (i.e., record exists)
if row.mdm_id:
stmt = update(Product).where(Product.mdm_id == row.mdm_id).values(current_record="0")
info.context.session.execute(stmt)
info.context.session.commit()
# Insert a new product record with CURRENT_RECORD = 1
new_product = Product(**static_data)
new_product.current_record = "1" # Set CURRENT_RECORD separately
new_product.updated_date = datetime.now()
new_product.updated_by_id = current_user
info.context.session.add(new_product)
info.context.session.commit()
info.context.session.refresh(new_product) # Refresh to get the new record ID
# Insert dynamic fields into ProductField
for field_name, field_value in dynamic_data.items():
field_detail = info.context.session.query(FieldDetail).filter_by(name=field_name).first()
if field_detail:
product_field = ProductField(
record_id=new_product.id,
field_id=field_detail.id,
field_value=field_value
)
info.context.session.add(product_field)
info.context.session.commit()
# Call Mutation.update_last_approved_product only if requestStatusId is 7
if requestStatusId == 7:
update_last_approved_product(info.context.session, static_data["mdm_id"], "insert")
updated_product_field = (
info.context.session.query(Product)
.all()
)
if input.submit_type.lower() == "approve":
if not add_update_multiple_content_for_product_downstream(info.context.session, input, current_user):
return SaveProductDataPayload(field_details=[], success=False, message="Failed to process downstream data")
return SaveProductDataPayload(field_details=updated_product_field, success=True, message="Product data inserted successfully")
except Exception as e:
info.context.session.rollback()
print(f"Error: {e}")
return SaveProductDataPayload(field_details=[], success=False, message=f"Error: {str(e)}")
finally:
info.context.session.close()
@mutation
async def delete_product_data(self, info: Info, input: ProductDataInput) -> DeleteProductDataPayload:
print("Starting delete_product_data") # Debug statement
try:
user_regions = []
current_user = info.context.current_user.login
#if input_data.submit_type == "delete":
print("Submit type is delete") # Debug statement
# Fetch the user
user = info.context.session.query(User).filter(User.login == current_user).first()
if not user:
return DeleteProductDataPayload(field_details=[], success=False, message="User not found")
print(f"User found: {user.id}") # Debug statement
# Fetch user roles
user_roles = await info.context.load_user_roles_by_user_id.load(user.id)
print(f"User roles: {user_roles}") # Debug statement
is_super_admin = 'Super Admin' in user_roles
is_regional_admin = 'Regional Admin' in user_roles
print(f"is_super_admin: {is_super_admin}, is_regional_admin: {is_regional_admin}") # Debug statement
if is_regional_admin:
# Fetch user regions
query_result = await info.context.load_regions_by_user_id.load(user.id)
user_regions = [region.region_id for region in query_result]
print(f"User regions: {user_regions}") # Debug statement
if not user_regions:
return DeleteProductDataPayload(field_details=[], success=False, message="You don't have proper region/role, please logout and login again")
for row in input.rows_data:
print(f"Processing row: {row}") # Debug statement
# Check REGION_ID
regionId = None if str(input.region_id).strip() == "" else int(input.region_id)
if regionId is None:
return DeleteProductDataPayload(field_details=[], success=False, message="There is some issue with region, please logout and login again")
print(f"regionId : {regionId}") # Debug statement
# Check REQUEST_STATUS_ID
requestStatusId = -1 if str(row.request_status_id).strip() == "" else int(row.request_status_id)
print(f"requestStatusId: {requestStatusId}") # Debug statement
# Validate required fields
recordId = row.record_id
mdmId = row.mdm_id
createdById = row.created_by_id
timestamp = str(row.created_date).strip()
date = None
try:
date = datetime.strptime(timestamp, "%d-%b-%Y %H:%M:%S") if timestamp else None
except ValueError:
try:
date = datetime.fromisoformat(timestamp.replace("Z", "+00:00"))
except ValueError:
print("Error parsing date")
return "Failed to parse date"
createdDate = date if date else None
countryId = row.country_id
if not all([recordId, mdmId, requestStatusId, createdById, createdDate, countryId]):
return DeleteProductDataPayload(field_details=[], success=False, message="There is some technical issue, Try again later.")
# Calculate delete status
is_deleted = auth_and_get_delete_status(input.submit_type, requestStatusId, current_user, regionId in user_regions and is_regional_admin, is_super_admin)
if is_deleted is None:
return DeleteProductDataPayload(field_details=[], success=False, message="You don't have proper privilege to do this operation for selected record(s)")
print(f"is_deleted: {is_deleted}") # Debug statement
# Set currentRecord and lastActive based on is_deleted
current_record = 1 if is_deleted <= 1 else 0
last_active = 1 if is_deleted == 0 else 0
print(f"current_record: {current_record}, last_active: {last_active}") # Debug statement
# Prepare static and dynamic fields
static_data = {field: getattr(row, field) for field in row.__dict__.keys() if field != "record_id" and field != "product_fields" and field not in ["dwn_7", "dwn_8"]}
dynamic_data = {key: getattr(row, key) for key in row.__dict__.keys() if key == "product_fields"}
special_fields = {key: getattr(row, key) for key in row.__dict__.keys() if key in ["dwn_7", "dwn_8"]}
print("STATIC DATA: ", static_data)
print("DYNAMIC DATA: ", dynamic_data)
print("SPECIAL STATIC DATA: ", special_fields)
# Add calculated fields to static_data
static_data["request_status_id"] = requestStatusId
static_data["created_by_id"] = createdById
static_data["created_date"] = createdDate
static_data["current_record"] = current_record
static_data["last_active"] = last_active
static_data["updated_date"] = datetime.now()
static_data["updated_by_id"] = current_user
static_data["is_deleted"] = is_deleted
# Update CURRENT_RECORD of all existing products with the same MDM_ID to 0
info.context.session.query(Product).filter(Product.mdm_id == row.mdm_id).update({"current_record": "0"})
info.context.session.commit()
if requestStatusId in [4, 10]:
# Fetch the previous approved product
prev_product = update_last_approved_product(info.context.session, mdmId, input.submit_type)
if prev_product is None:
return DeleteProductDataPayload(field_details=[], success=False, message="Failed to restore last approved record, please contact the administrator")
# Update SERIES_ID if requestStatusId is 10
if requestStatusId == 10:
prev_product.series_id += 1
print(f"Previous produc: {prev_product}")
elif requestStatusId == 7:
prev_apr_product = update_last_approved_product(info.context.session, mdmId, input.submit_type)
if prev_apr_product is None:
return DeleteProductDataPayload(field_details=[], success=False, message="Failed to restore last approved record, please contact the administrator")
# Insert the new product record
new_product = Product(**static_data)
info.context.session.add(new_product)
info.context.session.commit()
info.context.session.refresh(new_product) # Refresh to get the new record ID
# Insert dynamic fields into MdmProductField
for field_name, field_value in dynamic_data.items():
field_detail = info.context.session.query(FieldDetails).filter_by(field_name=field_name).first()
if field_detail:
product_field = ProductField(
record_id=new_product.record_id,
field_id=field_detail.field_id,
field_value=field_value
)
info.context.session.add(product_field)
info.context.session.commit()
if not update_product_country(info.context.session, new_product.mdm_id, requestStatusId, input.submit_type, new_product.product_name, new_product.record_id):
return DeleteProductDataPayload(field_details=[], success=False, message="Failed to update product country")
if requestStatusId in [4, 10] and prev_product is not None:
new_prev_product = Product(
mdm_id=prev_product.mdm_id,
request_status_id=prev_product.request_status_id,
is_deleted=prev_product.is_deleted,
product_phase=prev_product.product_phase,
jnj_full_compound_id=prev_product.jnj_full_compound_id,
created_date=prev_product.created_date,
created_by_id=prev_product.created_by_id,
series_id=prev_product.series_id,
jnj_flag=prev_product.jnj_flag,
updated_date=prev_product.updated_date,
reltio_id=prev_product.reltio_id,
product_status=prev_product.product_status,
updated_by_id=prev_product.updated_by_id,
country_id=prev_product.country_id,
group_type=prev_product.group_type,
current_record=1,
ta_sub_type=prev_product.ta_sub_type,
janssen_mstr_prdct_nm=prev_product.janssen_mstr_prdct_nm,
product_name=prev_product.product_name,
last_active=1
)
info.context.session.add(new_prev_product)
info.context.session.commit()
info.context.session.refresh(new_prev_product) # Get the new RECORD_ID
new_record_id = new_prev_product.record_id
old_record_id = prev_product.record_id
# Fetch related data from product_field table using old RECORD_ID
product_fields = info.context.session.query(ProductField).filter(ProductField.record_id == old_record_id).all()
# Update the fetched data with the new RECORD_ID and reinsert
for field in product_fields:
new_field = ProductField(
record_id=new_record_id,
field_id=field.field_id,
field_value=field.field_value
)
info.context.session.add(new_field)
info.context.session.commit()
#Update product-country table
if not update_product_country(info.context.session, new_prev_product.mdm_id, new_prev_product.request_status_id, input.submit_type, new_prev_product.product_name, new_record_id):
return DeleteProductDataPayload(field_details=[], success=False, message="Failed to update product country")
updated_product_field = (
info.context.session.query(Product)
.all()
)
return DeleteProductDataPayload(field_details=updated_product_field, success=False, message="Product data deleted successfully")
except Exception as e:
info.context.session.rollback()
print(f"Error: {e}")
raise
finally:
info.context.session.close() Editor is loading...
Leave a Comment