Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ build-backend = "poetry.core.masonry.api"

[tool.black]
line-length = 120
target-version = ['py38']
include = '\.pyi?$'
extend-exclude = '''
/(
Expand Down
2 changes: 1 addition & 1 deletion secret
80 changes: 23 additions & 57 deletions src/misiklist/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import filters, generics, permissions, status, views
from rest_framework.views import Response

from config.paginations import BasicPagination
from restaurant.models.restaurant_models import Restaurant
Expand Down Expand Up @@ -79,16 +80,7 @@ def get_permissions(self):

@swagger_auto_schema(
operation_summary="미식리스트 목록 반환",
manual_parameters=[
openapi.Parameter(
"ordering",
openapi.IN_QUERY,
description="정렬 기준",
required=False,
type=openapi.TYPE_STRING,
enum=["-updated_at", "-bookmark_count"],
)
],
manual_parameters=[openapi.Parameter("ordering", openapi.IN_QUERY, description="정렬 기준", required=False, type=openapi.TYPE_STRING, enum=["-updated_at", "-bookmark_count"])] # fmt: skip
)
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
Expand Down Expand Up @@ -158,16 +150,7 @@ def get_queryset(self):

@swagger_auto_schema(
operation_summary="내 미식리스트 목록 반환",
manual_parameters=[
openapi.Parameter(
"ordering",
openapi.IN_QUERY,
description="정렬 기준",
required=False,
type=openapi.TYPE_STRING,
enum=["-updated_at", "-bookmark_count"],
)
],
manual_parameters=[openapi.Parameter("ordering", openapi.IN_QUERY, description="정렬 기준", required=False, type=openapi.TYPE_STRING, enum=["-updated_at", "-bookmark_count"])] # fmt: skip
)
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
Expand All @@ -179,7 +162,6 @@ class MisiklistDetailView(generics.RetrieveUpdateDestroyAPIView):
lookup_field = "uuid"

def get_permissions(self):
# obj = self.get_object()
if self.request.method == "GET":
return [IfMisiklistIsPrivateThenIsMisiklistOwner()]
else:
Expand Down Expand Up @@ -266,87 +248,75 @@ def get_queryset(self):
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return views.Response(serializer.data)
return Response(serializer.data)

@swagger_auto_schema(
operation_summary="미식리스트 상세 반환",
)
@swagger_auto_schema(operation_summary="미식리스트 상세 반환")
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="미식리스트 수정",
)
@swagger_auto_schema(operation_summary="미식리스트 수정")
def put(self, request, *args, **kwargs):
return super().put(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="미식리스트 삭제",
)
@swagger_auto_schema(operation_summary="미식리스트 삭제")
def delete(self, request, *args, **kwargs):
return super().delete(request, *args, **kwargs)


class MisiklistThumbnailView(views.APIView):
permission_classes = [IsMisiklistOwner]

@swagger_auto_schema(
operation_summary="미식리스트 썸네일 수정",
)
@swagger_auto_schema(operation_summary="미식리스트 썸네일 수정")
def post(self, request, *args, **kwargs):
misiklist = generics.get_object_or_404(Misiklist, uuid=kwargs["uuid"])
serializer = serializers.MisiklistThumbnailSerializer(misiklist, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return views.Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.data, status=status.HTTP_200_OK)

def delete(self, request, *args, **kwargs):
misiklist = generics.get_object_or_404(Misiklist, uuid=kwargs["uuid"])
misiklist.thumbnail.delete()
return views.Response(status=status.HTTP_204_NO_CONTENT)
return Response(status=status.HTTP_204_NO_CONTENT)


class MisiklistBookmarkToggleView(views.APIView):
permission_classes = [permissions.IsAuthenticated]

@swagger_auto_schema(
operation_summary="미식리스트 북마크 토글",
)
@swagger_auto_schema(operation_summary="미식리스트 북마크 토글")
def post(self, request, *args, **kwargs):
misiklist = generics.get_object_or_404(Misiklist, uuid=kwargs["uuid"])

# 비공개 미식리스트는 북마크 불가능
if misiklist.is_private:
return views.Response({"status": "비공개 미식리스트"}, status=403)
return Response({"status": "비공개 미식리스트"}, status=403)

if misiklist.bookmark_users.filter(id=request.user.id).exists():
misiklist.bookmark_users.remove(request.user)
return views.Response({"status": "미식리스트 북마크 해제됨"}, status=status.HTTP_200_OK)
return Response({"status": "미식리스트 북마크 해제됨"}, status=status.HTTP_200_OK)
else:
misiklist.bookmark_users.add(request.user)
return views.Response({"status": "미식리스트 북마크 추가됨"}, status=status.HTTP_200_OK)
return Response({"status": "미식리스트 북마크 추가됨"}, status=status.HTTP_200_OK)


class MisiklistRestaurantView(views.APIView):
permission_classes = [permissions.IsAuthenticated]

@swagger_auto_schema(
operation_summary="미식리스트 식당 추가",
)
@swagger_auto_schema(operation_summary="미식리스트 식당 추가")
def post(self, request, *args, **kwargs):
misiklist = generics.get_object_or_404(Misiklist, uuid=kwargs["uuid"])

# 미식리스트 권한 확인
if misiklist.created_by != request.user:
return views.Response(status=status.HTTP_403_FORBIDDEN)
return Response(status=status.HTTP_403_FORBIDDEN)

restaurant = generics.get_object_or_404(Restaurant, uuid=request.data["restaurant_uuid"])
memo = request.data.get("memo", "")
order = misiklist.restaurant_list.count() + 1

MisiklistThrough.objects.create(restaurant=restaurant, misiklist=misiklist, order=order, memo=memo)
# 미식리스트 리턴
return views.Response(
return Response(
serializers.MisiklistDetailBasicSerializer(
misiklist,
).data,
Expand All @@ -357,15 +327,13 @@ def post(self, request, *args, **kwargs):
class MisiklistRestaurantDetailView(views.APIView):
permission_classes = [permissions.IsAuthenticated]

@swagger_auto_schema(
operation_summary="미식리스트 식당 메모 수정",
)
@swagger_auto_schema(operation_summary="미식리스트 식당 메모 수정")
def put(self, request, *args, **kwargs):
misiklist = generics.get_object_or_404(Misiklist, uuid=kwargs["uuid"])

# 미식리스트 권한 확인
if misiklist.created_by != request.user:
return views.Response(status=status.HTTP_403_FORBIDDEN)
return Response(status=status.HTTP_403_FORBIDDEN)

restaurant_order = kwargs["restaurant_order"]

Expand All @@ -374,17 +342,15 @@ def put(self, request, *args, **kwargs):
serializer.is_valid(raise_exception=True)
serializer.save()

return views.Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.data, status=status.HTTP_200_OK)

@swagger_auto_schema(
operation_summary="미식리스트 식당 삭제",
)
@swagger_auto_schema(operation_summary="미식리스트 식당 삭제")
def delete(self, request, *args, **kwargs):
misiklist = generics.get_object_or_404(Misiklist, uuid=kwargs["uuid"])

# 미식리스트 권한 확인
if misiklist.created_by != request.user:
return views.Response(status=status.HTTP_403_FORBIDDEN)
return Response(status=status.HTTP_403_FORBIDDEN)

restaurant_order = kwargs["restaurant_order"]

Expand All @@ -396,4 +362,4 @@ def delete(self, request, *args, **kwargs):
misiklist_through.order = idx + 1
misiklist_through.save()

return views.Response(status=status.HTTP_204_NO_CONTENT)
return Response(status=status.HTTP_204_NO_CONTENT)
2 changes: 1 addition & 1 deletion src/restaurant/management/commands/fetch_gmap_photos.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from asgiref.sync import sync_to_async
from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand

from parsing.gmap import fetch_gmap_photo_url, fetch_gmap_photos

from restaurant.models.restaurant_models import Restaurant
from review.models import ReviewPhoto

Expand Down
20 changes: 5 additions & 15 deletions src/restaurant/management/commands/parse_gurunavi_detail.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from django.core.management.base import BaseCommand
from django.db import transaction

from parsing.gurunavi import get_restaurant_detail

from restaurant.models.restaurant_models import Restaurant


Expand All @@ -31,18 +31,12 @@ def process_restaurant(self, restaurant_id):
details = get_restaurant_detail(restaurant.gurunavi_id)

if not details:
self.stdout.write(
self.style.WARNING(
f"다음 식당의 정보를 가져오는데 실패했습니다({restaurant.__str__()})"
)
)
self.stdout.write(self.style.WARNING(f"다음 식당의 정보를 가져오는데 실패했습니다({restaurant.__str__()})"))
return

self.update_restaurant(restaurant, details)
self.stdout.write(
self.style.SUCCESS(
f"성공적으로 다음 식당의 구루나비 정보를 가져왔습니다({restaurant.__str__()})"
)
self.style.SUCCESS(f"성공적으로 다음 식당의 구루나비 정보를 가져왔습니다({restaurant.__str__()})")
)

# API 요청 간 지연
Expand All @@ -54,9 +48,7 @@ def update_restaurant(self, restaurant, details):
# 기본 정보 업데이트
restaurant.name_native = details.get("name_local", restaurant.name_native)
restaurant.name_korean = details.get("name", restaurant.name_korean)
restaurant.address_native = details.get(
"japanese_address", restaurant.address_native
)
restaurant.address_native = details.get("japanese_address", restaurant.address_native)
restaurant.address_english = details.get("address", restaurant.address_korean)
restaurant.telephone_number = details.get("tel", restaurant.telephone_number)

Expand Down Expand Up @@ -101,9 +93,7 @@ def update_restaurant(self, restaurant, details):
update_log += "영메, "

# 서비스 언어 관련 업데이트
if re.search(
r"한국어를\s*할\s*줄\s*아는\s*스태프\s*있음", foreign_language
):
if re.search(r"한국어를\s*할\s*줄\s*아는\s*스태프\s*있음", foreign_language):
restaurant_info.is_korean_service_enable = True
update_log += "한서, "
if re.search(r"영어를\s*할\s*줄\s*아는\s*스태프\s*있음", foreign_language):
Expand Down
22 changes: 5 additions & 17 deletions src/restaurant/management/commands/parse_gurunavi_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand
from django.db import transaction

from parsing.gurunavi import get_restaurant_list_data_part

from restaurant.models.region_models import Area
from restaurant.models.restaurant_models import Restaurant, RestaurantInfo

Expand Down Expand Up @@ -39,11 +39,7 @@ def fetch_and_save_restaurant_data(self, area: str):

total_hits = first_page_data.get("hits", 0)
total_pages = math.ceil(total_hits / 20)
self.stdout.write(
self.style.SUCCESS(
f"Total restaurants: {total_hits}, Total pages: {total_pages}"
)
)
self.stdout.write(self.style.SUCCESS(f"Total restaurants: {total_hits}, Total pages: {total_pages}"))

# total_pages = 1 # 테스트용

Expand All @@ -66,11 +62,7 @@ def save_single_restaurant(self, gurunavi_id, restaurant_data):
restaurant, created = Restaurant.objects.get_or_create(gurunavi_id=gurunavi_id)

if created:
self.stdout.write(
self.style.SUCCESS(
f"Creating new restaurant with gurunavi_id: {gurunavi_id}"
)
)
self.stdout.write(self.style.SUCCESS(f"Creating new restaurant with gurunavi_id: {gurunavi_id}"))
else:
self.stdout.write(
self.style.WARNING(
Expand Down Expand Up @@ -98,9 +90,7 @@ def save_single_restaurant(self, gurunavi_id, restaurant_data):
response = requests.get(thumbnail_url)
if response.status_code == 200:
image_name = thumbnail_url.split("/")[-1]
restaurant.thumbnail.save(
image_name, ContentFile(response.content), save=True
)
restaurant.thumbnail.save(image_name, ContentFile(response.content), save=True)

restaurant.save()

Expand Down Expand Up @@ -131,6 +121,4 @@ def save_single_restaurant(self, gurunavi_id, restaurant_data):

restaurant.save()

self.stdout.write(
self.style.SUCCESS(f"Saved restaurant: {restaurant.name_native}")
)
self.stdout.write(self.style.SUCCESS(f"Saved restaurant: {restaurant.name_native}"))
18 changes: 6 additions & 12 deletions src/restaurant/management/commands/separate_name_ko.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from asgiref.sync import sync_to_async
from django.core.management.base import BaseCommand

from parsing.google_ai import fetch_google_ai_json_async

from restaurant.models.restaurant_models import Restaurant


Expand All @@ -15,15 +15,13 @@ def _get_restaurant(self):
"""
한국어 번역 식당명이 존재하며, 아직 나눠지지 않은 식당들을 반환합니다
"""
return Restaurant.objects.filter(
name_ko_brand__isnull=True, name_ko_branch__isnull=True
).exclude(name_korean="")
return Restaurant.objects.filter(name_ko_brand__isnull=True, name_ko_branch__isnull=True).exclude(
name_korean=""
)

def handle(self, *args, **options):
restaurant_list = self._get_restaurant()
self.stdout.write(
self.style.SUCCESS(f"총 {restaurant_list.count()}개의 식당을 찾았습니다")
)
self.stdout.write(self.style.SUCCESS(f"총 {restaurant_list.count()}개의 식당을 찾았습니다"))

for restaurant in restaurant_list:
asyncio.run(self._process_restaurant(restaurant))
Expand All @@ -47,11 +45,7 @@ async def _process_restaurant(self, restaurant):
)
)
except Exception as err:
self.stdout.write(
self.style.WARNING(
f"식당명을 나누는 중 오류가 발생했습니다: {restaurant.__str__()}"
)
)
self.stdout.write(self.style.WARNING(f"식당명을 나누는 중 오류가 발생했습니다: {restaurant.__str__()}"))
self.stdout.write(self.style.WARNING(err))

async def _call_google_ai(self, restaurant_name_ko):
Expand Down
10 changes: 4 additions & 6 deletions src/restaurant/management/commands/update_coordinates.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.core.management.base import BaseCommand

from parsing.gmap import get_restaurant_coordinate_by_address

from restaurant.models.restaurant_models import Restaurant


Expand All @@ -15,14 +15,12 @@ def handle(self, *args, **options):

address = restaurant.get_address
if address == "주소 없음":
print(
f"Failed to update Place ID for {restaurant.name} - 음식점의 주소가 없습니다"
)
print(f"Failed to update Place ID for {restaurant.name} - 음식점의 주소가 없습니다")
continue
try:
lat, long = get_restaurant_coordinate_by_address(address)
lat, lng = get_restaurant_coordinate_by_address(address)
restaurant.latitude = lat
restaurant.longitude = long
restaurant.longitude = lng
restaurant.save()
print(f"Updated coordinate for {restaurant.name}")
except Exception as e:
Expand Down
Loading
Loading