def _load_payments(self): """ LOAD PAYMENTS :return: nothing. Happens in place """ # change amount format def clean_format(x): x = x.replace('€', '') x = x.strip() return x # parse date format def dateparse(x): if pandas.isnull(x): return None return pandas.datetime.strptime(x, '%d/%m/%y %H:%M:%S') # lookup child method def lookup_child(child_id): if child_id: return self.children_lookup[int(child_id)] # lookup contributor method def lookup_contributor(contributor_id): if contributor_id in self.contributor_lookup.keys(): return self.contributor_lookup[contributor_id] self.stdout.write('Contributor with number {0} not found.'.format(contributor_id)) self.stdout.write('\nloading payments') self.payments_data['amount'] = self.payments_data['amount'].astype(str).apply(clean_format) self.payments_data['amount'].astype(float) # fill empty strings self.payments_data['comment'].fillna('', inplace=True) self.payments_data['child_id'].fillna('', inplace=True) self.payments_data['date'].fillna('01/01/71 00:00:00', inplace=True) self.payments_data['date'] = self.payments_data['date'].apply(dateparse) # add default columns self.payments_data['currency'] = self.payments_data['sappayment'].apply(lambda x: 'zar' if int(x) is 1 else 'euro') self.payments_data['ptype'] = 'recurrent' self.payments_data['entitled'] = 'entitled' # drop payments with empty contributor self.payments_data = self.payments_data[pandas.notnull(self.payments_data['contributor_id'])] # lookup contributors self.payments_data['contributor'] = self.payments_data['contributor_id'].apply(lookup_contributor) # lookup children self.payments_data['child'] = self.payments_data['child_id'].apply(lookup_child) # drop unneeded columns self.payments_data.drop('child_id', axis=1, inplace=True) self.payments_data.drop('contributor_id', axis=1, inplace=True) self.payments_data.drop('sappayment', axis=1, inplace=True) # load payments failing_payments = {} ok_payments = [] for payment_data in self.payments_data.to_dict(orient='records'): self.stdout.write('.', ending="") self.stdout.flush() try: payment = Payment(**payment_data) payment.full_clean() payment.save() ok_payments.append(payment_data) except Exception as e: failing_payments[str(payment_data)] = e if failing_payments: print('Payments failed validation:\n{0}'.format(pprint.pformat(failing_payments, indent=4)))