From 143157a7716622577f91c5bb5294e8c99f04eed6 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 1 Sep 2025 16:29:50 +0300 Subject: [PATCH] rating-patch --- CHANGELOG.md | 31 ++++++++++++++++--------------- orm/rating.py | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aa456b5..9826e17a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,32 +1,33 @@ # Changelog -## [0.9.18] - 2025-01-09 +## [0.9.19] - 2025-09-01 -### πŸ” Search System Redis Storage -- **πŸ’Ύ Redis-based vector index storage**: ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° Redis для хранСния Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ индСкса - - Π—Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π² `/dump` Π½Π° Redis ΠΊΠ»ΡŽΡ‡ΠΈ для надСТности +### πŸ”§ Reactions Type Compatibility Fix +- **πŸ› rating functions**: Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° ошибка `AttributeError: 'str' object has no attribute 'value'` Π² создании Ρ€Π΅Π°ΠΊΡ†ΠΈΠΉ + - Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ `is_positive()` ΠΈ `is_negative()` Π² `orm/rating.py` Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΊΠ°ΠΊ `ReactionKind` enum, Ρ‚Π°ΠΊ ΠΈ строки + - Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с автоматичСским ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ `.value` для enum ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² + - Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° ошибка Π² `resolvers/reaction.py` ΠΏΡ€ΠΈ создании Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΎΠ²Ρ‹Ρ… Ρ€Π΅Π°ΠΊΡ†ΠΈΠΉ + +## [0.9.18] - 2025-09-01 + +### πŸ” Search Index Persistent Storage +- **πŸ’Ύ vector index storage**: ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° Redis для хранСния Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ индСкса + - Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π² `/dump` Π½Π° Redis ΠΊΠ»ΡŽΡ‡ΠΈ для надСТности - Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа Π½Π° `/dump` ΠΏΠ°ΠΏΠΊΡƒ Π½Π° сСрвСрС - - Π’Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΉ индСкс Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сохраняСтся ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ `search_index:{name}:data` ΠΈ `search_index:{name}:metadata` -- **πŸ› οΈ Improved reliability**: Π£Π±Ρ€Π°Π»ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы для ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… -- **⚑ Better performance**: Redis обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ быстрый доступ ΠΊ индСксу -- **πŸ”§ Technical changes**: - - Π—Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ `save_index_to_file()` Π½Π° `save_index_to_redis()` - - Π—Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ `load_index_from_file()` Π½Π° `load_index_from_redis()` - - Обновили автосохранСниС для использования Redis вмСсто Ρ„Π°ΠΉΠ»ΠΎΠ² - - Π£Π΄Π°Π»ΠΈΠ»ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ (`gzip`, `pathlib`, `cast`) + - Π’Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΉ индСкс Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сохраняСтся ## [0.9.17] - 2025-08-31 ### πŸ‘₯ Author Statistics Enhancement - **πŸ“Š Полная статистика Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²**: Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ всС Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ счётчики Π² AuthorStat - `topics`: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… участвовал Π°Π²Ρ‚ΠΎΡ€ + - `viewed_shouts`: ΠžΠ±Ρ‰Π΅Π΅ количСство просмотров всСх ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π°Π²Ρ‚ΠΎΡ€Π° - `coauthors`: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ соавторов - - `replies_count`: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² - - `rating_shouts`: Π Π΅ΠΉΡ‚ΠΈΠ½Π³ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π°Π²Ρ‚ΠΎΡ€Π° (сумма Ρ€Π΅Π°ΠΊΡ†ΠΈΠΉ LIKE/AGREE/ACCEPT/PROOF/CREDIT минус DISLIKE/DISAGREE/REJECT/DISPROOF) + - `topics`: Π’Π΅ΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρƒ Π°Π²Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ + - `rating_shouts`: Π Π΅ΠΉΡ‚ΠΈΠ½Π³ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π°Π²Ρ‚ΠΎΡ€Π° - `rating_comments`: Π Π΅ΠΉΡ‚ΠΈΠ½Π³ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π°Π²Ρ‚ΠΎΡ€Π° (Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° Π΅Π³ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ) - `replies_count`: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² - `comments`: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ созданных ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ Ρ†ΠΈΡ‚Π°Ρ‚ - - `viewed_shouts`: ΠžΠ±Ρ‰Π΅Π΅ количСство просмотров всСх ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π°Π²Ρ‚ΠΎΡ€Π° - **πŸ”„ Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ сортировка**: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сортировки ΠΏΠΎ всСм Π½ΠΎΠ²Ρ‹ΠΌ полям статистики - **⚑ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ запросы**: Batch-запросы для получСния всСй статистики ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ - **πŸ§ͺ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅**: Π­ΠΌΠΎΠ΄Π·ΠΈ-ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° статистики diff --git a/orm/rating.py b/orm/rating.py index 15e911b2..248acbd6 100644 --- a/orm/rating.py +++ b/orm/rating.py @@ -15,9 +15,21 @@ POSITIVE_REACTIONS = [ReactionKind.ACCEPT.value, ReactionKind.LIKE.value, Reacti NEGATIVE_REACTIONS = [ReactionKind.REJECT.value, ReactionKind.DISLIKE.value, ReactionKind.DISPROOF.value] -def is_negative(x: ReactionKind) -> bool: - return x.value in NEGATIVE_REACTIONS +def is_negative(x: ReactionKind | str) -> bool: + """ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, являСтся Π»ΠΈ рСакция Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ. + + Args: + x: ReactionKind enum ΠΈΠ»ΠΈ строка с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ + """ + value = x.value if isinstance(x, ReactionKind) else x + return value in NEGATIVE_REACTIONS -def is_positive(x: ReactionKind) -> bool: - return x.value in POSITIVE_REACTIONS +def is_positive(x: ReactionKind | str) -> bool: + """ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, являСтся Π»ΠΈ рСакция ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ. + + Args: + x: ReactionKind enum ΠΈΠ»ΠΈ строка с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ + """ + value = x.value if isinstance(x, ReactionKind) else x + return value in POSITIVE_REACTIONS