Files
2026-02-14 14:53:44 -05:00

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}>'