Skip to content

Commit

Permalink
Merge pull request #87 from seaniiio/main
Browse files Browse the repository at this point in the history
FIX : #8 산책 api 수정
  • Loading branch information
sae2say authored Aug 4, 2024
2 parents 4474d6f + d793afe commit 9b36084
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 44 deletions.
4 changes: 2 additions & 2 deletions meong_signal/walk/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
20 changes: 2 additions & 18 deletions meong_signal/walk/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,35 +45,19 @@ 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 # 산책한 사람

dog = Dog.objects.select_related('user_id').get(id = validated_data['dog_id'].id) # 관련된 user 객체도 가져옴
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
Expand Down
52 changes: 28 additions & 24 deletions meong_signal/walk/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand All @@ -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:
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 9b36084

Please sign in to comment.