Finished objectifying add/update book form

This commit is contained in:
John Ladan 2012-03-20 12:52:39 -04:00
parent b3592b4690
commit 1c04e6e7c5
2 changed files with 97 additions and 212 deletions

View File

@ -27,11 +27,12 @@ Keys:
# look up data from openlibrary.org using isbn
def openLibrary(isbn):
def openLibrary(ISBN):
isbn = str(ISBN)
jsondata = urlopen("http://openlibrary.org/api/books?format=json&jscmd=data&bibkeys=ISBN:"+isbn)
openBook = load(jsondata)
if "ISBN:"+isbn not in openBook:
return openBook
return {'isbn':isbn,'title':'Book not found'}
openBook = openBook["ISBN:"+isbn]
# create my custom dict for books with the info we want.
book = {"isbn" : isbn}
@ -68,13 +69,5 @@ def openLibrary(isbn):
book["subtitle"]=openBook["subtitle"]
return book
book = openLibrary("9780521714723")
print dumps(book, indent=2)
book = openLibrary("9780521565431")
print dumps(book, indent=2)
book = openLibrary("689145728392")
print dumps(book, indent=2)
book = openLibrary("9780321468932")
print dumps(book, indent=2)
book = openLibrary("9781555580414")
print dumps(book, indent=2)
book = openLibrary(9780865479104)
print dumps(book,indent=2)

View File

@ -1,24 +1,26 @@
import curses
class bookForm:
mx = my = 0
hl = 0
bt = -1
cursor = 0
textStart = 0
left = 0
top = 2
row = 2
caption = "Add a Book"
blabel = "Add"
labels = ["ISBN", "LCCN", "Title", "Subtitle", "Authors", "Edition",
"Publisher", "Publish Date", "Publish Year", "Publish Month", "Publish location",
"Publishers", "Publish Date", "Publish Year", "Publish Month", "Publish location",
"Pages", "Pagination", "Weight"]
entries = []
# redefineable functions lookup is called when 'enter' is pressed on ISBN
# and returns the looked-up book. Default returns nothing
def lookup(self,isbn):
return {'isbn':isbn}
def __init__(self,window,book={}):
self.w = window
self.w.resize(len(self.labels)+6,50)
@ -27,9 +29,10 @@ class bookForm:
def updateGeometry(self):
(self.my, self.mx) = self.w.getmaxyx()
self.left=0
for l in self.labels:
self.left = max(len(l),self.left)
self.left += 2
self.left += 4
self.width = self.mx-self.left-2
self.top = 2
# next, the buttons
@ -40,7 +43,7 @@ class bookForm:
self.entries=[]
for l in self.labels:
if l.lower() in book:
self.entries.append(book[l.lower()])
self.entries.append(str(book[l.lower()]))
else:
self.entries.append("")
@ -49,18 +52,21 @@ class bookForm:
self.w.box()
self.w.addstr(0,(self.mx-len(self.caption))/2,self.caption)
r=self.top
for l,v in zip(self.labels,self.entries):
for l in self.labels:
c = self.left-len(l)-2
self.w.addstr(r,c,l+":")
self.w.addnstr(r,self.left,v,self.width)
self.drawRow(r-self.top)
r+=1
self.w.addstr(r+1,self.bcol[0], "<cancel> <"+self.blabel+">")
self.w.refresh()
def drawRow(self,row):
r = self.top + row
self.w.addnstr(r,self.left, self.entries[row]+" "*self.width, self.width)
def highlight(self):
if self.bt == -1:
self.w.chgat(self.row, self.left, self.width, curses.A_UNDERLINE)
self.cursor = len(self.entries[self.hl])
self.w.move(self.row, self.left+self.cursor)
curses.curs_set(1)
else:
@ -82,9 +88,47 @@ class bookForm:
self.bt = min(self.bt,1)
self.row+=1
else:
self.mvCursor(+len(self.entries[self.hl]))
self.bt=-1
self.highlight()
def mvCursor(self,delta):
n = self.cursor + delta
n = max(n,0)
n = min(n,len(self.entries[self.hl]))
self.cursor = n
col = self.left + self.cursor - self.textStart
if col >= self.left and col < self.left+self.width:
self.w.move(self.row,col)
def insert(self,ch):
c = self.cursor
self.entries[self.hl]=self.entries[self.hl][:c] +ch+ self.entries[self.hl][c:]
self.drawRow(self.hl)
self.highlight()
self.mvCursor(+1)
def backspace(self):
if self.cursor>0:
self.entries[self.hl]=self.entries[self.hl][:self.cursor-1] + self.entries[self.hl][self.cursor:]
self.drawRow(self.hl)
self.highlight()
self.mvCursor(-1)
def delete(self):
c = self.cursor
self.entries[self.hl]=self.entries[self.hl][:c] + self.entries[self.hl][c+1:]
self.drawRow(self.hl)
self.highlight()
def returnBook():
book = {}
for k,v in zip(self.labels, self.entries):
if v!="" and k.lower()!="publish date":
book[k.lower()]=v
return book
def eventLoop(self):
self.w.keypad(1)
self.refresh()
@ -100,196 +144,44 @@ class bookForm:
self.mvHighlight(+1)
elif ch==curses.KEY_NPAGE:
self.mvHighlight(+len(self.labels))
elif ch==curses.KEY_LEFT:
if self.bt==-1:
self.mvCursor(-1)
else:
self.bt=0
elif ch==curses.KEY_HOME:
if self.bt==-1:
self.mvCursor(-len(self.entries[self.hl]))
elif ch==curses.KEY_RIGHT:
if self.bt==-1:
self.mvCursor(+1)
else:
self.bt=1
elif ch==curses.KEY_END:
if self.bt==-1:
self.mvCursor(+len(self.entries[self.hl]))
elif ch>=32 and ch<=126:
if self.bt==-1:
self.insert(curses.keyname(ch))
elif ch==curses.KEY_BACKSPACE:
if self.bt==-1:
self.backspace()
elif ch==curses.KEY_DC:
if self.bt==-1:
self.delete()
elif ch==10 or ch==curses.KEY_ENTER:
if self.hl==0:
book = self.lookup(self.entries[0])
self.updateEntries(book)
self.refresh()
elif self.bt==0:
return {}
elif self.bt==1:
return self.returnBook()
self.mvHighlight(+1)
self.w.refresh()
ch = self.w.getch()
def test(stdscr):
w = curses.newwin(10,10,10,10)
bf = bookForm(w)
bf.eventLoop()
curses.wrapper(test)
# items is a list of (label, value) pairs
def redrawForm(w, caption, items, buttonlabel, m):
(y,x)=w.getmaxyx()
w.border()
curses.curs_set(1)
w.addstr(1,1,caption)
r=3
for l,v in items:
c = m-len(l)-2
w.addstr(r,c,l+":")
w.addstr(r,m,v)
r+=2
w.addstr(r,x-len(buttonlabel)-len("<cancel>")-6, "<cancel> <"+buttonlabel+">")
w.refresh()
def lists_to_dict(l1, l2):
book = {}
for k,v in zip(l1,l2):
if v!="" and k.lower()!="publish date":
book[k.lower()]=v
return book
#the final form for book data entry - takes caption and book info.
def bookForm(caption, book, buttonlabel):
labels = ["ISBN", "LCCN", "Title", "Subtitle", "Authors", "Edition",
"Publisher", "Publish Date", "Publish Year", "Publish Month", "Publish location",
"Pages", "Pagination", "Weight"]
entries = []
m = 0
w=curses.newwin(34,70,1,10)
(y,x)=w.getmaxyx()
w.keypad(1)
redrawForm(w,caption,zip(labels,entries),buttonlabel,m)
bcol = [x-len(buttonlabel)-len("<cancel>")-6, x-len(buttonlabel)-4]
bwidth = [8,len(buttonlabel)+2]
highlight=0
b = -1
r=3
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
w.move(r,m+len(entries[highlight]))
cursor = len(entries[highlight])
ch = w.getch()
while (1==1):
if ch==27: #escape key
curses.curs_set(0)
w.clear()
w.refresh()
return {}
if ch==curses.KEY_UP:
if highlight == len(labels):
w.chgat(r,bcol[b],bwidth[b],curses.A_NORMAL)
highlight = len(labels)-1
b = -1
r=3+2*highlight
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
cursor = len(entries[highlight])
w.move(r,m+cursor)
curses.curs_set(1)
elif highlight!=0:
w.chgat(r,m,x-m-2,curses.A_NORMAL)
highlight -= 1
r=3+2*highlight
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
cursor = len(entries[highlight])
w.move(r,m+cursor)
elif ch==curses.KEY_PPAGE:
w.chgat(r,m,x-m-2,curses.A_NORMAL)
highlight=0
b=-1
r=3+2*highlight
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
cursor = len(entries[highlight])
w.move(r,m+cursor)
curses.curs_set(1)
elif ch==curses.KEY_DOWN:
if highlight >= len(labels) -1:
highlight = len(labels)
b += 1
b = min(b,1)
curses.curs_set(0)
w.chgat(r,m,x-m-2,curses.A_NORMAL)
r = y-3
w.chgat(r,bcol[b],bwidth[b],curses.A_REVERSE)
else:
w.chgat(r,m,x-m-2,curses.A_NORMAL)
highlight += 1
r=3+2*highlight
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
cursor = len(entries[highlight])
w.move(r,m+cursor)
elif ch==curses.KEY_NPAGE:
if highlight!=len(labels):
highlight = len(labels)
b += 1
b = min(b,1)
curses.curs_set(0)
w.chgat(r,m,x-m-2,curses.A_NORMAL)
r = y-3
w.chgat(r,bcol[b],bwidth[b],curses.A_REVERSE)
elif ch==curses.KEY_LEFT:
if highlight == len(labels):
w.chgat(r,bcol[b],bwidth[b],curses.A_NORMAL)
b=0
w.chgat(r,bcol[b],bwidth[b],curses.A_REVERSE)
else:
if cursor>0:
cursor-=1
w.move(r,m+cursor)
elif ch==curses.KEY_RIGHT:
if highlight == len(labels):
w.chgat(r,bcol[b],bwidth[b],curses.A_NORMAL)
b=1
w.chgat(r,bcol[b],bwidth[b],curses.A_REVERSE)
else:
if cursor < len(entries[highlight]):
cursor+=1
w.move(r,m+cursor)
elif ch>31 and ch<127:
if highlight != len(labels):
entries[highlight]=entries[highlight][:cursor] + curses.keyname(ch) + entries[highlight][cursor:]
cursor+=1
w.addnstr(r,m, entries[highlight]+(" "*40), x-m-2)
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
w.move(r,m+cursor)
elif ch==curses.KEY_BACKSPACE:
if highlight != len(labels) and cursor!=0:
cursor-=1
entries[highlight]=entries[highlight][:cursor] + entries[highlight][cursor+1:]
w.addnstr(r,m, entries[highlight]+(" "*40), x-m-2)
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
w.move(r,m+cursor)
elif ch==curses.KEY_DC:
if highlight != len(labels):
entries[highlight]=entries[highlight][:cursor] + entries[highlight][cursor+1:]
w.addnstr(r,m, entries[highlight]+(" "*40), x-m-2)
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
w.move(r,m+cursor)
elif ch==curses.KEY_HOME:
if highlight != len(labels):
cursor=0
w.move(r,m+cursor)
elif ch==curses.KEY_END:
if highlight != len(labels):
cursor=len(entries[highlight])
w.move(r,m+cursor)
elif ch==10:
if b != -1:
if b == 0:
w.clear()
w.refresh()
return {}
elif b == 1:
w.clear()
w.refresh()
return lists_to_dict(labels,entries)
elif highlight == len(labels)-1:
highlight = len(labels)
b=0
curses.curs_set(0)
w.chgat(r,m,x-m-2,curses.A_NORMAL)
r = y-3
w.chgat(r,bcol[b],bwidth[b],curses.A_REVERSE)
else:
w.chgat(r,m,x-m-2,curses.A_NORMAL)
highlight += 1
r=3+2*highlight
w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
cursor = len(entries[highlight])
w.move(r,m+cursor)
w.refresh()
ch = w.getch()
curses.curs_set(0)
w.clear()
w.refresh()
return {}