unique-quartr 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- unique_quartr/constants/document_types.py +75 -0
- unique_quartr/constants/event_types.py +151 -0
- unique_quartr/endpoints/api.py +62 -0
- unique_quartr/endpoints/schemas.py +723 -0
- unique_quartr/service.py +158 -0
- unique_quartr/settings.py +46 -0
- unique_quartr-0.1.0.dist-info/LICENSE +1 -0
- unique_quartr-0.1.0.dist-info/METADATA +480 -0
- unique_quartr-0.1.0.dist-info/RECORD +10 -0
- unique_quartr-0.1.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from enum import IntEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DocumentType(IntEnum):
|
|
5
|
+
SLIDES = 5
|
|
6
|
+
REPORT = 6
|
|
7
|
+
QUARTERLY_REPORT_10Q = 7
|
|
8
|
+
EARNINGS_RELEASE_8K = 10
|
|
9
|
+
ANNUAL_REPORT_10K = 11
|
|
10
|
+
ANNUAL_REPORT = 12
|
|
11
|
+
ANNUAL_REPORT_20F = 13
|
|
12
|
+
EARNINGS_RELEASE_6K = 14
|
|
13
|
+
TRANSCRIPT = 15
|
|
14
|
+
INTERIM_REPORT = 17
|
|
15
|
+
ANNUAL_REPORT_40F = 18
|
|
16
|
+
PRESS_RELEASE = 19
|
|
17
|
+
EARNINGS_RELEASE = 20
|
|
18
|
+
IN_HOUSE_TRANSCRIPT = 22
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def form(self) -> str | None:
|
|
22
|
+
forms = {
|
|
23
|
+
self.QUARTERLY_REPORT_10Q: "10-Q",
|
|
24
|
+
self.EARNINGS_RELEASE_8K: "8-K",
|
|
25
|
+
self.ANNUAL_REPORT_10K: "10-K",
|
|
26
|
+
self.ANNUAL_REPORT_20F: "20-F",
|
|
27
|
+
self.EARNINGS_RELEASE_6K: "6-K",
|
|
28
|
+
self.ANNUAL_REPORT_40F: "40-F",
|
|
29
|
+
self.IN_HOUSE_TRANSCRIPT: "In-house transcript",
|
|
30
|
+
}
|
|
31
|
+
return forms.get(self)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def name(self) -> str:
|
|
35
|
+
names = {
|
|
36
|
+
self.SLIDES: "Slides",
|
|
37
|
+
self.REPORT: "Report",
|
|
38
|
+
self.QUARTERLY_REPORT_10Q: "Quarterly report",
|
|
39
|
+
self.EARNINGS_RELEASE_8K: "Earnings release",
|
|
40
|
+
self.ANNUAL_REPORT_10K: "Annual report",
|
|
41
|
+
self.ANNUAL_REPORT: "Annual report",
|
|
42
|
+
self.ANNUAL_REPORT_20F: "Annual report",
|
|
43
|
+
self.EARNINGS_RELEASE_6K: "Earnings release",
|
|
44
|
+
self.TRANSCRIPT: "Transcript",
|
|
45
|
+
self.INTERIM_REPORT: "Interim report",
|
|
46
|
+
self.ANNUAL_REPORT_40F: "Annual report",
|
|
47
|
+
self.PRESS_RELEASE: "Press release",
|
|
48
|
+
self.EARNINGS_RELEASE: "Earnings release",
|
|
49
|
+
self.IN_HOUSE_TRANSCRIPT: "In-house transcript",
|
|
50
|
+
}
|
|
51
|
+
return names[self]
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def emoji(self) -> str:
|
|
55
|
+
emojis = {
|
|
56
|
+
self.TRANSCRIPT: "🗒️",
|
|
57
|
+
self.SLIDES: "📊",
|
|
58
|
+
self.REPORT: "📄",
|
|
59
|
+
self.QUARTERLY_REPORT_10Q: "📑",
|
|
60
|
+
self.EARNINGS_RELEASE_8K: "📢",
|
|
61
|
+
self.ANNUAL_REPORT_10K: "📘",
|
|
62
|
+
self.ANNUAL_REPORT_20F: "📙",
|
|
63
|
+
self.EARNINGS_RELEASE_6K: "📣",
|
|
64
|
+
self.INTERIM_REPORT: "📜",
|
|
65
|
+
self.ANNUAL_REPORT_40F: "📕",
|
|
66
|
+
self.PRESS_RELEASE: "🗞️",
|
|
67
|
+
self.EARNINGS_RELEASE: "💰",
|
|
68
|
+
self.IN_HOUSE_TRANSCRIPT: "🎤",
|
|
69
|
+
}
|
|
70
|
+
return emojis[self]
|
|
71
|
+
|
|
72
|
+
def get_file_prefix(self) -> str:
|
|
73
|
+
if self.form:
|
|
74
|
+
return f"{self.name} ({self.form})"
|
|
75
|
+
return self.name
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
from enum import IntEnum, StrEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class EventType(StrEnum):
|
|
5
|
+
ANALYST_DAY = "Analyst Day"
|
|
6
|
+
ANNUAL_GENERAL_MEETING = "Annual General Meeting"
|
|
7
|
+
BUSINESS_COMBINATION = "Business Combination"
|
|
8
|
+
C_LEVEL_SITDOWN = "C-level Sitdown"
|
|
9
|
+
CAPITAL_MARKETS_DAY = "Capital Markets Day"
|
|
10
|
+
CAPITAL_RAISE = "Capital Raise"
|
|
11
|
+
CONFERENCE = "Conference"
|
|
12
|
+
EARNINGS_CALL = "Earnings Call"
|
|
13
|
+
EXTRAORDINARY_GENERAL_MEETING = "Extraordinary General Meeting"
|
|
14
|
+
FDA_ANNOUNCEMENT = "FDA Announcement"
|
|
15
|
+
FIRESIDE_CHAT = "Fireside Chat"
|
|
16
|
+
INVESTOR_DAY = "Investor Day"
|
|
17
|
+
M_AND_A_ANNOUNCEMENT = "M&A Announcement"
|
|
18
|
+
OUTLOOK_GUIDANCE_UPDATE = "Outlook / Guidance Update"
|
|
19
|
+
PARTNERSHIPS_COLLABORATIONS = "Partnerships / Collaborations"
|
|
20
|
+
PRODUCT_SERVICE_LAUNCH = "Product / Service Launch"
|
|
21
|
+
SLIDES = "Slides"
|
|
22
|
+
TRADING_UPDATE = "Trading Update"
|
|
23
|
+
UPDATE_BRIEFING = "Update / Briefing"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class EventSubType(IntEnum):
|
|
27
|
+
# Analyst Day
|
|
28
|
+
ANALYST_DAY = 33
|
|
29
|
+
|
|
30
|
+
# Annual General Meeting
|
|
31
|
+
AGM = 4
|
|
32
|
+
SCHEME_MEETING = 284
|
|
33
|
+
|
|
34
|
+
# Business Combination
|
|
35
|
+
BUSINESS_COMBINATION = 32
|
|
36
|
+
|
|
37
|
+
# C-level Sitdown
|
|
38
|
+
C_LEVEL_SITDOWN = 13
|
|
39
|
+
CEO_SITDOWN = 14
|
|
40
|
+
|
|
41
|
+
# Capital Markets Day
|
|
42
|
+
CMD = 2
|
|
43
|
+
|
|
44
|
+
# Capital Raise
|
|
45
|
+
CAPITAL_RAISE = 18
|
|
46
|
+
|
|
47
|
+
# Conference
|
|
48
|
+
CONFERENCE = 237
|
|
49
|
+
|
|
50
|
+
# Earnings Call
|
|
51
|
+
Q1 = 26
|
|
52
|
+
Q2 = 27
|
|
53
|
+
Q3 = 28
|
|
54
|
+
Q4 = 29
|
|
55
|
+
H1 = 35
|
|
56
|
+
H2 = 36
|
|
57
|
+
|
|
58
|
+
# Extraordinary General Meeting
|
|
59
|
+
EGM = 6
|
|
60
|
+
|
|
61
|
+
# FDA Announcement
|
|
62
|
+
FDA_ANNOUNCEMENT = 19
|
|
63
|
+
|
|
64
|
+
# Fireside Chat
|
|
65
|
+
FIRESIDE_CHAT = 12
|
|
66
|
+
|
|
67
|
+
# Investor Day
|
|
68
|
+
INVESTOR_DAY = 31
|
|
69
|
+
|
|
70
|
+
# M&A Announcement
|
|
71
|
+
M_AND_A_ANNOUNCEMENT = 17
|
|
72
|
+
|
|
73
|
+
# Outlook / Guidance Update
|
|
74
|
+
GUIDANCE = 8
|
|
75
|
+
|
|
76
|
+
# Partnerships / Collaborations
|
|
77
|
+
PARTNERSHIP = 10
|
|
78
|
+
COLLABORATION = 11
|
|
79
|
+
|
|
80
|
+
# Product / Service Launch
|
|
81
|
+
PRODUCT_LAUNCH = 23
|
|
82
|
+
SERVICE_LAUNCH = 24
|
|
83
|
+
|
|
84
|
+
# Slides
|
|
85
|
+
INVESTOR_PRESENTATION = 275
|
|
86
|
+
CORPORATE_PRESENTATION = 279
|
|
87
|
+
COMPANY_PRESENTATION = 283
|
|
88
|
+
|
|
89
|
+
# Trading Update
|
|
90
|
+
TRADING_UPDATE = 202
|
|
91
|
+
|
|
92
|
+
# Update / Briefing
|
|
93
|
+
STATUS_UPDATE = 21
|
|
94
|
+
INVESTOR_UPDATE = 239
|
|
95
|
+
ESG_UPDATE = 240
|
|
96
|
+
STUDY_UPDATE = 280
|
|
97
|
+
STUDY_RESULT = 281
|
|
98
|
+
KOL_EVENT = 285
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
EVENT_TYPE_MAPPING = {
|
|
102
|
+
EventType.ANALYST_DAY: [EventSubType.ANALYST_DAY],
|
|
103
|
+
EventType.ANNUAL_GENERAL_MEETING: [
|
|
104
|
+
EventSubType.AGM,
|
|
105
|
+
EventSubType.SCHEME_MEETING,
|
|
106
|
+
],
|
|
107
|
+
EventType.BUSINESS_COMBINATION: [EventSubType.BUSINESS_COMBINATION],
|
|
108
|
+
EventType.C_LEVEL_SITDOWN: [
|
|
109
|
+
EventSubType.C_LEVEL_SITDOWN,
|
|
110
|
+
EventSubType.CEO_SITDOWN,
|
|
111
|
+
],
|
|
112
|
+
EventType.CAPITAL_MARKETS_DAY: [EventSubType.CMD],
|
|
113
|
+
EventType.CAPITAL_RAISE: [EventSubType.CAPITAL_RAISE],
|
|
114
|
+
EventType.CONFERENCE: [EventSubType.CONFERENCE],
|
|
115
|
+
EventType.EARNINGS_CALL: [
|
|
116
|
+
EventSubType.Q1,
|
|
117
|
+
EventSubType.Q2,
|
|
118
|
+
EventSubType.Q3,
|
|
119
|
+
EventSubType.Q4,
|
|
120
|
+
EventSubType.H1,
|
|
121
|
+
EventSubType.H2,
|
|
122
|
+
],
|
|
123
|
+
EventType.EXTRAORDINARY_GENERAL_MEETING: [EventSubType.EGM],
|
|
124
|
+
EventType.FDA_ANNOUNCEMENT: [EventSubType.FDA_ANNOUNCEMENT],
|
|
125
|
+
EventType.FIRESIDE_CHAT: [EventSubType.FIRESIDE_CHAT],
|
|
126
|
+
EventType.INVESTOR_DAY: [EventSubType.INVESTOR_DAY],
|
|
127
|
+
EventType.M_AND_A_ANNOUNCEMENT: [EventSubType.M_AND_A_ANNOUNCEMENT],
|
|
128
|
+
EventType.OUTLOOK_GUIDANCE_UPDATE: [EventSubType.GUIDANCE],
|
|
129
|
+
EventType.PARTNERSHIPS_COLLABORATIONS: [
|
|
130
|
+
EventSubType.PARTNERSHIP,
|
|
131
|
+
EventSubType.COLLABORATION,
|
|
132
|
+
],
|
|
133
|
+
EventType.PRODUCT_SERVICE_LAUNCH: [
|
|
134
|
+
EventSubType.PRODUCT_LAUNCH,
|
|
135
|
+
EventSubType.SERVICE_LAUNCH,
|
|
136
|
+
],
|
|
137
|
+
EventType.SLIDES: [
|
|
138
|
+
EventSubType.INVESTOR_PRESENTATION,
|
|
139
|
+
EventSubType.CORPORATE_PRESENTATION,
|
|
140
|
+
EventSubType.COMPANY_PRESENTATION,
|
|
141
|
+
],
|
|
142
|
+
EventType.TRADING_UPDATE: [EventSubType.TRADING_UPDATE],
|
|
143
|
+
EventType.UPDATE_BRIEFING: [
|
|
144
|
+
EventSubType.STATUS_UPDATE,
|
|
145
|
+
EventSubType.INVESTOR_UPDATE,
|
|
146
|
+
EventSubType.ESG_UPDATE,
|
|
147
|
+
EventSubType.STUDY_UPDATE,
|
|
148
|
+
EventSubType.STUDY_RESULT,
|
|
149
|
+
EventSubType.KOL_EVENT,
|
|
150
|
+
],
|
|
151
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from string import Template
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from unique_toolkit._common.endpoint_builder import HttpMethods, build_api_operation
|
|
5
|
+
from unique_toolkit._common.endpoint_requestor import (
|
|
6
|
+
RequestContext,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from unique_quartr.settings import quartr_settings
|
|
10
|
+
|
|
11
|
+
from .schemas import (
|
|
12
|
+
PaginatedDocumentResponseDto,
|
|
13
|
+
PaginatedDocumentTypeResponseDto,
|
|
14
|
+
PaginatedEventResponseDto,
|
|
15
|
+
PublicV3DocumentsGetParametersQuery,
|
|
16
|
+
PublicV3DocumentTypesGetParametersQuery,
|
|
17
|
+
PublicV3EventsGetParametersQuery,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EmptyModel(BaseModel): ...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_quartr_context(*, company_id: str):
|
|
25
|
+
if quartr_settings.quartr_api_creds is None:
|
|
26
|
+
raise ValueError("Quartr API credentials are not set")
|
|
27
|
+
|
|
28
|
+
if company_id not in quartr_settings.quartr_api_activated_companies:
|
|
29
|
+
raise ValueError(f"Company {company_id} is not activated for Quartr API")
|
|
30
|
+
|
|
31
|
+
return RequestContext(
|
|
32
|
+
base_url="https://api.quartr.com",
|
|
33
|
+
headers={
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
"X-Api-Key": quartr_settings.quartr_api_creds.api_key,
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
QuartrEventsApiOperation = build_api_operation(
|
|
41
|
+
method=HttpMethods.GET,
|
|
42
|
+
path_template=Template("/public/v3/events"),
|
|
43
|
+
path_params_constructor=EmptyModel,
|
|
44
|
+
payload_constructor=PublicV3EventsGetParametersQuery,
|
|
45
|
+
response_model_type=PaginatedEventResponseDto,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
QuartrDocumentsApiOperation = build_api_operation(
|
|
49
|
+
method=HttpMethods.GET,
|
|
50
|
+
path_template=Template("/public/v3/documents"),
|
|
51
|
+
path_params_constructor=EmptyModel,
|
|
52
|
+
payload_constructor=PublicV3DocumentsGetParametersQuery,
|
|
53
|
+
response_model_type=PaginatedDocumentResponseDto,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
QuartrDocumentsTypesApiOperation = build_api_operation(
|
|
57
|
+
method=HttpMethods.GET,
|
|
58
|
+
path_template=Template("/public/v3/document-types"),
|
|
59
|
+
path_params_constructor=EmptyModel,
|
|
60
|
+
payload_constructor=PublicV3DocumentTypesGetParametersQuery,
|
|
61
|
+
response_model_type=PaginatedDocumentTypeResponseDto,
|
|
62
|
+
)
|