summaryrefslogtreecommitdiff
path: root/hemiptera_html.py
diff options
context:
space:
mode:
Diffstat (limited to 'hemiptera_html.py')
-rw-r--r--hemiptera_html.py117
1 files changed, 117 insertions, 0 deletions
diff --git a/hemiptera_html.py b/hemiptera_html.py
new file mode 100644
index 0000000..6596c13
--- /dev/null
+++ b/hemiptera_html.py
@@ -0,0 +1,117 @@
+#!/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.count = len(os.listdir(opj(basedir, "projects", i))) -1
+ projects.append(k)
+ bugs =[]
+ os.makedirs(opj(export, i), exist_ok=True)
+ devs = get_devs(i)
+ 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)
+ 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 k in r :
+ f = open(k, "rb")
+ m = BytesParser(policy=policy.default).parse(f)
+ m["Avatar"] = generate_avatar(m["From"])
+ replies.append(m)
+ b.created = replies[0]["Date"]
+ 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))
+ f.close()
+ 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()