def test_switch_signature_and_payment(self): # login res = self.testapp.get('/login', status=200) form = res.form form['login'] = '******' form['password'] = '******' res2 = form.submit('submit', status=302) # being logged in ... res3 = res2.follow() # have a set of headers with and without 'dashboard' in http referrer headers_dash = [('Referer', 'http://this.app/dashboard')] headers_nodash = [('Referer', 'http://this.app/dashboard')] # switch signature resD2a = self.testapp.get('/switch_sig/1', status=302, headers=headers_dash) # # # # # OFF resD2b = resD2a.follow() # we are taken to the dashboard resD2b = self.testapp.get('/detail/1', status=200) # print resD2b.body self.assertTrue("Eingang bestätigen" not in resD2b.body) resD2a = self.testapp.get('/switch_sig/1', status=302, headers=headers_nodash) # # # # # ON resD2b = resD2a.follow() # we are taken to the dashboard resD2b = self.testapp.get('/detail/1', status=200) self.assertTrue("Eingang bestätigen" in resD2b.body) # # switch payment resD3a = self.testapp.get('/switch_pay/1', status=302, headers=headers_dash) # # # # OFF resD3b = resD3a.follow() # we are taken to the dashboard resD3b = self.testapp.get('/detail/1', status=200) self.assertTrue("Zahlungseingang bestätigen" not in resD3b.body) resD3a = self.testapp.get('/switch_pay/1', status=302, headers=headers_dash) # # # # ON resD3b = resD3a.follow() # we are taken to the dashboard resD3b = self.testapp.get('/detail/1', status=200) self.assertTrue("Zahlungseingang bestätigen" in resD3b.body) # #################################################################### # delete an entry _num = C3sMember.get_number() resDel2 = self.testapp.get('/delete/1?deletion_confirmed=1', status=302) _num2 = C3sMember.get_number() self.assertTrue(int(_num2) + 1 == int(_num)) resDel3 = resDel2.follow() self.failUnless('was deleted' in resDel3.body) # finally log out ################################################## res9 = self.testapp.get('/logout', status=302) # redirects to login res10 = res9.follow() self.failUnless('login' in res10.body)
def member_list_print_view(request): """ This view produces printable HTML output, i.e. HTML without links It was used before the PDF-generating view above existed """ all_members = C3sMember.member_listing( 'lastname', how_many=C3sMember.get_number(), offset=0, order=u'asc') member_list = [] count = 0 for member in all_members: if member.is_member(): # check membership number try: assert(member.membership_number is not None) except AssertionError: if DEBUG: # pragma: no cover print u"failed at id {} lastname {}".format( member.id, member.lastname) member_list.append(member) count += 1 # sort members alphabetically import locale locale.setlocale(locale.LC_ALL, "de_DE.UTF-8") member_list.sort(key=lambda x: x.firstname, cmp=locale.strcoll) member_list.sort(key=lambda x: x.lastname, cmp=locale.strcoll) return { 'members': member_list, 'count': count, '_today': date.today(), }
def member_list_print_view(request): """ This view produces printable HTML output, i.e. HTML without links It was used before the PDF-generating view above existed """ all_members = C3sMember.member_listing( 'lastname', how_many=C3sMember.get_number(), offset=0, order=u'asc') member_list = [] count = 0 for member in all_members: if member.is_member(): # check membership number try: assert(member.membership_number is not None) except AssertionError: if DEBUG: # pragma: no cover print u"failed at id {} lastname {}".format( member.id, member.lastname) member_list.append(member) count += 1 # sort members alphabetically import locale locale.setlocale(locale.LC_ALL, "de_DE.UTF-8") member_list.sort(key=lambda x: x.firstname, cmp=locale.strcoll) member_list.sort(key=lambda x: x.lastname, cmp=locale.strcoll) return { 'members': member_list, 'count': count, '_today': date.today(), }
def stats_view(request): """ This view lets accountants view statistics: how many membership applications, real members, shares, etc. """ # countries_dict = C3sMember.get_countries_list() _cl = C3sMember.get_countries_list() _cl_sorted = _cl.items() # print "die liste: {}".format(_cl_sorted) import operator _cl_sorted.sort(key=operator.itemgetter(1), reverse=True) # print "sortiert: {}".format(_cl_sorted) share_information = request.registry.share_information return { # form submissions '_number_of_datasets': C3sMember.get_number(), 'afm_shares_unpaid': C3sMember.afm_num_shares_unpaid(), 'afm_shares_paid': C3sMember.afm_num_shares_paid(), # shares 'num_shares_members': share_information.get_share_count(), # 'num_shares_mem_norm': Shares.get_sum_norm(), # 'num_shares_mem_inv': Shares.get_sum_inv(), # memberships 'num_members_accepted': C3sMember.get_num_members_accepted(), 'num_non_accepted': C3sMember.get_num_non_accepted(), 'num_nonmember_listing': C3sMember.nonmember_listing_count(), 'num_duplicates': len(C3sMember.get_duplicates()), # 'num_empty_slots': C3sMember.get_num_empty_slots(), # normal persons vs. legal entities 'num_ms_nat_acc': C3sMember.get_num_mem_nat_acc(), 'num_ms_jur_acc': C3sMember.get_num_mem_jur_acc(), # normal vs. investing memberships 'num_ms_norm': C3sMember.get_num_mem_norm(), 'num_ms_inves': C3sMember.get_num_mem_invest(), 'num_ms_features': C3sMember.get_num_mem_other_features(), 'num_membership_lost': C3sMember.get_num_membership_lost(), # membership_numbers 'num_memnums': C3sMember.get_num_membership_numbers(), 'max_memnum': C3sMember.get_highest_membership_number(), 'next_memnum': C3sMember.get_next_free_membership_number(), # countries 'num_countries': C3sMember.get_num_countries(), 'countries_list': _cl_sorted, # key=lambda x: x[1] # ), # XXX TODO: sorte # dues stats 'dues15_stats': Dues15Invoice.get_monthly_stats(), 'dues16_stats': Dues16Invoice.get_monthly_stats(), 'dues17_stats': Dues17Invoice.get_monthly_stats(), # staff figures 'num_staff': len(C3sStaff.get_all()) }
def stats_view(request): """ This view lets accountants view statistics: how many membership applications, real members, shares, etc. """ # countries_dict = C3sMember.get_countries_list() _cl = C3sMember.get_countries_list() _cl_sorted = _cl.items() # print "die liste: {}".format(_cl_sorted) import operator _cl_sorted.sort(key=operator.itemgetter(1), reverse=True) # print "sortiert: {}".format(_cl_sorted) return { # form submissions '_number_of_datasets': C3sMember.get_number(), 'afm_shares_unpaid': C3sMember.afm_num_shares_unpaid(), 'afm_shares_paid': C3sMember.afm_num_shares_paid(), # shares # 'num_shares': C3sMember.get_total_shares(), 'num_shares_members': Shares.get_total_shares(), # 'num_shares_mem_norm': Shares.get_sum_norm(), # 'num_shares_mem_inv': Shares.get_sum_inv(), # memberships 'num_members_accepted': C3sMember.get_num_members_accepted(), 'num_non_accepted': C3sMember.get_num_non_accepted(), 'num_nonmember_listing': C3sMember.nonmember_listing_count(), 'num_duplicates': len(C3sMember.get_duplicates()), # 'num_empty_slots': C3sMember.get_num_empty_slots(), # normal persons vs. legal entities 'num_ms_nat_acc': C3sMember.get_num_mem_nat_acc(), 'num_ms_jur_acc': C3sMember.get_num_mem_jur_acc(), # normal vs. investing memberships 'num_ms_norm': C3sMember.get_num_mem_norm(), 'num_ms_inves': C3sMember.get_num_mem_invest(), 'num_ms_features': C3sMember.get_num_mem_other_features(), # membership_numbers 'num_memnums': C3sMember.get_num_membership_numbers(), 'max_memnum': C3sMember.get_highest_membership_number(), 'next_memnum': C3sMember.get_next_free_membership_number(), # countries 'num_countries': C3sMember.get_num_countries(), 'countries_list': _cl_sorted, # key=lambda x: x[1] # ), # XXX TODO: sorte # dues stats 'dues15_stats': Dues15Invoice.get_monthly_stats(), 'dues16_stats': Dues16Invoice.get_monthly_stats(), # staff figures 'num_staff': len(C3sStaff.get_all()) }
def test_add_member(self): ''' tests for the new_member view ''' # unauthorized access must be prevented res = self.testapp.reset() # delete cookie res = self.testapp.get('/new_member', status=403) assert ('Access was denied to this resource' in res.body) # so login first self._login() # no member with id=1 in DB res = self.testapp.get('/new_member?id=1', status=200) # enter valid data form = self._fill_form_valid_natural(res.form) res = form.submit(u'submit', status=302) res4 = res.follow() self.assertTrue('Details for Member Application #1' in res4.body) self.assertTrue('SomeFirstname' in res4.body) self.assertTrue('SomeLastname' in res4.body) self.assertTrue('*****@*****.**' in res4.body) self.assertTrue('addr one' in res4.body) self.assertTrue('addr two' in res4.body) self.assertTrue('12345' in res4.body) self.assertTrue('DE' in res4.body) self.assertTrue('normal' in res4.body) self.assertTrue('23' in res4.body) # now, there is a member with id=1 in DB res = self.testapp.get('/new_member?id=1', status=200) # check the number of entries in the DB self.assertEqual(C3sMember.get_number(), 1) res = self.testapp.get('/new_member', status=200) form = self._fill_form_valid_legal(res.form) res = form.submit(u'submit', status=302) res4 = res.follow() self.assertTrue('Details for Member Application #2' in res4.body) self.assertTrue('SomeLegalentity' in res4.body) self.assertTrue('SomeLegalName' in res4.body) self.assertTrue('*****@*****.**' in res4.body) self.assertTrue('addr one' in res4.body) self.assertTrue('addr two' in res4.body) self.assertTrue('12345' in res4.body) self.assertTrue('' in res4.body) self.assertTrue('DE' in res4.body) self.assertTrue('investing' in res4.body) self.assertTrue('42' in res4.body)
def export_yes_emails(request): """ export the database to a CSV file """ datasets = C3sMember.member_listing( "id", how_many=C3sMember.get_number(), order='asc') rows = [] # start with empty list for m in datasets: if m.signature_received and m.payment_received: rows.append( (m.firstname + ' ' + m.lastname + ' <' + m.email + '>',)) return { 'header': ['Vorname Nachname <*****@*****.**>', ], 'rows': rows}
def export_yes_emails(request): # pragma: no cover """ Export the members email addresses to a CSV file. XXX TODO: implement a test-case """ datasets = C3sMember.member_listing( "id", how_many=C3sMember.get_number(), order='asc') rows = [] # start with empty list for member in datasets: if member.signature_received and member.payment_received: rows.append('{firstname} {lastname} <{email}>'.format( firstname=member.firstname, lastname=member.lastname, email=member.email)) return { 'header': ['Vorname Nachname <*****@*****.**>', ], 'rows': rows}
def stats_view(request): """ This view lets accountants view statistics: how many membership applications, real members, shares, etc. """ return { # form submissions '_number_of_datasets': C3sMember.get_number(), 'afm_shares_unpaid': C3sMember.afm_num_shares_unpaid(), 'afm_shares_paid': C3sMember.afm_num_shares_paid(), # shares #'num_shares': Shares.get_total_shares(), # memberships #'num_memberships': Membership.get_number(), #'num_ms_nat': Membership.get_number(), # XXX check! #'num_ms_jur': '0', # XXX Membership.num_ms_jur(), #'num_ms_norm': Membership.num_ms_norm(), #'num_ms_inves': Membership.num_ms_invest(), # staff figures 'num_staff': len(C3sStaff.get_all()) }
def export_db(request): """ export the database to a CSV file """ datasets = C3sMember.member_listing( "id", how_many=C3sMember.get_number(), order='asc') header = ['firstname', 'lastname', 'email', 'password', 'last_password_change', 'address1', 'address2', 'postcode', 'city', 'country', 'locale', 'date_of_birth', 'email_is_confirmed', 'email_confirm_code', 'num_shares', 'date_of_submission', 'membership_type', 'member_of_colsoc', 'name_of_colsoc', 'signature_received', 'signature_received_date', 'payment_received', 'payment_received_date', 'signature_confirmed', 'signature_confirmed_date', 'payment_confirmed', 'payment_confirmed_date', 'accountant_comment', ] rows = [] # start with empty list for m in datasets: rows.append( (m.firstname, m.lastname, m.email, m.password, m.last_password_change, m.address1, m.address2, m.postcode, m.city, m.country, m.locale, m.date_of_birth, m.email_is_confirmed, m.email_confirm_code, m.num_shares, m.date_of_submission, m.membership_type, m.member_of_colsoc, m.name_of_colsoc, m.signature_received, m.signature_received_date, m.payment_received, m.payment_received_date, m.signature_confirmed, m.signature_confirmed_date, m.payment_confirmed, m.payment_confirmed_date, m.accountant_comment) ) return { 'header': header, 'rows': rows}
def accountants_desk(request): """ This view lets accountants view applications and set their status: has their signature arrived? how about the payment? """ #logged_in = authenticated_userid(request) #log.info("dashboard view..............................................") #print("---- authenticated_userid: " + str(logged_in)) # this following stanza is overridden by the views permission settings #if logged_in is None: # not authenticated??? # return HTTPFound( # go back to login!!! # location=route_url( # 'login', # request=request), # ) _number_of_members = C3sMember.get_number() #print("We have %s members in this db." % _number_of_members) _members = C3sMember.member_listing(C3sMember.id.desc(), how_many=15) return {'_number_of_members': _number_of_members, 'members': _members}
def test_add_member(self): ''' tests for the new_member view ''' # unauthorized access must be prevented res = self.testapp.reset() # delete cookie res = self.testapp.get('/new_member', status=403) assert('Access was denied to this resource' in res.body) # so login first res = self.testapp.get('/login', status=200) self.failUnless('login' in res.body) # try valid user form = res.form form['login'] = '******' form['password'] = '******' res2 = form.submit('submit', status=302) # # being logged in ... res3 = res2.follow() # being redirected to dashboard_only self.failUnless( 'Dashboard' in res3.body) # # now that we are logged in, # # the login view should redirect us to the dashboard # res5 = self.testapp.get('/login', status=302) # # so yes: that was a redirect # res6 = res5.follow() # res6 = res6.follow() # # print(res4.body) # self.failUnless( # 'Dashboard' in res6.body) # # choose number of applications shown # res6a = self.testapp.get( # '/dashboard', # status=302, # extra_environ={ # 'num_display': '30', # } # ) # res6a = res6a.follow() # no member with id=1 in DB res = self.testapp.get('/new_member?id=1', status=200) form = res.form # print form.fields form['firstname'] = u'SomeFirstname' form['lastname'] = u'SomeLastname' form['email'] = u'*****@*****.**' form['address1'] = u"addr one" form['address2'] = u"addr two" form['postcode'] = u"12345" form['city'] = u"Footown Meeh" form['country'].value__set(u"DE") form['_LOCALE_'] = u"DE" form['date_of_birth'] = '1014-01-01' # date.today(), # form['email_is_confirmed=False, # email_confirm_code=u'ABCDEFGFOO', # password=u'arandompassword', # date_of_submission=date.today(), # form['membership_type'] = u'normal', form['entity_type'].value__set(u'person') form['membership_type'].value__set(u'normal') # form['other_colsoc'] = (u'no',), form['other_colsoc'].value__set(u'no') form['name_of_colsoc'] = u"GEMA" form['num_shares'] = u'23' # try to submit the form (knowing that the date is missing) res2 = form.submit(u'submit', status=200) form2 = res2.form # set the date to a usefull/allowed value form2['date_of_birth'] = u'1999-09-19' res3 = form2.submit(u'submit', status=302) res4 = res3.follow() # print res4 self.assertTrue('Details for Member Application #1' in res4.body) # more asserts self.assertTrue('SomeFirstname' in res4.body) self.assertTrue('SomeLastname' in res4.body) self.assertTrue('*****@*****.**' in res4.body) self.assertTrue('addr one' in res4.body) self.assertTrue('addr two' in res4.body) self.assertTrue('12345' in res4.body) self.assertTrue('' in res4.body) self.assertTrue('DE' in res4.body) self.assertTrue('normal' in res4.body) self.assertTrue('23' in res4.body) # self.assertTrue('' in res3.body) # self.assertTrue('' in res3.body) # self.assertTrue('' in res3.body) # self.assertTrue('' in res3.body) # now, there is a member with id=1 in DB res = self.testapp.get('/new_member?id=1', status=200) form = res.form # print form.fields form['firstname'] = u'SomeFirstname' form['lastname'] = u'SomeLastname' form['email'] = u'*****@*****.**' form['address1'] = u"addr one" form['address2'] = u"addr two" form['postcode'] = u"12345" form['city'] = u"Footown Meeh" form['country'].value__set(u"DE") form['_LOCALE_'] = u"DE" form['date_of_birth'] = date.today() # form['email_is_confirmed=False, # email_confirm_code=u'ABCDEFGFOO', # password=u'arandompassword', # date_of_submission=date.today(), form['entity_type'] = u'person' form['membership_type'] = u'normal' # form['membership_type'].value__set(u'normal') # form['other_colsoc'] = (u'no',), form['other_colsoc'].value__set(u'no') form['name_of_colsoc'] = u"GEMA" form['num_shares'] = u'23' # try to submit the form (knowing that the date is missing) res2 = form.submit(u'submit', status=200) form2 = res2.form form2['date_of_birth'] = u'1999-09-19' res3 = form2.submit(u'submit', status=302) res4 = res3.follow() # print res4 self.assertTrue('Details for Member Application #2' in res4.body) # more asserts self.assertTrue('SomeFirstname' in res4.body) self.assertTrue('SomeLastname' in res4.body) self.assertTrue('*****@*****.**' in res4.body) self.assertTrue('addr one' in res4.body) self.assertTrue('addr two' in res4.body) self.assertTrue('12345' in res4.body) self.assertTrue('' in res4.body) self.assertTrue('DE' in res4.body) self.assertTrue('normal' in res4.body) self.assertTrue('23' in res4.body) # no member with id=1 in DB res = self.testapp.get('/new_member', status=200) form = res.form # print form.fields form['firstname'] = u'SomeFirstname' form['lastname'] = u'SomeLastname' form['email'] = u'*****@*****.**' form['address1'] = u"addr one" form['address2'] = u"addr two" form['postcode'] = u"12345" form['city'] = u"Footown Meeh" form['country'].value__set(u"DE") form['_LOCALE_'] = u"DE" form['date_of_birth'] = date.today() # form['email_is_confirmed=False, # email_confirm_code=u'ABCDEFGFOO', # password=u'arandompassword', # date_of_submission=date.today(), form['entity_type'] = u'person' form['membership_type'] = u'normal' # form['deformField14'].value__set(u'normal') # form['other_colsoc'] = (u'no',), form['other_colsoc'].value__set(u'no') form['name_of_colsoc'] = u"GEMA" form['num_shares'] = u'23' # try to submit the form (knowing that the date is missing) res2 = form.submit(u'submit', status=200) form2 = res2.form form2['date_of_birth'] = u'1999-09-19' res3 = form2.submit(u'submit', status=302) res4 = res3.follow() # print res4 self.assertTrue('Details for Member Application #3' in res4.body) # more asserts self.assertTrue('SomeFirstname' in res4.body) self.assertTrue('SomeLastname' in res4.body) self.assertTrue('*****@*****.**' in res4.body) self.assertTrue('addr one' in res4.body) self.assertTrue('addr two' in res4.body) self.assertTrue('12345' in res4.body) self.assertTrue('' in res4.body) self.assertTrue('DE' in res4.body) self.assertTrue('normal' in res4.body) self.assertTrue('23' in res4.body) # check the number of entries in the DB num = C3sMember.get_number() # print num self.assertTrue(num == 3) ''' now add a legal entity / aka Körperschaft ''' res = self.testapp.get('/new_member', status=200) form = res.form # print form.fields form['firstname'] = u'SomeLegalentity' form['lastname'] = u'SomeLegalName' form['email'] = u'*****@*****.**' form['address1'] = u"addr one" form['address2'] = u"addr two" form['postcode'] = u"12345" form['city'] = u"Footown Meeh" form['country'].value__set(u"DE") form['_LOCALE_'] = u"DE" form['date_of_birth'] = date.today() # form['email_is_confirmed=False, # email_confirm_code=u'ABCDEFGFOO', # password=u'arandompassword', # date_of_submission=date.today(), form['entity_type'] = u'legalentity' form['membership_type'] = u'investing' # form['deformField14'].value__set(u'normal') # form['other_colsoc'] = (u'no',), form['other_colsoc'].value__set(u'no') form['name_of_colsoc'] = u"" form['num_shares'] = u'42' # try to submit the form (knowing that the date is missing) res2 = form.submit(u'submit', status=200) form2 = res2.form form2['date_of_birth'] = u'1999-09-19' res3 = form2.submit(u'submit', status=302) res4 = res3.follow() # print res4 self.assertTrue('Details for Member Application #4' in res4.body) # more asserts self.assertTrue('SomeLegalentity' in res4.body) self.assertTrue('SomeLegalName' in res4.body) self.assertTrue('*****@*****.**' in res4.body) self.assertTrue('addr one' in res4.body) self.assertTrue('addr two' in res4.body) self.assertTrue('12345' in res4.body) self.assertTrue('' in res4.body) self.assertTrue('DE' in res4.body) self.assertTrue('investing' in res4.body) self.assertTrue('23' in res4.body) # check the number of entries in the DB num = C3sMember.get_number() # print num self.assertTrue(num == 4)
def export_memberships(request): # pragma: no cover """ Export the database to a CSV file. XXX TODO: implement a test-case """ _num = C3sMember.get_number() datasets = C3sMember.get_members( 'id', how_many=_num, offset=0, order=u'asc') header = [ 'firstname', 'lastname', 'email', 'address1', 'address2', 'postcode', 'city', 'country', 'locale', 'date_of_birth', # 'email_is_confirmed', 'email_confirm_code', 'membership_date', 'num_shares', # 'date_of_submission', # 'shares list (number+date)', 'membership_type', 'member_of_colsoc', 'name_of_colsoc', 'signature_received', 'signature_received_date', 'payment_received', 'payment_received_date', # 'signature_confirmed', 'signature_confirmed_date', # 'payment_confirmed', 'payment_confirmed_date', 'accountant_comment', 'is_legalentity', 'court of law', 'registration number',] rows = [] # start with empty list for member in datasets: rows.append(( member.firstname, member.lastname, member.email, member.address1, member.address2, member.postcode, member.city, member.country, member.locale, member.date_of_birth, # member.email_is_confirmed, member.email_confirm_code, member.membership_date, member.num_shares, # member.date_of_submission, # '+'.join(str(s.id)+'('+str(s.number)+')' for s in member.shares), member.membership_type, member.member_of_colsoc, member.name_of_colsoc, member.signature_received, member.signature_received_date, member.payment_received, member.payment_received_date, # member.signature_confirmed, member.signature_confirmed_date, # member.payment_confirmed, member.payment_confirmed_date, member.accountant_comment, member.is_legalentity, member.court_of_law, member.registration_number,)) return { 'header': header, 'rows': rows}
def member_list_date_pdf_view(request): """ The membership list *for a given date* for printout as PDF. The date is supplied in and parsed from the URL, e.g. http://0.0.0.0:6543/aml-2014-12-31.pdf The PDF is generated using pdflatex. If the date is not parseable, an error message is shown. """ try: _date_m = request.matchdict['date'] _date = datetime.strptime(_date_m, '%Y-%m-%d').date() except (KeyError, ValueError): request.session.flash( "Invalid date! '{}' does not compute! " "try again, please! (YYYY-MM-DD)".format( _date_m), 'message_to_user' ) return HTTPFound(request.route_url('error_page')) """ All member entries are loaded. """ # query the database _order_by = 'lastname' _num = C3sMember.get_number() _all_members = C3sMember.member_listing( _order_by, how_many=_num, offset=0, order=u'asc') # prepare variables _members = [] # the members, filtered _count_members = 0 # count those members _count_shares = 0 # count their shares _count_shares_printed = 0 # cross-check... """ ...and filtered for * active members (membership_accepted) * with membership numbers (cross-check) * who have become members before the given date. They are added to a list and counted. Their shares (those acquired before the date) are counted as well. """ # filter and count memberships and shares for item in _all_members: if ( (item.membership_number is not None) and item.is_member(_date)): # add this item to the filtered list of members _members.append(item) _count_members += 1 # also count their shares iff acquired in the timespan for share in item.shares: if (date( share.date_of_acquisition.year, share.date_of_acquisition.month, share.date_of_acquisition.day, ) <= _date): _count_shares += share.number """ The list of members is then sorted by * their given name * their last name, using locale.strcoll with german locale. This achieves a sort order like in phone books. """ # sort members alphabetically import locale locale.setlocale(locale.LC_ALL, "de_DE.UTF-8") # ...by fist name _members.sort(key=lambda x: x.firstname, cmp=locale.strcoll) # ...and then by their last name _members.sort(key=lambda x: x.lastname, cmp=locale.strcoll) """ Then a LaTeX file is constructed... """ here = os.path.dirname(__file__) latex_header_tex = os.path.abspath( os.path.join(here, '../membership_list_pdflatex/header')) latex_footer_tex = os.path.abspath( os.path.join(here, '../membership_list_pdflatex/footer')) # a temporary directory for the latex run _tempdir = tempfile.mkdtemp() # now we prepare a .tex file to be pdflatex'ed latex_file = tempfile.NamedTemporaryFile( suffix='.tex', dir=_tempdir, delete=False, # directory will be deleted anyways ) # and where to store the output pdf_file = tempfile.NamedTemporaryFile( dir=_tempdir, delete=False, # directory will be deleted anyways ) pdf_file.name = latex_file.name.replace('.tex', '.pdf') # construct latex data: header + variables latex_data = ''' \\input{%s} \\def\\numMembers{%s} \\def\\numShares{%s} \\def\\sumShares{%s} \\def\\today{%s} ''' % ( latex_header_tex, _count_members, _count_shares, _count_shares * 50, _date.strftime('%d.%m.%Y'), ) # add to the latex document latex_data += ''' \\input{%s}''' % latex_footer_tex # print '*' * 70 # print latex_data # print '*' * 70 latex_file.write(latex_data.encode('utf-8')) # make table rows per member for member in _members: _address = '''\\scriptsize{}''' _address += '''{}'''.format( unicode(TexTools.escape(member.address1)).encode('utf-8')) # check for contents of address2: if len(member.address2) > 0: _address += '''\\linebreak {}'''.format( unicode(TexTools.escape(member.address2)).encode('utf-8')) # add more... _address += ''' \\linebreak {} '''.format( unicode(TexTools.escape(member.postcode)).encode('utf-8')) _address += '''{}'''.format( unicode(TexTools.escape(member.city)).encode('utf-8')) _address += ''' ({})'''.format( unicode(TexTools.escape(member.country)).encode('utf-8')) # check shares acquired until $date _acquired_shares_until_date = 0 for share in member.shares: if date( share.date_of_acquisition.year, share.date_of_acquisition.month, share.date_of_acquisition.day) <= _date: _acquired_shares_until_date += share.number _count_shares_printed += share.number membership_loss = u'' if member.membership_loss_date is not None: membership_loss += \ member.membership_loss_date.strftime('%d.%m.%Y') + \ '\\linebreak ' if member.membership_loss_type is not None: membership_loss += member.membership_loss_type latex_file.write( ''' {0} & {1} & {2} & {3} & {4} & {5} & {6} \\\\\\hline % '''.format( TexTools.escape(member.lastname).encode('utf-8'), # 0 ' \\footnotesize ' + TexTools.escape( member.firstname).encode('utf-8'), # 1 ' \\footnotesize ' + TexTools.escape( str(member.membership_number)), # 2 _address, # 3 ' \\footnotesize ' + member.membership_date.strftime( '%d.%m.%Y'), # 4 ' \\footnotesize ' + membership_loss + ' ', # 5 ' \\footnotesize ' + str(_acquired_shares_until_date) # 6 )) latex_file.write(''' %\\end{tabular}% \\end{longtable}% \\label{LastPage} \\end{document} ''') latex_file.seek(0) # rewind # pdflatex latex_file to pdf_file fnull = open(os.devnull, 'w') # hide output pdflatex_output = subprocess.call( [ 'pdflatex', '-output-directory=%s' % _tempdir, latex_file.name ], stdout=fnull, stderr=subprocess.STDOUT # hide output ) if DEBUG: # pragma: no cover print("the output of pdflatex run: %s" % pdflatex_output) # if run was a success, run X times more... if pdflatex_output == 0: for i in range(2): pdflatex_output = subprocess.call( [ 'pdflatex', '-output-directory=%s' % _tempdir, latex_file.name ], stdout=fnull, stderr=subprocess.STDOUT # hide output ) if DEBUG: # pragma: no cover print("run #{} finished.".format(i+1)) # sanity check: did we print exactly as many shares as calculated? assert(_count_shares == _count_shares_printed) # return a pdf file response = Response(content_type='application/pdf') response.app_iter = open(pdf_file.name, "r") shutil.rmtree(_tempdir, ignore_errors=True) # delete temporary directory return response
def test_switch_signature_and_payment(self): # login res = self.testapp.get('/login', status=200) form = res.form form['login'] = '******' form['password'] = '******' res2 = form.submit('submit', status=302) # being logged in ... res3 = res2.follow() # have a set of headers with and without 'dashboard' in http referrer headers_dash = [ ('Referer', 'http://this.app/dashboard') ] headers_nodash = [ ('Referer', 'http://this.app/dashboard') ] # switch signature resD2a = self.testapp.get( '/switch_sig/1', status=302, headers=headers_dash) # # # # # OFF resD2b = resD2a.follow() # we are taken to the dashboard resD2b = self.testapp.get('/detail/1', status=200) # print resD2b.body self.assertTrue( "Eingang bestätigen" not in resD2b.body) resD2a = self.testapp.get( '/switch_sig/1', status=302, headers=headers_nodash ) # # # # # ON resD2b = resD2a.follow() # we are taken to the dashboard resD2b = self.testapp.get('/detail/1', status=200) self.assertTrue( "Eingang bestätigen" in resD2b.body) # # switch payment resD3a = self.testapp.get( '/switch_pay/1', status=302, headers=headers_dash ) # # # # OFF resD3b = resD3a.follow() # we are taken to the dashboard resD3b = self.testapp.get('/detail/1', status=200) self.assertTrue( "Zahlungseingang bestätigen" not in resD3b.body) resD3a = self.testapp.get('/switch_pay/1', status=302, headers=headers_dash) # # # # ON resD3b = resD3a.follow() # we are taken to the dashboard resD3b = self.testapp.get('/detail/1', status=200) self.assertTrue( "Zahlungseingang bestätigen" in resD3b.body) # #################################################################### # delete an entry _num = C3sMember.get_number() resDel2 = self.testapp.get( '/delete/1?deletion_confirmed=1', status=302) _num2 = C3sMember.get_number() self.assertTrue(int(_num2) + 1 == int(_num)) resDel3 = resDel2.follow() self.failUnless('was deleted' in resDel3.body) # finally log out ################################################## res9 = self.testapp.get('/logout', status=302) # redirects to login res10 = res9.follow() self.failUnless('login' in res10.body)
def accountants_desk(request): """ This view lets accountants view applications and set their status: has their signature arrived? how about the payment? """ _number_of_datasets = C3sMember.get_number() #print("request.matchdict['number']: %s" % request.matchdict['number']) try: # check if # a page number was supplied with the URL _page_to_show = int(request.matchdict['number']) #print("page to show: %s" % _page_to_show) except: _page_to_show = 0 # is it a number? yes, cast above #if not isinstance(_page_to_show, type(1)): # _page_to_show = 0 #print("_page_to_show: %s" % _page_to_show) # how many to display on one page? """ num_display determines how many items are to be shown on one page """ #print request.POST if 'num_to_show' in request.POST: #print("found it in POST") try: _num = int(request.POST['num_to_show']) if isinstance(_num, type(1)): num_display = _num except: # choose default num_display = 20 elif 'num_display' in request.cookies: #print("found it in cookie") num_display = int(request.cookies['num_display']) else: #print("setting default") num_display = request.registry.settings[ 'c3smembership.dashboard_number'] #print("num_display: %s " % num_display) """ base_offset helps us to minimize impact on the database when querying for results. we can choose just those results we need for the page to show """ #try: base_offset = int(_page_to_show) * int(num_display) #print("base offset: %s" % base_offset) #except: # base_offset = 0 # if 'base_offset' in request.session: # base_offset = request.session['base_offset'] # else: # base_offset = request.registry.settings['c3smembership.offset'] # get data sets from DB _members = C3sMember.member_listing(C3sMember.id.desc(), how_many=num_display, offset=base_offset) # calculate next-previous-navi next_page = (int(_page_to_show) + 1) if (int(_page_to_show) > 0): previous_page = int(_page_to_show) - 1 else: previous_page = int(_page_to_show) # store info about current page in cookie request.response.set_cookie('on_page', value=str(_page_to_show)) #print("num_display: %s" % num_display) request.response.set_cookie('num_display', value=str(num_display)) return { '_number_of_datasets': _number_of_datasets, 'members': _members, 'num_display': num_display, 'next': next_page, 'previous': previous_page, }
def accountants_desk(request): """ This view lets accountants view applications and set their status: has their signature arrived? how about the payment? """ _number_of_datasets = C3sMember.get_number() # print("request.matchdict['number']: %s" % request.matchdict['number']) try: # check if # a page number was supplied with the URL _page_to_show = int(request.matchdict["number"]) # print("page to show: %s" % _page_to_show) except: _page_to_show = 0 # is it a number? yes, cast above # if not isinstance(_page_to_show, type(1)): # _page_to_show = 0 # print("_page_to_show: %s" % _page_to_show) # how many to display on one page? """ num_display determines how many items are to be shown on one page """ # print request.POST if "num_to_show" in request.POST: # print("found it in POST") try: _num = int(request.POST["num_to_show"]) if isinstance(_num, type(1)): num_display = _num except: # choose default num_display = 20 elif "num_display" in request.cookies: # print("found it in cookie") num_display = int(request.cookies["num_display"]) else: # print("setting default") num_display = request.registry.settings["c3smembership.dashboard_number"] # print("num_display: %s " % num_display) """ base_offset helps us to minimize impact on the database when querying for results. we can choose just those results we need for the page to show """ # try: base_offset = int(_page_to_show) * int(num_display) # print("base offset: %s" % base_offset) # except: # base_offset = 0 # if 'base_offset' in request.session: # base_offset = request.session['base_offset'] # else: # base_offset = request.registry.settings['c3smembership.offset'] # get data sets from DB _members = C3sMember.member_listing(C3sMember.id.desc(), how_many=num_display, offset=base_offset) # calculate next-previous-navi next_page = int(_page_to_show) + 1 if int(_page_to_show) > 0: previous_page = int(_page_to_show) - 1 else: previous_page = int(_page_to_show) # store info about current page in cookie request.response.set_cookie("on_page", value=str(_page_to_show)) # print("num_display: %s" % num_display) request.response.set_cookie("num_display", value=str(num_display)) return { "_number_of_datasets": _number_of_datasets, "members": _members, "num_display": num_display, "next": next_page, "previous": previous_page, }
def accountants_desk(request): """ This view lets accountants view applications and set their status: has their signature arrived? how about the payment? """ _number_of_datasets = C3sMember.get_number() try: # check if page number, orderby and order were supplied with the URL _page_to_show = int(request.matchdict['number']) _order_by = request.matchdict['orderby'] _order = request.matchdict['order'] except: print("Using default values") _page_to_show = 0 _order_by = 'id' _order = 'asc' # check for input from "find dataset by confirm code" form if 'code_to_show' in request.POST: try: _code = request.POST['code_to_show'] log.info( "%s searched for code %s" % ( authenticated_userid(request), _code)) _entry = C3sMember.get_by_code(_code) return HTTPFound( location=request.route_url( 'detail', memberid=_entry.id) ) except: pass """ num_display determines how many items are to be shown on one page """ if 'num_to_show' in request.POST: try: _num = int(request.POST['num_to_show']) if isinstance(_num, type(1)): num_display = _num except: # choose default num_display = 20 elif 'num_display' in request.cookies: #print("found it in cookie") num_display = int(request.cookies['num_display']) else: #print("setting default") num_display = request.registry.settings[ 'c3smembership.dashboard_number'] """ base_offset helps us to minimize impact on the database when querying for results. we can choose just those results we need for the page to show """ base_offset = int(_page_to_show) * int(num_display) # get data sets from DB _members = C3sMember.member_listing( _order_by, how_many=num_display, offset=base_offset, order=_order) # calculate next-previous-navi next_page = (int(_page_to_show) + 1) if (int(_page_to_show) > 0): previous_page = int(_page_to_show) - 1 else: previous_page = int(_page_to_show) _last_page = int(math.ceil(_number_of_datasets / int(num_display))) if next_page > _last_page: next_page = _last_page # store info about current page in cookie request.response.set_cookie('on_page', value=str(_page_to_show)) request.response.set_cookie('num_display', value=str(num_display)) request.response.set_cookie('order', value=str(_order)) request.response.set_cookie('orderby', value=str(_order_by)) _message = None if 'message' in request.GET: _message = request.GET['message'] return {'_number_of_datasets': _number_of_datasets, 'members': _members, 'num_display': num_display, 'next': next_page, 'previous': previous_page, 'current': _page_to_show, 'orderby': _order_by, 'order': _order, 'message': _message, 'last_page': _last_page, 'is_last_page': _page_to_show == _last_page, 'is_first_page': _page_to_show == 0, }
def accountants_desk(request): """ This view lets accountants view applications and set their status: has their signature arrived? how about the payment? """ _number_of_datasets = C3sMember.get_number() try: # check if page number, orderby and order were supplied with the URL _page_to_show = int(request.matchdict['number']) _order_by = request.matchdict['orderby'] _order = request.matchdict['order'] except: #print("Using default values") _page_to_show = 0 _order_by = 'id' _order = 'asc' # check for input from "find dataset by confirm code" form if 'code_to_show' in request.POST: try: _code = request.POST['code_to_show'] log.info( "%s searched for code %s" % ( authenticated_userid(request), _code)) _entry = C3sMember.get_by_code(_code) return HTTPFound( location=request.route_url( 'detail', memberid=_entry.id) ) except: pass """ num_display determines how many items are to be shown on one page """ if 'num_to_show' in request.POST: try: _num = int(request.POST['num_to_show']) if isinstance(_num, type(1)): num_display = _num except: # choose default num_display = 20 elif 'num_display' in request.cookies: #print("found it in cookie") num_display = int(request.cookies['num_display']) else: #print("setting default") num_display = request.registry.settings[ 'c3smembership.dashboard_number'] ''' we use a form with autocomplete to let staff find entries faster ''' #the_codes = C3sMember.get_all_codes() #print("the codes: %s" % the_codes) class AutocompleteForm(colander.MappingSchema): code_to_show = colander.SchemaNode( colander.String(), title='Code finden (quicksearch; Groß-/Kleinschreibung beachten!)', #title='', widget=deform.widget.AutocompleteInputWidget( min_length=1, css_class="form-inline", #values=the_codes, # XXX input matching ones only values=request.route_path( 'autocomplete_input_values', traverse=('autocomplete_input_values') ) ) ) schema = AutocompleteForm() form = deform.Form( schema, css_class="form-inline", buttons=('go!',), ) autoformhtml = form.render() """ base_offset helps us to minimize impact on the database when querying for results. we can choose just those results we need for the page to show """ base_offset = int(_page_to_show) * int(num_display) # get data sets from DB _members = C3sMember.member_listing( _order_by, how_many=num_display, offset=base_offset, order=_order) # calculate next-previous-navi next_page = (int(_page_to_show) + 1) if (int(_page_to_show) > 0): previous_page = int(_page_to_show) - 1 else: previous_page = int(_page_to_show) _last_page = int(math.ceil(_number_of_datasets / int(num_display))) if next_page > _last_page: next_page = _last_page # store info about current page in cookie request.response.set_cookie('on_page', value=str(_page_to_show)) request.response.set_cookie('num_display', value=str(num_display)) request.response.set_cookie('order', value=str(_order)) request.response.set_cookie('orderby', value=str(_order_by)) _message = None if 'message' in request.GET: _message = request.GET['message'] return {'autoform': autoformhtml, '_number_of_datasets': _number_of_datasets, 'members': _members, 'num_display': num_display, 'next': next_page, 'previous': previous_page, 'current': _page_to_show, 'orderby': _order_by, 'order': _order, 'message': _message, 'last_page': _last_page, 'is_last_page': _page_to_show == _last_page, 'is_first_page': _page_to_show == 0, }
def test_export(self): """ load the login form, dashboard, start export, check outcome """ # try unauthenticated res = self.testapp.get('/export_all', status=403) # 403: forbidden # login res = self.testapp.get('/login', status=200) self.failUnless('login' in res.body) # try valid user, valid password form = res.form form['login'] = '******' form['password'] = '******' res2 = form.submit('submit', status=302) # # print('-'*30) # print(res2.body) # being logged in ... res3 = res2.follow() self.failUnless( 'Dashboard' in res3.body) # now try authenticated export = tempfile.NamedTemporaryFile() export.write(self.testapp.get('/export_all', status=200).body) export.seek(0) # rewind to start r = unicodecsv.reader(export.file, delimiter=';', encoding='utf-8', quoting=unicodecsv.QUOTE_ALL) header = r.next() # check header consistency self.assertTrue( header == [ u'firstname', u'lastname', u'email', # 1, 2, 3 u'password', u'last_password_change', # 3, 4 u'address1', u'address2', u'postcode', u'city', u'country', u'locale', u'date_of_birth', # 10, 11 u'email_is_confirmed', u'email_confirm_code', # 12, 13 u'num_shares', u'date_of_submission', # 14, 15 u'membership_type', # 16 u'member_of_colsoc', u'name_of_colsoc', u'signature_received', u'signature_received_date', u'payment_received', u'payment_received_date', u'signature_confirmed', u'signature_confirmed_date', u'payment_confirmed', u'payment_confirmed_date', u'accountant_comment'] ) # check/compare database contents r1 = r.next() # get next row fom CSV how_many = C3sMember.get_number() self.assertTrue(how_many is 1) crowd = C3sMember.member_listing( "id", how_many=C3sMember.get_number(), order="desc") self.assertTrue(u'SomeFirstnäme' in crowd[0].firstname) self.assertTrue(r1[0] in crowd[0].firstname) self.assertTrue(u'SomeLastnäme' in crowd[0].lastname) self.assertTrue(r1[1] in crowd[0].lastname) self.assertTrue('*****@*****.**' in crowd[0].email) self.assertTrue(r1[2] in crowd[0].email) self.assertTrue(str(r1[4]) in str(self.m1_last_pw_change)) self.assertTrue(r1[5] in crowd[0].address1) self.assertTrue(r1[6] in crowd[0].address2) self.assertTrue(r1[7] in crowd[0].postcode) self.assertTrue(r1[8] in crowd[0].city) self.assertTrue(r1[9] in crowd[0].country) self.assertTrue(r1[10] in crowd[0].locale) self.assertTrue(r1[11] in str(crowd[0].date_of_birth)) self.assertFalse(crowd[0].email_is_confirmed) self.assertTrue(r1[12] in u"False") self.assertTrue(r1[13] in crowd[0].email_confirm_code) self.assertTrue(str(r1[14]) == str(crowd[0].num_shares)) self.assertTrue( r1[15] in str(crowd[0].date_of_submission)) self.assertTrue('normal' in crowd[0].membership_type) self.assertTrue(r1[16] in crowd[0].membership_type) self.assertTrue(crowd[0].member_of_colsoc) self.assertTrue(r1[17] in "True") self.assertTrue(r1[18] in crowd[0].name_of_colsoc) self.assertTrue(crowd[0].name_of_colsoc in r1[18]) self.assertTrue(str(r1[19]) in str(crowd[0].signature_received)) self.assertTrue( r1[20] in str( crowd[0].signature_received_date)) self.assertFalse(crowd[0].payment_received) self.assertTrue(str(r1[21]) in u'False') # print r1[22] # self.assertTrue( # '1970-01-01 00:00:00' in str(crowd[0].payment_received_date)) # print r1[23] # self.assertFalse(crowd[0].signature_confirmed) # print r1[24] # self.assertTrue( # '1970-01-01 00:00:00' in str( # crowd[0].signature_confirmed_date)) # print r1[25] # self.assertFalse(crowd[0].payment_confirmed) # print r1[26] # self.assertTrue( # '1970-01-01 00:00:00' in str( # crowd[0].payment_confirmed_date)) # print r1[27] self.assertTrue('' in r1[27])
def test_import(self): """ load the login form, dashboard, start import, check outcome """ # try unauthenticated res = self.testapp.get('/import_all', status=403) # 403: forbidden # print res.body # # login # res = self.testapp.get('/login', status=200) self.failUnless('login' in res.body) # try valid user, valid password form = res.form form['login'] = '******' form['password'] = '******' res2 = form.submit('submit', status=302) # # print(res2.body) # being logged in ... res3 = res2.follow() # print '-#-' * 10 # print res3.body self.failUnless( 'Dashboard' in res3.body) # now try authenticated res = self.testapp.get('/import_all', status=302) res2 = res.follow() # print res2.body # XXX check database contents how_many = C3sMember.get_number() self.assertTrue(how_many is 3) crowd = C3sMember.member_listing( "id", how_many=C3sMember.get_number(), order="asc") self.assertTrue(u'SomeFirstnäme' in crowd[0].firstname) self.assertTrue('Alice' in crowd[1].firstname) self.assertTrue(u'Göbel' in crowd[1].lastname) self.assertTrue('*****@*****.**' in crowd[1].email) self.assertTrue( str( datetime.strptime( '2013-12-26 13:33:37.422342', '%Y-%m-%d %H:%M:%S.%f') ) in str(crowd[1].last_password_change)) self.assertTrue(u'Horstmüller-Str. 16' in crowd[1].address1) self.assertTrue('' in crowd[1].address2) self.assertTrue('12345' in crowd[1].postcode) self.assertTrue('Hamburg' in crowd[1].city) self.assertTrue('DE' in crowd[1].country) self.assertTrue('de' in crowd[1].locale) self.assertTrue('1951-04-05' in str(crowd[1].date_of_birth)) self.assertFalse(crowd[1].email_is_confirmed) self.assertTrue('SJWAI666LU' in crowd[1].email_confirm_code) self.assertTrue(crowd[1].num_shares is 1) self.assertTrue( '2013-12-29 15:30:23.422342' in str(crowd[1].date_of_submission)) self.assertTrue('normal' in crowd[1].membership_type) self.assertFalse(crowd[1].member_of_colsoc) self.assertTrue('' in crowd[1].name_of_colsoc) self.assertTrue(crowd[1].signature_received) self.assertTrue( '2013-12-29 21:28:45.364342' in str( crowd[1].signature_received_date)) self.assertFalse(crowd[1].payment_received) self.assertTrue( '1970-01-01 00:00:00' in str(crowd[1].payment_received_date)) self.assertFalse(crowd[1].signature_confirmed) self.assertTrue( '1970-01-01 00:00:00' in str( crowd[1].signature_confirmed_date)) self.assertFalse(crowd[1].payment_confirmed) self.assertTrue( '1970-01-01 00:00:00' in str( crowd[1].payment_confirmed_date)) self.assertTrue('' in crowd[1].accountant_comment) # # test another row # self.assertTrue('Alize' in crowd[2].firstname) self.assertTrue(u'Görbel' in crowd[2].lastname) self.assertTrue('*****@*****.**' in crowd[2].email) self.assertTrue( str( datetime.strptime( '2013-12-26 13:33:37.422342', '%Y-%m-%d %H:%M:%S.%f')) in str(crowd[1].last_password_change)) self.assertTrue(u'Horstmüller-Str. 23' in crowd[2].address1) self.assertTrue('addr2' in crowd[2].address2) self.assertTrue('12345' in crowd[2].postcode) self.assertTrue('Hamburg' in crowd[2].city) self.assertTrue('FR' in crowd[2].country) self.assertTrue('fr' in crowd[2].locale) self.assertTrue('1951-04-06' in str(crowd[2].date_of_birth)) self.assertTrue(crowd[2].email_is_confirmed) self.assertTrue('SJWAI666LT' in crowd[2].email_confirm_code) self.assertTrue(crowd[2].num_shares is 2) self.assertTrue( '2013-12-29 15:30:42.422342' in str(crowd[2].date_of_submission)) self.assertTrue('investing' in crowd[2].membership_type) self.assertTrue(crowd[2].member_of_colsoc) self.assertTrue('GEMA' in crowd[2].name_of_colsoc) self.assertTrue(crowd[2].signature_received) self.assertTrue( '2013-12-29 21:28:45.364323' in str( crowd[2].signature_received_date)) self.assertTrue(crowd[2].payment_received) self.assertTrue( '1970-01-01 00:00:01' in str(crowd[2].payment_received_date)) self.assertTrue(crowd[2].signature_confirmed) self.assertTrue( '1970-01-01 00:00:02' in str( crowd[2].signature_confirmed_date)) self.assertTrue(crowd[2].payment_confirmed) self.assertTrue( '1970-01-01 00:00:03' in str( crowd[2].payment_confirmed_date)) self.assertTrue('30c3' in crowd[2].accountant_comment)
def test_login_and_dashboard(self): """ load the login form, dashboard, member detail """ # # login # res = self.testapp.get('/login', status=200) self.failUnless('login' in res.body) # try invalid user form = res.form form['login'] = '******' form['password'] = '******' res2 = form.submit('submit') self.failUnless( 'Please note: There were errors' in res2.body) # try valid user & invalid password form = res2.form form['login'] = '******' form['password'] = '******' res3 = form.submit('submit', status=200) # try valid user, valid password form = res2.form form['login'] = '******' form['password'] = '******' res3 = form.submit('submit', status=302) # # being logged in ... res4 = res3.follow() res4 = res4.follow() #print(res4.body) self.failUnless( 'Dashboard' in res4.body) # now that we are logged in, # the login view should redirect us to the dashboard res5 = self.testapp.get('/login', status=302) # so yes: that was a redirect res6 = res5.follow() res6 = res6.follow() #print(res4.body) self.failUnless( 'Dashboard' in res6.body) # choose number of applications shown res6a = self.testapp.get( '/dashboard', status=302, extra_environ={ 'num_display': '30', } ) res6a = res6a.follow() self.failUnless('<h1>Dashboard' in res6a.body) res6a = self.testapp.get( '/dashboard/1/id/asc', status=200, ) self.failUnless('<h1>Dashboard' in res6a.body) # try an invalid page number res6b = self.testapp.get( '/dashboard/foo/bar/baz', status=200, ) self.failUnless( '<p>Number of data sets:' in res6b.body) # change the number of items to show form = res6b.forms[1] form['num_to_show'] = "42" # post a number: OK resX = form.submit('submit', status=200) form = resX.forms[1] form['num_to_show'] = "mooo" # post a string: no good resY = form.submit('submit', status=200) #import pdb; pdb.set_trace() # member details # # now look at some members details with nonexistant id res7 = self.testapp.get('/detail/5000', status=302) res7a = res7.follow() res7a = res7a.follow() self.failUnless('Dashboard' in res7a.body) # now look at some members details res7 = self.testapp.get('/detail/1', status=200) self.failUnless('Firstnäme' in res7.body) self.failUnless('Eingang bestätigen' in res7.body) self.failUnless('Zahlungseingang bestätigen' in res7.body) # switch signature resD2a = self.testapp.get('/switch_sig/1', status=302) # # # # # OFF resD2b = resD2a.follow() # we are taken to the dashboard resD2b = self.testapp.get('/detail/1', status=200) #print resD2b.body self.assertTrue( "Eingang bestätigen" not in resD2b.body) resD2a = self.testapp.get('/switch_sig/1', status=302) # # # # # ON resD2b = resD2a.follow() # we are taken to the dashboard resD2b = self.testapp.get('/detail/1', status=200) self.assertTrue( "Eingang bestätigen" in resD2b.body) # # switch payment resD3a = self.testapp.get('/switch_pay/1', status=302) # # # # OFF resD3b = resD3a.follow() # we are taken to the dashboard resD3b = self.testapp.get('/detail/1', status=200) self.assertTrue( "Zahlungseingang bestätigen" not in resD3b.body) resD3a = self.testapp.get('/switch_pay/1', status=302) # # # # ON resD3b = resD3a.follow() # we are taken to the dashboard resD3b = self.testapp.get('/detail/1', status=200) self.assertTrue( "Zahlungseingang bestätigen" in resD3b.body) # #################################################################### # delete an entry _num = C3sMember.get_number() resDel2 = self.testapp.get('/delete/1', status=302) _num2 = C3sMember.get_number() self.assertTrue(int(_num2) + 1 == int(_num)) resDel3 = resDel2.follow() resDel3 = resDel3.follow() self.failUnless('was deleted' in resDel3.body) # finally log out ################################################## res9 = self.testapp.get('/logout', status=302) # redirects to login res10 = res9.follow() self.failUnless('login' in res10.body)