def create_multi(cls, values): """Creates multiple unique values at once. :param values: A sequence of values to be unique. See :meth:`create`. :returns: A tuple (bool, list_of_keys). If all values were created, bool is True and list_of_keys is empty. If one or more values weren't created, bool is False and the list contains all the values that already existed in datastore during the creation attempt. """ keys = [cls.get_key(value) for value in values] # Preliminary check, before going for more expensive transactions. entities = model.get_multi(keys) existing = [entity.key.id() for entity in entities if entity] if existing: return False, existing # Create all records transactionally. created = [] entities = [cls(key=key) for key in keys] for entity in entities: txn = lambda: entity.put() if not entity.key.get() else None key = model.transaction(txn) if key: created.append(key) if created != keys: # A poor man's "rollback": delete all recently created records. model.delete_multi(created) return False, [k.id() for k in keys if k not in created] return True, []
def create_multi(cls, values): """Creates multiple unique values at once. :param values: A sequence of values to be unique. See :meth:`create`. :returns: A tuple (bool, list_of_keys). If all values were created, bool is True and list_of_keys is empty. If one or more values weren't created, bool is False and the list contains all the values that already existed in datastore during the creation attempt. """ # Maybe do a preliminary check, before going for transactions? # entities = model.get_multi(keys) # existing = [entity.key.id() for entity in entities if entity] # if existing: # return False, existing # Create all records transactionally. keys = [model.Key(cls, value) for value in values] entities = [cls(key=key) for key in keys] func = lambda e: e.put() if not e.key.get() else None created = [model.transaction(lambda: func(e)) for e in entities] if created != keys: # A poor man's "rollback": delete all recently created records. model.delete_multi(k for k in created if k) return False, [k.id() for k in keys if k not in created] return True, []
def delete_multi(cls, values): """Deletes multiple unique values at once. :param values: A sequence of values to be deleted. See :meth:`create`. """ keys = [cls.get_key(value) for value in values] model.delete_multi(keys)
def post(self, action=None): if 'del_button' in self.request.POST and 'item_count' in self.request.POST: max_items = int(self.request.POST['item_count']) delkeys = [] for i in range(1, max_items+1): k = 'key' + str(i) if k in self.request.POST: delkeys.append(model.Key(urlsafe=self.request.POST[k])) if delkeys: model.delete_multi(delkeys) self.redirect('/_ah/myadmin/game/news') return context['edit_key'] = None form = NewsForm() form.dt.data = datetime.datetime.now() #.strftime('%Y-%m-%d %H:%M:%S') if 'edit_button' in self.request.POST: max_items = int(self.request.POST['item_count']) key = None for i in range(1, max_items+1): k = 'key' + str(i) if k in self.request.POST: key = model.Key(urlsafe=self.request.POST[k]) break if key: unit = key.get() form.init_with_model(unit) context['edit_key'] = unit.key.urlsafe() else: self.redirect('/_ah/myadmin/game/news') if 'create_button' in self.request.POST or 'save_button' in self.request.POST: form = NewsForm(self.request.POST) if form.validate(): if 'save_button' in self.request.POST: key = model.Key(urlsafe=self.request.POST['edit_key']) news = key.get() else: news = News() news.dt=form.dt.data news.msg=form.msg.data news.put() self.redirect('/_ah/myadmin/game/news') #form = NewsForm() #if 'save_button' in self.request.POST: # self.redirect('/_ah/myadmin/game/news') # return context['form'] = form self.render_response("admin/create.html", **context)
def create_multi(cls, values): keys = [model.Key(cls, value) for value in values] entities = [cls(key=key) for key in keys] func = lambda e: e.put() if not e.key.get() else None created = [model.transaction(lambda: func(e)) for e in entities] if created != keys: # A poor man's rollback: delete all recently created records. model.delete_multi(k for k in created if k) return False, [k.id() for k in keys if k not in created] return True, []
def delete_multi(cls, values): """Deletes multiple unique values at once. :param values: A sequence of values to be deleted. """ return model.delete_multi(model.Key(cls, v) for v in values)
def testDeleteMulti(self): ent1 = model.Model(key=model.Key('MyModel', 1)) ent2 = model.Model(key=model.Key('MyModel', 2)) ent3 = model.Model(key=model.Key('MyModel', 3)) key1 = ent1.put() key2 = ent2.put() key3 = ent3.put() self.assertEqual(key1.get(), ent1) self.assertEqual(key2.get(), ent2) self.assertEqual(key3.get(), ent3) res = model.delete_multi((key1, key2, key3)) self.assertEqual(key1.get(), None) self.assertEqual(key2.get(), None) self.assertEqual(key3.get(), None)
def delete_by_id(cls, user_id): user_key = model.Key(cls, user_id) # Use delete_multi() to save a RPC call. model.delete_multi([user_key]) return True
def post(self, action=None): if 'del_button' in self.request.POST and 'item_count' in self.request.POST: max_items = int(self.request.POST['item_count']) delkeys = [] for i in range(1, max_items+1): k = 'key' + str(i) if k in self.request.POST: delkeys.append(model.Key(urlsafe=self.request.POST[k])) if delkeys: model.delete_multi(delkeys) self.redirect('/_ah/myadmin/game/gamekeys') return context['edit_key'] = None form = PaypalTransactionForm() if 'edit_button' in self.request.POST: max_items = int(self.request.POST['item_count']) key = None for i in range(1, max_items+1): k = 'key' + str(i) if k in self.request.POST: key = model.Key(urlsafe=self.request.POST[k]) break if key: pp = key.get() form.init_with_model(pp) context['edit_key'] = pp.key.urlsafe() else: self.redirect('/_ah/myadmin/game/gamekeys') if 'create_button' in self.request.POST or 'save_button' in self.request.POST: form = PaypalTransactionForm(self.request.POST) if form.validate(): if 'save_button' in self.request.POST: key = model.Key(urlsafe=self.request.POST['edit_key']) trans = key.get() else: trans = PaypalTransaction() trans.transaction_status = form.transaction_status.data trans.orig_query = form.orig_query.data trans.transaction_id = form.transaction_id.data trans.item_name = form.item_name.data trans.payment_gross = form.payment_gross.data trans.player_email = form.player_email.data trans.customer_email = form.customer_email.data trans.customer_name = form.customer_name.data trans.gamekey = form.gamekey.data trans.gamekey_used = form.gamekey_used.data key = trans.put() if 'create_button' in self.request.POST and not trans.gamekey: # was new transaction,, generate a gamekey trans.gamekey = str(key.id()) l = 12 - len(trans.gamekey) if l > 0: trans.gamekey += security.generate_random_string(l).upper() trans.put() self.redirect('/_ah/myadmin/game/gamekeys') context['form'] = form self.render_response("admin/create.html", **context)