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 sqlalchemy import Boolean, event, select, func, update
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Table
from sqlalchemy import Boolean, event, select, func, update, insert
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
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.models.document_department import document_department_association
@ -28,11 +30,19 @@ class Document(Base):
"User", back_populates="uploaded_documents")
is_enabled = Column(Boolean, default=True)
# Use document_department_association as the secondary for the relationship
verified = Column(Boolean, default=False) # Added verified column
departments = relationship(
"Department",
secondary=document_department_association,
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.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,
ForeignKey
)
from sqlalchemy import event, func, select, update
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, backref
from sqlalchemy import event, func, select, update, insert
from private_gpt.users.db.base_class import Base
from private_gpt.users.models.department import Department
from private_gpt.users.models.makerchecker import MakerChecker
class User(Base):
"""Models a user table"""
@ -51,6 +54,13 @@ class User(Base):
"departments.id"), nullable=False)
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):
"""Returns string representation of model instance"""
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_delete')
def update_total_users(mapper, connection, target):
department_id = target.department_id
print(f"Department ID is: {department_id}")
total_users = connection.execute(
select([func.count()]).select_from(User).where(
User.department_id == department_id)
).scalar()
print(f"Total users is: {total_users}")
connection.execute(
update(Department).values(total_users=total_users).where(
Department.id == department_id)