IDDRS/App/views.py
2022-07-25 12:03:35 +02:00

179 lines
6.2 KiB
Python

from django.shortcuts import render
from .forms import searchForm
from pathlib import Path
import os
import pandas as pd
from .similarity import phrase_preprocessing, similarityCheck
from .tfidfSimilarity import cosine_similarity
from django.core.paginator import Paginator
from.models import Standards, Level, SearchResults
from .filters import StandardsFilter
import uuid
from datetime import date, timedelta
from django_pandas.io import read_frame
from django.template.loader import render_to_string
from weasyprint import HTML
import tempfile
# Create your views here.
def home(request):
levels = list(range(1, 7))
BASE_DIR = Path(__file__).resolve().parent.parent
path = os.path.join(BASE_DIR, 'static/IDDRSStandards/')
df = pd.DataFrame(columns=["Level","FileNumber","FileName","Summary","FilePath"])
all_standards = Standards.objects.all()
i = 0
# list_of_standardas = []
for level in os.listdir(path):
for file in os.listdir(path+'/'+level):
df.loc[i, 'Level'] = level
df.loc[i, 'FileName'] = file
i+= 1
args = {'all_standards': all_standards,'navbar': 'home','levels':levels}
return render(request, 'App/home.html', args)
def how_to(request):
return render(request, 'App/how_to.html', {'navbar': 'how_to'})
def search(request):
BASE_DIR = Path(__file__).resolve().parent.parent
preprocessedData = pd.read_json(os.path.join(BASE_DIR, 'App/static/json/processedIDDRS.json'))
phrase = ''
results = []
if request.method == 'POST':
form = searchForm(request.POST)
if form.is_valid():
phrase = form.cleaned_data["phrase"]
preprocessedPhrase = phrase_preprocessing(phrase)
results = similarityCheck(preprocessedData, preprocessedPhrase)
else:
form = searchForm()
args = {'form': form, 'phrase': phrase, 'navbar': 'search', 'results':results}
return render(request, 'search.html', args)
def faq(request):
return render(request, 'App/faq.html', {'navbar': 'faq'})
def contact(request):
return render(request, 'App/contact.html', {'navbar': 'contact'})
# def pdf(request):
# return render(request, 'pdf-outut.html', {'navbar': 'pdf'})
def tfidf(request):
SearchResults.objects.filter(session_expiry_date=date.today()).delete()
searchResults = []
results = []
categories = Level.objects.all()
standards = Standards.objects.all()
myFilter = StandardsFilter()
selectedChoices = request.GET.getlist('title','')
phrase = request.GET.get('phrase','')
excelFile = ''
pdfFile = ''
if request.method == 'GET':
form = searchForm(request.GET)
if form.is_valid() or 'searchedPhrase' in request.GET :
if 'searchedPhrase' in request.GET:
phrase = request.GET.get('searchedPhrase')
else:
phrase = form.cleaned_data["phrase"]
searchResults = cosine_similarity(30, phrase)
uid = str(uuid.uuid1())[:8]+phrase
for result in searchResults:
searchedData = SearchResults(
session_key = request.session.session_key,
uniqueID = uid,
session_expiry_date = date.today() + timedelta(days=1),
index = result['Index'],
level = result['Level'],
levelName = result['LevelName'],
title = result['Title'],
paragraph = result['Paragraph'],
color = result['Color'],
module = result['Module'],
heading1 = result['Heading1'],
heading2 = result['Heading2'],
heading3 = result['Heading3'],
heading4 = result['Heading4'],
pageNumber = result['PageNum'],
sentence = result['Sentence']
)
searchedData.save()
results = SearchResults.objects.filter(uniqueID=uid)
excelFile = createExcel(results, phrase)
pdfFile = createPDF(results, phrase)
createPDF(results, phrase)
if selectedChoices:
results = SearchResults.objects.filter(uniqueID=uid)
myFilter = StandardsFilter(request.GET, queryset=results)
results = myFilter.qs
excelFile = createExcel(results, phrase)
pdfFile = createPDF(results, phrase)
else:
form = searchForm()
# Create pagination for results
paginator = Paginator(results, per_page=10)
pageNumber = request.GET.get('page', 1)
page_obj = paginator.get_page(pageNumber)
args = {'form': form, 'phrase': phrase, 'navbar': 'tfidf',
'results':page_obj.object_list, 'levels':categories, 'myFilter':myFilter,
'standards':standards, 'selectedChoices':selectedChoices,
'pages':paginator, 'pNumber':int(pageNumber), 'excelFile':excelFile,'pdfFile':pdfFile}
return render(request, 'App/tfidf.html', args)
# This function export the list of results to excel file
def createExcel(results, phrase):
df = read_frame(results)
df = df.drop(columns=['id','session_key','uniqueID','session_expiry_date','index','level','title','color','heading2','heading3','heading4','sentence'])
df = df[['levelName','module','heading1','pageNumber','paragraph']]
df.columns = ['Level', 'IDDRS', 'Title', 'Page', 'Paragraph']
BASE_DIR = Path(__file__).resolve().parent.parent
fileName = phrase+'.xlsx'
# creating excel writer object
writer = pd.ExcelWriter(os.path.join(BASE_DIR, 'static/usersResults/'+fileName))
# write dataframe to excel
df.to_excel(writer,sheet_name='IDDRS')
# save the excel
writer.save()
return(fileName)
def createPDF(results, phrase):
BASE_DIR = Path(__file__).resolve().parent.parent
html_String = render_to_string(os.path.join(BASE_DIR, 'templates/App/pdf-output.html'), {'results':results, 'phrase':phrase})
html = HTML(string = html_String)
fileName = phrase+'.pdf'
html.write_pdf(os.path.join(BASE_DIR, 'static/usersResults/'+fileName))
return fileName