Solusi Error 'moment' Undefined: Sistem Lab dengan Python & Format Tanggal ID
🔧 Panduan Mengatasi Error Sistem Lab Management
❌ Error yang Anda Alami
Error: 'moment' is undefined
Penyebab: Template menggunakan moment.js yang tidak tersedia di server-side rendering.
✅ Solusi yang Sudah Diterapkan:
- Hapus dependency moment.js dari template
- Ganti dengan Python datetime di backend
- Update template functions dengan format tanggal Indonesia
File yang sudah diperbaiki:
app.py: Ditambah@app.context_processoruntuk fungsi tanggalbase.html: Hapus moment.js, ganti dengan JavaScript nativedashboard.html: Gantimoment()denganformat_indonesian_date()
🚀 Cara Menjalankan Setelah Perbaikan
1. Update File Python
Pastikan file app.py Anda memiliki kode berikut:
# Di bagian import, tambahkan:
import locale
# Set Indonesian locale for date formatting
try:
locale.setlocale(locale.LC_TIME, 'id_ID.UTF-8')
except locale.Error:
try:
locale.setlocale(locale.LC_TIME, 'Indonesian_Indonesia.1252')
except locale.Error:
# Fallback to default locale
pass
# Setelah app = Flask(__name__), tambahkan:
@app.context_processor
def inject_datetime():
"""Inject datetime functions into templates"""
def format_datetime(dt_str, fmt='%d/%m/%Y %H:%M'):
"""Format datetime string"""
try:
if isinstance(dt_str, str):
dt = datetime.fromisoformat(dt_str.replace('Z', '+00:00'))
else:
dt = dt_str
return dt.strftime(fmt)
except:
return dt_str
def format_date(dt_str, fmt='%d/%m/%Y'):
"""Format date string"""
try:
if isinstance(dt_str, str):
dt = datetime.fromisoformat(dt_str.replace('Z', '+00:00'))
else:
dt = dt_str
return dt.strftime(fmt)
except:
return dt_str
# Indonesian day and month names
day_names = {
0: 'Senin', 1: 'Selasa', 2: 'Rabu', 3: 'Kamis',
4: 'Jumat', 5: 'Sabtu', 6: 'Minggu'
}
month_names = {
1: 'Januari', 2: 'Februari', 3: 'Maret', 4: 'April',
5: 'Mei', 6: 'Juni', 7: 'Juli', 8: 'Agustus',
9: 'September', 10: 'Oktober', 11: 'November', 12: 'Desember'
}
def format_indonesian_date(dt=None):
"""Format date in Indonesian"""
if dt is None:
dt = datetime.now()
day_name = day_names[dt.weekday()]
month_name = month_names[dt.month]
return f"{day_name}, {dt.day} {month_name} {dt.year}"
return dict(
now=datetime.now(),
format_datetime=format_datetime,
format_date=format_date,
format_indonesian_date=format_indonesian_date
)
2. Tambahkan API Endpoints yang Hilang
Tambahkan di app.py:
# API Endpoints for AJAX calls
@app.route('/api/notifications/count')
@login_required
def api_notifications_count():
"""Get unread notification count for current user"""
try:
conn = get_db_connection()
count = conn.execute(
'SELECT COUNT(*) as count FROM notifications WHERE user_id = ? AND read_status = 0',
(session['user_id'],)
).fetchone()['count']
conn.close()
return jsonify({'count': count})
except Exception as e:
return jsonify({'count': 0, 'error': str(e)})
@app.route('/api/notifications')
@login_required
def api_notifications():
"""Get notifications for current user"""
try:
conn = get_db_connection()
notifications = conn.execute('''
SELECT * FROM notifications
WHERE user_id = ?
ORDER BY created_at DESC
LIMIT 10
''', (session['user_id'],)).fetchall()
conn.close()
# Convert to dict for JSON response
notifications_list = []
for notif in notifications:
notifications_list.append({
'id': notif['id'],
'title': notif['title'],
'message': notif['message'],
'type': notif['type'],
'read_status': bool(notif['read_status']),
'created_at': notif['created_at']
})
return jsonify({'notifications': notifications_list})
except Exception as e:
return jsonify({'notifications': [], 'error': str(e)})
@app.route('/api/whatsapp/status')
@login_required
def api_whatsapp_status():
"""Get WhatsApp API status"""
try:
status = whatsapp_service.get_api_status()
return jsonify(status)
except Exception as e:
return jsonify({
'enabled': False,
'connected': False,
'message': f'Error: {str(e)}'
})
3. Restart Aplikasi
# Stop aplikasi dengan Ctrl+C # Jalankan ulang python run.py # Atau dengan debug mode python run.py --debug
🔍 Troubleshooting Error Lainnya
1. Error: Template not found
Penyebab: File template tidak ada di folder templates/
Solusi:
# Pastikan struktur folder benar mkdir -p templates/admin ls templates/ # Harus ada: base.html, login.html, dashboard.html, dll
2. Error: No such table
Penyebab: Database belum diinisialisasi
Solusi:
python run.py --reset-db # HATI-HATI: Menghapus semua data # Atau python run.py --init-db --samples
3. Error: WhatsApp API connection failed
Penyebab: WhatsApp API server tidak berjalan
Solusi:
# Test koneksi WhatsApp python run.py --test-wa # Atau disable notifikasi sementara di config.py: WHATSAPP_API_ENABLED = False
4. Error: Port already in use
Penyebab: Port 5000 sudah digunakan
Solusi:
# Gunakan port lain python run.py --port 8080 # Atau kill process yang menggunakan port 5000 sudo lsof -ti:5000 | xargs kill -9
5. Error: Import Error / Module not found
Penyebab: Dependencies tidak terinstall
Solusi:
# Install ulang dependencies pip install -r requirements.txt # Atau install satu per satu pip install flask werkzeug requests python-dateutil
🔧 Debugging Mode
Enable Debug Mode
python run.py --debug
Manfaat Debug Mode:
- Auto-reload saat file berubah
- Detail error messages
- Stack trace yang jelas
- Flask debug toolbar
Cek Log Aplikasi
# Lihat log real-time tail -f lab_management.log # Cari error tertentu grep -i error lab_management.log
📊 Monitoring Sistem
Cek Status Komponen
# Status database
python -c "
import sqlite3
conn = sqlite3.connect('lab_management.db')
tables = conn.execute('SELECT name FROM sqlite_master WHERE type=\"table\"').fetchall()
print('Tables:', [t[0] for t in tables])
conn.close()
"
# Status WhatsApp API
curl -s http://localhost:5000/api/whatsapp/status | python -m json.tool
Performance Monitoring
# Tambahkan di app.py untuk monitoring
import time
import logging
@app.before_request
def before_request():
g.start_time = time.time()
@app.after_request
def after_request(response):
duration = time.time() - g.start_time
if duration > 1: # Log slow requests
logging.warning(f"Slow request: {request.path} took {duration:.2f}s")
return response
🚀 Production Deployment
1. Environment Setup
# Set production environment export FLASK_ENV=production export SECRET_KEY="your-super-secret-production-key" export WHATSAPP_API_URL="https://your-whatsapp-api.com"
2. Use Production WSGI Server
# Install gunicorn pip install gunicorn # Run with gunicorn gunicorn -w 4 -b 0.0.0.0:5000 app:app # Atau dengan waitress pip install waitress waitress-serve --host=0.0.0.0 --port=5000 app:app
3. Database Migration
# Untuk production, gunakan PostgreSQL/MySQL
# Update config.py:
import os
class ProductionConfig(Config):
# PostgreSQL example
DATABASE = os.environ.get('DATABASE_URL') or \
'postgresql://username:password@localhost/labmanagement'
# MySQL example
# DATABASE = 'mysql://username:password@localhost/labmanagement'
4. Reverse Proxy (Nginx)
# /etc/nginx/sites-available/lab-management
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Static files
location /static {
alias /path/to/your/app/static;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
📱 Mobile Optimization
PWA Setup (Optional)
<!-- Tambahkan di base.html -->
<link rel="manifest" href="/static/manifest.json">
<meta name="theme-color" content="#3B82F6">
<!-- Service Worker -->
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/static/sw.js');
}
</script>
🔐 Security Checklist
Production Security
- [ ] Ganti SECRET_KEY dengan value yang kuat
- [ ] Enable HTTPS
- [ ] Set secure cookies
- [ ] Implement rate limiting
- [ ] Add CSRF protection
- [ ] Validate all inputs
- [ ] Use environment variables untuk sensitive data
- [ ] Regular backup database
- [ ] Monitor logs untuk suspicious activity
Example Security Headers
@app.after_request
def after_request(response):
response.headers['X-Content-Type-Options'] = 'nosniff'
response.headers['X-Frame-Options'] = 'DENY'
response.headers['X-XSS-Protection'] = '1; mode=block'
response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
return response
📝 Common Issues & Quick Fixes
Issue 1: "Internal Server Error" setelah login
Kemungkinan penyebab: Session configuration
Quick Fix:
# Tambahkan di config.py
import os
from datetime import timedelta
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key-change-me'
PERMANENT_SESSION_LIFETIME = timedelta(hours=24)
SESSION_COOKIE_SECURE = False # Set True untuk HTTPS
SESSION_COOKIE_HTTPONLY = True
Issue 2: Database locked error
Quick Fix:
# Di models.py, update get_db_connection():
def get_db_connection():
conn = sqlite3.connect(Config.DATABASE, timeout=30)
conn.row_factory = sqlite3.Row
conn.execute('PRAGMA journal_mode=WAL') # Better concurrency
return conn
Issue 3: WhatsApp notifications tidak terkirim
Debugging steps:
# 1. Test WhatsApp API manually
curl -X POST http://localhost:5000/api/send-message \
-H "Content-Type: application/json" \
-d '{"phone": "6281234567890", "message": "Test message"}'
# 2. Cek format nomor telepon
python -c "
from utils.whatsapp_service import WhatsAppService
ws = WhatsAppService()
print(ws.format_phone_number('081234567890')) # Should be: 6281234567890
"
# 3. Test notification service
python run.py --test-wa
Issue 4: Booking form validation errors
Common causes:
- Waktu booking di masa lalu
- Durasi > 8 jam
- Lab tidak tersedia
Debug validation:
// Tambahkan di booking.html untuk debug
function debugValidation() {
console.log('Lab ID:', document.getElementById('lab_id').value);
console.log('Start time:', document.getElementById('start_time').value);
console.log('End time:', document.getElementById('end_time').value);
console.log('Now:', new Date().toISOString());
}
🔄 Update & Maintenance
Regular Maintenance Tasks
Daily
# Backup database cp lab_management.db lab_management_backup_$(date +%Y%m%d).db # Check logs for errors tail -100 lab_management.log | grep -i error # Monitor disk space df -h
Weekly
# Clean old backups (keep last 30 days)
find . -name "lab_management_backup_*.db" -mtime +30 -delete
# Vacuum database
python -c "
import sqlite3
conn = sqlite3.connect('lab_management.db')
conn.execute('VACUUM')
conn.close()
print('Database vacuumed')
"
# Check system performance
python -c "
import psutil
print(f'CPU: {psutil.cpu_percent()}%')
print(f'Memory: {psutil.virtual_memory().percent}%')
print(f'Disk: {psutil.disk_usage(\"/\").percent}%')
"
Monthly
- Review user activity logs
- Update dependencies:
pip install -r requirements.txt --upgrade - Performance analysis dari reports
- Backup configuration files
Update Procedure
# 1. Backup current system tar -czf backup_$(date +%Y%m%d).tar.gz *.py templates/ static/ lab_management.db # 2. Pull updates (if using git) git pull origin main # 3. Update dependencies pip install -r requirements.txt --upgrade # 4. Test in development python run.py --debug # 5. Restart production service sudo systemctl restart lab-management
📊 Performance Optimization
Database Optimization
-- Add indexes for better performance CREATE INDEX IF NOT EXISTS idx_bookings_user_date ON bookings(user_id, created_at); CREATE INDEX IF NOT EXISTS idx_bookings_lab_time ON bookings(lab_id, start_time, end_time); CREATE INDEX IF NOT EXISTS idx_notifications_unread ON notifications(user_id, read_status);
Caching (Redis - Optional)
# Install: pip install redis flask-caching
from flask_caching import Cache
cache = Cache(app, config={'CACHE_TYPE': 'redis'})
@app.route('/api/labs')
@cache.cached(timeout=300) # Cache for 5 minutes
def get_labs():
# Expensive database query
pass
Asset Optimization
<!-- Di base.html, gunakan CDN untuk assets --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
🧪 Testing
Manual Testing Checklist
User Authentication
- [ ] Login dengan valid credentials
- [ ] Login dengan invalid credentials
- [ ] Logout functionality
- [ ] Session persistence
- [ ] Password change
Booking Flow
- [ ] Create new booking
- [ ] View booking list
- [ ] Edit booking (if allowed)
- [ ] Cancel booking
- [ ] Admin approve/reject
Admin Functions
- [ ] View all bookings
- [ ] User management
- [ ] Reports generation
- [ ] System settings
Notifications
- [ ] WhatsApp notifications
- [ ] In-app notifications
- [ ] Email notifications (if enabled)
Automated Testing (Future)
# test_app.py
import unittest
from app import app
class LabManagementTestCase(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
self.app.testing = True
def test_login_page(self):
result = self.app.get('/')
self.assertEqual(result.status_code, 302) # Redirect to login
def test_invalid_login(self):
result = self.app.post('/login', data={
'username': 'invalid',
'password': 'invalid'
})
self.assertIn('Invalid username or password', result.data.decode())
if __name__ == '__main__':
unittest.main()
🆘 Emergency Procedures
System Down
- Check processes:
ps aux | grep python - Check logs:
tail -50 lab_management.log - Restart service:
python run.py - Check database:
sqlite3 lab_management.db ".tables"
Data Recovery
# Restore from backup cp lab_management_backup_YYYYMMDD.db lab_management.db # Partial recovery from logs grep "INSERT\|UPDATE" lab_management.log > recovery_queries.sql
Network Issues
# Check network connectivity ping google.com # Check port availability netstat -tulpn | grep :5000 # Test WhatsApp API curl -s http://localhost:5000/api/whatsapp/status
📞 Support Contacts
Technical Issues
- System Admin: [email protected]
- WhatsApp API: [email protected]
- Database Issues: [email protected]
Escalation Process
- Level 1: User manual / FAQ
- Level 2: Lab technician
- Level 3: System administrator
- Level 4: Development team
📚 Additional Resources
Documentation
Monitoring Tools
- System:
htop,iotop,netstat - Logs:
tail,grep,awk - Database:
sqlite3,.explain,.schema - Web: Browser DevTools, Network tab
Backup Solutions
- Local:
cp,rsync,tar - Remote:
scp,rsync over ssh - Cloud:
rclone, AWS S3, Google Drive
✅ Post-Deployment Checklist
Immediate (First Hour)
- [ ] Application starts without errors
- [ ] Login functionality works
- [ ] Database connections successful
- [ ] Basic CRUD operations functional
- [ ] WhatsApp notifications working (if enabled)
Short-term (First Day)
- [ ] All user roles can access appropriate features
- [ ] Booking workflow complete
- [ ] Admin functions operational
- [ ] Reports generate correctly
- [ ] No memory leaks or performance issues
Long-term (First Week)
- [ ] System stable under normal load
- [ ] User feedback collected and addressed
- [ ] Performance metrics within acceptable range
- [ ] Backup and recovery procedures tested
- [ ] Security measures validated
🎯 Remember: Selalu backup database sebelum melakukan perubahan besar!
Jika masih mengalami issues, silakan hubungi support dengan informasi berikut:
- Error message lengkap
- Steps untuk reproduce error
- Browser dan OS yang digunakan
- Screenshot jika memungkinkan
Happy coding! 🚀