Exemple #1
0
def edit_profile_image():
    user_id = session["id"]
    user = User.query.filter_by(id=user_id).first()
    if request.method == "POST":
        uploaded_file = request.files.getlist("file")[0]

        image_url = save_image(uploaded_file, user.uuid,
                               "profile_img")
        if image_url == "NOT_ALLOWED":
            return {"error": "Uploaded file has not allowed format"}, 404
        elif image_url == "NOT_SAVED":
            return {"error": "Something went wrong. Uploaded image has not been saved"}, 404
        user.image_url = image_url
        db.session.add(user)
        db.session.commit()
        return {"msg": "Image uploaded",
                "image_url": user.image_url}, 200

    elif request.method == "DELETE":
        url = user.image_url
        path = os.path.join(
            current_app.config["USERS_FOLDER"], user.uuid, url.split('/')[-1])
        try:
            os.remove(path)
        except:
            print(
                f"File {url.split('/')[-1]} in folder {user.uuid} has not been deleted")
        user.image_url = current_app.config['PROFILE_IMAGE']

        db.session.add(user)
        db.session.commit()
        return {"msg": "Image deleted",
                "image_url": user.image_url}, 200
Exemple #2
0
 def save_images(self, vendor=None):
     vendor = vendor if vendor else current_user
     for image_field in self.image_fields:
         if getattr(self, image_field).data:
             image, image_hash = save_image(vendor.id, 'vendor', getattr(self, image_field),
                                            IO(b64decode(getattr(self, image_field).data[23:])))
             setattr(vendor, image_field, image)
             db.session.add(vendor)
         db.session.commit()
Exemple #3
0
 def revoke(self):
     contract, image_hash = save_image(current_user.id, 'vendor', self.contract, self.contract.data.stream)
     revocation = DistributorRevocation.query.filter_by(distributor_id=self.distributor.id).limit(1).first()
     if not revocation:
         revocation = DistributorRevocation(self.distributor.id, contract)
     else:
         revocation.contract = contract
         revocation.pending = True
     db.session.add(revocation)
     db.session.commit()
Exemple #4
0
 def update_vendor_setting(self, vendor):
     vendor.introduction = self.introduction.data
     vendor.telephone = self.telephone.data
     vendor.contact = self.contact.data
     vendor.address.address = self.address.data
     # vendor.address.cn_id = self.area_cn_id.data
     if vendor.email != self.email.data:
         vendor.email = self.email.data
         vendor.email_confirmed = False
     if self.logo.data:
         logo, image_hash = save_image(vendor.id, 'vendor', self.logo, self.logo.data.stream)
         vendor.logo = logo
     db.session.add(vendor)
     db.session.add(vendor.address)
     db.session.commit()
Exemple #5
0
 def add_item_image(self):
     image_path, image_hash = save_image(self.item_id.data, 'item', self.file, self.file.data.stream)
     item_image = ItemImage(self.item_id.data, image_path, image_hash, self.file.data.filename[:30], 999)  # 新上传的图片默认在最后
     db.session.add(item_image)
     db.session.commit()
     return {'hash': item_image.hash, 'url': item_image.url, 'created': item_image.created}
Exemple #6
0
def edit_product_images(product_id):
    user_id = session["id"]
    product = Product.query.filter_by(id=product_id).first()
    user = product.user
    if user_id != product.user_id:
        return {}, 403
    if request.method == "POST":
        total_images = product.images.count()
        if total_images >= 4:
            return {"error": "You already have 4 images saved. Delete them first."}, 404
        count_uploaded = 0
        rejected = []
        for uploaded_file in request.files.getlist("file"):
            if total_images == 4:
                return {"msg": f"Every product can have up to 4 images. Uploaded {count_uploaded} images"}, 200
            image_name = f"{product.name}-{product_id}-{str(uuid4())[:8]}"
            image_url = save_image(uploaded_file, user.uuid,
                                   image_name)
            if (image_url == "NOT_ALLOWED" or image_url == "NOT_SAVED"):
                rejected.append(uploaded_file.filename)
                continue
            image = Image(
                product_id=product_id,
                image_url=image_url)
            db.session.add(image)
            db.session.commit()
            if total_images == 0:
                product.primary_image = image_url
                db.session.add(product)
                db.session.commit()
            count_uploaded += 1
            total_images += 1

        msg = f"{count_uploaded} {'file has' if count_uploaded == 1 else 'files have'} been uploaded."

        if len(rejected) > 0:
            msg += f" {len(rejected)} {'file was rejected: ' if len(rejected) == 1 else 'files were rejected: '} "
        if count_uploaded == 0:
            return {}, 404
        for r in rejected:
            msg += f"{r} "
        return {"msg": msg}, 200

    if request.method == "DELETE":
        image_id = request.json.get("image_id", None)
        uuid = product.user.uuid
        if image_id is None:
            return {}, 404
        image = product.images.filter_by(id=image_id).first()
        if image is None:
            return {}, 404

        total_images = product.images.count()
        if total_images == 1:
            product.primary_image = ""
        elif total_images > 1 and product.primary_image == image.image_url:
            new_prim_image = product.images.first()
            product.primary_image = new_prim_image.image_url
        db.session.add(product)
        db.session.commit()

        db.session.delete(image)
        db.session.commit()

        image_name = image.image_url.split('/')[-1]
        to_delete = os.path.join(
            current_app.config["USERS_FOLDER"], uuid, image_name)
        try:
            os.remove(to_delete)
        except:
            print(
                f"File {image_name} in {uuid} folder has not been deleted")
        return {"msg": "The image has been deleted"}, 200