Refactor the Edit Time Sheet view for "autocommit" mode

I.e. instead of letting changes queue up for "batch" mode, immediately
flush changes to server after each edit.
This commit is contained in:
Lance Edgar 2017-02-09 16:10:40 -06:00
parent d21c8bcaeb
commit 7ca03df04d
5 changed files with 309 additions and 26 deletions

View file

@ -28,6 +28,8 @@ from __future__ import unicode_literals, absolute_import
import datetime
import sqlalchemy as sa
from rattail import enum
from rattail.db import model, api
from rattail.time import localtime, make_utc, get_sunday
@ -350,13 +352,21 @@ class TimeSheetView(View):
max_time = localtime(self.rattail_config, datetime.datetime.combine(weekdays[-1] + datetime.timedelta(days=1), datetime.time(0)))
shifts = Session.query(cls)\
.filter(cls.employee_uuid.in_([e.uuid for e in employees]))\
.filter(cls.start_time >= make_utc(min_time))\
.filter(cls.start_time < make_utc(max_time))\
.filter(sa.or_(
sa.and_(
cls.start_time >= make_utc(min_time),
cls.start_time < make_utc(max_time),
),
sa.and_(
cls.start_time == None,
cls.end_time >= make_utc(min_time),
cls.end_time < make_utc(max_time),
)))\
.all()
for employee in employees:
employee_shifts = sorted([s for s in shifts if s.employee_uuid == employee.uuid],
key=lambda s: s.start_time)
key=lambda s: s.start_time or s.end_time)
if not hasattr(employee, 'weekdays'):
employee.weekdays = [{} for day in weekdays]
setattr(employee, '{}_hours'.format(shift_type), datetime.timedelta(0))

View file

@ -97,10 +97,20 @@ class TimeSheetView(BaseTimeSheetView):
shift = Session.query(model.WorkedShift).get(uuid)
assert shift
updated[uuid] = shift
start_time = datetime.datetime.strptime(data['start_time'][uuid], time_format)
shift.start_time = make_utc(localtime(self.rattail_config, start_time))
end_time = datetime.datetime.strptime(data['end_time'][uuid], time_format)
shift.end_time = make_utc(localtime(self.rattail_config, end_time))
start_time = data['start_time'][uuid] or None
if start_time:
start_time = datetime.datetime.strptime(start_time, time_format)
shift.start_time = make_utc(localtime(self.rattail_config, start_time))
else:
shift.start_time = None
end_time = data['end_time'][uuid] or None
if end_time:
end_time = datetime.datetime.strptime(end_time, time_format)
shift.end_time = make_utc(localtime(self.rattail_config, end_time))
else:
shift.end_time = None
self.request.session.flash("Changes were applied: created {}, updated {}, "
"deleted {} Worked Shifts".format(