yeref 0.24.98__py3-none-any.whl → 0.25.1__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.
yeref/yeref.py
CHANGED
@@ -16011,30 +16011,41 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
|
|
16011
16011
|
r4 = await return_retention_metrics(bot, data_users, EXTRA_D)
|
16012
16012
|
r5 = await return_profit_and_loss_metrics(bot, data_users, EXTRA_D)
|
16013
16013
|
|
16014
|
-
|
16015
|
-
|
16014
|
+
# --- Начинаем сразу с объединённого цикла по всем метрикам r1–r5 ---
|
16015
|
+
metrics_paths = [r1, r2, r3, r4, r5]
|
16016
|
+
tables = [] # сюда будем складывать словари вида {'name': basename, 'rows': [[...], ...]}
|
16017
|
+
|
16018
|
+
# 1) Собираем существующие CSV-файлы
|
16019
|
+
for path in metrics_paths:
|
16020
|
+
if path and os.path.isfile(path):
|
16021
|
+
basename = os.path.basename(path)
|
16022
|
+
with open(path, newline='', encoding='utf-8') as csvfile:
|
16023
|
+
reader = csv.reader(csvfile)
|
16024
|
+
rows = list(reader)
|
16025
|
+
logger.info(f"Найден файл '{basename}', строк = {len(rows)}.")
|
16026
|
+
tables.append({'name': basename, 'rows': rows})
|
16027
|
+
else:
|
16028
|
+
logger.warning(f"Файл не найден или не существует: {path}")
|
16029
|
+
|
16030
|
+
# 2) Если ни одного CSV не обнаружено, выходим
|
16031
|
+
if not tables:
|
16032
|
+
logger.warning("Ни один CSV-файл не найден. Прерываем запись.")
|
16033
|
+
else:
|
16034
|
+
# 3) Авторизация в Google Sheets
|
16016
16035
|
scopes = r_conf('scopes', CONF_P)
|
16017
16036
|
credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
|
16018
16037
|
credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
|
16019
16038
|
http_auth = credentials.authorize(httplib2.Http())
|
16020
16039
|
sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
|
16021
16040
|
|
16022
|
-
#
|
16041
|
+
# 4) Переименовываем стандартный лист «Лист1»/«Sheet1» → PROJECT_USERNAME
|
16023
16042
|
spreadsheet = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
|
16024
|
-
logger.info(f"До переименования. Найдено листов: {len(spreadsheet.get('sheets', []))}")
|
16025
|
-
for sheet in spreadsheet.get('sheets', []):
|
16026
|
-
props = sheet.get('properties', {})
|
16027
|
-
logger.info(f" • sheetId={props.get('sheetId')} title='{props.get('title')}'")
|
16028
|
-
|
16029
16043
|
sheet_id_to_rename = None
|
16030
|
-
original_title = None
|
16031
16044
|
for sheet in spreadsheet.get('sheets', []):
|
16032
16045
|
props = sheet.get('properties', {})
|
16033
16046
|
title = props.get('title', '')
|
16034
16047
|
if title in ['Лист1', 'Sheet1']:
|
16035
16048
|
sheet_id_to_rename = props.get('sheetId')
|
16036
|
-
original_title = title
|
16037
|
-
logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
|
16038
16049
|
break
|
16039
16050
|
|
16040
16051
|
if sheet_id_to_rename is not None:
|
@@ -16055,89 +16066,53 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
|
|
16055
16066
|
spreadsheetId=dataroom_folder_id,
|
16056
16067
|
body=rename_request
|
16057
16068
|
).execute()
|
16058
|
-
logger.info(f"
|
16059
|
-
|
16060
|
-
# Проверим изменения
|
16061
|
-
spreadsheet_after = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
|
16062
|
-
logger.info("После переименования. Список листов теперь:")
|
16063
|
-
for sheet in spreadsheet_after.get('sheets', []):
|
16064
|
-
props = sheet.get('properties', {})
|
16065
|
-
logger.info(f" • sheetId={props.get('sheetId')} title='{props.get('title')}'")
|
16069
|
+
logger.info(f"Лист переименован в '{PROJECT_USERNAME}'.")
|
16066
16070
|
else:
|
16067
|
-
logger.warning("Не найден лист
|
16068
|
-
|
16069
|
-
#
|
16070
|
-
|
16071
|
-
|
16072
|
-
|
16073
|
-
|
16074
|
-
|
16075
|
-
|
16076
|
-
|
16077
|
-
|
16078
|
-
|
16079
|
-
|
16080
|
-
|
16081
|
-
|
16082
|
-
|
16083
|
-
|
16084
|
-
|
16085
|
-
|
16086
|
-
|
16087
|
-
|
16088
|
-
|
16089
|
-
|
16090
|
-
|
16091
|
-
|
16092
|
-
|
16093
|
-
|
16094
|
-
safe_title = PROJECT_USERNAME.replace("'", "\\'")
|
16095
|
-
offset = 1 # строка, с которой вставляем следующий блок
|
16096
|
-
data_requests = []
|
16097
|
-
|
16098
|
-
for tbl in tables:
|
16099
|
-
# 4.1) Вставляем название файла (одна строка)
|
16100
|
-
header_range = f"'{safe_title}'!A{offset}"
|
16101
|
-
data_requests.append({
|
16102
|
-
'range': header_range,
|
16103
|
-
'majorDimension': 'ROWS',
|
16104
|
-
'values': [[tbl['name']]]
|
16105
|
-
})
|
16106
|
-
logger.info(f"Добавили запрос на запись заголовка '{tbl['name']}' в A{offset}.")
|
16107
|
-
offset += 1
|
16108
|
-
|
16109
|
-
# 4.2) Вставляем саму таблицу (все строки CSV) сразу под названием
|
16110
|
-
data_range = f"'{safe_title}'!A{offset}"
|
16111
|
-
data_requests.append({
|
16112
|
-
'range': data_range,
|
16113
|
-
'majorDimension': 'ROWS',
|
16114
|
-
'values': tbl['rows']
|
16115
|
-
})
|
16116
|
-
logger.info(
|
16117
|
-
f"Добавили запрос на запись {len(tbl['rows'])} строк таблицы '{tbl['name']}' в A{offset}.")
|
16118
|
-
offset += len(tbl['rows'])
|
16119
|
-
|
16120
|
-
# 4.3) Оставляем минимум 2 пустые строки перед следующей таблицей
|
16121
|
-
offset += 2
|
16122
|
-
|
16123
|
-
# 5) Выполняем единственный batchUpdate с all data_requests
|
16124
|
-
write_body = {
|
16125
|
-
'valueInputOption': 'USER_ENTERED',
|
16126
|
-
'data': data_requests
|
16127
|
-
}
|
16128
|
-
try:
|
16129
|
-
response = sheets_service.spreadsheets().values().batchUpdate(
|
16130
|
-
spreadsheetId=dataroom_folder_id,
|
16131
|
-
body=write_body
|
16132
|
-
).execute()
|
16133
|
-
total_cells = response.get('totalUpdatedCells', 0)
|
16134
|
-
logger.info(f"Успешно записано в Google Sheets: всего обновлено ячеек = {total_cells}.")
|
16135
|
-
except Exception as e:
|
16136
|
-
logger.error(f"Ошибка при записи всех таблиц в Google Sheets: {e}")
|
16137
|
-
else:
|
16138
|
-
logger.warning(f"Файл r1 не найден или не существует: {r1}")
|
16071
|
+
logger.warning("Не найден лист 'Лист1' или 'Sheet1' для переименования.")
|
16072
|
+
|
16073
|
+
# 5) Готовим запросы для записи всех таблиц одна за другой с промежутком
|
16074
|
+
safe_title = PROJECT_USERNAME.replace("'", "\\'")
|
16075
|
+
offset = 1 # первая строка, с которой начнём писать
|
16076
|
+
data_requests = []
|
16077
|
+
|
16078
|
+
for tbl in tables:
|
16079
|
+
# 5.1) Заголовок: имя CSV-файла
|
16080
|
+
header_range = f"'{safe_title}'!A{offset}"
|
16081
|
+
data_requests.append({
|
16082
|
+
'range': header_range,
|
16083
|
+
'majorDimension': 'ROWS',
|
16084
|
+
'values': [[tbl['name']]]
|
16085
|
+
})
|
16086
|
+
logger.info(f"Добавлен заголовок '{tbl['name']}' → A{offset}")
|
16087
|
+
offset += 1
|
16088
|
+
|
16089
|
+
# 5.2) Содержимое CSV: все строки сразу под заголовком
|
16090
|
+
data_range = f"'{safe_title}'!A{offset}"
|
16091
|
+
data_requests.append({
|
16092
|
+
'range': data_range,
|
16093
|
+
'majorDimension': 'ROWS',
|
16094
|
+
'values': tbl['rows']
|
16095
|
+
})
|
16096
|
+
logger.info(f"Добавлены {len(tbl['rows'])} строк из '{tbl['name']}' → A{offset}")
|
16097
|
+
offset += len(tbl['rows'])
|
16139
16098
|
|
16099
|
+
# 5.3) Оставляем минимум 2 пустые строки перед следующей таблицей
|
16100
|
+
offset += 2
|
16140
16101
|
|
16102
|
+
# 6) Выполняем единый batchUpdate для всех data_requests
|
16103
|
+
write_body = {
|
16104
|
+
'valueInputOption': 'USER_ENTERED',
|
16105
|
+
'data': data_requests
|
16106
|
+
}
|
16107
|
+
try:
|
16108
|
+
response = sheets_service.spreadsheets().values().batchUpdate(
|
16109
|
+
spreadsheetId=dataroom_folder_id,
|
16110
|
+
body=write_body
|
16111
|
+
).execute()
|
16112
|
+
total_cells = response.get('totalUpdatedCells', 0)
|
16113
|
+
logger.info(f"Успешно записано в Google Sheets: всего обновлено ячеек = {total_cells}.")
|
16114
|
+
except Exception as e:
|
16115
|
+
logger.error(f"Ошибка при записи всех таблиц в Google Sheets: {e}")
|
16141
16116
|
except Exception as e:
|
16142
16117
|
logger.info(log_ % str(e))
|
16143
16118
|
await asyncio.sleep(round(random.uniform(0, 1), 2))
|
@@ -0,0 +1,8 @@
|
|
1
|
+
yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
|
2
|
+
yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
|
3
|
+
yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
|
4
|
+
yeref/yeref.py,sha256=DfuhzfUBIlg5vweCztijcrJWXhSBGkK5ftOlxnMIFHg,1055618
|
5
|
+
yeref-0.25.1.dist-info/METADATA,sha256=rjvJMVNCxzK1wec83_EG2KJ5lkgGUMkW-0_zOXslF-g,118
|
6
|
+
yeref-0.25.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
+
yeref-0.25.1.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
|
8
|
+
yeref-0.25.1.dist-info/RECORD,,
|
yeref-0.24.98.dist-info/RECORD
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
|
2
|
-
yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
|
3
|
-
yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
|
4
|
-
yeref/yeref.py,sha256=p6g9zw-LRJx_rpHe7tTAR2BA7Rdsuz5PAtKwlNKf_nI,1057610
|
5
|
-
yeref-0.24.98.dist-info/METADATA,sha256=EIc6Ur84xwVbYbNOYxbr5B7cwkQTgtLwMLmfOQFQl2s,119
|
6
|
-
yeref-0.24.98.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
-
yeref-0.24.98.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
|
8
|
-
yeref-0.24.98.dist-info/RECORD,,
|
File without changes
|
File without changes
|