130 lines
3.8 KiB
Python
130 lines
3.8 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import List, Optional
|
|
|
|
|
|
# Dataclasses for raw data from primary_doc.xml files in all filings
|
|
@dataclass
|
|
class PrimaryDoc:
|
|
cik: str
|
|
fund_name: str
|
|
street1: str
|
|
city: str
|
|
state: str
|
|
zip_code: str
|
|
period_of_report: str
|
|
submission_type: str
|
|
report_calendar_year: str
|
|
signer_name: str
|
|
signer_title: str
|
|
signature_date: str
|
|
phone_number: Optional[str] = None
|
|
street2: Optional[str] = None
|
|
crd_number: Optional[str] = None
|
|
filer_sec_file_number: Optional[str] = None
|
|
lei_number: Optional[str] = None
|
|
report_type: Optional[str] = None
|
|
notice_explanation: Optional[str] = None
|
|
confidential_treatment: Optional[str] = None
|
|
npx_file_number: Optional[str] = None
|
|
explanatory_choice: Optional[str] = None
|
|
other_included_managers_count: Optional[str] = None
|
|
tx_printed_signature: Optional[str] = None
|
|
agent_for_service_name: Optional[str] = None
|
|
agent_for_service_address_street1: Optional[str] = None
|
|
agent_for_service_address_street2: Optional[str] = None
|
|
agent_for_service_address_city: Optional[str] = None
|
|
agent_for_service_address_state_country: Optional[str] = None
|
|
agent_for_service_address_zip_code: Optional[str] = None
|
|
is_amendment: Optional[bool] = None
|
|
amendment_no: Optional[str] = None
|
|
amendment_type: Optional[str] = None
|
|
de_novo_request_choice: Optional[str] = None
|
|
year_or_quarter: Optional[str] = None
|
|
conf_denied_expired: Optional[str] = None
|
|
included_managers: List["IncludedManager"] = field(default_factory=list)
|
|
registrant_type: Optional[str] = None
|
|
live_test_flag: Optional[str] = None
|
|
ccc: Optional[str] = None
|
|
contact_name: Optional[str] = None
|
|
contact_phone_number: Optional[str] = None
|
|
contact_email_address: Optional[str] = None
|
|
override_internet_flag: Optional[str] = None
|
|
confirming_copy_flag: Optional[str] = None
|
|
investment_company_type: Optional[str] = None
|
|
rpt_include_all_series_flag: Optional[str] = None
|
|
series_count: Optional[str] = None
|
|
report_series_class_infos: List["ReportSeriesClassInfo"] = field(
|
|
default_factory=list
|
|
)
|
|
series_reports: List["SeriesReport"] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class IncludedManager:
|
|
serial_no: str
|
|
form13f_file_number: Optional[str]
|
|
name: str
|
|
sec_file_number: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class VoteCategory:
|
|
category_type: str
|
|
|
|
|
|
@dataclass
|
|
class VoteRecord:
|
|
how_voted: str
|
|
shares_voted: float
|
|
management_recommendation: str
|
|
|
|
|
|
@dataclass
|
|
class ProxyTable:
|
|
"""Represents a single proxy vote table entry from the XML file."""
|
|
|
|
issuer_name: str
|
|
meeting_date: str # Consider converting to date object later
|
|
vote_description: str
|
|
shares_voted: float # Or int
|
|
shares_on_loan: float # Or int
|
|
|
|
# Optional fields from XML
|
|
cusip: Optional[str] = None
|
|
isin: Optional[str] = None
|
|
figi: Optional[str] = None
|
|
other_vote_description: Optional[str] = None
|
|
vote_source: Optional[str] = None
|
|
vote_series: Optional[str] = None
|
|
vote_other_info: Optional[str] = None
|
|
|
|
# Nested lists
|
|
vote_categories: List[VoteCategory] = field(default_factory=list)
|
|
vote_records: List[VoteRecord] = field(default_factory=list)
|
|
other_managers: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class ProxyVoteTable:
|
|
"""Container for all vote tables in a single filing."""
|
|
|
|
proxy_tables: List[ProxyTable] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class ClassInfo:
|
|
class_id: str
|
|
|
|
|
|
@dataclass
|
|
class ReportSeriesClassInfo:
|
|
series_id: str
|
|
class_infos: List[ClassInfo] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class SeriesReport:
|
|
id_of_series: str
|
|
name_of_series: Optional[str] = None
|
|
lei_of_series: Optional[str] = None
|