def Render(cls, handler): """Rendering method that can be called by main.py or get. This method executes no action, so the method by which it is accessed is immaterial. Creating a form with get may be a desirable function. That is, if this builtin is turned on, anyone can create a form to delete a kind by simply linking to the ConfirmDeleteHandler like so: <a href="/_ah/datastore_admin/confirm_delete?kind=trash"> Delete all Trash Objects</a> Args: handler: the webapp.RequestHandler invoking the method """ readonly_warning = not capabilities.CapabilitySet( 'datastore_v3', capabilities=['write']).is_enabled() namespace = handler.request.get('namespace') kinds = handler.request.get_all('kind') sizes_known, size_total, remainder = utils.ParseKindsAndSizes(kinds) (namespace_str, kind_str) = utils.GetPrintableStrs(namespace, kinds) template_params = { 'readonly_warning': readonly_warning, 'form_target': DoDeleteHandler.SUFFIX, 'kind_list': kinds, 'remainder': remainder, 'sizes_known': sizes_known, 'size_total': size_total, 'app_id': handler.request.get('app_id'), 'datastore_admin_home': utils.GenerateHomeUrl(handler.request), 'kind_str': kind_str, 'namespace_str': namespace_str, 'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION), } utils.RenderToResponse(handler, 'confirm_delete.html', template_params)
def Render(cls, handler): """Rendering method that can be called by main.py. Args: handler: the webapp.RequestHandler invoking the method """ namespace = handler.request.get('namespace') kinds = handler.request.get('kind', allow_multiple=True) sizes_known, size_total, remainder = utils.ParseKindsAndSizes(kinds) (namespace_str, kind_str) = utils.GetPrintableStrs(namespace, kinds) notreadonly_warning = capabilities.CapabilitySet( 'datastore_v3', capabilities=['write']).is_enabled() blob_warning = bool(blobstore.BlobInfo.all().fetch(1)) datastore_type = datastore._GetConnection().get_datastore_type() high_replication_warning = (datastore_type == datastore_rpc.Connection. HIGH_REPLICATION_DATASTORE) template_params = { 'form_target': DoCopyHandler.SUFFIX, 'kind_list': kinds, 'remainder': remainder, 'sizes_known': sizes_known, 'size_total': size_total, 'app_id': handler.request.get('app_id'), 'cancel_url': handler.request.get('cancel_url'), 'kind_str': kind_str, 'namespace_str': namespace_str, 'xsrf_token': utils.CreateXsrfToken(XSRF_ACTION), 'notreadonly_warning': notreadonly_warning, 'blob_warning': blob_warning, 'high_replication_warning': high_replication_warning, } utils.RenderToResponse(handler, 'confirm_copy.html', template_params)
def post(self): """Handler for post requests to datastore_admin/delete.do. Jobs are executed and user is redirected to the get handler. """ namespace = self.request.get('namespace') kinds = self.request.get('kind', allow_multiple=True) (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds) token = self.request.get('xsrf_token') jobs = [] if utils.ValidateXsrfToken(token, XSRF_ACTION): try: op = utils.StartOperation('Deleting %s%s' % (kinds_str, namespace_str)) name_template = 'Delete all %(kind)s objects%(namespace)s' jobs = utils.RunMapForKinds(op.key(), kinds, name_template, self.DELETE_HANDLER, self.INPUT_READER, None, {}) error = '' except Exception, e: error = self._HandleException(e) parameters = [('job', job) for job in jobs] if error: parameters.append(('error', error))
def post(self): """Handler for post requests to datastore_admin/copy.do. Jobs are executed and user is redirected to the get handler. """ namespace = self.request.get('namespace') kinds = self.request.get_all('kind') (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds) token = self.request.get('xsrf_token') remote_url = self.request.get('remote_url') extra_header = self.request.get('extra_header') jobs = [] if not remote_url: parameters = [('error', 'Unspecified remote URL.')] elif not utils.ValidateXsrfToken(token, XSRF_ACTION): parameters = [('xsrf_error', '1')] else: try: if extra_header: extra_headers = dict([extra_header.split(':', 1)]) else: extra_headers = None target_app = remote_api_put_stub.get_remote_appid(remote_url, extra_headers) op = utils.StartOperation( 'Copying %s%s to %s' % (kinds_str, namespace_str, target_app)) name_template = 'Copy all %(kind)s objects%(namespace)s' mapper_params = { 'target_app': target_app, 'remote_url': remote_url, 'extra_header': extra_header, } jobs = utils.RunMapForKinds( op.key(), kinds, name_template, self.COPY_HANDLER, self.INPUT_READER, None, mapper_params) error = '' except Exception, e: logging.exception('Handling exception.') error = self._HandleException(e) parameters = [('job', job) for job in jobs] if error: parameters.append(('error', error))
def post(self): """Handler for post requests to datastore_admin/delete.do. Jobs are executed and user is redirected to the get handler. """ namespace = self.request.get('namespace') kinds = self.request.get_all('kind') (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds) token = self.request.get('xsrf_token') readonly_warning = self.request.get('readonly_warning') jobs = [] if (readonly_warning == 'True') and not self.request.get('confirm_readonly_delete'): parameters = [('noconfirm_error', '1')] else: if utils.ValidateXsrfToken(token, XSRF_ACTION): try: op = utils.StartOperation('Deleting %s%s' % (kinds_str, namespace_str)) name_template = 'Delete all %(kind)s objects%(namespace)s' mapreduce_params = {'force_ops_writes': True} queue = self.request.get('queue') queue = queue or os.environ.get( 'HTTP_X_APPENGINE_QUEUENAME', 'default') if queue[0] == '_': queue = 'default' jobs = utils.RunMapForKinds( op.key(), kinds, name_template, self.DELETE_HANDLER, self.INPUT_READER, None, {}, mapreduce_params=mapreduce_params, queue_name=queue, max_shard_count=utils.MAPREDUCE_DEFAULT_SHARDS) error = '' except Exception as e: error = self._HandleException(e) parameters = [('job', job) for job in jobs] if error: parameters.append(('error', error)) else: parameters = [('xsrf_error', '1')] query = urllib.parse.urlencode(parameters) self.redirect('%s/%s?%s' % (config.BASE_PATH, self.SUFFIX, query))
def post(self): """Handler for post requests to datastore_admin/delete.do. Jobs are executed and user is redirected to the get handler. """ namespace = self.request.get('namespace') kinds = self.request.get_all('kind') (namespace_str, kinds_str) = utils.GetPrintableStrs(namespace, kinds) token = self.request.get('xsrf_token') jobs = [] if utils.ValidateXsrfToken(token, XSRF_ACTION): try: op = utils.StartOperation('Deleting %s%s' % (kinds_str, namespace_str)) name_template = 'Delete all %(kind)s objects%(namespace)s' queue = self.request.get('queue') queue = queue or os.environ.get('HTTP_X_APPENGINE_QUEUENAME', 'default') if queue[0] == '_': queue = 'default' jobs = utils.RunMapForKinds( op.key(), kinds, name_template, self.DELETE_HANDLER, self.INPUT_READER, None, {}, queue_name=queue, max_shard_count=utils.MAPREDUCE_DEFAULT_SHARDS) error = '' except Exception, e: error = self._HandleException(e) parameters = [('job', job) for job in jobs] if error: parameters.append(('error', error))