64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
from sqlalchemy import Column, String, Integer, Boolean, DateTime, ForeignKey
|
|
from sqlalchemy.dialects.postgresql import UUID, JSONB
|
|
from sqlalchemy.orm import relationship
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
from app.db.session import Base
|
|
|
|
|
|
class Researcher(Base):
|
|
__tablename__ = "researchers"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
orcid_id = Column(String, unique=True, index=True, nullable=False)
|
|
name = Column(String, nullable=True)
|
|
authenticated = Column(Boolean, default=False)
|
|
last_sync_at = Column(DateTime, nullable=True)
|
|
|
|
publications = relationship("Publication", back_populates="researcher", cascade="all, delete-orphan")
|
|
|
|
|
|
class Publication(Base):
|
|
__tablename__ = "publications"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
|
|
researcher_id = Column(UUID(as_uuid=True), ForeignKey("researchers.id"), nullable=False)
|
|
researcher = relationship("Researcher", back_populates="publications")
|
|
|
|
# ORCID core
|
|
put_code = Column(Integer, index=True, nullable=False)
|
|
title = Column(String, nullable=True)
|
|
subtitle = Column(String, nullable=True)
|
|
type = Column(String, nullable=True)
|
|
|
|
# Journal / container
|
|
journal = Column(String, nullable=True)
|
|
|
|
# Dates
|
|
pub_year = Column(Integer, nullable=True)
|
|
pub_month = Column(Integer, nullable=True)
|
|
pub_day = Column(Integer, nullable=True)
|
|
|
|
# Identifiers / links
|
|
doi = Column(String, nullable=True)
|
|
url = Column(String, nullable=True)
|
|
|
|
# Description / citation
|
|
short_description = Column(String, nullable=True)
|
|
citation_type = Column(String, nullable=True)
|
|
citation_value = Column(String, nullable=True)
|
|
|
|
# Language / country
|
|
language_code = Column(String, nullable=True)
|
|
country = Column(String, nullable=True)
|
|
|
|
# Extra structured data
|
|
external_ids = Column(JSONB, nullable=True) # lista de external-id normalizados
|
|
contributors = Column(JSONB, nullable=True) # lista de autores/roles
|
|
|
|
# Tu campo existente
|
|
hash_fingerprint = Column(String, nullable=True)
|
|
last_modified = Column(DateTime, nullable=True, default=None)
|