Archive

Archive for the ‘Learning’ Category

Sketch from One Year Back

August 5, 2020 Leave a comment

This is an Elephant sketch from One #year ago i use a pencile then black ink pen.

Follow me on Twitter..

Lily Flower Drawing


Away from Coding and Python projects, drawing is my best way to relax, along with coffee and almost 15min of sketching with pencil then ink-ed it, here is the Lily.

Follow Me on Twitter

Random Sketch


Last night I was going through the Net looking for some Animals phones for my kids to learn there Names and the kind of food each will eat, I came up with this photo of a Giraffe, couldn’t stop myself from the desire to draw it. I use my Galaxy Tab S4 and Autodesk Sketchbook Application to sketch it.. Here it is.. And you may fond more of my sketches on the SKETCHE Page.

Follow me on Twitter Here

Python: Shares Speculation System – Part 4



Learning : Python, DataBase, SQL, SQlite3
Subject: Plan, Design and Build a Shares Speculation System

Project Card:
Project Name: Shares Speculation System
By: Ali
Date: 2.7.2020
Version: V01-2.7.2020

Last time we worked on Budgets Managment for our system, now before we start Buying and Selling shares we need to create list of shares name so we can select from it, we have a table called shares_name this Table have the following fields :
s_id: as a PRIMARY KEY.
full_name: To hold the full name of the share.
abb_name: To hold the Abbreviation of a share name.
The Share Managment section will have four main Functions to Add, Edit, Delete and Show shares. .. Let’s start with it’s Main Menu ..



First Function we will work on will be to Add New Share to the system, we will call it def add_share(): , we will ask the user to input the Share Full Name and its Abbreviation. With Abbreviation we will apply the .upper() function to convert the user input to Upper-case, and for the Full Name we will will apply this code [“ “.join([word.capitalize() for word in user-input] to upper case each first character of the Name. The we will check if the Share Name exist in the DataBase If not we will add it.

 # Add New Share
def add_share() :
        
    os.system('clear')
    print('\n   ====== Add New Share ======\n\n')
    while True :
            
        abb_name = input("   Enter the Abbreviation Name of the Share.. > ").upper() 
        full_name = " ".join([word.capitalize() for word in input('     Enter the Full Name of the Share.. > ').split(" ")])

        c.execute ("select * from shares_name where full_name ='{}' or abb_name = '{}'".format(full_name, abb_name)) 
        share_exist = c.fetchone ()
        if share_exist[0] > 0 :
            print('\n   It seams that the Share Exist in the Database, Name or Abbreviation CAN NOT be Duplicated.')
            print('   Try another Name. ')
        else :      
            c.execute ("INSERT INTO shares_name (full_name , abb_name)  VALUES(:full_name , :abb_name)",{"full_name":full_name, "abb_name":abb_name}) 
            db_conn.commit()
            
        if input ('\n   Do you want to Enter another Share Name?.  [Y,N]. >  ')  not in ['Y','y']: 
            input ('\n    .... Press any key to  Exit.  ')
            return



After adding shares we want to see them and to make sure if every things are fine, so we will write the show_share function, and it will take one argument as inside with default value = ‘Yes’, if we call the function from inside another function the value will be Yes, otherwise it will be ‘No’. Here is the code ..


Next is Editing Share Name, in this function we will call the show_share (‘Yes’) so the user will select the ID of the Share Name to be Edit, then with each attribute we will ask the user ether to Enter the new Edit of the attribute or to press Enter to keep the exist variable. .. Here is a copy of the code ..


Last Function in this Artical is Delete def delete_share() : again we will call the Shoe function to display all the Shares Name on the screen and let the user to select the one to be Deleted by Entering it’s ID.

 # Delete Function.    
def delete_share() :
    os.system('clear')
    print('\n   ====== Delete a Share  ======\n\n')
    
    print('   Here is a list of Shares we have in the System .. \n')
    show_share('Yes')
    
    del_share = input('\n\n   Enter the ID for the Share Name you want to Delete. [Q to Exit] >  ') 

    if del_share in ['q', 'Q'] :
        input ('\n\n    .... Press any key to  Exit.')
        return    
    elif del_share.isnumeric() :
        if (input ('   Are you SURE you want to DELETE Share ID {} ? [Y,N] >  '.format(del_share))) in ['y','Y'] :   
            c.execute ("delete from shares_name where s_id ={}".format(int(del_share))) 
            db_conn.commit()
            input ('\n    ....One Record DELETED. Press any key to  Exit.')
            return
        else :
            input ('\n    ....Share will NOT be Deleted. Press any key to  Exit.')
            return
    else :
        input ('\n    ....Invalid Inpout. Press any key to  Exit.')
        return



Now we can create or Enter a Budget and Enter the Shares Name we have in our Stock Market and we are ready to write the functions to make the transactions.


Coming Up: In Next part we will write the Function to submit/Save Buying and Selling Transactions to our system.


[NOTES]
1. Part-1 has no code file.
2. We are applying some basic Validations on some part of the code, and assuming that the user will not enter a messy data.


:: Shares Speculation System ::

Part 1 Part 2 Part 3 Part 4
Part5



To Download my Python code (.py) files Click-Here




Follow me on Twitter..




By: Ali Radwani




Sketch to Relax


This is a last night Sketch, just to break or stop thinking in codes and functions that are not working well. I think I need to stop codeing for 2-3 Days.

Python: Shares Speculation System – Part 3

July 14, 2020 1 comment


Learning : Python, DataBase, SQL, SQlite3
Subject: Plan, Design and Build a Shares Speculation System

Project Card:
Project Name: Shares Speculation System
By: Ali
Date: 2.7.2020
Version: V01-2.7.2020

In this part we will start writing some codes for our System, we will start with Budget Managment.

Budget: In the Shares Speculation System, and before the user can submit any Buying Transactions the system will check If there is enough money in the Budget Repository, so first we have to Insert a Budget. Therefore, we will start from Budget Managment.
Budget Managment will have five sub-menu as follow:
1. Add New Budget.
2. Withdraw Budget.
3. Edit a Budget.
4. Delete a Budget.
5. Show all Budget.
9. Exit.

So we will start writing the functions for each one.. let’s start with the Budget Menu, we use the while True: loop to keep the Menu until uer_choice == 9 where we return the user to the previous Menu. Here is the code:

Now, lets go through each Function..

Add New Budget: This Function will ask the user to Enter three pieces of information, The Date, The Budget Amount and if the user want to add some Notes such as cheque number or the source of the mouney/fund. For the Date, we want to make sure that the user entry is in the format we want and it is a date, so i wrote a function called date_validation () we will talk about this function later. For the Note part after the user enter the notes we will do (upper-case) for each first character in the text using this code: bud_note = ” “.join([word.capitalize() for word in bud_note.split(” “)]) Here is the full code ..

 # Add New Budget to the system.

def add_budget (): 
    os.system('clear')
    print('\n   ====== Add New Budget ======\n\n') 
    print('   Enter the Details of the Budget..\n')
      
    while True :
        bud_date = input ('   Enter the Date as [dd-mm-yyyy].  >  ') 
        msg = (date_validation (bud_date))
        if msg !='valid' :
            print(msg) 
        else:
            break
    bud_amount = input ('   Enter the Budget Amount.  >  ')
    bud_note = input ('   Enter any Notes if you want. [Hint: Cheque No.] >  ') 
    bud_note = " ".join([word.capitalize() for word in bud_note.split(" ")])    
    c.execute ("INSERT INTO budget_t (bud_date ,bud_amount, bud_note)  VALUES(:bud_date ,:bud_amount, :bud_note)",{"bud_date":bud_date ,"bud_amount":float(bud_amount), "bud_note":bud_note}) 
    db_conn.commit()
          
    input('\n\n        ... Press any Key to Exit')   


For the Budget Date we want the date to be in certain format, so we wrote a function that will take the user_input and check it’s format then return a message back, the message will be ‘Valid’ if the date format is correct, otherwise the message will give a hint if format error as:
Date Not Valid “Bad Year” or Date Not Valid “Bad Month” or Date Not Valid “Bad Day”. Here is the code for the Date Validation Function ..


Next we will write a function so we can withdraw some amount of money from the Budget, Why?? If we assume we start our Shares Speculation with 100,000$ and after several Buying and Selling we gain say 50,000$ as Profits, and we want to use this cash the [50,000$] to buy something; therefore we need to subtract / withdraw from the system. Here is the code to do this and the system will add [ WITHDRAW ] to the Note field.

 # To withdraw form the Budget


def sub_budget (): 
    os.system('clear')
    print('\n   ====== Withdraw from Budget ======\n\n')
    print('   Enter the Details of Withdraw Amount..\n')
    while True :
        bud_date = input ('   Enter the Date as [dd-mm-yyyy].  >  ') 
        msg = (date_validation (bud_date))
        if msg !='valid' :
            print(msg) 
        else:
            break
   
    bud_amount = input ('   Enter the Withdraw Amount.  >  ') 
    if int(bud_amount) > 0 : 
        bud_amount = int(bud_amount) * (-1)
    bud_note = input ('   Enter any Notes if you want. [Hint: Cheque No.] >  ')
    bud_note = "[ WITHDRAW ], " + bud_note 
    bud_note = " ".join([word.capitalize() for word in bud_note.split(" ")])
    c.execute ("INSERT INTO budget_t (bud_date ,bud_amount, bud_note)  VALUES(:bud_date ,:bud_amount, :bud_note)",{"bud_date":bud_date ,"bud_amount":bud_amount, "bud_note": bud_note}) 
    db_conn.commit()
           
    input('\n\n        ... Press any Ket to Exit')   


Now, in both Edit and Delete function we need to show the Budgets we have so the user will select the one for processing. So we will write the code to show Budgets in the system and we will present it as a Table. Here is the code ..

 # To show the Budget Table
        
def show_budget (inside='No'): 
    if inside =='No' :
        os.system('clear')
        print('\n   ====== Show Budgets ======\n\n') 
        print('   List of Budgets ..\n')
    c.execute ("select * from budget_t where bud_id >0") 
    budgets = c.fetchall() 
    print('      {:<10}{:<13}{:<16}{}'.format('ID','Date','Amount','Note'))
    print("    ","-"*70)
    try:
        for x in range(0,len(budgets)) : 
           print("      {:<8}{:<14}{:,}{:0") 
        budget_amount = c.fetchone() 
        print('\n\n    The Total Amount Budgets in the Account is : {:,} '.format(budget_amount[0]))
   
        input('\n   ... Press any key to Exit')   


So we have another two Functions [Edit, Delete] to go, the easyer one is Deleting Budget. In Delete function we will display a table with all Budgets we have in the system and the user will enter the ID of the Budget to be Deleted, we will ask the user to confirm the action then if CONFIRMED the Budget will be Delete. .. Here is the code ..


Last function in this part is to Edit a Budget that we have in the system, to do this we first will display all Budgets we have and the user will Enter the ID of the one to be Edited, we will go through it’s attributes asking the user to Edit or just Press enter to skip and keep the current value. For the Date we will call the date_validation() after user input, and for the Note we will check the Amount if it is Negative we will add “[ WITHDRAW ]” in the beginning of the Note line.

 # Edit Budget Function

def edit_budget (): 
    os.system('clear')
    print('\n   ====== Edit Budget ======\n\n') 
    show_budget (inside='Yes')
    try: 
        edit_budget = input ('\n\n    Select the Budget ID to Edit.  > ')
        c.execute ("select * from budget_t where bud_id ={}".format(int(edit_budget))) 
        e_budget = c.fetchone()
        if e_budget != None: 
            print('\n    You Select to Edit this Budget ..') 
        else:
            print('\n    ID Not Valid ... ')
             
        print('\n       ID: ',e_budget[0])
        print('     Date: ',e_budget[1])
        print('   Amount:  {:,}'.format(e_budget[2]))
        print('     Note: ',e_budget[3])
    
        print('\n\n   Edit Each Attribute OR Press Enter to Skip.. \n')
    
        while True :
            new_b_date = input('   Enter the New Date as [dd-mm-yyyy]. > ')
            if new_b_date >"" : 
                msg = (date_validation (new_b_date))
                if msg !='valid' :
                    print(msg) 
                else:
                    c.execute("update budget_t set bud_date = '{}' where bud_id = {}".format(new_b_date,int(e_budget[0]))) 
                    db_conn.commit() 
                    break    
            elif new_b_date =="" :break
                        
        new_b_amount = input('   Enter the New Amount > ')
        if new_b_amount > "" : 
            if input ('\n   You want to change the Budget Amount From {:,}  To {:,}. CONFIRM [Y,N] > '.format(float(e_budget[2]),float(new_b_amount))) in ['Y','y'] :
                c.execute("update budget_t set bud_amount = '{}' where bud_id = {}".format(float(new_b_amount),int(e_budget[0]))) 
                db_conn.commit() 
        else:
            print('   Budget Amount Not changed..\n')
            
        new_b_note = input('\n   Enter the New Note: > ')
        if new_b_note > "" :
            new_b_note = " ".join([word.capitalize() for word in new_b_note.split(" ")])
            if (e_budget[3])[0] =='[' and int(new_b_amount) < 0 :
                new_b_note = "[ WITHDRAW ], " + new_b_note     
        
            c.execute("update budget_t set bud_note = '{}' where bud_id = {}".format(new_b_note,int(e_budget[0])))          
            db_conn.commit() 
    
        input('\n   ... DONE ...  Press any key to Exit')
    except:
        input('\n       ... Error in User Input.  ... Press any key to Exit ...')


Coming Up: In Next part we will write the menu and the functions for the Shares Managment.

[NOTES]
1. Part-1 has no code file.


:: Shares Speculation System ::

Part 1 Part 2 Part 3 Part 4



To Download my Python code (.py) files Click-Here




Follow me on Twitter..




By: Ali Radwani




Python: Shares Speculation System – Part 2

July 12, 2020 2 comments


Learning : Python, DataBase, SQL, SQlite3
Subject: Plan, Design and Build a Shares Speculation System

Project Card:
Project Name: Shares Speculation System
By: Ali
Date: 2.7.2020
Version: V01-2.7.2020

In this part we will set the database connection, create the Tables and Insert the Zero records. So first let’s do the Import and the database connection..

# Database connection

import sqlite3, os 

# Create the data-base and name it as Share_S_System. 
db_conn = sqlite3.connect ("Share_S_System.db") 

# Set the connection. 
c = db_conn.cursor() 


Now we will write the function to creates the Tables, we have five tables and this could be change during the project.

# Code to create the Tables

def create_tables_() :
    # to create tables. 
    sql_share_t =    "CREATE TABLE if not exists shares_name  (s_id INTEGER PRIMARY KEY AUTOINCREMENT, full_name text, abb_name text )" 
        
    sql_buy_t_t =   "CREATE TABLE if not exists buy_t_table (bt_id INTEGER PRIMARY KEY AUTOINCREMENT ,buy_date text, sn_id integer, buy_amount integer, buy_price float, cost float)" 
    
    sql_sell_t_t  = "CREATE TABLE if not exists sell_t_table (st_id INTEGER PRIMARY KEY AUTOINCREMENT, sell_date text, sn_id integer, sell_amount integer, sell_price float, profit float)" 
 
    sql_budget_t  = "CREATE TABLE if not exists budget_t (bud_id INTEGER PRIMARY KEY AUTOINCREMENT, bud_date text, bud_amount float, bud_note text )"  

    sql_year_roi =  "CREATE TABLE if not exists year_roi (y_id INTEGER PRIMARY KEY AUTOINCREMENT, bud_amount float, profits float, costs float, roi float, t_buy float, t_sell float )"

    c.execute(sql_share_t) 
    db_conn.commit() 
    c.execute(sql_buy_t_t) 
    db_conn.commit() 
    c.execute(sql_sell_t_t)
    db_conn.commit()        
    c.execute(sql_budget_t) 
    db_conn.commit() 
    c.execute(sql_year_roi) 
    db_conn.commit()  

    input('\n .. Shares Speculation System Tables created.. Press any key .. ') 


Next we will Insert a ‘Zero’ records in the Tables, this weill set the ID’s field in each table to ‘0’ so with next records the AUTOINCREMENT will work as it should. here is the code ..


Last function in this part will be the Main-Menu of the system. The system will have five Menus each one will have it’s own page and functions to manage it, we will write all the needed functions. Here is the Main-Menu.


Coming Up: In Next part we will write the menu and the functions for the Budget Managment.

[NOTES]
1. Part-1 has no code file.


:: Shares Speculation System ::

Part 1 Part 2 Part 3 Part 4



To Download my Python code (.py) files Click-Here




Follow me on Twitter..




By: Ali Radwani




Python: Shares Speculation System – P1

July 7, 2020 3 comments


Learning : Python, SQL, SQlite,
Subject: Plan, Design and Build a Shares Speculation System (SSS)

Project Card:

Project Name: Shares Speculation System

First Draft on: 26.6.2020

Version: V01-26.6.2020

By: Ali

Brief: In this Project we will work on a Shares Speculation System (SSS) were the user can save transactions regarding his investments in the stock market.

The Project Idea: A person who works on Shares Speculation looking for a System to keep the records for his transactions and calculate the Profits and Return Of Investment ROI ratio based on Daily, Monthly or Yearly tansactions.

Scope of Work: We will use Python to writing the codes and will store the transactions in a DataBase using SQlite3.

System Tabels:
1. Shares_table (shares_name): To contain Shares Full Name and it’s Abbreviation.
2. Buy_Transactions_table (buy_t_table): To hold all buying transactions [Date, Share Name, Amount, Price, cost]
3. Sell_transaction_table (sell_t_table): To hold all selling transactions [Date, Share Name, Amount, Price, profit]
4. Budget_table (budget_t): To hold the budgets of the Shares Speculation [ Date, amount, notes
[Notes: With Budgets we can do two type of Transactions, Adding New budget will increases the Money to be Invested, also the user can withdrawal some amount of the money.]
5. Year_ROI (y_roi): After each year (end of the current year) there will be a function to be RUN and it will calculate the Total Investments, Budgets, Profits, Costs, ROI, Total Buy Transactions, Total Sell Transactions … maybe other all in one table and will store all this as a one line/record in the table.

System Functions:
For each table, we will have three main functions Add, Edit and Delete. Also we will write a Menu to access each Function and some Math/Economics formulas to calculate the Investments, Profits and ROI.

How the System Works:
The idea is, FIRST the user will create a Budget Profile, (Date, Budget Amount). Then each time the user buy or sell shares, the system will add a record saving the Transactions type and detail. If the Transaction is Buying then We will Debit the Transaction Total from the budget we have in the system
and if the transaction type is Selling we will Add the Income to the Budget.


:: Shares Speculation System ::

Part 1 Part 2 Part 3 Part 4



To Download my Python code (.py) files Click-Here




Follow me on Twitter..




By: Ali Radwani




Python: Library Managment System -P6



Learning : Python, DataBase, SQlite
Subject: Create Simple Library Managment System

This will be the last post of Library Managment System, and we will start another project. So in this last part, we will write a final function to get some statistics & summaries about our Library such as :

  • Number of book in the library
  • Books without classifications
  • Books without Author
  • Books without ISBN
  • Books under each classification
  • Statistics about Authors
  • Statistics about Classifications

so we will add the function name in the Main Menu (in this case will take number 5), here is a screen shot of the menu.



So we will write some SQL commands using (SQlite), we will start with Books statistics and will NOT cover all commands, but all will be in the course code file in the Download page.

#Total Books in the Library
    c.execute ("select count() from books where b_id > 0") 
    books_count = c.fetchone()

 # Books without classifications

    c.execute ("select b_id from b_class where b_class_id > 0") 
    books_no_class = [item[0] for item in c.fetchall()]    


 # Authors without emails

    c.execute ("select count() from authors where a_email='' and a_id > 0") 
    auth_no_email = c.fetchall()


 # Authors without Social Media Account
 
    c.execute ("select a_id from sma where sma_id > 0") 
    sma_aid = c.fetchall()       
    a_in_sma = lambda sma_aid: [sma_id for each in sma_aid for sma_id in each]
    a_with_sma = list(dict.fromkeys(a_in_sma(sma_aid)))
    print('     Total Authors without Social Media Accounts: ',(auth_count[0] - len(a_with_sma)))  



Here is the run-time for sample data ..




By this point I will stop working on the “Library Managment System“, the goal of this series of articles was to build a Fast, Simple, Personal system. We did NOT cover some important issues like Validations or Exporting the data.



Enhancment:
Here are some points we can incluod in Version 02 of the LMS Application.

  1. Validations: We need to make sure the user Entering in right and good format as we expect. [Date format, Emails, ISBN and So-On]

  2. User Deletign: This is very Important, so if the user Deletes a Classification or Books or Authors we MUST do some modifications on other tables in the DataBase. [Very High Priority]

  3. Capitalization: To make sure we capitalize all user inputs like first character in each Names [Books name, Authors .. So-On].

  4. Search: Although we have this option in our Main-Menu, but I will not cover it in this Version due to time consumption.

  5. Date Export: This is an extra option we may have to Export the Data as Excel or DB-Backup file.
  6. Multi Libraries: In family using of the system, we can insert Books of other family members (Father Home Library, Brother or Cousin). So in that case we need a Full set of Functions to manage this part.
  7. .


[ NOTE ]
1. I am using Galaxy Tab and QPython3 App.
2. All the above codes are available in the Download Section/Page under the project name.
3. The application codes, Functions, Menus and other parts of the Application are subject of changes. In case of changes I will mention that.
4. This is a simple personal Library application, so I did not use any validations on Data Entry.

:: Library Managment System ::

Part 1 Part 2 Part 3 Part 4
Part 5 Part 6


To Download my Python code (.py) files Click-Here




Follow me on Twitter..

By: Ali Radwani

Python: Library Managment System -P5

July 1, 2020 1 comment

Learning : Python, DataBase, SQlite
Subject: Create Simple Library Managment System

In this Part we will work on Books Managment Functions, New Book, Edit, Delete and Show Books. First, I want to mention that I did some modifications on:

  • Authors Functions:
    Update on show_Author, Edit_author, Delete_author and new_authors.
  • Classifications Functions:
    Update on Show_classification, Edit Classification, Delete Classification.

When I start writing the code for Adding New Book after that the code for Editing a Book, I notes that both are complex and going back or calling other functions such as show_authors, show_classification, I fond that we need to do some modifications on those functions, for all that I will not cover all codes in New and Edit functions. All the code IS available in the Download Page.

So lets start here with the easy functions, First we will see the show_book, in calling this function we will pass two parameters alone, list_type as def show_books(alone=’Yes’, list_type = “D”) both has default values.
alone: alone will be ‘No’ if we call the function within another function.
list_type: will have ‘D’ for Detail list of Book, list with Author data and Classifications. ‘T’ for Books list ID and Title only.
Here is the code ..

 # show books with two parameters

     
def show_books(alone='Yes', list_type = "D") : 
        
    c.execute ("select * from books where b_id > 0  order by b_name")     
    books_list = c.fetchall()           
    if list_type =="D":
        os.system('clear')
        print('\n   ====== Show Books ======')
        print('\n   The List of Books We Have, Sorted by Book Title\n') 
    
        for book in range (0,(len(books_list))):
           try: 
               print('\n             ID: {}'.format(books_list[book][0])) 
               print('     Name/Title: {}'.format(books_list[book][1]))
               print('      Book ISBN: {}'.format(books_list[book][3]))
               print('   Publish Date: {}'.format(books_list[book][4])) 
               print('   Book Edition: {}'.format(books_list[book][5]))
               
               # To get the Book Classification. 
               c.execute ("select class_name from classifi_list INNER JOIN b_class ON (classifi_list.class_l_id = b_class.class_id) AND (b_class.b_id ={})".format(books_list[book][0]))     
               b_class_list = c.fetchall()
               print('\n   Book Classification:')
               try:
                   for i in range(0,len(b_class_list),5) :
                       print(' '*15,b_class_list[i][0], end ="")
                       print(' | ',b_class_list[i+1][0], end ="")
                       print(' | ',b_class_list[i+2][0], end ="")
                       print(' | ',b_class_list[i+3][0])    
               except:
                   pass 
                                  
               auth_id = books_list[book][2]
               # To get the Author Data. 
               c.execute ("select * from authors where a_id = {}".format(int(auth_id)))     
               auth_list = c.fetchone()
           
               # To get the Author's Social Media Accounts. 
               c.execute ("select * from sma where a_id = {}".format(auth_id))  
               sma_list = c.fetchall()  
           
               # To print-out Author Data.
               print('\n\n   The Book Author:')
               print('           Name: {}'.format(auth_list[1]))
               print('          Email: {}'.format(auth_list[2]))
               print('          Social Media:')
               
               # Here we list the SMA for the Author.
               for each in sma_list :  
                  print('{:<14}{:<13} [ {} ]'.format('',each[2],each[3]))
               print('-'*50)           
           except:
               pass     
   
        input('\n\n         ... Press any Key ..') 
        return

    if list_type == "T" :
        print('\n')
        for book in range (0,(len(books_list)),4):
            try: 
                print('    {:<3}{:<27}'.format(books_list[book][0],books_list[book][1]),end="")
                print('{:<3}{:<27}'.format(books_list[book+1][0],books_list[book+1][1]),end="")
                print('{:<3}{:<27}'.format(books_list[book+2][0],books_list[book+2][1]),end="")
                print('{:<3}{:<27}'.format(books_list[book+3][0],books_list[book+3][1]))           
            
            #Exception for index out of range error.
            except:
                pass
        if alone =='Yes' :         
            input('\n\n         ... Press any Key ..')
            return 
        else : return    
    


Now the Delete Function, this is easy one, we just print print-out all the Book and the user will Select the one to be delete by Entaring it’s ID. To list the Books we will call the show_book function as here: show_books(‘No’,’T’) so parameter alone=’No’ and parameter list_type =’T’. Here is the code ..

 # Function to Delete a Book

def delete_book () :

    os.system('clear')
    print('\n   ====== Delete a Book ======')
    print('\n   The List of Books We Have, Sorted by Book Title\n') 
  
    # First we show all Bookd so the user can select the One to be Deleted.
    # we Call show_books function and pass 'T'. 
    show_books('No','T')  
          
    del_book = input('\n\n   Entert the Book ID that you want to Delete: [Q to Exit]  >  ') 
    if del_book not in ['q','Q'] :
        try: 
            c.execute ("select b_name from books where b_id = {}".format(int(del_book)))     
            d_b_name = c.fetchone() 
            
            if input('\n   Are you Sure you want to Delete Book "{}"? [Y,N].  >   '.format(d_b_name[0])) in ['Y','y'] :             
                c.execute ("delete from books where b_id = {} ".format(int(del_book)))
                db_conn.commit()
                input('\n   One Book has been Deleted... Press any Key > ')    
    
            else:
                print('\n   You Select NOT To Delete The Book "{}" . '.format(d_b_name[0]))
                input('\n   To Exit ... Press any key ..') 
        except:    
            input('\n   Not valid .. ')


Now lit’s start with Adding New Book to the Library System. In this process we will Enter New Book Name/Title, Book ISBN, Book Publish Date, Book Edition, and select an Author from the Authors List and if the Author is not exist we can Enter New Author, also to select a Classification and if we want we can Enter a new Classification.[If the one we want is not in the list]. As we can see in the Adding New Book we will call other functions to Show Authors then to Add new Author [If the one we have not on the list] also we will call the Show Classifications to select from and we may need to Add New classification.

The Editing the Books was really challenging, Showing all the the Books on the screen so the user will select the one to be edited, then once finished editing the Book attributes we will ask if the user want to edit the Author information if (YES) again will go through all Author attribute and ask if each one need to be Edit, IF the Author is not in the Authors list we will take the user to Add new Author to the system (if want to), after that we will ask if the user want to edit the classifications of the Book and if the classificatio is not in the list we will call the new_classification function.
Here are screen shot of the functions. ..

Part of Add New Book..
Part of Editing the Book.



What’s Next:
1. I will go through the code Run-Time tring to fix any errors.
2. I will write function for simple statistics on the Library.


[ NOTE ]
1. I am using Galaxy Tab and QPython3 App.
2. All the above codes are available in the Download Section/Page under the project name.
3. The application codes, Functions, Menus and other parts of the Application are subject of changes. In case of changes I will mention that.
4. This is a simple personal Library application, so i did not use any validations on Data Entry.

:: Library Managment System ::

Part 1 Part 2 Part 3 Part 4
Part 5


To Download my Python code (.py) files Click-Here




Follow me on Twitter..

By: Ali Radwani