diff --git a/meong_signal/walk/models.py b/meong_signal/walk/models.py index e1dd33d..6f6c9c7 100644 --- a/meong_signal/walk/models.py +++ b/meong_signal/walk/models.py @@ -10,11 +10,11 @@ class Walk(models.Model): kilocalories = models.DecimalField(max_digits=10, decimal_places=1) time = models.IntegerField() date = models.DateField() - image = models.ImageField(upload_to='walks', default='walks/default_walk.png') + image = models.ImageField(upload_to='dogs', default='dogs/default_dog.png') def save(self, *args, **kwargs): if not self.image: - self.image = 'walks/default_walk.png' + self.image = 'dogs/default_dog.png' super().save(*args, **kwargs) class Trail(models.Model): diff --git a/meong_signal/walk/serializer.py b/meong_signal/walk/serializer.py index 57376d0..2beb43c 100644 --- a/meong_signal/walk/serializer.py +++ b/meong_signal/walk/serializer.py @@ -45,23 +45,9 @@ class Meta: class WalkRegisterSerializer(serializers.ModelSerializer): class Meta: model = Walk - fields = ['dog_id', 'time', 'distance', 'image'] + fields = ['dog_id', 'time', 'distance'] def create(self, validated_data): - if 'image' in validated_data: - # 파일의 확장자 추출 - image = validated_data['image'] - - file_extension = image.name.split('.')[-1] - - # UUID를 사용한 새 파일 이름 생성 - new_file_name = generate_uuid_filename(file_extension) - - # 파일을 메모리에 저장 - temp_file = ContentFile(image.read()) - temp_file.name = new_file_name - - validated_data['image'] = temp_file user = self.context['request'].user # 산책한 사람 @@ -69,11 +55,9 @@ def create(self, validated_data): owner = dog.user_id kilocalories = get_calories(validated_data['time'], float(validated_data['distance'])) - walk = Walk.objects.create(user_id=user, owner_id = owner, kilocalories=kilocalories, date=date.today(), **validated_data) - + walk = Walk.objects.create(user_id=user, owner_id = owner, image = dog.image, kilocalories=kilocalories, date=date.today(), **validated_data) return walk - # 강아지 정보 조회할 때 필요한 산책에 대한 정보 class DogWalkRegisterSerializer(serializers.ModelSerializer): nickname = serializers.SerializerMethodField() # 같이 산책한 사람의 nickname diff --git a/meong_signal/walk/views.py b/meong_signal/walk/views.py index e78c910..77951e4 100644 --- a/meong_signal/walk/views.py +++ b/meong_signal/walk/views.py @@ -127,6 +127,7 @@ def new_walk(request): if isinstance(data, QueryDict): data = QueryDict.dict(data) + try: dog = Dog.objects.get(id = data["dog_id"]) if dog.user_id.id == user: # 강아지 주인의 id와 user id가 같을시 return @@ -142,7 +143,7 @@ def new_walk(request): if walks.exists(): week_distance_before = walks.aggregate(Sum('distance'))['distance__sum'] week_unique_dog_count_before = walks.values('dog_id').distinct().count() - + serializer = WalkRegisterSerializer(data=data, context={'request': request}) if serializer.is_valid(): saved_data = serializer.save() @@ -152,27 +153,28 @@ def new_walk(request): # 관련 업적 갱신 achievements = UserAchievement.objects.filter(user_id = request.user.id, is_achieved = False) - for achievement in achievements: - try: - original_achievement = Achievement.objects.get(id = achievement.achievement_id.id) - if original_achievement.category == 'dog': - if achievement.count + 1 >= original_achievement.total_count: # 업적 달성 조건을 만족한경우 - achievement.is_achieved = True - achievement.count += 1 - achievement.save() - - else: # achievement.category == 'walking' - if achievement.count + distance >= original_achievement.total_count: # 업적 달성 조건을 만족한경우 - achievement.is_achieved = True - achievement.count = original_achievement.total_count - else: - achievement.count += distance - achievement.save() - - except ObjectDoesNotExist: - pass - except Exception as e: - return Response({"error": f"업적 update error: {e}"}, status=500) + if achievements.exists(): + for achievement in achievements: + try: + original_achievement = Achievement.objects.get(id = achievement.achievement_id.id) + if original_achievement.category == 'dog': + if achievement.count + 1 >= original_achievement.total_count: # 업적 달성 조건을 만족한경우 + achievement.is_achieved = True + achievement.count += 1 + achievement.save() + + else: # achievement.category == 'walking' + if achievement.count + distance >= original_achievement.total_count: # 업적 달성 조건을 만족한경우 + achievement.is_achieved = True + achievement.count = original_achievement.total_count + else: + achievement.count += distance + achievement.save() + + except ObjectDoesNotExist: + pass + except Exception as e: + return Response({"error": f"업적 update error: {e}"}, status=500) # User DB의 distance, count 갱신 try: @@ -366,12 +368,14 @@ def walk_user_image(request): @api_view(['POST']) @authentication_classes([JWTAuthentication]) def walk_and_review_info(request): - return_data = {"dog_name" : '', "total_distance" : 0, "my_profile_image" : "", "reviewer_profile_image" : "", "reviewer_average_rating" : 0, "my_review" : "", "received_review" : "", "image" : "walks/default_walk", "dog_image":"", "reviewer_nickname":""} + return_data = {"dog_name" : '', "total_distance" : 0, "my_profile_image" : "", "reviewer_profile_image" : "", "reviewer_average_rating" : 0, "my_review" : "", "received_review" : "", "dog_image":"", "reviewer_nickname":"", "distance" : 0, "date" : "", "time" : 0} user = request.user walk_id = request.data['walk_id'] try: walk = Walk.objects.get(id = walk_id) - return_data["image"] = walk.image.url + return_data["distance"] = walk.distance + return_data["date"] = walk.date + return_data["time"] = walk.time dog = Dog.objects.get(id=walk.dog_id.id) return_data["dog_name"] = dog.name