-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmodels.py
More file actions
126 lines (107 loc) · 4.04 KB
/
models.py
File metadata and controls
126 lines (107 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import json
import os
class Book:
def __init__(self, title, author, isbn, genre, is_available=True):
self.title = title
self.author = author
self.isbn = isbn
self.genre = genre
self.is_available = is_available
def to_dict(self):
return {
"title": self.title,
"author": self.author,
"isbn": self.isbn,
"genre": self.genre,
"is_available": self.is_available
}
@classmethod
def from_dict(cls, data):
return cls(data["title"], data["author"], data["isbn"], data["genre"], data["is_available"])
class Person:
def __init__(self, name, email):
self.name = name
self.email = email
class Member(Person):
def __init__(self, name, email, member_id, borrowed_books=None):
super().__init__(name, email)
self.member_id = member_id
self.borrowed_books = borrowed_books if borrowed_books else []
def to_dict(self):
return {
"name": self.name,
"email": self.email,
"member_id": self.member_id,
"borrowed_books": self.borrowed_books
}
@classmethod
def from_dict(cls, data):
return cls(data["name"], data["email"], data["member_id"], data.get("borrowed_books", []))
class Library:
def __init__(self):
self.books = []
self.members = []
self.books_file = "data/books.json"
self.members_file = "data/members.json"
self.load_data()
def add_book(self, book):
self.books.append(book)
self.save_data()
def register_member(self, member):
self.members.append(member)
self.save_data()
def find_book(self, isbn):
for book in self.books:
if book.isbn == isbn:
return book
return None
def find_member(self, member_id):
for member in self.members:
if member.member_id == member_id:
return member
return None
def borrow_book(self, member_id, isbn):
member = self.find_member(member_id)
book = self.find_book(isbn)
if member and book and book.is_available:
book.is_available = False
member.borrowed_books.append(book.to_dict())
self.save_data()
return True, "Book borrowed successfully!"
elif not book.is_available:
return False, "Book is currently unavailable."
else:
return False, "Member or Book not found."
def return_book(self, member_id, isbn):
member = self.find_member(member_id)
book = self.find_book(isbn)
if member and book:
# Check if member actually has this book
for borrowed in member.borrowed_books:
if borrowed['isbn'] == isbn:
book.is_available = True
member.borrowed_books.remove(borrowed)
self.save_data()
return True, "Book returned successfully!"
return False, "Member does not have this book."
return False, "Member or Book not found."
def save_data(self):
with open(self.books_file, 'w') as f:
json.dump([book.to_dict() for book in self.books], f, indent=4)
with open(self.members_file, 'w') as f:
json.dump([member.to_dict() for member in self.members], f, indent=4)
def load_data(self):
if os.path.exists(self.books_file):
with open(self.books_file, 'r') as f:
try:
books_data = json.load(f)
self.books = [Book.from_dict(b) for b in books_data]
except json.JSONDecodeError:
self.books = []
if os.path.exists(self.members_file):
with open(self.members_file, 'r') as f:
try:
members_data = json.load(f)
self.members = [Member.from_dict(m) for m in members_data]
except json.JSONDecodeError:
self.members = []