====== Introduction ====== This project consists in creating a helpful tool to manage the equipment at the storage in the electrical engineering building of the University of Costa Rica. We use the open source relational database management system (RDBMS) MySql and the programming language Python, the first one to create a database that contains all the equipment and users, also we use the open source software suite ZBar for reading bar codes from various sources and Python for manage the ZBar functions and control the database. ====== Objectives ========= **__General Objective__** *Implement a basic program that helps with the manage of the equipment of certain place **__Specific Objectives__** * Learn to use MySQL. * Create a program using Python to edit and manipulate the database. * Get to know with the open source software like ZBar. ====== Documentation ====== [[teaching:ie0117:proyectos:2013:i:waconsys:barcode_with_webcam|Scanning and decoding barcode with webcam (zbarcam)]]\\ [[teaching:ie0117:proyectos:2013:i:waconsys:using_mysql|Creating and Managing Databases in MySQL]]\\ [[teaching:ie0117:proyectos:2013:i:waconsys:python-mysql|Relating Python with MySQL]] ====== Implementation ====== ==== Database Implementation ==== Table Equipment\\ ^ Field ^ Type ^ NULL ^ Key ^ Default ^ Extra ^ |placa |BIGINT(20)UNSIGNED | NO | PRI | NULL | | |tipo |VARCHAR(50) | YES | | NULL | | |marca |VARCHAR(50) | YES | | NULL | | |modelo |VARCHAR(50) | YES | | NULL | | |usuario |BIGINT(20) UNSIGNED | YES | | | | \\ Table User ^ Field ^ Type ^ NULL ^ Key ^ Default ^ Extra ^ |usuario |BIGINT(20)UNSIGNED | NO | PRI | NULL | | |canet |VARCHAR(50) | YES | | NULL | | |nombre |VARCHAR(50) | YES | | NULL | | |telefono |VARCHAR(50) | YES | | NULL | | |email |VARCHAR(50) | YES | | | | ==== Base Program Implementation ==== === scann module === we use the following code to define a function that returns the scan code as a integer value and use this value for the application. We use the module scan to get the value and access to our database. #!/usr/bin/python import zbar def scan(): proc = zbar.Processor() proc.parse_config('enable') device = '/dev/video0' proc.init(device) proc.visible = True proc.process_one() proc.visible = False for symbol in proc.results: code = [symbol.data] code=code[0] code=int(code) return code \\ In the last lines of this script you can see how we extract from the list symbol.data the integer value of the scan code. \\ === update module === We use the next code to build the **update** module. which receives two parameters through the tuple //data//, which contains the variables //user// and //equipment//, scanned with the **scan** module #!/usr/bin/python import MySQLdb def updatedb(data): # Open database connection db = MySQLdb.connect("localhost","user","bodega","bodegaEIE" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to UPDATE required records sql = "UPDATE equipo SET usuario = '%s' WHERE placa = '%s'" %(data) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close() === check module === This module was created to verify a certain equipment is registered in the database. Note how the //fetchall// method returns a list of tuples or empty list when no rows available. This module return a False boolean value to indicate that some equipment is not registered in the database #!/usr/bin/python # -*- coding: utf-8 -*- import MySQLdb as mdb import sys def checkdb(code): # Open database connection db= mdb.connect('localhost', 'user', 'bodega', 'bodegaEIE') # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = "SELECT * FROM equipo WHERE placa = '%d'" % (code) try: # Execute the SQL command cursor.execute(sql) # Fetch all the rows in a list of lists. results = cursor.fetchall() if len(results) == 0: return False else: return True except: print "Error: unable to fecth data" # disconnect from server db.close() ==== read module=== This one was created to access the database and take the information for a determined equipment. #!/usr/bin/python import MySQLdb def readdb(code): # Open database connection db = MySQLdb.connect("localhost","root","cocolocoEC85","bodegaEIE" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = "SELECT * FROM equipo WHERE usuario = '%d'" % (code) try: # Execute the SQL command cursor.execute(sql) # Fetch all the rows in a list of lists. results = cursor.fetchall() if len(results) == 0: print "ningun equipo registrado al usuario '%d'" %(code) else: for row in results: placa = row[0] tipo = row[1] marca = row[2] modelo = row[3] usuario = row[4] # Now print fetched result print " " print "placa=%d, tipo=%s, marca=%s, modelo=%s, usuario=%s" % (placa, tipo, marca, modelo, usuario) print " " except: print "Error: unable to fecth data" # disconnect from server db.close() ===== clear module ===== When some returns the equipment, we have to erase his name from the database so we use this module: #!/usr/bin/python import MySQLdb def cleardb(data): # Open database connection db = MySQLdb.connect("localhost","user","bodega","bodegaEIE" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to UPDATE required records sql = "UPDATE equipo SET usuario = NULL WHERE placa = '%s'" %(data) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close() ==== linking the modules ===== We link all the modules in this little script. #!/usr/bin/python import sys from time import sleep from scanner import scan from update import updatedb from check import checkdb from read import readdb from clear import cleardb print "digite 'prestar', 'devolver', 'consultar' o 'exit' para lo que desee" exit=False while not exit: a=raw_input() if a=="salir": exit=True print "Bye" elif a=="prestar": equipo=scan() print "el equipo escaneado es '%d'" %(equipo) print "dijite ok si es correcto" b=raw_input() check=checkdb(equipo) if ((check == True) and (b == "ok")): usuario=scan() print "el usuario escaneado es '%d'" %(usuario) dato = (usuario,equipo) print "desea prestar al usuario '%d' el equipo '%d'? [si/no] " % dato c=raw_input() if c=="si": updatedb(dato) print "equipo prestado" elif c=="no": print "equipo no prestado, dijite 'scann' para nuevo intento" else: print "equipo no registrado en la base de datos" elif a=="devolver": equipo=scan() print "el equipo escaneado es '%d'" %(equipo) check=checkdb(equipo) if check == True: print "desea devolver '%d'? [si/no] " % (equipo) b=raw_input() if b=="si": cleardb(equipo) print "equipo devuelto" elif b=="no": print "no se ha devuelto el equipo" else: print "equipo no registrado en la base de datos" elif a=="consultar": code=scan() readdb(code) else: print "codigo incorrecto" print "digite 'prestar', 'devolver', 'consultar' o 'exit' para lo que desee" sleep (1.0) \\ [[teaching:ie0117:proyectos:2013:i:waconsys| go back]] ====== References ====== http://dev.mysql.com/doc/ http://www.mikusa.com/python-mysql-docs/query.html http://zbar.sourceforge.net/