Models-and-Data: First working version
This commit is contained in:
188
Models-and-Data/models.py
Normal file
188
Models-and-Data/models.py
Normal file
@@ -0,0 +1,188 @@
|
||||
from typing import Optional
|
||||
import datetime
|
||||
|
||||
from sqlalchemy import Column, Date, DateTime, Enum, ForeignKeyConstraint, Identity, Integer, PrimaryKeyConstraint, Table, Text
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
class Affiliation(Base):
|
||||
__tablename__ = 'affiliation'
|
||||
__table_args__ = (
|
||||
PrimaryKeyConstraint('org_name', name='affiliation_pkey'),
|
||||
)
|
||||
|
||||
org_name: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
website: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
country: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
|
||||
person_affiliation: Mapped[list['PersonAffiliation']] = relationship('PersonAffiliation', back_populates='affiliation')
|
||||
|
||||
|
||||
class Conference(Base):
|
||||
__tablename__ = 'conference'
|
||||
__table_args__ = (
|
||||
PrimaryKeyConstraint('year', name='conference_pkey'),
|
||||
)
|
||||
|
||||
year: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||||
location: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
|
||||
paper: Mapped[list['Paper']] = relationship('Paper', back_populates='conference')
|
||||
|
||||
|
||||
class Person(Base):
|
||||
__tablename__ = 'person'
|
||||
__table_args__ = (
|
||||
PrimaryKeyConstraint('email', name='person_pkey'),
|
||||
)
|
||||
|
||||
email: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
first_name: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
last_name: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
|
||||
paper: Mapped[list['Paper']] = relationship('Paper', back_populates='person')
|
||||
person_affiliation: Mapped[list['PersonAffiliation']] = relationship('PersonAffiliation', back_populates='person')
|
||||
paper_author: Mapped[list['PaperAuthor']] = relationship('PaperAuthor', back_populates='person')
|
||||
|
||||
|
||||
class Topic(Base):
|
||||
__tablename__ = 'topic'
|
||||
__table_args__ = (
|
||||
PrimaryKeyConstraint('topic_id', name='topic_pkey'),
|
||||
)
|
||||
|
||||
topic_id: Mapped[int] = mapped_column(Integer, Identity(start=1, increment=1, minvalue=1, maxvalue=2147483647, cycle=False, cache=1), primary_key=True)
|
||||
topic_name: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
|
||||
paper: Mapped[list['Paper']] = relationship('Paper', secondary='paper_topic', back_populates='topic')
|
||||
reviewer: Mapped[list['Reviewer']] = relationship('Reviewer', secondary='expertise', back_populates='topic')
|
||||
|
||||
|
||||
class Paper(Base):
|
||||
__tablename__ = 'paper'
|
||||
__table_args__ = (
|
||||
ForeignKeyConstraint(['contact_email'], ['person.email'], name='paper_contact_email_fkey'),
|
||||
ForeignKeyConstraint(['year'], ['conference.year'], name='paper_year_fkey'),
|
||||
PrimaryKeyConstraint('paper_id', name='paper_pkey')
|
||||
)
|
||||
|
||||
paper_id: Mapped[int] = mapped_column(Integer, Identity(start=1, increment=1, minvalue=1, maxvalue=2147483647, cycle=False, cache=1), primary_key=True)
|
||||
title: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
abstract: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
filename: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
contact_email: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
year: Mapped[int] = mapped_column(Integer, nullable=False)
|
||||
|
||||
person: Mapped['Person'] = relationship('Person', back_populates='paper')
|
||||
conference: Mapped['Conference'] = relationship('Conference', back_populates='paper')
|
||||
topic: Mapped[list['Topic']] = relationship('Topic', secondary='paper_topic', back_populates='paper')
|
||||
history: Mapped[list['History']] = relationship('History', back_populates='paper')
|
||||
paper_author: Mapped[list['PaperAuthor']] = relationship('PaperAuthor', back_populates='paper')
|
||||
review: Mapped[list['Review']] = relationship('Review', back_populates='paper')
|
||||
|
||||
|
||||
class PersonAffiliation(Base):
|
||||
__tablename__ = 'person_affiliation'
|
||||
__table_args__ = (
|
||||
ForeignKeyConstraint(['email'], ['person.email'], name='person_affiliation_email_fkey'),
|
||||
ForeignKeyConstraint(['org_name'], ['affiliation.org_name'], name='person_affiliation_org_name_fkey'),
|
||||
PrimaryKeyConstraint('email', 'org_name', name='person_affiliation_pkey')
|
||||
)
|
||||
|
||||
email: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
org_name: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
from_date: Mapped[Optional[datetime.date]] = mapped_column(Date)
|
||||
to_date: Mapped[Optional[datetime.date]] = mapped_column(Date)
|
||||
|
||||
person: Mapped['Person'] = relationship('Person', back_populates='person_affiliation')
|
||||
affiliation: Mapped['Affiliation'] = relationship('Affiliation', back_populates='person_affiliation')
|
||||
|
||||
|
||||
class Reviewer(Person):
|
||||
__tablename__ = 'reviewer'
|
||||
__table_args__ = (
|
||||
ForeignKeyConstraint(['email'], ['person.email'], name='reviewer_email_fkey'),
|
||||
PrimaryKeyConstraint('email', name='reviewer_pkey')
|
||||
)
|
||||
|
||||
email: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
phone: Mapped[Optional[str]] = mapped_column(Text)
|
||||
|
||||
topic: Mapped[list['Topic']] = relationship('Topic', secondary='expertise', back_populates='reviewer')
|
||||
review: Mapped[list['Review']] = relationship('Review', back_populates='reviewer')
|
||||
|
||||
|
||||
t_expertise = Table(
|
||||
'expertise', Base.metadata,
|
||||
Column('email', Text, primary_key=True),
|
||||
Column('topic_id', Integer, primary_key=True),
|
||||
ForeignKeyConstraint(['email'], ['reviewer.email'], name='expertise_email_fkey'),
|
||||
ForeignKeyConstraint(['topic_id'], ['topic.topic_id'], name='expertise_topic_id_fkey'),
|
||||
PrimaryKeyConstraint('email', 'topic_id', name='expertise_pkey')
|
||||
)
|
||||
|
||||
|
||||
class History(Base):
|
||||
__tablename__ = 'history'
|
||||
__table_args__ = (
|
||||
ForeignKeyConstraint(['paper_id'], ['paper.paper_id'], name='history_paper_id_fkey'),
|
||||
PrimaryKeyConstraint('paper_id', 'timestamp', name='history_pkey')
|
||||
)
|
||||
|
||||
paper_id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||||
timestamp: Mapped[datetime.datetime] = mapped_column(DateTime, primary_key=True)
|
||||
paper_status: Mapped[str] = mapped_column(Enum('SUBMITTED', 'UNDER_REVIEW', 'REVISION', 'RESUBMITTED', 'REJECTED', 'ACCEPTED', 'PUBLISHED', name='status'), nullable=False)
|
||||
notes: Mapped[Optional[str]] = mapped_column(Text)
|
||||
|
||||
paper: Mapped['Paper'] = relationship('Paper', back_populates='history')
|
||||
|
||||
|
||||
class PaperAuthor(Base):
|
||||
__tablename__ = 'paper_author'
|
||||
__table_args__ = (
|
||||
ForeignKeyConstraint(['email'], ['person.email'], name='paper_author_email_fkey'),
|
||||
ForeignKeyConstraint(['paper_id'], ['paper.paper_id'], name='paper_author_paper_id_fkey'),
|
||||
PrimaryKeyConstraint('paper_id', 'email', name='paper_author_pkey')
|
||||
)
|
||||
|
||||
paper_id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||||
email: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
rank: Mapped[int] = mapped_column(Integer, nullable=False, comment='author order')
|
||||
|
||||
person: Mapped['Person'] = relationship('Person', back_populates='paper_author')
|
||||
paper: Mapped['Paper'] = relationship('Paper', back_populates='paper_author')
|
||||
|
||||
|
||||
t_paper_topic = Table(
|
||||
'paper_topic', Base.metadata,
|
||||
Column('paper_id', Integer, primary_key=True),
|
||||
Column('topic_id', Integer, primary_key=True),
|
||||
ForeignKeyConstraint(['paper_id'], ['paper.paper_id'], name='paper_topic_paper_id_fkey'),
|
||||
ForeignKeyConstraint(['topic_id'], ['topic.topic_id'], name='paper_topic_topic_id_fkey'),
|
||||
PrimaryKeyConstraint('paper_id', 'topic_id', name='paper_topic_pkey')
|
||||
)
|
||||
|
||||
|
||||
class Review(Base):
|
||||
__tablename__ = 'review'
|
||||
__table_args__ = (
|
||||
ForeignKeyConstraint(['email'], ['reviewer.email'], name='review_email_fkey'),
|
||||
ForeignKeyConstraint(['paper_id'], ['paper.paper_id'], name='review_paper_id_fkey'),
|
||||
PrimaryKeyConstraint('paper_id', 'email', name='review_pkey'),
|
||||
{'comment': 'Scores range from 1 to 5'}
|
||||
)
|
||||
|
||||
paper_id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||||
email: Mapped[str] = mapped_column(Text, primary_key=True)
|
||||
merit: Mapped[int] = mapped_column(Integer, nullable=False)
|
||||
relevance: Mapped[int] = mapped_column(Integer, nullable=False)
|
||||
readability: Mapped[int] = mapped_column(Integer, nullable=False)
|
||||
originality: Mapped[int] = mapped_column(Integer, nullable=False)
|
||||
author_comments: Mapped[str] = mapped_column(Text, nullable=False)
|
||||
committee_comments: Mapped[Optional[str]] = mapped_column(Text)
|
||||
|
||||
reviewer: Mapped['Reviewer'] = relationship('Reviewer', back_populates='review')
|
||||
paper: Mapped['Paper'] = relationship('Paper', back_populates='review')
|
||||
Reference in New Issue
Block a user