diff --git a/schemas/artisan.py b/schemas/artisan.py index a130f57..c4454e2 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): @@ -34,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=( @@ -71,13 +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): - return { - 'rating': self.get_artisan_rating(obj), - 'activity': obj.activity, - 'earnings': obj.total_earnings - } + with db.session() as sess: + + 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 + } + + # Put actual review counts into r1-r5 + for rating, rating_count in rating_counts: + review_grouped[f'r{rating}'] = rating_count + + # 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, + 'earnings': obj.total_earnings, + 'review_matrics': { + 'count': count, + 'review_grouped': review_grouped + } + } class AddArtisanSchema(BaseSchema):