@ -20,6 +20,7 @@ db_engine = {}
 
			
		
	
		
		
			
				
					
					db_metadata  =  { } db_metadata  =  { }  
			
		
	
		
		
			
				
					
					parts  =  { } parts  =  { }  
			
		
	
		
		
			
				
					
					octopartURL  = " " octopartURL  = " "  
			
		
	
		
		
			
				
					
					baseURL  =  " /parts-dev "  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					def  getContainers ( ) : def  getContainers ( ) :  
			
		
	
		
		
			
				
					
					    query  =  " select id, name from containers order by UPPER(name); " 
    query  =  " select id, name from containers order by UPPER(name); " 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -65,11 +66,11 @@ def serveImage(img):
 
			
		
	
		
		
			
				
					
					    img_io . seek ( 0 ) 
    img_io . seek ( 0 ) 
 
			
		
	
		
		
			
				
					
					    return  send_file ( img_io ,  mimetype = ' image/png ' ) 
    return  send_file ( img_io ,  mimetype = ' image/png ' ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts ' ,  strict_slashes = True ) @app.route ( baseURL ,  strict_slashes = True )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  index ( ) : def  index ( ) :  
			
		
	
		
		
			
				
					
					    return  render_template ( ' partsearch.html ' ,  containers = getContainers ( ) 
    return  render_template ( ' partsearch.html ' ,  containers = getContainers ( ) , baseURL = baseURL  )
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /getlocationsInContainer/<containerID>' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  get_locations_in_container ( containerID ) : def  get_locations_in_container ( containerID ) :  
			
		
	
		
		
			
				
					
					    s  =  ' select id, name from locations where container_id = :id order by name; ' 
    s  =  ' select id, name from locations where container_id = :id order by name; ' 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( text ( s ) ,  id = containerID ) 
    r  =  db_engine . execute ( text ( s ) ,  id = containerID ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -79,7 +80,7 @@ def get_locations_in_container(containerID):
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  json . dumps ( l ) 
    return  json . dumps ( l ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /getlocationURL/<locationID>' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  get_locationURL ( locationID ) : def  get_locationURL ( locationID ) :  
			
		
	
		
		
			
				
					
					    s  =  ' select map from locations where id = :id; ' 
    s  =  ' select map from locations where id = :id; ' 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( text ( s ) ,  id = locationID ) 
    r  =  db_engine . execute ( text ( s ) ,  id = locationID ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -89,7 +90,7 @@ def get_locationURL(locationID):
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  l [ 0 ] [ 0 ] 
    return  l [ 0 ] [ 0 ] 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /locationEditor' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  locationEditor ( ) : def  locationEditor ( ) :  
			
		
	
		
		
			
				
					
					    query  =  ' select c.name as container, l.name as name, l.id, c.id as container_id from locations as l inner join containers as c on l.container_id = c.id order by container, name; ' 
    query  =  ' select c.name as container, l.name as name, l.id, c.id as container_id from locations as l inner join containers as c on l.container_id = c.id order by container, name; ' 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( text ( query ) ) 
    r  =  db_engine . execute ( text ( query ) ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -97,9 +98,20 @@ def locationEditor():
 
			
		
	
		
		
			
				
					
					    for  row  in  r : 
    for  row  in  r : 
 
			
		
	
		
		
			
				
					
					        locations . append ( dict ( row ) ) 
        locations . append ( dict ( row ) ) 
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  render_template ( ' locationEditor.html ' ,  locations = locations ,  containers = getContainers ( ) ) 
    return  render_template ( ' locationEditor.html ' ,  locations = locations ,  containers = getContainers ( ) , baseURL = baseURL ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					@app.route ( baseURL + ' /userEditor ' )  
			
		
	
		
		
			
				
					
					def  userEditor ( ) :  
			
		
	
		
		
			
				
					
					    query  =  ' select c.name as container, l.name as name, l.id, c.id as container_id from locations as l inner join containers as c on l.container_id = c.id order by container, name; ' 
 
			
		
	
		
		
			
				
					
					    query  =  ' select id, username from users; ' 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( text ( query ) ) 
 
			
		
	
		
		
			
				
					
					    users  =  [ ] 
 
			
		
	
		
		
			
				
					
					    for  row  in  r : 
 
			
		
	
		
		
			
				
					
					        users . append ( dict ( row ) ) 
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  render_template ( ' userEditor.html ' ,  users = users ,  containers = getContainers ( ) , baseURL = baseURL ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts/alterLocation/<locationID> ' ,  methods = [ ' POST ' ] ) @app.route ( baseURL + ' ' ,  methods = [ ' POST ' ] )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					@requires_auth @requires_auth  
			
		
	
		
		
			
				
					
					def  alterLocation ( locationID ) : def  alterLocation ( locationID ) :  
			
		
	
		
		
			
				
					
					    locationID  =  int ( locationID ) 
    locationID  =  int ( locationID ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -121,8 +133,30 @@ def alterLocation(locationID):
 
			
		
	
		
		
			
				
					
					        r  =  db_engine . execute ( s ,  name = request . form [ ' name ' ] , container = request . form [ ' container ' ] , locationID = locationID ) ; 
        r  =  db_engine . execute ( s ,  name = request . form [ ' name ' ] , container = request . form [ ' container ' ] , locationID = locationID ) ; 
 
			
		
	
		
		
			
				
					
					        r . close ( ) 
        r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  ' { " status " : " ok " } ' 
    return  ' { " status " : " ok " } ' 
 
			
		
	
		
		
			
				
					
					@app.route ( baseURL + ' /alterUser/<userID> ' ,  methods = [ ' POST ' ] )  
			
		
	
		
		
			
				
					
					@requires_auth  
			
		
	
		
		
			
				
					
					def  alterUser ( userID ) :  
			
		
	
		
		
			
				
					
					    userID  =  int ( userID ) 
 
			
		
	
		
		
			
				
					
					    s  =  ' ' 
 
			
		
	
		
		
			
				
					
					    if  userID  <  0 : 
 
			
		
	
		
		
			
				
					
					        # New entry 
 
			
		
	
		
		
			
				
					
					        s  =   ' insert into users (username, password)  ' 
 
			
		
	
		
		
			
				
					
					        s  + =  ' values (:name, :password); ' 
 
			
		
	
		
		
			
				
					
					        s  =  text ( s ) 
 
			
		
	
		
		
			
				
					
					        r  =  db_engine . execute ( s , username = request . form [ ' name ' ] , password = request . form [ ' password ' ] ) ; 
 
			
		
	
		
		
			
				
					
					        r . close ( ) 
 
			
		
	
		
		
			
				
					
					        return  ' { " status " : " ok " } ' 
 
			
		
	
		
		
			
				
					
					    else : 
 
			
		
	
		
		
			
				
					
					        # Modify entry 
 
			
		
	
		
		
			
				
					
					        s  =  ' update users  ' 
 
			
		
	
		
		
			
				
					
					        s  + =  ' set username=:name, password=:password  ' 
 
			
		
	
		
		
			
				
					
					        s  + =  ' where id=:userID; ' 
 
			
		
	
		
		
			
				
					
					        s  =  text ( s ) 
 
			
		
	
		
		
			
				
					
					        r  =  db_engine . execute ( s ,  name = request . form [ ' name ' ] , password = request . form [ ' password ' ] , userID = userID ) ; 
 
			
		
	
		
		
			
				
					
					        r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  ' { " status " : " ok " } ' 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts/getpartinfo/<partID> ' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  get_part_info ( partID ) : def  get_part_info ( partID ) :  
			
		
	
		
		
			
				
					
					    s  =  ' select p.id,partno,description,notes, c.name || l.name as location_descriptor, location_id, container_id, datasheet from parts as p inner join locations as l on p.location_id = l.id inner join containers as c on l.container_id = c.id where p.id = :id; ' 
    s  =  ' select p.id,partno,description,notes, c.name || l.name as location_descriptor, location_id, container_id, datasheet from parts as p inner join locations as l on p.location_id = l.id inner join containers as c on l.container_id = c.id where p.id = :id; ' 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( text ( s ) ,  id = partID ) 
    r  =  db_engine . execute ( text ( s ) ,  id = partID ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -132,7 +166,7 @@ def get_part_info(partID):
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  json . dumps ( l [ 0 ] ) 
    return  json . dumps ( l [ 0 ] ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /query/<filter_dummy>/<query>' )  # TODO: maybe change AND to OR or maybe not @app.route ( baseURL + ' ' )  # TODO: maybe change AND to OR or maybe not  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  query ( filter_dummy ,  query ) : def  query ( filter_dummy ,  query ) :  
			
		
	
		
		
			
				
					
					    filter  =  request . args . to_dict ( ) 
    filter  =  request . args . to_dict ( ) 
 
			
		
	
		
		
			
				
					
					    keywords  =  query . split ( )  # Default splits with spaces 
    keywords  =  query . split ( )  # Default splits with spaces 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -171,7 +205,7 @@ def query(filter_dummy, query):
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  json . dumps ( l ) 
    return  json . dumps ( l ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /map/<containerID>' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  getMap ( containerID ) : def  getMap ( containerID ) :  
			
		
	
		
		
			
				
					
					    s  =  ' select map, overlay from containers where id = :id; ' 
    s  =  ' select map, overlay from containers where id = :id; ' 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( text ( s ) ,  id = containerID ) 
    r  =  db_engine . execute ( text ( s ) ,  id = containerID ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -196,14 +230,14 @@ def getMap(containerID):
 
			
		
	
		
		
			
				
					
					    return  serveImage ( mapimage ) 
    return  serveImage ( mapimage ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /getfile/<filename>' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  getfile ( filename ) : def  getfile ( filename ) :  
			
		
	
		
		
			
				
					
					    if ( re . match ( ' ^[ \ w \ -_]+.[p|P][d|D][f|F]$ ' ,  filename )  ==  None ) : 
    if ( re . match ( ' ^[ \ w \ -_]+.[p|P][d|D][f|F]$ ' ,  filename )  ==  None ) : 
 
			
		
	
		
		
			
				
					
					        return  ' No injections pls. ' 
        return  ' No injections pls. ' 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    return  send_from_directory ( ' /srv/datasheets/ ' ,  filename ) 
    return  send_from_directory ( ' /srv/datasheets/ ' ,  filename ) 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /alter/<partID>' ,  methods = [ ' POST ' ] ) @app.route ( baseURL + ' ' ,  methods = [ ' POST ' ] )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					@requires_auth @requires_auth  
			
		
	
		
		
			
				
					
					def  alter ( partID ) : def  alter ( partID ) :  
			
		
	
		
		
			
				
					
					    partID  =  int ( partID ) 
    partID  =  int ( partID ) 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -276,7 +310,7 @@ def alter(partID):
 
			
		
	
		
		
			
				
					
					    r . close ( ) 
    r . close ( ) 
 
			
		
	
		
		
			
				
					
					    return  ' { " status " : " ok " ,  " part_id "  :  '  +  str ( new_id )  +  ' } ' 
    return  ' { " status " : " ok " ,  " part_id "  :  '  +  str ( new_id )  +  ' } ' 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /delete/<partID>' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					@requires_auth @requires_auth  
			
		
	
		
		
			
				
					
					def  delete ( partID ) : def  delete ( partID ) :  
			
		
	
		
		
			
				
					
					    if  int ( partID )  <  0 : 
    if  int ( partID )  <  0 : 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -285,7 +319,7 @@ def delete(partID):
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( s ,  id = partID ) 
    r  =  db_engine . execute ( s ,  id = partID ) 
 
			
		
	
		
		
			
				
					
					    return  ' { " status " : " ok " } ' 
    return  ' { " status " : " ok " } ' 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts /deleteLocation/<locationID>' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					@requires_auth @requires_auth  
			
		
	
		
		
			
				
					
					def  deleteLocation ( locationID ) : def  deleteLocation ( locationID ) :  
			
		
	
		
		
			
				
					
					    if  int ( locationID )  <  0 : 
    if  int ( locationID )  <  0 : 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -293,8 +327,16 @@ def deleteLocation(locationID):
 
			
		
	
		
		
			
				
					
					    s  =  text ( ' delete from locations where id=:id; ' ) 
    s  =  text ( ' delete from locations where id=:id; ' ) 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( s ,  id = locationID ) 
    r  =  db_engine . execute ( s ,  id = locationID ) 
 
			
		
	
		
		
			
				
					
					    return  ' { " status " : " ok " } ' 
    return  ' { " status " : " ok " } ' 
 
			
		
	
		
		
			
				
					
					@app.route ( baseURL + ' /deleteUser/<userID> ' )  
			
		
	
		
		
			
				
					
					@requires_auth  
			
		
	
		
		
			
				
					
					def  deleteUser ( userID ) :  
			
		
	
		
		
			
				
					
					    if  int ( userID )  <  0 : 
 
			
		
	
		
		
			
				
					
					        abort ( 400 ) 
 
			
		
	
		
		
			
				
					
					    s  =  text ( ' delete from users where id=:id; ' ) 
 
			
		
	
		
		
			
				
					
					    r  =  db_engine . execute ( s ,  id = userID ) 
 
			
		
	
		
		
			
				
					
					    return  ' { " status " : " ok " } ' 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					@app.route ( ' /parts/fetchOctopartSnippet/<searchTerm> ' ) @app.route ( baseURL + ' ' )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					def  fetchOctopartSnippet ( searchTerm ) : def  fetchOctopartSnippet ( searchTerm ) :  
			
		
	
		
		
			
				
					
					    if  octopartURL  ==  ' ' : 
    if  octopartURL  ==  ' ' : 
 
			
		
	
		
		
			
				
					
					        return  ' { " result " : " octopart integration not enabled " } ' 
        return  ' { " result " : " octopart integration not enabled " } ' 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -334,7 +376,7 @@ if __name__ == '__main__':
 
			
		
	
		
		
			
				
					
					    app . config [ ' SESSION_TYPE ' ]  =  ' memcached ' 
    app . config [ ' SESSION_TYPE ' ]  =  ' memcached ' 
 
			
		
	
		
		
			
				
					
					    with  open ( ' admin.json ' )  as  f : 
    with  open ( ' admin.json ' )  as  f : 
 
			
		
	
		
		
			
				
					
					        postgres_credentials  =  json . load ( f ) 
        postgres_credentials  =  json . load ( f ) 
 
			
		
	
		
		
			
				
					
					    db_engine ,  db_metadata  =  connect ( postgres_credentials [ ' username ' ] ,  postgres_credentials [ ' password ' ] ,  ' parts_v 2 ' ) 
    db_engine ,  db_metadata  =  connect ( postgres_credentials [ ' username ' ] ,  postgres_credentials [ ' password ' ] ,  ' parts_v 3 ' ) 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					    parts  =  sqlalchemy . Table ( ' parts ' ,  db_metadata ) 
    parts  =  sqlalchemy . Table ( ' parts ' ,  db_metadata ) 
 
			
		
	
		
		
			
				
					
					    try : 
    try : 
 
			
		
	
		
		
			
				
					
					        with  open ( ' octopartAPIkey.json ' )  as  f : 
        with  open ( ' octopartAPIkey.json ' )  as  f : 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -350,4 +392,4 @@ if __name__ == '__main__':
 
			
		
	
		
		
			
				
					
					    ''' s = select([parts]).where(parts.c.notes !=  ' ' ) 
    ''' s = select([parts]).where(parts.c.notes !=  ' ' ) 
 
			
		
	
		
		
			
				
					
					    for  row  in  db_engine . execute ( s ) : 
    for  row  in  db_engine . execute ( s ) : 
 
			
		
	
		
		
			
				
					
					        print  row ''' 
        print  row ''' 
 
			
		
	
		
		
			
				
					
					    app . run ( ' 0.0.0.0 ' ) 
    app . run ( host = ' 127.0.0.1 ' ,  port = ' 5001 ' ,  debug = True )