Added makerchecker model

This commit is contained in:
Saurab-Shrestha9639*969**9858//852 2024-03-10 10:53:01 +05:45
parent e2bad96854
commit 35527620c0
3 changed files with 74 additions and 7 deletions

View File

@ -1,8 +1,10 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import Boolean, event, select, func, update from sqlalchemy import Boolean, event, select, func, update, insert
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship, backref
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Table from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from private_gpt.users.models.department import Department from private_gpt.users.models.department import Department
from private_gpt.users.models.makerchecker import MakerChecker
from private_gpt.users.db.base_class import Base from private_gpt.users.db.base_class import Base
from private_gpt.users.models.document_department import document_department_association from private_gpt.users.models.document_department import document_department_association
@ -28,11 +30,19 @@ class Document(Base):
"User", back_populates="uploaded_documents") "User", back_populates="uploaded_documents")
is_enabled = Column(Boolean, default=True) is_enabled = Column(Boolean, default=True)
# Use document_department_association as the secondary for the relationship # Use document_department_association as the secondary for the relationship
verified = Column(Boolean, default=False) # Added verified column
departments = relationship( departments = relationship(
"Department", "Department",
secondary=document_department_association, secondary=document_department_association,
back_populates="documents" back_populates="documents"
) )
# Relationship with MakerChecker
maker_checker_entry = relationship(
"MakerChecker",
backref=backref("document", uselist=False),
foreign_keys="[MakerChecker.record_id]",
primaryjoin="and_(MakerChecker.table_name=='document', MakerChecker.record_id==Document.id)",
)
# Event listeners for updating total_documents in Department # Event listeners for updating total_documents in Department
@event.listens_for(Document, 'after_insert') @event.listens_for(Document, 'after_insert')

View File

@ -0,0 +1,34 @@
from datetime import datetime
from sqlalchemy import Boolean, event, select, func, update
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from private_gpt.users.db.base_class import Base
from sqlalchemy import Enum
from enum import Enum as PythonEnum
class MakerCheckerStatus(PythonEnum):
PENDING = 'pending'
APPROVED = 'approved'
REJECTED = 'rejected'
class MakerCheckerActionType(PythonEnum):
INSERT = 'insert'
UPDATE = 'update'
class MakerChecker(Base):
"""Models a maker-checker table"""
__tablename__ = "maker_checker"
id = Column(Integer, primary_key=True, index=True)
table_name = Column(String(50), nullable=False)
record_id = Column(Integer, nullable=False)
action_type = Column(Enum(MakerCheckerActionType), nullable=False, default=MakerCheckerActionType.INSERT) # 'insert' or 'update'
status = Column(Enum(MakerCheckerStatus), nullable=False, default=MakerCheckerStatus.PENDING) # 'pending', 'approved', or 'rejected'
created_at = Column(DateTime, default=datetime.datetime.utcnow)
verified_at = Column(DateTime, nullable=True)
verified_by = Column(Integer, ForeignKey("users.id"), nullable=True)
def __repr__(self):
return f"<MakerChecker {self.table_name} {self.record_id}>"

View File

@ -9,10 +9,13 @@ from sqlalchemy import (
DateTime, DateTime,
ForeignKey ForeignKey
) )
from sqlalchemy import event, func, select, update from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm import relationship from sqlalchemy import event, func, select, update, insert
from private_gpt.users.db.base_class import Base from private_gpt.users.db.base_class import Base
from private_gpt.users.models.department import Department from private_gpt.users.models.department import Department
from private_gpt.users.models.makerchecker import MakerChecker
class User(Base): class User(Base):
"""Models a user table""" """Models a user table"""
@ -51,6 +54,13 @@ class User(Base):
"departments.id"), nullable=False) "departments.id"), nullable=False)
department = relationship("Department", back_populates="users") department = relationship("Department", back_populates="users")
maker_checker_entry = relationship(
"MakerChecker",
backref=backref("user", uselist=False),
foreign_keys="[MakerChecker.record_id]",
primaryjoin="and_(MakerChecker.table_name=='users', MakerChecker.record_id==User.id)",
)
def __repr__(self): def __repr__(self):
"""Returns string representation of model instance""" """Returns string representation of model instance"""
return "<User {fullname!r}>".format(fullname=self.fullname) return "<User {fullname!r}>".format(fullname=self.fullname)
@ -60,16 +70,29 @@ class User(Base):
) )
@event.listens_for(User, 'after_insert')
def create_maker_checker_entry(mapper, connection, target):
# Create a MakerChecker entry for the new User record
connection.execute(
insert(MakerChecker).values(
table_name='users',
record_id=target.id,
action_type='insert',
status='pending',
verified_at=None,
verified_by=None,
)
)
@event.listens_for(User, 'after_insert') @event.listens_for(User, 'after_insert')
@event.listens_for(User, 'after_delete') @event.listens_for(User, 'after_delete')
def update_total_users(mapper, connection, target): def update_total_users(mapper, connection, target):
department_id = target.department_id department_id = target.department_id
print(f"Department ID is: {department_id}")
total_users = connection.execute( total_users = connection.execute(
select([func.count()]).select_from(User).where( select([func.count()]).select_from(User).where(
User.department_id == department_id) User.department_id == department_id)
).scalar() ).scalar()
print(f"Total users is: {total_users}")
connection.execute( connection.execute(
update(Department).values(total_users=total_users).where( update(Department).values(total_users=total_users).where(
Department.id == department_id) Department.id == department_id)