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, 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.request().error( 403, "You aren't an uploader for package '%s'." % package.name) elif not handlers.is_current_user_admin(): handlers.request().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.request().error( 403, "Package upload " + id + " does not exist.") if version.package.is_saved(): if handlers.get_current_user() not in version.package.uploaders: handlers.request().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.json_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: cherrypy.response.headers['Content-Type'] = 'application/json' return json.dumps({"success": {"message": message}}) handlers.flash(message) raise cherrypy.HTTPRedirect('/packages/%s' % version.package.name) finally: cloud_storage.delete_object('tmp/' + id)
def _remove_tmp_package(self, id): """Try to remove an orphaned package upload.""" try: cloud_storage.delete_object("tmp/" + id) except: logging.error('Error deleting temporary object ' + id)