def patch(self, request, *args, **kwargs): """ Android端末のデバイストークンが更新されたら新たなデバイストークンを既存のDeviceTokenオブジェクトに反映させる。 Android側でトークンが変更される場合は以下の状況であり、その際にはAndroid側でonNewTokenコールバックを実行し、このViewに連結させる。 https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja#sample-register endpoint: /api/fcm/user/device_token/ name: - """ """テスト項目 リクエストヘッダーに"token"が含まれていない場合のリクエストに対してResponse:failが返る リクエストヘッダーに"token"が含まれいるが不適切な値の場合のリクエストに対してResponse:failが返る リクエストヘッダーに"token"が含まれ値が適切な場合にはリクエストに対してResponse:successが返る """ token = getTokenFromHeader(self) userObj = getUserByToken(token) if userObj is None: return Response({"result": "fail"}) # print(request.data) # print(request.data.keys()) deviceToken = request.data['deviceToken'] deviceTokenObj = DeviceToken.objects.get(user=userObj) deviceTokenObj.device_token = deviceToken deviceTokenObj.save() return Response({"result": "success"})
def patch(self, request, *args, **kwargs): """ endpoint: 'api/item/<int:pk>/favorite/' name: 'api:item_favorite' #機能:Item.favorite_users(ManyToManyField)にFavoriteオブジェクトを追加する。または削除する。 機能:Item.favorite_users(ManyToManyField)にUserオブジェクトを追加する。または削除する。 補足: このViewを通るのはすべて認証ユーザーである。 未認証ユーザーがFavボタンを押しても、端末に”ログインしてください”と表示されるのみで通信が行われないから。 """ fav_status = None users = [] token = getTokenFromHeader(self) requestUser = getUserByToken(token) itemObjId = self.kwargs["pk"] item_obj = Item.objects.get(id=itemObjId) # item_obj.favorite_users.all()を使ってFavoriteオブジェクトに結びついたUserオブジェクトをリスト化する for user_obj in item_obj.favorite_users.all(): users.append(user_obj) # if user_obj == requestUser: # fav_status = "Favを既に押している" if requestUser in users: item_obj.favorite_users.remove(requestUser) elif requestUser not in users: item_obj.favorite_users.add(requestUser) return Response({"result": "success"})
def get(self, request, *args, **kwargs): """ profile情報を表示する endpoint: /api/profiles/ name: - """ """テスト項目 済 keyを使ってこのエンドポイントにアクセスするとProfileデータを受け取る 済 test_Tokenオブジェクトに存在しないkeyを使った場合rauthentication_failedの値が返る """ # print(self.request.META) # print(self.request.META['HTTP_AUTHORIZATION']) # HTTPリクエストヘッダーのトークン情報からユーザーを特定する # token = self.request.META['HTTP_AUTHORIZATION'].split(" ")[1] token = getTokenFromHeader(self) # print(token) # Userオブジェクトの取得 # user_obj = Token.objects.get(key=token).user user_obj = getUserByToken(token) if user_obj is None: return Response({"result": "fail"}) profile_obj = Profile.objects.get(user=user_obj) # print(profile_obj) print(Response(ProfileSerializer(profile_obj).data)) return Response(ProfileSerializer(profile_obj).data)
def test_usernameのみの変更を行う場合usernameの変更実行できる(self): # 変更前 token_obj = Token.objects.get(key=self.post_user_key) user_obj = getUserByToken(token_obj) self.assertEqual(user_obj.username, "post_user") # 変更を行う client = APIClient() client.credentials(HTTP_AUTHORIZATION='Token ' + self.post_user_key) profile_data = json.dumps({"user": { "username": "******" }}, ensure_ascii=False) response = client.patch(self.PROFILE_URL, profile_data, content_type="application/json") print(response.data) after_user_obj = getUserByToken(self.post_user_key) self.assertEqual(after_user_obj.username, "changedUsername") self.assertNotEqual(after_user_obj.username, user_obj.username)
def get(self, request, *args, **kwargs): # アクセスユーザーの制限 token = getTokenFromHeader(self) requestUser = getUserByToken(token) if requestUser is None: return Response({"result": "fail"}) favItemObjects = Item.objects.filter( favorite_users=requestUser).exclude(active=False) serializer = ItemSerializer(favItemObjects, many=True) # serializerContextに表示するデータを格納 serializerContext = {} serializerContext[SerializerContextKey.ITEM_OBJECTS] = serializer.data # 成功した場合のレスポンスを返す return Response(serializerContext)
def get(self, request, *args, **kwargs): """機能 endpoint: 'api/items/category/<int:pk>/items/list/local/' name: - """ """テスト項目 """ token = getTokenFromHeader(self) userObj = getUserByToken(token) profileObj = Profile.objects.get(user=userObj) category_number = self.kwargs["pk"] # print(category_number) categoryObj = Category.objects.get(number=category_number) itemObjects = Item.objects.filter(category=categoryObj).filter( adm1=profileObj.adm1).exclude(active=False).order_by("-created_at") serializer = ItemSerializer(itemObjects, many=True) serializerContext = {} serializerContext[SerializerContextKey.ITEM_OBJECTS] = serializer.data return Response(serializerContext)
def post(self, request, *args, **kwargs): # ① user_objを取得 token = getTokenFromHeader(self) user_obj = getUserByToken(token) # print(token) # ② category_objを取得 # print("REQUEST_DATA") # print(request.data) strJsonData = request.data["jsonData"] jsonData = json.loads(strJsonData) # print(jsonData) categoryNumber = jsonData.pop("category")["number"] # print("CATEGORY_NAME" + categoryNumber) category_obj = Category.objects.get(number=categoryNumber) jsonData["category"] = category_obj.id # ③ title, description, adm0, adm1, adm2を取得 # serializer.is_valid()がTrueのとき各要素を取得する imagesData = request.FILES # print("IMAGES_DATA : ", imagesData) serializer = ItemSerializer(data=jsonData) if serializer.is_valid(): print("SERIALIZER.IS_VALID : TRUE") item_obj = Item.objects.create( title=jsonData["title"], user=user_obj, description=jsonData["description"], price=jsonData["price"], category=category_obj, adm0=jsonData["adm0"], adm1=jsonData["adm1"], adm2=serializer.validated_data["adm2"]) try: point = jsonData["point"] item_obj.point = point item_obj.save() except: pass try: radius = jsonData["radius"] item_obj.radius = radius item_obj.save() except: pass url = getItemDetailUrl(item_obj.id) #print("ItemObject生成成功") if len(request.FILES.keys()) > 0: print("TRUEが🐸") #item_objに画像データを追加修正する。 try: item_obj.image1 = imagesData[SerializerContextKey.IMAGE1] except: pass try: item_obj.image2 = imagesData[SerializerContextKey.IMAGE2] except: pass try: item_obj.image3 = imagesData[SerializerContextKey.IMAGE3] except: pass item_obj.save() return Response({"result": "success", "detail": url}) return Response({"result": "success", "detail": url}) elif serializer.is_valid() == False: print("SERIALIZER.IS_VALID : False") for ele in serializer: print(ele) return Response({"result": "fail"})
def get(self, request, *args, **kwargs): """機能 endpointに対応する記事データを返す endpoint: "api/items/<int:pk>/" name: "item_detail" 必要なオブジェクト item_obj, profile_obj, solicitudes_objects, direct_messages_objects ItemContactに関しては最新の5コメントしか表示しない仕様である。 """ """テスト項目 済 ItemオブジェクトがResponseとして返される 済 endpoint内のintに対応するidの記事データが返される 済 ItemContactオブジェクトがItemオブジェクトのプロパティとしてResponseで返される 済 UserオブジェクトがItemオブジェクトのプロパティとしてResponseで返される 済 SolicitudオブジェクトがItemオブジェクトのプロパティとしてResponseで返される """ pk = self.kwargs["pk"] item_obj = Item.objects.get(id=pk) item_obj_serializer = ItemSerializer(item_obj) user_obj = item_obj.user profile_obj = Profile.objects.get(user=item_obj.user) profile_obj_serializer = ProfileSerializer(profile_obj) solicitudes_objects = item_obj.solicitudes.all() solicitudSerializer = SolicitudSerializer(solicitudes_objects, many=True) item_contact_objects = item_obj.item_contacts.all().order_by( "-timestamp")[:5] item_contact_objects_serializer = ItemContactSerializer( item_contact_objects, many=True) direct_messages_objects = DirectMessage.objects.filter(item=item_obj) # 共通のデータをserializer_contextに格納する serializer_context = {} serializer_context["item_obj_serializer"] = item_obj_serializer.data serializer_context[ "profile_obj_serializer"] = profile_obj_serializer.data token = getTokenFromHeader(self) accessUser = getUserByToken(token) # serializer_context[SerializerContextKey.BTN_CHOICE]を設定 if accessUser == None: serializer_context[SerializerContextKey. BTN_CHOICE] = BtnChoice.ANONYMOUS_USER_ACCESS elif accessUser == user_obj and solicitudes_objects.count() == 0: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.NO_SOLICITUDES elif accessUser == user_obj and solicitudes_objects.count( ) != 0 and direct_messages_objects.count() == 0: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.SELECT_SOLICITUDES elif accessUser == user_obj and direct_messages_objects.count() != 0: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.GO_TRANSACTION elif accessUser != user_obj and solicitudes_objects.filter( applicant=Profile.objects.get(user=accessUser)).count( ) == 0 and direct_messages_objects.filter( item=item_obj).count() == 0: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.SOLICITAR elif accessUser != user_obj and solicitudes_objects.filter( applicant=Profile.objects.get(user=accessUser)).count( ) != 0 and direct_messages_objects.count() == 0: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.SOLICITADO elif accessUser != user_obj and direct_messages_objects.filter( participant=Profile.objects.get(user=accessUser)).count() == 1: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.GO_TRANSACTION elif accessUser != user_obj and direct_messages_objects.filter( participant=Profile.objects.get(user=accessUser)).count() == 0: serializer_context[ SerializerContextKey.BTN_CHOICE] = BtnChoice.CANNOT_TRANSACTION # データを送信 return Response(serializer_context)
def patch(self, request, *args, **kwargs): """機能 Profileオブジェクトを更新する endpoint: api/profiles/ """ """テスト項目 usernameのみの変更を行う場合usernameの変更実行できる """ print(request.data) print(type(request.data)) serializerContext = {} token = getTokenFromHeader(self) user_obj = getUserByToken(token) profile_obj = Profile.objects.get(user=user_obj) # print(request.data) # 画像データが含まれている時 -> 画像も含めてProfileオブジェクトを更新する # 画像データの送信と文字列データは別々に送信されるのでmultipart通信はありえないことが前提 if len(request.FILES.keys()) > 0: print("TRUEが🐸") profile_obj.image = request.FILES["imageProfile"] profile_obj.save() serializerForSend = ProfileSerializer( Profile.objects.get(user=user_obj)) serializerContext["PROFILE_OBJ"] = serializerForSend.data serializerContext["result"] = "success" Response(serializerContext) serializer = ProfileSerializer(profile_obj, data=request.data, partial=True) if serializer.is_valid() is False: # 入力内容が変わってないとエラーが出るようだ。 print("serializer.is_valid() : ", serializer.is_valid()) text = "" for ele in serializer.errors: print(ele) text += ele + " / " return Response({"result": "fail", "detail": text}) # 画像データが含まれていない時 -> Profileオブジェクトを更新する if serializer.is_valid(): print("ここ通ってる is_valid") print(request.data) # print(serializer) # print("serializer.is_valid() : ",serializer.is_valid()) serializer._validated_data["user_obj_id"] = user_obj.id # print(serializer._validated_data) if "point" in request.data.keys(): # aviso.modelsのシグナルを実行するためにmodel.save()を実行する serializer.save() serializer.instance.save(update_fields=["point"]) else: serializer.save() # print(serializer.data) serializerForSend = ProfileSerializer( Profile.objects.get(user=user_obj)) serializerContext["PROFILE_OBJ"] = serializerForSend.data serializerContext["result"] = "success" return Response(serializerContext)