Skip to content

Instantly share code, notes, and snippets.

@LordAro
Created May 16, 2014 20:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LordAro/8ffddeefcd27d08a35b9 to your computer and use it in GitHub Desktop.
Save LordAro/8ffddeefcd27d08a35b9 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python2
import cPickle as pickle
class Member:
def __init__(self, firstname, surname, postcode, owned_items):
self.firstname = firstname
self.surname = surname
self.postcode = postcode
self.owned_items = owned_items
self.ident = firstname + surname + postcode.replace(" ", "")
def __repr__(self):
return '<%s: %s : %s %s, %s, %s>' % (
self.__class__.__name__, self.ident, self.firstname,
self.surname, self.postcode, self.owned_items)
def to_JSON(self):
return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)
class Item:
def __init__(self, title, author, media, uid, member_id):
self.title = title
self.author = author
self.media = media
self.available = (member_id == None)
self.uid = uid
self.member_id = member_id
def __repr__(self):
return '<%s: %s : %s %s, %s, %s, %s>' % (
self.__class__.__name__, self.uid, self.title,
self.author, self.media, self.available, self.member_id)
def SaveDict(filename, savedict):
with open(filename, 'wb') as f:
pickle.dump(savedict, f)
def LoadDict(filename):
opened_dict = dict()
try:
with open(filename, 'rb') as f:
opened_dict = pickle.load(f)
finally:
return opened_dict
def AddItem(memberid=None):
if memberid != None and memberid not in member_list:
print "Error: Unknown member ID"
print "Please try again"
return
itemname = raw_input("What is the item's name? ")
itemauthor = raw_input("Who wrote/produced the item? ")
itemmedia = raw_input("What is the media type of the item? ")
# Generate UID
itemid = ""
for i in xrange(500): # Arbitary limit
itemid = itemname.replace(" ", "") + itemauthor.replace(" ", "") + str(i)
if itemid not in item_list:
break
item = Item(itemname, itemauthor, itemmedia, itemid, memberid)
item_list[itemid] = item
print "Added item: " + str(item)
return itemid
def AddMember():
membername = raw_input("What is the member's name? (\"firstname surname\") ")
names = membername.split()
if len(names) > 2:
print "Error: Invalid name"
print "Please try again"
return
memberpost = raw_input("What is the member's postcode? ")
if len(memberpost) > 8:
print "Error: Invalid postcode"
print "Please try again"
return
memberid = membername.replace(" ", "") + memberpost.replace(" ", "")
if memberid in member_list:
print "Error: Duplicate user"
print "Please try again"
return
# In case there is no surname
if len(names) == 2:
surname = names[1]
else:
surname = ""
member = Member(names[0], surname, memberpost, [])
member_list[memberid] = member
print "Added member: " + str(member)
num_items = raw_input("How many items does the user own? ")
user_item_list = []
i = 0
while i < num_items:
itemid = raw_input("Enter UID for item no. " + str(i + 1) + " ")
if itemid not in item_list:
new_item = raw_input("Warning: Item not in database. (create/retry) ")
if new_item == "create":
itemid = AddItem(memberid)
if itemid != None:
user_item_list.append(itemid)
else:
# Error entering item, try again
i -= 1
continue
else:
# Error entering item, try again
i -= 1
continue
elif not item_list[itemid].available:
print "Error: Item is unavailable"
else:
item_list[itemid].available = False
user_item_list.append(itemid)
i += 1
member_list[memberid].owned_items = user_item_list
return memberid
def DeleteMember():
memberid = raw_input("Enter the member ID to delete: ")
if memberid not in member_list:
print "Error: Cannot delete a member that doesn't exist!"
return
del member_list[memberid]
# Remove all references of the member
for key, value in item_list:
if value.member_id == memberid:
value.member_id = None
def DeleteItem():
itemid = raw_input("Enter the item ID to delete: ")
if itemid not in item_list:
print "Error: Cannot delete an item that doesn't exist!"
return
del item_list[itemid]
# Remove all references of the item
for key, value in member_list:
if itemid in value.owned_items:
value.owned_items.remove(itemid)
def BorrowItem():
memberid = raw_input("Enter ID of member: ")
if memberid not in member_list:
print "Error: Unrecognised member ID"
return
itemid = raw_input("Enter ID of item to borrow: ")
if itemid not in item_list:
print "Error: Unrecognised item ID"
return
if not item_list[itemid].available:
print "Error: Item is unavailable"
return
member_list[memberid].owned_items.append(itemid)
item_list[itemid].available = False
item_list[itemid].member_id = memberid
def ReturnItem():
itemid = raw_input("Enter ID of item to return: ")
if itemid not in item_list:
print "Error: Unrecognised item ID"
return
elif item_list[itemid].available:
print "Error: Item has not been borrowed"
return
for key, value in member_list:
if itemid in value.owned_items:
value.owned_items.remove(itemid)
item_list[itemid].member_id = None
def ListBorrowedItems():
memberid = raw_input("Enter ID of member: ")
if memberid not in member_list:
print "Error: Unrecognised member ID"
return
member = member_list[memberid]
print "Member \"" + member.firstname + " " + member.surname + "\" has borrowed:"
print str(member.owned_items)
member_list = LoadDict("members")
item_list = LoadDict("items")
print "Initial member list:\n" + str(member_list) + "\n\n"
print "Initial item list:\n" + str(item_list) + "\n"
# Dispatch dictionary
main_dict = {"addmember":AddMember, "additem":AddItem, "delmember":DeleteMember,
"delitem":DeleteItem, "borrowitem":BorrowItem, "returnitem":ReturnItem,
"listitem":ListBorrowedItems}
# Main loop
while(True):
userin = raw_input("What would you like to do?\n\
*addmember* - Add a member to the database\n\
*additem* - Add an item to the database\n\
*delmember* - Delete a member from the database\n\
*delitem* - Delete an item from the database\n\
*borrowitem* - Borrow an item\n\
*returnitem* - Return an item\n\
*listitem* - List the items borrowed by a member\n\
*exit* - Exit program\n\
")
func_call = main_dict.get(userin)
if func_call == None:
break
func_call()
print "Final member list:\n" + str(member_list) + "\n\n"
print "Final item list:\n" + str(item_list) + "\n"
SaveDict("members", member_list)
SaveDict("items", item_list)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment