PushingScores/contextualise.py

331 lines
10 KiB
Python

from flask import Flask, Response, url_for, render_template, Markup, jsonify, redirect, request, flash, session, make_response
from config import Config
import json
import os
import datetime as dt
from datetime import datetime
from pprint import pprint
import re
from PIL import Image, ImageDraw, ImageFont
import numpy as np
from itertools import zip_longest
app = Flask(__name__, static_url_path='', static_folder="static", template_folder="templates")
app.jinja_env.add_extension('jinja2.ext.loopcontrols')
app.config.from_object(Config)
######################################################################################
# SETTING THE VARIABLES
######################################################################################
# setting variables for holding paths, folder names and the one file for description
path = "/static/files/"
jsonfiles = [] #json files
fullpathjsonfiles = [] #fullpath for some situations
listingfiles= [] #fullpaths
listingdirectories = [] #paths
thefile = None #selected file for description
positioninarray = 8 #counter
listofdicts=[] #to be able to import and use json content
datafromjson = []
#test getting json file from id
id = "17"
jsonfilefordescription = "files/"+id+"/"+id+".json"
#arrays with the user path of words and numbers
pathofwords = []
pathofnumbers = []
#VARS FOR THE SESSIONS
app.secret_key = 'your secret'
app.config['SESSION_TYPE'] = 'filesystem'
session = {}
session['wordpath'] = []
session['clicktime'] = []
session['id'] = []
session['veryfirstnow'] = None
#VARS FOR THE SCORES
wordpath = []
idlist = []
timelist = []
timelistforoperations = []
# preparing the index.json file for the navbar
index_dict = {}
######################################################################################
#SOME JSON AND WALK OS REALTED THINGIES
######################################################################################
#reading wordlist.json
with open('wordlist.json', 'r', encoding='utf8') as f:
wordlist_dict = json.load(f)
#listing paths and files, not in order but well...
# for path, subdirs, files in os.walk(path):
# for name in files:
# if not name.endswith(".json") and not name.endswith(".DS_Store"):
# fullpath = os.path.join(path, name)
# listingdirectories.append(path)
# listingfiles.append(fullpath[7:]) #fullpaths minus static/
#
# if name.endswith(".json"):
# fullpath = os.path.join(path, name)
# jsonfiles.append(fullpath[7:])
#listing the json paths simultaneously generating a new index.json for the navbar
for path, subdirs, files in os.walk('./static/files/'):
for name in files:
if name.endswith(".json"):
fullpath = os.path.join(path, name)
jsonfiles.append(fullpath[8:])
fullpathjsonfiles.append(fullpath)
with open (fullpath) as f:
temp_dict = json.load(f)
index_dict[temp_dict["id"]] = temp_dict["title"]
# with open("static/"+jsonfiles[4], 'r') as f:
# data_dict = json.load(f)
# datafromjson = data_dict["files"]
######################################################################################
#NOW THE REAL DEAL
######################################################################################
@app.route("/")
def home():
sessionid = "current_user.id"
#add the very first time of connection to the interface
if session['veryfirstnow'] is None :
session['veryfirstnow'] = datetime.now()
return render_template('home.html', wordlist_dict=wordlist_dict)
def functionsession():
return(session)
# THIS IS NOT WORKING YET DUNNO WHY
@app.context_processor
def context_processor():
functionsession = session['wordpath']
return dict(functionsession=functionsession)
@app.route('/about/')
def about():
if session['veryfirstnow'] is None :
session['veryfirstnow'] = datetime.now()
return render_template('about.html')
# @app.route('/all/')
# def all():
# thefile = listingfiles[positioninarray]
# counter2=0
# return render_template('all.html', file=thefile, listingfiles=listingfiles, jsonfiles=jsonfiles, listofdicts=listofdicts, counter2=counter2)
@app.route('/description')
def description():
if session['veryfirstnow'] is None :
session['veryfirstnow'] = datetime.now()
idno=request.args.get('id')
jsonfilefordescription = "files/"+idno+"/"+idno+".json"
with open("static/"+jsonfilefordescription, 'r') as f:
data_dict = json.load(f)
datafromjson = data_dict["files"]
#open json file, list filepaths in array and loop with thefile
textfile=""
textfiles=[]
with open("static/"+jsonfilefordescription, 'r') as f:
data_dict = json.load(f)
datafromjson = data_dict["files"]
itemid = data_dict["id"]
session["id"].append(itemid)
for file in datafromjson:
if file.lower().endswith(('.html')):
with open("static/"+file,"r", encoding='utf-8') as f:
textfile = f.read()
textfile = Markup(textfile)
textfiles.append(textfile)
return render_template('description.html', datafromjson=datafromjson, itemid=itemid, textfiles=textfiles, idno=idno, index_dict=index_dict)
@app.route('/diverge', methods=['GET'])
def diverge():
if session['veryfirstnow'] is None :
session['veryfirstnow'] = datetime.now()
searchterm=request.args.get('search')
now = datetime.now() #description time
session['wordpath'].append(searchterm)
session['clicktime'].append(now)
return render_template('diverge.html', wordlist_dict=wordlist_dict, searchterm=searchterm, index_dict=index_dict)
# @app.route('/listofwords')
# def listofwords():
# # r = jsonify(session)
# r = str(session)
# r0w = session["wordpath"][0]
# r0c = session["clicktime"][0]
# r0id = session["id"][0]
# return render_template('listofwords.html', r=r, r0c=r0c, r0w=r0w, r0id=r0id)
######################################################################################
#THE SCORE STUFF
######################################################################################
### Add : if score is empty then add some sentence like "your score is empty"
### to be printed to the text document
@app.route("/get-file")
def get_file():
if session['veryfirstnow'] is None :
session['veryfirstnow'] = datetime.now()
fullscore = None
wordpath = session["wordpath"]
idlist = session["id"]
timelist = session["clicktime"]
veryfirstnow = session['veryfirstnow']
clickongetfiletime = datetime.now()
tadam = None
initialtime = None
if not (timelist[0] is None):
thetime = timelist[0]
thetime = str(thetime)
thetime = dt.datetime.strptime(thetime, '%Y-%m-%d %H:%M:%S.%f')
initialtime = thetime - veryfirstnow
initialtime = initialtime.total_seconds()
initialtime = int(initialtime)
initialtime = "."*initialtime
print(initialtime)
for t in timelist :
t = str(t)
yo = dt.datetime.strptime(t, '%Y-%m-%d %H:%M:%S.%f')
timelistforoperations.append(yo)
prev = None
wholestringy = None
# print("veryfirstnow : "+str(veryfirstnow)+"\n")
print(wordpath)
print(timelistforoperations)
print(idlist)
for (word, time) in zip(wordpath,timelistforoperations):
# for (word, time, uniqueid) in zip(wordpath,timelistforoperations, idlist):
# print("word : "+word+"\n")
# print("timeofclick : "+str(time)+"\n")
# print("============")
# print(wordpath)
# print("============")
# filler = int(uniqueid)
upperword = word.upper()
#get previous time for substraction
if not (prev is None):
difftime = time - prev
difftime = difftime.total_seconds()
difftime = int(difftime)
# print(difftime)
else:
yo = str(veryfirstnow)
yoyo = dt.datetime.strptime(yo, '%Y-%m-%d %H:%M:%S.%f')
difftime = time - yoyo
difftime = difftime.total_seconds()
difftime = int(difftime)
test = difftime
prev = time
diffpattern = test * '.'
stringy = diffpattern + upperword
if not (wholestringy is None):
wholestringy = wholestringy+stringy
fullscore = wholestringy
else:
wholestringy = upperword
fullscore = wholestringy
# #If fullscore length superior 60 characters, insert linebreak
# # Defining splitting point
# n = 60
# # Using list comprehension
# out = [(fullscore[i:i+n]) for i in range(0, len(fullscore), n)]
# #joining the strings with linebreaks
# tadam = '\n'.join(out)
if not (fullscore is None):
# outside of the loop calculate seconds from "clickongetfiletime" minus the last "time" from the loop
lastdifftime = clickongetfiletime - prev
lastdifftime = lastdifftime.total_seconds()
lastdifftime = int(lastdifftime)
lastdifftime = lastdifftime * '.'
#the 60 seconds thing
# print(lastdifftime+"\n")
fullscore = initialtime+fullscore+lastdifftime
# Defining splitting point
n = 60
# Using list comprehension
out = [(fullscore[i:i+n]) for i in range(0, len(fullscore), n)]
#joining the strings with linebreaks
tadam = '\n'.join(out)
# have a message in file if no nav has been recorded so it's less dull than error page
if tadam is None:
tadam = "This score is Null"
# print("verylastnow : "+str(clickongetfilefime)+"\n")
uniquename = str(clickongetfiletime)
with open('scores/'+uniquename+'.txt', 'a+') as f:
f.write(tadam)
print(tadam)
return Response(tadam,
mimetype="text/plain",
headers={"Content-Disposition":
"attachment;filename=yourveryspecialscore.txt"})
######################################################################################
#INDEX PAGE
######################################################################################
@app.route("/index")
def index():
return render_template('theindex.html', wordlist_dict=wordlist_dict, index_dict=index_dict)
if __name__ == '__main__':
app.run(debug=True)