started on the emsil

This commit is contained in:
CHIEFSOFT\ameye
2025-06-28 19:39:21 -04:00
parent d331a4be76
commit e5bb4afea9
6 changed files with 121 additions and 30 deletions
+6
View File
@@ -41,6 +41,12 @@ class LoginService(BaseService):
member = Members.get_member_by_username(username) member = Members.get_member_by_username(username)
# pass22 = generate_password_hash(password) # pass22 = generate_password_hash(password)
# logger.info("Password generated = > {}".format(pass22) ) # logger.info("Password generated = > {}".format(pass22) )
if not member:
invalid_data = {
"error_message": "invalid username or password",
"message_key": "invalid_username_or_password",
}
return ResponseHelper.success(data=invalid_data)
pass_check = check_password_hash(member.password, password) pass_check = check_password_hash(member.password, password)
logger.info("Password check: {}".format(pass_check)) logger.info("Password check: {}".format(pass_check))
+49 -9
View File
@@ -2,16 +2,19 @@ from flask import session, jsonify
from app.models.loan import Loan from app.models.loan import Loan
from app.utils.logger import logger from app.utils.logger import logger
from app.api.services.base_service import BaseService from app.api.services.base_service import BaseService
from app.api.schemas.eligibility_check import EligibilityCheckSchema # from app.api.schemas.eligibility_check import EligibilityCheckSchema
from marshmallow import ValidationError from marshmallow import ValidationError
from app.api.enums import TransactionType # from app.api.enums import TransactionType
from app.api.integrations import SimbrellaIntegration # from app.api.integrations import SimbrellaIntegration
from app.extensions import db from app.extensions import db
from app.models import Offer, RACCheck, Members from app.models import Offer, MembersPending, Members
from app.api.services.offer_analysis import OfferAnalysis # from app.api.services.offer_analysis import OfferAnalysis
from app.api.helpers.response_helper import ResponseHelper from app.api.helpers.response_helper import ResponseHelper
from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.security import generate_password_hash, check_password_hash
from app.api.schemas.register import RegisterSchema from app.api.schemas.register import RegisterSchema
from flask_mail import Mail, Message
import datetime import datetime
import jwt import jwt
@@ -36,11 +39,19 @@ class RegisterService(BaseService):
with db.session.begin(): with db.session.begin():
validated_data = RegisterService.validate_data(data, RegisterSchema()) validated_data = RegisterService.validate_data(data, RegisterSchema())
# username = validated_data.get('username')
# password = validated_data.get('password')
# Simulate processing # Simulate processing
firstname = validated_data.get('firstname')
lastname = validated_data.get('lastname')
email = validated_data.get('email')
regData = MembersPending.add_members_pending( firstname, lastname, email)
# {
# "email": "ameye@chiefsoft.com",
# "firstname": "Olusesan",
# "lastname": "Ameye",
# "isChecked": true
# }
response_data = { response_data = {
"member_id": 0, "member_id": 0,
"uid": 0, "uid": 0,
@@ -90,7 +101,36 @@ class RegisterService(BaseService):
return True return True
def send_register_mail(signup_email, email_uid,last_row_id,firstname):
signup_data = {}
signup_data["id"] = last_row_id
signup_data["uid"] = email_uid
#'d8651e10-3279-4858-87da-b52936faa6f0'
jwt_part = jwt.encode(
{"user": signup_data, 'exp' : datetime.datetime.utcnow() + datetime.timedelta(minutes=3330)},
app.config["SECRET_KEY"],
algorithm="HS256"
)
link_url= str(panel_url) + '/csignup/' + jwt_part
print(link_url)
#firstname ='Name001'
msg = Message(
'verify your MERMS Account',
sender ='message@chiefsoft.com',
recipients = [signup_email,'ameye+merscopy@chiefsoft.com']
)
msg.body = f"""
Hello {firstname},
You received this message for account verification
Follow the link:{link_url}
For any Support
Reach Out
"""
mail.send(msg)
# { # {
+3 -1
View File
@@ -15,8 +15,10 @@ from .members import Members
from .products import Products from .products import Products
from .members_products import MembersProducts from .members_products import MembersProducts
from .members_actions import MembersActions from .members_actions import MembersActions
from .members_pending import MembersPending
__all__ = ['Members','Customer', 'Account', 'Products', __all__ = ['Members','Customer', 'Account', 'Products',
'MembersProducts', 'MembersActions', 'Loan', 'Transaction', 'Repayment', 'MembersProducts', 'MembersActions', 'MembersPending', 'Loan', 'Transaction', 'Repayment',
'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule', 'LoanCharge', 'Offer', 'Charge', 'RACCheck', 'LoanRepaymentSchedule',
'TransactionOffer', 'RepaymentsData', 'Salary'] 'TransactionOffer', 'RepaymentsData', 'Salary']
+2 -1
View File
@@ -47,7 +47,8 @@ class Members(db.Model):
member = cls.query.filter_by(username=str(username)).first() member = cls.query.filter_by(username=str(username)).first()
if not member: if not member:
raise ValueError(f"Username = {username} not found") raise None
#ValueError(f"Username = {username} not found")
return member return member
@classmethod @classmethod
+58 -19
View File
@@ -1,44 +1,56 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from app.extensions import db from app.extensions import db
from sqlalchemy.sql import func from sqlalchemy.sql import func
from sqlalchemy.exc import IntegrityError
class MembersPending(db.Model): class MembersPending(db.Model):
__tablename__ = 'members_pending' __tablename__ = 'members_pending'
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
uid = db.Column(db.String(150), nullable=False) uid = db.Column(db.String(150), nullable=False)
username = db.Column(db.String(25), nullable=False) firstname = db.Column(db.String(35), nullable=False)
password = db.Column(db.String(100), nullable=True) lastname = db.Column(db.String(35), nullable=True)
loc = db.Column(db.String(20), nullable=True) email = db.Column(db.String(35), nullable=False)
status = db.Column(db.Integer, default=1) status = db.Column(db.Integer, default=0)
added = db.Column(db.DateTime(timezone=False), server_default=func.now()) added = db.Column(db.DateTime(timezone=False), server_default=func.now())
updated = db.Column(db.DateTime(timezone=False), server_default=func.now(), onupdate=func.now()) updated = db.Column(db.DateTime(timezone=False), server_default=func.now(), onupdate=func.now())
email = db.Column(db.String(100), nullable=False)
account_name = db.Column(db.String(100), nullable=True)
firstname = db.Column(db.String(25), nullable=False)
lastname = db.Column(db.String(100), nullable=True)
def to_dict(self): def to_dict(self):
return { return {
"id": self.id, "id": self.id,
"uid": self.uid, "uid": self.uid,
"username": self.account_id, "firstname": self.firstname,
"account_id": self.username, "lastname": self.lastname,
"password": self.password, "email": self.email,
"loc": self.loc,
"status": self.status, "status": self.status,
"added": self.added.isoformat() if self.added else None, "added": self.added.isoformat() if self.added else None,
"updated": self.updated.isoformat() if self.updated else None, "updated": self.updated.isoformat() if self.updated else None
"email": self.email,
"account_name": self.account_name,
"firstname": self.firstname,
"lastname": self.lastname
} }
def __repr__(self): def __repr__(self):
return f'<Members {self.id} - {self.amount}>' return f'<Members {self.id} - {self.amount}>'
@classmethod
def add_members_pending(cls, firstname, lastname, email):
# Save the response
pending_data = cls(
firstname=firstname,
lastname=lastname,
email=email,
added=datetime.now(timezone.utc),
updated=datetime.now(timezone.utc)
)
try:
db.session.add(pending_data)
except IntegrityError as err:
raise ValueError(f"Database integrity error: {err}")
return pending_data
@classmethod @classmethod
def get_member_by_username(cls, username): def get_member_by_username(cls, username):
""" """
@@ -48,4 +60,31 @@ class MembersPending(db.Model):
if not member: if not member:
raise ValueError(f"Username = {username} not found") raise ValueError(f"Username = {username} not found")
return member return member
# {
# "email": "ameye@chiefsoft.com",
# "firstname": "Olusesan",
# "lastname": "Ameye",
# "isChecked": true
# }
'''
merms_panel=# \d members_pending
Table "public.members_pending"
Column | Type | Collation | Nullable | Default
-----------+-----------------------------+-----------+----------+---------------------------------------------
id | integer | | not null | nextval('members_pending_id_seq'::regclass)
uid | uuid | | | uuid_generate_v4()
firstname | character varying(35) | | not null |
lastname | character varying(35) | | not null |
email | character varying(35) | | not null |
status | integer | | | 0
added | timestamp without time zone | | | now()
updated | timestamp without time zone | | | now()
Indexes:
"members_pending_id_key" UNIQUE CONSTRAINT, btree (id)
merms_panel=#
'''
+3
View File
@@ -39,3 +39,6 @@ werkzeug
python-dateutil python-dateutil
Flask-Mail
pycountry