diff --git a/point_alarm.py b/point_alarm.py index 4e64d8f..23267a6 100644 --- a/point_alarm.py +++ b/point_alarm.py @@ -652,14 +652,15 @@ class PointRegistrationProcessor: webhook = load_webhook_config(self.webhook_config_path) if not isinstance(webhook.get("deliveryPolicy"), dict): raise ConfigurationError("Nokta alarm kaydı için webhook.deliveryPolicy zorunludur.") - for row_number, row in enumerate(rows, start=2): + for index, row in enumerate(rows, start=1): + label = f"{index}/{len(rows)}" if str(row.get("status", "")).strip().upper() == "SUCCESS": - LOGGER.info("Satır %s zaten SUCCESS; atlandı.", row_number) + LOGGER.info("Kayıt %s zaten SUCCESS; atlandı.", label) continue try: recipient_id, lat, lng, radius = parse_point_row(row) except ConfigurationError as exc: - LOGGER.error("Satır %s gönderilmedi: %s", row_number, exc) + LOGGER.error("Kayıt %s gönderilmedi: %s", label, exc) self._set_result(row, "FAILED", "NOT_SENT", "", str(exc)) self._write_csv(rows, fieldnames) continue @@ -669,17 +670,17 @@ class PointRegistrationProcessor: "webhook": deepcopy(webhook), "filter": deepcopy(filters), } - self._register(row_number, payload, row) + self._register(label, payload, row) self._write_csv(rows, fieldnames) - def _register(self, row_number: int, payload: dict[str, Any], row: dict[str, Any]) -> bool: + def _register(self, label: str, payload: dict[str, Any], row: dict[str, Any]) -> bool: try: response = self.service.register(payload, str(uuid4())) except ApiError as exc: - recovered = self._try_recover(row_number, payload, exc) + recovered = self._try_recover(label, payload, exc) if recovered: self._set_result(row, "SUCCESS", f"HTTP_{exc.status_code or recovered[0]}", recovered[1], "") - LOGGER.info("Satır %s eşleşen kayıtla kurtarıldı: %s", row_number, recovered[1]) + LOGGER.info("Kayıt %s eşleşen kayıtla kurtarıldı: %s", label, recovered[1]) return True self._set_result( row, @@ -688,7 +689,7 @@ class PointRegistrationProcessor: "", error_body_text(exc), ) - LOGGER.error("Satır %s başarısız: %s", row_number, exc) + LOGGER.error("Kayıt %s başarısız: %s", label, exc) return False data = response.data if isinstance(response.data, dict) else {} registration_id = as_uuid(data.get("registrationId"), version=4) @@ -697,27 +698,27 @@ class PointRegistrationProcessor: row, "FAILED", f"HTTP_{response.status_code}", "", "Yanıtta UUID v4 registrationId bulunamadı: " + json.dumps(response.data, ensure_ascii=False), ) - LOGGER.error("Satır %s yanıtında registrationId yok.", row_number) + LOGGER.error("Kayıt %s yanıtında registrationId yok.", label) return False self._set_result(row, "SUCCESS", f"HTTP_{response.status_code}", registration_id, "") - LOGGER.info("Satır %s başarıyla kaydedildi: %s", row_number, registration_id) + LOGGER.info("Kayıt %s başarıyla kaydedildi: %s", label, registration_id) for warning in response_warnings(response.data): - LOGGER.warning("Satır %s API uyarısı: %s", row_number, warning) + LOGGER.warning("Kayıt %s API uyarısı: %s", label, warning) return True def _try_recover( - self, row_number: int, payload: dict[str, Any], error: ApiError + self, label: str, payload: dict[str, Any], error: ApiError ) -> tuple[int, str] | None: """After an ambiguous failure, look for an identical registration (recipient + point + radius).""" status = error.status_code if status is not None and status != 409 and status not in RETRYABLE_STATUS_CODES: return None - LOGGER.warning("Satır %s sonucu belirsiz; recipientId ile kontrol ediliyor.", row_number) + LOGGER.warning("Kayıt %s sonucu belirsiz; recipientId ile kontrol ediliyor.", label) boundary = payload["boundary"] try: response = self.service.get_by_recipient_id(payload["recipientId"]) except ApiError as exc: - LOGGER.error("Satır %s için recipient sorgusu başarısız: %s", row_number, exc) + LOGGER.error("Kayıt %s için recipient sorgusu başarısız: %s", label, exc) return None data = response.data if isinstance(response.data, dict) else {} for registration in data.get("registrations") or []: @@ -881,25 +882,26 @@ class PointUpdateProcessor: def run(self) -> None: rows, fieldnames = self._read_csv() - for row_number, row in enumerate(rows, start=2): + for index, row in enumerate(rows, start=1): + label = f"{index}/{len(rows)}" if str(row.get("status", "")).strip().upper() == "SUCCESS": - LOGGER.info("Satır %s zaten SUCCESS; atlandı.", row_number) + LOGGER.info("Kayıt %s zaten SUCCESS; atlandı.", label) continue try: payload = build_update_payload(row) except ConfigurationError as exc: - LOGGER.error("Satır %s gönderilmedi: %s", row_number, exc) + LOGGER.error("Kayıt %s gönderilmedi: %s", label, exc) self._set_result(row, "FAILED", "NOT_SENT", str(exc)) self._write(rows, fieldnames) continue if payload.get("filter", {}).get("thunderstorm", {}).get("speedThreshold") is not None: LOGGER.warning( - "Satır %s: thunderstorm.speedThreshold PATCH'te backend tarafından işlenmiyor " + "Kayıt %s: thunderstorm.speedThreshold PATCH'te backend tarafından işlenmiyor " "(GAIA-476); değer gönderilir ancak güncellenmeyebilir.", - row_number, + label, ) if self.dry_run: - print(f"[dry-run] satır {row_number}: PATCH {ALARMS_PATH}/update {json.dumps(payload, ensure_ascii=False)}") + print(f"[dry-run] kayıt {label}: PATCH {ALARMS_PATH}/update {json.dumps(payload, ensure_ascii=False)}") continue try: response = self.service.update(payload, str(uuid4())) @@ -909,12 +911,12 @@ class PointUpdateProcessor: f"HTTP_{exc.status_code}" if exc.status_code else "NETWORK_ERROR", error_body_text(exc), ) - LOGGER.error("Satır %s başarısız: %s", row_number, exc) + LOGGER.error("Kayıt %s başarısız: %s", label, exc) else: self._set_result(row, "SUCCESS", f"HTTP_{response.status_code}", "") - LOGGER.info("Satır %s güncellendi: %s", row_number, payload["registrationId"]) + LOGGER.info("Kayıt %s güncellendi: %s", label, payload["registrationId"]) for warning in response_warnings(response.data): - LOGGER.warning("Satır %s API uyarısı: %s", row_number, warning) + LOGGER.warning("Kayıt %s API uyarısı: %s", label, warning) self._write(rows, fieldnames) def _read_csv(self) -> tuple[list[dict[str, Any]], list[str]]: