dibbler/helpers.py
oysteini c2342397eb Reimplementert confirm som meny; mer tegnkodingshakking.
Har nå mulighet for default-valg i confirm (default-en vises med stor
bokstav, som i '(Y/n)', og velges hvis man skriver en tom linje), og
confirm leser input på samme måte som alt annet (via Menu.input_str).

Har laget en funksjon safe_str som prøver å gjøre om et vilkårlig
objekt til noe Python kan printe uten å bli sur.  Tok i bruk denne i
raw_input-kallet i Menu.input_str (det viser seg at raw_input blir
muggen hvis den får et unicode-objekt som inneholder ikke-ASCII-tegn).
2010-05-11 19:23:52 +00:00

102 lines
2.6 KiB
Python

from db import *
from sqlalchemy import or_
def search_user(string, session):
exact_match = session.query(User).filter(or_(User.name==string, User.card==string)).first()
if exact_match:
return exact_match
user_list = session.query(User).filter(or_(User.name.ilike('%'+string+'%'),
User.card.ilike('%'+string+'%'))).all()
return user_list
def search_product(string, session):
exact_match = session.query(Product)\
.filter(or_(Product.bar_code==string,
Product.name==string)).first()
if exact_match:
return exact_match
product_list = session.query(Product)\
.filter(or_(Product.bar_code.ilike('%'+string+'%'),
Product.name.ilike('%'+string+'%'))).all()
return product_list
# def guess_data_type(string):
# if string.startswith('NTNU'):
# return 'card'
# if string.isdigit():
# return 'bar_code'
# if string.isalpha() and string.islower():
# return 'username'
# return 'product_name'
# def retrieve_user(string, session):
# # first = session.query(User).filter(or_(User.name==string, User.card==string)).first()
# search = search_user(string,session)
# if isinstance(search,User):
# print "Found user "+search.name
# return search
# else:
# if len(search) == 0:
# print "No users found matching your search"
# return None
# if len(search) == 1:
# print "Found one user: "+list[0].name
# if confirm():
# return list[0]
# else:
# return None
# else:
# print "Found "+str(len(search))+" users:"
# return select_from_list(search)
# def confirm(prompt='Confirm? (y/n) '):
# while True:
# input = raw_input(prompt)
# if input in ["y","yes"]:
# return True
# elif input in ["n","no"]:
# return False
# else:
# print "Nonsense!"
# def select_from_list(list):
# while True:
# for i in range(len(list)):
# print i+1, " ) ", list[i].name
# choice = raw_input("Select user :\n")
# if choice in [str(x+1) for x in range(len(list))]:
# return list[int(choice)-1]
# else:
# return None
def argmax(d, all=False, value=None):
maxarg = None
maxargs = []
if value != None:
dd = d
d = {}
for key in dd.keys():
d[key] = value(dd[key])
for key in d.keys():
if maxarg == None or d[key] > d[maxarg]:
maxarg = key
if all:
return filter(lambda k: d[k] == d[maxarg], d.keys())
return maxarg
def safe_str(obj):
'''
Ugly hack to avoid Python complaining about encodings.
Call this on any object to turn it into a string which is
(hopefully) safe for printing.
'''
if isinstance(obj, str):
return obj
if isinstance(obj, unicode):
return obj.encode('utf8')
else:
return safe_str(unicode(obj))