def setUpClass(self): create_users(self) self.ot_entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today(), start_time=datetime.time(0, 0, 0), end_time=datetime.time(17, 0, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) self.pending_entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=123), start_time=datetime.time(9, 0, 0), end_time=datetime.time(17, 0, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) self.entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=1), start_time=datetime.time(9, 0, 0), end_time=datetime.time(16, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) self.ot_entry.full_clean() self.ot_entry.save() self.entry.full_clean() self.entry.save()
def testDoubleClose(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=3), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) try: # we may be running with a default implementation which # doesn't sent e-mails. from timetracker.tracker.notifications import ( send_overtime_notification, send_pending_overtime_notification, send_undertime_notification) except: return pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1) pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1)
def download_all_holiday_data(request, who=None): # pragma: no cover '''Endpoint which creates a CSV file for all holiday data for a single employee. :param who: The ID of the person the report should be generated for if the user is not in the span of control for the administrator then no report will be generated.''' if not who: raise Http404 auth_user = Tbluser.objects.get(id=request.session.get("user_id")) try: target_user = auth_user.get_subordinates().get(id=who) except Tbluser.DoesNotExist: raise Http404 buf = StringIO() buf.write("\xef\xbb\xbf") csvfile = UnicodeWriter(buf) csvfile.writerow(TrackingEntry.headings()) for entry in TrackingEntry.objects.filter(user_id=who): csvfile.writerow(entry.display_as_csv()) response = HttpResponse(buf.getvalue(), mimetype="text/csv") response['Content-Disposition'] = \ 'attachment;filename=AllHolidayData_%s.csv' % target_user.id return response
def testHolidayBalanceDecrement(self): ''' Test for the return decrement total works ''' for day in (("1", "RETRN"), ("2", "RETRN"), ("3", "RETRN")): entry = TrackingEntry( entry_date="2012-01-%s" % day[0], user_id=self.linked_user.id, start_time="00:00:00", end_time="00:00:00", breaks="00:00:00", daytype=day[1], ) entry.save() self.assertEquals(self.linked_user.get_holiday_balance(2012), 17)
def testHolidayBalanceAdd(self): ''' Test for the holiday additional total works ''' for day in (("1", "PUWRK"), ("2", "PUWRK"), ("3", "PUWRK")): entry = TrackingEntry( entry_date="2012-01-%s" % day[0], user_id=self.linked_user.id, start_time="00:00:00", end_time="00:00:00", breaks="00:00:00", daytype=day[1], ) entry.save() self.assertEquals(self.linked_user.get_holiday_balance(2012), 26)
def testHolidayBalanceMix(self): ''' Test to make sure that the holiday balance calculates correctly ''' for day in (("1", "HOLIS"), ("2", "PUWRK"), ("3", "RETRN")): entry = TrackingEntry( entry_date="2012-01-%s" % day[0], user_id=self.linked_user.id, start_time="00:00:00", end_time="00:00:00", breaks="00:00:00", daytype=day[1], ) entry.save() self.assertEquals(self.linked_user.get_holiday_balance(2012), 20)
def download_all_holiday_data(request, who=None): '''Endpoint which creates a CSV file for all holiday data for a single employee. :param who: The ID of the person the report should be generated for if the user is not in the span of control for the administrator then no report will be generated.''' if not who: raise Http404 auth_user = Tbluser.objects.get(id=request.session.get("user_id")) try: target_user = auth_user.get_subordinates().get(id=who) except Tbluser.DoesNotExist: raise Http404 buf = StringIO() buf.write("\xef\xbb\xbf") csvfile = UnicodeWriter(buf) csvfile.writerow(TrackingEntry.headings()) for entry in TrackingEntry.objects.filter(user_id=who): csvfile.writerow(entry.display_as_csv()) response = HttpResponse(buf.getvalue(), mimetype="text/csv") response['Content-Disposition'] = \ 'attachment;filename=AllHolidayData_%s.csv' % target_user.id return response
def testTimeDifferenceZero(self): '''Tests an entry against several rules to make sure our check for whether an entry is or is not overtime is correctly working.''' for date, end in [ ["2012-01-11", "16:45"], ]: entry = TrackingEntry( entry_date=date, user_id=self.linked_user.id, start_time="09:00", end_time=end, breaks="00:15", daytype="WKDAY" ) entry.full_clean() self.assertTrue(entry.time_difference() == 0)
def testDoubleClose(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=3), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) try: # we may be running with a default implementation which # doesn't sent e-mails. from timetracker.tracker.notifications import ( send_overtime_notification, send_pending_overtime_notification, send_undertime_notification ) except: return pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1) pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1)
def testIsOvertime(self): '''Tests an entry against several rules to make sure our check for whether an entry is or is not overtime is correctly working.''' for date, end in [ ["2012-01-06", "18:01"], ["2012-01-07", "19:00"], ]: entry = TrackingEntry( entry_date=date, user_id=self.linked_user.id, start_time="09:00", end_time=end, breaks="00:15", daytype="WKDAY" ) entry.full_clean() self.assertTrue(entry.is_overtime())
def testIsHolidayRequest(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=5), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) self.assertEqual(pending.is_holiday_request(), True)
def testTLDeny(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=6), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) pending.tl_close(False) self.assertEqual(len(mail.outbox), 1)
def testIsHolidayRequest(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=5), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) self.assertEqual(pending.is_holiday_request(), True)
def all_team(request, year=None, month=None, team=None): # pragma: no cover if not year or not month or not team: raise Http404 buf = StringIO() buf.write("\xef\xbb\xbf") csvfile = UnicodeWriter(buf) csvfile.writerow(TrackingEntry.headings()) for user in Tbluser.objects.filter(market=team): for entry in TrackingEntry.objects.filter( entry_date__year=year, entry_date__month=month, user_id=user.id): csvfile.writerow(entry.display_as_csv()) response = HttpResponse(buf.getvalue(), mimetype="text/csv") response['Content-Disposition'] = \ 'attachment;filename=AllHolidayData_%s_%s_%s.csv' % (year, month, team) return response
def testTLDeny(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=6), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) pending.tl_close(False) self.assertEqual(len(mail.outbox), 1)
def yearmonthhol(request, year=None, month=None): # pragma: no cover '''Endpoint which creates a CSV file for all holiday data within a specific month. :param year: The year for the report. :param month: The month for the report. :note: Both year and mont are required.''' auth_user = Tbluser.objects.get(id=request.session.get("user_id")) buf = StringIO() buf.write("\xef\xbb\xbf") csvfile = UnicodeWriter(buf) csvfile.writerow(TrackingEntry.headings()) for user in auth_user.get_subordinates(): for entry in TrackingEntry.objects.filter( entry_date__year=year, entry_date__month=month, user_id=user.id): csvfile.writerow(entry.display_as_csv()) response = HttpResponse(buf.getvalue(), mimetype="text/csv") response['Content-Disposition'] = \ 'attachment;filename=HolidayData_%s_%s.csv' % (year, month) return response
def yearmonthhol(request, year=None, month=None): '''Endpoint which creates a CSV file for all holiday data within a specific month. :param year: The year for the report. :param month: The month for the report. :note: Both year and mont are required.''' auth_user = Tbluser.objects.get(id=request.session.get("user_id")) buf = StringIO() buf.write("\xef\xbb\xbf") csvfile = UnicodeWriter(buf) csvfile.writerow(TrackingEntry.headings()) for user in auth_user.get_subordinates(): for entry in TrackingEntry.objects.filter( entry_date__year=year, entry_date__month=month, user_id=user.id): csvfile.writerow(entry.display_as_csv()) response = HttpResponse(buf.getvalue(), mimetype="text/csv") response['Content-Disposition'] = \ 'attachment;filename=HolidayData_%s_%s.csv' % (year, month) return response
class ApprovalTest(TestCase): @classmethod def setUpClass(self): create_users(self) self.ot_entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today(), start_time=datetime.time(0, 0, 0), end_time=datetime.time(17, 0, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) self.pending_entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=123), start_time=datetime.time(9, 0, 0), end_time=datetime.time(17, 0, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) self.entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=1), start_time=datetime.time(9, 0, 0), end_time=datetime.time(16, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) self.ot_entry.full_clean() self.ot_entry.save() self.entry.full_clean() self.entry.save() @classmethod def tearDownClass(self): delete_users(self) def testPendingApprovalDenied(self): self.doapprovaltest(False, "Request for Overtime: Denied.", 0) def testPendingApprovalApproved(self): try: # we may be running with a default implementation which # doesn't sent e-mails. from timetracker.tracker.notifications import ( send_overtime_notification, send_pending_overtime_notification, send_undertime_notification ) except: # pragma: no cover return self.doapprovaltest(True, "Your recent timetracker actions.", 1) @override_settings(UNDER_TIME_ENABLED={M: True for M in MARKET_CHOICES}) def doapprovaltest(self, status, message, attachments): approval = PendingApproval( entry=self.ot_entry, approver=self.linked_manager ) approval.save() approval.close(status) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, message) self.assertEqual(len(mail.outbox[0].attachments), attachments) def test_approvalonpendingtest(self): self.pending_entry.save() approval = PendingApproval( entry=self.pending_entry, approver=self.linked_manager ) approval.save() approval.close(True) self.assertEqual(approval.entry.daytype, "HOLIS") def testNoApprovalRequired(self): # pragma: no cover if not settings.SENDING_APPROVAL.get(self.linked_manager.market): return approval = PendingApproval( entry=self.entry, approver=self.linked_manager ) approval.inform_manager() self.assertEqual(len(mail.outbox), 0) def testApprovalRequired(self): # pragma: no cover if not settings.SENDING_APPROVAL.get(self.linked_manager.market): return approval = PendingApproval( entry=self.ot_entry, approver=self.linked_manager ) approval.inform_manager() self.assertEqual(len(mail.outbox), 1) def testSoftClose(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=2), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) pending.tl_close(True) self.assertEqual(pending.tl_approved, True) def testDoubleClose(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=3), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) try: # we may be running with a default implementation which # doesn't sent e-mails. from timetracker.tracker.notifications import ( send_overtime_notification, send_pending_overtime_notification, send_undertime_notification ) except: return pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1) pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1) def testDeniedClosedMail(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=4), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) pending.tl_close(False) self.assertEqual(len(mail.outbox), 1) def testIsHolidayRequest(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=5), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) self.assertEqual(pending.is_holiday_request(), True) def testTLDeny(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=6), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get( entry=entry ) pending.tl_close(False) self.assertEqual(len(mail.outbox), 1)
class ApprovalTest(TestCase): @classmethod def setUpClass(self): create_users(self) self.ot_entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today(), start_time=datetime.time(0, 0, 0), end_time=datetime.time(17, 0, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) self.pending_entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=123), start_time=datetime.time(9, 0, 0), end_time=datetime.time(17, 0, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) self.entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=1), start_time=datetime.time(9, 0, 0), end_time=datetime.time(16, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) self.ot_entry.full_clean() self.ot_entry.save() self.entry.full_clean() self.entry.save() @classmethod def tearDownClass(self): delete_users(self) def testPendingApprovalDenied(self): self.doapprovaltest(False, "Request for Overtime: Denied.", 0) def testPendingApprovalApproved(self): try: # we may be running with a default implementation which # doesn't sent e-mails. from timetracker.tracker.notifications import ( send_overtime_notification, send_pending_overtime_notification, send_undertime_notification) except: # pragma: no cover return self.doapprovaltest(True, "Your recent timetracker actions.", 1) @override_settings(UNDER_TIME_ENABLED={M: True for M in MARKET_CHOICES}) def doapprovaltest(self, status, message, attachments): approval = PendingApproval(entry=self.ot_entry, approver=self.linked_manager) approval.save() approval.close(status) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, message) self.assertEqual(len(mail.outbox[0].attachments), attachments) def test_approvalonpendingtest(self): self.pending_entry.save() approval = PendingApproval(entry=self.pending_entry, approver=self.linked_manager) approval.save() approval.close(True) self.assertEqual(approval.entry.daytype, "HOLIS") def testNoApprovalRequired(self): # pragma: no cover if not settings.SENDING_APPROVAL.get(self.linked_manager.market): return approval = PendingApproval(entry=self.entry, approver=self.linked_manager) approval.inform_manager() self.assertEqual(len(mail.outbox), 0) def testApprovalRequired(self): # pragma: no cover if not settings.SENDING_APPROVAL.get(self.linked_manager.market): return approval = PendingApproval(entry=self.ot_entry, approver=self.linked_manager) approval.inform_manager() self.assertEqual(len(mail.outbox), 1) def testSoftClose(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=2), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) pending.tl_close(True) self.assertEqual(pending.tl_approved, True) def testDoubleClose(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=3), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) try: # we may be running with a default implementation which # doesn't sent e-mails. from timetracker.tracker.notifications import ( send_overtime_notification, send_pending_overtime_notification, send_undertime_notification) except: return pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1) pending.tl_close(True) pending.close(True) self.assertEqual(len(mail.outbox), 1) def testDeniedClosedMail(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=4), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) pending.tl_close(False) self.assertEqual(len(mail.outbox), 1) def testIsHolidayRequest(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=5), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="PENDI", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) self.assertEqual(pending.is_holiday_request(), True) def testTLDeny(self): entry = TrackingEntry( user=self.linked_user, entry_date=datetime.datetime.today() + datetime.timedelta(days=6), start_time=datetime.time(9, 0, 0), end_time=datetime.time(20, 45, 0), breaks=datetime.time(0, 15, 0), daytype="WKDAY", ) entry.full_clean() entry.save() entry.create_approval_request() pending = PendingApproval.objects.get(entry=entry) pending.tl_close(False) self.assertEqual(len(mail.outbox), 1)