diff --git a/exercises/2-bank-software/bank_controller.py b/exercises/2-bank-software/bank_controller.py index 655662e..4845a5a 100644 --- a/exercises/2-bank-software/bank_controller.py +++ b/exercises/2-bank-software/bank_controller.py @@ -1,2 +1,97 @@ import bank_models -import bank_views \ No newline at end of file +import bank_views + +import sys +from datetime import datetime +import curses + +class Bank: + def __init__ ( self ): + + # initialize the View class + self.view = bank_views.View( screen, curses ) + self.db = bank_models.db() + if 'dev' in sys.argv: + self.view.showDev = True + + self.view_loader( "welcome" ) + + def view_loader( self, view_name, passing=None ): + re = getattr( self.view , view_name )( passing ) + + if type( re ) == dict: + if '_return_to' in re: + return getattr( self, re['_return_to'] )( re ) + + if '_next' in re: + self.view_loader( re['_next'] ) + return re + + def sign_up( self, obj ): + + check = self.db.create_user( obj['name'], obj['password'], obj['permission'] ) + + # if user name is available + if check: + message = obj['name'] + " please login" + self.view_loader( "login", message ) + else: + message = "User name taken" + self.view_loader( "sign_up", message ) + + def login( self, obj ): + + self.user = bank_models.Users( obj['name'], obj['password'] ) + + if self.user.name: + self.view.update_user( [ obj['name'] ] ) + getattr( self, self.permission + '_home' )() + else: + message = "Invalid login" + self.login( self.view.login( message ) ) + + def logOut( self, message=False ): + self.view.update_user( [ None ] ) + self.view_loader( "welcome" ) + + def client_home( self, start=0 ): + self.user.list_accounts( start ) + self.view_loader( 'client_home', array ) + + def view_account( self, number=None, array={} ): + self.account = model.Account( number ) + self.amount.user_id = self.user.id + + if array != {}: + array.update( self.account ) + else: + array = self.account + + self.view_loader( 'view_account', array ) + + def account_withdraw( self, amount ): + check = self.account.withdraw( amount ) + + if check: + self.view_loader( 'view_account', "Withdraw -" + amount ) + else: + + self.view_account( None, { 'message': "Insufficient funds."} ) + + def account_deposit( self, amount ): + self.account.deposit( amount ) + self.view_loader( 'view_account', "Deposit +" + amount ) + + def account_transfer( self, amount, to_number ): + check = self.account.transfer( amount, to_number ) + + if check: + self.view_loader( 'view_account', "Transfered -" + amount + " to " + to_number ) + else: + + self.view_account( None, { 'message': "Insufficient funds."}) +try: + curses.wrapper( Bank ) +except KeyboardInterrupt: + print( "Got KeyboardInterrupt exception. Exiting..." ) + exit() diff --git a/exercises/2-bank-software/bank_models.py b/exercises/2-bank-software/bank_models.py index b34686d..3963d06 100644 --- a/exercises/2-bank-software/bank_models.py +++ b/exercises/2-bank-software/bank_models.py @@ -1,25 +1,119 @@ import sqlite3 import hashlib -class db: - def __init__(): +class DB: + def __init__( self, file= ): + self.file = file + + def create_user( self, name, pin, permission ): + + c = self.__connect() + + # check if user name is taken + result = self.get_user( name ) + + if len(result) == 0: + c.execute( "INSERT INTO user ( name, pin, permission ) VALUES ( ?, ?, ? )", ( name, pin, permission ) ) + self.conn.commit + c.close() + return True + + else: + c.close() + return False + + def login_user(): + c = self.__connect + + c.execute( "SELECT * FROM user WHERE pin=(?) and name=(?)", ( pin ,name ) ) + result = c.fetchall() + c.close() + + if len( result ) == 1 + return result[0] + + else: + return False + + def get_user( sefl, name ): + c = self.__connect() + + c.execute( "SELECT * FROM user WHERE name LIKE (?)", ( name ) ) + c.close() + + return c.fetchall() + + def __connect( self ): + self.conn = sqlite3.connect( '' ) + return self.conn.cursor() + +# start the data base + +class Users: + def __int__( self, name, pin ): + + def creat( self, name, pin, permission ): + pin = hashlib.md5( pin ) + if db.create_user( name, pin.hexdigest(), permission ): + return True + return False + + def login( self, name, pin ): + pin = hashlib.md5( pin ) + get_user = db.login_user( name, pin.hexdigest() ) + + if get_user: + return __check_type( get_user ) + return False + + def __check_type( self, user ): + + if user.permission == "client": + return Cleint( user ) + elif user.permission == "banker" + return Banker( user ) + + def look_up( self, name ): + + return db.get_user( name ) + +class account: + def __init__( self, account_number ): + self.account = db.account( amount ) + + def view( self ): + return self.account + + def withdraw( self, amount ): + if amount < self.amount.balance: + db.account_update( self.account.number, amount, withdraw ) + + def deposit( self, amount ): + db.account_update( self.account.number, amount, deposit ) + + + def transfer( self, amount, to_account_number ): + db.account_update( self.account.number, amount, transfer ) + db.account_update( to_account_number, amount, transfer ) + +class client: + def __init__( self ): + self.accounts = account() + + def view_all_accounts( self ): + return self.accounts + +class banker( user ): + + def __init__( self ): pass - def create_user( self, name, pin, permission ): - conn = sqlite3.connect(self.db_name) - c = conn.cursor() - c.execute( "SELECT * FROM user WHERE name LIKE (?)", (name) ) - result = c.fetchall() + def view_all_users( self ): + pass - if len(result) == 0: - pin = hashlib.md5( pin ) - c.execute( "INSERT INTO user ( name, pin, permission ) VALUES ( ?, ? )", ( name, pin.hexdigest(), permission ) ) + def view_user_acconts( self ): + pass - conn.commit() - c.close() - return True - - else: - conn.commit() - c.close() - return False \ No newline at end of file + def current_account( self ): + pass + \ No newline at end of file diff --git a/exercises/2-bank-software/bank_views.py b/exercises/2-bank-software/bank_views.py index 90fc67a..e746e3a 100644 --- a/exercises/2-bank-software/bank_views.py +++ b/exercises/2-bank-software/bank_views.py @@ -4,6 +4,7 @@ import random class View: def __init__( self, screen, curses ): + # set instance variable self.showDev = False self.userName = None @@ -94,7 +95,6 @@ class View: if event == ord( "l" ) or event == ord( "L" ): return { '_next': 'login' } - # all ways if event == ord( "c" ) or event == ord( "C" ): @@ -128,10 +128,11 @@ class View: self.body.refresh() # write the body - self.body.addstr( 1, 3, "c cedits" ) - self.body.addstr( 3, 3, "l login" ) - self.body.addstr( 4, 3, "n new user" ) - self.body.addstr( 6, 3, "Q Quit" ) + self.body.addstr( 1, 3, "bank!" ) + + # show error message + if message: + self.body.addstr( 34, 2, message ) # draw the body self.body.refresh() @@ -139,6 +140,26 @@ class View: #listen for keyboard input return self.menu() + def client_home( self, array=False ): + self.body.clear() + + # allow user to see KB input + self.curses.echo() + + # remove old content + self.side_bar.clear() + self.side_bar.refresh() + + # write to body + left = 1 + count = 1 + for i in array: + self.side_bar.addstr( count, left, str(i) ) + count += 1 + + # draw body + self.body.refresh() + def sign_up( self, message=False ): # remove old body content @@ -152,24 +173,27 @@ class View: self.side_bar.refresh() # write to body - self.body.addstr(2, 2, "Pick a new user name and pin:" ) + self.body.addstr( 2, 2, "Pick a new user name and pin:" ) # draw body self.body.refresh() # show error message if message: - self.body.addstr( 7, 2, message ) + self.body.addstr( 8, 2, message ) self.body.refresh() # ask for user name - self.body.addstr(3, 2, "user Name:" ) + self.body.addstr( 3, 2, "user Name:" ) name = self.body.getstr(4, 2, 60) - self.body.addstr(5, 2, "Pin:" ) - #self.body.refresh() - password = self.body.getstr(6, 2, 60) + self.body.addstr( 5, 2, "permission:[ admin / banker / client ]" ) + permission = self.body.getstr(4, 2, 60) - return( { 'name':name, 'password':password, '_return_to': 'sign_up' } ) + self.body.addstr( 7, 2, "Pin:" ) + #self.body.refresh() + password = self.body.getstr( 8, 2, 60 ) + + return( { 'name':name, 'password':password, 'permission': permission '_return_to': 'sign_up' } ) def login( self, message=False ): @@ -188,14 +212,14 @@ class View: self.body.addstr( 7, 2, message ) self.body.refresh() - self.body.addstr(2, 2, "Please log in with your user name and pin:" ) + self.body.addstr( 2, 2, "Please log in with your user name and pin:" ) - self.body.addstr(3, 2, "user Name:" ) - name = self.body.getstr(4, 2, 60) - self.body.addstr(5, 2, "Pin:" ) + self.body.addstr( 3, 2, "user Name:" ) + name = self.body.getstr( 4, 2, 60 ) + self.body.addstr( 5, 2, "Pin:" ) self.body.refresh() - password = self.body.getstr(6, 2, 60) + password = self.body.getstr( 6, 2, 60 ) # if error message @@ -243,18 +267,6 @@ class View: 'name': "William Mantly", 'email': "wmantly@gmail.com", 'desc': "Designed and implemented the UI." - },{ - 'name': "Benjamin Himley", - 'email': "benjaminhimley85@gmail.com", - 'desc': "wrote rpn generator and controller,", - 'desc2': "bugfix assit" - },{ - 'name': "Adolfo Reyes", - 'email': "adolfo0620@gmail.com", - 'desc': "bug hunter" - },{ - 'name': "Brendan Gilroy", - 'email': "BDGilroy@gmail.com" } ] diff --git a/exercises/2-bank-software/test.txt b/exercises/2-bank-software/test.txt new file mode 100644 index 0000000..9b36213 --- /dev/null +++ b/exercises/2-bank-software/test.txt @@ -0,0 +1,22 @@ +CREATE TABLE users ( +id INTEGER DEFAULT NULL PRIMARY KEY AUTOINCREMENT, +name TEXT DEFAULT NULL, +created TEXT DEFAULT NULL, +permission TEXT DEFAULT NULL +); +CREATE TABLE accounts ( +id INTEGER DEFAULT NULL PRIMARY KEY AUTOINCREMENT, +user_id INTEGER DEFAULT NULL REFERENCES users (id), +balance TEXT DEFAULT NULL, +name TEXT DEFAULT NULL, +opened TEXT DEFAULT NULL +); +CREATE TABLE transactions ( +id INTEGER DEFAULT NULL PRIMARY KEY AUTOINCREMENT, +outgoing_id INTEGER DEFAULT NULL REFERENCES accounts (id), +incoming_id INTEGER DEFAULT NULL REFERENCES accounts (id), +type TEXT DEFAULT NULL, +amount TEXT DEFAULT NULL, +date TEXT DEFAULT NULL, +new field TEXT DEFAULT NULL +);