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
        }