diff options
Diffstat (limited to 'maconomy')
-rw-r--r-- | maconomy/models.py | 9 | ||||
-rw-r--r-- | maconomy/templates.py | 54 | ||||
-rw-r--r-- | maconomy/utils.py | 15 |
3 files changed, 57 insertions, 21 deletions
diff --git a/maconomy/models.py b/maconomy/models.py index f878172..7f4fcd4 100644 --- a/maconomy/models.py +++ b/maconomy/models.py @@ -38,5 +38,14 @@ class Timesheet: return self.approved == 1 def __str__(self): return self.__unicode__() + def status_summary(self): + status = u"[OK]" + if self.is_missing(): + status = u"[Missing]" + elif not self.is_submitted(): + status = u"[Unsubmitted]" + elif not self.is_approved(): + status = u"[Not approved]" + return u"{} {}".format(status, self.employee) def __unicode__(self): u"{} ({})".format(self.week, self.status) diff --git a/maconomy/templates.py b/maconomy/templates.py index 05c3319..80cafbb 100644 --- a/maconomy/templates.py +++ b/maconomy/templates.py @@ -1,4 +1,5 @@ from string import Template +from maconomy import utils class BaseTemplate(object): def __init__(self, template_file): @@ -12,6 +13,9 @@ class BaseTemplate(object): template_base = f.read() self.template = Template(template_base) + def tag(self, tag, content): + return u"<{tag}>{content}</{tag}>".format(tag=tag, content=content) + class UnsubmittedEmailTemplate(BaseTemplate): def __init__(self): @@ -30,38 +34,46 @@ class MissingEmailTemplate(BaseTemplate): class ManagerEmailTemplate(BaseTemplate): def __init__(self): self.set_template("templates/manager.html") - self.status_template = EmployeeStatusTemplate() + self.status_template = EmployeeStatusListTemplate() def build(self, timesheets, maconomyurl): statuslist = self.build_statuslist(timesheets) return self.template.substitute(statuslist=statuslist,maconomyurl=maconomyurl, amount=len(timesheets)) def build_statuslist(self, timesheets): - statuslist = [self.status_template.build(timesheet) for timesheet in timesheets] - return "\n".join(statuslist) - -class EmployeeStatusTemplate(BaseTemplate): - def __init__(self, include_approver=False): - self.set_template("templates/_employee_status.html") - self.include_approver = include_approver + result = u"" + unfinished = [timesheet for timesheet in timesheets if not timesheet.is_submitted()] + #Sort to get unsubmitted last + unfinished.sort(key=lambda t: t.status_summary()) + if unfinished: + result += self.tag("h4","Unfinished:")+u"\n{}".format(self.status_template.build(unfinished)) + + notapproved = set(timesheets) - set(unfinished) + if notapproved: + result += self.tag("h4", "For approval:") + u"\n{}".format(self.status_template.build(notapproved)) + return result + +class EmployeeStatusListTemplate(BaseTemplate): + def __init__(self): + pass + def build(self, timesheets): + statuslist = u"\n".join([self.status_summary(t) for t in timesheets]) + return self.tag("ul", statuslist) if statuslist else "" - def build(self, timesheet): - employee = timesheet.employee - submitted = '' if timesheet.is_submitted() else 'not' - approver = timesheet.approver if self.include_approver else 'you' - approved = '' if timesheet.is_approved() else 'not' - return self.template.substitute(employee=employee.__unicode__(), submitted=submitted, approved=approved, approver=approver) + def status_summary(self, timesheet): + content = u"{}".format(timesheet.status_summary()) + return self.tag("li", content) class CEOEmailTemplate(BaseTemplate): def __init__(self): self.set_template("templates/ceo.html") - self.status_template = EmployeeStatusTemplate(include_approver=True) + self.status_template = EmployeeStatusListTemplate() def build(self, timesheets): - statuslist = self.build_statuslist(timesheets) + per_manager = utils.per_manager(timesheets) + statuslist = u"" + for manager_id, relevant_timesheets in per_manager.items(): + relevant_timesheets.sort(key=lambda t: t.status_summary()) + statuslist += self.tag("h4", u"Status for {} employees:".format(manager_id)) + statuslist += self.status_template.build(relevant_timesheets) return self.template.substitute(statuslist=statuslist) - - def build_statuslist(self, timesheets): - statuslist = [self.status_template.build(timesheet) for timesheet in timesheets] - return "\n".join(statuslist) - diff --git a/maconomy/utils.py b/maconomy/utils.py new file mode 100644 index 0000000..e22239b --- /dev/null +++ b/maconomy/utils.py @@ -0,0 +1,15 @@ +from collections import defaultdict + +def per_manager(timesheets): + per_manager = defaultdict(list) + # filter timesheets per manager + for timesheet in [t for t in timesheets if need_manager_mail(t)]: + manager_id = timesheet.approver + per_manager[manager_id].append(timesheet) + return per_manager + +def need_manager_mail(timesheet): + return not timesheet.is_submitted() or not timesheet.is_approved() + +def employees(timesheets): + return dict([(t.employee.id, t.employee) for t in timesheets]) |