Code

Opened 4 years ago

Closed 4 years ago

#14157 closed (invalid)

Birthday calculation failing silently

Reported by: nil_von_9wo Owned by: nobody
Component: Uncategorized Version: 1.2
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

I have a model:

class Fighter (models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField(blank=True, null=True)

    def age(self):
        return calculate_age(self.birth_date)

calculate_age is as follow:

def calculate_age(born):
    today = datetime.datetime.today()
    try: # raised when birth day is February 29 and the current year is not a leap year
        birthday = born.replace(year=today.year)
    except ValueError:
        birthday = born.replace(year=today.year, day=born.day-1)

    import pdb; pdb.set_trace();
    
    if birthday > today:
        return today.year - born.year -1 
    else:
        return today.year - born.year

This function works perfectly from the command line.

However, as it is, from within a running django server, Fighter.age() returns no results.

By experimenting, I learned Fighter.age() will return a result if I return something (anything) in calculate_age() before it hits

if birthday > today:

By returning both values before that point, I verified that neither was "None", however they may not be the same data type.

I'm going to try casting them to match the type, but I was advised I should report this incident.

Attachments (0)

Change History (2)

comment:1 Changed 4 years ago by nil_von_9wo

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

For whatever its worth, I've verified that the problem is in fact a type problem which could be solved by including the line:

birthday_datetime = datetime.datetime.combine(birthday,datetime.time())

but even so, the silent failure made it very difficult to figure this out.

comment:2 Changed 4 years ago by ramiro

  • Resolution set to invalid
  • Status changed from new to closed

You are declaring the today var as a datetime and are trying to compare it with a date value (born, obtained from the Django DateField).

>>> import datetime
>>> born =  datetime.date(1971, 11, 26)
>>> today = datetime.date.today()
>>> try:
...     bday = born.replace(year=today.year)
... except ValueError:
...     bday = born.replace(year=today.year, day=born.day-1)
...
>>> bday
datetime.date(2010, 11, 26)
>>> bday > today
True
>>> wrong_today = datetime.datetime.today()
>>> bday > wrong_today
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare datetime.datetime to datetime.date

Please review your code because I doubt it is working on the command line in its current form.

Closing ticket as invalid because it's a basic Python problem.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.