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))
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))
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))
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))
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))
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)
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)
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))
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))
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))
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)