mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-05-18 04:08:48 -05:00
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:
+2
-2
@@ -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)
|
||||
|
||||
|
||||
@@ -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') }}">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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') }}">
|
||||
|
||||
Reference in New Issue
Block a user