django-oscar / django-oscar-api

RESTful JSON API for django-oscar

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

getting

pysaundary opened this issue · comments

i am getting File "/home/ec2-user/New-Store/kavishalastore/My_kavi_store/lib64/python3.7/site-packages/oscarapi/serializers/fields.py", line 332, in to_internal_value
http_prefix = data.startswith(("http:", "https:"))
AttributeError: 'InMemoryUploadedFile' object has no attribute 'startswith' when i am trying to update user image

My update view.py

    permission_classes=[IsAuthenticated,]
    def get(self,request,slug):
        user_id=request.user
        try:
            user=User.objects.get(slug=slug)
            serializer=UserImageUpdateSerializer(user)
            data={
                "data":serializer.data,
                "status":True
            }
            return Response(data,status=status.HTTP_200_OK)
        except:
            data={"msg":"slu or user is not valid","status":False}
            return Response(data,status=status.HTTP_200_OK)
    def put(self,request,slug):
        data=request.data
        try:
            user=User.objects.get(slug=slug)
        except:
            data={
                "msg":"slu or user is not valid",
                "status":False
                }
            return Response(data,status=status.HTTP_200_OK) 
        serializer=UserImageUpdateSerializer(user,data=data,partial=True)
        if serializer.is_valid():
            serializer.save()
            data={
                "data":serializer.data,
                "status":True,
            }
            return Response(data,status=status.HTTP_200_OK)
        data={
                "data":serializer.errors,
                "status":False,
            }
        return Response(data,status=status.HTTP_200_OK)  

My Model.py is

class User(AbstractUser):
    email=models.CharField(unique=True,max_length=255)
    username=models.CharField(max_length=50,blank=True,null=True)
    provider=models.CharField(null=True,max_length=50)
    phone=models.CharField(max_length=20,null=True,blank=True)
    slug=models.CharField(max_length=250,null=True,blank=True)
    def get_upload_path(instance,filename):
        import os
        return os.path.join(f"user_profile_pics/{instance.user.username}",filename)
    user_image=models.ImageField(upload_to=get_upload_path, blank=True,null=True)
    REQUIRED_FIELDS = ['first_name',]
    

    @property
    def token(self):
        """
        Allows us to get a user's token by calling `user.token` instead of
        `user.generate_jwt_token().
        The `@property` decorator above makes this possible. `token` is called
        a "dynamic property".
        """
        return self._generate_jwt_token()

    def get_full_name(self):
        full_name = self.first_name
        return full_name
    
    def _generate_jwt_token(self):
        """
        Generates a JSON Web Token that stores this user's ID and has an expiry
        date set to 60 days into the future.
        """
        dt = datetime.now() + timedelta(days=60)

        tokenValue = {
            "id":self.pk,
            'exp': int(dt.timestamp()),
            'username':self.slug,
        }
        try:
            tokenValue['image']=self.image.url
        except:
            tokenValue['image']=None
        token = jwt.encode(tokenValue, settings.SECRET_KEY, algorithm='HS256')

        return token.decode('utf-8')
    
    def save(self,*args, **kwargs):
        if not self.username:
            self.username=create_user_slug(self)
            self.slug=f"{self.username}"
        if not self.slug:
            self.slug=create_user_slug(self)
        super(User, self).save(*args, **kwargs)

and serializer.py is

class UserImageUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model=User
        fields=('user_image',)

Hi @pysaundary

This is probably the same issue as #287

It has been fixed in version 3.1.2

Can you confirm / check if you have 3.1.2 installed?

@pysaundary A gentle reminder ^