예제 #1
0
    def build_notifications(self):
        '''Implements EmailJobBase build_notifications method

        Returns:
            list of :py:class:`~purchasing.notifications.Notification` objects, one
            for each non-expired opportunity that has been published since the last
            Beacon newsletter was sent out
        '''
        notifications = []

        opportunities = self.get_opportunities()

        notifications.append(
            Notification(
                to_email=set([i.email for i in Vendor.newsletter_subscribers()]),
                from_email=current_app.config['BEACON_SENDER'],
                subject='Your biweekly Beacon opportunity summary',
                html_template='beacon/emails/biweeklydigest.html',
                opportunities=opportunities
            )
        )
        return notifications
예제 #2
0
파일: view_util.py 프로젝트: dobtco/beacon
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(
        'OPPSIGNUP - Vendor has signed up for opportunities: EMAIL: {email} at BUSINESS: {bis_name} signed up for:\n' +
        'OPPORTUNITY: {opportunities}'.format(
            email=form.data.get('email'),
            business_name=form.data.get('business_name'),
            opportunities=', '.join([i.title.encode('ascii', 'ignore') 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='beacon/emails/oppselected.html',
            opportunities=email_opportunities
        ).send()

    return True
예제 #3
0
파일: front.py 프로젝트: dobtco/beacon
def signup():
    '''The signup page for vendors

    :status 200: Render the
        :py:class:`~purchasing.forms.front.SignupForm`
    :status 302: Process the signup form post, redirect
        the vendor back to the splash page
    '''
    session_vendor = Vendor.query.filter(
        Vendor.email == session.get('email'),
        Vendor.business_name == session.get('business_name')
    ).first()
    form = init_form(VendorSignupForm, model=session_vendor)

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

        if vendor:
            current_app.logger.info('''
                OPPUPDATEVENDOR - Vendor updated:
                EMAIL: {old_email} -> {email} at
                BUSINESS: {old_bis} -> {bis_name} signed up for:
                CATEGORIES:
                    {old_cats} ->
                    {categories}'''.format(
                old_email=vendor.email, email=form.data['email'],
                old_bis=vendor.business_name, bis_name=form.data['business_name'],
                old_cats=[i.__unicode__() for i in vendor.categories],
                categories=[i.__unicode__() for i in form.data['categories']]
            ))

            vendor.update(
                **form.pop_categories(categories=False)
            )

            flash("You are already signed up! Your profile was updated with this new information", 'alert-info')

        else:
            current_app.logger.info(
                'OPPNEWVENDOR - New vendor signed up: EMAIL: {email} at BUSINESS: {bis_name} signed up for:\n' +
                'CATEGORIES: {categories}'.format(
                    email=form.data['email'],
                    bis_name=form.data['business_name'],
                    categories=[i.__unicode__() for i in form.data['categories']]
                )
            )

            vendor = Vendor.create(
                **form.pop_categories(categories=False)
            )

            confirmation_sent = Notification(
                to_email=vendor.email, subject='Thank you for signing up!',
                html_template='beacon/emails/signup.html',
                categories=form.data['categories']
            ).send()

            if confirmation_sent:
                admins = db.session.query(User.email).filter(
                    User.roles.any(Role.name.in_(['admin',]))
                ).all()

                Notification(
                    to_email=admins, subject='A new vendor has signed up on beacon',
                    categories=form.data['categories'],
                    vendor=form.data['email'], convert_args=True,
                    business_name=form.data['business_name']
                ).send()

                flash('Thank you for signing up! Check your email for more information', 'alert-success')

            else:
                flash('Uh oh, something went wrong. We are investigating.', 'alert-danger')

        session['email'] = form.data.get('email')
        session['business_name'] = form.data.get('business_name')
        return redirect(url_for('front.splash'))

    page_email = request.args.get('email', None)

    if page_email:
        current_app.logger.info(
            'OPPSIGNUPVIEW - User clicked through to signup with email {}'.format(page_email)
        )
        session['email'] = page_email
        return redirect(url_for('front.signup'))

    if 'email' in session:
        if not form.email.validate(form):
            session.pop('email', None)

    form.display_cleanup()

    return render_template(
        'beacon/front/signup.html', form=form,
        categories=form.get_categories(),
        subcategories=form.get_subcategories()
    )