yeref 0.24.96__py3-none-any.whl → 0.24.98__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,27 +16011,32 @@ 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
|
-
# === НОВЫЙ БЛОК: читаем CSV (r1) и заливаем его в Google‐таблицу ===
|
16015
16014
|
if r1 and os.path.isfile(r1):
|
16016
|
-
# 1) Авторизация в Google Sheets
|
16015
|
+
# 1) Авторизация в Google Sheets
|
16017
16016
|
scopes = r_conf('scopes', CONF_P)
|
16018
16017
|
credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
|
16019
16018
|
credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
|
16020
16019
|
http_auth = credentials.authorize(httplib2.Http())
|
16021
16020
|
sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
|
16022
16021
|
|
16023
|
-
# 2) Получаем metadata
|
16022
|
+
# 2) Получаем metadata всей таблицы и ищем лист «Лист1»/«Sheet1» для переименования
|
16024
16023
|
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
|
+
|
16025
16029
|
sheet_id_to_rename = None
|
16030
|
+
original_title = None
|
16026
16031
|
for sheet in spreadsheet.get('sheets', []):
|
16027
16032
|
props = sheet.get('properties', {})
|
16028
16033
|
title = props.get('title', '')
|
16029
|
-
# если лист называется «Лист1» (русский по умолчанию) или «Sheet1» (английский)
|
16030
16034
|
if title in ['Лист1', 'Sheet1']:
|
16031
16035
|
sheet_id_to_rename = props.get('sheetId')
|
16036
|
+
original_title = title
|
16037
|
+
logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
|
16032
16038
|
break
|
16033
16039
|
|
16034
|
-
# 3) Переименовываем лист в PROJECT_USERNAME, если нашли нужный sheetId
|
16035
16040
|
if sheet_id_to_rename is not None:
|
16036
16041
|
rename_request = {
|
16037
16042
|
'requests': [
|
@@ -16050,30 +16055,88 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
|
|
16050
16055
|
spreadsheetId=dataroom_folder_id,
|
16051
16056
|
body=rename_request
|
16052
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}")
|
16053
16088
|
|
16054
|
-
|
16055
|
-
|
16056
|
-
|
16057
|
-
|
16058
|
-
|
16059
|
-
|
16060
|
-
|
16061
|
-
|
16062
|
-
|
16063
|
-
|
16064
|
-
|
16089
|
+
if not tables:
|
16090
|
+
logger.warning("Ни один CSV-файл (r1–r5) не найден. Прерываем запись.")
|
16091
|
+
else:
|
16092
|
+
# 4) Вычисляем, куда вставлять каждый блок: начинаем с 1-й строки
|
16093
|
+
# и гарантируем между таблицами минимум 2 пустые строки
|
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,
|
16065
16103
|
'majorDimension': 'ROWS',
|
16066
|
-
'values':
|
16067
|
-
}
|
16068
|
-
|
16069
|
-
|
16070
|
-
|
16071
|
-
|
16072
|
-
|
16073
|
-
|
16074
|
-
|
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}")
|
16075
16137
|
else:
|
16076
|
-
logger.warning(f"Файл
|
16138
|
+
logger.warning(f"Файл r1 не найден или не существует: {r1}")
|
16139
|
+
|
16077
16140
|
|
16078
16141
|
except Exception as e:
|
16079
16142
|
logger.info(log_ % str(e))
|
@@ -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=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,,
|
yeref-0.24.96.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=Bfk-IETElHzdKl1GW3ZVK_vf1POOGS8aHSDd8tnvtXA,1053574
|
5
|
-
yeref-0.24.96.dist-info/METADATA,sha256=hjnk-lihxaTZDzGAfZyqgYTw2adnX-iB-TZqMijo8I4,119
|
6
|
-
yeref-0.24.96.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
7
|
-
yeref-0.24.96.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
|
8
|
-
yeref-0.24.96.dist-info/RECORD,,
|
File without changes
|
File without changes
|