Skip to content

Commit 789314d

Browse files
author
Sergey Chernyak
committed
v2020.05.28 added google spreadsheet support.
Added new User model. New abstraction for cleaner code.
1 parent 452f3fb commit 789314d

File tree

26 files changed

+710
-128
lines changed

26 files changed

+710
-128
lines changed

Pipfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ attrs="*"
1515
psycopg2 = "*"
1616
click = "*"
1717
pytz = "*"
18+
gspread = "*"
1819

1920
[requires]
2021
python_version = "3.6"

Pipfile.lock

Lines changed: 118 additions & 59 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

setup.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,16 @@
1515
url="https://github.com/onyxim/explicitdev",
1616
packages=find_packages("src"),
1717
package_dir={"": "src"},
18-
install_requires=["jira", "sqlalchemy", "attrs", "psycopg2", "click", "pytz"],
19-
extras_require={"dev": ["pipenv-setup", "pytest", "coverage", ], },
18+
install_requires=[
19+
"jira",
20+
"sqlalchemy",
21+
"attrs",
22+
"psycopg2",
23+
"click",
24+
"pytz",
25+
"gspread",
26+
],
27+
extras_require={"dev": ["pipenv-setup", "pytest", "coverage",],},
2028
include_package_data=True,
2129
license="Apache License 2.0",
2230
classifiers=[
Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,66 @@
1+
import logging
12
from typing import Type, TYPE_CHECKING
23

4+
from explicitdev.utils.abstract import AbstractWithConfig
5+
from explicitdev.utils.const import ReportSaveModes
36
from explicitdev.utils.csv import save_alchemy_query_to_csv
47

58
if TYPE_CHECKING:
69
from explicitdev.config import Config
710

811

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)
1316
self.Issue = c.Models.Issue.Class
1417
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
1524

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):
1726
report_path = self.c.Reports.dir.joinpath(report_name)
1827
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

Comments
 (0)