Пример #1
0
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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
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
Пример #5
0
    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
Пример #6
0
    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