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, []
示例#2
0
    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, []
示例#3
0
    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)
示例#5
0
 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)
示例#6
0
    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, []
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
文件: model_test.py 项目: jsa/gae-ndb
  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)
示例#11
0
 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
示例#12
0
 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)