Пример #1
0
    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"})
Пример #2
0
    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"})
Пример #3
0
    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)
Пример #5
0
    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)
Пример #6
0
    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)
Пример #7
0
    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"})
Пример #8
0
    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)
Пример #9
0
    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)