def test__accountant_mail(self): """ test the preparation function used for mail to accountants """ from speedfunding.utils import accountant_mail _item = Speedfundings.get_by_id(1) result = accountant_mail(_item) self.assertIsNotNone(_item) self.assertIsInstance(result, Message) self.assertTrue(u'BEGIN' in result.body) print(result)
def shirt_view(request): """ this view is the default view: the speedfunding form """ DEBUG = True if 'paypal' in request.params: #print("paypal option") request.session.pop_flash('message_above_form') return { 'form': '', # if paypal was chosen, don't show the form 'paypal': True} # but the paypal button (see templates/shirt.pt) else: paypal = False #print("DEBUG: paypal in shirt_view is %s" % paypal) if hasattr(request, '_REDIRECT_'): _query = request._REDIRECT_ request.response.set_cookie('_LOCALE_', _query) request._LOCALE_ = locale_name = _query return HTTPFound(location=request.route_url('speedfund'), headers=request.response.headers) else: locale_name = get_locale_name(request) # set default of Country select widget according to locale LOCALE_COUNTRY_MAPPING = { 'de': 'DE', #'da': 'DK', 'en': 'GB', #'es': 'ES', #'fr': 'FR', } country_default = LOCALE_COUNTRY_MAPPING.get(locale_name) if DEBUG: # pragma: no cover print("== locale is :" + str(locale_name)) print("== choosing :" + str(country_default)) # declare a form class TShirt(colander.MappingSchema): """ what size and fit for the shirt? """ shirt_option = colander.SchemaNode( colander.String(), title=_(u"I want to support the C3S by wearing my own t-shirt! " "Here's my choice:"), #widget=deform.widget.RadioChoiceWidget( # widget=deform.widget.SelectSliderWidget( widget=deform.widget.Select2Widget( values=( (u'S', _(u'S €35,00 EUR')), (u'M', _(u'M €35,00 EUR')), (u'L', _(u'L €35,00 EUR')), (u'XL', _(u'XL €35,00 EUR')), (u'XXL', _(u'XXL €35,00 EUR')), (u'S (Ladyfit)', _(u'S (Ladyfit) €35,00 EUR')), (u'M (Ladyfit)', _(u'M (Ladyfit) €35,00 EUR')), (u'L (Ladyfit)', _(u'L (Ladyfit) €35,00 EUR')), (u'XL (Ladyfit)', _(u'XL (Ladyfit) €35,00 EUR')), (u'XXL (Ladyfit)', _(u'XXL (Ladyfit) €35,00 EUR')), ) ) ) class PersonalData(colander.MappingSchema): """ people who want a shirt need to give us some address information """ firstname = colander.SchemaNode( colander.String(), widget=deform.widget.TextInputWidget( css_class='deformWidgetWithStyle'), title=_(u'First Name') ) lastname = colander.SchemaNode( colander.String(), title=_(u"Last Name") ) email = colander.SchemaNode( colander.String(), validator=colander.Email(), title=_(u"Email (just in case we need to check back with you)") ) address1 = colander.SchemaNode( colander.String(), title=_(u'Address Line 1') ) address2 = colander.SchemaNode( colander.String(), missing=unicode(''), title=_(u"Address Line 2") ) postcode = colander.SchemaNode( colander.String(), title=_(u'Zip Code'), oid="postcode" ) city = colander.SchemaNode( colander.String(), title=_(u'City'), oid="city", ) country = colander.SchemaNode( colander.String(), title=_(u'Country'), default=country_default, widget=deform.widget.SelectWidget( values=country_codes), oid="country", ) class TShirtForm(colander.Schema): """ the shirt form comprises shirt option and personal data """ shirt_data = TShirt( title=_(u'Choose a Shirt') ) personalData = PersonalData( title=_('Personal Data') ) schema = TShirtForm() form = deform.Form( schema, buttons=[ deform.Button('order_shirt', _(u'Yes, I want this T-Shirt!')), deform.Button('go_back', _(u'Go back, let me start over again.')), ], renderer=zpt_renderer) # if the form has been used and SUBMITTED, check contents submitted = (('order_shirt' in request.POST) or ('go_back' in request.POST)) if not submitted: request.session.pop_flash('message_above_form') if submitted: if ('go_back' in request.POST): return HTTPFound( location=request.route_url('speedfund'), ) controls = request.POST.items() try: appstruct = form.validate(controls) #print("the form validated!") # XXX TODO: persist _shirt = Speedfundings( firstname=appstruct['personalData']['firstname'], lastname=appstruct['personalData']['lastname'], email=appstruct['personalData']['email'], address1=appstruct['personalData']['address1'], address2=appstruct['personalData']['address2'], postcode=appstruct['personalData']['postcode'], city=appstruct['personalData']['city'], country=appstruct['personalData']['country'], locale=locale_name, donation='', shirt_size=appstruct['shirt_data']['shirt_option'], comment='', ) # persist try: DBSession.add(_shirt) DBSession.flush() except: print("failed to persist") # mail out message = Message( subject=_("[fund C3S!] thank you for choosing a shirt!"), sender="*****@*****.**", recipients=[_shirt.email], body=make_shirt_confirmation_emailbody(_shirt) ) mailer = get_mailer(request) mailer.send(message) mailer.send(accountant_mail(_shirt)) print("message sent!") except deform.ValidationFailure, e: print(e) request.session.flash( _(u"Please note: There were errors, " "please check the form below."), 'message_above_form', allow_duplicate=False) # if there were errors, present the form with error messages #print("DEBUG: paypal in shirt_view is %s" % paypal) return{'form': e.render(), 'paypal': paypal} # if the form validated correctly, use the data given #print("the appstruct: %s" % appstruct) request.session.pop_flash() # delete old error messages return HTTPFound( location=request.route_url('success'), # XXX transport info there )
def donate_view(request): """ this view handles donations """ DEBUG = False if hasattr(request, '_REDIRECT_'): _query = request._REDIRECT_ request.response.set_cookie('_LOCALE_', _query) request._LOCALE_ = locale_name = _query return HTTPFound(location=request.route_url('speedfund'), headers=request.response.headers) else: locale_name = get_locale_name(request) #if hasattr(request, '_paypal'): # print("hasattr(request, '_paypal') !!!") #import pdb;pdb.set_trace() # set default of Country select widget according to locale LOCALE_COUNTRY_MAPPING = { 'de': 'DE', #'da': 'DK', 'en': 'GB', #'es': 'ES', #'fr': 'FR', } if 'paypal' in request.params: request.session.pop_flash('message_above_form') return { 'form': '', # if paypal was chosen, don't show the form 'paypal': True} # but the paypal button (see templates/donate.pt) else: paypal = False #print("DEBUG: paypal in donate_view is %s" % paypal) country_default = LOCALE_COUNTRY_MAPPING.get(locale_name) if DEBUG: # pragma: no cover print("== locale is :" + str(locale_name)) print("== choosing :" + str(country_default)) donation_amount_choice = ( ('10', u'5000,00 €'), ('9', u'2500,00 €'), ('8', u'1000,00 €'), ('7', u'500,00 €'), ('6', u'250,00 €'), ('5', u'100,00 €'), ('4', u'50,00 €'), ('3', u'25,00 €'), ('2', u'10,00 €'), ('1', u'5,00 €'), ) # declare a data set class DonationOption(colander.MappingSchema): """ a class for the donation choices in our speedfunding """ the_amount = colander.SchemaNode( colander.String(), title=_(u'I want to support C3S with my donation:'), default='1', # default: '1' ==> '5€' widget=deform.widget.SelectSliderWidget( #widget=deform.widget.SelectWidget( values=donation_amount_choice), oid="donation_choice", ) class PersonalData(colander.MappingSchema): email = colander.SchemaNode( colander.String(), title=_(u'Email'), validator=colander.Email(), oid="email", ) class DonationForm(colander.Schema): """ a donation """ donation = DonationOption( title=_('The Donation') ) #if True: personalData = PersonalData( title=_(u'Please tell us your email address in case we need ' 'to contact you:') ) # now construct the form schema from the parts above schema = DonationForm() form = deform.Form( schema, buttons=[ deform.Button('donate', _(u'Yes, I want to donate!')), deform.Button('go_back', _(u'Go back, let me start over again.')), ], renderer=zpt_renderer) # if the form has been used and SUBMITTED, check contents submitted = (('donate' in request.POST) or ('go_back' in request.POST)) if not submitted: request.session.pop_flash('message_above_form') if submitted: if ('go_back' in request.POST): return HTTPFound( location=request.route_url('speedfund'), ) controls = request.POST.items() try: appstruct = form.validate(controls) #print("the form did validate!") #print("the appstruct: %s" % appstruct) # if the form validated correctly, use the data given _donation = Speedfundings( firstname='', lastname='', email=appstruct['personalData']['email'], address1='', address2='', postcode='', city='', country='', locale=locale_name, donation=appstruct['donation']['the_amount'], shirt_size='', comment='', ) try: DBSession.add(_donation) DBSession.flush() #print("speedfunding entry was persisted.") except: print("failed to persist") #try: message = Message( subject=_("[fund C3S!] thanks for your donation!"), sender="*****@*****.**", recipients=[_donation.email, ], body=make_donation_confirmation_emailbody(_donation) ) mailer = get_mailer(request) mailer.send(message) mailer.send(accountant_mail(_donation)) #except: # print("failed to send the mail") except deform.ValidationFailure, e: print(e) request.session.flash( _(u"Please note: There were errors, " "please check the form below."), 'message_above_form', allow_duplicate=False) # if there were errors, present the form with error messages return{ 'form': e.render(), 'paypal': paypal, } #print("the appstruct: %s" % appstruct) request.session.pop_flash() # delete old error messages return HTTPFound( location=request.route_url('success'), )