-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathdocuments_metadata.py
More file actions
95 lines (83 loc) · 2.84 KB
/
documents_metadata.py
File metadata and controls
95 lines (83 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from datetime import datetime, timezone
from uuid import uuid4
from typing import List, Optional, Text
from sqlalchemy import (
Column,
String,
Integer,
ARRAY,
text,
DateTime,
Enum,
ForeignKey,
Table,
UniqueConstraint,
)
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, relationship
from app.db.models import Base
from app.db.tables.base_class import StatusEnum
doc_user_access = Table(
"doc_user_access",
Base.metadata,
Column(
"doc_id",
UUID(as_uuid=True),
ForeignKey("document_metadata.id", ondelete="CASCADE"),
),
Column("user_id", String(26), ForeignKey("users.id")),
UniqueConstraint("doc_id", "user_id", name="uq_doc_user_access_doc_user"),
)
class DocumentMetadata(Base):
__tablename__ = "document_metadata"
id: UUID = Column(
UUID(as_uuid=True), default=uuid4, primary_key=True, index=True, nullable=False
)
owner_id: Mapped[str] = Column(String, ForeignKey("users.id"), nullable=False)
name: str = Column(String)
s3_url: str = Column(String, unique=True)
created_at = Column(
DateTime(timezone=True),
default=datetime.now(timezone.utc),
nullable=False,
server_default=text("NOW()"),
)
size: Optional[int] = Column(Integer)
file_type: Optional[str] = Column(String)
tags: Optional[List[str]] = Column(ARRAY(String))
categories: Optional[List[str]] = Column(ARRAY(String))
status: Enum = Column(Enum(StatusEnum), default=StatusEnum.private)
file_hash: Optional[str] = Column(String)
access_to: Optional[List[str]] = Column(ARRAY(String))
update_access = relationship(
"User", secondary=doc_user_access, passive_deletes=True
)
owner = relationship("User", back_populates="owner_of")
comments = relationship(
"DocumentComment", back_populates="document", cascade="all, delete-orphan"
)
class DocumentComment(Base):
__tablename__ = "document_comments"
id: UUID = Column(
UUID(as_uuid=True), default=uuid4, primary_key=True, index=True, nullable=False
)
doc_id: UUID = Column(
UUID(as_uuid=True), ForeignKey("document_metadata.id", ondelete="CASCADE")
)
author_id: str = Column(String, ForeignKey("users.id"), nullable=False)
comment: str = Column(Text, nullable=False)
created_at = Column(
DateTime(timezone=True),
default=datetime.now(timezone.utc),
nullable=False,
server_default=text("NOW()"),
)
updated_at = Column(
DateTime(timezone=True),
default=datetime.now(timezone.utc),
onupdate=datetime.now(timezone.utc),
nullable=False,
server_default=text("NOW()"),
)
document = relationship("DocumentMetadata", back_populates="comments")
author = relationship("User", back_populates="comments")