This repository was archived by the owner on May 11, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
93 lines (73 loc) · 2.9 KB
/
models.py
File metadata and controls
93 lines (73 loc) · 2.9 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
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.mutable import MutableList
from sqlalchemy.dialects.postgresql import JSON
db = SQLAlchemy()
def is_better_cabin_possible(group_size):
available_cabins = db.session.query(Cabin).filter(
Cabin.is_locked == False,
(Cabin.capacity - Cabin.occupied_places) == group_size
).all()
return available_cabins
def get_member_group(member_id):
token = db.session.query(User).filter(User.id == member_id).first().groupCode
return db.session.query(User).filter(User.groupCode == token).all()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
email = db.Column(db.String(50))
groupCode = db.Column(db.String(20))
is_admin = db.Column(db.Boolean, default=False)
cabin_id = db.Column(db.Integer, default=None)
def to_dict(self):
return {
"id": self.id,
"name": self.name,
"email": self.email,
"groupCode": self.groupCode,
"is_admin": self.is_admin,
"cabin_id": self.cabin_id
}
class Cabin(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
capacity = db.Column(db.Integer)
occupied_places = db.Column(db.Integer, default=0)
members = db.Column(MutableList.as_mutable(JSON), default=list)
is_locked = db.Column(db.Boolean, default=True)
unlock_time = db.Column(db.DateTime, nullable=True)
def to_dict(self):
return {
"id": self.id,
"name": self.name,
"capacity": self.capacity,
"occupied_places": self.occupied_places,
"members": self.members,
"is_locked": self.is_locked,
"unlock_time": self.unlock_time
}
def add_member(self, member_id):
group_members = get_member_group(member_id)
group_size = len(group_members)
free_capacity = self.capacity - self.occupied_places
if free_capacity < group_size:
raise ValueError("Group size exceeds available cabin capacity.")
if free_capacity != group_size:
better_cabins = is_better_cabin_possible(group_size)
if better_cabins:
raise ValueError(f"Cabins: {better_cabins} are better option")
for member in group_members:
self.members.append(member.id)
member.cabin_id = self.id
self.occupied_places += 1
return None
def remove_member(self, user_id):
group_members = get_member_group(user_id)
for member in group_members:
self.members.remove(member.id)
member.cabin_id = None
self.occupied_places -= 1
return None
def check_unlock_condition(self):
if self.unlock_time and datetime.utcnow() >= self.unlock_time:
self.is_locked = False