#!/usr/bin/python
## HTML exporter for hemiptera
from hemiptera_common import *
import glob
from email.utils import parsedate_tz, mktime_tz, formatdate, parsedate_to_datetime
from jinja2 import Environment, FileSystemLoader
templatedir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates")
file_loader = FileSystemLoader(templatedir)
env = Environment(loader=file_loader)
template = env.get_template("main_page.html")
buglist = env.get_template("buglist.html")
bugt = env.get_template("bug.html")
from hemiptera_avatar_gen import generate_avatar
export = opj(basedir, "export")
## TODO: Choose template system, create nice template
class Project() :
pass
class Bug() :
pass
### https://stackoverflow.com/questions/410221/natural-relative-days-in-python
import datetime
def prettydate(d):
if not d.tzname() :
d = d.replace(tzinfo=datetime.timezone.utc)
diff = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc) - d
s = diff.seconds
if diff.days > 7 or diff.days < 0:
return d.strftime('%Y-%m-%d')
elif diff.days == 1:
return '1 day ago'
elif diff.days > 1:
return '{} days ago'.format(diff.days)
elif s <= 1:
return 'just now'
elif s < 60:
return '{} seconds ago'.format(s)
elif s < 120:
return '1 minute ago'
elif s < 3600:
return '{} minutes ago'.format(s//60)
elif s < 7200:
return '1 hour ago'
else:
return '{} hours ago'.format(s//3600)
def create_project_list() :
projects = []
for i in os.listdir(opj(basedir, "projects")) :
k = Project()
k.name = i
k.desc = ""
if os.path.exists(opj(basedir, "projects", i, "description.txt")) :
k.desc = open(opj(basedir, "projects", i, "description.txt"), "r").read()
projects.append(k)
bugs =[]
k.bugs = bugs
os.makedirs(opj(export, i), exist_ok=True)
devs = get_devs(i)
dev_avatars = [ generate_avatar(i) for i in devs ]
for j in glob.glob(opj(basedir, "projects", i, "[0-9]*")) :
b = Bug()
b.closed = os.path.exists(opj(j, "closed"))
if b.closed :
b.closeddate = open(opj(j,"closed"), "r").read()
b.id = os.path.basename(j)
r = glob.glob(opj(j, "[0-9]*"))
r.sort()
b.replies = len(r)-1
f = open(r[0], "rb")
m = BytesParser(policy=policy.default).parse(f)
b.subject = m["Subject"]
if not b.subject :
b.subject = "No subject"
bugs.append(b)
replies = []
for l in r :
f = open(l, "rb")
m = BytesParser(policy=policy.default).parse(f)
m["Avatar"] = generate_avatar(m["From"])
replies.append(m)
b.created = replies[0]["Date"]
b.avatar = replies[0]["Avatar"]
if b.created :
b.nicecreated = prettydate(parsedate_to_datetime(b.created))
else :
b.nicecreated = "unknown"
b.last_reply = replies[-1]["Date"]
if b.last_reply :
b.nicereply = prettydate(parsedate_to_datetime(b.last_reply))
else :
b.nicereply = "unknown"
f = open(opj(export, i, str(b.id)+".html"), "w")
f.write(bugt.render(DOMAIN=DOMAIN, replies=replies, prname=i, bug=b, devs=devs))
bugs.sort(key=lambda b: int(b.id), reverse=True)
bugs.sort(key=lambda b: int(b.closed))
f = open(opj(export, i, "index.html"), "w")
f.write(buglist.render(DOMAIN=DOMAIN, bugs=bugs, prname=i, dev_avatars=dev_avatars, desc=k.desc))
f.close()
k.count = len(k.bugs)
k.opencount = len([ i for i in k.bugs if not i.closed ])
f = open(opj(export, "index.html"), "w")
f.write(template.render(DOMAIN=DOMAIN, projects=projects))
## Create the project list
def create_buglist(project) :
## Create bug list for project
pass
def show_bug(bug_nr):
## Display all the replies to bug with number bug_nr
pass
if __name__ == "__main__" :
create_project_list()