pjdev-sqlmodel 4.3.0__tar.gz → 4.3.1__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pjdev-sqlmodel
3
- Version: 4.3.0
3
+ Version: 4.3.1
4
4
  Project-URL: Documentation, https://gitlab.purplejay.net/keystone/python
5
5
  Project-URL: Issues, https://gitlab.purplejay.net/keystone/python/issues
6
6
  Project-URL: Source, https://gitlab.purplejay.net/keystone/python
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024-present Chris O'Neill <chris@purplejay.io>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "4.3.0"
4
+ __version__ = "4.3.1"
@@ -8,6 +8,7 @@ import pandas as pd
8
8
  from openpyxl.reader.excel import load_workbook
9
9
  from loguru import logger
10
10
  from sqlalchemy import Engine
11
+ from sqlmodel import select
11
12
 
12
13
  from pjdev_sqlmodel import session_context, sqlmodel_service
13
14
  from pjdev_sqlmodel.models import ModelBase
@@ -15,10 +16,14 @@ from pjdev_sqlmodel.models import ModelBase
15
16
  T = TypeVar("T", bound=ModelBase)
16
17
 
17
18
 
18
- def get_files_in_directory(directory: Path) -> List[Path]:
19
- return [f for f in directory.glob("**/*.xlsx") if not f.name.startswith("~$")] + [
20
- f for f in directory.glob("**/*.csv")
19
+ def get_files_in_directory(directory: Path, file_name='*', force_presence=False) -> List[Path]:
20
+ file_obj = [f for f in directory.glob(f"**/{file_name}.xlsx") if not f.name.startswith("~$")] + [
21
+ f for f in directory.glob(f"**/{file_name}.csv")
21
22
  ]
23
+ if force_presence and len(file_obj) == 0:
24
+ logger.error(f'Failed to find files matching the {directory}/{file_name} pattern and presence is required. Exiting...')
25
+ exit(1)
26
+ return file_obj
22
27
 
23
28
 
24
29
  def get_csv_columns(file_path):
@@ -167,6 +172,75 @@ def load_raw_excel_data(
167
172
  )
168
173
 
169
174
 
175
+ def convert_table_to_df(InputTable: type[BaseModel]):
176
+ with session_context() as session:
177
+ statement = select(InputTable)
178
+ results = session.exec(statement).all()
179
+
180
+ headers = []
181
+ field_names = []
182
+ for name, annotation in InputTable.__annotations__.items():
183
+ field = InputTable.__fields__[name]
184
+ alias = field.alias if field.alias else name
185
+ headers.append(alias)
186
+ field_names.append(name)
187
+
188
+ data = []
189
+ for res in results:
190
+ new_obj = {}
191
+ for i in range(len(headers)):
192
+ header = headers[i]
193
+ field_name = field_names[i]
194
+ new_obj[header] = getattr(res, field_name)
195
+ data.append(new_obj)
196
+ df = pd.DataFrame(data)
197
+ return df
198
+
199
+
200
+ def convert_table_to_csv(InputTable: type[BaseModel], file: Path):
201
+ df = convert_table_to_df(InputTable)
202
+ df.to_csv(file, index=False)
203
+
204
+
205
+ def export_to_sheet(InputTable: type[BaseModel], wb: Workbook, sheet_name: str, table_name: str = None, hide_sheet=False):
206
+ df = convert_table_to_df(InputTable)
207
+ ws = wb.create_sheet(title=sheet_name)
208
+ if hide_sheet:
209
+ ws.sheet_state = 'hidden'
210
+
211
+ if table_name:
212
+ ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(df.columns))
213
+ cell = ws.cell(row=1, column=1)
214
+ cell.value = table_name
215
+ cell.font = Font(bold=True)
216
+ cell.alignment = Alignment(horizontal="center")
217
+ start_row = 2
218
+ ws.row_dimensions[1].height = 40.5
219
+ ws.row_dimensions[2].height = 30.75
220
+ else:
221
+ start_row = 1
222
+ ws.row_dimensions[1].height = 30.75
223
+
224
+ for r_idx, row in enumerate(dataframe_to_rows(df, index=False, header=True), start=start_row):
225
+ for c_idx, value in enumerate(row, start=1):
226
+ cell = ws.cell(row=r_idx, column=c_idx, value=value)
227
+ if r_idx == start_row:
228
+ cell.font = Font(bold=True)
229
+ cell.alignment = Alignment(horizontal="center")
230
+
231
+ for col_idx in range(1, len(df.columns) + 1):
232
+ column_letter = get_column_letter(col_idx)
233
+ max_length = 0
234
+ for cell in ws[column_letter]:
235
+ try:
236
+ if cell.value:
237
+ max_length = max(max_length, len(str(cell.value)))
238
+ except:
239
+ pass
240
+ adjusted_width = (max_length + 2)
241
+ ws.column_dimensions[column_letter].width = adjusted_width
242
+
243
+
170
244
  def __read_csv(
171
245
  file: Path | str,
172
246
  cols: Optional[List[str]] = None,
@@ -208,4 +282,4 @@ def convert_to_csv(
208
282
  df = pd.DataFrame(dict_data)
209
283
 
210
284
  # Export DataFrame to CSV
211
- df.to_csv(filename, index=index, columns=cols)
285
+ df.to_csv(filename, index=index, columns=cols)
File without changes