from maconomy import cli, create_db, TimeRegistrationRepository, Mailer from maconomy.views import EmployeeEmailView, ManagerEmailView, CEOEmailView from maconomy import utils from collections import defaultdict def main(config, options): db = create_db(config) timereg_repo = TimeRegistrationRepository(db) timesheets = timereg_repo.all_active() mailer = Mailer(config) if not options.dry else None if options.manager: manager(timesheets, config, mailer) elif options.ceo: ceo(timesheets, config, mailer) elif options.summary: summary(timesheets) else: normal(timesheets, config, mailer) # Close stuff if mailer: mailer.close() timereg_repo.close() db.close() def normal(timesheets, config, mailer): view = EmployeeEmailView(config) for timesheet in timesheets: if not timesheet.is_submitted(): mail = view.render(timesheet) subject = u"Timesheet reminder for {}".format(timesheet.employee) to = timesheet.employee.email if mailer: if to and to.strip(): mailer.send(to, subject, mail) else: print u"No email for: {}".format(timesheet.employee) else: print subject print mail def manager(timesheets, config, mailer): view = ManagerEmailView(config) # extract employees for manager email lookup employees = utils.employees(timesheets) per_manager = utils.per_manager(timesheets) # send mails to managers for manager_id, relevant_timesheets in per_manager.items(): mail = view.render(relevant_timesheets) subject = "Warning: Timesheets overdue for {} employees".format(len(relevant_timesheets)) manager = employees.get(manager_id) to = manager.email if manager else None if mailer: mailer.send(to, subject, mail) else: print "TO: {}".format(to) print subject print mail def ceo(timesheets, config, mailer): to = config.get("mail", "ceo") # Filter only "bad" entries relevant = [t for t in timesheets if not t.is_done()] view = CEOEmailView() mail = view.render(relevant) subject = "Warning: Timesheet overdue for {} employees".format(len(relevant)) if mailer: mailer.send(to, subject, mail) else: print mail def summary(timesheets): affected = [t for t in timesheets if not t.is_done()] for timesheet in affected: print timesheet.status_summary() print "Number of overdue timesheets: {}".format(len(affected)) if __name__ == '__main__': args = cli.parse() config = cli.load_config(args.config) main(config, args)