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 через Service Account
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 таблицы, чтобы найти sheetId для «Лист1» (или «Sheet1»)
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
- # 4) Читаем CSV-файл (r1) целиком и собираем список строк
16055
- with open(r1, newline='', encoding='utf-8') as csvfile:
16056
- reader = csv.reader(csvfile)
16057
- all_rows = list(reader)
16058
-
16059
- # 5) Пишем значения из all_rows в только что переименованный лист (PROJECT_USERNAME), начиная с A1
16060
- write_body = {
16061
- 'valueInputOption': 'USER_ENTERED',
16062
- 'data': [
16063
- {
16064
- 'range': f"{PROJECT_USERNAME}!A1",
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': all_rows
16067
- }
16068
- ]
16069
- }
16070
- sheets_service.spreadsheets().values().batchUpdate(
16071
- spreadsheetId=dataroom_folder_id,
16072
- body=write_body
16073
- ).execute()
16074
- logger.info("Activity‐метрики (r1) успешно загружены в Google‐таблицу.")
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"Файл с метриками не найден или не существует: {r1}")
16138
+ logger.warning(f"Файл r1 не найден или не существует: {r1}")
16139
+
16077
16140
 
16078
16141
  except Exception as e:
16079
16142
  logger.info(log_ % str(e))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yeref
3
- Version: 0.24.96
3
+ Version: 0.24.98
4
4
  Summary: desc-f
5
5
  Author: john smith
6
6
  Dynamic: author
@@ -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,,
@@ -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,,