Multimart / app.py
Abdullah6395's picture
error in json i was storing array in json
78e32b2
from flask import Flask,render_template,request,Response,jsonify,redirect,url_for
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import matplotlib.pyplot as plt
import pandas as pd
import os
import json
import re
from PIL import Image
import threading
import algorithms as alg
from io import BytesIO
app=Flask(__name__)
folder='static/images'
app.config["UPLOAD_FOLDER"]=folder
user="null"
pair={}
def pred_ver_and_save_data(img,img_name,data,digit,name,vector,brand,desc,cat,price):
try:
ans=alg.tell_vernelable(img)
except Exception as e:
ans=0.000001
vector=list(vector)
if ans>0.5:
data[f"id{digit+1}"]={"name":name,"description":desc,"reviews":[],"clicks":0,"category":cat,"price":price,"brand":brand,"img":f"images/{img_name}","vector":vector}
else:
data[f"id{digit+1}"]={"name":name,"description":desc,"reviews":[],"clicks":0,"category":cat,"price":price,"brand":brand,"img":'images/error.png',"vector":vector}
with open("products.json","w") as file:
json.dump(data,file)
file.close()
return 0
@app.route("/")
def page():
return render_template("index.html")
@app.route("/niche")
def niche():
return render_template("Niche.html")
@app.route("/product_panel/<product_id>",methods=["GET"])
def product_panel(product_id):
with open("products.json") as f:
data=json.load(f)
f.close()
vectors=[]
for ids in data:
vectors.append(data[ids]["vector"])
vect_arr=np.array(vectors)
to_compare=np.array(data[product_id]["vector"]).reshape(1,-1)
sim=[]
indexes=[]
rec={}
for vec in vect_arr:
sim.append(cosine_similarity(to_compare,vec.reshape(1,-1)))
sorted_sim=sorted(sim)[1:4]
for similar in sorted_sim:
indexes.append(sim.index(similar))
for i in indexes:
rec[list(data)[i]]=data[list(data)[i]]
return render_template("product_panel.html",product=data[product_id],rec_pro=rec)
@app.route("/products",methods=["GET"])
def products():
global user
with open("products.json") as f:
data=json.load(f)
f.close()
return render_template("products.html",products=data)
@app.route("/login",methods=['GET',"POST"])
def login():
global user
if request.method=="POST":
with open("seller.json") as f:
data=json.load(f)
name=request.form['name']
password=request.form['password']
if name not in list(data):
return redirect(url_for("sign_up"))
elif password=="":
return render_template("login.html")
elif password == str(data[name]['password']):
user=name
with open("products.json") as f:
pro=json.load(f)
f.close()
return redirect(url_for("products"))
else:
return render_template("login.html")
else:
return render_template("login.html")
@app.route("/sign_up",methods=["GET","POST"])
def sign_up():
global user
if request.method=="GET":
return render_template("Signup.html")
else:
with open("seller.json") as f:
data=json.load(f)
f.close()
name=request.form['name']
if name in list(data):
return redirect(url_for("login"))
else:
user=name
password=request.form['confirm']
data[name]={"password":password,"products":[],"reviews":[]}
with open("seller.json","w") as f:
json.dump(data,f)
f.close()
return redirect(url_for("niche"))
@app.route("/graph")
def graph():
with open("seller.json") as file:
data=json.load(file)
file.close()
a=[]
reviews=data['username1']['reviews']
for review in reviews:
sentiment=alg.give_sentiment(review)
a.append(sentiment)
df=pd.Series(a)
df=df.replace({1:"positive",0:"negative"})
data=df.value_counts()
fig,ax=plt.subplots()
data.plot(kind="bar" ,ax=ax)
plt.xlabel("review sentiment")
plt.ylabel("no of reviews")
plt.xticks(rotation=0)
img=BytesIO()
fig.savefig(img,format="png")
img.seek(0)
return Response(img, mimetype='image/png')
@app.route("/seller",methods=["GET","POST"])
def seller():
with open("seller.json") as file:
seller=json.load(file)
file.close()
reviews=seller[user]['reviews']
products=seller[user]['products']
with open("products.json") as file:
prod=json.load(file)
file.close()
return render_template("seller_dashboard.html",user=user,product=prod,ids=products,reviews=reviews)
@app.route("/tell",methods=['POST',"GET"])
def tell():
if request.method=="GET":
return render_template("add_product.html")
else:
img_file=request.files["image"]
img_name=img_file.filename
img_file=Image.open(img_file.stream).convert("RGB")
image_path=os.path.join(app.config['UPLOAD_FOLDER'],f"{img_name.split('.')[0]}.jpg")
img_file.save(image_path,"JPEG")
img=np.expand_dims(np.array(img_file.resize((256,256))).astype(np.float32)/255,axis=0)
with open("products.json") as file:
data=json.load(file)
file.close()
last=list(data.keys())[-1]
digit=int("".join(re.findall(r"\d",last)))
name=request.form["name"]
cat=request.form["category"]
desc=request.form["description"]
brand=request.form["brand"]
price=request.form['price']
vector=name+" "+brand+" "+desc
with open("tokenize_description.json","r") as file:
tokenizer=json.load(file)
with open("seller.json") as file:
seller=json.load(file)
new_product_id = f"id{digit+1}"
seller[user]["products"].append(new_product_id)
with open("seller.json","w") as file:
json.dump(seller,file)
file.close()
seq=[tokenizer[word] for word in vector.split() if word in tokenizer.keys()]
if len(seq)<=22:
vector=np.pad(seq,(22-len(seq),0))
else:
vector=np.array(vector[:22])
vector=[int(val) for val in vector]
threading.Thread(target=pred_ver_and_save_data,args=(img,img_name,data,digit,name,vector,brand,desc,cat,price)).start()
return render_template("seller_dashboard.html",user=user,ids=seller[user]["products"][:-1],product=data,reviews=seller[user]["reviews"])
@app.route("/chatbot",methods=["GET","POST"])
def chatbot():
if request.method=="GET":
return render_template("chatwindow.html",chat=pair)
else:
question=request.form['question']
question=question.lower()
ans=alg.ChatWithMe(question)
pair[question]=ans
return render_template("chatwindow.html",chat=pair)
@app.route("/predict", methods=["POST","GET"])
def predict():
if request.method=="POST":
data = request.json
input_text = data.get("text", "")
sugg=alg.pred_next(input_text,1)
return jsonify({"suggestions": [sugg]})
else:
return render_template("products.html")
if __name__=="__main__":
app.run(debug=True)