#!/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()