def process_transfer_form(self, user): current_month_transfer = float(self.request.get("current_month")) if self.request.get("last_month"): last_month_transfer = float(self.request.get("last_month")) else: last_month_transfer = None if self.request.get("start_date"): from datetime import datetime start_date = datetime.strptime(self.request.get("start_date"), "%Y-%m-%d").date() else: start_date = None user_id = user.user_id parent = user.key() try: if start_date: # if we're here, it means that this is the first time the user has submitted the form # at this point, user has no transfers yet transfer = Transfer( user_id=user_id, key_name=user_id, parent=parent, start_date=start_date, monthly_transfers=[current_month_transfer] ) else: # user is updating or entering new transfer transfer = user.transfers() if last_month_transfer: # update last month's transfer transfer.monthly_transfers[-1] = last_month_transfer transfer.monthly_transfers.append(current_month_transfer) transfer.put() self.render( 'transfer_dashboard', message="Your transfer has been saved.", success=True, total_transfers=Application.app().total_transfers or 0, show_graph=True ) except: self.render( "transfer_dashboard", message="Data not saved. Please ensure that you've entered the correct information.", success=False )
async def new_transfer(request: Request) -> json_response: try: transfer = await request.json() if len(transfer['master']) < 0: return failure_response(403, 'Authorize please') if 8 > len(transfer['whom']) > 20: return failure_response(400, 'Invalid length of destination email') if transfer['amount'] is None or int(transfer['amount']) < 0: return failure_response(400, 'Invalid amount') pool = request.app['pool'] async with pool.acquire() as conn: async with conn.transaction(): users = await conn.fetch( 'SELECT * FROM users WHERE key=\'{}\''.format( transfer['master'])) if len(users) == 0: return failure_response(403, 'Authorize please') else: if users[0]['email'] == transfer['whom']: return failure_response(400, 'Not bad') if int(users[0]['balance']) < 0: return failure_response( 402, 'There is no money in your account') if users[0]['balance'] < int(transfer['amount']): return failure_response( 400, 'There is not enough money in your account') u_dests = await conn.fetch( 'SELECT * FROM users WHERE email=\'{}\''.format( transfer['whom'])) if len(u_dests) == 0: return failure_response(400, 'No such destination email') else: dest = u_dests[0] # how to get last element F**K (MAX & LIMIT didn't work) transfers = await conn.fetch( '''SELECT * FROM transfers''') t = Transfer(master=transfer['master'], amount=transfer['amount'], whom=transfer['whom'], prev=transfer_record_to_json_string( transfers[-1])) await conn.fetch(''' INSERT INTO transfers (transfer_hash, master, whom, amount, time) VALUES (\'{}\', \'{}\', \'{}\', {}, \'{}\') '''.format(t.transfer_hash, users[0]['email'], t.whom, t.amount, t.time)) await conn.fetch( 'UPDATE users SET balance={} WHERE email=\'{}\''. format((users[0]['balance'] - int(transfer['amount'])), users[0]['email'])) await conn.fetch( 'UPDATE users SET balance={} WHERE email=\'{}\''. format((dest['balance'] + int(transfer['amount'])), dest['email'])) logger.info('New Transfer {} send {} to {}'.format( users[0]['email'], transfer['amount'], transfer['whom'])) return success_response(200, 'ok') except Exception as e: return server_error_response(e)
def transfers(self): return Transfer.get_by_key_name(self.user_id, parent=self)
import datetime from models.transfer import Transfer from models.application import Application active_transfers = 0.0 total_transfers = 0.0 today = datetime.date.today() for transfer in Transfer.all(): if transfer.start_date <= today: total_transfers += sum(transfer.monthly_transfers) app = Application.app() app.total_transfers = total_transfers app.put()