Untitled

 avatar
unknown
plain_text
9 months ago
12 kB
15
Indexable
import logging
from datetime import datetime
from enum import Enum
from typing import List, Optional

from sqlalchemy import select, update
from strawberry import enum, input, mutation, type

from app.actions.product_association_helper.product_association_mutation_helper import (
    create_product_category,
    handle_add_submit_type,
    handle_update_submit_type,
    is_existing_association,
    save_product_category,
    save_subcategories,
)
from app.graphql.enums.product_association_submit_type import (
    ProductAssociationSubmitTypes,
)
from app.actions.category_or_topic_email_trigger.category_or_topic_email_trigger import (
    category_admin_distribution_list,
    product_association_email,
    send_email,
)
from app.graphql.resolvers.product_category_topic_resolver import product_categories
from app.config.mail import SMTP_CLIENT
from app.graphql.schema import Info
from app.graphql.types import UserRoleType, UserType
from app.graphql.types.product_category_type import ProductCategoryType
from app.models import (
    Product,
    ProductCountry,
    Group,
    ProductCategory,
    ProductCategoryVersion,
    ProductSubcategory,
    User,
    UserRole,
)

logger = logging.getLogger(__name__)

@type
class SaveAssociationResult:
    updated_associations: List[ProductCategoryType]
    success: bool
    message: str = ""


@input
class ProductAssociationInput:
    submit_type: ProductAssociationSubmitTypes
    version_id: Optional[int] = None
    prod_cat_grp: str
    mdm_id: int
    category_id: int
    subta_1: str
    sub_category_1: List[int]
    pro_cat_id: Optional[int] = None


@type
class DeleteAssociationResult:
    success: bool
    message: str = ""


@type
class ProductAssociationMutation:
    @mutation
    async def save_association(
        self, info: Info, input: ProductAssociationInput
    ) -> SaveAssociationResult:
        try:
            session = info.context.session
            updated_associations = []

            if not input.sub_category_1:
                return SaveAssociationResult(
                    message="No subcategories provided",
                    success=False,
                    updated_associations=[],
                )

            product_category = create_product_category(input)

            if is_existing_association(info, input):
                return SaveAssociationResult(
                    message="Selected combination already exists",
                    success=False,
                    updated_associations=[],
                )

            if input.submit_type == ProductAssociationSubmitTypes.ADD:
                if not handle_add_submit_type(info, product_category):
                    return SaveAssociationResult(
                        message="No version record found",
                        success=False,
                        updated_associations=[],
                    )
            else:
                if not handle_update_submit_type(info, input, product_category):
                    return SaveAssociationResult(
                        message="Failed to update the last active product category",
                        success=False,
                        updated_associations=[],
                    )

            pro_cat_id = save_product_category(
                info=info, product_category=product_category
            )
            if not pro_cat_id:
                return SaveAssociationResult(
                    message="Failed to save the product category",
                    success=False,
                    updated_associations=[],
                )

            if not save_subcategories(info, input, pro_cat_id):
                return SaveAssociationResult(
                    message="Failed to save the product subcategories",
                    success=False,
                    updated_associations=[],
                )

            updated_associations.append(pro_cat_id)

            topic_names = []
            for subcategory_id in input.sub_category_1:
                topic_name_query = select(Group).where(Group.id == subcategory_id)
                topic = session.execute(topic_name_query).scalar_one_or_none()
                if topic:
                    topic_names.append(topic.name)
            topics_names = ", ".join(topic_names)

            product_country_query = select(ProductCountry).where(ProductCountry.id == input.mdm_id)
            product_country = session.execute(product_country_query).scalar_one()

            distribution_list = await category_admin_distribution_list(session)
            product_name_query = select(Product).where(Product.id == input.mdm_id)
            product_name = session.execute(product_name_query).scalar_one()
            category_name_query = select(Group).where(Group.id == input.category_id)
            category_name = session.execute(category_name_query).scalar_one()
            creator_email_query = select(User).where(
                User.login == info.context.current_user.login
            )
            creator_email = session.execute(creator_email_query).scalar_one()
            subject = f'INFORM-iMedical MDM - Product "{product_name.product_name}" with Category "{category_name.name}" is saved successfully.'
            product_association_resolver = await product_association_email(session, input.version_id)

            if not product_association_resolver:
                body = (f"Below association saved successfully:<br><br>"
                    f"Functional Group: {input.prod_cat_grp}<br>"
                    f"Product: {product_name.product_name}<br>"
                    f"Category: {category_name.name}<br>"
                    f"Country: {product_country.countries.name}<br>"
                    f"TA Sub Type: {input.subta_1}<br>"
                    f"Topics: {topics_names}<br>")
                
                # Run the mailer to execute the email template
                await send_email(
                    distribution_list, creator_email=creator_email, subject=subject, body=body
                )
            elif product_association_resolver:
                for resolver in product_association_resolver:
                    resolver_topic_names = [
                        subcategory.group.name for subcategory in resolver.product_subcategory
                    ]
                    resolver_topics_names = ", ".join(resolver_topic_names)
                body = (f"Below association saved successfully:<br><br>"
                    f"Functional Group: {input.prod_cat_grp}<br>"
                    f"Product: {product_name.product_name}<br>"
                    f"Category: {category_name.name}<br>"
                    f"Country: {product_country.countries.name}<br>"
                    f"TA Sub Type: {input.subta_1}<br>"
                    f"Topics: {topics_names}<br><br>"
                    f"Previously saved association is given below:<br><br>"
                    f"Functional Group: {product_association_resolver.prod_cat_grp}<br>"
                    f"Product: {product_association_resolver.product_country.product_name}<br>"
                    f"Category: {product_association_resolver.group.name}<br>"
                    f"Country: {product_association_resolver.product_country.country.name}<br>"
                    f"TA Sub Type: {product_association_resolver.ta_sub_type}<br>"
                    f"Topics: {resolver_topics_names}<br>")
                    
                # Run the mailer to execute the email template
                await send_email(
                    distribution_list, creator_email=creator_email, subject=subject, body=body
                )

            return SaveAssociationResult(
                message="Association saved successfully",
                success=True,
                updated_associations=updated_associations,
            )

        except Exception as e:
            return SaveAssociationResult(
                message=f"An error occurred: {str(e)}",
                success=False,
                updated_associations=[],
            )

    @mutation
    async def delete_association(
        self, info: Info, input: list[ProductAssociationInput]
    ) -> DeleteAssociationResult:
        try:
            session = info.context.session
            for row in input:
                # Fetch the product category by ID
                product_category = session.get(
                    ProductCategory, row.pro_cat_id
                )
                if not product_category:
                    return DeleteAssociationResult(
                        message="Product category not found", success=False
                    )

                # Update the product category to mark it as inactive and deleted
                product_category.last_active = 0
                product_category.is_deleted = 1
                product_category.updated_date = datetime.now()
                product_category.updated_by_id = info.context.current_user.login

                # Commit the changes to the database
                session.commit()

                topic_names = []
                for subcategory_id in row.sub_category_1:
                    topic_name_query = select(Group).where(Group.id == subcategory_id)
                    topic = session.execute(topic_name_query).scalar_one_or_none()
                    if topic:
                        topic_names.append(topic.name)
                topics_names = ", ".join(topic_names)

                product_country_query = select(ProductCountry).where(ProductCountry.id == row.mdm_id)
                product_country = session.execute(product_country_query).scalar_one()

                distribution_list = await category_admin_distribution_list(session)
                product_name_query = select(Product).where(Product.id == row.mdm_id)
                product_name = session.execute(product_name_query).scalar_one()
                category_name_query = select(Group).where(Group.id == row.category_id)
                category_name = session.execute(category_name_query).scalar_one()
                creator_email_query = select(User).where(
                    User.login == product_category.created_by_id
                )
                creator_email = session.execute(creator_email_query).scalar_one()
                subject = f'INFORM-iMedical MDM - Product "{product_name.product_name}" with Category "{category_name.name}" is deleted successfully.'
                body = (f"Below association has been deleted successfully:<br><br>"
                f"Functional Group: {product_category.prod_cat_grp}<br>"
                f"Product: {product_name.product_name}<br>"
                f"Category: {category_name.name}<br>"
                f"Country: {product_country.countries.name}<br>"
                f"TA Sub Type: {product_category.ta_sub_type}<br>"
                f"Topics: {topics_names}<br>")
                # Run the mailer to execute the email template
                await send_email(
                    distribution_list, creator_email=creator_email, subject=subject, body=body
                )

                return DeleteAssociationResult(
                    message="Product association deleted successfully", success=True
                )

        except Exception as e:
            return DeleteAssociationResult(
                message=f"An error occurred: {str(e)}", success=False
            )
Editor is loading...
Leave a Comment