def get(self, payroll_user=None, week=None): if self.user is not None: start_date = utils.get_last_monday(datetime.date.today()) end_date = start_date + datetime.timedelta(days=6) if week: start_date = utils.get_last_monday(datetime.date.fromtimestamp(float(week))) end_date = start_date + datetime.timedelta(days=6) records = TimeRecord.get_current_week(payroll_user or self.user.username, start_date) else: records = TimeRecord.get_current_week(payroll_user or self.user.username) if not records: return abort(404) next_date = start_date + datetime.timedelta(days=7) prev_date = start_date - datetime.timedelta(days=7) context = { 'nav': 'payroll', 'user': self.user, 'table_rows': records, 'payroll_username': payroll_user or self.user.username, 'start_date': start_date, 'end_date': end_date, 'prev_timestamp': time.mktime(prev_date.timetuple()), 'next_timestamp': time.mktime(next_date.timetuple()), } return render_template('payroll.html', **context) else: flash("Please log in before accessing the payroll system") return render_template('index.html')
def get(self, payroll_user=None, week=None): start_date = utils.get_last_monday(datetime.date.today()) end_date = start_date + datetime.timedelta(days=6) if week: start_date = utils.get_last_monday( datetime.date.fromtimestamp(float(week))) end_date = start_date + datetime.timedelta(days=6) records = TimeRecord.get_current_week( payroll_user or self.user.username, start_date) else: records = TimeRecord.get_current_week(payroll_user or self.user.username) if not records: return abort(404) next_date = start_date + datetime.timedelta(days=7) prev_date = start_date - datetime.timedelta(days=7) context = { 'nav': 'payroll', 'user': self.user, 'table_rows': records, 'payroll_username': payroll_user or self.user.username, 'start_date': start_date, 'end_date': end_date, 'prev_timestamp': time.mktime(prev_date.timetuple()), 'next_timestamp': time.mktime(next_date.timetuple()), } return render_template('payroll.html', **context)
def get(self, payroll_user=None, week=None): # check logged in if not self.user or not self.user.username or not self.user.is_authenticated: return redirect('/logout?byebye=yes') # if a payroll user is specified, the logged in user must be an approver (or it must be thier own account) if payroll_user: payroll_user = crypto.encrypt(payroll_user) if not self.user.is_approver: if not payroll_user == self.user.username: return redirect('/logout?byebye=yes') # sanitize input for week parameter if week: if not utils.sanitize_number_input(week): return redirect('/logout?byebye=yes') start_date = utils.get_last_monday(datetime.date.today()) end_date = start_date + datetime.timedelta(days=6) if week: start_date = utils.get_last_monday(datetime.date.fromtimestamp(float(week))) end_date = start_date + datetime.timedelta(days=6) records = TimeRecord.get_current_week(payroll_user or self.user.username, start_date) else: records = TimeRecord.get_current_week(payroll_user or self.user.username) if not records: return abort(404) next_date = start_date + datetime.timedelta(days=7) prev_date = start_date - datetime.timedelta(days=7) context = { 'user': self.user, 'table_rows': records, 'payroll_username' : payroll_user or self.user.username, 'start_date': start_date, 'end_date': end_date, 'prev_timestamp': time.mktime(prev_date.timetuple()), 'next_timestamp': time.mktime(next_date.timetuple()), } return render_template('payroll.html', **context)
class TimeRecord(Document): """ A model representing a single day's time info. :param username: The username of who the TimeRecord is for. :param date: The date the TimeRecord represents. :param clock_in: The time representing when the employee clocked in for the day. :param clock_out: The time that the employee clocked out. :param approved: Records if a TimeRecord is approved by a payroll approver. :param approved_by: The username of the person who approved the TimeRecord. :param hours: The number of hours worked that day. """ username = StringField(default=None, required=True) date = DateTimeField(default=datetime.date.today(), required=True) clock_in = DateTimeField(required=False) clock_out = DateTimeField(required=False) approved = BooleanField(default=False, required=True) approved_by = StringField(max_length=255, required=False) hours = FloatField() def set_hours(self): """ Set the number of hours worked based on the clock_in and clock_out times. :returns: The number of hours worked if the TimeRecord contains a clock_in and clock_out, else returns None. """ if not self.clock_in or not self.clock_out: return time_worked = self.clock_out - self.clock_in self.hours = time_worked.seconds / 3600.0 return self.hours @classmethod def get_current_week(cls, username, today=datetime.date.today()): """ Given a day, this will return a weeks worth of TimeRecords objects, starting with Monday, that contains the date passed in as today. :param username: The username to lookup :param today: The day to use to look up the week. Defaults to today. :returns: A list of TimeRecord objects, for the username given, that is a payroll week containing the day given. """ try: user = User.objects(username=username).get() except DoesNotExist, e: return last_monday = utils.get_last_monday(today) next_monday = last_monday + datetime.timedelta(days=7) records = TimeRecord.objects(date__gte=last_monday, date__lt=next_monday, username=username).order_by('date') if len(records) < 7: for day in xrange(7): date = last_monday + datetime.timedelta(days=day) try: record = TimeRecord.objects(date=date, username=username).get() except DoesNotExist, e: TimeRecord(date=date, username=username).save() records = TimeRecord.objects(date__gte=last_monday, date__lt=next_monday, username=username).order_by('date')