Skip to content

Commit 4f23b4a

Browse files
authored
Phone field implementation (#84)
* phone field implementation * bug fix
1 parent 82443a9 commit 4f23b4a

4 files changed

Lines changed: 54 additions & 30 deletions

File tree

app/api/web_api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def api_get_user_permissions():
8585
@web_api.route("/api/users", methods=["POST"])
8686
def api_add_user():
8787
user_data = request.get_json()
88-
user = User(user_data["name"], user_data["key"], user_data["email"])
88+
user = User(user_data["name"], user_data["email"], user_data["phone"], user_data["key"])
8989

9090
number_of_new_user_added = user.save()
9191

@@ -101,23 +101,23 @@ def api_add_user():
101101

102102
@web_api.route("/api/users/<user_key>", methods=["DELETE"])
103103
def api_delete_user(user_key):
104-
user = User(key=user_key, name=None)
104+
user = User(key=user_key, name=None, email=None, phone=None)
105105
user.delete()
106106

107107
return jsonify({"message": "User deleted successfully"})
108108

109109

110110
@web_api.route("/api/users/<user_key>/devices/<device_id>", methods=["POST"])
111111
def api_add_user_permission(user_key, device_id):
112-
user = User(key=user_key, name=None)
112+
user = User(key=user_key, name=None, email=None, phone=None)
113113
user.add_permission(device_id)
114114

115115
return jsonify({"message": "User permission added successfully"})
116116

117117

118118
@web_api.route("/api/users/<user_key>/devices/<device_id>", methods=["DELETE"])
119119
def api_remove_user_permission(user_key, device_id):
120-
user = User(key=user_key, name=None)
120+
user = User(key=user_key, name=None, email=None, phone=None)
121121
user.remove_permission(device_id)
122122

123123
return jsonify({"message": "User permission removed successfully"})

app/models/user.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44

55
class User:
6-
def __init__(self, name, key, email=None):
6+
def __init__(self, name, email, phone, key):
77
self.name = name
8-
self.key = key
98
self.email = email
9+
self.phone = phone
10+
self.key = key
1011

1112
@classmethod
1213
def get_by_key(cls, key):
@@ -15,7 +16,7 @@ def get_by_key(cls, key):
1516
cursor.execute("SELECT * FROM users WHERE key = ?", (key,))
1617
result = cursor.fetchone()
1718
if result:
18-
return User(result[0], result[1], result[2])
19+
return User(result[0], result[1], result[2], result[3])
1920

2021
return None
2122

@@ -33,15 +34,16 @@ def save(self):
3334
number_of_new_user = 0
3435
if existing_user:
3536
# Update existing user data
37+
# Updating mechanism needs to be improved
3638
cursor.execute(
3739
"UPDATE users SET name = ?, key = ? WHERE email = ?",
38-
(self.name, self.key, self.email if self.email else None),
40+
(self.name, self.key, self.email),
3941
)
4042
else:
4143
# Create new user
4244
cursor.execute(
43-
"INSERT INTO users (name, key, email) VALUES (?, ?, ?)",
44-
(self.name, self.key, self.email if self.email else None),
45+
"INSERT INTO users (name, email, phone, key) VALUES (?, ?, ?, ?)",
46+
(self.name, self.email, self.phone, self.key),
4547
)
4648
number_of_new_user = 1
4749
conn.commit()
@@ -79,7 +81,7 @@ def get_permissions(cls, user_key=None):
7981
if user_key:
8082
cursor.execute(
8183
"""
82-
SELECT users.name, users.key, users.email,
84+
SELECT users.name, users.email, users.phone, users.key,
8385
(SELECT operation_time
8486
FROM event_logs
8587
WHERE user_key = users.key
@@ -93,7 +95,7 @@ def get_permissions(cls, user_key=None):
9395
else:
9496
cursor.execute(
9597
"""
96-
SELECT users.name, users.key, users.email,
98+
SELECT users.name, users.email, users.phone, users.key,
9799
(SELECT operation_time
98100
FROM event_logs
99101
WHERE user_key = users.key
@@ -105,9 +107,10 @@ def get_permissions(cls, user_key=None):
105107

106108
for row in cursor.fetchall():
107109
user_name = row[0]
108-
user_key = row[1]
109-
user_email = row[2] if row[2] else None # Handle email being None
110-
latest_activity = row[3]
110+
user_email = row[1] if row[1] else None # Handle email being None
111+
user_phone = row[2] if row[2] else None # Handle phone being None
112+
user_key = row[3]
113+
latest_activity = row[4]
111114

112115
# Get device permissions for the current user
113116
device_permissions = []
@@ -138,8 +141,9 @@ def get_permissions(cls, user_key=None):
138141
# Combine user information and permissions into a single record
139142
user_record = {
140143
"user_name": user_name,
141-
"user_key": user_key,
142144
"user_email": user_email,
145+
"user_phone": user_phone,
146+
"user_key": user_key,
143147
"permissions": device_permissions,
144148
"latest_activity": latest_activity,
145149
}

app/schema.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ CREATE TABLE IF NOT EXISTS admins
77
CREATE TABLE IF NOT EXISTS users
88
(
99
name TEXT NOT NULL,
10-
key TEXT NOT NULL,
11-
email TEXT NOT NULL
10+
email TEXT NOT NULL,
11+
phone TEXT DEFAULT NULL,
12+
key TEXT NOT NULL
13+
1214
);
1315
CREATE TABLE IF NOT EXISTS permissions
1416
(

app/templates/prismo/users.html

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,18 @@
66
<div class="card-body">
77
<h5 class="card-title">Add last used RFID card as new user: <span id="used-key-at"></span></h5>
88
<div class="input-group mb-3">
9-
<button class="btn btn-primary" type="submit" onclick="addUser(document.getElementById('user_name').value, document.getElementById('user_email').value)" ><i class="bi bi-person-add"></i> Add User</button>
9+
<button
10+
class="btn btn-primary"
11+
type="submit"
12+
onclick="addUser(
13+
document.getElementById('user_name').value,
14+
document.getElementById('user_email').value,
15+
document.getElementById('user_phone').value)">
16+
<i class="bi bi-person-add"></i>Add User
17+
</button>
1018
<input type="text" class="form-control" id="user_name" placeholder="User Name">
1119
<input type="email" class="form-control ms-2" id="user_email" placeholder="Email">
20+
<input type="telephone" class="form-control ms-3" id="user_phone" placeholder="Phone Number">
1221
</div>
1322
</div>
1423
</div>
@@ -28,11 +37,11 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
2837
$('#used-key-at').text(latestKey.operation_time);
2938
} else {
3039
console.error("Latest key data or operation_time is missing.");
31-
// Handle the error appropriately, e.g., display a placeholder message
40+
$('#used-key-at').text('No recent key detected');
3241
}
3342
}).catch((error) => {
3443
console.error('Error fetching latest key:', error);
35-
// Handle the error appropriately, e.g., display an error message
44+
$('#used-key-at').text('Error fetching key');
3645
});
3746
});
3847

@@ -49,7 +58,11 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
4958
}
5059
// Example curl request to add a new user:
5160
// curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"john@example.com","key":"RFID_KEY"}' http://localhost:5000/api/users
52-
async function addUser(name, email) {
61+
async function addUser(name, email, phone) {
62+
if (!name || !email) {
63+
alert('Name and email are required');
64+
throw new Error('Name and email are required');
65+
}
5366
try {
5467
const latestKey = await getLatestKey(); // Wait for API call
5568

@@ -60,7 +73,7 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
6073
headers: {
6174
'Content-Type': 'application/json'
6275
},
63-
body: JSON.stringify({ name, email, key })
76+
body: JSON.stringify({ name, email, phone, key })
6477
});
6578

6679
if (!response.ok) {
@@ -71,6 +84,7 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
7184
usersTable.clear().rows.add(newData).draw();
7285
} else {
7386
console.error("Latest key data is missing or invalid.");
87+
alert('Latest key data is missing or invalid.');
7488
// Handle the error appropriately, e.g., display a message to the user
7589
}
7690
} catch (error) {
@@ -100,16 +114,17 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
100114
return data.map(user => {
101115
return {
102116
name: user.user_name,
117+
email: user.user_email,
118+
phone: user.user_phone,
103119
key: user.user_key,
120+
latestActivity: user.latest_activity,
104121
...user.permissions.reduce((acc, obj) => {
105122
acc[obj.device_name] = {
106123
allowed: obj.allowed,
107124
device_id: obj.device_id
108125
}
109126
return acc
110127
}, {}),
111-
latestActivity: user.latest_activity,
112-
email: user.user_email,
113128
operation: '<button class="btn btn-sm btn-danger" onclick="deleteUser(\'' + user.user_key + '\')">Delete</button>'
114129
}
115130
})
@@ -149,12 +164,15 @@ <h5 class="card-title">Add last used RFID card as new user: <span id="used-key-a
149164
}
150165
return {
151166
data: (row) => {
152-
const value = row[key]
153-
return typeof value === 'string'
154-
? value
155-
: `<input type="checkbox" ${value?.allowed ? "checked" : ""} onchange="updatePermissions('${row.key}', '${value?.device_id}', ${value?.allowed})">`
167+
const value = row[key];
168+
// If value is null or undefined, return empty string (no checkbox)
169+
if (value === null || value === undefined) return '';
170+
// If value is a string, just return it
171+
if (typeof value === 'string') return value;
172+
// Otherwise, render checkbox for permissions
173+
return `<input type="checkbox" ${value?.allowed ? "checked" : ""} onchange="updatePermissions('${row.key}', '${value?.device_id}', ${value?.allowed})">`;
156174
},
157-
visible: key !== 'key',
175+
visible: key !== 'key',
158176
title: key.charAt(0).toUpperCase() + key.slice(1)
159177
}
160178
})

0 commit comments

Comments
 (0)