def put(self, request, review_pk): """ 이미지는 multipart/form-data로 보내주세요! Key 값은 "images" 입니다. """ user = is_logged_in(request) review = self.get_object(review_pk) if user != review.user: return Response(status=403) serializers = ReviewSerializers(instance=review, data=request.data) serializers.is_valid(raise_exception=True) review = serializers.save( user=user, perfume=review.perfume ) for image in review.images.all(): fp = os.path.join('media', 'review', 'original', f'{image.pk}.webp') os.remove(fp) image.delete() try: for img_file in dict((request.data).lists())['images']: with PILImage.open(img_file) as im: im.save('tmp.webp', 'webp') image = Image.objects.create() image.original.save(f'{image.pk}.webp', File(open('tmp.webp', 'rb'))) review.images.add(image) finally: return Response(status=200, headers={'Access-Control-Allow-Headers': 'token'})
def post(self, request): """ 서비스 """ gender = request.POST.get('gender', None) gender = int(gender) age = str(request.POST.get('age', None)) seasons = request.POST.get('season', None) categories = request.POST.get('category', None) categories = set(map(int, categories.split(','))) notes = request.POST.get('notes', None) notes = set(map(int, notes.split(','))) products = Perfume.objects.prefetch_related('seasons')\ .prefetch_related('categories').filter(availability=True) print(products) products = products.filter(gender=gender) print('gender_filtered', products) if seasons is not None: season_list = seasons.split(',') products = products.filter(seasons__id__in=season_list) print('season_filtered***********', products) products = products.filter(categories__id__in=categories) print('category_filtered***********', products) # 유명 노트 포함 향수 필터링 products = products.filter(brand__id__in=FAMOUS_BRANDS) print('brand_filtered***********', products) # sort => include_note 많이 가지고 있는 애들부터 보여주기 notes_list = [] for num in categories: notes_list += FAMOUS_NOTES[num] products = products.prefetch_related('top_notes').prefetch_related('heart_notes').prefetch_related('base_notes')\ .annotate(score=Count('top_notes', filter=Q(top_notes__id__in=notes_list)) + Count('heart_notes', filter=Q(heart_notes__id__in=notes_list)) + Count('base_notes', filter=Q(base_notes__id__in=notes_list)) ).order_by('-score')[:15] print('final_filtered***********', products) try: user = is_logged_in(request) except: pass else: try: survey = Survey.objects.get(user=user) except: survey = Survey.objects.create(user=user) print(seasons, categories, notes) survey.season.set(season_list) survey.like_category.set(categories) survey.like_notes.set(notes) serializer = PerfumeSerializers(products, many=True) return Response(serializer.data, status=200)
def delete(self, request, review_pk): user = is_logged_in(request) review = self.get_object(review_pk) if user != review.user: return Response(status=403) for image in review.images.all(): fp = os.path.join('media', 'review', 'original', f'{image.pk}.webp') os.remove(fp) image.delete() review.delete() return Response(status=200, headers={'Access-Control-Allow-Headers': 'token'})
def like_review(request, review_pk): """ Reponse는 좋아요 버튼을 누른 결과입니다. {"userLikesThisReview": Boolean} """ user = is_logged_in(request) try: review = Review.objects.get(pk=review_pk) except: raise Http404 if review in user.like_reviews.all(): user.like_reviews.remove(review) return Response({'userLikesThisReview': False}, status=200) user.like_reviews.add(review) return Response({'userLikesThisReview': True}, status=200)
def post(self, request, perfume_pk): """ 이미지는 multipart/form-data로 보내주세요! Key 값은 "images" 입니다. """ user = is_logged_in(request) try: perfume = Perfume.objects.get(pk=perfume_pk) except: return Response(status=404) serializers = ReviewSerializers(data=request.data) serializers.is_valid(raise_exception=True) review = serializers.save( user=user, perfume=perfume, ) try: for img_file in dict((request.data).lists())['images']: with PILImage.open(img_file) as im: im.save('tmp.webp', 'webp') image = Image.objects.create() image.original.save(f'{image.pk}.webp', File(open('tmp.webp', 'rb'))) review.images.add(image) finally: return Response({'review_id': review.pk}, status=200)