Exemplo n.º 1
0
def signup_for_opp(form, opportunity, multi=False):
    '''Sign a vendor up for an opportunity

    Generic helper method to handle subscriptions from both the list view
    (signing up form multiple opportunities) and the detail view (signing
    up for a single opportunity). Responsible for creation of new Vendor
    objects if necessary, and sending emails based on the opportunities
    selected to receive updates about.

    Arguments:
        form: The relevant subscription form
        opportunity: Either an opportunity model or a list of opportunity ids
        multi: A boolean to flag if there are multiple opportunities that should
            to subscribe to or a single opportunity

    Returns:
        True if email sent successfully, false otherwise
    '''
    send_email = True
    email_opportunities = []
    if opportunity is None or (isinstance(opportunity, list)
                               and len(opportunity) == 0):
        form.errors['opportunities'] = [
            'You must select at least one opportunity!'
        ]
        return False
    # add the email/business name to the session
    session['email'] = form.data.get('email')
    session['business_name'] = form.data.get('business_name')
    # subscribe the vendor to the opportunity
    vendor = Vendor.query.filter(
        Vendor.email == form.data.get('email')).first()

    if vendor is None:
        vendor = Vendor(email=form.data.get('email'),
                        business_name=form.data.get('business_name'))
        db.session.add(vendor)
        db.session.commit()
    else:
        vendor.update(business_name=form.data.get('business_name'))

    if multi:
        for opp in opportunity:
            _opp = Opportunity.query.get(int(opp))
            if not _opp.is_public:
                db.session.rollback()
                form.errors['opportunities'] = ['That\'s not a valid choice.']
                return False
            if _opp in vendor.opportunities:
                send_email = False
            else:
                vendor.opportunities.add(_opp)
                email_opportunities.append(_opp)
    else:
        if opportunity in vendor.opportunities:
            send_email = False
        else:
            vendor.opportunities.add(opportunity)
            email_opportunities.append(opportunity)

    if form.data.get('also_categories'):
        # TODO -- add support for categories
        pass

    db.session.commit()

    current_app.logger.info(
        u'OPPSIGNUP - Vendor has signed up for opportunities: EMAIL: {email} at BUSINESS: {bis_name} signed up for:\n'
        + u'OPPORTUNITY: {opportunities}'.format(
            email=form.data.get('email'),
            business_name=form.data.get('business_name'),
            opportunities=', '.join([i.title for i in email_opportunities])))

    if send_email:
        Notification(to_email=vendor.email,
                     from_email=current_app.config['BEACON_SENDER'],
                     subject='Subscription confirmation from Beacon',
                     html_template='opportunities/emails/oppselected.html',
                     txt_template='opportunities/emails/oppselected.txt',
                     opportunities=email_opportunities).send()

    return True
Exemplo n.º 2
0
def manage():
    '''Manage a vendor's signups

    :status 200: render the
        :py:class:`~purchasing.opportunities.forms.UnsubscribeForm`
    :status 302: post the
        :py:class:`~purchasing.opportunities.forms.UnsubscribeForm`
        and change the user's email subscriptions and redirect them
        back to the management page.
    '''
    form = init_form(UnsubscribeForm)
    form_categories = []
    form_opportunities = []
    vendor = None

    if form.validate_on_submit():
        email = form.data.get('email')
        vendor = Vendor.query.filter(Vendor.email == email).first()

        if vendor is None:
            current_app.logger.info(
                'OPPMANAGEVIEW - Unsuccessful search for email {}'.format(
                    email))
            form.email.errors = [
                'We could not find the email {}'.format(email)
            ]

        if request.form.get('button',
                            '').lower() == 'update email preferences':
            remove_categories = set(
                [Category.query.get(i) for i in form.categories.data])
            remove_opportunities = set(
                [Opportunity.query.get(i) for i in form.opportunities.data])

            # remove none types if any
            remove_categories.discard(None)
            remove_opportunities.discard(None)

            vendor.categories = vendor.categories.difference(remove_categories)
            vendor.opportunities = vendor.opportunities.difference(
                remove_opportunities)
            if form.data.get('subscribed_to_newsletter'):
                vendor.subscribed_to_newsletter = False

            current_app.logger.info(
                u'''OPPMANAGEVIEW - Vendor {} unsubscribed from:
                Categories: {}
                Opportunities: {}
                Subscribed from newsletter: {}
                '''.format(
                    email, u', '.join([
                        i.category_friendly_name for i in remove_categories
                        if remove_categories and len(remove_categories) > 0
                    ]), u', '.join([
                        i.description for i in remove_opportunities if
                        remove_opportunities and len(remove_opportunities) > 0
                    ]), vendor.subscribed_to_newsletter))

            db.session.commit()
            flash('Preferences updated!', 'alert-success')

        if vendor:
            for subscription in vendor.categories:
                form_categories.append(
                    (subscription.id, subscription.category_friendly_name))
            for subscription in vendor.opportunities:
                form_opportunities.append(
                    (subscription.id, subscription.title))

    form = init_form(UnsubscribeForm)
    form.opportunities.choices = form_opportunities
    form.categories.choices = form_categories
    return render_template('opportunities/front/manage.html',
                           form=form,
                           vendor=vendor if vendor else Vendor())