from sqlalchemy import Table, Column, String, MetaData, ForeignKey, JSON from sqlalchemy.sql import select, func from sqlalchemy.types import Integer, BigInteger, String, Boolean, TIMESTAMP, Numeric from sqlalchemy.dialects.postgresql import JSONB from biopro.db.base import Session from .base import Base class Collection(Base): __tablename__ = "collections" id = Column(Integer, primary_key=True) name = Column(String(255)) parent = Column(JSONB) controller_id = Column(Integer) type = Column(String(255)) description = Column(String(255)) deleted = Column(Boolean) created_at = Column(TIMESTAMP(timezone=True), server_default=func.now()) updated_at = Column(TIMESTAMP(timezone=True), onupdate=func.now()) @classmethod def create_collection(cls, collection_name, parent): with Session() as session: name = cls.check_name_duplicate(collection_name, parent, 0) collection = Collection( name = name, parent = parent, type= "folder", ) session.add(collection) session.commit() print('a', collection.id) return collection @classmethod def check_name_duplicate(cls, collection_name, parent, n): with Session() as session: result = session.query(Collection).filter(Collection.name == cls.generate_name(collection_name, n), Collection.parent == parent).first() if result is None: return cls.generate_name(collection_name, n) else: new_num = n + 1 # new_name = f"{collection_name}({new_num})" return cls.check_name_duplicate(collection_name, parent, new_num) @classmethod def generate_name(cls, collection_name, n): if n==0: return collection_name else: return f"{collection_name}({n})" @classmethod def find_collection(cls, collection_name, parent): with Session() as session: result = session.query(Collection).filter(Collection.name == collection_name, Collection.parent == parent).first() return result