def take_back_application(project_id, activity_id): """Take back a volunteering application on a particular activity.""" project = Project.query.get_or_404(project_id) activity = Activity.query.get_or_404(activity_id) if activity.internal: abort(404) if activity.project != project: abort(400, {'message': 'The specified project and activity are unrelated.'}) application = Application.query.filter_by(activity_id=activity_id, applicant=current_user).one_or_none() if application is None: abort(400, {'message': 'No application exists for this activity.'}) if project.lifetime_stage != LifetimeStage.ongoing: abort(400, {'message': 'Applications may only be taken back from ongoing projects.'}) db.session.delete(application) try: db.session.commit() remove_notifications({ 'application_id': application.id, }) except IntegrityError as err: db.session.rollback() log.exception(err) abort(400, {'message': 'Data integrity violated.'}) return NO_PAYLOAD
def delete(self, product_id): """Delete the product.""" product = Product.query.get_or_404(product_id) try: db.session.delete(product) db.session.commit() except IntegrityError as err: db.session.rollback() log.exception(err) abort(400, {'message': 'Data integrity violated.'}) remove_notifications({ 'product_id': product_id, }) return NO_PAYLOAD
def delete(self, project_id): """Delete the project entirely.""" project = Project.query.get_or_404(project_id) if not current_user.is_admin and current_user != project.creator: abort(401) if project.lifetime_stage == LifetimeStage.finished: abort(400, {'message': 'Cannot delete a finished project'}) try: db.session.delete(project) db.session.commit() except IntegrityError as err: db.session.rollback() log.exception(err) abort(400, {'message': 'Data integrity violated.'}) remove_notifications({ 'project_id': project_id, }) return NO_PAYLOAD
def edit_purchase_status(stock_change_id): """Edit the status of a particular purchase.""" try: status = getattr(StockChangeStatus, request.json['status']) except (KeyError, AttributeError): abort(400, {'message': 'A valid stock change status must be specified.'}) stock_change = StockChange.query.get_or_404(stock_change_id) if stock_change.status != status: variety = Variety.query.get(stock_change.variety_id) product = variety.product if status == StockChangeStatus.rejected: db.session.delete(stock_change.transaction) remove_notifications({ 'transaction_id': stock_change.transaction.id, }) elif stock_change.status == StockChangeStatus.rejected: new_transaction = Transaction(account=stock_change.account, change=product.price * stock_change.amount, stock_change_id=stock_change.id) stock_change.transaction = new_transaction db.session.add(new_transaction) stock_change.status = status notify( stock_change.account_email, NotificationType.purchase_status_changed, { 'stock_change_id': stock_change.id, 'product_id': product.id, 'variety_id': variety.id, }) try: db.session.commit() except IntegrityError as err: db.session.rollback() log.exception(err) abort(400, {'message': 'Data integrity violated.'}) return NO_PAYLOAD
def delete(self, product_id, variety_id): """Delete the variety.""" product = Product.query.get_or_404(product_id) variety = Variety.query.get_or_404(variety_id) if variety.product != product: abort(400, { 'message': 'The specified product and variety are unrelated.' }) if len(product.varieties) <= 1: abort(400, {'message': 'Cannot leave the product without varieties.'}) try: db.session.delete(variety) db.session.commit() except IntegrityError as err: db.session.rollback() log.exception(err) abort(400, {'message': 'Data integrity violated.'}) remove_notifications({ 'variety_id': variety_id, }) return NO_PAYLOAD
def delete(self, project_id, activity_id): """Delete the activity.""" project = Project.query.get_or_404(project_id) if not current_user.is_admin and current_user not in project.moderators: abort(403) if project.lifetime_stage not in (LifetimeStage.draft, LifetimeStage.ongoing): abort( 400, { 'message': 'Activities may only be deleted on draft and ongoing projects.' }) activity = Activity.query.get_or_404(activity_id) if activity.internal: abort(404) if activity.project != project: abort(400, { 'message': 'The specified project and activity are unrelated.' }) db.session.delete(activity) try: db.session.commit() remove_notifications({ 'activity_id': activity_id, }) except IntegrityError as err: db.session.rollback() log.exception(err) abort(400, {'message': 'Data integrity violated.'}) return NO_PAYLOAD