From a7cc90e75a25e2c049d6d3fdf17ec49bab7c250d Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Thu, 14 Aug 2025 11:55:41 -0400 Subject: [PATCH] members profile --- SQL/site_data.sql | 18 ++++++ app/api/services/account.py | 38 +++++++++++-- app/models/__init__.py | 4 +- app/models/members.py | 11 ++++ app/models/members_profile.py | 100 ++++++++++++++++++++++++++++++++++ 5 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 app/models/members_profile.py diff --git a/SQL/site_data.sql b/SQL/site_data.sql index abd1feb..7eba5f7 100644 --- a/SQL/site_data.sql +++ b/SQL/site_data.sql @@ -48,6 +48,24 @@ ALTER TABLE members ADD stripe_customer_id VARCHAR(100) ALTER TABLE members ADD profile_completed timestamp without time zone DEFAULT NULL; +CREATE TABLE members_profile( + id SERIAL, + uid uuid DEFAULT uuid_generate_v4(), + member_id INT REFERENCES members(id) UNIQUE NOT NULL, + practice VARCHAR(100) NOT NULL, + specialization VARCHAR(100) NOT NULL, + introduction TEXT, + added timestamp without time zone DEFAULT now(), + updated timestamp without time zone DEFAULT now() +); + +ALTER TABLE ONLY members_profile + ADD CONSTRAINT members_members_profile_id_key UNIQUE (id); + +ALTER TABLE members_profile OWNER TO merms_panel + + + -- UPDATE members SET account_name ='This is the account name'; -- UPDATE members SET firstname ='Firstname'; diff --git a/app/api/services/account.py b/app/api/services/account.py index ff0c597..641ef18 100644 --- a/app/api/services/account.py +++ b/app/api/services/account.py @@ -7,7 +7,7 @@ from marshmallow import ValidationError from app.api.enums import TransactionType # from app.api.integrations import SimbrellaIntegration from app.extensions import db -from app.models import Members, MembersActions +from app.models import Members, MembersActions, MembersProfile # from app.api.services.offer_analysis import OfferAnalysis from app.api.helpers.response_helper import ResponseHelper from werkzeug.security import generate_password_hash, check_password_hash @@ -153,14 +153,40 @@ class AccountService(BaseService): practice = str(validated_data.get('practice')) specialization = str(validated_data.get('specialization')) introduction = str(validated_data.get('introduction')) + profile_uid = '' + profile_completed = None + member = Members.get_member_by_uid(uid) + if member: + # Simulate processing + member_data = { + "member_id": member.id, + "uid": str(uid), + "username": member.username, + "account_name": member.account_name, + "firstname":member.firstname, + "lastname": member.lastname, + "email": member.email, + "room": member.uid, + "token": user_token + } + current_profile = MembersProfile.get_member_profile_by_member_id(member.id) + if current_profile is not None: + profile_uid=current_profile.uid + profile_completed = member.profile_completed + else: + profle_result = MembersProfile.create_member_profile(member.id, practice, specialization, introduction) + if profle_result: + profile_uid = profle_result.uid + if profile_uid is not None and profile_uid != '': + profile_completed = Members.set_member_profile_completed(member_data['uid']) - - calendar_data = { - "last_update": datetime.datetime.utcnow(), - "start_profile_called": "Doing nothing yet" + result_data = { + "profile_completed": profile_completed, + "profile_uid": profile_uid, + "last_update": datetime.datetime.utcnow() } - return ResponseHelper.success(data=calendar_data) + return ResponseHelper.success(data=result_data) except ValidationError as err: diff --git a/app/models/__init__.py b/app/models/__init__.py index 8b92821..c127306 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -21,13 +21,15 @@ from .provision_actions import ProvisionActions from .password_reset import PasswordReset from .member_product_refresh import MembersProductsRefresh from .members_products_settings import MembersProductsSettings +from .members_profile import MembersProfile + __all__ = ['Members','Customer', 'Account', 'Products', 'MembersProducts', 'MembersActions', 'MembersPending', 'ProductsDetails', 'ProvisionActions', 'MembersProductsRefresh','MembersProductsSettings', - 'PasswordReset', + 'PasswordReset','MembersProfile', 'Loan', 'Transaction', 'Repayment', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'TransactionOffer', 'RepaymentsData', 'Salary'] \ No newline at end of file diff --git a/app/models/members.py b/app/models/members.py index 5fad6a2..6ce5a6c 100644 --- a/app/models/members.py +++ b/app/models/members.py @@ -61,6 +61,17 @@ class Members(db.Model): return None return member + @classmethod + def set_member_profile_completed(cls, uid): + member = cls.query.filter_by(uid=str(uid)).first() + + if not member: + logger.info(f"User UID = {uid} found") + raise ValueError(f"Member with UID {uid} does not exist.") + + member.profile_completed = datetime.now(timezone.utc) + return member.profile_completed + @classmethod def add_member(cls, firstname, lastname, email, username,password, country): diff --git a/app/models/members_profile.py b/app/models/members_profile.py new file mode 100644 index 0000000..78644c4 --- /dev/null +++ b/app/models/members_profile.py @@ -0,0 +1,100 @@ +from datetime import datetime, timezone, timedelta +from itertools import product +from app.extensions import db +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import relationship +from dateutil.relativedelta import relativedelta +from datetime import timedelta +import logging +from sqlalchemy import and_, or_, not_ +from sqlalchemy.sql import func +import uuid + +logger = logging.getLogger(__name__) + +class MembersProfile(db.Model): + __tablename__ = 'members_profile' + + id = db.Column( + db.Integer, + primary_key=True, + autoincrement=True, + ) + + uid = db.Column(db.String(150), nullable=False) + member_id = db.Column(db.Integer, nullable=False) + practice = db.Column(db.String(100), nullable=False) + specialization = db.Column(db.String(100), nullable=False) + introduction = db.Column(db.String(3500), nullable=True) + 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()) + + @classmethod + def get_member_profile_by_member_id(cls, member_id): + member_profile = cls.query.filter_by(member_id=str(member_id)).first() + if not member_profile: + return None + return member_profile + + @classmethod + def get_member_profile_by_profile_uid(cls, profile_uid): + member_profile = cls.query.filter_by(uid=str(profile_uid)).first() + if not member_profile: + return None + return member_profile + + + @classmethod + def get_member_product_by_product_member_id(cls, member_id, product_id): + member_product = cls.query.filter_by(member_id=str(member_id), product_id=str(product_id)).first() + if not member_product: + return None + return member_product + + + @classmethod + def create_member_profile(cls, member_id ,practice,specialization,introduction): + # Create the subscription + ''' + merms_panel=# select * from members_profile; + id | uid | member_id | practice | specialization | introduction | added | updated + ----+-----+-----------+----------+----------------+--------------+-------+--------- + (0 rows) + ''' + + logger.info(f" Data for Profile Data {member_id} ,{practice} ,{specialization}, {introduction} ") + profile_data = cls( + uid=str(uuid.uuid4()), + member_id=member_id, + practice=practice, + specialization=specialization, + introduction=introduction, + added=datetime.now(timezone.utc), + updated=datetime.now(timezone.utc) + ) + try: + logger.info(f" About to Insert Profile Data {profile_data.member_id} ") + db.session.add(profile_data) + db.session.flush() + except IntegrityError as err: + logger.error(f" Error inserting profile data {err} -- ") + raise ValueError(f"Database integrity error: {err}") + return profile_data + + def to_dict(self): + """ + Convert the Loan object to a dictionary format for JSON serialization. + """ + return { + 'id': self.id, + 'uid': self.uid, + 'member_id': self.member_id, + 'practice': self.practice, + 'specialization': self.specialization, + 'introduction': self.dns_group, + 'added': self.added, + 'updated': self.updated + } + + def __repr__(self): + return f''