Your hypothesis is true. It seems that dictsort
can't handle to compare None
value with datetime
object anyhow. Even if you return a very small datetime object like:
datetime.datetime(1900, 1, 1, 1, 1)
the list will be blank too.
So the solution would be converting datetime object to text and use it, also return ''
instead of None
so it doesn't take time to convert None
to something else when sorting:
def latest_timestamp_text(self)
if self.latest_datapoint():
return self.latest_data_point().timestamp.strftime('%Y-%m-%d %H:%M:%S')
else:
return ''
Hope it helps.
EDIT
I didn't know that Django's DateTimeField
will produce datetime object with timezone info. So of course it cannot be compared to a normal datetime object without that info:
>>> dt1 = datetime.datetime(2006, 11, 21, 16, 30, tzinfo=gmt2)
>>> dt2 = datetime.datetime(2006, 11, 22, 16, 30)
>>> dt1 > dt2
TypeError: can't compare offset-naive and offset-aware datetimes
So if you still want to use the datetime object without converting to text, you have to make a timezone info class, something like this:
from datetime import datetime, timedelta, tzinfo
class GMT2(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=2) + self.dst(dt)
def dst(self, dt):
d = datetime(dt.year, 4, 1)
self.dston = d - timedelta(days=d.weekday() + 1)
d = datetime(dt.year, 11, 1)
self.dstoff = d - timedelta(days=d.weekday() + 1)
if self.dston <= dt.replace(tzinfo=None) < self.dstoff:
return timedelta(hours=1)
else:
return timedelta(0)
def tzname(self, dt):
return "GMT +2"
Then change your function like this:
def latest_timestamp(self):
gmt2 = GMT2()
if self.latest_datapoint():
return self.latest_data_point().timestamp
else:
return datetime(1970, 1, 1, 1, 1, tzinfo=gmt2)
Note: 1970 is the minimum value for year.
I would prefer converting to text over this method but well it's your choice.