class User(FullName, Model): email = props.String(indexed=True) password = props.String() first_name = props.String(optional=True) last_name = props.String(optional=True) created_at = props.DateTime(auto_now_add=True) updated_at = props.DateTime(auto_now=True)
class Post(Model): author = props.Key(indexed=True, kind=User) title = props.String() def __compute_slug(self): if self.title is None: return None return slugify(self.title) def __compute_body(self): if self.body is None: return None return markdown(self.body) slug = props.Computed(__compute_slug) body = props.Text() body_markdown = props.Computed(__compute_body) tags = props.String(indexed=True, repeated=True) created_at = props.DateTime(indexed=True, auto_now_add=True) updated_at = props.DateTime(indexed=True, auto_now=True)
class User(Model, poly=True): username = props.String(indexed=True) password = Password() created_at = props.DateTime(indexed=True, auto_now_add=True) updated_at = props.DateTime(indexed=True, auto_now=True) @classmethod def login(cls, username, password): user = User.query().where(User.username == username).get() if user is None: return None if not ctx.verify(password, user.password): return None if ctx.needs_update(user.password): user.password = password return user.put() return user @property def permissions(self): return ()
class Animal(Model, poly=True): endangered = props.Bool(default=False) birthday = props.DateTime(indexed=True, auto_now_add=True)
class Person(FullName, Model): email = props.String(indexed=True) first_name = props.String(indexed=True) last_name = props.String(optional=True) parent = props.Key(optional=True) created_at = props.DateTime(auto_now_add=True, indexed=True)
def test_datetimes_cannot_be_both_auto_and_repeated(): with pytest.raises(TypeError): props.DateTime(auto_now_add=True, repeated=True)
def test_tz_aware_datetimes_are_not_converted(): now = datetime.now(tzutc()) prop = props.DateTime() assert prop.validate(now) == now
def test_naive_datetimes_are_converted_to_local_time(): now = datetime.now() prop = props.DateTime() assert prop.validate(now) == now.replace(tzinfo=tzlocal())
class GuestbookEntry(Model): author = props.String(optional=True) message = props.Text() created_at = props.DateTime(indexed=True, auto_now_add=True)