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)
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)
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)
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' ) )
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)
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') )
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)
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)
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)
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)
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)
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)
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)
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)
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'))
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)
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)
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)