diff --git a/app.py b/app.py index 3cb0936..0b5bde5 100644 --- a/app.py +++ b/app.py @@ -1357,8 +1357,8 @@ def leave(entry_id): return jsonify({ 'id': entry.id, - 'arrival_time': entry.arrival_time.strftime('%Y-%m-%d %H:%M:%S'), - 'departure_time': entry.departure_time.strftime('%Y-%m-%d %H:%M:%S'), + 'arrival_time': entry.arrival_time.isoformat(), + 'departure_time': entry.departure_time.isoformat(), 'duration': entry.duration, 'total_break_duration': entry.total_break_duration, 'effective_break_duration': effective_break @@ -1448,16 +1448,24 @@ def delete_entry(entry_id): def update_entry(entry_id): entry = TimeEntry.query.filter_by(id=entry_id, user_id=session['user_id']).first_or_404() data = request.json + + if not data: + return jsonify({'success': False, 'message': 'No JSON data provided'}), 400 if 'arrival_time' in data: try: - entry.arrival_time = datetime.strptime(data['arrival_time'], '%Y-%m-%d %H:%M:%S') - except ValueError: - return jsonify({'success': False, 'message': 'Invalid arrival time format'}), 400 + # Accept only ISO 8601 format + arrival_time_str = data['arrival_time'] + entry.arrival_time = datetime.fromisoformat(arrival_time_str.replace('Z', '+00:00')) + except (ValueError, AttributeError) as e: + return jsonify({'success': False, 'message': f'Invalid arrival time format. Expected ISO 8601: {arrival_time_str}'}), 400 if 'departure_time' in data and data['departure_time']: try: - entry.departure_time = datetime.strptime(data['departure_time'], '%Y-%m-%d %H:%M:%S') + # Accept only ISO 8601 format + departure_time_str = data['departure_time'] + entry.departure_time = datetime.fromisoformat(departure_time_str.replace('Z', '+00:00')) + # Recalculate duration if both times are present if entry.arrival_time and entry.departure_time: # Calculate work duration considering breaks @@ -1467,8 +1475,8 @@ def update_entry(entry_id): entry.total_break_duration, g.user ) - except ValueError: - return jsonify({'success': False, 'message': 'Invalid departure time format'}), 400 + except (ValueError, AttributeError) as e: + return jsonify({'success': False, 'message': f'Invalid departure time format. Expected ISO 8601: {departure_time_str}'}), 400 db.session.commit() return jsonify({ @@ -1476,8 +1484,8 @@ def update_entry(entry_id): 'message': 'Entry updated successfully', 'entry': { 'id': entry.id, - 'arrival_time': entry.arrival_time.strftime('%Y-%m-%d %H:%M:%S'), - 'departure_time': entry.departure_time.strftime('%Y-%m-%d %H:%M:%S') if entry.departure_time else None, + 'arrival_time': entry.arrival_time.isoformat(), + 'departure_time': entry.departure_time.isoformat() if entry.departure_time else None, 'duration': entry.duration, 'is_paused': entry.is_paused, 'total_break_duration': entry.total_break_duration @@ -1562,7 +1570,7 @@ def resume_entry(entry_id): 'success': True, 'message': 'Work resumed on existing entry', 'id': entry_to_resume.id, - 'arrival_time': entry_to_resume.arrival_time.strftime('%Y-%m-%d %H:%M:%S'), + 'arrival_time': entry_to_resume.arrival_time.isoformat(), 'total_break_duration': entry_to_resume.total_break_duration }) @@ -2900,8 +2908,8 @@ def team_hours_data(): for entry in entries: formatted_entries.append({ 'id': entry.id, - 'arrival_time': entry.arrival_time.strftime('%Y-%m-%d %H:%M:%S'), - 'departure_time': entry.departure_time.strftime('%Y-%m-%d %H:%M:%S') if entry.departure_time else None, + 'arrival_time': entry.arrival_time.isoformat(), + 'departure_time': entry.departure_time.isoformat() if entry.departure_time else None, 'duration': entry.duration, 'total_break_duration': entry.total_break_duration }) @@ -2934,8 +2942,8 @@ def team_hours_data(): }, 'team_data': team_data, 'date_range': date_range, - 'start_date': start_date.strftime('%Y-%m-%d'), - 'end_date': end_date.strftime('%Y-%m-%d') + 'start_date': start_date.isoformat(), + 'end_date': end_date.isoformat() }) @app.route('/export') @@ -3455,8 +3463,8 @@ def get_task(task_id): 'priority': task.priority.value, 'estimated_hours': task.estimated_hours, 'assigned_to_id': task.assigned_to_id, - 'start_date': task.start_date.strftime('%Y-%m-%d') if task.start_date else None, - 'due_date': task.due_date.strftime('%Y-%m-%d') if task.due_date else None + 'start_date': task.start_date.isoformat() if task.start_date else None, + 'due_date': task.due_date.isoformat() if task.due_date else None } return jsonify({'success': True, 'task': task_data}) @@ -3606,8 +3614,8 @@ def get_subtask(subtask_id): 'priority': subtask.priority.value, 'estimated_hours': subtask.estimated_hours, 'assigned_to_id': subtask.assigned_to_id, - 'start_date': subtask.start_date.strftime('%Y-%m-%d') if subtask.start_date else None, - 'due_date': subtask.due_date.strftime('%Y-%m-%d') if subtask.due_date else None + 'start_date': subtask.start_date.isoformat() if subtask.start_date else None, + 'due_date': subtask.due_date.isoformat() if subtask.due_date else None } return jsonify({'success': True, 'subtask': subtask_data}) diff --git a/templates/index.html b/templates/index.html index 6e99f0a..478b8cb 100644 --- a/templates/index.html +++ b/templates/index.html @@ -390,15 +390,15 @@