From 4297d736e76e32f590f761a43f89f9276d25a05f Mon Sep 17 00:00:00 2001 From: git2060 Date: Tue, 1 Sep 2026 18:09:24 +0530 Subject: [PATCH 1/3] ratings added --- schemas/artisan.py | 48 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/schemas/artisan.py b/schemas/artisan.py index a130f57..44dd612 100644 --- a/schemas/artisan.py +++ b/schemas/artisan.py @@ -1,8 +1,9 @@ +from models import Reviews from models.user_models import ( Artisan, Kyc ) -from core import ma +from core import ma, db from add_extensions import redis_ from models.bookings import BookingCategory from .base import ( @@ -18,6 +19,7 @@ post_dump, INCLUDE ) +from sqlalchemy import func class ArtisanSchema(BaseSQLAlchemyAutoSchema): @@ -71,12 +73,52 @@ def get_artisan_rating(self, obj): if c: return obj.get_star_rating(c=c) return obj.get_star_rating() - + def get_metrics(self, obj): + with db.session() as sess: + + # Total number of reviews + count = sess.query( + func.count(Reviews.id) + ).filter( + Reviews.artisan_id == obj.artisan_id, + Reviews.weight.between(1, 5) + ).scalar() + + # Number of reviews for each rating + rating_counts = sess.query( + Reviews.weight, + func.count(Reviews.id) + ).filter( + Reviews.artisan_id == obj.artisan_id, + Reviews.weight.between(1, 5) + ).group_by( + Reviews.weight + ).all() + + # Default 1-5 to 0 + review_grouped = { + 'r1': 0, + 'r2': 0, + 'r3': 0, + 'r4': 0, + 'r5': 0 + } + + # Calculate percentage + for rating, rating_count in rating_counts: + review_grouped[rating] = round( + (rating_count / count) * 100 + ) if count else 0 + return { 'rating': self.get_artisan_rating(obj), 'activity': obj.activity, - 'earnings': obj.total_earnings + 'earnings': obj.total_earnings, + 'review_matrics':{ + 'count': count, + 'review_grouped': review_grouped + } } From 19dbe19fbb64d951921c370f72a2413a468dec4d Mon Sep 17 00:00:00 2001 From: git2060 Date: Tue, 1 Sep 2026 22:56:50 +0530 Subject: [PATCH 2/3] tested --- schemas/artisan.py | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/schemas/artisan.py b/schemas/artisan.py index 44dd612..c6470db 100644 --- a/schemas/artisan.py +++ b/schemas/artisan.py @@ -36,9 +36,9 @@ class Meta: ) exclude = ( - 'booking', 'ratings_weighted_sum', + 'booking', 'ratings_weighted_sum','kyc_attempts','wallet', ) - + # sign_up_date = ma.String() # additional fields created_at = ma.String(dump_only=True, data_key="became_artisan_on") user_profile = fields.Nested("UserSchema", only=( @@ -77,15 +77,6 @@ def get_artisan_rating(self, obj): def get_metrics(self, obj): with db.session() as sess: - # Total number of reviews - count = sess.query( - func.count(Reviews.id) - ).filter( - Reviews.artisan_id == obj.artisan_id, - Reviews.weight.between(1, 5) - ).scalar() - - # Number of reviews for each rating rating_counts = sess.query( Reviews.weight, func.count(Reviews.id) @@ -105,21 +96,22 @@ def get_metrics(self, obj): 'r5': 0 } - # Calculate percentage + # Put actual review counts into r1-r5 for rating, rating_count in rating_counts: - review_grouped[rating] = round( - (rating_count / count) * 100 - ) if count else 0 - - return { - 'rating': self.get_artisan_rating(obj), - 'activity': obj.activity, - 'earnings': obj.total_earnings, - 'review_matrics':{ - 'count': count, - 'review_grouped': review_grouped + review_grouped[f'r{rating}'] = rating_count + + # Total number of reviews + count = sum(review_grouped.values()) + + return { + 'rating': self.get_artisan_rating(obj), + 'activity': obj.activity, + 'earnings': obj.total_earnings, + 'review_matrics': { + 'count': count, + 'review_grouped': review_grouped + } } - } class AddArtisanSchema(BaseSchema): From 52fa564e40320748a1ccea2a9f7774446f8c668d Mon Sep 17 00:00:00 2001 From: git2060 Date: Tue, 1 Sep 2026 23:18:48 +0530 Subject: [PATCH 3/3] updated --- schemas/artisan.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/schemas/artisan.py b/schemas/artisan.py index c6470db..c4454e2 100644 --- a/schemas/artisan.py +++ b/schemas/artisan.py @@ -103,6 +103,13 @@ def get_metrics(self, obj): # Total number of reviews count = sum(review_grouped.values()) + # Convert counts to percentages + if count > 0: + review_grouped = { + rating: round((rating_count / count) * 100) + for rating, rating_count in review_grouped.items() + } + return { 'rating': self.get_artisan_rating(obj), 'activity': obj.activity,