From d9a81d48862d7db7e120bb87f90b70c1ff772b9c Mon Sep 17 00:00:00 2001 From: SzymoneqTheITHater Date: Mon, 30 Dec 2024 17:27:20 +0100 Subject: [PATCH 1/4] adding chat to adding transactions branch --- projektBazy/api/serializers.py | 38 ++++++++++++++++- projektBazy/api/urls.py | 6 ++- projektBazy/api/views.py | 75 ++++++++++++++++++++++++++++++++++ projektBazy/shop/admin.py | 6 ++- projektBazy/shop/models.py | 25 +++++++++++- 5 files changed, 145 insertions(+), 5 deletions(-) diff --git a/projektBazy/api/serializers.py b/projektBazy/api/serializers.py index 18057d7..d51c2d1 100644 --- a/projektBazy/api/serializers.py +++ b/projektBazy/api/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from shop.models import Category, Listing, Address, Transaction +from shop.models import Category, Listing, Address, Transaction, Message, Chat from django.contrib.auth.models import User class CategorySerializer(serializers.ModelSerializer): class Meta: @@ -54,3 +54,39 @@ def create(self, validated_data): ) return transaction +class ChatSerializer(serializers.ModelSerializer): + class Meta: + model = Chat + fields = ['buyer', 'seller', 'listing'] + read_only_fields = ['buyer', 'seller', 'listing'] + + def create(self, validated_data): + buyer = self.context['request'].user + seller = validated_data['seller'] + listing = validated_data['listing'] + + chat = Chat.objects.create( + buyer=buyer, + seller=seller, + listing=listing + ) + return chat + + +class MessageSerializer(serializers.ModelSerializer): + class Meta: + model = Message + fields = ['chat', 'sender', 'content', 'status', 'created_at', 'viewed_at'] + read_only_fields = ['chat', 'sender', 'status', 'created_at', 'viewed_at'] + + def create(self, validated_data): + chat = validated_data['chat'] + content = validated_data['content'] + sender = self.context['request'].user + message = Message.objects.create( + chat=chat, + content=content, + sender=sender + ) + return message + diff --git a/projektBazy/api/urls.py b/projektBazy/api/urls.py index 3a1e96d..f7ee316 100644 --- a/projektBazy/api/urls.py +++ b/projektBazy/api/urls.py @@ -22,7 +22,11 @@ path('user//addresses/', UserAddressesView.as_view(), name='user-addresses'), path('transactions/', views.create_transaction, name='create-transaction'), path('transactions//update/', views.update_transaction_status, name='update-transaction-status'), - +#/addmessage/1/1 + path('addmessage//', views.add_chat_message, name='add-chat-message'), + path('chats/', views.get_chats, name='listing-chats'), + path('messages/', views.get_messages, name='chat-messages'), + path('viewedmessage/', views.set_message_viewed, name='message-viewed'), ] #Do something like this to test it #http://127.0.0.1:8000/postAddress/ diff --git a/projektBazy/api/views.py b/projektBazy/api/views.py index cbac70c..aec9fff 100644 --- a/projektBazy/api/views.py +++ b/projektBazy/api/views.py @@ -208,7 +208,82 @@ def update_transaction_status(request, transaction_id): return Response(TransactionSerializer(transaction).data, status=status.HTTP_200_OK) +@api_view(['POST']) +@authentication_classes([SessionAuthentication, TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def add_chat_message(request, chat_id, listing_id): + if request.method == 'POST': + try: + listing = Listing.objects.get(id=listing_id) + except Listing.DoesNotExist: + return Response({'detail': 'Listing not found'}, status=status.HTTP_404_NOT_FOUND) + + try: + chat = Chat.objects.get(id=chat_id) + except Chat.DoesNotExist: + chat = None + + if chat is None: + try: + newChat = { + 'buyer': request.user, + 'seller': listing.seller, + 'listing': listing + } + chat_serializer = ChatSerializer(data=newChat, context={'request': request}) + if chat_serializer.is_valid(): + chat_serializer.save() + chat = Chat.objects.get(id=chat_id) + + except Exception as e: + return Response({'detail': 'Unable to create chat'}, status=status.HTTP_409_CONFLICT) + + new_message = { + 'content' : request.data.get('message') + } + + message_serializer = MessageSerializer(data=new_message, context={'request': request}) + + if message_serializer.is_valid(): + message_serializer.save(chat=chat) + return Response(message_serializer.data, status=status.HTTP_201_CREATED) + + return Response(message_serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +@api_view(['GET']) +def get_chats(request, listing_id): + try: + listing = Listing.objects.get(id=listing_id) + except Listing.DoesNotExist: + return Response({'detail': 'Listing not found'}, status=status.HTTP_404_NOT_FOUND) + + chats = Chat.objects.filter(listing=listing_id) + serializer = ChatSerializer(chats, many=True) + return Response(serializer.data) + +@api_view(['GET']) +def get_messages(request, chat_id): + try: + chat = Chat.objects.get(id=chat_id) + except Chat.DoesNotExist: + return Response({'detail': 'Chat not found'}, status=status.HTTP_404_NOT_FOUND) + messages = Message.objects.filter(chat=chat) + serializer = MessageSerializer(messages, many=True) + return Response(serializer.data) + +@api_view(['PATCH']) +def set_message_viewed(request, message_id): + try: + message = Message.objects.get(id=message_id) + message.status = Message.Viewed + message.save() + except Message.DoesNotExist: + return Response({'detail': 'Message not found'}, status=status.HTTP_404_NOT_FOUND) + except Exception as e: + return Response({'detail': 'Unable to update'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + return Response(MessageSerializer(message).data) \ No newline at end of file diff --git a/projektBazy/shop/admin.py b/projektBazy/shop/admin.py index 6d68aec..26bdf1b 100644 --- a/projektBazy/shop/admin.py +++ b/projektBazy/shop/admin.py @@ -1,8 +1,10 @@ from django.contrib import admin -from .models import User, Listing, Address, Category, Transaction +from .models import User, Listing, Address, Category, Transaction, Chat, Message # Register your models here. admin.site.register(Listing) admin.site.register(Address) admin.site.register(Category) -admin.site.register(Transaction) \ No newline at end of file +admin.site.register(Transaction) +admin.site.register(Chat) +admin.site.register(Message) \ No newline at end of file diff --git a/projektBazy/shop/models.py b/projektBazy/shop/models.py index 93ea9bb..e2e2622 100644 --- a/projektBazy/shop/models.py +++ b/projektBazy/shop/models.py @@ -63,4 +63,27 @@ def save(self, *args, **kwargs): def __str__(self): return f"Transaction between {self.seller.username} and {self.buyer.username} for {self.listing.title} curently {self.status}" - \ No newline at end of file +class Chat(models.Model): + buyer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='chats_as_buyer', to_field='id') + seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name='chats_as_seller', to_field='id') + listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name='chats', to_field='id') + + class Meta: + unique_together=("buyer", "seller", "listing") + + +class Message(models.Model): + Sent = 'sent' + Viewed = 'Viewed' + + STATUS_CHOICES = [ + (Sent, 'Sent'), + (Viewed, 'Viewed'), + ] + + chat = models.ForeignKey(Chat, on_delete=models.CASCADE, related_name='messages', to_field='id') + sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='chats', to_field='id') + content = models.TextField() + status = models.CharField(max_length=6, choices=STATUS_CHOICES, default=Sent) + created_at = models.DateTimeField(auto_now_add=True) + viewed_at = models.DateTimeField(default=None, blank=True, null=True) \ No newline at end of file From 5256126f53651c43c9aaf43b740ffdd04d4dd8d9 Mon Sep 17 00:00:00 2001 From: SzymoneqTheITHater Date: Mon, 30 Dec 2024 17:55:23 +0100 Subject: [PATCH 2/4] Adding missing parts Adding MessageSerializer and ChatSerializer to views --- projektBazy/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projektBazy/api/views.py b/projektBazy/api/views.py index aec9fff..5c8f185 100644 --- a/projektBazy/api/views.py +++ b/projektBazy/api/views.py @@ -3,7 +3,7 @@ from shop.models import Category, Listing, Address, Transaction from rest_framework.authentication import SessionAuthentication, TokenAuthentication from rest_framework.permissions import IsAuthenticated -from .serializers import CategorySerializer, ListingSerializer, UserSerializer, AdressSerializer, TransactionSerializer +from .serializers import CategorySerializer, ListingSerializer, UserSerializer, AdressSerializer, TransactionSerializer, MessageSerializer, ChatSerializer from rest_framework import status, generics from rest_framework.authtoken.models import Token from rest_framework.exceptions import NotFound From feda262369f9f44837b3a86a565fcd5b69af43b8 Mon Sep 17 00:00:00 2001 From: SzymoneqTheITHater Date: Mon, 30 Dec 2024 23:25:17 +0100 Subject: [PATCH 3/4] Adding reviews Adding chat but also reviews to that (it's first version.) --- .../api/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 162 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 5880 bytes .../api/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2949 bytes .../api/__pycache__/views.cpython-312.pyc | Bin 0 -> 20301 bytes projektBazy/api/serializers.py | 6 +- projektBazy/api/urls.py | 7 ++- projektBazy/api/views.py | 50 +++++++++++++++-- projektBazy/db.sqlite3 | Bin 0 -> 237568 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 170 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 2762 bytes .../__pycache__/urls.cpython-312.pyc | Bin 0 -> 1114 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 666 bytes projektBazy/projektBazy/settings.py | 1 - .../shop/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 163 bytes .../shop/__pycache__/admin.cpython-312.pyc | Bin 0 -> 814 bytes .../shop/__pycache__/apps.cpython-312.pyc | Bin 0 -> 465 bytes .../shop/__pycache__/models.cpython-312.pyc | Bin 0 -> 7047 bytes .../migrations/0009_chat_review_message.py | 52 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 1930 bytes ..._rename_user_users_address.cpython-312.pyc | Bin 0 -> 1640 bytes ...isting_seller_delete_users.cpython-312.pyc | Bin 0 -> 1579 bytes ..._category_listing_category.cpython-312.pyc | Bin 0 -> 1503 bytes ...ress_user_address_resident.cpython-312.pyc | Bin 0 -> 1315 bytes .../0006_listing_created_at.cpython-312.pyc | Bin 0 -> 958 bytes .../0007_transaction.cpython-312.pyc | Bin 0 -> 2140 bytes ...8_alter_transaction_status.cpython-312.pyc | Bin 0 -> 876 bytes .../0009_chat_review_message.cpython-312.pyc | Bin 0 -> 3930 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 174 bytes projektBazy/shop/models.py | 10 +++- 29 files changed, 117 insertions(+), 9 deletions(-) create mode 100644 projektBazy/api/__pycache__/__init__.cpython-312.pyc create mode 100644 projektBazy/api/__pycache__/serializers.cpython-312.pyc create mode 100644 projektBazy/api/__pycache__/urls.cpython-312.pyc create mode 100644 projektBazy/api/__pycache__/views.cpython-312.pyc create mode 100644 projektBazy/db.sqlite3 create mode 100644 projektBazy/projektBazy/__pycache__/__init__.cpython-312.pyc create mode 100644 projektBazy/projektBazy/__pycache__/settings.cpython-312.pyc create mode 100644 projektBazy/projektBazy/__pycache__/urls.cpython-312.pyc create mode 100644 projektBazy/projektBazy/__pycache__/wsgi.cpython-312.pyc create mode 100644 projektBazy/shop/__pycache__/__init__.cpython-312.pyc create mode 100644 projektBazy/shop/__pycache__/admin.cpython-312.pyc create mode 100644 projektBazy/shop/__pycache__/apps.cpython-312.pyc create mode 100644 projektBazy/shop/__pycache__/models.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/0009_chat_review_message.py create mode 100644 projektBazy/shop/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0002_rename_user_users_address.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0003_alter_address_user_alter_listing_seller_delete_users.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0004_category_listing_category.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0005_remove_address_user_address_resident.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0006_listing_created_at.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0007_transaction.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0008_alter_transaction_status.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/0009_chat_review_message.cpython-312.pyc create mode 100644 projektBazy/shop/migrations/__pycache__/__init__.cpython-312.pyc diff --git a/projektBazy/api/__pycache__/__init__.cpython-312.pyc b/projektBazy/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c077a90a674e17bbe7b88b51a0ed3f23eba3772d GIT binary patch literal 162 zcmX@j%ge<81cw?6(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!a&)nZ2@VN$@pOy{ zat-j0iVX1&0IhQhn6M=)j$7BRTUWM=Hcc$2mOpA%(RR&U%VhYW zyj|LsOBX&ED0K)b9}4MIBt0|`oJ0PPUb5(c!b5@=O}i!|_olpgC8gwjDPMjdHNY`q&YusY0s`@npAcPoOmx{0vZIX$xc^T@XPg@1 zNG~9jKFAKOh5rkYSD-1msX3WP~GwfDH9PMmaJJ$VeaLFh@oKIot;s z+lVFO|3s4|1r{(3n$dEZ2L?5h3iDmiEMu)mH<^%z`26|?lWp$2Z)$9lQzjZ4Od)~x-K%rCdnl3q#(NaYaCQ}Cpo|cx!TY{Ymf&1*l^NtyAJN4 zq{uuOo%u?j9$mm>Bd=w0;I7V>4}fxtAwc6OI?R9;qlZ8stYOt)v?8;}u{NtFMy+p$q8#Z0ntML|M>1XJKqLJVG`-W%51{qAWbECl;``xWp7{yjLSG4#U|z3gW9rWN+rxkIsI0_LBj7=1g_woIP`{65P6P`=&k%#WwG4{${7} zm(bj&J}3BgyNJT6fKOvX^`)fYjZ}44px?u%;A{WLS<|;+NKs&-G4aN)9uv$StHQq^ zyjO)UeI9v!ABOWzq$BnvM|yaXmzx(1^mwNhC(ga-#8Sb60w-C;dj;^WMGeDZf%T$k zX*o3wnVyAil`=UUil1624E>mu9>Z{H`v&jDlte(e!{{r@1s={zip`Jl9CbOS81 zfG_hMTxxfiCc3QYL@6@A8Ktwyk5)ch`6Ox2o~_O<+Ovxgr4MZ1bgw9-r}1gu$J<-N z?*}-EVjM5Dgx?JwemAOBfdU~Z0>R+atdf}&IgY*sV0sC}Qc~$C zT2#Sn&1%TPkf(LESjcUtPSes^$aqrt8Qg>nHZccd*D-?uoS z@#AKj@=z}G!ns7>1SF4jFe4wM&ABa;Uiuo2u_!whMk_MKssAR$oC%ok;^k8)`0d;a z+;4#vhncwIDSou1_sQN-;E*Q?cbGRpJR*OKPJJ+DM~_yNy>M)M@X6rLO*{N*HGIqt zAFIgwUJ@PKKJ?^J#ar`|#B_BeX^$kUBMbJ(!d`4*Z+L7kn%GxJ;sFy&!Abvi)5a+O; z^zx>ExLp?~+pg%)hC3bo*MmC)Fzs@OUdGd2?c@!(a0Y%&y2Ow!$B{0lpMx%2aO?lx zu>h^0XF&=9U7#=IBgySwvQ4T0q<&=ajXDk>h**|BmKuG0ognfO=Y|vhJidPcH$qeF zGJ~7v=P=t%h$a^}HJFqJXZB`7yu&vR1+Y4r%OIf1=@IyQkyk$O*^y+$yVoShKSIO5 zD{q#op=mob4RMdrADe*a56?jKhy4`^qd!&&IKfX*d#5+A;T($7@H4U3al-rzM){co zzh90yxeqZfA;=^3kL4GNbGNpPbg8R1Hx%1qY*-6A)Dx#&h04AJv-Bul8o-Zq-oAr} z5lmGSO#s#4vu-E&o3iGt~@_O+=Ajpe(%!4+0e7Jyi|s8OZ^IM zfISn`5qARZ*TxoZs@`mAzl$k(XA7k_VMe>1>~Q7^Jh8!<(6@GO+o9Qtn?8`fM-6JGD40QFu4+BrNEDIU^|c z!F&Ww7lm(K-1kZs^LcEHkvTm+Z*d2pg%iCB#u`A763ym+r0er`iH@V5j=K$@-cHKI|cR-_Cmno>_UQ z@K@+~H|9I*Y_rzQliIW>tO^Z9U%5F3k literal 0 HcmV?d00001 diff --git a/projektBazy/api/__pycache__/urls.cpython-312.pyc b/projektBazy/api/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81b7259aec4ecd6ddc38f3dadbcf3823b7bb573d GIT binary patch literal 2949 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 literal 0 HcmV?d00001 diff --git a/projektBazy/api/serializers.py b/projektBazy/api/serializers.py index d51c2d1..a619846 100644 --- a/projektBazy/api/serializers.py +++ b/projektBazy/api/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from shop.models import Category, Listing, Address, Transaction, Message, Chat +from shop.models import Category, Listing, Address, Transaction, Message, Chat, Review from django.contrib.auth.models import User class CategorySerializer(serializers.ModelSerializer): class Meta: @@ -90,3 +90,7 @@ def create(self, validated_data): ) return message +class ReviewSerializer(serializers.ModelSerializer): + class Meta: + model = Review + fields = ['id', 'listing', 'reviewer', 'reviewee', 'rating', 'comment', 'created_at'] \ No newline at end of file diff --git a/projektBazy/api/urls.py b/projektBazy/api/urls.py index f7ee316..964c6df 100644 --- a/projektBazy/api/urls.py +++ b/projektBazy/api/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from .views import ListingsView, UserAddressesView +from .views import ListingsView, UserAddressesView, ReviewViewSet from . import views urlpatterns = [ path('',views.getData), @@ -27,6 +27,11 @@ path('chats/', views.get_chats, name='listing-chats'), path('messages/', views.get_messages, name='chat-messages'), path('viewedmessage/', views.set_message_viewed, name='message-viewed'), + #nwm + path('reviews/', ReviewViewSet.as_view({'get': 'list', 'post': 'create'}), name='review-list-create'), + path('reviews//', ReviewViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}), name='review-detail'), + path('reviews//user-reviews/', ReviewViewSet.as_view({'get': 'user_reviews'}), name='user-reviews'), + path('reviews//average-rating/', ReviewViewSet.as_view({'get': 'average_rating'}), name='average-rating'), ] #Do something like this to test it #http://127.0.0.1:8000/postAddress/ diff --git a/projektBazy/api/views.py b/projektBazy/api/views.py index 5c8f185..c2c98c3 100644 --- a/projektBazy/api/views.py +++ b/projektBazy/api/views.py @@ -1,15 +1,17 @@ from rest_framework.response import Response from rest_framework.decorators import api_view, authentication_classes, permission_classes -from shop.models import Category, Listing, Address, Transaction +from shop.models import Category, Listing, Address, Transaction, Message, Chat, Review from rest_framework.authentication import SessionAuthentication, TokenAuthentication from rest_framework.permissions import IsAuthenticated -from .serializers import CategorySerializer, ListingSerializer, UserSerializer, AdressSerializer, TransactionSerializer, MessageSerializer, ChatSerializer +from .serializers import CategorySerializer, ListingSerializer, UserSerializer, AdressSerializer, TransactionSerializer, MessageSerializer, ChatSerializer, ReviewSerializer from rest_framework import status, generics from rest_framework.authtoken.models import Token from rest_framework.exceptions import NotFound from django.contrib.auth.models import User from django.shortcuts import get_object_or_404 - +from rest_framework import viewsets +from rest_framework.decorators import action +from django.db.models import Avg #unnessesary @api_view(['GET']) def getCategory(request): @@ -285,5 +287,43 @@ def set_message_viewed(request, message_id): return Response(MessageSerializer(message).data) - - \ No newline at end of file +class ReviewViewSet(viewsets.ModelViewSet): + queryset = Review.objects.all() + serializer_class = ReviewSerializer + + def create(self, request, *args, **kwargs): + reviewer = request.user + listing_id = request.data.get('listing') + reviewee_id = request.data.get('reviewee') + + try: + listing = Listing.objects.get(id=listing_id) + if listing.seller == reviewer: + return Response({"error": "You can only review users for listings you purchased."}, status=status.HTTP_403_FORBIDDEN) + if listing.seller.id != int(reviewee_id): + return Response({"error": "Reviewee must be the seller of the purchased listing."}, status=status.HTTP_400_BAD_REQUEST) + except Listing.DoesNotExist: + return Response({"error": "Listing does not exist."}, status=status.HTTP_404_NOT_FOUND) + + return super().create(request, *args, **kwargs) + + def update(self, request, *args, **kwargs): + instance = self.get_object() + if instance.reviewer != request.user: + return Response({"error": "You can only update your own reviews."}, status=status.HTTP_403_FORBIDDEN) + return super().update(request, *args, **kwargs) + + @action(detail=True, methods=['get'], url_path='user-reviews') + def user_reviews(self, request, pk=None): + user = User.objects.get(pk=pk) + reviews = Review.objects.filter(reviewee=user) + serializer = self.get_serializer(reviews, many=True) + return Response(serializer.data) + + @action(detail=True, methods=['get'], url_path='average-rating') + def average_rating(self, request, pk=None): + user = User.objects.get(pk=pk) + average_rating = Review.objects.filter(reviewee=user).aggregate(Avg('rating'))['rating__avg'] + return Response({"average_rating": average_rating}) + + \ No newline at end of file diff --git a/projektBazy/db.sqlite3 b/projektBazy/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..17a25e9d0cab7f6a7dbb370f28511982a192cc12 GIT binary patch literal 237568 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 literal 0 HcmV?d00001 diff --git a/projektBazy/projektBazy/__pycache__/urls.cpython-312.pyc b/projektBazy/projektBazy/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c305e24527d08e79b240dc49acc46c418daf73dd GIT binary patch literal 1114 zcmb7DK~K~`6rOflb}1splgA;(EKRVDL@y0WKp>JBAqX)xB+Jmw?sjcEb!Jvw;zdt* zgA;$ii{Ynuz3;C$SE+3D60`lkL= zr(S}Kw*Zb&h2o3@mf|+!IOD8GU&tl0KN#XbI+nH7 zrFgf`q{yyFbOOfeihNz!ojORlQ2$klmcTixsqj3AY7H~LV4j@D{n{wT*9+f`)N?fF3J|9 zcO1MJhM1%{N;1Z!hjE*;1Sf+Q$+9vylv(7@mHDaz)xb!Ha21;E&NQ2|WnW#E&{>?4 zgx+r|+_bHSF%jbS9yAt?u>MU2lU>S{5T{UF$$11^|D#6bJ4Cb;$&CGnqO~-L`(c!J zz=WcnYE4bK@@K6u27?qBkIJPpHg1a*L?Kemk71y5F<9WT+f{&)v%CD9>p*_i? zJq{a(@`(}g+<*u-RoD=bq`9G5$|pv~{0UvaYxHwv+1q)#wY|KyxU;#kvF<d5n%sKw zCwTNM{V8553c`9(#Dg~_H}T+X($M%0GvAxX_r7o5%=?WE3+br+6~SAK(Dyu9M&Sy~ zPBeIf80sR1nZa=v>)qr=WOhxA0FTy}l+@DM?Z>f|u%mPA3cOE8DUfiomNxNRUJgfh1Uuz$ zpTih98PhbJmtqe_oqGiB61*h9@!6_p*T~*VUTb!i6B15Hh>9Fr!_h zVCSt^-S1_OG^RaRP2eTQbbt3OqDx7Y3*yN&(cQT4FZebH$hY3x!( z52%F0{1JTBTe0#V&K2!slCAG8#{M`h>#q7cA-SWMUna)*w^77}*=>ZaALzkXWW2V{ ft&ryk0@& gEe@O9{FKt1RJ$TppplF~Tnu7-WM*V!EMf+-0JA+PE&u=k literal 0 HcmV?d00001 diff --git a/projektBazy/shop/__pycache__/admin.cpython-312.pyc b/projektBazy/shop/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cf982e545c02d2944e56bdbda03570eed7a4d7e GIT binary patch literal 814 zcmbVKJ4-_`6h84jTOS}5L{M<;;tvo})QXC)i`Kz#m)L~stAxgQ=bf)R2jk~IYIW}S{WzsBdOIk^T36g7Y& zj1bTP>NEzpgB|W-mwVXbKK6Nl10Ld#7jOXqL-nyvsjjY%ckPbF+*@;lm4C6kzF2-= zte`Je*cYqNWwqS0_ih(cM%p8kr`fyRR5{S@zGOlNo2gW3mgr!SQo*Fu;WAMy$wf;K zRt3o@c}S1YI?0lJrj}<)q=&-3w)S~WSwjlXIKsCOSO_f? zEZE;71`TLeri$rMu*9^$#0`9!D10qcX5+o;er0_z-d%}y@IiHF*Vq-J$P$q(5_z4~ zRNS=sSS^vWRxFS5X8beUOtYoKIn%>QgUySQsb{B^=LS9;gwP92ze4l`(E~&uJ|O?H rcu{YaQu{-+h|s~oMaYs_L<+63;?kD34u-&S_O7utZDM{5=_d3K5SRW9 z;-BK;SOQK?ZbEbs2k(;jhWEaA-}~dJkqt9s zAOsSe1C^FQWrm*RY|fA(MJ;@YMn&;v({)ds`FLWDGCIpBZ<1XOR=~hO6by+XL#C3U zM6#;HrNNDpYZv=;O6HcM(Q9qyP-gpDYhpFSz-dpIO=HF9qaC#n7crib8N)a(Vaz8( zTi^=DcOkKJrbgMAgm!=l*W+<^f#9AX5#Rc0=*Q+@c&T4B&Hh=hYg`SxeU5b!kQVV- z&vT}16qv54w?T_6B2&C?64&)LH}ZsGX;L`wt2`}XT|atN_SWT{d)*T!Dc@1$xSVe$ u#GbG)lUD>v2e&wiiznGK4R4#b!aZL&_bDTU-r(SCLqfHO`Zw^Bs{R0o<#tB^ literal 0 HcmV?d00001 diff --git a/projektBazy/shop/__pycache__/models.cpython-312.pyc b/projektBazy/shop/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99a000a2ac97eecf0507ca1f0ecb9813ab4ade9a GIT binary patch literal 7047 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 Hp2&Xy%vZEB literal 0 HcmV?d00001 diff --git a/projektBazy/shop/migrations/0009_chat_review_message.py b/projektBazy/shop/migrations/0009_chat_review_message.py new file mode 100644 index 0000000..102b043 --- /dev/null +++ b/projektBazy/shop/migrations/0009_chat_review_message.py @@ -0,0 +1,52 @@ +# Generated by Django 4.2.17 on 2024-12-30 21:26 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('shop', '0008_alter_transaction_status'), + ] + + operations = [ + migrations.CreateModel( + name='Chat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('buyer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chats_as_buyer', to=settings.AUTH_USER_MODEL)), + ('listing', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chats', to='shop.listing')), + ('seller', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chats_as_seller', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('buyer', 'seller', 'listing')}, + }, + ), + migrations.CreateModel( + name='Review', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rating', models.IntegerField()), + ('comment', models.TextField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('listing', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.listing')), + ('reviewee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews_received', to=settings.AUTH_USER_MODEL)), + ('reviewer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews_given', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.TextField()), + ('status', models.CharField(choices=[('sent', 'Sent'), ('Viewed', 'Viewed')], default='sent', max_length=6)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('viewed_at', models.DateTimeField(blank=True, default=None, null=True)), + ('chat', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='shop.chat')), + ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chats', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/projektBazy/shop/migrations/__pycache__/0001_initial.cpython-312.pyc b/projektBazy/shop/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c990d6247f3109d32733824a125c82911521422 GIT binary patch literal 1930 zcmb7FO-vg{6y9Ci>$NekHU?vZiB+LWYrt~aDo*nQ0t}QkKa`LvwUAbeXE5umcg^ma z#GFzohaPh)$6hNq&{H|~SSgoX#gftV5~(L{mY}LsRc&W>?ZgzKwqt4My*J;ydEcA& z#xHw&gA^W%e`uu{A4UB_l+M7qGfo%r^bG|lKr2**F3=UGz|cfz6i>m+P)ii>Jg0yc z(q+e6dtZCn_qamAS7!v@2~h+F1uJq%mrPkx4a8P702Sk2vAx5Y__lJo!;sSXOxk1Q4Tn`Avc!p?|xgs znTa}>;qFye?!pZI$Mc39T;ifHoRe5rmWLhO=tUgtFQ+bA%YB#F-n+y$e$fWvAaO9# zsZM+!{IL!!7{lN3T4YkpakO`H}K0&F9 zdzfFIU0+>TxnKBl?fxp3^O7meNd{cewK6Q4>s2y8Hs_?>`Z`J6`r8+7J)6y572D)9 z)w<4Nzs|>x1w+HH%ya5>U*y?R%S%VuXLnj06}a+su*r?t+}LqA_BuRh#nLZ!nz6JU zOCNcE8n+6frRt5CVeuvgSaD%*s2LaRxNx}Ih+nt(kB`G6R&r|Zi)M1lPEH*~8p&H0 zfBQH*Y$Yc4-ft!*?8L;O@#9C0#3vTN+zR-jeP=!{5Nt)xot^l%v$4N4@t3v}>BC|p zal_(o9*4)QRQ6l8nabL!?5orV7XRV-lV2sKEI#v(7zY~3+ZI3VShFPZtewmrMH|U! zi=R0T$E}gcy=%>pNqc1SaOa2m_w{CO$<8e`b1QakrI~wV=N?(5?G{Bnq34)0iW;3~ zuoBKQt$vQM>%r^>ha&7(pX#~J4G1g>xFwMR8%`;@)fazb%(#C~nNG3jS37(4YeaHf yUB?pQZn=d&t>45d`R_1DGq*f6P5;JHwD2>PI%AVG`y$xn$8CQ6R|+eRgTDb=4c_Dc literal 0 HcmV?d00001 diff --git a/projektBazy/shop/migrations/__pycache__/0002_rename_user_users_address.cpython-312.pyc b/projektBazy/shop/migrations/__pycache__/0002_rename_user_users_address.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d663e684235596f54658ef16a054aca87747f3a GIT binary patch literal 1640 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 t{s+nTk`({| literal 0 HcmV?d00001 diff --git a/projektBazy/shop/migrations/__pycache__/0005_remove_address_user_address_resident.cpython-312.pyc b/projektBazy/shop/migrations/__pycache__/0005_remove_address_user_address_resident.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb295c304a2f40e18a8b5d77b87bbb0fb6e1a864 GIT binary patch literal 1315 zcmZuxy>HV%6hD9F?55C$3Is*vqXiO%szR_JglJXsSz44PNVOskH+Pr>#|~!~6ef@u z7}@v-7(ng7p8yjBlf{tg7#Nt?f?9;c#GM_tk?0NYe(&A;xO=~6e;FP&0bg&ckKMmA z06&D1Ev*l>${f4_7+}c*EyP%E)Cl~L>8$`0FI=qeCIBGcSGJ0hxD^4mgn=!~ zfLDZrjwvQuGm98FT<5W3Vab*4ToOByS_UPSv9h7A^S+3ccokASD7lx$&&=k*L2HV! zj&+i69{K;IIkt!G=pMF-|7|$8_p3JGdY`imBkMGO-$=(S4Kd?()>z(UHGCMf*~HAu z%z0FIBH{+LgSL~{@H5fI;t*PWpsOK-dbS!9ghYH z*-)9Zf+ysvD9PX~#tEXLgUq}dP||SyTcpEu+;n_5U@~51FnIDpi>A)zyGQ03h49~oS-QtzF zc;zdc-Gt|Qnlh$8U+Cq5aZGqj#BgHs(DBXDL))5Sm^}!LqryHO!|}vEzFC-jeY#ti zj0=G zESZ~u*JN(uMPbbKAR^R{R~y;E%o=%c`~ko|qR5sAvSlJQC0mgZRWIsAWFq$T)}_4q zjDz`%R{2aKhpmYVa#zmh4z&YNNGzfs77o-5!!%=E!z%LPBeP>=MFg9OF(*+5Z4C9-(2v3%(a8UfASjgHbo31iMKch{oJb65%jJvWR23E?TWqx|qDscm+Co$$G#!%VuDc~`TUv*qxREvnv zHVt8%hDT#2UX2^egsccwCa%j%H5je#1vJfZowVGr8F8(Xcz(={1a@|!ka7hE=4RBU z`3rwS$3m^YPVJ8Kr2e$_VAx0X) zgK}lB(l1wf<;v&Um&(!n*ZF>Rvsc~hSGRiAt?y-LFnjZ)s1?njQYh>197%Q6rLU1>s`l5?Idk}2?Y`w*J)HCu#m2s|%=dow z&6_trx3)$AU0?rbDkC8P{$N65QQ2FMmniuHAb>axl({^|F&=8L9LNXC!Fv#Zg?l?@2*26c<2*Hp?AebOp1$mxbDL^1)!F%I21*#yKRkHQT#Cv-+LI3+e!n6 zwWanWbSIC{y?j`QVn&1dRMB#dz?q3ekVNH8 z+h`z3OT|>nvRRdG;3^RCR86m=3 zwrp=&i2%(kT){e`>5%ZE&rqFMG|CkX)8vSlZLpqR){9uvJbi;T*~NJD8vP^!BwXAu z)FQS>7~yq!Q?uz^mOqd*tSj~g39W5bu}M0b60{_$qv5HoXy_8X>NG5gnppE{>019WX-c9OR3$@?HOJB*trPS|m(?=%MKQY}n?4)K875X0eU=_Jk4mzx z7zCmdSkcu2WCFwf-~PIk*3e(|_gx|GoH~=#EW0W7F=~ zWoPWNJGSbKt=2ZSsHcy(i!6&5WrIced?^B4VT-h_>^eUNp}&P9hVGR5|Lus-uloGGA|aGshX{Ie(LKM0m@;7jK*IP?0^E7JD)3 j0gmII@PK>iH!%DwIJwVvaQvN!8yj?DgHHezJRko85atgq literal 0 HcmV?d00001 diff --git a/projektBazy/shop/migrations/__pycache__/0008_alter_transaction_status.cpython-312.pyc b/projektBazy/shop/migrations/__pycache__/0008_alter_transaction_status.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c84637e124547394dd6c7cd565f0497adf64fd96 GIT binary patch literal 876 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 literal 0 HcmV?d00001 diff --git a/projektBazy/shop/migrations/__pycache__/__init__.cpython-312.pyc b/projektBazy/shop/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa46c99a9e80bcdde8d0fc6ace0833efa27940c6 GIT binary patch literal 174 zcmX@j%ge<81a5!w(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!@^!I_2@VN$@pOy{ zat-j0iVX1&05M>J3}Sp_W@Kb6Vg|AR=>IIz literal 0 HcmV?d00001 diff --git a/projektBazy/shop/models.py b/projektBazy/shop/models.py index e2e2622..fb70e39 100644 --- a/projektBazy/shop/models.py +++ b/projektBazy/shop/models.py @@ -86,4 +86,12 @@ class Message(models.Model): content = models.TextField() status = models.CharField(max_length=6, choices=STATUS_CHOICES, default=Sent) created_at = models.DateTimeField(auto_now_add=True) - viewed_at = models.DateTimeField(default=None, blank=True, null=True) \ No newline at end of file + viewed_at = models.DateTimeField(default=None, blank=True, null=True) + +class Review(models.Model): + listing = models.ForeignKey(Listing, on_delete=models.CASCADE) + reviewer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews_given') + reviewee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews_received') + rating = models.IntegerField() + comment = models.TextField() + created_at = models.DateTimeField(auto_now_add=True) \ No newline at end of file From 8894f49f2858db37bf1ef1004c7ae6ece2eb85fc Mon Sep 17 00:00:00 2001 From: SzymoneqTheITHater Date: Tue, 31 Dec 2024 11:56:33 +0100 Subject: [PATCH 4/4] Lekko poprawiony chat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ale jeszcze daleko. Dodano taką logikę że seller nie może stworzyć chatu sam z sobą --- .../api/__pycache__/urls.cpython-312.pyc | Bin 2949 -> 3148 bytes .../api/__pycache__/views.cpython-312.pyc | Bin 20301 -> 21213 bytes projektBazy/api/urls.py | 4 ++- projektBazy/api/views.py | 29 +++++++++++++++--- projektBazy/db.sqlite3 | Bin 237568 -> 237568 bytes .../__pycache__/settings.cpython-312.pyc | Bin 2762 -> 2693 bytes projektBazy/projektBazy/settings.py | 9 ++---- 7 files changed, 29 insertions(+), 13 deletions(-) diff --git a/projektBazy/api/__pycache__/urls.cpython-312.pyc b/projektBazy/api/__pycache__/urls.cpython-312.pyc index 81b7259aec4ecd6ddc38f3dadbcf3823b7bb573d..2b150860da947a7e7833cac4ff61f749a965fc65 100644 GIT binary patch delta 590 zcmZn_KO>=jnwOW00SMNgEKV-~vL1stFdz?Qd`{b_F37~6%9N!9lLFF{1DPZzTQDh3 zZe;42{FF(hUIC~;3rPW#nWDHxU^O#@!^Duvn4$z!r-MbEGMYLSpgKJ)>QvFxsR2!8 z%~F_rjagVxJw+o$a}LvLMu@%?Ei|>-lP@q!D(j@^rs$>U&tZnEGeA>k2vR3+lwzF8 z2v=i*rp6ScM$st63`vbSLQT44ltiV4rsZZQmQ+R+shrH>lFYpHVtt#;yb>!YFFrHH zPX87=ls9=9>naaq8L-mijKmUjk!|sA>_!X9j$(y;3^Efgp@-sDZ7ij~v0{{(8h!+3= delta 433 zcmX>j(JHQfnwOW00SJ!p6{nx%WMFs<;=q6`l<`??qq-o|Xaudut+MZq^PE-&0$*22+@(E zj;2Zjq)J&cMJq)+MQ08(T%9hOIz5m&dHocFOh&jGLo_u;U>o&QjFHrsAk?IbM~PRO zYMO1H#FEN5S%z(;c5+5yNqlCCoxV+GUWrvsW^qYoUOGsiN+2;MMHeKko10o(oS2?E znV0<&QEoFkc0V)AT`X_M_ZPjhJly$14LG3R7qu9uVfxuYl7aUbHgmFH(_ Klte!dTZ(*wVd)t(B(zsHQ2XOzSF5+d22y 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 diff --git a/projektBazy/api/urls.py b/projektBazy/api/urls.py index 964c6df..b074404 100644 --- a/projektBazy/api/urls.py +++ b/projektBazy/api/urls.py @@ -18,12 +18,14 @@ path('listings/user//', ListingsView.as_view(), name='user-listings'), #/listings/category/2/ path('listings/category//', ListingsView.as_view(), name='category-listings'), + path('listings//', views.get_listing, name='listing'), #/user/1/addresses path('user//addresses/', UserAddressesView.as_view(), name='user-addresses'), path('transactions/', views.create_transaction, name='create-transaction'), path('transactions//update/', views.update_transaction_status, name='update-transaction-status'), #/addmessage/1/1 - path('addmessage//', views.add_chat_message, name='add-chat-message'), + path('addmessage//', views.add_chat_message, name='add-chat-message'), + path('addmessage/', views.add_chat_message, name='add-chat-message'), path('chats/', views.get_chats, name='listing-chats'), path('messages/', views.get_messages, name='chat-messages'), path('viewedmessage/', views.set_message_viewed, name='message-viewed'), diff --git a/projektBazy/api/views.py b/projektBazy/api/views.py index c2c98c3..57e5ef3 100644 --- a/projektBazy/api/views.py +++ b/projektBazy/api/views.py @@ -12,6 +12,7 @@ from rest_framework import viewsets from rest_framework.decorators import action from django.db.models import Avg +from datetime import datetime #unnessesary @api_view(['GET']) def getCategory(request): @@ -222,10 +223,17 @@ def add_chat_message(request, chat_id, listing_id): try: chat = Chat.objects.get(id=chat_id) + if chat.listing_id != listing.id: + return Response({'detail': 'Invalid chat for the listing'}, status=status.HTTP_400_BAD_REQUEST) + except Chat.DoesNotExist: chat = None if chat is None: + + if request.user.id == listing.seller.id: + return Response({'detail': 'Seller can not start the chat'}, status=status.HTTP_400_BAD_REQUEST) + try: newChat = { 'buyer': request.user, @@ -234,8 +242,7 @@ def add_chat_message(request, chat_id, listing_id): } chat_serializer = ChatSerializer(data=newChat, context={'request': request}) if chat_serializer.is_valid(): - chat_serializer.save() - chat = Chat.objects.get(id=chat_id) + chat = chat_serializer.save(seller=listing.seller, buyer=request.user, listing=listing) except Exception as e: return Response({'detail': 'Unable to create chat'}, status=status.HTTP_409_CONFLICT) @@ -279,6 +286,7 @@ def set_message_viewed(request, message_id): try: message = Message.objects.get(id=message_id) message.status = Message.Viewed + message.viewed_at = datetime.now() message.save() except Message.DoesNotExist: return Response({'detail': 'Message not found'}, status=status.HTTP_404_NOT_FOUND) @@ -309,8 +317,8 @@ def create(self, request, *args, **kwargs): def update(self, request, *args, **kwargs): instance = self.get_object() - if instance.reviewer != request.user: - return Response({"error": "You can only update your own reviews."}, status=status.HTTP_403_FORBIDDEN) + # if instance.reviewer != request.user: + # return Response({"error": "You can only update your own reviews."}, status=status.HTTP_403_FORBIDDEN) return super().update(request, *args, **kwargs) @action(detail=True, methods=['get'], url_path='user-reviews') @@ -326,4 +334,15 @@ def average_rating(self, request, pk=None): average_rating = Review.objects.filter(reviewee=user).aggregate(Avg('rating'))['rating__avg'] return Response({"average_rating": average_rating}) - \ No newline at end of file + + + +@api_view(['GET']) +def get_listing(request, listing_id): + try: + listing = Listing.objects.get(id=listing_id) + serializer = ListingSerializer(listing) + return Response(serializer.data) + except Listing.DoesNotExist: + return Response({'detail': 'Listing not found'}, status=status.HTTP_404_NOT_FOUND) + \ No newline at end of file diff --git a/projektBazy/db.sqlite3 b/projektBazy/db.sqlite3 index 17a25e9d0cab7f6a7dbb370f28511982a192cc12..71a50961872be549b5b24c5bd7c9489a519ebd88 100644 GIT binary patch delta 548 zcmZvYPe_w-9L9hD-1ZymeP&A(61Ieq6}tC*r_Qa2tq~Cf4%#JB+-Pq)G&gz&MIwwk zbm&s-5OlCh(6Pl}?=cK@cr<8p6~N5HBE zo(v{w;&tYQf6#*gj_-Jevv`X~s3MP3NaHi^VW4&*&{2lr<3VZ87mBmD4Aacc8D8)p zJs2$J%~F18j`edMrj<31uW~hX@`&ds_a83Yn9o)ohK8wlPz_nt5KR|70!@NVG||OY zt+)IIPd8stLB+ltvuTT97j67P%cfrsY31jJ@1D;FejEqIC)#vP{>Y!*7v@Q21)`E1>9wI4ay#9@efX&tk*6qL# zm^e*cq^~bQq)Z!T$uyQq|5)oWJu(^|*EBWiCWKIQ2s-xje!%JMu}vkn_NLe#n3VN6 Zb9gOBoNa@0yQfeskzzXsD8+v7>mR^~m^lCd delta 233 zcmZoTz}IkqZ-O+V-9#B@M!Ss(OXMZE_^lcEU-Hl5x8~o^-_5^)Ka;2L}ER z{J;6XZWe5K#6SJRdPWhT;3o$DKm6bMKLG`w@NfULpHWBvC~C>Te~`b4-x6qxHve|Z z`;4a(wzC*8GYM>GQ(*qVzx`i46Pp1CBmX=GAW{dan#8|--h8Gs12zT$1|ZnZb%E(E f|HJ^!MH2+JePCh{Sj_SuU^zl+A6AknwOW00SNfDiqkjqGB7*_abSQA%J}?cqWVUURJIg>DsBdb6u~)6nT%0_ zDMBg2nT$YE1Wby8NwG}Ebe1Tg6!9qG6p1L26qYDaAQnrJj1o_gijt_5)|A<-#Hh|{ zDV36yn3tZfmy)EHl$e~InwL_nS6rBrS(0j8#RU|EvNf4*vAO!Wd-}QFV)1kIbuHrE zypQcM6PFgyX^cQzEHHUB=Uj2U8v+tDY%U6@e`IAAVEe$#%FEQi`9W-Q8dm~~22dFQ D4@o+L delta 315 zcmZn_JteAsnwOW00SJm^iqoI*F)%y^abSQ0%J}?kqWVU!6oC}M6rmL16p<9sIc%AX zQGzLADdL%oKvDusN`gtLOvZGUD4`VTDB%>DD3KJFC{Z95OOcHdPmzm~sFc@K*sQ>) z&RQ>#l9ia3p0AgZq?eSKoSmANQmmI-SzMTNi>){#zre-m7Mqc|k*S$s6?cAdQhr5h zv0i>r`Yq0!{N%)(jQrw~TP()L24|-Bg%k+_eN^QEws>