yeref 0.24.95__py3-none-any.whl → 0.24.97__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,100 @@ 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 Sheets ===
16015
16014
  if r1 and os.path.isfile(r1):
16016
- # 1) читаем весь CSV в память как список списков (каждая строка ― это список полей)
16015
+ # 1) Авторизация в Google Sheets
16016
+ scopes = r_conf('scopes', CONF_P)
16017
+ credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
16018
+ credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
16019
+ http_auth = credentials.authorize(httplib2.Http())
16020
+ sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
16021
+
16022
+ # 2) Получаем metadata всей таблицы, чтобы увидеть, какие листы есть сейчас
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
+
16029
+ # 3) Ищем лист с названием «Лист1» или «Sheet1»
16030
+ sheet_id_to_rename = None
16031
+ original_title = None
16032
+ for sheet in spreadsheet.get('sheets', []):
16033
+ props = sheet.get('properties', {})
16034
+ title = props.get('title', '')
16035
+ if title in ['Лист1', 'Sheet1']:
16036
+ sheet_id_to_rename = props.get('sheetId')
16037
+ original_title = title
16038
+ logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
16039
+ break
16040
+
16041
+ # 4) Если нашли, то переименовываем в PROJECT_USERNAME
16042
+ if sheet_id_to_rename is not None:
16043
+ rename_request = {
16044
+ 'requests': [
16045
+ {
16046
+ 'updateSheetProperties': {
16047
+ 'properties': {
16048
+ 'sheetId': sheet_id_to_rename,
16049
+ 'title': PROJECT_USERNAME
16050
+ },
16051
+ 'fields': 'title'
16052
+ }
16053
+ }
16054
+ ]
16055
+ }
16056
+ sheets_service.spreadsheets().batchUpdate(
16057
+ spreadsheetId=dataroom_folder_id,
16058
+ body=rename_request
16059
+ ).execute()
16060
+ logger.info(f"Запрос на переименование отправлен: '{original_title}' → '{PROJECT_USERNAME}'")
16061
+
16062
+ # 5) Подтягиваем снова metadata, чтобы убедиться, что название поменялось
16063
+ spreadsheet_after = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
16064
+ logger.info("После переименования. Список листов теперь:")
16065
+ for sheet in spreadsheet_after.get('sheets', []):
16066
+ props = sheet.get('properties', {})
16067
+ logger.info(f" • sheetId={props.get('sheetId')} title='{props.get('title')}'")
16068
+ else:
16069
+ logger.warning("Не найден лист с названием 'Лист1' или 'Sheet1' — пропускаем переименование.")
16070
+
16071
+ # 6) Читаем CSV-файл (r1) целиком
16017
16072
  with open(r1, newline='', encoding='utf-8') as csvfile:
16018
16073
  reader = csv.reader(csvfile)
16019
16074
  all_rows = list(reader)
16075
+ logger.info(f"Прочитано {len(all_rows)} строк из файла {r1}.")
16076
+
16077
+ # 7) Составляем диапазон для записи: используем PROJECT_USERNAME
16078
+ # Если название листа может содержать пробелы или спецсимволы, оборачиваем в одинарные кавычки:
16079
+ safe_title = PROJECT_USERNAME.replace("'", "\\'")
16080
+ range_str = f"'{safe_title}'!A1"
16081
+ logger.info(f"Будем записывать в диапазон: {range_str}")
16082
+
16083
+ # 8) Формируем тело запроса на запись
16084
+ write_body = {
16085
+ 'valueInputOption': 'USER_ENTERED',
16086
+ 'data': [
16087
+ {
16088
+ 'range': range_str,
16089
+ 'majorDimension': 'ROWS',
16090
+ 'values': all_rows
16091
+ }
16092
+ ]
16093
+ }
16020
16094
 
16021
- # 2) вызываем api_sync_all:
16022
- # передаём all_rows, ID вашей «цельной» таблицы (dataroom_folder_id), CONF_P и EXTRA_D
16023
- # (можно опционно прокинуть range_many и sheet_id, если нужно не с «A2»).
16024
- # По умолчанию api_sync_all запишет значения в диапазон A2:… для листа Sheet1.
16025
- await api_sync_all(
16026
- all_rows,
16027
- dataroom_folder_id, # используем именно этот ID
16028
- CONF_P,
16029
- EXTRA_D,
16030
- range_many='A1', # если вы хотите записать вместе с заголовком (из CSV)
16031
- sheet_id='Sheet1', # можно заменить на нужное имя листа
16032
- value_input_option='USER_ENTERED',
16033
- major_dimension='ROWS'
16034
- )
16035
- logger.info("Activity‐метрики успешно залиты в Google‐таблицу.")
16095
+ # 9) Делаем batchUpdate, чтобы записать всё из all_rows
16096
+ try:
16097
+ response = sheets_service.spreadsheets().values().batchUpdate(
16098
+ spreadsheetId=dataroom_folder_id,
16099
+ body=write_body
16100
+ ).execute()
16101
+ updated_cells = response.get('totalUpdatedCells', 0)
16102
+ logger.info(f"Успешно записано в Google Sheets: обновлено ячеек = {updated_cells}.")
16103
+ except Exception as e:
16104
+ logger.error(f"Ошибка при записи в Google Sheets: {e}")
16036
16105
  else:
16037
- logger.warning(f"Не удалось найти файл {r1} для загрузки в Google Sheets.")
16106
+ logger.warning(f"Файл с метриками не найден или не существует: {r1}")
16107
+
16038
16108
  except Exception as e:
16039
16109
  logger.info(log_ % str(e))
16040
16110
  await asyncio.sleep(round(random.uniform(0, 1), 2))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yeref
3
- Version: 0.24.95
3
+ Version: 0.24.97
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=jdG1SO9WRV8e0o8HjviTOMG-m4rxya1lcClakmVDVZc,1055625
5
+ yeref-0.24.97.dist-info/METADATA,sha256=MNCnHGJUW1SZaDvGSRhQClVxHOkxpX0KrrOI50o-aDM,119
6
+ yeref-0.24.97.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
+ yeref-0.24.97.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
+ yeref-0.24.97.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=ok-hTzA24mYznwFOVpWpENFpTWfBYQB3oIsFViCKQ70,1051852
5
- yeref-0.24.95.dist-info/METADATA,sha256=a1jTMU2YAl5SLj8lDz8LB0eTp_z_wX-qxLjtgKluF_Y,119
6
- yeref-0.24.95.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
- yeref-0.24.95.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
- yeref-0.24.95.dist-info/RECORD,,