Пример #1
0
    def delete(self, package_id, id, format):
        """Delete one of this package's uploaders.

        Only uploaders may delete uploaders. If only one uploader remains, that
        uploader may not be deleted until a new one is added.
        """

        package = handlers.request().package
        email = id
        if not package.has_uploader_email(email):
            handlers.http_error(
                400, "'%s' isn't an uploader for package '%s'." %
                (email, package.name))

        if len(package.uploaderEmails) == 1:
            handlers.http_error(
                400, ("Package '%s' only has one uploader, so that uploader " +
                      "can't be removed.") % package.name)

        email_to_delete = email.lower()
        package.uploaderEmails = [
            email for email in package.uploaderEmails
            if email.lower() != email_to_delete
        ]
        package.put()
        package.invalidate_cache()
        return handlers.json_success(
            "'%s' is no longer an uploader for package '%s'." %
            (id, package.name))
Пример #2
0
    def delete(self, package_id, id, format):
        """Delete one of this package's uploaders.

        Only uploaders may delete uploaders. If only one uploader remains, that
        uploader may not be deleted until a new one is added.
        """

        package = handlers.request().package
        email = id
        if not package.has_uploader_email(email):
            handlers.http_error(
                400, "'%s' isn't an uploader for package '%s'." %
                         (email, package.name))

        if len(package.uploaderEmails) == 1:
            handlers.http_error(
                400, ("Package '%s' only has one uploader, so that uploader " +
                          "can't be removed.") % package.name)

        email_to_delete = email.lower()
        package.uploaderEmails = [email for email in package.uploaderEmails
                                  if email.lower() != email_to_delete]
        package.put()
        package.invalidate_cache()
        return handlers.json_success(
            "'%s' is no longer an uploader for package '%s'." %
                (id, package.name))
Пример #3
0
    def delete(self, package_id, id, format=None):
        """Delete one of this package's uploaders.

        Only uploaders may delete uploaders. If only one uploader remains, that
        uploader may not be deleted until a new one is added.
        """

        if format: id = id + '.' + format

        package = handlers.request().package
        user_to_delete = users.User(id)
        if not package.has_uploader(user_to_delete):
            handlers.http_error(
                400, "'%s' isn't an uploader for package '%s'." %
                (user_to_delete.nickname(), package.name))

        if len(package.uploaders) == 1:
            handlers.http_error(
                400, ("Package '%s' only has one uploader, so that uploader " +
                      "can't be removed.") % package.name)

        email_to_delete = user_to_delete.email().lower()
        package.uploaders = [
            uploader for uploader in package.uploaders
            if uploader.email().lower() != email_to_delete
        ]
        package.put()
        return handlers.json_success(
            "'%s' is no longer an uploader for package '%s'." %
            (id, package.name))
Пример #4
0
    def delete(self, package_id, id, format):
        """Delete one of this package's uploaders.

        Only uploaders may delete uploaders. If only one uploader remains, that
        uploader may not be deleted until a new one is added.
        """

        package = handlers.request().package
        if oauth.get_current_user() not in package.uploaders:
            handlers.http_error(
                403, "You aren't an uploader for package '%s'." %
                         package.name)

        user_to_delete = users.User(id)
        if user_to_delete not in package.uploaders:
            handlers.http_error(
                400, "'%s' isn't an uploader for package '%s'." %
                         (user_to_delete.nickname(), package.name))

        if len(package.uploaders) == 1:
            handlers.http_error(
                400, ("Package '%s' only has one uploader, so that uploader " +
                          "can't be removed.") % package.name)

        package.uploaders.remove(user_to_delete)
        package.put()
        return handlers.json_success(
            "'%s' is no longer an uploader for package '%s'." %
                (id, package.name))
Пример #5
0
    def delete(self, package_id, id, format):
        """Delete one of this package's uploaders.

        Only uploaders may delete uploaders. If only one uploader remains, that
        uploader may not be deleted until a new one is added.
        """

        package = handlers.request().package
        user_to_delete = users.User(id)
        if not package.has_uploader(user_to_delete):
            handlers.http_error(
                400, "'%s' isn't an uploader for package '%s'." %
                         (user_to_delete.nickname(), package.name))

        if len(package.uploaders) == 1:
            handlers.http_error(
                400, ("Package '%s' only has one uploader, so that uploader " +
                          "can't be removed.") % package.name)

        email_to_delete = user_to_delete.email().lower()
        package.uploaders = [uploader for uploader in package.uploaders
                             if uploader.email().lower() != email_to_delete]
        package.put()
        return handlers.json_success(
            "'%s' is no longer an uploader for package '%s'." %
                (id, package.name))
Пример #6
0
    def create(self, id, **kwargs):
        """Create a new package version.

        This creates a single package version. It will also create all the
        package metadata if that doesn't already exist. The package archive is
        uploaded to cloud storage separately.

        If the user doesn't own the package or isn't logged in with admin
        privileges, this will return a 403. If the package already has a version
        with this number, or if the version is invalid, this will return a 400.

        Arguments:
          id: The id of the package in cloud storage.
        """

        try:
            route = handlers.request().route
            if 'id' in route: del route['id']

            try:
                with closing(cloud_storage.read('tmp/' + id)) as f:
                    version = PackageVersion.from_archive(
                        f, uploaderEmail=handlers.get_oauth_user().email())
            except (KeyError, files.ExistenceError):
                handlers.http_error(
                    403, "Package upload " + id + " does not exist.")

            # If the package for this version already exists, make sure we're an
            # uploader for it. If it doesn't, we're fine to create it anew.
            if version.package.is_saved():
                if not version.package.has_uploader_email(
                    handlers.get_oauth_user().email()):
                    handlers.http_error(
                        403, "You aren't an uploader for package '%s'." %
                                 version.package.name)
                elif version.package.has_version(version.version):
                    message = 'Package "%s" already has version "%s".' % \
                        (version.package.name, version.version)
                    handlers.http_error(400, message)

                if self._should_update_latest_version(version):
                    version.package.latest_version = version
            else:
                version.package.latest_version = version

            cloud_storage.modify_object(version.storage_path,
                                        acl='public-read',
                                        copy_source='tmp/' + id)

            with models.transaction():
                version.package.put()
                version.put()
                version.package.invalidate_cache()

            deferred.defer(self._compute_version_order, version.package.name)

            return handlers.json_success('%s %s uploaded successfully.' %
                (version.package.name, version.version))
        finally:
            cloud_storage.delete_object('tmp/' + id)
Пример #7
0
    def create(self, id, **kwargs):
        """Create a new package version.

        This creates a single package version. It will also create all the
        package metadata if that doesn't already exist. The package archive is
        uploaded to cloud storage separately.

        If the user doesn't own the package or isn't logged in with admin
        privileges, this will return a 403. If the package already has a version
        with this number, or if the version is invalid, this will return a 400.

        Arguments:
          id: The id of the package in cloud storage.
        """

        try:
            route = handlers.request().route
            if 'id' in route: del route['id']

            try:
                with closing(cloud_storage.read('tmp/' + id)) as f:
                    version = PackageVersion.from_archive(
                        f, uploader=handlers.get_oauth_user())
            except (KeyError, files.ExistenceError):
                handlers.http_error(
                    403, "Package upload " + id + " does not exist.")

            # If the package for this version already exists, make sure we're an
            # uploader for it. If it doesn't, we're fine to create it anew.
            if version.package.is_saved():
                if not version.package.has_uploader(handlers.get_oauth_user()):
                    handlers.http_error(
                        403, "You aren't an uploader for package '%s'." %
                        version.package.name)
                elif version.package.has_version(version.version):
                    message = 'Package "%s" already has version "%s".' % \
                        (version.package.name, version.version)
                    handlers.http_error(400, message)

                if self._should_update_latest_version(version):
                    version.package.latest_version = version
            else:
                version.package.latest_version = version

            cloud_storage.modify_object(version.storage_path,
                                        acl='public-read',
                                        copy_source='tmp/' + id)

            with models.transaction():
                version.package.put()
                version.put()

            deferred.defer(self._compute_version_order, version.package.name)

            return handlers.json_success(
                '%s %s uploaded successfully.' %
                (version.package.name, version.version))
        finally:
            cloud_storage.delete_object('tmp/' + id)
Пример #8
0
    def create(self, package_id, format, email):
        """Add a new uploader for this package.

        Only other uploaders may add new uploaders."""

        package = handlers.request().package
        if package.has_uploader_email(email):
            handlers.http_error(
                400, "User '%s' is already an uploader for package '%s'." %
                (email, package.name))

        package.uploaderEmails.append(email)
        package.put()
        package.invalidate_cache()
        return handlers.json_success(
            "'%s' added as an uploader for package '%s'." %
            (email, package.name))
Пример #9
0
    def create(self, package_id, format, email):
        """Add a new uploader for this package.

        Only other uploaders may add new uploaders."""

        package = handlers.request().package
        if package.has_uploader_email(email):
            handlers.http_error(
                400, "User '%s' is already an uploader for package '%s'." %
                         (email, package.name))

        package.uploaderEmails.append(email)
        package.put()
        package.invalidate_cache()
        return handlers.json_success(
            "'%s' added as an uploader for package '%s'." %
                (email, package.name))
Пример #10
0
    def create(self, package_id, email):
        """Add a new uploader for this package.

        Only other uploaders may add new uploaders."""

        package = handlers.request().package
        user_to_add = users.User(email)
        if package.has_uploader(user_to_add):
            handlers.http_error(
                400, "User '%s' is already an uploader for package '%s'." %
                (email, package.name))

        package.uploaders.append(user_to_add)
        package.put()
        return handlers.json_success(
            "'%s' added as an uploader for package '%s'." %
            (email, package.name))
Пример #11
0
    def create(self, package_id, format, email):
        """Add a new uploader for this package.

        Only other uploaders may add new uploaders."""

        package = handlers.request().package
        if oauth.get_current_user() not in package.uploaders:
            handlers.http_error(
                403, "You aren't an uploader for package '%s'." %
                         package.name)

        user_to_add = users.User(email)
        if user_to_add in package.uploaders:
            handlers.http_error(
                400, "User '%s' is already an uploader for package '%s'." %
                         (email, package.name))

        package.uploaders.append(user_to_add)
        package.put()
        return handlers.json_success(
            "'%s' added as an uploader for package '%s'." %
                (email, package.name))
Пример #12
0
    def create(self, package_id, id, format="html", **kwargs):
        """Create a new package version.

        This creates a single package version. It will also create all the
        package metadata if that doesn't already exist. The package archive is
        uploaded to cloud storage separately.

        If the user doesn't own the package or isn't logged in with admin
        privileges, this will return a 403. If the package already has a version
        with this number, or if the version is invalid, this will redirect to
        the new version form.

        Arguments:
          id: The id of the package in cloud storage.
        """

        try:
            is_json = format == "json"

            route = handlers.request().route
            if "id" in route:
                del route["id"]

            package = handlers.request().maybe_package
            if package and handlers.get_current_user() not in package.uploaders:
                handlers.http_error(403, "You aren't an uploader for package '%s'." % package.name)
            elif not handlers.is_current_user_admin():
                handlers.http_error(403, "Only admins may create packages.")

            try:
                with closing(cloud_storage.read("tmp/" + id)) as f:
                    version = PackageVersion.from_archive(f, uploader=handlers.get_current_user())
            except (KeyError, files.ExistenceError):
                handlers.http_error(403, "Package upload " + id + " does not exist.")

            if version.package.is_saved():
                if handlers.get_current_user() not in version.package.uploaders:
                    handlers.http_error(403, "You aren't an uploader for package '%s'." % version.package.name)
                elif version.package.has_version(version.version):
                    message = 'Package "%s" already has version "%s".' % (version.package.name, version.version)
                    if is_json:
                        handlers.http_error(400, message)

                    handlers.flash(message)
                    url = handlers.request().url(action="new", package_id=version.package.name)
                    raise cherrypy.HTTPRedirect(url)

                if self._should_update_latest_version(version):
                    version.package.latest_version = version
            else:
                version.package.latest_version = version

            cloud_storage.modify_object(version.storage_path, acl="public-read", copy_source="tmp/" + id)

            with models.transaction():
                version.package.put()
                version.put()

            deferred.defer(self._compute_version_order, version.package.name)

            message = "%s %s uploaded successfully." % (version.package.name, version.version)
            if is_json:
                return handlers.json_success(message)

            handlers.flash(message)
            raise cherrypy.HTTPRedirect("/packages/%s" % version.package.name)
        finally:
            cloud_storage.delete_object("tmp/" + id)