149 lines
5.0 KiB
Python
149 lines
5.0 KiB
Python
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
|
|
|
|
from app.api.types.data_types import MemberFileData
|
|
import uuid
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MembersWebfiles(db.Model):
|
|
__tablename__ = 'members_webfiles'
|
|
|
|
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)
|
|
member_uid = db.Column(db.String(100), nullable=False)
|
|
file_group = db.Column(db.String(25), nullable=False)
|
|
filename = db.Column(db.String(100), nullable=False)
|
|
save_filename = db.Column(db.String(100), nullable=False)
|
|
file_type = db.Column(db.String(50), nullable=False)
|
|
status = db.Column(db.Integer, nullable=True, default=1)
|
|
file_size = db.Column(db.Integer, nullable=True, default=0)
|
|
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 create_file_profile(cls, file_data: MemberFileData):
|
|
logger.info(
|
|
f"File Data {file_data.member_id} {file_data.member_uid} {file_data.file_group} {file_data.filename} {file_data.save_filename} {file_data.file_type} {file_data.file_size} ")
|
|
file_uid = str(uuid.uuid4())
|
|
file_save_data = cls(
|
|
uid=str(file_uid),
|
|
member_id=file_data.member_id,
|
|
member_uid=file_data.member_uid,
|
|
file_group=file_data.file_group,
|
|
filename=file_data.filename,
|
|
save_filename=file_data.save_filename,
|
|
file_type=file_data.file_type,
|
|
file_size=file_data.file_size,
|
|
added=datetime.now(timezone.utc),
|
|
updated=datetime.now(timezone.utc)
|
|
)
|
|
|
|
try:
|
|
logger.info(f"About to Insert Members File Data {file_data.member_id} ")
|
|
db.session.add(file_save_data)
|
|
db.session.commit()
|
|
# db.session.flush()
|
|
except IntegrityError as err:
|
|
logger.error(f" Error inserting file_save_data data {err} -- ")
|
|
raise ValueError(f"Database integrity error: {err}")
|
|
|
|
save_result = {
|
|
'file_uid': file_uid
|
|
}
|
|
return save_result, file_uid
|
|
|
|
@classmethod
|
|
def get_member_webfiles_by_member_id(cls, member_id):
|
|
member_webfile = cls.query.filter_by(member_id=str(member_id), file_group='WEBSITE').order_by(
|
|
cls.added.desc()).all()
|
|
|
|
if not member_webfile:
|
|
return None
|
|
return member_webfile
|
|
|
|
@classmethod
|
|
def get_member_webfiles_by_member_file_uid(cls, member_id, file_uid):
|
|
member_webfile = cls.query.filter_by(member_id=str(member_id), uid=str(file_uid)).first()
|
|
|
|
if not member_webfile:
|
|
return None
|
|
return member_webfile
|
|
|
|
@classmethod
|
|
def get_member_webfiles_by_file_uid(cls, file_uid):
|
|
member_webfile = cls.query.filter_by(uid=str(file_uid)).first()
|
|
|
|
if not member_webfile:
|
|
return None
|
|
return member_webfile
|
|
|
|
# @classmethod
|
|
# def get_member_webfiles_by_member_file_group(cls, member_id , file_group):
|
|
# member_webfile = cls.query.filter_by(member_id=str(member_id), web_files_list=str(file_group)).all()
|
|
#
|
|
# if not member_webfile:
|
|
# return None
|
|
# return member_webfile
|
|
|
|
@classmethod
|
|
def get_all_webfiles(cls, file_group=None, member_id=None, page=1, limit=20):
|
|
|
|
query = cls.query
|
|
logger.info(f"Get all payments back")
|
|
|
|
if member_id:
|
|
query = query.filter(cls.member_id == member_id)
|
|
|
|
if file_group:
|
|
query = query.filter(cls.file_group == file_group)
|
|
|
|
# Order by created_at descending (newest first)
|
|
query = query.order_by(cls.added.desc())
|
|
|
|
# Get total count before pagination
|
|
total_count = query.count()
|
|
|
|
# Apply pagination
|
|
offset = (page - 1) * limit
|
|
query = query.limit(limit).offset(offset)
|
|
|
|
return query.all(), total_count
|
|
|
|
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,
|
|
'member_uid': self.member_uid,
|
|
'file_group': self.file_group,
|
|
'filename': self.filename,
|
|
'save_filename': self.save_filename,
|
|
'file_type': self.file_type,
|
|
'status': self.status,
|
|
'file_size': self.file_size,
|
|
'added': self.added,
|
|
'updated': self.updated
|
|
}
|
|
|
|
def __repr__(self):
|
|
return f'<MembersWebfiles {self.id}>'
|