Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Write your code here
- import sqlite3
- from random import sample
- class BankingSystem:
- def __init__(self):
- self.database() # init database
- self.card_data = None # card_data is a list for storing logged in account's info
- # self.cards = {}
- def menu(self):
- while True:
- try:
- print("1. Create an account\n2. Log into account\n0. Exit")
- self.to_1st_menu(input())()
- except KeyError:
- print('Unknown option.')
- def to_1st_menu(self, choice):
- switcher = {
- '1': self.create_acc,
- '2': self.login,
- '0': self.end
- }
- return switcher[choice]
- @staticmethod
- def database(card=None, pin=None, balance=None):
- with sqlite3.connect('card.s3db') as data:
- cursor = data.cursor()
- if not card:
- cursor.execute('''
- CREATE TABLE IF NOT EXISTS card(
- id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
- number TEXT,
- pin TEXT,
- balance INTEGER
- );
- ''')
- else:
- cursor.execute('''
- INSERT into card(number, pin, balance)
- VALUES(?,?,?);
- ''', (card, pin, balance)) # use (?) for vars
- @staticmethod
- def check_credentials(card):
- with sqlite3.connect('card.s3db') as data:
- cursor = data.cursor()
- cursor.execute('''
- SELECT number, pin, balance FROM card WHERE number = (?);
- ''', (card,)) # card is card number, use , to avoid incorrect number of bindings error
- return cursor.fetchone()
- @staticmethod
- def generate_nums():
- while True:
- random_card = '400000' + ''.join([str(n) for n in sample(range(9), 9)]) + '7'
- random_pin = ''.join([str(n) for n in sample(range(9), 4)])
- if BankingSystem.luhn_algorithm(random_card):
- yield random_card, random_pin
- else:
- continue
- @staticmethod
- def luhn_algorithm(card_number: str) -> bool:
- number = list(map(int, card_number))[::-1]
- for index in range(1, len(number), 2):
- if number[index] < 5:
- number[index] = number[index] * 2
- else:
- number[index] = ((number[index] * 2) // 10) + ((number[index] * 2) % 10)
- return (sum(number) % 10) == 0
- def create_acc(self):
- card, pin = next(self.generate_nums())
- # self.cards[card] = {'pin': pin, 'balance': 0}
- self.database(card, pin, 0)
- print('\nYour card has been created')
- print(f'Your card number:\n{card}')
- print(f'Your card PIN:\n{pin}\n')
- def login(self):
- card = input('Enter your card number:\n')
- pin = input('Enter your PIN:\n')
- try:
- # if self.cards[card]['pin'] == pin:
- self.card_data = self.check_credentials(card)
- if self.card_data[1] == pin:
- print('You have successfully logged in!\n')
- self.account()
- else:
- print('Wrong card number or PIN\n')
- except (KeyError, TypeError):
- print('Wrong card number or PIN\n')
- def account(self, card):
- while True:
- print('1. Balance\n2. Log out\n0. Exit')
- choice = input()
- if choice == '1':
- # self.card_data = self.check_credentials(card)
- print(f"\nBalance: {self.card_data[2]}\n")
- # print(f"\nBalance: {self.cards[card]['balance']}\n") # how to print query
- elif choice == '2':
- self.card_data = None
- print('You have successfully logged out!\n')
- return
- elif choice == '0':
- print('Bye!')
- exit()
- else:
- print('Unknown option.\n')
- @staticmethod
- def end():
- print('Bye!')
- exit()
- # need to conn.commit
- BankingSystem().menu()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement