class Session(Model): user = props.Key(kind=User) @classmethod def create(cls, user): session = cls(user=user) session.key = Key(Session, str(uuid4())) return session.put()
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 ModelWithKeyProperty(Model): k = props.Key()
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)
class ModelWithRestrictedKeyProperty(Model): k = props.Key(kind=Person)
def test_keys_cannot_be_assigned_partial_keys(): with pytest.raises(ValueError): key = props.Key() key.validate(Key("Person"))
def test_keys_can_be_assigned_full_keys(): assert props.Key().validate(Key("Person", 12))
def test_key_properties_can_be_restricted_by_kind(): assert props.Key(kind="Person").kind == "Person" assert props.Key(kind=models.Person).kind == "Person"
class Subscriber(Model): tags = props.Key(repeated=True, kind=Tag)
class ModelWithRepeatedKeyProperty(Model): ks = props.Key(kind=Person, repeated=True)