def new_comment(request): """ Add a new comment to an update. """ data = request.validated # This has already been validated at this point, but we need to ditch # it since the models don't care about a csrf argument. data.pop('csrf_token') update = data.pop('update') email = data.pop('email', None) author = email or (request.user and request.user.name) anonymous = bool(email) or not author if not author: request.errors.add('body', 'email', 'You must provide an author') request.errors.status = HTTPBadRequest.code return try: comment, caveats = update.comment(session=request.db, author=author, anonymous=anonymous, **data) except Exception as e: log.exception(e) request.errors.add('body', 'comment', 'Unable to create comment') return return dict(comment=comment, caveats=caveats)
def set_request(request): """Sets a specific :class:`bodhi.models.UpdateRequest` on a given update""" update = request.validated['update'] action = request.validated['request'] if update.locked: request.errors.add('body', 'request', "Can't change request on a locked update") return if action is UpdateRequest.stable: settings = request.registry.settings result, reason = update.check_requirements(request.db, settings) if not result: request.errors.add('body', 'request', 'Requirement not met %s' % reason) return try: update.set_request(action, request.user.name) except BodhiException as e: log.exception("Failed to set the request") request.errors.add('body', 'request', str(e)) except Exception as e: log.exception("Unhandled exception in set_request") request.errors.add('body', 'request', str(e)) return dict(update=update)
def set_request(request): """Sets a specific :class:`bodhi.models.UpdateRequest` on a given update""" update = request.validated['update'] action = request.validated['request'] if update.locked: request.errors.add('body', 'request', "Can't change request on a locked update") return if update.release.state is ReleaseState.archived: request.errors.add('body', 'request', "Can't change request for an archived release") return if action is UpdateRequest.stable: settings = request.registry.settings result, reason = update.check_requirements(request.db, settings) if not result: request.errors.add('body', 'request', 'Requirement not met %s' % reason) return try: update.set_request(request.db, action, request.user.name) except BodhiException as e: log.exception("Failed to set the request") request.errors.add('body', 'request', str(e)) except Exception as e: log.exception("Unhandled exception in set_request") request.errors.add('body', 'request', str(e)) return dict(update=update)
def new_comment(request): """ Add a new comment to an update. """ data = request.validated # This has already been validated at this point, but we need to ditch # it since the models don't care about a csrf argument. data.pop('csrf_token') update = data.pop('update') email = data.pop('email', None) author = email or (request.user and request.user.name) anonymous = bool(email) or not author if not author: request.errors.add('body', 'email', 'You must provide an author') request.errors.status = HTTPBadRequest.code return try: comment, caveats = update.comment( session=request.db, author=author, anonymous=anonymous, **data) except Exception as e: log.exception(e) request.errors.add('body', 'comment', 'Unable to create comment') return return dict(comment=comment, caveats=caveats)
def expire_buildroot_overrides(self): """ Expire any buildroot overrides that are in this push """ for update in self.updates: if update.request is UpdateRequest.stable: for build in update.builds: if build.override: try: build.override.expire() except: log.exception('Problem expiring override')
def save_release(request): """Save a release This entails either creating a new release, or editing an existing one. To edit an existing release, the release's original name must be specified in the ``edited`` parameter. """ data = request.validated edited = data.pop("edited", None) # This has already been validated at this point, but we need to ditch # it since the models don't care about a csrf argument. data.pop('csrf_token') try: if edited is None: log.info("Creating a new release: %s" % data['name']) r = Release(**data) else: log.info("Editing release: %s" % edited) r = request.db.query(Release).filter(Release.name==edited).one() for k, v in data.items(): setattr(r, k, v) except Exception as e: log.exception(e) request.errors.add('body', 'release', 'Unable to create update: %s' % e) return request.db.add(r) request.db.flush() return r
def exception_view(exc, request): """ A generic error page handler (404s, 403s, 500s, etc..) This is here to catch everything that isn't caught by our cornice error handlers. When we do catch something, we transform it intpu a cornice Errors object and pass it to our nice cornice error handler. That way, all the exception presentation and rendering we can keep in one place. """ errors = getattr(request, 'errors', []) status = getattr(exc, 'status_code', 500) if status not in (404, 403): log.exception("Error caught. Handling HTML response.") else: log.warn(str(exc)) if not len(errors): description = getattr(exc, 'explanation', None) or str(exc) errors = cornice.errors.Errors(request, status=status) errors.add('unknown', description=description) return bodhi.services.errors.html_handler(errors)
def new_update(request): """ Save an update. This entails either creating a new update, or editing an existing one. To edit an existing update, the update's original title must be specified in the ``edited`` parameter. """ data = request.validated log.debug('validated = %s' % data) # This has already been validated at this point, but we need to ditch # it since the models don't care about a csrf argument. data.pop('csrf_token') caveats = [] try: releases = set() builds = [] # Create the Package and Build entities for nvr in data['builds']: name, version, release = request.buildinfo[nvr]['nvr'] package = request.db.query(Package).filter_by(name=name).first() if not package: package = Package(name=name) request.db.add(package) request.db.flush() build = Build.get(nvr, request.db) if build is None: log.debug("Adding nvr %s", nvr) build = Build(nvr=nvr, package=package) request.db.add(build) request.db.flush() build.package = package build.release = request.buildinfo[build.nvr]['release'] builds.append(build) releases.add(request.buildinfo[build.nvr]['release']) if data.get('edited'): log.info('Editing update: %s' % data['edited']) assert len(releases) == 1, "Updates may not span multiple releases" data['release'] = list(releases)[0] data['builds'] = [b.nvr for b in builds] result, _caveats = Update.edit(request, data) caveats.extend(_caveats) else: if len(releases) > 1: caveats.append({ 'name': 'releases', 'description': 'Your update is being split ' 'into %i, one for each release.' % len(releases) }) updates = [] for release in releases: _data = copy.copy(data) # Copy it because .new(..) mutates it _data['builds'] = [b for b in builds if b.release == release] _data['release'] = release log.info('Creating new update: %r' % _data['builds']) result, _caveats = Update.new(request, _data) log.debug('%s update created', result.title) updates.append(result) caveats.extend(_caveats) if len(releases) > 1: result = dict(updates=updates) except LockedUpdateException as e: log.warn(str(e)) request.errors.add('body', 'builds', "%s" % str(e)) return except Exception as e: log.exception('Failed to create update') request.errors.add('body', 'builds', 'Unable to create update. %s' % str(e)) return # Obsolete older updates for three different cases... # editing an update, submitting a new single update, submitting multiple. if isinstance(result, dict): updates = result['updates'] else: updates = [result] for update in updates: try: caveats.extend(update.obsolete_older_updates(request.db)) except Exception as e: caveats.append({ 'name': 'update', 'description': 'Problem obsoleting older updates: %s' % str(e), }) if not isinstance(result, dict): result = result.__json__() result['caveats'] = caveats return result
def save_override(request): """Save a buildroot override This entails either creating a new buildroot override, or editing an existing one. To edit an existing buildroot override, the buildroot override's original id needs to be specified in the ``edited`` parameter. """ data = request.validated edited = data.pop("edited") caveats = [] try: submitter = User.get(request.user.name, request.db) if edited is None: builds = data['builds'] overrides = [] if len(builds) > 1: caveats.append({ 'name': 'nvrs', 'description': 'Your override submission was ' 'split into %i.' % len(builds) }) for build in builds: log.info("Creating a new buildroot override: %s" % build.nvr) if BuildrootOverride.get(build.id, request.db): request.errors.add( 'body', 'builds', 'Buildroot override for %s already exists' % build.nvr) return else: overrides.append( BuildrootOverride.new( request, build=build, submitter=submitter, notes=data['notes'], expiration_date=data['expiration_date'], )) if len(builds) > 1: result = dict(overrides=overrides) else: result = overrides[0] else: log.info("Editing buildroot override: %s" % edited) edited = Build.get(edited, request.db) if edited is None: request.errors.add('body', 'edited', 'No such build') return result = BuildrootOverride.edit( request, edited=edited, submitter=submitter, notes=data["notes"], expired=data["expired"], expiration_date=data["expiration_date"]) if not result: # Some error inside .edit(...) return except Exception as e: log.exception(e) request.errors.add('body', 'override', 'Unable to save buildroot override: %s' % e) return if not isinstance(result, dict): result = result.__json__() result['caveats'] = caveats return result
def new_update(request): """ Save an update. This entails either creating a new update, or editing an existing one. To edit an existing update, the update's original title must be specified in the ``edited`` parameter. """ data = request.validated log.debug('validated = %s' % data) # This has already been validated at this point, but we need to ditch # it since the models don't care about a csrf argument. data.pop('csrf_token') caveats = [] try: releases = set() builds = [] # Create the Package and Build entities for nvr in data['builds']: name, version, release = request.buildinfo[nvr]['nvr'] package = request.db.query(Package).filter_by(name=name).first() if not package: package = Package(name=name) request.db.add(package) request.db.flush() build = Build.get(nvr, request.db) if build is None: log.debug("Adding nvr %s", nvr) build = Build(nvr=nvr, package=package) request.db.add(build) request.db.flush() build.package = package build.release = request.buildinfo[build.nvr]['release'] builds.append(build) releases.add(request.buildinfo[build.nvr]['release']) if data.get('edited'): log.info('Editing update: %s' % data['edited']) assert len(releases) == 1, "Updates may not span multiple releases" data['release'] = list(releases)[0] data['builds'] = [b.nvr for b in builds] result, _caveats = Update.edit(request, data) caveats.extend(_caveats) else: if len(releases) > 1: caveats.append({ 'name': 'releases', 'description': 'Your update is being split ' 'into %i, one for each release.' % len(releases) }) updates = [] for release in releases: _data = copy.copy(data) # Copy it because .new(..) mutates it _data['builds'] = [b for b in builds if b.release == release] _data['release'] = release log.info('Creating new update: %r' % _data['builds']) result, _caveats = Update.new(request, _data) log.debug('update = %r' % result) updates.append(result) caveats.extend(_caveats) if len(releases) > 1: result = dict(updates=updates) except LockedUpdateException as e: log.warn(str(e)) request.errors.add('body', 'builds', "%s" % str(e)) return except Exception as e: log.exception('Failed to create update') request.errors.add( 'body', 'builds', 'Unable to create update. %s' % str(e)) return # Obsolete older updates for three different cases... # editing an update, submitting a new single update, submitting multiple. if isinstance(result, dict): updates = result['updates'] else: updates = [result] for update in updates: try: caveats.extend(update.obsolete_older_updates(request)) except Exception as e: caveats.append({ 'name': 'update', 'description': 'Problem obsoleting older updates: %s' % str(e), }) if not isinstance(result, dict): result = result.__json__() result['caveats'] = caveats return result
def save_override(request): """Save a buildroot override This entails either creating a new buildroot override, or editing an existing one. To edit an existing buildroot override, the buildroot override's original id needs to be specified in the ``edited`` parameter. """ data = request.validated edited = data.pop("edited") caveats = [] try: submitter = User.get(request.user.name, request.db) if edited is None: builds = data['builds'] overrides = [] if len(builds) > 1: caveats.append({ 'name': 'nvrs', 'description': 'Your override submission was ' 'split into %i.' % len(builds) }) for build in builds: log.info("Creating a new buildroot override: %s" % build.nvr) if BuildrootOverride.get(build.id, request.db): request.errors.add('body', 'builds', 'Buildroot override for %s already exists' % build.nvr) return else: overrides.append(BuildrootOverride.new( request, build=build, submitter=submitter, notes=data['notes'], expiration_date=data['expiration_date'], )) if len(builds) > 1: result = dict(overrides=overrides) else: result = overrides[0] else: log.info("Editing buildroot override: %s" % edited) edited = Build.get(edited, request.db) if edited is None: request.errors.add('body', 'edited', 'No such build') return result = BuildrootOverride.edit( request, edited=edited, submitter=submitter, notes=data["notes"], expired=data["expired"], expiration_date=data["expiration_date"] ) if not result: # Some error inside .edit(...) return except Exception as e: log.exception(e) request.errors.add('body', 'override', 'Unable to save buildroot override: %s' % e) return if not isinstance(result, dict): result = result.__json__() result['caveats'] = caveats return result