import time
+def today():
+ t=time.time() - time.timezone
+ day=int(t/86400)
+
+ return(day)
+
+# Defaults for a girl
+defaults={
+ 'cycle': 28, # Cycle length
+ 'menstr': 5, # Duration of menstruation
+ 'ovday': -14, # When ovulation happens. Positive: This number
+ # of days after the start of the cycle.
+ # Negative: This number of days before the end
+ # of the cycle.
+ 'day0': today()
+ }
+
class Algo(object):
def __init__(self):
t=today()
- self.setReference(t, 28)
+ self.setReference(t, defaults)
# set day "day" as the reference day of starting period cycle
# day is int(time.time()/86400)
# cycle is the cycle width in days, starting from 0
- def setReference(self, day, cycle):
+ def setReference(self, day, cfg):
+ self.cfg=cfg
self.refday=day
- self.cycle=cycle
# Convert an arbitary day to a day in cycle
def dayInCycle(self, day):
- d=(day-self.refday) % self.cycle
+ d=(day-self.refday) % self.cfg['cycle']
if d<0:
- d+=self.cycle
+ d+=self.cycleLength()
return(d)
def cycleLength(self):
- return(self.cycle)
+ return(self.cfg['cycle'])
def currentDayInCycle(self):
d=today()
return(self.dayInCycle(d))
+ def menstruationDuration(self):
+ return(self.cfg['menstr'])
+
+ def ovulationDay(self):
+ return(self.cfg['ovday'])
+
# Return:
# ret={
# 'status': ['ok', 'red']
def status(self, day):
d=self.dayInCycle(day)
- ovbefore=14
+ cycle=self.cycleLength()
- if d<5:
+ #ovbefore=14
+ ovday=self.ovulationDay()
+ if ovday>0:
+ ovstart=ovday-3
+ ovmid=ovday
+ ovend=ovday+1
+ else:
+ ovstart=cycle+ovday-3
+ ovmid=cycle+ovday
+ ovend=cycle+ovday+1
+
+ menstr=self.menstruationDuration()
+
+ if d<menstr:
# Red
ret={
'status': 'red',
'day': d,
- 'len': 5,
+ 'len': menstr,
}
- elif d>=self.cycle-7:
+ elif d>=cycle-7:
ret={
'status': 'blue',
- 'day': 7+d-self.cycle,
+ 'day': 7+d-cycle,
'len': 7,
}
- elif d>self.cycle-ovbefore-4 and d<=self.cycle-ovbefore:
+ elif d>=ovstart and d<=ovmid:
ret={
'status': 'green',
- 'day': d-self.cycle+ovbefore+3,
+ 'day': d-ovstart,
'len': 4,
}
- elif d>self.cycle-16 and d<=self.cycle-ovbefore+1:
+ elif d>ovmid and d<=ovend:
ret={
'status': 'green',
'day': 2,
ret={
'status': 'ok',
'day': d,
- 'len': self.cycle
+ 'len': cycle
}
return(ret)
-def today():
- t=time.time() - time.timezone
- day=int(t/86400)
-
- return(day)
-
# vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent: