Example #1
0
 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'})
Example #2
0
    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)
Example #3
0
 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'})
Example #4
0
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)
Example #5
0
 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)