示例#1
0
    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))
示例#4
0
  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))
示例#5
0
    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))
示例#6
0
    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))