import wsgiref.handlers from google.appengine.ext import db, webapp class MyModel(db.Model): first = db.StringProperty() last = db.StringProperty() class UniqueConstraint(db.Model): @classmethod def check(cls, model, **values): # Create a pseudo-key for use as an entity group. parent = db.Key.from_path(model.kind(), 'unique-values') # Build a list of key names to test. key_names = [] for key in values: key_names.append('%s:%s' % (key, values[key])) def txn(): result = cls.get_by_key_name(key_names, parent) for test in result: if test: return False for key_name in key_names: uc = cls(key_name=key_name, parent=parent) uc.put() return True return db.run_in_transaction(txn) class TestHandler(webapp.RequestHandler): def get(self): def write(msg): self.response.out.write(msg + '\n') def create(first, last): if UniqueConstraint.check(MyModel, first=first, last=last): write('Creating %s %s!' % (first, last)) mm = MyModel(first=first, last=last) mm.put() return True else: write('Darnit, "%s" or "%s" is taken!' % (first, last)) return False write('
')
write('Clearing data!')
for mm in MyModel.all():
mm.delete()
for uc in UniqueConstraint.all():
uc.delete()
write('Done!')
write('---')
for i in xrange(4):
if not create('Bob', 'Doe'):
if not create('Bob', 'Foo'):
if not create('Bar', 'Foo'):
if not create('Jane', 'Boo'):
write('We\'re all out of luck!')
write('---')
write('Data in the datastore:')
for mm in MyModel.all():
write('MyModel: %s %s' % (mm.first, mm.last))
for uc in UniqueConstraint.all():
write('UniqueConstraint: %s → %s → %s' % (
uc.key().parent().kind(), uc.key().parent().name(),
uc.key().name()))
write('')
def main():
application = webapp.WSGIApplication([
('/test', TestHandler),
])
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()