Kitek's Page Blog programisty / webdeveloper'a

Daty w GAE

Tworząc własne skrypty lub strony oparte o Google App Engine prędzej czy później przyjdzie potrzeba zapisania w Datastore rekordów z odpowiednimi datami (np. data założenia konta, logowania itp.). W tym miejscu pojawia się problem polegający na tym, że baza GAE przechowuje tylko i wyłącznie daty w UTC.

Do konwersji strefy czasowej najlepiej wykorzystać bibliotekę gae-pytz, która została specjalnie przygotowana dla Google App Engine m.in.: wszystkie pliki związane ze strefami czasowymi spakowano do jednego archiwum, wykorzystano moduł memcache’a do optymalizacji. Dodatkowo tworzymy nasz własny typ danych (Property Class), który będzie przeprowadzał automatyczną konwersję strefy. W moim przypadku jest to klasa CetDateTimeProperty:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import time
from pytz.gae import pytz
from google.appengine.ext import db

class CetDateTimeProperty(db.DateTimeProperty):
	def get_value_for_datastore(self, model_instance):
		date = super(CetDateTimeProperty, self)
			.get_value_for_datastore(model_instance)
		if date:
			if date.tzinfo:
				return date.astimezone(pytz.utc)
			else:
				return date.replace(tzinfo=pytz.utc)
		else:
  			return None
  	def make_value_from_datastore(self, value):
		if value is None:
			return None
		else:
			utc=pytz.UTC
			dt = utc.localize(value)
			return dt.astimezone(pytz.timezone('Europe/Warsaw'))

Powyższą klasę stosujemy w naszych modelach zamiast oryginalnej db.DateTimeProperty np:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

from google.appengine.ext import db
from CetDateTimeProperty import CetDateTimeProperty

class User(db.Model):
	email = db.StringProperty(required=True)
	created = CetDateTimeProperty(auto_now_add=True)