diff --git a/private_gpt/users/models/document.py b/private_gpt/users/models/document.py index 3fdf2288..aacd2b5f 100644 --- a/private_gpt/users/models/document.py +++ b/private_gpt/users/models/document.py @@ -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') diff --git a/private_gpt/users/models/makerchecker.py b/private_gpt/users/models/makerchecker.py new file mode 100644 index 00000000..07924869 --- /dev/null +++ b/private_gpt/users/models/makerchecker.py @@ -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"" diff --git a/private_gpt/users/models/user.py b/private_gpt/users/models/user.py index ad3d562f..97b5b205 100644 --- a/private_gpt/users/models/user.py +++ b/private_gpt/users/models/user.py @@ -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 "".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)