Skip to content

Commit 11b03ae

Browse files
committed
Исправление ошибки неизвестного enum
1 parent 1789fb1 commit 11b03ae

2 files changed

Lines changed: 77 additions & 16 deletions

File tree

avito/client.py

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from collections.abc import Iterable
5+
from collections.abc import Callable, Iterable
66
from datetime import date, datetime
77
from pathlib import Path
88
from types import TracebackType
@@ -82,6 +82,16 @@ def _summary_unavailable_section(section: str, error: AvitoError) -> SummaryUnav
8282
)
8383

8484

85+
def _safe_summary[SummaryT](
86+
section: str,
87+
factory: Callable[[], SummaryT],
88+
) -> tuple[SummaryT | None, list[SummaryUnavailableSection]]:
89+
try:
90+
return factory(), []
91+
except AvitoError as error:
92+
return None, [_summary_unavailable_section(section, error)]
93+
94+
8595
class AvitoClient:
8696
"""Единственная публичная точка входа SDK с фабриками доменных объектов.
8797
@@ -189,18 +199,43 @@ def account_health(
189199
date_from=date_from,
190200
date_to=date_to,
191201
)
202+
item_ids = [item.item_id for item in listings.items if item.item_id is not None]
203+
chats, chats_unavailable = _safe_summary(
204+
"chats",
205+
lambda: self.chat_summary(user_id=resolved_user_id),
206+
)
207+
orders, orders_unavailable = _safe_summary("orders", self.order_summary)
208+
reviews, reviews_unavailable = _safe_summary("reviews", self.review_summary)
209+
promotion, promotion_unavailable = _safe_summary(
210+
"promotion",
211+
lambda: self.promotion_summary(item_ids=item_ids),
212+
)
213+
unavailable_sections = [
214+
*listings.unavailable_sections,
215+
*chats_unavailable,
216+
*orders_unavailable,
217+
*reviews_unavailable,
218+
*promotion_unavailable,
219+
]
220+
if chats is not None:
221+
unavailable_sections.extend(chats.unavailable_sections)
222+
if orders is not None:
223+
unavailable_sections.extend(orders.unavailable_sections)
224+
if reviews is not None:
225+
unavailable_sections.extend(reviews.unavailable_sections)
226+
if promotion is not None:
227+
unavailable_sections.extend(promotion.unavailable_sections)
192228
return AccountHealthSummary(
193229
user_id=resolved_user_id,
194230
balance_total=balance.total,
195231
balance_real=balance.real,
196232
balance_bonus=balance.bonus,
197233
listings=listings,
198-
chats=self.chat_summary(user_id=resolved_user_id),
199-
orders=self.order_summary(),
200-
reviews=self.review_summary(),
201-
promotion=self.promotion_summary(
202-
item_ids=[item.item_id for item in listings.items if item.item_id is not None]
203-
),
234+
chats=chats,
235+
orders=orders,
236+
reviews=reviews,
237+
promotion=promotion,
238+
unavailable_sections=unavailable_sections,
204239
)
205240

206241
def listing_health(
@@ -322,15 +357,36 @@ def order_summary(self) -> OrderSummary:
322357
def review_summary(self) -> ReviewSummary:
323358
"""Возвращает итоговую read-only сводку по отзывам."""
324359

325-
reviews = self.review().list()
360+
reviews_error: AvitoError | None = None
361+
try:
362+
reviews = self.review().list()
363+
except AvitoError as error:
364+
reviews = None
365+
reviews_error = error
326366
rating = self.rating_profile().get()
327-
scores = [item.score for item in reviews.items if item.score is not None]
367+
scores = [item.score for item in reviews.items if item.score is not None] if reviews else []
328368
average_score = sum(scores) / len(scores) if scores else None
369+
unavailable_sections = (
370+
[_summary_unavailable_section("reviews", reviews_error)]
371+
if reviews_error is not None
372+
else []
373+
)
329374
return ReviewSummary(
330-
total_reviews=reviews.total if reviews.total is not None else len(reviews.items),
331-
average_score=average_score,
332-
unanswered_reviews=sum(1 for item in reviews.items if item.can_answer is True),
375+
total_reviews=(
376+
reviews.total
377+
if reviews is not None and reviews.total is not None
378+
else rating.reviews_count
379+
if reviews is None
380+
else len(reviews.items)
381+
),
382+
average_score=average_score if reviews is not None else rating.score,
383+
unanswered_reviews=(
384+
sum(1 for item in reviews.items if item.can_answer is True)
385+
if reviews is not None
386+
else None
387+
),
333388
rating_score=rating.score,
389+
unavailable_sections=unavailable_sections,
334390
)
335391

336392
def promotion_summary(self, *, item_ids: list[int] | None = None) -> PromotionSummary:

avito/summary/models.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from dataclasses import dataclass
5+
from dataclasses import dataclass, field
66

77
from avito.ads.enums import ListingStatus
88
from avito.core.serialization import SerializableModel
@@ -50,7 +50,7 @@ class ListingHealthSummary(SerializableModel):
5050
total_favorites: int | None
5151
total_calls: int | None
5252
total_spendings: float | None
53-
unavailable_sections: list[SummaryUnavailableSection]
53+
unavailable_sections: list[SummaryUnavailableSection] = field(default_factory=list)
5454

5555

5656
@dataclass(slots=True, frozen=True)
@@ -61,6 +61,7 @@ class ChatSummary(SerializableModel):
6161
total_chats: int
6262
unread_chats: int
6363
unread_messages: int
64+
unavailable_sections: list[SummaryUnavailableSection] = field(default_factory=list)
6465

6566

6667
@dataclass(slots=True, frozen=True)
@@ -69,16 +70,18 @@ class OrderSummary(SerializableModel):
6970

7071
total_orders: int
7172
active_orders: int
73+
unavailable_sections: list[SummaryUnavailableSection] = field(default_factory=list)
7274

7375

7476
@dataclass(slots=True, frozen=True)
7577
class ReviewSummary(SerializableModel):
7678
"""Итоговая read-only сводка по отзывам."""
7779

78-
total_reviews: int
80+
total_reviews: int | None
7981
average_score: float | None
80-
unanswered_reviews: int
82+
unanswered_reviews: int | None
8183
rating_score: float | None
84+
unavailable_sections: list[SummaryUnavailableSection] = field(default_factory=list)
8285

8386

8487
@dataclass(slots=True, frozen=True)
@@ -89,6 +92,7 @@ class PromotionSummary(SerializableModel):
8992
active_orders: int
9093
total_services: int
9194
available_services: int
95+
unavailable_sections: list[SummaryUnavailableSection] = field(default_factory=list)
9296

9397

9498
@dataclass(slots=True, frozen=True)
@@ -104,6 +108,7 @@ class AccountHealthSummary(SerializableModel):
104108
orders: OrderSummary | None = None
105109
reviews: ReviewSummary | None = None
106110
promotion: PromotionSummary | None = None
111+
unavailable_sections: list[SummaryUnavailableSection] = field(default_factory=list)
107112

108113

109114
@dataclass(slots=True, frozen=True)

0 commit comments

Comments
 (0)