Initial commit: Tablet lending system with user-tablet many-to-many relationship
- Database schema: tablets, users, loans (junction table) - CLI app: minimal_app.py - Web apps: app.py (Flask), simple_app.py (http.server) - Features: loan management, search, user loans view, project notes - Git structure: CONTRIBUTING.md, .gitignore Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
commit
8a8d2f02fa
25 changed files with 2885 additions and 0 deletions
182
working_server.py
Normal file
182
working_server.py
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Working web server for tablet management system
|
||||
"""
|
||||
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
import sqlite3
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
import json
|
||||
|
||||
class TabletHandler(BaseHTTPRequestHandler):
|
||||
def _set_headers(self, status=200, content_type='text/html'):
|
||||
self.send_response(status)
|
||||
self.send_header('Content-type', content_type)
|
||||
self.end_headers()
|
||||
|
||||
def do_GET(self):
|
||||
parsed = urlparse(self.path)
|
||||
|
||||
if parsed.path == '/':
|
||||
self._serve_main_page()
|
||||
elif parsed.path == '/api/tablets':
|
||||
self._serve_tablets()
|
||||
elif parsed.path == '/api/users':
|
||||
self._serve_users()
|
||||
elif parsed.path == '/api/loans':
|
||||
self._serve_loans()
|
||||
else:
|
||||
self._set_headers(404)
|
||||
self.wfile.write(b'404 Not Found')
|
||||
|
||||
def _serve_main_page(self):
|
||||
html = '''<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Tablet Management System</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 20px; }
|
||||
h1 { color: #4CAF50; }
|
||||
.container { max-width: 800px; margin: 0 auto; }
|
||||
.section { margin-bottom: 20px; padding: 15px; background: #f5f5f5; border-radius: 5px; }
|
||||
table { width: 100%; border-collapse: collapse; }
|
||||
th, td { padding: 8px; text-align: left; border-bottom: 1px solid #ddd; }
|
||||
th { background-color: #4CAF50; color: white; }
|
||||
.btn { padding: 8px 16px; background-color: #4CAF50; color: white; text-decoration: none; border-radius: 4px; }
|
||||
.btn-danger { background-color: #f44336; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Tablet Management System</h1>
|
||||
<p>SQLite backend - Port 8000</p>
|
||||
|
||||
<div class="section">
|
||||
<h2>Available Tablets</h2>
|
||||
<div id="tablets"></div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>Active Loans</h2>
|
||||
<div id="loans"></div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>System Info</h2>
|
||||
<p>✓ Database: tablets.db</p>
|
||||
<p>✓ Status: Operational</p>
|
||||
<p>Port: 8000</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Load data from API
|
||||
fetch('/api/tablets')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
let html = '<table><thead><tr><th>ID</th><th>Brand</th><th>Model</th><th>Serial</th><th>Status</th></tr></thead><tbody>';
|
||||
data.forEach(tablet => {
|
||||
html += `<tr><td>${tablet.id}</td><td>${tablet.brand}</td><td>${tablet.model}</td><td>${tablet.serial_number}</td><td>${tablet.status}</td></tr>`;
|
||||
});
|
||||
html += '</tbody></table>';
|
||||
document.getElementById('tablets').innerHTML = html;
|
||||
});
|
||||
|
||||
fetch('/api/loans')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
let html = '<table><thead><tr><th>ID</th><th>Tablet</th><th>User</th><th>Loan Date</th><th>Status</th></tr></thead><tbody>';
|
||||
data.forEach(loan => {
|
||||
html += `<tr><td>${loan.id}</td><td>${loan.tablet}</td><td>${loan.user}</td><td>${loan.loan_date}</td><td>${loan.status}</td></tr>`;
|
||||
});
|
||||
html += '</tbody></table>';
|
||||
document.getElementById('loans').innerHTML = html;
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>'''
|
||||
|
||||
self._set_headers()
|
||||
self.wfile.write(html.encode('utf-8'))
|
||||
|
||||
def _serve_tablets(self):
|
||||
try:
|
||||
conn = sqlite3.connect('tablets.db')
|
||||
conn.row_factory = sqlite3.Row
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('SELECT * FROM tablets')
|
||||
tablets = [dict(row) for row in cursor.fetchall()]
|
||||
conn.close()
|
||||
|
||||
self._set_headers(content_type='application/json')
|
||||
self.wfile.write(json.dumps(tablets).encode('utf-8'))
|
||||
except Exception as e:
|
||||
self._set_headers(500)
|
||||
self.wfile.write(json.dumps({'error': str(e)}).encode('utf-8'))
|
||||
|
||||
def _serve_users(self):
|
||||
try:
|
||||
conn = sqlite3.connect('tablets.db')
|
||||
conn.row_factory = sqlite3.Row
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('SELECT * FROM users')
|
||||
users = [dict(row) for row in cursor.fetchall()]
|
||||
conn.close()
|
||||
|
||||
self._set_headers(content_type='application/json')
|
||||
self.wfile.write(json.dumps(users).encode('utf-8'))
|
||||
except Exception as e:
|
||||
self._set_headers(500)
|
||||
self.wfile.write(json.dumps({'error': str(e)}).encode('utf-8'))
|
||||
|
||||
def _serve_loans(self):
|
||||
try:
|
||||
conn = sqlite3.connect('tablets.db')
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('''
|
||||
SELECT l.id, l.tablet_id, l.user_id, l.loan_date, l.return_date, l.status,
|
||||
t.brand || ' ' || t.model as tablet,
|
||||
u.name as user
|
||||
FROM loans l
|
||||
JOIN tablets t ON l.tablet_id = t.id
|
||||
JOIN users u ON l.user_id = u.id
|
||||
''')
|
||||
|
||||
loans = []
|
||||
for row in cursor.fetchall():
|
||||
loans.append({
|
||||
'id': row[0],
|
||||
'tablet_id': row[1],
|
||||
'user_id': row[2],
|
||||
'loan_date': row[3],
|
||||
'return_date': row[4],
|
||||
'status': row[5],
|
||||
'tablet': row[6],
|
||||
'user': row[7]
|
||||
})
|
||||
conn.close()
|
||||
|
||||
self._set_headers(content_type='application/json')
|
||||
self.wfile.write(json.dumps(loans).encode('utf-8'))
|
||||
except Exception as e:
|
||||
self._set_headers(500)
|
||||
self.wfile.write(json.dumps({'error': str(e)}).encode('utf-8'))
|
||||
|
||||
def run_server():
|
||||
server_address = ('', 8000)
|
||||
httpd = HTTPServer(server_address, TabletHandler)
|
||||
|
||||
print("Tablet Management System - Web Interface")
|
||||
print("========================================")
|
||||
print("Server running on: http://localhost:8000")
|
||||
print("Database: tablets.db (SQLite)")
|
||||
print("Press Ctrl+C to stop the server")
|
||||
print()
|
||||
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\nServer stopped")
|
||||
|
||||
if __name__ == '__main__':
|
||||
run_server()
|
||||
Loading…
Add table
Add a link
Reference in a new issue