yeref 0.24.98__py3-none-any.whl → 0.24.99__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 +97 -122
- {yeref-0.24.98.dist-info → yeref-0.24.99.dist-info}/METADATA +1 -1
- yeref-0.24.99.dist-info/RECORD +8 -0
- yeref-0.24.98.dist-info/RECORD +0 -8
- {yeref-0.24.98.dist-info → yeref-0.24.99.dist-info}/WHEEL +0 -0
- {yeref-0.24.98.dist-info → yeref-0.24.99.dist-info}/top_level.txt +0 -0
yeref/yeref.py
CHANGED
@@ -16011,133 +16011,108 @@ 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
|
-
|
16016
|
-
|
16017
|
-
|
16018
|
-
|
16019
|
-
|
16020
|
-
|
16021
|
-
|
16022
|
-
|
16023
|
-
|
16024
|
-
|
16025
|
-
|
16026
|
-
|
16027
|
-
|
16028
|
-
|
16029
|
-
sheet_id_to_rename = None
|
16030
|
-
original_title = None
|
16031
|
-
for sheet in spreadsheet.get('sheets', []):
|
16032
|
-
props = sheet.get('properties', {})
|
16033
|
-
title = props.get('title', '')
|
16034
|
-
if title in ['Лист1', 'Sheet1']:
|
16035
|
-
sheet_id_to_rename = props.get('sheetId')
|
16036
|
-
original_title = title
|
16037
|
-
logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
|
16038
|
-
break
|
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}")
|
16039
16029
|
|
16040
|
-
|
16041
|
-
|
16042
|
-
|
16043
|
-
|
16044
|
-
|
16045
|
-
|
16046
|
-
|
16047
|
-
|
16048
|
-
|
16049
|
-
|
16050
|
-
}
|
16051
|
-
}
|
16052
|
-
]
|
16053
|
-
}
|
16054
|
-
sheets_service.spreadsheets().batchUpdate(
|
16055
|
-
spreadsheetId=dataroom_folder_id,
|
16056
|
-
body=rename_request
|
16057
|
-
).execute()
|
16058
|
-
logger.info(f"Запрос на переименование отправлен: '{original_title}' → '{PROJECT_USERNAME}'")
|
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')}'")
|
16066
|
-
else:
|
16067
|
-
logger.warning("Не найден лист с названием 'Лист1' или 'Sheet1' — пропускаем переименование.")
|
16068
|
-
|
16069
|
-
# 3) Подготовим список «таблиц» (r1–r5). Пробежимся по каждому r и, если файл существует, прочитаем его
|
16070
|
-
table_paths = [
|
16071
|
-
r1,
|
16072
|
-
r2 if 'r2' in locals() else None,
|
16073
|
-
r3 if 'r3' in locals() else None,
|
16074
|
-
r4 if 'r4' in locals() else None,
|
16075
|
-
r5 if 'r5' in locals() else None,
|
16076
|
-
]
|
16077
|
-
tables = [] # будет список словарей { 'name': basename, 'rows': [[...], ...] }
|
16078
|
-
for idx, path in enumerate(table_paths, start=1):
|
16079
|
-
if path and os.path.isfile(path):
|
16080
|
-
basename = os.path.basename(path)
|
16081
|
-
with open(path, newline='', encoding='utf-8') as csvfile:
|
16082
|
-
reader = csv.reader(csvfile)
|
16083
|
-
rows = list(reader)
|
16084
|
-
logger.info(f"Для таблицы #{idx}: найден файл '{basename}', строк = {len(rows)}.")
|
16085
|
-
tables.append({'name': basename, 'rows': rows})
|
16086
|
-
else:
|
16087
|
-
logger.warning(f"Таблица #{idx}: файл не найден или не существует: {path}")
|
16030
|
+
# 2) Если ни одного CSV не обнаружено, выходим
|
16031
|
+
if not tables:
|
16032
|
+
logger.warning("Ни один CSV-файл не найден. Прерываем запись.")
|
16033
|
+
else:
|
16034
|
+
# 3) Авторизация в Google Sheets
|
16035
|
+
scopes = r_conf('scopes', CONF_P)
|
16036
|
+
credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
|
16037
|
+
credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
|
16038
|
+
http_auth = credentials.authorize(httplib2.Http())
|
16039
|
+
sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
|
16088
16040
|
|
16089
|
-
|
16090
|
-
|
16091
|
-
|
16092
|
-
|
16093
|
-
|
16094
|
-
|
16095
|
-
|
16096
|
-
|
16097
|
-
|
16098
|
-
|
16099
|
-
|
16100
|
-
|
16101
|
-
|
16102
|
-
|
16103
|
-
'
|
16104
|
-
|
16105
|
-
|
16106
|
-
|
16107
|
-
|
16108
|
-
|
16109
|
-
|
16110
|
-
|
16111
|
-
|
16112
|
-
|
16113
|
-
|
16114
|
-
|
16115
|
-
|
16116
|
-
|
16117
|
-
|
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}")
|
16041
|
+
# 4) Переименовываем стандартный лист «Лист1»/«Sheet1» → PROJECT_USERNAME
|
16042
|
+
spreadsheet = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
|
16043
|
+
sheet_id_to_rename = None
|
16044
|
+
for sheet in spreadsheet.get('sheets', []):
|
16045
|
+
props = sheet.get('properties', {})
|
16046
|
+
title = props.get('title', '')
|
16047
|
+
if title in ['Лист1', 'Sheet1']:
|
16048
|
+
sheet_id_to_rename = props.get('sheetId')
|
16049
|
+
break
|
16050
|
+
|
16051
|
+
if sheet_id_to_rename is not None:
|
16052
|
+
rename_request = {
|
16053
|
+
'requests': [
|
16054
|
+
{
|
16055
|
+
'updateSheetProperties': {
|
16056
|
+
'properties': {
|
16057
|
+
'sheetId': sheet_id_to_rename,
|
16058
|
+
'title': PROJECT_USERNAME
|
16059
|
+
},
|
16060
|
+
'fields': 'title'
|
16061
|
+
}
|
16062
|
+
}
|
16063
|
+
]
|
16064
|
+
}
|
16065
|
+
sheets_service.spreadsheets().batchUpdate(
|
16066
|
+
spreadsheetId=dataroom_folder_id,
|
16067
|
+
body=rename_request
|
16068
|
+
).execute()
|
16069
|
+
logger.info(f"Лист переименован в '{PROJECT_USERNAME}'.")
|
16137
16070
|
else:
|
16138
|
-
logger.warning(
|
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=Dj2jndTfiXUJ_fB-hL4tP9ougOcVbUxXdE6HHZ-ikEw,1055246
|
5
|
+
yeref-0.24.99.dist-info/METADATA,sha256=DEUgBkgS-tNtezhSF4aD_Rh59oyMn13Mbtql4JbRvvQ,119
|
6
|
+
yeref-0.24.99.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
+
yeref-0.24.99.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
|
8
|
+
yeref-0.24.99.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
|