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.
@@ -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
+ )