multiple added features including tokens
This commit is contained in:
@@ -11,21 +11,62 @@ import re
|
||||
from functools import partial
|
||||
import yaml
|
||||
import slugify
|
||||
|
||||
|
||||
from flask_mail import Mail,Message
|
||||
from zipfile import ZipFile
|
||||
from .token import TokenCollection
|
||||
from flask import request
|
||||
# Initialize application
|
||||
app = Flask(__name__)
|
||||
app.config['MAIL_SERVER']= "buran.htu.tuwien.ac.at"
|
||||
app.config['MAIL_DEFAULT_SENDER']="andis@fet.at"
|
||||
app.config['FREEZER_DESTINATION_IGNORE']=['*.zip',"intern"]
|
||||
mail=Mail(app)
|
||||
app.config["url_prefix"]=""
|
||||
app.logger.setLevel(logging.DEBUG)
|
||||
# Initialize FlatPages Index
|
||||
tokens = TokenCollection("tokens.yaml")
|
||||
|
||||
#msg = Message("Hello",
|
||||
# sender="andis@fet.at",
|
||||
# recipients=["andis@fet.at"])
|
||||
|
||||
#mail.send(msg)
|
||||
|
||||
|
||||
|
||||
lvas=[]
|
||||
studien={}
|
||||
#search the data directory for yaml files
|
||||
for base,_, files in os.walk("data"):
|
||||
for fn in files:
|
||||
if re.match(".*yaml$", fn):
|
||||
with open(os.path.join("data",fn),"r") as f:
|
||||
data=yaml.load(f.read(),yaml.Loader)
|
||||
studien[fn]=data
|
||||
|
||||
|
||||
with open(os.path.join("test.yaml"),"w") as f:
|
||||
f.write(yaml.dump(studien))
|
||||
|
||||
# create a lva list from the structure
|
||||
for studium, lvaliste in studien.items():
|
||||
for k,lva in lvaliste.items():
|
||||
if len(lva)>3:
|
||||
lvas+=[lva]
|
||||
|
||||
folders={}
|
||||
|
||||
with open(os.path.join("testlvaliste.yaml"),"w") as f:
|
||||
f.write(yaml.dump(lvas))
|
||||
# make folders compact in lva
|
||||
for lva in lvas:
|
||||
for l in lva["courses"]:
|
||||
if "folders" in l:
|
||||
for folder in l["folders"]:
|
||||
folders[folder["folder"]]= folder["folderpath"]
|
||||
|
||||
|
||||
lvas= [
|
||||
{"name": "LVA1"}
|
||||
]
|
||||
|
||||
with open("data/test.yaml","r") as f:
|
||||
lvas=yaml.load(f.read(),yaml.Loader)
|
||||
app.logger.info(lvas)
|
||||
app.logger.info('Initialize FET BSP Sammlung')
|
||||
|
||||
freezer = Freezer(app)
|
||||
@@ -41,16 +82,52 @@ def slug(string):
|
||||
def toyaml(obj):
|
||||
return yaml.dump(obj)
|
||||
|
||||
@page_blueprint.route('/sendmail.html')
|
||||
def send_a_mail():
|
||||
msg = Message("Hello",
|
||||
sender="andis@fet.at",
|
||||
recipients=["andis@fet.at"])
|
||||
app.logger.info(msg)
|
||||
mail.send(msg)
|
||||
return "Done", 200
|
||||
|
||||
#@page_blueprint.route('/<path:name>/',strict_slashes=False)
|
||||
@page_blueprint.route('/')
|
||||
#@csp_header()
|
||||
def index():
|
||||
return render_template("lva_liste.html", lvas=lvas)
|
||||
return render_template("lva_liste.html", lvas=lvas,zip=False)
|
||||
|
||||
@page_blueprint.route('/intern/zips.html')
|
||||
def indexzips():
|
||||
return render_template("lva_liste.html", lvas=lvas,zip=True)
|
||||
|
||||
@page_blueprint.route('intern/createtoken.html')
|
||||
def createtoken():
|
||||
t=tokens.create()
|
||||
return render_template("lva_liste.html", lvas=lvas,zip=True, token=t)
|
||||
|
||||
|
||||
@page_blueprint.route('intern/zips//<name>.zip')
|
||||
def files(name):
|
||||
|
||||
token = request.args.get('token')
|
||||
# create a ZipFile objec
|
||||
if not name in folders:
|
||||
app.log.error("Not found %s" % name)
|
||||
return "NotFound",404
|
||||
if not tokens.is_valid(token):
|
||||
return "Restricted",401
|
||||
|
||||
with ZipFile("zips/%s.zip" % name, 'w') as zipObj:
|
||||
# Iterate over all the files in directory
|
||||
for folderName, subfolders, filenames in os.walk(folders[name]):
|
||||
for filename in filenames:
|
||||
#create complete filepath of file in directory
|
||||
filePath = os.path.join(folderName, filename)
|
||||
# Add file to zip
|
||||
zipObj.write(filePath, os.path.basename(filePath))
|
||||
return send_from_directory(os.path.abspath("zips"), "%s.zip" % name)
|
||||
|
||||
|
||||
|
||||
|
||||
@api_blueprint.route('/index.json',strict_slashes=False)
|
||||
def api_index(name='index'):
|
||||
return jsonify(page={}), 200, {'Content-Type': 'application/json; charset=utf-8'}
|
||||
|
||||
41
flaskapp/token.py
Normal file
41
flaskapp/token.py
Normal file
@@ -0,0 +1,41 @@
|
||||
import uuid
|
||||
from collections.abc import Mapping
|
||||
import datetime
|
||||
import yaml
|
||||
class TokenCollection(Mapping):
|
||||
def __init__(self, filename: str):
|
||||
self.filename=filename
|
||||
with open(filename,"r") as f:
|
||||
self.d=yaml.load(f.read(),yaml.Loader)
|
||||
if self.d is None:
|
||||
self.d=dict()
|
||||
|
||||
def save(self):
|
||||
with open(self.filename,"w") as f:
|
||||
f.write(yaml.dump(self.d))
|
||||
def __getitem__(self,key):
|
||||
return d[key]
|
||||
|
||||
def is_valid(self, token, days=1):
|
||||
if not token in self.d:
|
||||
return False
|
||||
#return self.d[token]["created"] + datetime.timedelta(days=days)
|
||||
#print(self.d[token]["created"] + datetime.timedelta(days=days))
|
||||
if self.d[token]["created"] + datetime.timedelta(days=days) > datetime.datetime.now():
|
||||
return True
|
||||
return False
|
||||
|
||||
def create(self, created_by="Anonym"):
|
||||
t=uuid.uuid4()
|
||||
self.d[str(t)]={
|
||||
"created": datetime.datetime.now(),
|
||||
"createdby": created_by
|
||||
}
|
||||
self.save()
|
||||
return str(t)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.d)
|
||||
|
||||
def __len__(self):
|
||||
return len(self.d)
|
||||
Reference in New Issue
Block a user