fix: resolve duplicate timer.resume_timer endpoint on startup

The timer blueprint had two view functions named resume_timer, both
registering as endpoint 'timer.resume_timer' and causing Flask to raise
AssertionError on app load.

- Give the 'resume by id' route a unique endpoint: resume_timer_by_id
- Rename the view for GET /timer/resume/<timer_id> to resume_timer_by_id
- Update templates to use timer.resume_timer_by_id for links with timer_id
- Keep timer.resume_timer for POST (resume current paused timer)
This commit is contained in:
Dries Peeters
2026-03-11 19:21:33 +01:00
parent 1d3a1541e2
commit b50ce512fa
4 changed files with 6 additions and 6 deletions
+2 -2
View File
@@ -1958,9 +1958,9 @@ def duplicate_timer(timer_id):
)
@timer_bp.route("/timer/resume/<int:timer_id>")
@timer_bp.route("/timer/resume/<int:timer_id>", endpoint="resume_timer_by_id")
@login_required
def resume_timer(timer_id):
def resume_timer_by_id(timer_id):
"""Resume an existing time entry - starts a new active timer with same properties"""
timer = TimeEntry.query.get_or_404(timer_id)
+2 -2
View File
@@ -149,7 +149,7 @@
{% if recent_entries %}
<p class="text-sm text-text-muted-light dark:text-text-muted-dark mb-3">{{ _('Resume your last session or use the buttons above to repeat last / start a new timer.') }}</p>
<div class="flex flex-wrap justify-center gap-3">
<a href="{{ url_for('timer.resume_timer', timer_id=recent_entries[0].id) }}" class="inline-flex items-center bg-green-500 hover:bg-green-600 text-white px-5 py-2.5 rounded-lg font-semibold shadow-lg hover:shadow-xl transition-all duration-200 transform hover:-translate-y-0.5">
<a href="{{ url_for('timer.resume_timer_by_id', timer_id=recent_entries[0].id) }}" class="inline-flex items-center bg-green-500 hover:bg-green-600 text-white px-5 py-2.5 rounded-lg font-semibold shadow-lg hover:shadow-xl transition-all duration-200 transform hover:-translate-y-0.5">
<i class="fas fa-play mr-2"></i>{{ _('Resume') }}{% if recent_entries[0].project %} ({{ recent_entries[0].project.name }}){% elif recent_entries[0].client %} ({{ recent_entries[0].client.name }}){% endif %}
</a>
</div>
@@ -282,7 +282,7 @@
<td class="p-3 text-sm text-text-light dark:text-text-dark" data-label="{{ _('Date') }}">{{ entry.start_time|user_datetime }}</td>
<td class="p-3" data-label="{{ _('Actions') }}">
<div class="flex flex-wrap gap-2">
<a href="{{ url_for('timer.resume_timer', timer_id=entry.id) }}" class="inline-flex items-center justify-center w-8 h-8 rounded-lg bg-green-100 hover:bg-green-200 dark:bg-green-900/30 dark:hover:bg-green-900/50 text-green-600 dark:text-green-400 transition-colors" title="{{ _('Resume - Start a new timer with same properties') }}">
<a href="{{ url_for('timer.resume_timer_by_id', timer_id=entry.id) }}" class="inline-flex items-center justify-center w-8 h-8 rounded-lg bg-green-100 hover:bg-green-200 dark:bg-green-900/30 dark:hover:bg-green-900/50 text-green-600 dark:text-green-400 transition-colors" title="{{ _('Resume - Start a new timer with same properties') }}">
<i class="fas fa-play text-xs"></i>
</a>
<a href="{{ url_for('timer.edit_timer', timer_id=entry.id) }}" class="inline-flex items-center justify-center w-8 h-8 rounded-lg bg-primary/10 hover:bg-primary/20 dark:bg-primary/20 dark:hover:bg-primary/30 text-primary dark:text-primary transition-colors" title="{{ _('Edit entry') }}">
+1 -1
View File
@@ -62,7 +62,7 @@
<td>{{ entry.tags or '-' }}</td>
<td class="text-end">
<div class="btn-group" role="group">
<a href="{{ url_for('timer.resume_timer', timer_id=entry.id) }}"
<a href="{{ url_for('timer.resume_timer_by_id', timer_id=entry.id) }}"
class="btn btn-sm btn-action btn-action--success" title="{{ _('Resume - Start a new timer with same properties') }}">
<i class="fas fa-play"></i>
</a>
+1 -1
View File
@@ -78,7 +78,7 @@
<td class="p-4" data-label="{{ _('Notes') }}">{% if entry.notes %}<span title="{{ entry.notes|striptags }}">{{ entry.notes|striptags|truncate(40) }}</span>{% else %}-{% endif %}</td>
<td class="p-4 mobile-actions" data-label="{{ _('Actions') }}">
<div class="flex gap-2">
<a href="{{ url_for('timer.resume_timer', timer_id=entry.id) }}" class="text-green-600 hover:text-green-800" title="{{ _('Resume - Start a new timer with same properties') }}">
<a href="{{ url_for('timer.resume_timer_by_id', timer_id=entry.id) }}" class="text-green-600 hover:text-green-800" title="{{ _('Resume - Start a new timer with same properties') }}">
<i class="fas fa-play"></i>
</a>
<a href="{{ url_for('timer.edit_timer', timer_id=entry.id) }}" class="text-primary hover:text-primary-dark" title="{{ _('Edit entry') }}">