feat: implement researcher and publication management with sync functionality

This commit is contained in:
Mireya Cueto Garrido
2026-04-21 13:59:41 +02:00
parent 7717e2a5b2
commit a286c2e3ae
13 changed files with 698 additions and 23 deletions
+37 -5
View File
@@ -1,9 +1,11 @@
from sqlalchemy import Column, String, Boolean, Integer, DateTime, Text
from sqlalchemy import Column, String, Boolean, Integer, DateTime, Text, ForeignKey
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from .session import Base
import uuid
class Researcher(Base):
__tablename__ = "researchers"
@@ -11,18 +13,48 @@ class Researcher(Base):
orcid_id = Column(String(19), unique=True, nullable=False)
name = Column(Text)
authenticated = Column(Boolean, default=False)
access_token = Column(Text)
last_sync_at = Column(DateTime)
access_token = Column(Text, nullable=True)
last_sync_at = Column(DateTime(timezone=True), server_default=func.now())
publications = relationship(
"Publication",
back_populates="researcher",
cascade="all, delete-orphan"
)
sync_jobs = relationship(
"SyncJob",
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))
researcher_id = Column(UUID(as_uuid=True), ForeignKey("researchers.id"))
put_code = Column(Integer)
title = Column(Text)
journal = Column(Text)
doi = Column(Text)
pub_year = Column(Integer)
type = Column(Text)
hash_fingerprint = Column(Text)
last_modified = Column(DateTime)
last_modified = Column(DateTime(timezone=True))
researcher = relationship("Researcher", back_populates="publications")
class SyncJob(Base):
__tablename__ = "sync_jobs"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
researcher_id = Column(UUID(as_uuid=True), ForeignKey("researchers.id"))
status = Column(String(20))
new_records = Column(Integer, default=0)
updated_records = Column(Integer, default=0)
started_at = Column(DateTime(timezone=True), server_default=func.now())
finished_at = Column(DateTime(timezone=True))
researcher = relationship("Researcher", back_populates="sync_jobs")