shahf8604 commited on
Commit
73f3860
·
1 Parent(s): 71dcc32

Feed tables data into databse table

Browse files
Dockerfile CHANGED
@@ -29,6 +29,7 @@ COPY --chown=user main.py /app/
29
  COPY --chown=user src /app/src
30
  COPY --chown=user alembic.ini /app/
31
  COPY --chown=user seed_vector_data.py /app/
 
32
 
33
  EXPOSE 7860
34
 
 
29
  COPY --chown=user src /app/src
30
  COPY --chown=user alembic.ini /app/
31
  COPY --chown=user seed_vector_data.py /app/
32
+ COPY --chown=user feed_data.py /app/
33
 
34
  EXPOSE 7860
35
 
alembic/versions/273997959ba7_add_6_models_in_database.py DELETED
@@ -1,32 +0,0 @@
1
- """Add 6 models in database
2
-
3
- Revision ID: 273997959ba7
4
- Revises:
5
- Create Date: 2026-03-13 11:51:55.126289
6
-
7
- """
8
- from typing import Sequence, Union
9
-
10
- from alembic import op
11
- import sqlalchemy as sa
12
-
13
-
14
- # revision identifiers, used by Alembic.
15
- revision: str = '273997959ba7'
16
- down_revision: Union[str, Sequence[str], None] = None
17
- branch_labels: Union[str, Sequence[str], None] = None
18
- depends_on: Union[str, Sequence[str], None] = None
19
-
20
-
21
- def upgrade() -> None:
22
- """Upgrade schema."""
23
- # ### commands auto generated by Alembic - please adjust! ###
24
- pass
25
- # ### end Alembic commands ###
26
-
27
-
28
- def downgrade() -> None:
29
- """Downgrade schema."""
30
- # ### commands auto generated by Alembic - please adjust! ###
31
- pass
32
- # ### end Alembic commands ###
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
alembic/versions/5d05c77fab33_generate_6_tables.py ADDED
@@ -0,0 +1,550 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """generate 6 tables
2
+
3
+ Revision ID: 5d05c77fab33
4
+ Revises:
5
+ Create Date: 2026-03-13 15:26:40.120103
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = '5d05c77fab33'
16
+ down_revision: Union[str, Sequence[str], None] = None
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Upgrade schema."""
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.create_table('auv_incidentbase',
25
+ sa.Column('incidentkey', sa.String(length=14), nullable=False),
26
+ sa.Column('IncidentNumber', sa.String(length=20), nullable=True),
27
+ sa.Column('IncidentExposureNumber', sa.String(length=5), nullable=True),
28
+ sa.Column('CompletedReportCode', sa.String(length=2), nullable=True),
29
+ sa.Column('CompletedReportDescrip', sa.String(length=50), nullable=True),
30
+ sa.Column('ReviewedReportCode', sa.String(length=2), nullable=True),
31
+ sa.Column('ReviewReportDescrip', sa.String(length=50), nullable=True),
32
+ sa.Column('PublicReleaseReportCode', sa.String(length=2), nullable=True),
33
+ sa.Column('PublicReleaseReportDescrip', sa.String(length=50), nullable=True),
34
+ sa.Column('DidNotArriveCode', sa.String(length=2), nullable=True),
35
+ sa.Column('DidNotArriveDescrip', sa.String(length=50), nullable=True),
36
+ sa.Column('AlarmDateTime', sa.DateTime(), nullable=True),
37
+ sa.Column('Alarmtime', sa.String(length=10), nullable=True),
38
+ sa.Column('Alarmdate', sa.String(length=10), nullable=True),
39
+ sa.Column('ArrivalDateTime', sa.DateTime(), nullable=True),
40
+ sa.Column('Arrivaltime', sa.String(length=10), nullable=True),
41
+ sa.Column('Arrivaldate', sa.String(length=10), nullable=True),
42
+ sa.Column('ControlledDateTime', sa.DateTime(), nullable=True),
43
+ sa.Column('Controlledtime', sa.String(length=10), nullable=True),
44
+ sa.Column('Controlleddate', sa.String(length=10), nullable=True),
45
+ sa.Column('ClearedDateTime', sa.DateTime(), nullable=True),
46
+ sa.Column('Clearedtime', sa.String(length=10), nullable=True),
47
+ sa.Column('Cleareddate', sa.String(length=10), nullable=True),
48
+ sa.Column('ResponseTime', sa.String(length=20), nullable=True),
49
+ sa.Column('ResponseTimediffseconds', sa.Integer(), nullable=True),
50
+ sa.Column('IncidentTotalTime1', sa.String(length=20), nullable=True),
51
+ sa.Column('IncidentTotalTimediffseconds', sa.Integer(), nullable=True),
52
+ sa.Column('District', sa.String(length=20), nullable=True),
53
+ sa.Column('Station', sa.String(length=20), nullable=True),
54
+ sa.Column('Shift', sa.String(length=10), nullable=True),
55
+ sa.Column('Alarms', sa.Integer(), nullable=True),
56
+ sa.Column('IncidentTypeCode', sa.String(length=10), nullable=True),
57
+ sa.Column('IncidentTypeDescrip', sa.String(length=255), nullable=True),
58
+ sa.Column('InitialDispatchCode', sa.String(length=10), nullable=True),
59
+ sa.Column('finaldispatchcode', sa.String(length=10), nullable=True),
60
+ sa.Column('MutualAidFlagCode', sa.String(length=2), nullable=True),
61
+ sa.Column('MutualAidTypeCode', sa.String(length=10), nullable=True),
62
+ sa.Column('MutualAidTypeDescrip', sa.String(length=255), nullable=True),
63
+ sa.Column('MutalAidIncidentNo', sa.String(length=50), nullable=True),
64
+ sa.Column('actiontaken1code', sa.String(length=10), nullable=True),
65
+ sa.Column('actiontaken1descip', sa.String(length=255), nullable=True),
66
+ sa.Column('actiontaken2code', sa.String(length=10), nullable=True),
67
+ sa.Column('actiontaken2descip', sa.String(length=255), nullable=True),
68
+ sa.Column('actiontaken3code', sa.String(length=10), nullable=True),
69
+ sa.Column('actiontaken3descip', sa.String(length=255), nullable=True),
70
+ sa.Column('ApparatusSuppressionCount', sa.Integer(), nullable=True),
71
+ sa.Column('ApparatusEMSCount', sa.Integer(), nullable=True),
72
+ sa.Column('ApparatusOtherCount', sa.Integer(), nullable=True),
73
+ sa.Column('ApparatusTotalCount', sa.Integer(), nullable=True),
74
+ sa.Column('PersonnelSuppressionCount', sa.Integer(), nullable=True),
75
+ sa.Column('PersonnelEMSCount', sa.Integer(), nullable=True),
76
+ sa.Column('PersonnelOtherCount', sa.Integer(), nullable=True),
77
+ sa.Column('PersonnelTotalCount', sa.Integer(), nullable=True),
78
+ sa.Column('MAidApparatusSuppressionCount', sa.Integer(), nullable=True),
79
+ sa.Column('MAidApparatusEMSCount', sa.Integer(), nullable=True),
80
+ sa.Column('MAidApparatusOtherCount', sa.Integer(), nullable=True),
81
+ sa.Column('MAidApparatusTotalCount', sa.Integer(), nullable=True),
82
+ sa.Column('MAidPersonnelSuppressionCount', sa.Integer(), nullable=True),
83
+ sa.Column('MaidPersonnelEMSCount', sa.Integer(), nullable=True),
84
+ sa.Column('MAidPersonnelOtherCount', sa.Integer(), nullable=True),
85
+ sa.Column('MaidPersonnelTotalCount', sa.Integer(), nullable=True),
86
+ sa.Column('LossProperty', sa.Float(), nullable=True),
87
+ sa.Column('LossContents', sa.Float(), nullable=True),
88
+ sa.Column('ValueProperty', sa.Float(), nullable=True),
89
+ sa.Column('ValueContents', sa.Float(), nullable=True),
90
+ sa.Column('LossTotal', sa.Float(), nullable=True),
91
+ sa.Column('ValueTotal', sa.Float(), nullable=True),
92
+ sa.Column('ValueSaved', sa.Float(), nullable=True),
93
+ sa.Column('DetectorAlertedCode', sa.String(length=10), nullable=True),
94
+ sa.Column('DetectorAlertedDescrip', sa.String(length=255), nullable=True),
95
+ sa.Column('HazardMaterialReleasedCode', sa.String(length=10), nullable=True),
96
+ sa.Column('HazardMaterialReleasedDescrip', sa.String(length=255), nullable=True),
97
+ sa.Column('PropertyUseCode', sa.String(length=10), nullable=True),
98
+ sa.Column('PropertyUseDescrip', sa.String(length=255), nullable=True),
99
+ sa.Column('MixedUseCode', sa.String(length=10), nullable=True),
100
+ sa.Column('MixedUseDescrip', sa.String(length=255), nullable=True),
101
+ sa.Column('StreetNumber', sa.String(length=50), nullable=True),
102
+ sa.Column('StreetPrefix', sa.String(length=20), nullable=True),
103
+ sa.Column('StreetName', sa.String(length=255), nullable=True),
104
+ sa.Column('StreetType', sa.String(length=20), nullable=True),
105
+ sa.Column('StreetSuffix', sa.String(length=20), nullable=True),
106
+ sa.Column('Apartment', sa.String(length=20), nullable=True),
107
+ sa.Column('City', sa.String(length=100), nullable=True),
108
+ sa.Column('State', sa.String(length=20), nullable=True),
109
+ sa.Column('ZipCode', sa.String(length=20), nullable=True),
110
+ sa.Column('AddressComposite', sa.Text(), nullable=True),
111
+ sa.Column('CityStateZipComposite', sa.Text(), nullable=True),
112
+ sa.Column('CensusTract', sa.String(length=20), nullable=True),
113
+ sa.Column('EmsProvidedCode', sa.String(length=2), nullable=True),
114
+ sa.Column('EMSProvidedDescrip', sa.String(length=50), nullable=True),
115
+ sa.Column('LocationTypeCode', sa.String(length=5), nullable=True),
116
+ sa.Column('LocationTypeDescrip', sa.String(length=100), nullable=True),
117
+ sa.Column('fatalfireservicecode', sa.String(length=2), nullable=True),
118
+ sa.Column('fatalfireservicedescrip', sa.String(length=100), nullable=True),
119
+ sa.Column('fatalciviliancode', sa.String(length=2), nullable=True),
120
+ sa.Column('fatalciviliandescrip', sa.String(length=100), nullable=True),
121
+ sa.Column('injuredfireservicecode', sa.String(length=2), nullable=True),
122
+ sa.Column('injuredfireservicedescrip', sa.String(length=100), nullable=True),
123
+ sa.Column('injuredciviliancode', sa.String(length=2), nullable=True),
124
+ sa.Column('injuredciviliandescrip', sa.String(length=100), nullable=True),
125
+ sa.Column('casualtiescode', sa.String(length=2), nullable=True),
126
+ sa.Column('casualtiesdescrip', sa.String(length=100), nullable=True),
127
+ sa.Column('priorityrespcode', sa.String(length=2), nullable=True),
128
+ sa.Column('priorityrespdescrip', sa.String(length=100), nullable=True),
129
+ sa.Column('crossstreetprefix', sa.String(length=20), nullable=True),
130
+ sa.Column('crossstreetname', sa.String(length=255), nullable=True),
131
+ sa.Column('crossstreettype', sa.String(length=20), nullable=True),
132
+ sa.Column('crossstreetsuffix', sa.String(length=20), nullable=True),
133
+ sa.Column('CrossStreetComposite', sa.Text(), nullable=True),
134
+ sa.Column('directions', sa.Text(), nullable=True),
135
+ sa.Column('county', sa.String(length=100), nullable=True),
136
+ sa.Column('mappage', sa.String(length=50), nullable=True),
137
+ sa.Column('hwycalloutrequestby', sa.String(length=50), nullable=True),
138
+ sa.Column('hwyinvestpolicecode', sa.String(length=10), nullable=True),
139
+ sa.Column('hwyinvetpolicedescrip', sa.String(length=255), nullable=True),
140
+ sa.Column('hwyofficer', sa.String(length=100), nullable=True),
141
+ sa.Column('hwybadgenumber', sa.String(length=20), nullable=True),
142
+ sa.Column('hwyreportnumber', sa.String(length=50), nullable=True),
143
+ sa.Column('hwycauseemergcode', sa.String(length=10), nullable=True),
144
+ sa.Column('hwycauseemergdescrip', sa.String(length=255), nullable=True),
145
+ sa.Column('hwycauseotherdescrip', sa.Text(), nullable=True),
146
+ sa.Column('hwyloecode', sa.String(length=10), nullable=True),
147
+ sa.Column('hwyloedescrip', sa.String(length=255), nullable=True),
148
+ sa.Column('hwyloeotherdescrip', sa.Text(), nullable=True),
149
+ sa.Column('hwyobstrcutioncode', sa.String(length=10), nullable=True),
150
+ sa.Column('hwyobstructiondescrip', sa.String(length=255), nullable=True),
151
+ sa.Column('hwyobstructionotherdescrip', sa.Text(), nullable=True),
152
+ sa.Column('hwynoservicecode', sa.String(length=2), nullable=True),
153
+ sa.Column('hwynoservicedescrip', sa.String(length=100), nullable=True),
154
+ sa.Column('hwyextinguishcode', sa.String(length=2), nullable=True),
155
+ sa.Column('hwyextinguishdescrip', sa.String(length=100), nullable=True),
156
+ sa.Column('hwycleanupcode', sa.String(length=2), nullable=True),
157
+ sa.Column('hwycleanupdescrip', sa.String(length=100), nullable=True),
158
+ sa.Column('hwyextractioncode', sa.String(length=2), nullable=True),
159
+ sa.Column('hwyextractiodescrip', sa.String(length=100), nullable=True),
160
+ sa.Column('hwyfirstaidcode', sa.String(length=2), nullable=True),
161
+ sa.Column('hwyfirstaidedescrip', sa.String(length=100), nullable=True),
162
+ sa.Column('hwydamagecode', sa.String(length=2), nullable=True),
163
+ sa.Column('hwydamagedescrip', sa.String(length=100), nullable=True),
164
+ sa.Column('hwyprivatedamcode', sa.String(length=2), nullable=True),
165
+ sa.Column('hwyprivatedescrip', sa.String(length=100), nullable=True),
166
+ sa.Column('hwycitycode', sa.String(length=2), nullable=True),
167
+ sa.Column('hwycitydescrip', sa.String(length=100), nullable=True),
168
+ sa.Column('hwyothercode', sa.String(length=2), nullable=True),
169
+ sa.Column('hwynotherdescrip', sa.String(length=100), nullable=True),
170
+ sa.Column('hwyothertext', sa.Text(), nullable=True),
171
+ sa.Column('water_used', sa.String(length=2), nullable=True),
172
+ sa.Column('water_used_quantity', sa.Float(), nullable=True),
173
+ sa.Column('foam_used', sa.String(length=2), nullable=True),
174
+ sa.Column('foam_used_quantity', sa.Float(), nullable=True),
175
+ sa.Column('oilzorb_used', sa.String(length=2), nullable=True),
176
+ sa.Column('oilzorb_used_quantity', sa.Float(), nullable=True),
177
+ sa.Column('other_used', sa.String(length=2), nullable=True),
178
+ sa.Column('other_used_quantity', sa.Float(), nullable=True),
179
+ sa.Column('codetectpresentcode', sa.String(length=2), nullable=True),
180
+ sa.Column('codetectpresentdescrip', sa.String(length=100), nullable=True),
181
+ sa.Column('cotypecode', sa.String(length=10), nullable=True),
182
+ sa.Column('cotypedescrip', sa.String(length=255), nullable=True),
183
+ sa.Column('copowersupplycode', sa.String(length=10), nullable=True),
184
+ sa.Column('copowersupplydescrip', sa.String(length=255), nullable=True),
185
+ sa.Column('cooperationcode', sa.String(length=10), nullable=True),
186
+ sa.Column('cooperationdescrip', sa.String(length=255), nullable=True),
187
+ sa.Column('coeffectivecode', sa.String(length=10), nullable=True),
188
+ sa.Column('coeffectivedescrip', sa.String(length=255), nullable=True),
189
+ sa.Column('cofailurecode', sa.String(length=10), nullable=True),
190
+ sa.Column('cofailuredescrip', sa.String(length=255), nullable=True),
191
+ sa.Column('codetectormfg', sa.String(length=100), nullable=True),
192
+ sa.Column('codetectormodel', sa.String(length=100), nullable=True),
193
+ sa.Column('cochildrencount', sa.Integer(), nullable=True),
194
+ sa.Column('coyouthscount', sa.Integer(), nullable=True),
195
+ sa.Column('coadultscount', sa.Integer(), nullable=True),
196
+ sa.Column('coseniorscount', sa.Integer(), nullable=True),
197
+ sa.Column('latitude', sa.Float(), nullable=True),
198
+ sa.Column('longitude', sa.Float(), nullable=True),
199
+ sa.Column('changedate', sa.DateTime(), nullable=True),
200
+ sa.Column('IncidentDateTime', sa.DateTime(), nullable=True),
201
+ sa.Column('Incidenttime', sa.String(length=10), nullable=True),
202
+ sa.Column('Incidentdate', sa.String(length=10), nullable=True),
203
+ sa.Column('created', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
204
+ sa.PrimaryKeyConstraint('incidentkey')
205
+ )
206
+ op.create_index(op.f('ix_auv_incidentbase_incidentkey'), 'auv_incidentbase', ['incidentkey'], unique=False)
207
+ op.create_table('auv_incidentpersonnel',
208
+ sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
209
+ sa.Column('personnelkey', sa.String(length=14), nullable=True),
210
+ sa.Column('namefirst', sa.String(length=25), nullable=True),
211
+ sa.Column('namemi', sa.String(length=2), nullable=True),
212
+ sa.Column('namelast', sa.String(length=25), nullable=True),
213
+ sa.Column('namesuffix', sa.String(length=5), nullable=True),
214
+ sa.Column('rank', sa.String(length=10), nullable=True),
215
+ sa.Column('actiontaken1code', sa.String(length=10), nullable=True),
216
+ sa.Column('actiontaken1descip', sa.String(length=255), nullable=True),
217
+ sa.Column('actiontaken2code', sa.String(length=10), nullable=True),
218
+ sa.Column('actiontaken2descip', sa.String(length=255), nullable=True),
219
+ sa.Column('actiontaken3code', sa.String(length=10), nullable=True),
220
+ sa.Column('actiontaken3descip', sa.String(length=255), nullable=True),
221
+ sa.Column('actiontaken4code', sa.String(length=10), nullable=True),
222
+ sa.Column('actiontaken4descip', sa.String(length=255), nullable=True),
223
+ sa.Column('amount1', sa.Float(), nullable=True),
224
+ sa.Column('amount2', sa.Float(), nullable=True),
225
+ sa.Column('crole', sa.Integer(), nullable=True),
226
+ sa.Column('losapcreditcode', sa.Integer(), nullable=True),
227
+ sa.Column('losapcreditdescrip', sa.String(length=100), nullable=True),
228
+ sa.Column('apparatusid', sa.String(length=10), nullable=True),
229
+ sa.Column('numberofresponders', sa.Integer(), nullable=True),
230
+ sa.Column('responsetimeseconds', sa.Integer(), nullable=True),
231
+ sa.Column('dispatchcleardiffseconds', sa.Integer(), nullable=True),
232
+ sa.Column('created', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
233
+ sa.PrimaryKeyConstraint('id')
234
+ )
235
+ op.create_table('incident',
236
+ sa.Column('incidentkey', sa.String(length=14), nullable=False),
237
+ sa.Column('incidentdate', sa.DateTime(), nullable=True),
238
+ sa.Column('incidentnumber', sa.String(length=10), nullable=True),
239
+ sa.Column('exposure', sa.String(length=3), nullable=True),
240
+ sa.Column('incidentstatus', sa.String(length=20), nullable=True),
241
+ sa.Column('reviewstatusflag', sa.Boolean(), nullable=True),
242
+ sa.Column('publicreleaseflag', sa.Boolean(), nullable=True),
243
+ sa.Column('completed', sa.Boolean(), nullable=True),
244
+ sa.Column('transactiontype', sa.String(length=4), nullable=True),
245
+ sa.Column('district', sa.String(length=10), nullable=True),
246
+ sa.Column('station', sa.String(length=30), nullable=True),
247
+ sa.Column('shift', sa.String(length=2), nullable=True),
248
+ sa.Column('company', sa.String(length=64), nullable=True),
249
+ sa.Column('incidenttype', sa.String(length=4), nullable=True),
250
+ sa.Column('initialdispatchcode', sa.String(length=25), nullable=True),
251
+ sa.Column('mutualaidcode', sa.String(length=4), nullable=True),
252
+ sa.Column('alarmdate', sa.DateTime(), nullable=True),
253
+ sa.Column('arrivaldate', sa.DateTime(), nullable=True),
254
+ sa.Column('didnotarriveflag', sa.Boolean(), nullable=True),
255
+ sa.Column('controlleddate', sa.DateTime(), nullable=True),
256
+ sa.Column('lastunitcleareddate', sa.DateTime(), nullable=True),
257
+ sa.Column('includemutualaidflag', sa.Boolean(), nullable=True),
258
+ sa.Column('madepartment', sa.String(length=30), nullable=True),
259
+ sa.Column('madeptincidentno', sa.String(length=9), nullable=True),
260
+ sa.Column('alarms', sa.Integer(), nullable=True),
261
+ sa.Column('actiontaken1', sa.String(length=4), nullable=True),
262
+ sa.Column('actiontaken2', sa.String(length=4), nullable=True),
263
+ sa.Column('actiontaken3', sa.String(length=4), nullable=True),
264
+ sa.Column('resourceformusedflag', sa.Boolean(), nullable=True),
265
+ sa.Column('apparatussuppression', sa.Integer(), nullable=True),
266
+ sa.Column('apparatusems', sa.Integer(), nullable=True),
267
+ sa.Column('apparatusother', sa.Integer(), nullable=True),
268
+ sa.Column('personnelsuppression', sa.Integer(), nullable=True),
269
+ sa.Column('personnelems', sa.Integer(), nullable=True),
270
+ sa.Column('personnelother', sa.Integer(), nullable=True),
271
+ sa.Column('lossproperty', sa.Numeric(), nullable=True),
272
+ sa.Column('losscontents', sa.Numeric(), nullable=True),
273
+ sa.Column('valueproperty', sa.Numeric(), nullable=True),
274
+ sa.Column('valuecontents', sa.Numeric(), nullable=True),
275
+ sa.Column('fatalfireservice', sa.Integer(), nullable=True),
276
+ sa.Column('fatalother', sa.Integer(), nullable=True),
277
+ sa.Column('nonfatalfireservice', sa.Integer(), nullable=True),
278
+ sa.Column('nonfatalother', sa.Integer(), nullable=True),
279
+ sa.Column('detector', sa.String(length=4), nullable=True),
280
+ sa.Column('hazardmaterialreleased', sa.String(length=4), nullable=True),
281
+ sa.Column('mixeduse', sa.String(length=4), nullable=True),
282
+ sa.Column('propertyuse', sa.String(length=4), nullable=True),
283
+ sa.Column('emsprovidedflag', sa.Boolean(), nullable=True),
284
+ sa.Column('casualtiesflag', sa.Integer(), nullable=True),
285
+ sa.Column('priorityresponseflag', sa.Boolean(), nullable=True),
286
+ sa.Column('vendorid', sa.String(length=20), nullable=True),
287
+ sa.Column('locationtype', sa.Float(), nullable=True),
288
+ sa.Column('censustract', sa.String(length=7), nullable=True),
289
+ sa.Column('numberormile', sa.String(length=8), nullable=True),
290
+ sa.Column('streetprefix', sa.String(length=2), nullable=True),
291
+ sa.Column('streethighway', sa.String(length=30), nullable=True),
292
+ sa.Column('streettype', sa.String(length=4), nullable=True),
293
+ sa.Column('streetsuffix', sa.String(length=2), nullable=True),
294
+ sa.Column('apartment', sa.String(length=15), nullable=True),
295
+ sa.Column('city', sa.String(length=20), nullable=True),
296
+ sa.Column('state', sa.String(length=2), nullable=True),
297
+ sa.Column('postalcode', sa.String(length=20), nullable=True),
298
+ sa.Column('directions', sa.Text(), nullable=True),
299
+ sa.Column('latitude', sa.String(length=20), nullable=True),
300
+ sa.Column('longitude', sa.String(length=20), nullable=True),
301
+ sa.Column('compositeaddress', sa.String(length=50), nullable=True),
302
+ sa.Column('county', sa.String(length=20), nullable=True),
303
+ sa.Column('occupancykey', sa.String(length=14), nullable=True),
304
+ sa.Column('occupancynumber', sa.String(length=16), nullable=True),
305
+ sa.Column('occupancyname', sa.String(length=40), nullable=True),
306
+ sa.Column('runcard', sa.String(length=8), nullable=True),
307
+ sa.Column('mappage', sa.String(length=20), nullable=True),
308
+ sa.Column('descrip', sa.String(length=30), nullable=True),
309
+ sa.Column('addressvalidated', sa.Integer(), nullable=True),
310
+ sa.Column('CADCompleted', sa.Boolean(), nullable=True),
311
+ sa.Column('changedate', sa.DateTime(), nullable=True),
312
+ sa.Column('rowguid', sa.String(length=50), nullable=True),
313
+ sa.Column('LogComments', sa.Text(), nullable=True),
314
+ sa.Column('Incident_ID', sa.Integer(), nullable=True),
315
+ sa.Column('loss_not_known', sa.Boolean(), nullable=True),
316
+ sa.Column('collecteddate', sa.DateTime(), nullable=True),
317
+ sa.Column('DispatchIncType', sa.String(length=80), nullable=True),
318
+ sa.Column('nfscasualtycnt', sa.Integer(), nullable=True),
319
+ sa.Column('ncivcasualtycnt', sa.Integer(), nullable=True),
320
+ sa.Column('psaptime', sa.DateTime(), nullable=True),
321
+ sa.Column('ResponseType', sa.String(length=10), nullable=True),
322
+ sa.Column('CADText1', sa.String(length=50), nullable=True),
323
+ sa.Column('CADText2', sa.String(length=50), nullable=True),
324
+ sa.Column('CADText3', sa.String(length=50), nullable=True),
325
+ sa.Column('CADCombo1', sa.String(length=50), nullable=True),
326
+ sa.Column('CADCombo2', sa.String(length=50), nullable=True),
327
+ sa.Column('CADCombo3', sa.String(length=50), nullable=True),
328
+ sa.Column('GMTOffSet', sa.String(length=6), nullable=True),
329
+ sa.Column('CADDate1', sa.DateTime(), nullable=True),
330
+ sa.Column('CADDate2', sa.DateTime(), nullable=True),
331
+ sa.Column('CADDate3', sa.DateTime(), nullable=True),
332
+ sa.Column('responseTime', sa.String(length=20), nullable=True),
333
+ sa.Column('turnTime', sa.String(length=20), nullable=True),
334
+ sa.Column('Mapset', sa.String(length=6), nullable=True),
335
+ sa.Column('Easting', sa.String(length=5), nullable=True),
336
+ sa.Column('Northing', sa.String(length=5), nullable=True),
337
+ sa.Column('created', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
338
+ sa.PrimaryKeyConstraint('incidentkey')
339
+ )
340
+ op.create_index(op.f('ix_incident_incidentkey'), 'incident', ['incidentkey'], unique=False)
341
+ op.create_table('apparatus',
342
+ sa.Column('apparatuskey', sa.String(length=14), nullable=False),
343
+ sa.Column('incidentkey', sa.String(length=14), nullable=True),
344
+ sa.Column('apsid', sa.String(length=14), nullable=True),
345
+ sa.Column('apparatusid', sa.String(length=8), nullable=True),
346
+ sa.Column('priorityresponseflag', sa.Boolean(), nullable=True),
347
+ sa.Column('arrivaldate', sa.DateTime(), nullable=True),
348
+ sa.Column('scenedate', sa.DateTime(), nullable=True),
349
+ sa.Column('enroutedate', sa.DateTime(), nullable=True),
350
+ sa.Column('facilitydate', sa.DateTime(), nullable=True),
351
+ sa.Column('cleardate', sa.DateTime(), nullable=True),
352
+ sa.Column('dispatchdate', sa.DateTime(), nullable=True),
353
+ sa.Column('inservicedate', sa.DateTime(), nullable=True),
354
+ sa.Column('cancelledenrouteflag', sa.Boolean(), nullable=True),
355
+ sa.Column('numberpeople', sa.Integer(), nullable=True),
356
+ sa.Column('usecode', sa.String(length=4), nullable=True),
357
+ sa.Column('actiontaken1', sa.String(length=4), nullable=True),
358
+ sa.Column('actiontaken2', sa.String(length=4), nullable=True),
359
+ sa.Column('actiontaken3', sa.String(length=4), nullable=True),
360
+ sa.Column('actiontaken4', sa.String(length=4), nullable=True),
361
+ sa.Column('apparatustype', sa.String(length=4), nullable=True),
362
+ sa.Column('amount1', sa.Numeric(precision=10, scale=2), nullable=True),
363
+ sa.Column('amount2', sa.Numeric(precision=10, scale=2), nullable=True),
364
+ sa.Column('otherinfo', sa.String(length=20), nullable=True),
365
+ sa.Column('logcomments', sa.Text(), nullable=True),
366
+ sa.Column('fdid_no', sa.String(length=20), nullable=True),
367
+ sa.Column('paramedicdispatch', sa.String(length=6), nullable=True),
368
+ sa.Column('firstarrivingunit', sa.Boolean(), nullable=True),
369
+ sa.Column('inservicetime', sa.DateTime(), nullable=True),
370
+ sa.Column('respondfromquarters', sa.Boolean(), nullable=True),
371
+ sa.Column('changedate', sa.DateTime(), nullable=True),
372
+ sa.Column('rowguid', sa.String(length=36), nullable=True),
373
+ sa.Column('hydrant_idnumber', sa.String(length=20), nullable=True),
374
+ sa.Column('hydrant_location', sa.String(length=116), nullable=True),
375
+ sa.Column('alarms', sa.String(length=10), nullable=True),
376
+ sa.Column('llosap_credit', sa.Boolean(), nullable=True),
377
+ sa.Column('emsrun', sa.Boolean(), nullable=True),
378
+ sa.Column('emsrunnumber', sa.String(length=14), nullable=True),
379
+ sa.Column('lprocessepcr', sa.Boolean(), nullable=True),
380
+ sa.Column('nepcrrun', sa.Integer(), nullable=True),
381
+ sa.Column('stagingdate', sa.DateTime(), nullable=True),
382
+ sa.Column('isepcr', sa.Boolean(), nullable=True),
383
+ sa.Column('unit_exc', sa.String(length=10), nullable=True),
384
+ sa.Column('aedtype', sa.String(length=10), nullable=True),
385
+ sa.Column('odometeronscene', sa.Numeric(precision=12, scale=2), nullable=True),
386
+ sa.Column('odometerdestination', sa.Numeric(precision=12, scale=2), nullable=True),
387
+ sa.Column('mileagetransport', sa.Numeric(precision=12, scale=2), nullable=True),
388
+ sa.Column('atpatientsidetime', sa.DateTime(), nullable=True),
389
+ sa.Column('aerialdeviceused', sa.Integer(), nullable=True),
390
+ sa.Column('gmtoffset', sa.String(length=6), nullable=True),
391
+ sa.Column('firsteffectiveunit', sa.Integer(), nullable=True),
392
+ sa.Column('lnfirsexported', sa.Boolean(), nullable=True),
393
+ sa.Column('nfirsexporteddate', sa.DateTime(), nullable=True),
394
+ sa.Column('infirssequence', sa.Integer(), nullable=True),
395
+ sa.Column('nfirsttransactiontype', sa.String(length=1), nullable=True),
396
+ sa.Column('hydrant_used', sa.Integer(), nullable=True),
397
+ sa.Column('defaultdispatchcode', sa.String(length=25), nullable=True),
398
+ sa.Column('responsetime', sa.String(length=20), nullable=True),
399
+ sa.Column('turntime', sa.String(length=20), nullable=True),
400
+ sa.Column('created', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
401
+ sa.ForeignKeyConstraint(['incidentkey'], ['incident.incidentkey'], ),
402
+ sa.PrimaryKeyConstraint('apparatuskey')
403
+ )
404
+ op.create_index(op.f('ix_apparatus_apparatuskey'), 'apparatus', ['apparatuskey'], unique=False)
405
+ op.create_table('auv_incidentapparatus',
406
+ sa.Column('apparatuskey', sa.String(length=14), nullable=False),
407
+ sa.Column('incidentkey', sa.String(length=14), nullable=True),
408
+ sa.Column('apparatusid', sa.String(length=20), nullable=True),
409
+ sa.Column('deptunitornotcode', sa.Integer(), nullable=True),
410
+ sa.Column('deptunitornotdescrip', sa.String(length=50), nullable=True),
411
+ sa.Column('priorityresponsecode', sa.Integer(), nullable=True),
412
+ sa.Column('priorityresponsedescrip', sa.String(length=50), nullable=True),
413
+ sa.Column('cancelledenroutecode', sa.Integer(), nullable=True),
414
+ sa.Column('cancelledenroutedescrip', sa.String(length=50), nullable=True),
415
+ sa.Column('firstarrivingunitcode', sa.Integer(), nullable=True),
416
+ sa.Column('firstarrivingunitdescrip', sa.String(length=50), nullable=True),
417
+ sa.Column('dispatchtype', sa.Integer(), nullable=True),
418
+ sa.Column('dispatchtypedescrip', sa.String(length=100), nullable=True),
419
+ sa.Column('respondedfromquarterscode', sa.Integer(), nullable=True),
420
+ sa.Column('respondedfromquarterdescrip', sa.String(length=100), nullable=True),
421
+ sa.Column('mainapparatususecode', sa.Integer(), nullable=True),
422
+ sa.Column('mainapparatususedescrip', sa.String(length=100), nullable=True),
423
+ sa.Column('apparatustypecode', sa.Integer(), nullable=True),
424
+ sa.Column('apparatustypedescrip', sa.String(length=100), nullable=True),
425
+ sa.Column('actiontaken1code', sa.String(length=10), nullable=True),
426
+ sa.Column('actiontaken1descip', sa.String(length=255), nullable=True),
427
+ sa.Column('actiontaken2code', sa.String(length=10), nullable=True),
428
+ sa.Column('actiontaken2descip', sa.String(length=255), nullable=True),
429
+ sa.Column('actiontaken3code', sa.String(length=10), nullable=True),
430
+ sa.Column('actiontaken3descip', sa.String(length=255), nullable=True),
431
+ sa.Column('actiontaken4code', sa.String(length=10), nullable=True),
432
+ sa.Column('actiontaken4descip', sa.String(length=255), nullable=True),
433
+ sa.Column('numberofresponders', sa.Integer(), nullable=True),
434
+ sa.Column('dispatchdatetime', sa.DateTime(), nullable=True),
435
+ sa.Column('dispatchtime', sa.String(length=10), nullable=True),
436
+ sa.Column('dispatchdate', sa.Date(), nullable=True),
437
+ sa.Column('dispatchenroutetime', sa.String(length=10), nullable=True),
438
+ sa.Column('dispatchenroutediffseconds', sa.Integer(), nullable=True),
439
+ sa.Column('enroutetoscenedatetime', sa.DateTime(), nullable=True),
440
+ sa.Column('enroutetoscenetime', sa.String(length=10), nullable=True),
441
+ sa.Column('enroutetoscenedate', sa.Date(), nullable=True),
442
+ sa.Column('enroutearrivalscenetime', sa.String(length=10), nullable=True),
443
+ sa.Column('enroutearrivalscenediffseconds', sa.Integer(), nullable=True),
444
+ sa.Column('responsetime', sa.String(length=10), nullable=True),
445
+ sa.Column('responsetimeseconds', sa.Integer(), nullable=True),
446
+ sa.Column('arrivaldatetime', sa.DateTime(), nullable=True),
447
+ sa.Column('arrivaltime', sa.String(length=10), nullable=True),
448
+ sa.Column('arrivaldate', sa.Date(), nullable=True),
449
+ sa.Column('arrivaltoenroutehospdifftime', sa.String(length=10), nullable=True),
450
+ sa.Column('arrivaltoenroutehospdiffseconds', sa.Integer(), nullable=True),
451
+ sa.Column('enroutetohospitaldatetime', sa.DateTime(), nullable=True),
452
+ sa.Column('enroutetohospitaltime', sa.String(length=10), nullable=True),
453
+ sa.Column('enroutetohospitaldate', sa.Date(), nullable=True),
454
+ sa.Column('enroutetoarrivalhospdifftime', sa.String(length=10), nullable=True),
455
+ sa.Column('enroutetoarrivalhospdiffseconds', sa.Integer(), nullable=True),
456
+ sa.Column('arrivalscenetoarrivalhospdifftime', sa.String(length=10), nullable=True),
457
+ sa.Column('arrivalscenetoarrivalhospdiffseconds', sa.Integer(), nullable=True),
458
+ sa.Column('hospitalarrivaldatetime', sa.DateTime(), nullable=True),
459
+ sa.Column('hospitalarrivaltime', sa.String(length=10), nullable=True),
460
+ sa.Column('hospitalarrivaldate', sa.Date(), nullable=True),
461
+ sa.Column('arrivalclearhospdifftime', sa.String(length=10), nullable=True),
462
+ sa.Column('arrivalclearhospdiffseconds', sa.Integer(), nullable=True),
463
+ sa.Column('cleardatetime', sa.DateTime(), nullable=True),
464
+ sa.Column('cleartime', sa.String(length=10), nullable=True),
465
+ sa.Column('cleardate', sa.Date(), nullable=True),
466
+ sa.Column('dispatchcleardifftime', sa.String(length=10), nullable=True),
467
+ sa.Column('dispatchcleardiffseconds', sa.Integer(), nullable=True),
468
+ sa.Column('inservicedatetime', sa.DateTime(), nullable=True),
469
+ sa.Column('inservicetime', sa.String(length=10), nullable=True),
470
+ sa.Column('inservicedate', sa.Date(), nullable=True),
471
+ sa.Column('emsruncode', sa.String(length=10), nullable=True),
472
+ sa.Column('emsrundescrip', sa.String(length=100), nullable=True),
473
+ sa.Column('emsrunnumber', sa.Integer(), nullable=True),
474
+ sa.Column('losapcode', sa.Integer(), nullable=True),
475
+ sa.Column('losapdescrip', sa.String(length=100), nullable=True),
476
+ sa.Column('alarmscode', sa.Integer(), nullable=True),
477
+ sa.Column('alarmdescrip', sa.String(length=100), nullable=True),
478
+ sa.Column('amount1', sa.Integer(), nullable=True),
479
+ sa.Column('amount2', sa.Integer(), nullable=True),
480
+ sa.Column('fdid_no', sa.String(length=20), nullable=True),
481
+ sa.Column('stagingdatetime', sa.DateTime(), nullable=True),
482
+ sa.Column('stagingtime', sa.String(length=10), nullable=True),
483
+ sa.Column('stagingdate', sa.Date(), nullable=True),
484
+ sa.Column('AtPatientSideDateTime', sa.DateTime(), nullable=True),
485
+ sa.Column('AtPatientSideTime', sa.String(length=10), nullable=True),
486
+ sa.Column('AtPatientSideDate', sa.Date(), nullable=True),
487
+ sa.Column('FacilityDateTime', sa.DateTime(), nullable=True),
488
+ sa.Column('FacilityTime', sa.String(length=10), nullable=True),
489
+ sa.Column('FacilityDate', sa.Date(), nullable=True),
490
+ sa.Column('changedate', sa.DateTime(), nullable=True),
491
+ sa.Column('created', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
492
+ sa.ForeignKeyConstraint(['incidentkey'], ['incident.incidentkey'], ),
493
+ sa.PrimaryKeyConstraint('apparatuskey')
494
+ )
495
+ op.create_index(op.f('ix_auv_incidentapparatus_apparatuskey'), 'auv_incidentapparatus', ['apparatuskey'], unique=False)
496
+ op.create_table('personnel',
497
+ sa.Column('personnelkey', sa.String(length=14), nullable=False),
498
+ sa.Column('incidentkey', sa.String(length=14), nullable=True),
499
+ sa.Column('apparatuskey', sa.String(length=14), nullable=True),
500
+ sa.Column('pslid', sa.String(length=14), nullable=True),
501
+ sa.Column('rosid', sa.String(length=14), nullable=True),
502
+ sa.Column('personnelid', sa.String(length=9), nullable=True),
503
+ sa.Column('lastname', sa.String(length=25), nullable=True),
504
+ sa.Column('firstname', sa.String(length=25), nullable=True),
505
+ sa.Column('middleinitial', sa.String(length=1), nullable=True),
506
+ sa.Column('namesuffix', sa.String(length=4), nullable=True),
507
+ sa.Column('rank', sa.String(length=10), nullable=True),
508
+ sa.Column('actiontaken1', sa.String(length=4), nullable=True),
509
+ sa.Column('actiontaken2', sa.String(length=4), nullable=True),
510
+ sa.Column('actiontaken3', sa.String(length=4), nullable=True),
511
+ sa.Column('actiontaken4', sa.String(length=4), nullable=True),
512
+ sa.Column('amount1', sa.Float(), nullable=True),
513
+ sa.Column('amount2', sa.Float(), nullable=True),
514
+ sa.Column('changedate', sa.DateTime(), nullable=True),
515
+ sa.Column('rowguid', sa.String(), nullable=True),
516
+ sa.Column('crole', sa.String(length=4), nullable=True),
517
+ sa.Column('lLosap_credit', sa.Boolean(), nullable=True),
518
+ sa.Column('MedCert', sa.String(length=4), nullable=True),
519
+ sa.Column('cAdditionalRole', sa.String(length=8), nullable=True),
520
+ sa.Column('AgencyID', sa.String(length=14), nullable=True),
521
+ sa.Column('AgencyDesc', sa.String(length=40), nullable=True),
522
+ sa.Column('AgencyCode', sa.String(length=8), nullable=True),
523
+ sa.Column('lNFIRSExported', sa.Boolean(), nullable=True),
524
+ sa.Column('NFIRSExportedDate', sa.DateTime(), nullable=True),
525
+ sa.Column('iNFIRSSequence', sa.Integer(), nullable=True),
526
+ sa.Column('NFIRSTransactiontype', sa.String(length=1), nullable=True),
527
+ sa.Column('created', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
528
+ sa.ForeignKeyConstraint(['apparatuskey'], ['apparatus.incidentkey'], ),
529
+ sa.ForeignKeyConstraint(['incidentkey'], ['incident.incidentkey'], ),
530
+ sa.PrimaryKeyConstraint('personnelkey')
531
+ )
532
+ op.create_index(op.f('ix_personnel_personnelkey'), 'personnel', ['personnelkey'], unique=False)
533
+ # ### end Alembic commands ###
534
+
535
+
536
+ def downgrade() -> None:
537
+ """Downgrade schema."""
538
+ # ### commands auto generated by Alembic - please adjust! ###
539
+ op.drop_index(op.f('ix_personnel_personnelkey'), table_name='personnel')
540
+ op.drop_table('personnel')
541
+ op.drop_index(op.f('ix_auv_incidentapparatus_apparatuskey'), table_name='auv_incidentapparatus')
542
+ op.drop_table('auv_incidentapparatus')
543
+ op.drop_index(op.f('ix_apparatus_apparatuskey'), table_name='apparatus')
544
+ op.drop_table('apparatus')
545
+ op.drop_index(op.f('ix_incident_incidentkey'), table_name='incident')
546
+ op.drop_table('incident')
547
+ op.drop_table('auv_incidentpersonnel')
548
+ op.drop_index(op.f('ix_auv_incidentbase_incidentkey'), table_name='auv_incidentbase')
549
+ op.drop_table('auv_incidentbase')
550
+ # ### end Alembic commands ###
feed_data.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ from datetime import time, timedelta, datetime
3
+ import pandas as pd
4
+ import numpy as np
5
+ from sqlalchemy import select
6
+ from src.configs import DatabaseConfig
7
+ from src.entities.incident import IncidentModel
8
+ from src.entities.apparatus import ApparatusModel
9
+ from src.entities.personnel import PersonnelModel
10
+ from src.entities.auv_incidentbase import IncidentBaseModel
11
+ from src.entities.auv_incidentapparatus import IncidentApparatusModel
12
+ from src.entities.auv_incidentpersonnel import IncidentPersonnelModel
13
+
14
+
15
+ EXCEL_FILE = "ProjectTablesData.xlsx"
16
+
17
+ EXCEL_SHEET_MODEL_MAP = {
18
+ 0: IncidentModel,
19
+ 1: ApparatusModel,
20
+ 2: PersonnelModel,
21
+ 3: IncidentBaseModel,
22
+ 4: IncidentApparatusModel,
23
+ 5: IncidentPersonnelModel
24
+ }
25
+
26
+
27
+ def clean_value(value):
28
+
29
+ # Handle NaN
30
+ try:
31
+ if pd.isna(value):
32
+ return None
33
+ except (TypeError, ValueError):
34
+ pass
35
+
36
+ # Handle pandas Timestamp → return datetime object (NOT string)
37
+ if isinstance(value, pd.Timestamp):
38
+ if value == pd.Timestamp("1900-01-01"): # Excel empty date default
39
+ return None
40
+ return value.to_pydatetime() # ✅ Return actual datetime, not string
41
+
42
+ # Convert Python time -> string
43
+ if isinstance(value, time):
44
+ return value.strftime("%H:%M:%S")
45
+
46
+ # Convert timedelta -> string
47
+ if isinstance(value, timedelta):
48
+ total_seconds = int(value.total_seconds())
49
+ h = total_seconds // 3600
50
+ m = (total_seconds % 3600) // 60
51
+ s = total_seconds % 60
52
+ return f"{h:02}:{m:02}:{s:02}"
53
+
54
+ # Convert numpy types
55
+ if isinstance(value, np.generic):
56
+ return value.item()
57
+
58
+ # Strip strings
59
+ if isinstance(value, str):
60
+ value = value.strip()
61
+ return value if value else None
62
+
63
+ return value
64
+
65
+
66
+ def get_model_columns(model):
67
+ """Extract SQLAlchemy column names"""
68
+ return {column.name for column in model.__table__.columns}
69
+
70
+
71
+ def get_primary_keys(model):
72
+ """Get primary key column names"""
73
+ return [column.name for column in model.__table__.primary_key.columns]
74
+
75
+
76
+ def row_to_model(model, row):
77
+ """Convert pandas row → SQLAlchemy model"""
78
+ model_columns = get_model_columns(model)
79
+
80
+ data = {}
81
+
82
+ for column in model_columns:
83
+ if column in row:
84
+ data[column] = clean_value(row[column])
85
+
86
+ return model(**data)
87
+
88
+
89
+ async def get_existing_primary_keys(session, model, pk_column):
90
+ """
91
+ Fetch existing primary keys from DB
92
+ """
93
+ result = await session.execute(
94
+ select(getattr(model, pk_column))
95
+ )
96
+
97
+ return {row[0] for row in result.fetchall()}
98
+
99
+
100
+ async def ingest_excel():
101
+
102
+ print("Loading Excel file...")
103
+
104
+ excel_data = pd.read_excel(EXCEL_FILE, sheet_name=None)
105
+
106
+ async with DatabaseConfig.async_session() as session:
107
+
108
+ total_inserted = 0
109
+
110
+ for sheet_index, model in EXCEL_SHEET_MODEL_MAP.items():
111
+
112
+ sheet_name = list(excel_data.keys())[sheet_index]
113
+
114
+ print(f"\nProcessing Sheet: {sheet_name}")
115
+ print(f"Mapped Model: {model.__name__}")
116
+
117
+ df = excel_data[sheet_name]
118
+
119
+ pk_columns = get_primary_keys(model)
120
+
121
+ existing_keys = set()
122
+ seen_keys = set()
123
+
124
+ if pk_columns:
125
+ pk_column = pk_columns[0]
126
+ existing_keys = await get_existing_primary_keys(session, model, pk_column)
127
+
128
+ objects = []
129
+ skipped = 0
130
+
131
+ for _, row in df.iterrows():
132
+
133
+ obj = row_to_model(model, row)
134
+
135
+ if pk_columns:
136
+ pk_value = getattr(obj, pk_columns[0], None)
137
+
138
+ if pk_value in existing_keys or pk_value in seen_keys:
139
+ skipped += 1
140
+ continue
141
+
142
+ seen_keys.add(pk_value)
143
+
144
+ objects.append(obj)
145
+
146
+ session.add_all(objects)
147
+
148
+ inserted = len(objects)
149
+
150
+ print(f"Inserted: {inserted}")
151
+ print(f"Skipped duplicates: {skipped}")
152
+
153
+ total_inserted += inserted
154
+
155
+ await session.commit()
156
+
157
+ print("\nTotal rows inserted:", total_inserted)
158
+
159
+
160
+ if __name__ == "__main__":
161
+ asyncio.run(ingest_excel())
poetry.lock CHANGED
@@ -1,4 +1,4 @@
1
- # This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand.
2
 
3
  [[package]]
4
  name = "aiofiles"
@@ -506,6 +506,18 @@ files = [
506
  {file = "durationpy-0.10.tar.gz", hash = "sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba"},
507
  ]
508
 
 
 
 
 
 
 
 
 
 
 
 
 
509
  [[package]]
510
  name = "fastapi"
511
  version = "0.135.1"
@@ -1704,6 +1716,21 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
1704
  realtime = ["websockets (>=13,<16)"]
1705
  voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"]
1706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1707
  [[package]]
1708
  name = "opentelemetry-api"
1709
  version = "1.40.0"
@@ -1915,6 +1942,95 @@ files = [
1915
  {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"},
1916
  ]
1917
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1918
  [[package]]
1919
  name = "protobuf"
1920
  version = "6.33.5"
@@ -3069,6 +3185,19 @@ files = [
3069
  [package.dependencies]
3070
  typing-extensions = ">=4.12.0"
3071
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3072
  [[package]]
3073
  name = "urllib3"
3074
  version = "2.6.3"
@@ -3427,4 +3556,4 @@ type = ["pytest-mypy"]
3427
  [metadata]
3428
  lock-version = "2.1"
3429
  python-versions = "3.12.*"
3430
- content-hash = "6d598f8d3c82ab1e51e33fb9082f9a4777b0a292c4251c3d7e7efc68541451a0"
 
1
+ # This file is automatically @generated by Poetry 2.3.1 and should not be changed by hand.
2
 
3
  [[package]]
4
  name = "aiofiles"
 
506
  {file = "durationpy-0.10.tar.gz", hash = "sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba"},
507
  ]
508
 
509
+ [[package]]
510
+ name = "et-xmlfile"
511
+ version = "2.0.0"
512
+ description = "An implementation of lxml.xmlfile for the standard library"
513
+ optional = false
514
+ python-versions = ">=3.8"
515
+ groups = ["main"]
516
+ files = [
517
+ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"},
518
+ {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"},
519
+ ]
520
+
521
  [[package]]
522
  name = "fastapi"
523
  version = "0.135.1"
 
1716
  realtime = ["websockets (>=13,<16)"]
1717
  voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"]
1718
 
1719
+ [[package]]
1720
+ name = "openpyxl"
1721
+ version = "3.1.5"
1722
+ description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
1723
+ optional = false
1724
+ python-versions = ">=3.8"
1725
+ groups = ["main"]
1726
+ files = [
1727
+ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"},
1728
+ {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"},
1729
+ ]
1730
+
1731
+ [package.dependencies]
1732
+ et-xmlfile = "*"
1733
+
1734
  [[package]]
1735
  name = "opentelemetry-api"
1736
  version = "1.40.0"
 
1942
  {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"},
1943
  ]
1944
 
1945
+ [[package]]
1946
+ name = "pandas"
1947
+ version = "3.0.1"
1948
+ description = "Powerful data structures for data analysis, time series, and statistics"
1949
+ optional = false
1950
+ python-versions = ">=3.11"
1951
+ groups = ["main"]
1952
+ files = [
1953
+ {file = "pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea"},
1954
+ {file = "pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796"},
1955
+ {file = "pandas-3.0.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406ce835c55bac912f2a0dcfaf27c06d73c6b04a5dde45f1fd3169ce31337389"},
1956
+ {file = "pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7"},
1957
+ {file = "pandas-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a64ce8b0f2de1d2efd2ae40b0abe7f8ae6b29fbfb3812098ed5a6f8e235ad9bf"},
1958
+ {file = "pandas-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9832c2c69da24b602c32e0c7b1b508a03949c18ba08d4d9f1c1033426685b447"},
1959
+ {file = "pandas-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79"},
1960
+ {file = "pandas-3.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:4a68773d5a778afb31d12e34f7dd4612ab90de8c6fb1d8ffe5d4a03b955082a1"},
1961
+ {file = "pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d"},
1962
+ {file = "pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955"},
1963
+ {file = "pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b"},
1964
+ {file = "pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4"},
1965
+ {file = "pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1"},
1966
+ {file = "pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821"},
1967
+ {file = "pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43"},
1968
+ {file = "pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7"},
1969
+ {file = "pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262"},
1970
+ {file = "pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56"},
1971
+ {file = "pandas-3.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75e6e292ff898679e47a2199172593d9f6107fd2dd3617c22c2946e97d5df46e"},
1972
+ {file = "pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791"},
1973
+ {file = "pandas-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eca8b4510f6763f3d37359c2105df03a7a221a508f30e396a51d0713d462e68a"},
1974
+ {file = "pandas-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06aff2ad6f0b94a17822cf8b83bbb563b090ed82ff4fe7712db2ce57cd50d9b8"},
1975
+ {file = "pandas-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25"},
1976
+ {file = "pandas-3.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a8d37a43c52917427e897cb2e429f67a449327394396a81034a4449b99afda59"},
1977
+ {file = "pandas-3.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d54855f04f8246ed7b6fc96b05d4871591143c46c0b6f4af874764ed0d2d6f06"},
1978
+ {file = "pandas-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e1b677accee34a09e0dc2ce5624e4a58a1870ffe56fc021e9caf7f23cd7668f"},
1979
+ {file = "pandas-3.0.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9cabbdcd03f1b6cd254d6dda8ae09b0252524be1592594c00b7895916cb1324"},
1980
+ {file = "pandas-3.0.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ae2ab1f166668b41e770650101e7090824fd34d17915dd9cd479f5c5e0065e9"},
1981
+ {file = "pandas-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6bf0603c2e30e2cafac32807b06435f28741135cb8697eae8b28c7d492fc7d76"},
1982
+ {file = "pandas-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c426422973973cae1f4a23e51d4ae85974f44871b24844e4f7de752dd877098"},
1983
+ {file = "pandas-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b03f91ae8c10a85c1613102c7bef5229b5379f343030a3ccefeca8a33414cf35"},
1984
+ {file = "pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a"},
1985
+ {file = "pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f"},
1986
+ {file = "pandas-3.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56cf59638bf24dc9bdf2154c81e248b3289f9a09a6d04e63608c159022352749"},
1987
+ {file = "pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249"},
1988
+ {file = "pandas-3.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1849f0bba9c8a2fb0f691d492b834cc8dadf617e29015c66e989448d58d011ee"},
1989
+ {file = "pandas-3.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3d288439e11b5325b02ae6e9cc83e6805a62c40c5a6220bea9beb899c073b1c"},
1990
+ {file = "pandas-3.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66"},
1991
+ {file = "pandas-3.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:97ca08674e3287c7148f4858b01136f8bdfe7202ad25ad04fec602dd1d29d132"},
1992
+ {file = "pandas-3.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:58eeb1b2e0fb322befcf2bbc9ba0af41e616abadb3d3414a6bc7167f6cbfce32"},
1993
+ {file = "pandas-3.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cd9af1276b5ca9e298bd79a26bda32fa9cc87ed095b2a9a60978d2ca058eaf87"},
1994
+ {file = "pandas-3.0.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f87a04984d6b63788327cd9f79dda62b7f9043909d2440ceccf709249ca988"},
1995
+ {file = "pandas-3.0.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85fe4c4df62e1e20f9db6ebfb88c844b092c22cd5324bdcf94bfa2fc1b391221"},
1996
+ {file = "pandas-3.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:331ca75a2f8672c365ae25c0b29e46f5ac0c6551fdace8eec4cd65e4fac271ff"},
1997
+ {file = "pandas-3.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15860b1fdb1973fffade772fdb931ccf9b2f400a3f5665aef94a00445d7d8dd5"},
1998
+ {file = "pandas-3.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:44f1364411d5670efa692b146c748f4ed013df91ee91e9bec5677fb1fd58b937"},
1999
+ {file = "pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d"},
2000
+ {file = "pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8"},
2001
+ ]
2002
+
2003
+ [package.dependencies]
2004
+ numpy = {version = ">=1.26.0", markers = "python_version < \"3.14\""}
2005
+ python-dateutil = ">=2.8.2"
2006
+ tzdata = {version = "*", markers = "sys_platform == \"win32\" or sys_platform == \"emscripten\""}
2007
+
2008
+ [package.extras]
2009
+ all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)", "beautifulsoup4 (>=4.12.3)", "bottleneck (>=1.4.2)", "fastparquet (>=2024.11.0)", "fsspec (>=2024.10.0)", "gcsfs (>=2024.10.0)", "html5lib (>=1.1)", "hypothesis (>=6.116.0)", "jinja2 (>=3.1.5)", "lxml (>=5.3.0)", "matplotlib (>=3.9.3)", "numba (>=0.60.0)", "numexpr (>=2.10.2)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "psycopg2 (>=2.9.10)", "pyarrow (>=13.0.0)", "pyiceberg (>=0.8.1)", "pymysql (>=1.1.1)", "pyreadstat (>=1.2.8)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)", "python-calamine (>=0.3.0)", "pytz (>=2024.2)", "pyxlsb (>=1.0.10)", "qtpy (>=2.4.2)", "s3fs (>=2024.10.0)", "scipy (>=1.14.1)", "tables (>=3.10.1)", "tabulate (>=0.9.0)", "xarray (>=2024.10.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)", "zstandard (>=0.23.0)"]
2010
+ aws = ["s3fs (>=2024.10.0)"]
2011
+ clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.4.2)"]
2012
+ compression = ["zstandard (>=0.23.0)"]
2013
+ computation = ["scipy (>=1.14.1)", "xarray (>=2024.10.0)"]
2014
+ excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "python-calamine (>=0.3.0)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)"]
2015
+ feather = ["pyarrow (>=13.0.0)"]
2016
+ fss = ["fsspec (>=2024.10.0)"]
2017
+ gcp = ["gcsfs (>=2024.10.0)"]
2018
+ hdf5 = ["tables (>=3.10.1)"]
2019
+ html = ["beautifulsoup4 (>=4.12.3)", "html5lib (>=1.1)", "lxml (>=5.3.0)"]
2020
+ iceberg = ["pyiceberg (>=0.8.1)"]
2021
+ mysql = ["SQLAlchemy (>=2.0.36)", "pymysql (>=1.1.1)"]
2022
+ output-formatting = ["jinja2 (>=3.1.5)", "tabulate (>=0.9.0)"]
2023
+ parquet = ["pyarrow (>=13.0.0)"]
2024
+ performance = ["bottleneck (>=1.4.2)", "numba (>=0.60.0)", "numexpr (>=2.10.2)"]
2025
+ plot = ["matplotlib (>=3.9.3)"]
2026
+ postgresql = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "psycopg2 (>=2.9.10)"]
2027
+ pyarrow = ["pyarrow (>=13.0.0)"]
2028
+ spss = ["pyreadstat (>=1.2.8)"]
2029
+ sql-other = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)"]
2030
+ test = ["hypothesis (>=6.116.0)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)"]
2031
+ timezone = ["pytz (>=2024.2)"]
2032
+ xml = ["lxml (>=5.3.0)"]
2033
+
2034
  [[package]]
2035
  name = "protobuf"
2036
  version = "6.33.5"
 
3185
  [package.dependencies]
3186
  typing-extensions = ">=4.12.0"
3187
 
3188
+ [[package]]
3189
+ name = "tzdata"
3190
+ version = "2025.3"
3191
+ description = "Provider of IANA time zone data"
3192
+ optional = false
3193
+ python-versions = ">=2"
3194
+ groups = ["main"]
3195
+ markers = "sys_platform == \"win32\" or sys_platform == \"emscripten\""
3196
+ files = [
3197
+ {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"},
3198
+ {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"},
3199
+ ]
3200
+
3201
  [[package]]
3202
  name = "urllib3"
3203
  version = "2.6.3"
 
3556
  [metadata]
3557
  lock-version = "2.1"
3558
  python-versions = "3.12.*"
3559
+ content-hash = "21ee864f85b2d6dd24179501b87e6d32ceac766d4acc9ec5d77645d20cf8037f"
pyproject.toml CHANGED
@@ -18,7 +18,10 @@ dependencies = [
18
  "pydantic-ai-slim (>=1.67.0,<2.0.0)",
19
  "openai (>=2.26.0,<3.0.0)",
20
  "chromadb (>=1.5.5,<2.0.0)",
21
- "aiofiles (>=25.1.0,<26.0.0)"
 
 
 
22
  ]
23
 
24
 
 
18
  "pydantic-ai-slim (>=1.67.0,<2.0.0)",
19
  "openai (>=2.26.0,<3.0.0)",
20
  "chromadb (>=1.5.5,<2.0.0)",
21
+ "aiofiles (>=25.1.0,<26.0.0)",
22
+ "pandas (>=3.0.1,<4.0.0)",
23
+ "openpyxl (>=3.1.5,<4.0.0)",
24
+ "numpy (>=2.4.3,<3.0.0)"
25
  ]
26
 
27
 
src/entities/__init__.py CHANGED
@@ -1,4 +1,10 @@
1
  from fastapi import APIRouter
 
 
 
 
 
 
2
 
3
  from .apparatus import *
4
  from .incident import *
 
1
  from fastapi import APIRouter
2
+ from .incident import *
3
+ from .apparatus import *
4
+ from .personnel import *
5
+ from .auv_incidentbase import *
6
+ from .auv_incidentapparatus import *
7
+ from .auv_incidentpersonnel import *
8
 
9
  from .apparatus import *
10
  from .incident import *
src/entities/apparatus/_model.py CHANGED
@@ -36,7 +36,7 @@ class ApparatusModel(BaseModel_):
36
  inservicetime = Column(DateTime, nullable=True)
37
  respondfromquarters = Column(Boolean, nullable=True)
38
  changedate = Column(DateTime, nullable=True)
39
- rowguid = Column(String(36), nullable=False)
40
  hydrant_idnumber = Column(String(20), nullable=True)
41
  hydrant_location = Column(String(116), nullable=True)
42
  alarms = Column(String(10), nullable=True)
@@ -65,4 +65,5 @@ class ApparatusModel(BaseModel_):
65
  responsetime = Column(String(20), nullable=True)
66
  turntime = Column(String(20), nullable=True)
67
 
68
- incident = relationship("Incident", back_populates="apparatus")
 
 
36
  inservicetime = Column(DateTime, nullable=True)
37
  respondfromquarters = Column(Boolean, nullable=True)
38
  changedate = Column(DateTime, nullable=True)
39
+ rowguid = Column(String(36), nullable=True)
40
  hydrant_idnumber = Column(String(20), nullable=True)
41
  hydrant_location = Column(String(116), nullable=True)
42
  alarms = Column(String(10), nullable=True)
 
65
  responsetime = Column(String(20), nullable=True)
66
  turntime = Column(String(20), nullable=True)
67
 
68
+ incident = relationship("IncidentModel", back_populates="apparatus")
69
+ personnel = relationship("PersonnelModel", back_populates="apparatus")
src/entities/auv_incidentapparatus/_model.py CHANGED
@@ -35,41 +35,41 @@ class IncidentApparatusModel(BaseModel_):
35
  actiontaken4descip = Column(String(255))
36
  numberofresponders = Column(Integer)
37
  dispatchdatetime = Column(DateTime)
38
- dispatchtime = Column(Time)
39
  dispatchdate = Column(Date)
40
- dispatchenroutetime = Column(Time)
41
  dispatchenroutediffseconds = Column(Integer)
42
  enroutetoscenedatetime = Column(DateTime)
43
- enroutetoscenetime = Column(Time)
44
  enroutetoscenedate = Column(Date)
45
- enroutearrivalscenetime = Column(Time)
46
  enroutearrivalscenediffseconds = Column(Integer)
47
- responsetime = Column(Time)
48
  responsetimeseconds = Column(Integer)
49
  arrivaldatetime = Column(DateTime)
50
- arrivaltime = Column(Time)
51
  arrivaldate = Column(Date)
52
- arrivaltoenroutehospdifftime = Column(Time)
53
  arrivaltoenroutehospdiffseconds = Column(Integer)
54
  enroutetohospitaldatetime = Column(DateTime)
55
- enroutetohospitaltime = Column(Time)
56
  enroutetohospitaldate = Column(Date)
57
- enroutetoarrivalhospdifftime = Column(Time)
58
  enroutetoarrivalhospdiffseconds = Column(Integer)
59
- arrivalscenetoarrivalhospdifftime = Column(Time)
60
  arrivalscenetoarrivalhospdiffseconds = Column(Integer)
61
  hospitalarrivaldatetime = Column(DateTime)
62
- hospitalarrivaltime = Column(Time)
63
  hospitalarrivaldate = Column(Date)
64
- arrivalclearhospdifftime = Column(Time)
65
  arrivalclearhospdiffseconds = Column(Integer)
66
  cleardatetime = Column(DateTime)
67
- cleartime = Column(Time)
68
  cleardate = Column(Date)
69
- dispatchcleardifftime = Column(Time)
70
  dispatchcleardiffseconds = Column(Integer)
71
  inservicedatetime = Column(DateTime)
72
- inservicetime = Column(Time)
73
  inservicedate = Column(Date)
74
  emsruncode = Column(String(10))
75
  emsrundescrip = Column(String(100))
@@ -82,14 +82,14 @@ class IncidentApparatusModel(BaseModel_):
82
  amount2 = Column(Integer)
83
  fdid_no = Column(String(20))
84
  stagingdatetime = Column(DateTime)
85
- stagingtime = Column(Time)
86
  stagingdate = Column(Date)
87
  AtPatientSideDateTime = Column(DateTime)
88
- AtPatientSideTime = Column(Time)
89
  AtPatientSideDate = Column(Date)
90
  FacilityDateTime = Column(DateTime)
91
- FacilityTime = Column(Time)
92
  FacilityDate = Column(Date)
93
  changedate = Column(DateTime)
94
 
95
- incident = relationship("Incident", back_populates="apparatus")
 
35
  actiontaken4descip = Column(String(255))
36
  numberofresponders = Column(Integer)
37
  dispatchdatetime = Column(DateTime)
38
+ dispatchtime = Column(String(10))
39
  dispatchdate = Column(Date)
40
+ dispatchenroutetime = Column(String(10))
41
  dispatchenroutediffseconds = Column(Integer)
42
  enroutetoscenedatetime = Column(DateTime)
43
+ enroutetoscenetime = Column(String(10))
44
  enroutetoscenedate = Column(Date)
45
+ enroutearrivalscenetime = Column(String(10))
46
  enroutearrivalscenediffseconds = Column(Integer)
47
+ responsetime = Column(String(10))
48
  responsetimeseconds = Column(Integer)
49
  arrivaldatetime = Column(DateTime)
50
+ arrivaltime = Column(String(10))
51
  arrivaldate = Column(Date)
52
+ arrivaltoenroutehospdifftime = Column(String(10))
53
  arrivaltoenroutehospdiffseconds = Column(Integer)
54
  enroutetohospitaldatetime = Column(DateTime)
55
+ enroutetohospitaltime = Column(String(10))
56
  enroutetohospitaldate = Column(Date)
57
+ enroutetoarrivalhospdifftime = Column(String(10))
58
  enroutetoarrivalhospdiffseconds = Column(Integer)
59
+ arrivalscenetoarrivalhospdifftime = Column(String(10))
60
  arrivalscenetoarrivalhospdiffseconds = Column(Integer)
61
  hospitalarrivaldatetime = Column(DateTime)
62
+ hospitalarrivaltime = Column(String(10))
63
  hospitalarrivaldate = Column(Date)
64
+ arrivalclearhospdifftime = Column(String(10))
65
  arrivalclearhospdiffseconds = Column(Integer)
66
  cleardatetime = Column(DateTime)
67
+ cleartime = Column(String(10))
68
  cleardate = Column(Date)
69
+ dispatchcleardifftime = Column(String(10))
70
  dispatchcleardiffseconds = Column(Integer)
71
  inservicedatetime = Column(DateTime)
72
+ inservicetime = Column(String(10))
73
  inservicedate = Column(Date)
74
  emsruncode = Column(String(10))
75
  emsrundescrip = Column(String(100))
 
82
  amount2 = Column(Integer)
83
  fdid_no = Column(String(20))
84
  stagingdatetime = Column(DateTime)
85
+ stagingtime = Column(String(10))
86
  stagingdate = Column(Date)
87
  AtPatientSideDateTime = Column(DateTime)
88
+ AtPatientSideTime = Column(String(10))
89
  AtPatientSideDate = Column(Date)
90
  FacilityDateTime = Column(DateTime)
91
+ FacilityTime = Column(String(10))
92
  FacilityDate = Column(Date)
93
  changedate = Column(DateTime)
94
 
95
+ incident = relationship("IncidentModel", back_populates="incident_apparatus")
src/entities/auv_incidentpersonnel/_model.py CHANGED
@@ -1,10 +1,13 @@
1
  from sqlalchemy import Column, String, Integer, Float
 
2
  from ..base import BaseModel_
3
 
 
4
  class IncidentPersonnelModel(BaseModel_):
5
  __tablename__ = "auv_incidentpersonnel"
6
 
7
- personnelkey = Column(String(14), primary_key=True, index=True)
 
8
  namefirst = Column(String(25))
9
  namemi = Column(String(2))
10
  namelast = Column(String(25))
 
1
  from sqlalchemy import Column, String, Integer, Float
2
+ from sqlalchemy.orm import mapped_column
3
  from ..base import BaseModel_
4
 
5
+
6
  class IncidentPersonnelModel(BaseModel_):
7
  __tablename__ = "auv_incidentpersonnel"
8
 
9
+ id = Column(Integer, primary_key=True, autoincrement=True)
10
+ personnelkey = Column(String(14))
11
  namefirst = Column(String(25))
12
  namemi = Column(String(2))
13
  namelast = Column(String(25))
src/entities/incident/_model.py CHANGED
@@ -2,6 +2,7 @@ from sqlalchemy import Column, String, Integer, Float, Boolean, DateTime, Text,
2
  from sqlalchemy.orm import relationship
3
  from ..base import BaseModel_
4
 
 
5
  class IncidentModel(BaseModel_):
6
  __tablename__ = "incident"
7
 
@@ -10,30 +11,30 @@ class IncidentModel(BaseModel_):
10
  incidentnumber = Column(String(10))
11
  exposure = Column(String(3))
12
  incidentstatus = Column(String(20))
13
- reviewstatusflag = Column(Boolean, nullable=False)
14
- publicreleaseflag = Column(Boolean, nullable=False)
15
- completed = Column(Boolean, nullable=False)
16
  transactiontype = Column(String(4))
17
  district = Column(String(10))
18
  station = Column(String(30))
19
  shift = Column(String(2))
20
  company = Column(String(64))
21
- incidenttype = Column(String(4), nullable=False)
22
  initialdispatchcode = Column(String(25))
23
- mutualaidcode = Column(String(4), nullable=False)
24
  alarmdate = Column(DateTime)
25
  arrivaldate = Column(DateTime)
26
- didnotarriveflag = Column(Boolean, nullable=False)
27
  controlleddate = Column(DateTime)
28
  lastunitcleareddate = Column(DateTime)
29
- includemutualaidflag = Column(Boolean, nullable=False)
30
  madepartment = Column(String(30))
31
  madeptincidentno = Column(String(9))
32
  alarms = Column(Integer)
33
  actiontaken1 = Column(String(4))
34
  actiontaken2 = Column(String(4))
35
  actiontaken3 = Column(String(4))
36
- resourceformusedflag = Column(Boolean, nullable=False)
37
  apparatussuppression = Column(Integer)
38
  apparatusems = Column(Integer)
39
  apparatusother = Column(Integer)
@@ -52,7 +53,7 @@ class IncidentModel(BaseModel_):
52
  hazardmaterialreleased = Column(String(4))
53
  mixeduse = Column(String(4))
54
  propertyuse = Column(String(4))
55
- emsprovidedflag = Column(Boolean, nullable=False)
56
  casualtiesflag = Column(Integer)
57
  priorityresponseflag = Column(Boolean)
58
  vendorid = Column(String(20))
@@ -70,7 +71,7 @@ class IncidentModel(BaseModel_):
70
  directions = Column(Text)
71
  latitude = Column(String(20))
72
  longitude = Column(String(20))
73
- compositeaddress = Column(String(50), nullable=False)
74
  county = Column(String(20))
75
  occupancykey = Column(String(14))
76
  occupancynumber = Column(String(16))
@@ -83,8 +84,8 @@ class IncidentModel(BaseModel_):
83
  changedate = Column(DateTime)
84
  rowguid = Column(String(50))
85
  LogComments = Column(Text)
86
- Incident_ID = Column(Integer, nullable=False)
87
- loss_not_known = Column(Boolean, nullable=False)
88
  collecteddate = Column(DateTime)
89
  DispatchIncType = Column(String(80))
90
  nfscasualtycnt = Column(Integer)
@@ -108,6 +109,6 @@ class IncidentModel(BaseModel_):
108
  Northing = Column(String(5))
109
 
110
  # relationships
111
- apparatus = relationship("Apparatus", back_populates="incident")
112
- personnel = relationship("Personnel", back_populates="incident")
113
  incident_apparatus = relationship("IncidentApparatusModel", back_populates="incident")
 
2
  from sqlalchemy.orm import relationship
3
  from ..base import BaseModel_
4
 
5
+
6
  class IncidentModel(BaseModel_):
7
  __tablename__ = "incident"
8
 
 
11
  incidentnumber = Column(String(10))
12
  exposure = Column(String(3))
13
  incidentstatus = Column(String(20))
14
+ reviewstatusflag = Column(Boolean, nullable=True)
15
+ publicreleaseflag = Column(Boolean, nullable=True)
16
+ completed = Column(Boolean, nullable=True)
17
  transactiontype = Column(String(4))
18
  district = Column(String(10))
19
  station = Column(String(30))
20
  shift = Column(String(2))
21
  company = Column(String(64))
22
+ incidenttype = Column(String(4), nullable=True)
23
  initialdispatchcode = Column(String(25))
24
+ mutualaidcode = Column(String(4), nullable=True)
25
  alarmdate = Column(DateTime)
26
  arrivaldate = Column(DateTime)
27
+ didnotarriveflag = Column(Boolean, nullable=True)
28
  controlleddate = Column(DateTime)
29
  lastunitcleareddate = Column(DateTime)
30
+ includemutualaidflag = Column(Boolean, nullable=True)
31
  madepartment = Column(String(30))
32
  madeptincidentno = Column(String(9))
33
  alarms = Column(Integer)
34
  actiontaken1 = Column(String(4))
35
  actiontaken2 = Column(String(4))
36
  actiontaken3 = Column(String(4))
37
+ resourceformusedflag = Column(Boolean, nullable=True)
38
  apparatussuppression = Column(Integer)
39
  apparatusems = Column(Integer)
40
  apparatusother = Column(Integer)
 
53
  hazardmaterialreleased = Column(String(4))
54
  mixeduse = Column(String(4))
55
  propertyuse = Column(String(4))
56
+ emsprovidedflag = Column(Boolean, nullable=True)
57
  casualtiesflag = Column(Integer)
58
  priorityresponseflag = Column(Boolean)
59
  vendorid = Column(String(20))
 
71
  directions = Column(Text)
72
  latitude = Column(String(20))
73
  longitude = Column(String(20))
74
+ compositeaddress = Column(String(50), nullable=True)
75
  county = Column(String(20))
76
  occupancykey = Column(String(14))
77
  occupancynumber = Column(String(16))
 
84
  changedate = Column(DateTime)
85
  rowguid = Column(String(50))
86
  LogComments = Column(Text)
87
+ Incident_ID = Column(Integer, nullable=True)
88
+ loss_not_known = Column(Boolean, nullable=True)
89
  collecteddate = Column(DateTime)
90
  DispatchIncType = Column(String(80))
91
  nfscasualtycnt = Column(Integer)
 
109
  Northing = Column(String(5))
110
 
111
  # relationships
112
+ apparatus = relationship("ApparatusModel", back_populates="incident")
113
+ personnel = relationship("PersonnelModel", back_populates="incident")
114
  incident_apparatus = relationship("IncidentApparatusModel", back_populates="incident")
src/entities/personnel/_model.py CHANGED
@@ -24,7 +24,7 @@ class PersonnelModel(BaseModel_):
24
  amount1 = Column(Float, nullable=True)
25
  amount2 = Column(Float, nullable=True)
26
  changedate = Column(DateTime, nullable=True)
27
- rowguid = Column(String, nullable=False)
28
  crole = Column(String(4), nullable=True)
29
  lLosap_credit = Column(Boolean, nullable=True)
30
  MedCert = Column(String(4), nullable=True)
@@ -37,5 +37,5 @@ class PersonnelModel(BaseModel_):
37
  iNFIRSSequence = Column(Integer, nullable=True)
38
  NFIRSTransactiontype = Column(String(1), nullable=True)
39
 
40
- incident = relationship("Incident", back_populates="personnel")
41
- apparatus = relationship("Apparatus", back_populates="personnel")
 
24
  amount1 = Column(Float, nullable=True)
25
  amount2 = Column(Float, nullable=True)
26
  changedate = Column(DateTime, nullable=True)
27
+ rowguid = Column(String, nullable=True)
28
  crole = Column(String(4), nullable=True)
29
  lLosap_credit = Column(Boolean, nullable=True)
30
  MedCert = Column(String(4), nullable=True)
 
37
  iNFIRSSequence = Column(Integer, nullable=True)
38
  NFIRSTransactiontype = Column(String(1), nullable=True)
39
 
40
+ incident = relationship("IncidentModel", back_populates="personnel")
41
+ apparatus = relationship("ApparatusModel", back_populates="personnel")