from flask import Flask
from flask_sqlalchemy import SQLAlchemy

"""
These object and definitions are used throughout the Jupyter Notebook.
"""

# Setup of key Flask object (app)
app = Flask(__name__)
# Setup SQLAlchemy object and properties for the database (db)
database = 'sqlite:///sqlitestats.db'  # path and filename of database
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = database
app.config['SECRET_KEY'] = 'SECRET_KEY'
db = SQLAlchemy()


# This belongs in place where it runs once per project
db.init_app(app)
import datetime
from datetime import datetime
import json

from sqlalchemy.exc import IntegrityError
from werkzeug.security import generate_password_hash, check_password_hash


class User(db.Model):
    __tablename__ = 'users'  # table name is plural, class name is singular

    id = db.Column(db.Integer, primary_key=True)
    _name = db.Column(db.String(255), unique=False, nullable=False)
    _hitrate = db.Column(db.String(255), unique=True, nullable=False)

    
    def __init__(self, name, hitrate):

        self._name = name    # variables with self prefix become part of the object, 
        self._hitrate = hitrate

    @property
    def name(self):
        return self._name
    
    # a setter function, allows name to be updated after initial object creation
    @name.setter
    def name(self, name):
        self._name = name
    
    # a getter method, extracts uid from object
    @property
    def hitrate(self):
        return self._hitrate
    
    # a setter function, allows uid to be updated after initial object creation
    @hitrate.setter
    def uid(self, hitrate):
        self._hitrate = hitrate
        


    def __str__(self):
        return json.dumps(self.read())

    # CRUD create/add a new record to the table
    # returns self or None on error
    def create(self):
        try:
            # creates a person object from User(db.Model) class, passes initializers
            db.session.add(self)  # add prepares to persist person object to Users table
            db.session.commit()  # SqlAlchemy "unit of work pattern" requires a manual commit
            return self
        except IntegrityError:
            db.session.remove()
            return None

    # CRUD read converts self to dictionary
    # returns dictionary
    def read(self):
        return {
            "id": self.id,
            "name": self.name,
            "hitrate": self.hitrate,
        }

    # CRUD update: updates user name, password, phone
    # returns self
    def update(self, name="", hitrate=""):
        self.name = name
        db.session.commit()
        return self

    # CRUD delete: remove self
    # None
    def delete(self):
        db.session.delete(self)
        db.session.commit()
        return None
    # just a definition
def initUsers():
    with app.app_context():
        db.create_all()

        u1 = User(name='Zach LaVine OVER Assists', hitrate="60%")
        u2 = User(name='Kelly Oubre Jr OVER Points', hitrate="80%")
        u3 = User(name='Joel Embiid OVER 1H PRA', hitrate="100%")
        u4 = User(name='James Harden OVER Points', hitrate="20%")
        u5 = User(name='Mitchell Robinson OVER Points', hitrate="40%")
        u6 = User(name='Jalen Bruson UNDER 1H PRA', hitrate="0%")
        users = [u1, u2, u3, u4, u5, u6]

        """Builds sample user/note(s) data"""
        for user in users:
            try:
                '''add user to table'''
                object = user.create()
                print(f"Created new uid {object.uid}")
            except:  # error raised if object nit created
                '''fails with bad or duplicate data'''
                print(f"Records exist uid {user.uid}, or error.")
                
initUsers()
Records exist uid 60%, or error.
Records exist uid 80%, or error.
Records exist uid 100%, or error.
Records exist uid 20%, or error.
Records exist uid 40%, or error.
Records exist uid 0%, or error.
def read():
    with app.app_context():
        table = User.query.all()
    json_ready = [user.read() for user in table] # "List Comprehensions", for each user add user.read() to list
    return json_ready

read()
[{'id': 1, 'name': 'Zachy', 'hitrate': '60%'},
 {'id': 2, 'name': 'Kelly Oubre Jr OVER Points', 'hitrate': '80%'},
 {'id': 3, 'name': 'Joel Embiid OVER 1H PRA', 'hitrate': '100%'},
 {'id': 4, 'name': 'James Harden OVER Points', 'hitrate': '20%'},
 {'id': 5, 'name': 'Mitchell Robinson OVER Points', 'hitrate': '40%'},
 {'id': 6, 'name': 'Jalen Bruson UNDER 1H PRA', 'hitrate': '0%'},
 {'id': 7, 'name': 'Austin Reaves OVER Points', 'hitrate': '99%'}]
def find_by_name(name):
    with app.app_context():
        user = User.query.filter_by(_name=name).first()
    return user # returns user object

def check_credentials(uid, hitrate):
    # query email and return user record
    user = find_by_name(uid)
    if user == 1:
        return False
    if hitrate == "60%":
        return True
    return True
        
check_credentials("1", "60")
    
True
def deleteuser():
    id = input("enter name")
    user = find_by_name(id)
    print(user)
    if user is not None:
        with app.app_context():
            db.session.delete(user)  
            db.session.commit()
        print("User deleted.")
    else:
        print("User not found.")
    
deleteuser()
print("new DB")
read()
{"id": 7, "name": "Austin Reaves OVER Points", "hitrate": "90%"}
User deleted.
new DB
[{'id': 1, 'name': 'Zachy', 'hitrate': '60%'},
 {'id': 2, 'name': 'Kelly Oubre Jr OVER Points', 'hitrate': '80%'},
 {'id': 3, 'name': 'Joel Embiid OVER 1H PRA', 'hitrate': '100%'},
 {'id': 4, 'name': 'James Harden OVER Points', 'hitrate': '20%'},
 {'id': 5, 'name': 'Mitchell Robinson OVER Points', 'hitrate': '40%'},
 {'id': 6, 'name': 'Jalen Bruson UNDER 1H PRA', 'hitrate': '0%'}]
def updateuser():
    
    id2 = input("id")
    name2= input("new name")
    with app.app_context():
        user = User.query.filter_by(id=id2).first()
        user.update(name=name2)
        db.session.commit()

def read():
    with app.app_context():
        table = User.query.all()
    json_ready = [user.read() for user in table] # "List Comprehensions", for each user add user.read() to list
    
    return json_ready

read()


updateuser()
def create():
    # optimize user time to see if name exists
    name = input("Enter your user id:")
    user = find_by_name(name)
    try:
        print("Found\n", user.read())
        return
    except:
        pass # keep going
    
    # request value that ensure creating valid object
    name = input("Enter your name:")
    hitrate = input("Enter your hitrate")
    
    # Initialize User object before date
    user = User(name=name,  
                hitrate=hitrate
                )
           
    # write object to database
    with app.app_context():
        try:
            object = user.create()
            print("Created\n", object.read())
        except:  # error raised if object not created
            print("Unknown error name {name}")
        
create()
Created
 {'id': 7, 'name': 'Austin Reaves OVER Points', 'hitrate': '90%'}

Menu

def process():
    endpoint = input("read, delete, update, create")
    if endpoint == "read":
        with app.app_context():
            table = User.query.all()
            json_ready = [user.read() for user in table] # "List Comprehensions", for each user add user.read() to list
        return json_ready
    elif endpoint == "delete":
        deleteuser()
    elif endpoint == "update":
        updateuser()
    elif endpoint == "create":
        create()
    else:
        print('function not found')


process()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb Cell 11 in <cell line: 18>()
     <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=13'>14</a>     else:
     <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=14'>15</a>         print('function not found')
---> <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=17'>18</a> process()

/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb Cell 11 in process()
      <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=1'>2</a> endpoint = input("read, delete, update, create")
      <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=2'>3</a> if endpoint == "read":
----> <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=3'>4</a>     with app.app_context():
      <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=4'>5</a>         table = User.query.all()
      <a href='vscode-notebook-cell:/Users/jameshunter/Documents/GitHub/james-fastpage/_notebooks/2023-03-17-2.4Hacks.ipynb#X13sZmlsZQ%3D%3D?line=5'>6</a>         json_ready = [user.read() for user in table] # "List Comprehensions", for each user add user.read() to list

NameError: name 'app' is not defined