From d4b2cd145732352bb4fa689742836dfa1b030fac Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Mon, 1 Sep 2025 10:39:08 -0400 Subject: [PATCH] my product data --- SQL/site_data.sql | 6 +- app/api/enums/__init__.py | 3 +- app/api/enums/settings_items_data.py | 62 +++++++++++++++++++ app/api/routes/routes.py | 8 +++ app/api/services/myproduct.py | 89 ++++++++++++++++++++++++++-- app/api/services/subscriptions.py | 31 +++------- 6 files changed, 166 insertions(+), 33 deletions(-) create mode 100644 app/api/enums/settings_items_data.py diff --git a/SQL/site_data.sql b/SQL/site_data.sql index 49dbe8c..fc2e26f 100644 --- a/SQL/site_data.sql +++ b/SQL/site_data.sql @@ -49,7 +49,7 @@ ALTER TABLE members ADD profile_completed timestamp without time zone DEFAULT NU ALTER TABLE members ADD option_name VARCHAR(100) REFERENCES subscription_options(option_name); ALTER TABLE members ADD next_billing timestamp without time zone; ALTER TABLE members ADD trial_end timestamp without time zone; - +-- bALTER TABLE members ADD option_name VARCHAR(100) REFERENCES subscription_options(option_name); CREATE TABLE members_profile( id SERIAL, @@ -317,7 +317,7 @@ ALTER TABLE members_products ADD primary_server VARCHAR(100); ALTER TABLE members_products ADD db_status INT DEFAULT 0; ALTER TABLE members_products ADD provision_status INT DEFAULT 0; ALTER TABLE members_products ADD p_file INT DEFAULT 0; -ALTER TABLE members_products ADD url_status INT DEFAULT 0 +ALTER TABLE members_products ADD url_status INT DEFAULT 0; -- INSERT INTO merms_products (name,description,status,product_id, banner) VALUES ('Personal Website','Your personal professional web presence',1,'A000001', 'banner.jpg'); @@ -496,7 +496,7 @@ ALTER TABLE payments_session OWNER TO merms_panel; -- added = db.Column(db.DateTime(timezone=True), server_default=func.now()) -- updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) - ALTER TABLE members ADD option_name VARCHAR(100) REFERENCES subscription_options(option_name); + CREATE TABLE payments ( diff --git a/app/api/enums/__init__.py b/app/api/enums/__init__.py index deb3f94..9a902eb 100644 --- a/app/api/enums/__init__.py +++ b/app/api/enums/__init__.py @@ -1,2 +1,3 @@ from .transaction_type import TransactionType -from .loan_status import LoanStatus \ No newline at end of file +from .loan_status import LoanStatus +from .settings_items_data import SettingsItemsData \ No newline at end of file diff --git a/app/api/enums/settings_items_data.py b/app/api/enums/settings_items_data.py new file mode 100644 index 0000000..f55cde3 --- /dev/null +++ b/app/api/enums/settings_items_data.py @@ -0,0 +1,62 @@ +from symtable import Class + +class SettingsItemsData: + + @staticmethod + def get_site_settings_data(): + data = { + "site_title": { "name": 'Title', "controls": 'TEXT', "active": True }, + "site_description": { "name": 'Description', "controls": 'TEXTAREA', "active": True }, + "site_logo_text": { "name": 'Logo Text', "controls": 'TEXT', "active": True }, + "site_contact_email": { "name": 'Email', "controls": 'TEXT', "active": True }, + "site_contact_phone": { "name": 'Phone', "controls": 'TEXT', "active": True }, + } + return data + + @staticmethod + def get_site_social_settings_data(): + data = { + "facebook": { "name": 'Facebook', "controls": 'TEXT', "active": True }, + "twitter": { "name": 'Twitter', "controls": 'TEXT', "active": True }, + "youtube": { "name": 'Youtube', "controls": 'TEXT', "active": True }, + } + return data + + @staticmethod + def get_site_home_settings(): + data = { + "banner_text": { "name": 'Banner Text', "controls": 'TEXT', "active": True }, + "banner_description": { "name": 'Banner Description', "controls": 'TEXTAREA', "active": True }, + } + return data + + @staticmethod + def get_site_footer_settings(): + data = { + "footer_description": { "name": 'Footer Description', "controls": 'TEXTAREA', "active": True }, + "boolean_footer_show_email": { "name": 'Show email in footer', "controls": 'SELECT_NO_YES', "active": True }, + "boolean_footer_show_made_by": { "name": 'Show made by in footer', "controls": 'SELECT_NO_YES', "active": True }, + "boolean_footer_show_socials": { "name": 'Show social in footer', "controls": 'SELECT_NO_YES', "active": True }, + } + return data + + @staticmethod + def get_site_about_items(): + data = { + "about_title": { "name": 'About Title', "controls": 'TEXT', "active": True }, + "about_description": { "name": 'About Details', "controls": 'TEXTAREA', "active": True }, + "about_extra_1": { "name": 'Extra About us', "controls": 'TEXTAREA', "active": True }, + "about_extra_2": { "name": 'More About us', "controls": 'TEXTAREA', "active": True }, + } + return data + + @staticmethod + def get_site_contact_items(): + data = { + "contact_title" : { "name": 'Contact Title', "controls": 'TEXT', "active": True }, + "contact_introduction": { "name": 'Extra Introduction', "controls": 'TEXTAREA', "active": True }, + } + return data + + + diff --git a/app/api/routes/routes.py b/app/api/routes/routes.py index 5d9c12d..470b5aa 100644 --- a/app/api/routes/routes.py +++ b/app/api/routes/routes.py @@ -194,6 +194,14 @@ def myproduct_settings(): response = MyProductsService.process_settings(data) return response +@api.route("/panel/myproduct/configuration", methods=["POST"]) +def myproduct_configuration(): + data = request.get_json() + # logger.info(f"Route Save MyProduct Settings Data ==>>>> {data}") + response = MyProductsService.product_configuration(data) + return response + + @api.route("/panel/myproduct/settings/values", methods=["POST"]) def myproduct_settings_values(): data = request.get_json() diff --git a/app/api/services/myproduct.py b/app/api/services/myproduct.py index 14f55b8..21f1058 100644 --- a/app/api/services/myproduct.py +++ b/app/api/services/myproduct.py @@ -1,4 +1,8 @@ +from urllib import request + from flask import session, jsonify + +from app.api.enums import SettingsItemsData from app.utils.logger import logger from app.api.services.base_service import BaseService from marshmallow import ValidationError @@ -59,14 +63,14 @@ class MyProductsService(BaseService): 'template_9': {'title': 'Template Name-9', 'template_id': 'fc8f0738-6500-4775-9895-2047cd275302', 'banner': 'file-icon/svg.png', 'active': '0'}, } - template_data =[] + template_data = [] for t in templates: template_data.append({ - 'id': t.id, - 'template_uid': t.uid, - 'title': t.name, - 'active': 1, - 'added': t.added.isoformat() if t.added else None + 'id': t.id, + 'template_uid': t.uid, + 'title': t.name, + 'active': 1, + 'added': t.added.isoformat() if t.added else None }) response_data = { @@ -414,3 +418,76 @@ class MyProductsService(BaseService): logger.error(f"An error occurred: {str(e)}", exc_info=True) db.session.rollback() return ResponseHelper.internal_server_error() + + @staticmethod + def product_configuration(data): + try: + with db.session.begin(): + validated_data = MyProductsService.validate_data(data, MyProductSchema()) + token = validated_data.get('token') + uid = validated_data.get('uid') + member_data = Members.get_member_by_uid(uid) + member_id = member_data.id + product_id = validated_data.get('product_id') + + product_subscription_uid = '' + product_data = Products.get_product_by_product_id(product_id) + product_description = ProductsDetails.get_product_details_with_product_id(product_id) + productDataStatus = product_data.status + + memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) + settings_data = [] + if memberSubscription is not None: + # logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") + product_subscription_uid = memberSubscription.uid + settingsFields = SettingsItemsData.get_site_settings_data() + templateData = [] + homeFields = SettingsItemsData.get_site_home_settings() + footerFields = SettingsItemsData.get_site_footer_settings() + contactFields = SettingsItemsData.get_site_contact_items() + socialFields = SettingsItemsData.get_site_social_settings_data() + aboutFields = SettingsItemsData.get_site_about_items() + + settings_items = { + "settings": {"title": 'Settings', "controls": 'settings', "active": 'active show', + "custom": False, "data": settingsFields}, + "home_tab": {"title": 'Home Page', "controls": 'home', "active": '', "custom": False, + "data": homeFields}, + "footer_tab": {"title": 'Footer', "controls": 'footer', "active": '', "custom": False, + "data": footerFields}, + "about_tab": {"title": 'About Page', "controls": 'about', "active": '', "custom": False, + "data": aboutFields}, + "contact_tab": {"title": 'Contact Page', "controls": 'contact', "active": '', "custom": False, + "data": contactFields}, + "social_tab": {"title": 'Socials', "controls": 'social', "active": '', "custom": False, + "data": socialFields}, + "template_tab": {"title": 'Template', "controls": 'template', "active": '', "custom": True, + "data": templateData}, + "color_scheme_tab": {"title": 'Color Scheme', "controls": 'color-scheme', "active": '', + "custom": True, "data": {}} + } + + # Simulate processing + response_data = { + "settings_items": settings_data, + "member_id": member_id, + "product_subscription_uid": product_subscription_uid, + } + + return ResponseHelper.success(data=response_data) + + except ValidationError as err: + + logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}") + db.session.rollback() + return ResponseHelper.unprocessable_entity(result_description="Validation exception") + + except ValueError as err: + logger.error(f"{getattr(err, 'messages', str(err))}") + db.session.rollback() + return ResponseHelper.error(result_description=str(err)) + + except Exception as e: + logger.error(f"An error occurred: {str(e)}", exc_info=True) + db.session.rollback() + return ResponseHelper.internal_server_error() diff --git a/app/api/services/subscriptions.py b/app/api/services/subscriptions.py index edd218f..8aaa44b 100644 --- a/app/api/services/subscriptions.py +++ b/app/api/services/subscriptions.py @@ -171,9 +171,14 @@ class SubscriptionsService(BaseService): return [] stripe_session = StripeIntegration.create_checkout_session_subscription(priceId, customerId) - logger.info(f"Inside Stripe_Session ===== : {stripe_session}") - logger.info(f"Inside Stripe_Session ID ===== : {stripe_session.id}") - PaymentsSession.add_payment_session(member_id, option_name, 'STRIPE', stripe_session.id) + if stripe_session: + logger.info(f"Inside Stripe_Session ===== : {stripe_session}") + logger.info(f"Inside Stripe_Session ID ===== : {stripe_session.id}") + PaymentsSession.add_payment_session(member_id, option_name, 'STRIPE', stripe_session.id) + else: + stripe_error = f"Stripe Returned {stripe_session}" + db.session.rollback() + return ResponseHelper.error(result_description=str(stripe_error)) # # product_id = validated_data.get('product_id') # product_subscription_uid='' @@ -191,26 +196,6 @@ class SubscriptionsService(BaseService): # product_subscription_external_url = memberSubscription.external_url # product_subscription_internal_url = memberSubscription.internal_url - # "banner": "banner.jpg", - # myproduct_data = { - # "myproudct": { - # "banner": product_data.banner, - # "description": product_description.details, - # "sale_text" : product_description.sale_text, - # "internal_url": product_subscription_internal_url, - # "external_url": product_subscription_external_url, - # "price_text": "90 days free and 3.95/Month", - # "product_id": product_data.product_id, - # "product_name": product_data.name, - # "product_subscription_uid": product_subscription_uid, - # "product_uid": product_data.uid, - # "promotion_text": "Start Free Today !", - # "subscription_uid": product_subscription_uid, - # "status": productDataStatus, - # "subscription_text": "Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn\u2019t support the vision then change it!", - # "title": "Your personal professional web presence" - # } - # } # Simulate processing response_data = {