def wd_manage_apply(request, month, year, contract):
c = Contract.objects.get(id=int(contract), user=request.user)
month = int(month)
year = int(year)
firstDayOfMonth = datetime(year, month, 1, 0, 0, 1, 0).weekday()
daysInMonth = monthrange(year, month)
workL = WorkLog.objects.get(contract=c, month=month, year=year)
# First try apply all anual activities
anuals = c.fixedworkdustactivity_set.all()
for a in anuals:
if a.week_day > firstDayOfMonth:
anualStep = 1 + a.week_day - firstDayOfMonth
elif a.week_day == firstDayOfMonth:
anualStep = 1
else:
anualStep = 1 + 7 - firstDayOfMonth + a.week_day
while anualStep <= daysInMonth[1] and workL.calcHours() + a.avg_length <= c.hours:
wt = WorkTime()
wt.work_log = workL
if a.avg_length >= 6:
wt.pause = 1
else:
wt.pause = 0
wt.begin = datetime(year, month, anualStep, a.start.hour, a.start.minute, 0, 0)
beginstamp = (wt.begin - datetime(1970, 1, 1)).total_seconds()
wt.end = datetime.fromtimestamp(beginstamp +
a.avg_length * 60.0*60.0 + wt.pause * 60.0*60.0)
# wt.end = wt.begin.replace(hour=int(wt.begin.hour + math.floor(a.avg_length) + wt.pause))
# wt.end = wt.end.replace(minute=int(round((a.avg_length - math.floor(a.avg_length)) * 60)))
wt.activity = a.description
wt.clean_fields(year, month)
wt.save()
anualStep += 7
# Then fill with "other" activities
filler = FillerWorkDustActivity.objects.all()
largestFreeSlot = 0
smallestFiller = filler.aggregate(Min('avg_length'))['avg_length__min']
while not smallestFiller == None and largestFreeSlot >= smallestFiller:
pass
return redirect("/?month=" + str(month) + "&year=" + str(year) + "#" + str(c.id))
评论列表
文章目录