def put(self, id=None): if id is None: # Somebody called PUT /api/<collection> which we don't support. return self.http_method_not_allowed('GET, HEAD, POST') id = self.model.get_long_uid(id) if not owns(self.get_current_user(), id): return self.http_forbidden() force = self.request.get('force', None) == 'true' # from query str params = self.get_params(self.model.property_types()) # json body # Don't allow any changes to response privacy. params.pop('private', None) try: entity = Response.update_or_conflict(id, params, force) except ResponseNotFound: return self.http_not_found() except JsonTextValueLengthError: return self.http_payload_too_large("Value too long.") except JsonTextDictLengthError: return self.http_payload_too_large("Body has too many keys.") except ResponseBodyKeyConflict as e: return self.http_conflict({ 'message': ("Keys conflict: {}. Repeat with ?force=true to override.". format(', '.join(e.args[0]))), 'keys': e.args[0], }) self.write(entity)
def test_update_creates_task(self): # **Don't** use .put() here, because responses are saved with a # custom transaction via insert_or_conflict() and update_or_conflict(). user_response_params = dict( self.response_params, type=Response.USER_LEVEL_SYMBOL, private=True, user_id='User_foo', ) r = Response.create(**user_response_params) r.put() # Creates one task. # Modifying should create a (second) task. new_params = dict(user_response_params, progress = 100) updated = Response.update_or_conflict(r.uid, new_params, False) expected_payload = json.dumps( updated.to_dict(), default=util.json_dumps_default, ) tasks = self.taskqueue_stub.get_filtered_tasks() self.assertEqual(len(tasks), 2) self.assertEqual(tasks[1].payload, expected_payload)