Spaces:
Sleeping
Sleeping
from django.shortcuts import render | |
from rest_framework.response import Response | |
from rest_framework.decorators import api_view | |
import json | |
from .models import Products, Categories | |
import os | |
import requests | |
from django.http import HttpResponse | |
from django.template import loader | |
from concurrent.futures import ThreadPoolExecutor | |
# Create your views here. | |
def getProductData(request, category): | |
page = request.GET.get('page') | |
obj = Products.objects.filter(category=Categories.objects.filter(link=category).first()).all() | |
data = {"data": []} | |
for i in obj: | |
temp = {} | |
temp["name"] = i.name | |
temp["score"] = i.score | |
temp["image"] = i.image | |
temp["propGroups"] = i.propGroupsMini | |
temp["propScore"] = i.propScore | |
temp["link"] = i.link | |
data["data"].append(temp) | |
data["data"] = sorted(data["data"], key=lambda k: k['score'] if k['score'] is not None else 0, reverse=True) | |
if page != None: | |
start = (int(page)-1)*50 | |
end = int(page)*50 | |
data["data"] = data["data"][start:end] | |
else: | |
data["data"] = data["data"][:50] | |
if data["data"] == []: | |
return Response({"msg": "No Data Found"}) | |
return Response(data) | |
def searchQuery(request): | |
query = request.GET.get('query') | |
obj = Products.objects.filter(name__contains=query).all() | |
data = {"data": []} | |
for i in obj: | |
temp = {} | |
temp["name"] = i.name | |
temp["score"] = i.score | |
temp["image"] = i.image | |
temp["propGroups"] = i.propGroupsMini | |
temp["propScore"] = i.propScore | |
temp["link"] = i.link | |
data["data"].append(temp) | |
return Response(data) | |
def fetchCategory(request): | |
obj = Categories.objects.all() | |
data = {"data": []} | |
for i in obj: | |
temp = {} | |
temp["name"] = i.name | |
temp["link"] = i.link | |
data["data"].append(temp) | |
return Response(data) | |
def comparisionData(request): | |
try: | |
compare = request.GET.get('compare') | |
url = "https://versus.com/api/store/en/"+compare+"?ts=9980526090123&userId=&type=json" | |
response = requests.request("GET", url) | |
return HttpResponse(json.dumps(response.json()), content_type="application/json") | |
except: | |
return Response({"error": "No Data Found"}) | |
def fetchPriceData(request): | |
try: | |
compare = request.GET.get('compare') | |
url = "https://versus.com/api/prices/"+compare+"/IN?type=json" | |
headers = { | |
'Accept': 'application/json' | |
} | |
response = requests.request("GET", url, headers=headers) | |
return HttpResponse(json.dumps(response.json()), content_type="application/json") | |
except: | |
return Response({"error": "No Data Found"}) | |
# path = "./data/" | |
# dir_list = os.listdir(path) | |
# print(dir_list) | |
# for path in dir_list: | |
# f = open('./data/'+path, "r") | |
# data = json.loads(f.read()) | |
# for i in data["data"]: | |
# try: | |
# obj = Products(name=i["name"], score=i["score"], image=i["image"], | |
# propGroups=i["propGroups"], propScore=i["propScore"], category=path.split(".json")[0].replace("-", " ")) | |
# obj.save() | |
# except: | |
# pass | |
# print(path) | |
# path = "./data/" | |
# dir_list = os.listdir(path) | |
# print(dir_list) | |
# for path in dir_list: | |
# obj = Categories(name=path.split(".json")[0].replace("-", " ").title()) | |
# obj.save() | |
# print(path) | |
def getComparisonChart(request): | |
compare = request.GET.get('compare') | |
url = "https://versus.com/share/summary/en/"+compare | |
response = requests.get(url) | |
template ="<!doctype html><html lang='en' data-reactroot=''><head><link href='/static/chart/chartStyle.css' media='all' rel='stylesheet' type='text/css' /><script type='module' src='/static/chart/chartScript1.mjs'></script><script type='module' src='/static/chart/chartScript2.mjs'></script><script type='module' src='/static/chart/chartScript3.mjs'></script></head><body style='margin:0;min-height:100%;position:relative;font-family:-apple-system,BlinkMacSystemFont,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif'><div id='root'></div><script id='reactInitData'>window.__data = '%%INITIAL_DATA%%';</script><script type='text/javascript'>(function() {var check = document.createElement('script');if (!('noModule' in check) && 'onbeforeload' in check) {var support = false;document.addEventListener('beforeload', function(e) {if (e.target === check) {support = true;} else if (!e.target.hasAttribute('nomodule') || !support) {return;}e.preventDefault();}, true);check.type = 'module';check.src = '.';document.head.appendChild(check);check.remove();}}());</script></body></html>" | |
data = (response.text) | |
data = data.split("<script id=\"reactInitData\">window.__data=")[1].split("</script>")[0] | |
template = template.replace("'%%INITIAL_DATA%%'", data) | |
return HttpResponse(template) | |
def dataManipulator(request): | |
# list all files from ./data/ | |
path = "./data/" | |
dir_list = os.listdir(path) | |
categorys = Categories.objects.all() | |
count = 0 | |
for i in dir_list: | |
products = Products.objects.filter(category=categorys[count]).all() | |
count += 1 | |
data = json.loads(open(path+i, "r").read()) | |
for product in products: | |
for j in data["data"]: | |
if j["name"] == product.name: | |
print(product.name) | |
product.propGroupsMini = j["propGroups"] | |
Products.objects.bulk_update(products, ["propGroupsMini"]) | |
return HttpResponse("Done") | |
def threadFunc(product,count): | |
if product.terms == {}: | |
try: | |
url = "https://versus.com/api/store/en/"+product.link+"?ts=9980526090123&userId=&type=json" | |
response = requests.request("GET", url) | |
data = response.json() | |
product.terms = data["terms"] | |
product.suggestions = data["searchOverlay"]["suggestions"] | |
product.tldr = data["comparison"]["tldr"][0] | |
product.propGroups = data["comparison"]["propGroups"] | |
product.notApplicableProps = data["comparison"]["notApplicableProps"] | |
product.cheapAlternatives = data["comparison"]["cheapAlternatives"] | |
product.topProps = data["comparison"]["topProps"] | |
product.popularCompare = data["comparison"]["popular"] | |
product.toplist = data["comparison"]["toplist"] | |
print(count," : ",product.name) | |
except: | |
print("Error : ",product.name) | |
else: | |
print("Already Done : ",product.name) | |
import threading | |
def dataAdder(request): | |
products = Products.objects.order_by("name").all() | |
count = 0 | |
for i in range(0,len(products),5): | |
count += 1 | |
t1 = threading.Thread(target=threadFunc, args=(products[i],count)) | |
count += 1 | |
t2 = threading.Thread(target=threadFunc, args=(products[i+1],count)) | |
count += 1 | |
t3 = threading.Thread(target=threadFunc, args=(products[i+2],count)) | |
count += 1 | |
t4 = threading.Thread(target=threadFunc, args=(products[i+3],count)) | |
count += 1 | |
t5 = threading.Thread(target=threadFunc, args=(products[i+4],count)) | |
t1.start() | |
t2.start() | |
t3.start() | |
t4.start() | |
t5.start() | |
t1.join() | |
t2.join() | |
t3.join() | |
t4.join() | |
t5.join() | |
if count > 14400: | |
products[i].save() | |
products[i+1].save() | |
products[i+2].save() | |
products[i+3].save() | |
products[i+4].save() | |
return HttpResponse("Done") |