Spaces:
Running
Running
File size: 4,817 Bytes
ce8f04a | 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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | 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)
|