summaryrefslogtreecommitdiff
path: root/maconomy
diff options
context:
space:
mode:
Diffstat (limited to 'maconomy')
-rw-r--r--maconomy/models.py9
-rw-r--r--maconomy/templates.py54
-rw-r--r--maconomy/utils.py15
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])