def to_db(value, row, field='DOB'): """ Given either a DOB string or an age string, set DOB+DOB_prec on the object /row/ if the value is different. """ if not value: dob = None prec = None elif isinstance(value, basestring): row_dob = getattr(row, field) row_age = None if row_dob: row_age = Age.from_dob(row_dob) try: age = Age.parse(value) if age == row_age: return dob, prec = age.to_dobprec() except Error: try: dob = datetime.mx_parse_date(value).mx() prec = PREC_DOB except Error: raise Error('Invalid DOB/age %r' % value) else: dob = value prec = PREC_DOB setattr(row, field, dob) setattr(row, field + '_prec', prec)
def to_db(value, row, field='DOB'): """ Given either a DOB string or an age string, set DOB+DOB_prec on the object /row/ if the value is different. """ if not value: dob = None prec = None elif isinstance(value, basestring): row_dob = getattr(row, field) row_age = None if row_dob: row_age = Age.from_dob(row_dob) try: age = Age.parse(value) if age == row_age: return dob, prec = age.to_dobprec() except Error: try: dob = datetime.mx_parse_date(value).mx() prec = PREC_DOB except Error: raise Error('Invalid DOB/age %r' % value) else: dob = value prec = PREC_DOB setattr(row, field, dob) setattr(row, field+'_prec', prec)
def calc_tick_labels(self): """ Generate ticks & tick labels. If the density of the ticks looks like it will be too high, we start skipping ticks (tick_stride). """ assert self.n_bins assert self.bin_span tick_labels = [] ticks = [] tick_stride = int(math.ceil(self.n_bins / float(self.max_ticks))) tick = self.first if self.bin_span.days == 1: adj = 0 if tick_stride == 1: step = RelativeDateTime(days=1) elif tick_stride <= 7: step = RelativeDateTime(weeks=1, weekday=(Monday,0)) tick += step elif tick_stride <= 14: step = RelativeDateTime(weeks=2, weekday=(Monday,0)) tick += RelativeDateTime(weeks=1, weekday=(Monday,0)) else: step = RelativeDateTime(day=1, months=1) tick += step else: adj = -0.5 step = self.bin_span * tick_stride while tick < self.last: bin = (tick - self.first) / self.bin_span ticks.append(bin+adj) tick_labels.append(str(datetime.mx_parse_date(tick))) tick += step return ticks, tick_labels
def to_sql(self, value): if value is None: return None elif isinstance(value, str): try: return datetime.mx_parse_date(value).mx() except datetime.Error, e: raise dbapi.ValidationError('%s: %s' % (self.name, e))
def age_if_dob(dob): """ If DOB (not age) string, return age string, otherwise return None """ if dob: try: return str(Age.from_dob(datetime.mx_parse_date(dob))) except Error: pass
def parse_dob_or_age(value, now=None): """ Given a date-of-birth or age string, return a DOB & precision """ if not value: return None, None try: return Age.parse(value).to_dobprec(now) except Error: pass try: return datetime.mx_parse_date(value).mx(), PREC_DOB except Error: raise Error('Invalid DOB/age %r' % value)
def from_sql(self, value): if value is not None: return datetime.mx_parse_date(value)
def from_user(self, value): try: return datetime.mx_parse_date(value) except datetime.Error: return value