Spaces:
No application file
No application file
File size: 4,396 Bytes
58668c3 |
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 127 128 129 130 |
"""
Database models for Library Management System
"""
from datetime import datetime, timedelta
from flask_login import UserMixin
class User(UserMixin):
"""User model for authentication and role management"""
ROLES = {
'admin': 'Admin',
'librarian': 'Librarian',
'student': 'Student'
}
def __init__(self, id, name, email, password, role='student', department=None, contact=None, created_at=None):
self.id = id
self.name = name
self.email = email
self.password = password # Should be hashed
self.role = role
self.department = department
self.contact = contact
self.created_at = created_at if created_at else datetime.now()
def is_admin(self):
return self.role == 'admin'
def is_librarian(self):
return self.role == 'librarian'
def is_student(self):
return self.role == 'student'
def can_manage_books(self):
return self.role in ['admin', 'librarian']
def can_manage_users(self):
return self.role in ['admin', 'librarian']
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'email': self.email,
'password': self.password,
'role': self.role,
'department': self.department,
'contact': self.contact,
'created_at': self.created_at.isoformat() if isinstance(self.created_at, datetime) else self.created_at
}
class Book:
"""Book model"""
def __init__(self, book_id, title, author, isbn, category, publisher,
year, total_copies, shelf_no, cover_image=None, available_copies=None, created_at=None):
self.book_id = book_id
self.title = title
self.author = author
self.isbn = isbn
self.category = category
self.publisher = publisher
self.year = year
self.total_copies = total_copies
self.available_copies = available_copies if available_copies is not None else total_copies
self.shelf_no = shelf_no
self.cover_image = cover_image
self.created_at = created_at if created_at else datetime.now()
def is_available(self):
return self.available_copies > 0
def to_dict(self):
return {
'book_id': self.book_id,
'title': self.title,
'author': self.author,
'isbn': self.isbn,
'category': self.category,
'publisher': self.publisher,
'year': self.year,
'total_copies': self.total_copies,
'available_copies': self.available_copies,
'shelf_no': self.shelf_no,
'cover_image': self.cover_image,
'created_at': self.created_at.isoformat() if isinstance(self.created_at, datetime) else self.created_at
}
class Issue:
"""Book issue/borrowing record"""
def __init__(self, issue_id, student_id, book_id, issue_date=None, due_date=None,
return_date=None, status='issued'):
self.issue_id = issue_id
self.student_id = student_id
self.book_id = book_id
self.issue_date = issue_date or datetime.now()
self.due_date = due_date or (datetime.now() + timedelta(days=14)) # 14 days default
self.return_date = return_date
self.status = status # 'issued', 'returned', 'overdue'
def is_overdue(self):
if self.status == 'returned':
return False
return datetime.now() > self.due_date
def days_overdue(self):
if not self.is_overdue():
return 0
if self.return_date:
return (self.return_date - self.due_date).days
return (datetime.now() - self.due_date).days
def to_dict(self):
return {
'issue_id': self.issue_id,
'student_id': self.student_id,
'book_id': self.book_id,
'issue_date': self.issue_date.isoformat() if isinstance(self.issue_date, datetime) else self.issue_date,
'due_date': self.due_date.isoformat() if isinstance(self.due_date, datetime) else self.due_date,
'return_date': self.return_date.isoformat() if isinstance(self.return_date, datetime) else self.return_date,
'status': self.status
}
|