GrantForge Bot
Deploy sha-9a5957fcdef15b7e2623f8b147cda6026475aee0 — source build (no GHCR)
3a3734f
Raw
History Blame Contribute Delete
4.82 kB
import datetime
import uuid
from sqlalchemy import Column, String, DateTime, Boolean, Text, JSON, Integer, Float, Index
from core.subscription.db import Base
class Grant(Base):
__tablename__ = "grants"
id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4()))
source_id = Column(String, unique=True, index=True, nullable=False)
name = Column(String, nullable=False)
program = Column(String, nullable=True)
status = Column(String, default="active", index=True)
url = Column(String, nullable=True)
deadline = Column(String, nullable=True)
source = Column(String, nullable=False)
instrument_type = Column(String, default="grant")
is_financial_instrument = Column(Boolean, default=False)
eligible_company_sizes = Column(JSON, nullable=True)
eligible_regions = Column(JSON, nullable=True)
eligible_beneficiaries = Column(JSON, nullable=True)
eligible_pkd = Column(JSON, nullable=True)
description = Column(Text, nullable=True)
program_goals = Column(Text, nullable=True)
eligibility_criteria = Column(Text, nullable=True)
operator = Column(String, nullable=True, index=True)
program_year = Column(Integer, nullable=True, index=True)
budget_min_pln = Column(Float, nullable=True)
budget_max_pln = Column(Float, nullable=True)
regulation_url = Column(String, nullable=True)
official_page_url = Column(String, nullable=True)
application_url = Column(String, nullable=True)
catalog_hidden = Column(Boolean, default=False, index=True)
completeness_score = Column(Integer, default=0)
source_credibility_score = Column(Float, default=0.5)
eurlex_url = Column(String, nullable=True)
official_doc_url = Column(String, nullable=True)
precise_regulation_url = Column(String, nullable=True)
is_outdated_warning = Column(Boolean, default=False)
url_warning = Column(String, nullable=True)
fetched_at = Column(DateTime, default=lambda: datetime.datetime.now(datetime.timezone.utc))
last_verified = Column(DateTime, nullable=True)
search_document = Column(Text, nullable=True)
raw_data = Column(JSON, nullable=True)
class GrantVersion(Base):
"""Wersjonowanie kluczowych zmian (regulamin, termin, status)."""
__tablename__ = "grant_versions"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
grant_source_id = Column(String, index=True, nullable=False)
field_name = Column(String, nullable=False, index=True)
old_value = Column(Text, nullable=True)
new_value = Column(Text, nullable=True)
change_summary = Column(Text, nullable=True)
detected_at = Column(
DateTime,
default=lambda: datetime.datetime.now(datetime.timezone.utc),
index=True,
)
source = Column(String, default="import")
requires_verification = Column(Boolean, default=False)
class ResearchJob(Base):
"""Kolejka zadań badawczych (Live Research Layer)."""
__tablename__ = "research_jobs"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
job_type = Column(String, nullable=False, index=True)
target_id = Column(String, nullable=True, index=True)
target_url = Column(String, nullable=True)
status = Column(String, default="pending", index=True)
priority = Column(Integer, default=5)
payload = Column(JSON, nullable=True)
result = Column(JSON, nullable=True)
error_message = Column(Text, nullable=True)
created_at = Column(
DateTime,
default=lambda: datetime.datetime.now(datetime.timezone.utc),
index=True,
)
started_at = Column(DateTime, nullable=True)
completed_at = Column(DateTime, nullable=True)
class HumanVerificationItem(Base):
"""Human Verification Queue dla ważnych zmian."""
__tablename__ = "human_verification_queue"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
grant_source_id = Column(String, index=True, nullable=False)
change_type = Column(String, nullable=False)
field_name = Column(String, nullable=True)
old_value = Column(Text, nullable=True)
new_value = Column(Text, nullable=True)
summary = Column(Text, nullable=True)
status = Column(String, default="pending", index=True)
priority = Column(Integer, default=5)
created_at = Column(
DateTime,
default=lambda: datetime.datetime.now(datetime.timezone.utc),
index=True,
)
resolved_at = Column(DateTime, nullable=True)
resolved_by = Column(String, nullable=True)
resolution_note = Column(Text, nullable=True)
Index("ix_grant_versions_grant_field", GrantVersion.grant_source_id, GrantVersion.field_name)
Index("ix_research_jobs_status_priority", ResearchJob.status, ResearchJob.priority)