Ejemplo n.º 1
0
def invite_member_BCGV(request):
    '''
    Send email to member with link to ticketing.

    === =====================================
    URL http://app:port/invite_member/{m_id}
    === =====================================
    '''
    mid = request.matchdict['m_id']
    _m = C3sMember.get_by_id(mid)
    if isinstance(_m, NoneType):
        request.session.flash(
            'id not found. no mail sent.',
            'messages')
        return get_dashboard_redirect(request)

    # prepare a random token iff none is set
    if _m.email_invite_token_bcgv16 is None:
        _m.email_invite_token_bcgv16 = make_random_token()
    _url = (
        request.registry.settings['ticketing.url'] +
        '/lu/' + _m.email_invite_token_bcgv16 +
        '/' + _m.email)

    email_subject, email_body = make_bcga16_invitation_email(_m, _url)

    log.info("mailing event invitation to to member id %s" % _m.id)

    message = Message(
        subject=email_subject,
        sender='*****@*****.**',
        recipients=[_m.email],
        body=email_body,
        extra_headers={
            'Reply-To': '*****@*****.**',
            }
    )

    print_mail = True if 'true' in request.registry.settings[
        'testing.mail_to_console'] else False

    if print_mail:  # pragma: no cover
        print(message.body.encode('utf-8'))
    else:
        # print "sending mail"
        mailer = get_mailer(request)
        mailer.send(message)

    # _m._token = _looong_token
    _m.email_invite_flag_bcgv16 = True
    _m.email_invite_date_bcgv16 = datetime.now()
    return get_dashboard_redirect(request, _m.id)
Ejemplo n.º 2
0
def mail_mtype_fixer_link(request):
    '''
    Send email to prospective member
    to let her set her membership type details by visiting a form.

    Was needed for crowdfunders from startnext: data was missing.
    '''
    afmid = request.matchdict['afmid']
    afm = C3sMember.get_by_id(afmid)
    if isinstance(afm, NoneType):
        request.session.flash(
            'id not found. no mail sent.',
            'messages')
        return get_dashboard_redirect(request)

    import random
    import string
    _looong_token = u''.join(
        random.choice(
            string.ascii_uppercase + string.digits) for x in range(13))
    _url = (request.registry.settings['c3smembership.url'] +
            '/mtype/' + afm.email_confirm_code +
            '/' + _looong_token + '/' + afm.email)

    from .mail_mtype_util import make_mtype_email_body
    _body = make_mtype_email_body(afm, _url)

    log.info("mailing membership status form link to AFM # %s" % afm.id)

    if afm.locale == 'de':
        _subject = u'[C3S] Hilfe benötigt: Dein Mitgliedschaftsstatus'
    else:
        _subject = u'[C3S] Help needed: Your Membership Status'

    message = Message(
        subject=_subject,
        sender='*****@*****.**',
        recipients=[
            afm.email,
            request.registry.settings['c3smembership.mailaddr']],
        body=_body
    )
    mailer = get_mailer(request)
    mailer.send(message)
    afm.mtype_confirm_token = _looong_token
    afm.mtype_email_date = datetime.now()
    afm.membership_type = u'pending'
    return get_dashboard_redirect(request, afm.id)
Ejemplo n.º 3
0
def regenerate_pdf(request):
    """
    Staffers can regenerate an applicants PDF and send it to her.
    """
    code = request.matchdict['code']
    member = C3sMember.get_by_code(code)

    if member is None:
        return get_dashboard_redirect(request)
    appstruct = {
        'firstname': member.firstname,
        'lastname': member.lastname,
        'address1': member.address1,
        'address2': member.address2,
        'postcode': member.postcode,
        'city': member.city,
        'email': member.email,
        'email_confirm_code': member.email_confirm_code,
        'country': member.country,
        '_LOCALE_': member.locale,
        'membership_type': member.membership_type,
        'num_shares': member.num_shares,
        'date_of_birth': member.date_of_birth,
        'date_of_submission': member.date_of_submission,
    }
    LOG.info(
        "%s regenerated the PDF for code %s",
        authenticated_userid(request),
        code)
    return generate_pdf(appstruct)
Ejemplo n.º 4
0
def switch_sig(request):
    """
    This view lets accountants switch an applications signature status
    once their signature has arrived.

    Note:
        Expects the object request.registry.membership_application to implement
        c3smembership.business.membership_application.IMembershipApplication.
    """
    member_id = request.matchdict['memberid']

    membership_application = request.registry.membership_application
    signature_received = membership_application.get_signature_status(member_id)
    new_signature_received = not signature_received
    membership_application.set_signature_status(
        member_id,
        new_signature_received)

    LOG.info(
        "signature status of member.id %s changed by %s to %s",
        member_id,
        request.user.login,
        new_signature_received
    )

    if 'dashboard' in request.referrer:
        return get_dashboard_redirect(request, member_id)
    else:
        return HTTPFound(
            request.route_url(
                'detail',
                memberid=member_id,
                _anchor='membership_info'
            )
        )
Ejemplo n.º 5
0
def mail_payment_reminder(request):
    """
    Send a mail to a membership applicant
    reminding her about lack of **payment**.
    Headquarters is still waiting for the **bank transfer**.

    This view can only be used by staff.

    To be approved for membership applicants have to

    * **Transfer money** for the shares to acquire (at least one share).
    * Send the signed form back to headquarters.
    """
    member = request.registry.member_information.get_member_by_id(
        request.matchdict['memberid'])

    email_subject, email_body = make_payment_reminder_email(member)
    message = Message(subject=email_subject,
                      sender='*****@*****.**',
                      recipients=[member.email],
                      body=email_body)
    send_message(request, message)

    try:  # if value is int
        member.sent_payment_reminder += 1
    except TypeError:  # pragma: no cover
        # if value was None (after migration of DB schema)
        member.sent_payment_reminder = 1
    member.sent_payment_reminder_date = datetime.now()
    if 'detail' in request.referrer:
        return HTTPFound(
            request.route_url('detail',
                              memberid=request.matchdict['memberid']))
    else:
        return get_dashboard_redirect(request, member.id)
Ejemplo n.º 6
0
def switch_pay(request):
    """
    This view lets accountants switch a member applications payment status
    once their payment has arrived.
    """
    member_id = request.matchdict['memberid']

    membership_application = request.registry.membership_application
    payment_received = membership_application.get_payment_status(member_id)
    new_payment_received = not payment_received
    membership_application.set_payment_status(
        member_id,
        new_payment_received)

    LOG.info(
        "payment info of member.id %s changed by %s to %s",
        member_id,
        request.user.login,
        new_payment_received
    )
    if 'dashboard' in request.referrer:
        return get_dashboard_redirect(request, member_id)
    else:
        return HTTPFound(
            request.route_url(
                'detail',
                memberid=member_id,
                _anchor='membership_info')
        )
Ejemplo n.º 7
0
def regenerate_pdf(request):
    """
    Staffers can regenerate an applicants PDF and send it to her.
    """
    code = request.matchdict['code']
    member = C3sMember.get_by_code(code)

    if member is None:
        return get_dashboard_redirect(request)
    membership_application = request.registry.membership_application.get(
        member.id)

    appstruct = {
        'firstname': member.firstname,
        'lastname': member.lastname,
        'address1': member.address1,
        'address2': member.address2,
        'postcode': member.postcode,
        'city': member.city,
        'email': member.email,
        'email_confirm_code': membership_application['payment_token'],
        'country': member.country,
        'locale': member.locale,
        'membership_type': membership_application['membership_type'],
        'num_shares': membership_application['shares_quantity'],
        'date_of_birth': member.date_of_birth,
        'date_of_submission': membership_application['date_of_submission'],
    }
    LOG.info("%s regenerated the PDF for code %s",
             authenticated_userid(request), code)
    return generate_pdf(appstruct)
Ejemplo n.º 8
0
def switch_sig(request):
    """
    This view lets accountants switch an applications signature status
    once their signature has arrived.

    Note:
        Expects the object request.registry.membership_application to implement
    """
    member_id = request.matchdict['memberid']

    membership_application = request.registry.membership_application
    signature_received = membership_application.get_signature_status(member_id)
    new_signature_received = not signature_received
    membership_application.set_signature_status(member_id,
                                                new_signature_received)

    LOG.info("signature status of member.id %s changed by %s to %s", member_id,
             request.user.login, new_signature_received)

    if 'dashboard' in request.referrer:
        return get_dashboard_redirect(request, member_id)
    else:
        return HTTPFound(
            request.route_url('detail',
                              memberid=member_id,
                              _anchor='membership_info'))
def mail_payment_confirmation(request):
    """
    Send a mail to a membership applicant
    informing her about reception of payment.
    """
    member = request.registry.member_information.get_member_by_id(
        request.matchdict['member_id'])

    email_subject, email_body = make_payment_confirmation_email(member)
    message = Message(
        subject=email_subject,
        sender='*****@*****.**',
        recipients=[member.email],
        body=email_body,
    )
    send_message(request, message)

    member.payment_confirmed = True
    member.payment_confirmed_date = datetime.now()
    if 'detail' in request.referrer:
        return HTTPFound(
            request.route_url('detail',
                              memberid=request.matchdict['memberid']))
    else:
        return get_dashboard_redirect(request, member.id)
Ejemplo n.º 10
0
def mail_signature_reminder(request):
    """
    Send a mail to a membership applicant
    reminding her about lack of *signature*.
    Headquarters is still waiting for the *signed form*.

    This view can only be used by staff.

    To be approved for membership applicants have to

    * Transfer money for the shares to acquire (at least one share).
    * **Send the signed form** back to headquarters.
    """
    member_id = request.matchdict['memberid']
    member = C3sMember.get_by_id(member_id)
    if isinstance(member, NoneType):
        request.session.flash(
            'that member was not found! (id: {})'.format(member_id),
            'messages'
        )
        return get_dashboard_redirect(request, member.id)

    email_subject, email_body = make_signature_reminder_email(member)
    message = Message(
        subject=email_subject,
        sender='*****@*****.**',
        recipients=[member.email],
        body=email_body
    )
    send_message(request, message)

    try:
        member.sent_signature_reminder += 1
    except TypeError:
        # if value was None (after migration of DB schema)
        member.sent_signature_reminder = 1
    member.sent_signature_reminder_date = datetime.now()
    if 'detail' in request.referrer:
        return HTTPFound(request.route_url(
            'detail',
            memberid=request.matchdict['memberid']))
    else:
        return get_dashboard_redirect(request, member.id)
Ejemplo n.º 11
0
def mail_signature_reminder(request):
    """
    Send a mail to a membership applicant
    reminding her about lack of *signature*.
    Headquarters is still waiting for the *signed form*.

    This view can only be used by staff.

    To be approved for membership applicants have to

    * Transfer money for the shares to acquire (at least one share).
    * **Send the signed form** back to headquarters.
    """
    member_id = request.matchdict['memberid']
    member = C3sMember.get_by_id(member_id)
    if isinstance(member, NoneType):
        request.session.flash(
            'that member was not found! (id: {})'.format(member_id),
            'messages')
        return get_dashboard_redirect(request, member.id)

    email_subject, email_body = make_signature_reminder_email(member)
    message = Message(subject=email_subject,
                      sender='*****@*****.**',
                      recipients=[member.email],
                      body=email_body)
    send_message(request, message)

    try:
        member.sent_signature_reminder += 1
    except TypeError:
        # if value was None (after migration of DB schema)
        member.sent_signature_reminder = 1
    member.sent_signature_reminder_date = datetime.now()
    if 'detail' in request.referrer:
        return HTTPFound(
            request.route_url('detail',
                              memberid=request.matchdict['memberid']))
    else:
        return get_dashboard_redirect(request, member.id)
Ejemplo n.º 12
0
def accountants_login(request):
    """
    This view lets accountants log in (using a login form).

    If a person is already logged in, she is forwarded to the dashboard.
    """
    logged_in = authenticated_userid(request)

    LOG.info("login by %s", logged_in)

    if logged_in is not None:
        return get_dashboard_redirect(request)

    form = deform.Form(
        AccountantLogin(),
        buttons=[
            deform.Button('submit', _(u'Submit')),
            deform.Button('reset', _(u'Reset'))
        ],
    )

    # if the form has been used and SUBMITTED, check contents
    if 'submit' in request.POST:
        controls = request.POST.items()
        try:
            appstruct = form.validate(controls)
        except ValidationFailure, e_validation_failure:
            request.session.flash(
                _(u"Please note: There were errors, "
                  "please check the form below."),
                'message_above_form',
                allow_duplicate=False)
            return{'form': e_validation_failure.render()}

        # get user and check pw...
        login = appstruct['login']
        password = appstruct['password']

        try:
            checked = C3sStaff.check_password(login, password)
        except AttributeError:  # pragma: no cover
            checked = False
        if checked:
            LOG.info("password check for %s: good!", login)
            headers = remember(request, login)
            LOG.info("logging in %s", login)
            return HTTPFound(
                request.route_url(
                    'dashboard'),
                headers=headers)
        else:
            LOG.info("password check: failed for %s.", login)
Ejemplo n.º 13
0
def mail_signature_confirmation(request):
    """
    Send a mail to a membership applicant
    informing her about reception of signature.
    """
    member_id = request.matchdict['memberid']

    membership_application = request.registry.membership_application
    membership_application.mail_signature_confirmation(member_id, request)

    if 'detail' in request.referrer:
        return HTTPFound(request.route_url('detail', memberid=member_id))
    else:
        return get_dashboard_redirect(request, member_id)
Ejemplo n.º 14
0
def accountants_login(request):
    """
    This view lets accountants log in (using a login form).

    If a person is already logged in, she is forwarded to the dashboard.
    """
    logged_in = authenticated_userid(request)

    LOG.info("login by %s", logged_in)

    if logged_in is not None:
        return get_dashboard_redirect(request)

    form = deform.Form(
        AccountantLogin(),
        buttons=[
            deform.Button('submit', _(u'Submit')),
            deform.Button('reset', _(u'Reset'))
        ],
    )

    # if the form has been used and SUBMITTED, check contents
    if 'submit' in request.POST:
        controls = request.POST.items()
        try:
            appstruct = form.validate(controls)
        except ValidationFailure, e_validation_failure:
            request.session.flash(_(u"Please note: There were errors, "
                                    "please check the form below."),
                                  'message_above_form',
                                  allow_duplicate=False)
            return {'form': e_validation_failure.render()}

        # get user and check pw...
        login = appstruct['login']
        password = appstruct['password']

        try:
            checked = C3sStaff.check_password(login, password)
        except AttributeError:  # pragma: no cover
            checked = False
        if checked:
            LOG.info("password check for %s: good!", login)
            headers = remember(request, login)
            LOG.info("logging in %s", login)
            return HTTPFound(request.route_url('dashboard'), headers=headers)
        else:
            LOG.info("password check: failed for %s.", login)
Ejemplo n.º 15
0
def mail_signature_confirmation(request):
    """
    Send a mail to a membership applicant
    informing her about reception of signature.
    """
    member_id = request.matchdict['memberid']

    membership_application = request.registry.membership_application
    membership_application.mail_signature_confirmation(member_id, request)

    if 'detail' in request.referrer:
        return HTTPFound(request.route_url(
            'detail',
            memberid=member_id))
    else:
        return get_dashboard_redirect(request, member_id)
Ejemplo n.º 16
0
def switch_pay(request):
    """
    This view lets accountants switch a member applications payment status
    once their payment has arrived.
    """
    member_id = request.matchdict['memberid']

    membership_application = request.registry.membership_application
    payment_received = membership_application.get_payment_status(member_id)
    new_payment_received = not payment_received
    membership_application.set_payment_status(member_id, new_payment_received)

    LOG.info("payment info of member.id %s changed by %s to %s", member_id,
             request.user.login, new_payment_received)
    if 'dashboard' in request.referrer:
        return get_dashboard_redirect(request, member_id)
    else:
        return HTTPFound(
            request.route_url('detail',
                              memberid=member_id,
                              _anchor='membership_info'))
Ejemplo n.º 17
0
def mail_payment_reminder(request):
    """
    Send a mail to a membership applicant
    reminding her about lack of **payment**.
    Headquarters is still waiting for the **bank transfer**.

    This view can only be used by staff.

    To be approved for membership applicants have to

    * **Transfer money** for the shares to acquire (at least one share).
    * Send the signed form back to headquarters.
    """
    member = C3sMember.get_by_id(request.matchdict['memberid'])

    email_subject, email_body = make_payment_reminder_email(member)
    message = Message(
        subject=email_subject,
        sender='*****@*****.**',
        recipients=[member.email],
        body=email_body
    )
    send_message(request, message)

    try:  # if value is int
        member.sent_payment_reminder += 1
    except TypeError:  # pragma: no cover
        # if value was None (after migration of DB schema)
        member.sent_payment_reminder = 1
    member.sent_payment_reminder_date = datetime.now()
    if 'detail' in request.referrer:
        return HTTPFound(request.route_url(
            'detail',
            memberid=request.matchdict['memberid']))
    else:
        return get_dashboard_redirect(request, member.id)
Ejemplo n.º 18
0
def mail_payment_confirmation(request):
    """
    Send a mail to a membership applicant
    informing her about reception of payment.
    """
    member = C3sMember.get_by_id(request.matchdict['memberid'])

    email_subject, email_body = make_payment_confirmation_email(member)
    message = Message(
        subject=email_subject,
        sender='*****@*****.**',
        recipients=[member.email],
        body=email_body,
    )
    send_message(request, message)

    member.payment_confirmed = True
    member.payment_confirmed_date = datetime.now()
    if 'detail' in request.referrer:
        return HTTPFound(request.route_url(
            'detail',
            memberid=request.matchdict['memberid']))
    else:
        return get_dashboard_redirect(request, member.id)
Ejemplo n.º 19
0
def mail_mail_conf(request):
    '''
    Send email to member to confirm her email address by clicking a link.

    Needed for applications that came in solely on paper
    and were digitalized/entered into DB by staff.
    '''
    afmid = request.matchdict['memberid']
    afm = C3sMember.get_by_id(afmid)
    if isinstance(afm, NoneType):
        request.session.flash(
            'id not found. no mail sent.',
            'messages')
        return get_dashboard_redirect(request)

    import random
    import string
    _looong_token = u''.join(
        random.choice(
            string.ascii_uppercase + string.digits) for x in range(13))
    _url = (request.registry.settings['c3smembership.url'] +
            '/vae/' + afm.email_confirm_code +
            '/' + _looong_token + '/' + afm.email)

    _body = u'''[english version below]

Hallo {1} {2},

gemeinsam mit Dir freuen wir uns auf die erste Generalversammlung der C3S SCE
am 23. August, um 14:00 Uhr im Millowitsch-Theater in Köln. Details dazu
erhältst Du in Kürze in einer separaten Einladung.

Da wir die Einladungen per E-Mail verschicken werden, möchten wir Dich bitten
uns kurz zu bestätigen, dass diese E-Mail-Adresse korrekt ist und Du auf diesem
Wege erreichbar bist. Dafür brauchst Du nur den folgenden Link aufzurufen:

  {0}

Solltest Du nicht {1} {2} sein und diese Adresse nicht bei uns angegeben haben,
antworte bitte kurz auf diese E-Mail. Dann werden wir die Adresse aus unser
Datenbank streichen.

Antworte bitte ebenfalls, falls Du die E-Mail-Adresse ändern möchtest.


Viele Grüße :: Das C3S-Team

++++++++++++++++++++++++++++++++++++++++++++++++++

Hello {1} {2},

together with you we are happily awaiting the first general assembly of C3S SCE
on August 23rd, at 2 pm in the Millowitsch-Theater in Cologne. You will soon
receive the details in a separate invitation.

As we will send the invitations via email, we would like you to confirm your
email address beforehand.

Just click the following link to confirm your address:

    {0}

If you are not {1} {2} and you didn't give this email address to us, please
reply to this email with a short explanation. Then we will remove your address
from our database.

Should you want to change your email address please reply to this mail, too.

Best wishes :: The C3S Team
    '''.format(
        _url,  # {0}
        afm.firstname,  # {1}
        afm.lastname,  # {2}
    )

    log.info("mailing mail confirmation to AFM # {0}".format(afm.id))

    message = Message(
        subject=(u'[C3S] Please confirm your email address! '
                 u'/ Bitte E-Mail-Adresse bestätigen!'),
        sender='*****@*****.**',
        recipients=[afm.email],
        body=_body
    )
    mailer = get_mailer(request)
    mailer.send(message)
    afm.email_confirm_token = _looong_token
    afm.email_confirm_mail_date = datetime.now()
    return get_dashboard_redirect(request, afm.id)