from app import db from datetime import datetime from flask import url_for import json # Association table for document-tag many-to-many relationship document_tags = db.Table('document_tags', db.Column('document_id', db.Integer, db.ForeignKey('document.id'), primary_key=True), db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True) ) class Document(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(200), nullable=False) content = db.Column(db.Text, nullable=False, default='') created_date = db.Column(db.DateTime, default=datetime.utcnow) updated_date = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) tags = db.relationship('Tag', secondary=document_tags, backref=db.backref('documents', lazy='dynamic')) def __repr__(self): return f'' def to_dict(self): return { 'id': self.id, 'title': self.title, 'content': self.content, 'created_date': self.created_date.isoformat(), 'updated_date': self.updated_date.isoformat(), 'category_id': self.category_id, 'user_id': self.user_id, 'tags': [tag.name for tag in self.tags] } class Category(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) icon = db.Column(db.String(100), default='mdi-folder-outline') # Material Design Icons description = db.Column(db.String(200)) parent_id = db.Column(db.Integer, db.ForeignKey('category.id')) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) is_root = db.Column(db.Boolean, default=False) documents = db.relationship('Document', backref='category', lazy='dynamic') children = db.relationship('Category', backref=db.backref('parent', remote_side=[id]), lazy='dynamic') def __repr__(self): return f'' def to_dict(self): return { 'id': self.id, 'name': self.name, 'icon': self.icon, 'description': self.description, 'parent_id': self.parent_id, 'user_id': self.user_id, 'is_root': self.is_root, 'children': [child.to_dict() for child in self.children], 'documents': [doc.id for doc in self.documents] } class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) color = db.Column(db.String(20), default='#50fa7b') __table_args__ = ( db.UniqueConstraint('name', 'user_id', name='_tag_user_uc'), ) def __repr__(self): return f'' def to_dict(self): return { 'id': self.id, 'name': self.name, 'user_id': self.user_id, 'color': self.color, 'document_count': self.documents.count() }