|
| 1 | +import logging |
1 | 2 | from typing import Type, TYPE_CHECKING |
2 | 3 |
|
| 4 | +from explicitdev.utils.abstract import AbstractWithConfig |
| 5 | +from explicitdev.utils.const import ReportSaveModes |
3 | 6 | from explicitdev.utils.csv import save_alchemy_query_to_csv |
4 | 7 |
|
5 | 8 | if TYPE_CHECKING: |
6 | 9 | from explicitdev.config import Config |
7 | 10 |
|
8 | 11 |
|
9 | | -class AbstractAnalyzer: |
10 | | - def __init__(self, c): |
11 | | - # type: (Type[Config]) -> None |
12 | | - self.c = c |
| 12 | +class AbstractAnalyzer(AbstractWithConfig): |
| 13 | + |
| 14 | + def __init__(self, c: 'Config', *args, **kwargs): |
| 15 | + super().__init__(c, *args, **kwargs) |
13 | 16 | self.Issue = c.Models.Issue.Class |
14 | 17 | self.Status = c.Models.Status.Class |
| 18 | + self.Report: Config.Reports.AbstractReport = None |
| 19 | + """Report upload settings from config""" |
| 20 | + |
| 21 | + def get_report(self): |
| 22 | + """Method for actually getting and saving report""" |
| 23 | + pass |
15 | 24 |
|
16 | | - def save_results_to_csv(self, results_query, report_name: str, **kwargs): |
| 25 | + def _save_results_to_csv(self, results_query, report_name: str, **kwargs): |
17 | 26 | report_path = self.c.Reports.dir.joinpath(report_name) |
18 | 27 | save_alchemy_query_to_csv(results_query, report_path, **kwargs) |
| 28 | + |
| 29 | + @staticmethod |
| 30 | + def _get_rows_from_query(query): |
| 31 | + first_row = True |
| 32 | + for row in query: |
| 33 | + if first_row: |
| 34 | + # возвражаещ заголовки |
| 35 | + yield tuple(row._asdict().keys()) |
| 36 | + first_row = False |
| 37 | + yield tuple(row) |
| 38 | + |
| 39 | + def _update_gspread(self, query): |
| 40 | + class_name = self.Report.__name__ |
| 41 | + |
| 42 | + gc = self.c.Reports.gspread_client |
| 43 | + spread_sheet = gc.open_by_key(self.Report.gspread_key) |
| 44 | + work_sheet = spread_sheet.worksheet(self.Report.gspread_worksheet_name) |
| 45 | + old_row_count = work_sheet.row_count |
| 46 | + rows = list(self._get_rows_from_query(query)) |
| 47 | + new_rows_count = len(rows) |
| 48 | + logging.info('Going to upload %s rows into %s report', new_rows_count, class_name) |
| 49 | + work_sheet.append_rows( |
| 50 | + rows, |
| 51 | + ) |
| 52 | + logging.info('Upload data to %s completed', class_name) |
| 53 | + logging.info('Going to delete old %s rows', old_row_count) |
| 54 | + work_sheet.delete_rows(1, old_row_count) |
| 55 | + # for don't touch first row |
| 56 | + # work_sheet.delete_rows(2, old_row_count) |
| 57 | + logging.info(('Rows delete complete.')) |
| 58 | + |
| 59 | + def _save_report(self, query): |
| 60 | + save_mode = self.Report.save_mode |
| 61 | + if save_mode == ReportSaveModes.csv: |
| 62 | + self._save_results_to_csv(query, self.Report.csv_name) |
| 63 | + elif save_mode == ReportSaveModes.gspread: |
| 64 | + self._update_gspread(query) |
| 65 | + else: |
| 66 | + raise NotImplementedError('Unknonw save mode for the report.') |
0 commit comments