From 504f58aa3692aa684bba26d4b2e41b105759bb4c Mon Sep 17 00:00:00 2001 From: rucki Date: Fri, 11 Sep 2026 17:36:38 +0200 Subject: [PATCH] Add configurable due time suggestions --- core/forms.py | 4 ++- ...024_userpreference_due_time_suggestions.py | 18 ++++++++++ core/models.py | 1 + core/templates/core/_edit_form.html | 2 +- core/templates/core/item_editor.html | 2 +- core/templates/core/settings.html | 1 + core/tests.py | 34 ++++++++++++++++++ core/views.py | 35 ++++++++++++++++--- 8 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 core/migrations/0024_userpreference_due_time_suggestions.py diff --git a/core/forms.py b/core/forms.py index c572c04..d7ff16c 100644 --- a/core/forms.py +++ b/core/forms.py @@ -57,7 +57,7 @@ class UserSettingsForm(forms.ModelForm): class UserPreferenceForm(forms.ModelForm): class Meta: model = UserPreference - fields = ['language', 'show_notes', 'show_open_todos', 'show_done_todos', 'show_links', 'due_first', 'overview_lines'] + fields = ['language', 'show_notes', 'show_open_todos', 'show_done_todos', 'show_links', 'due_first', 'overview_lines', 'due_time_suggestions'] labels = { 'language': _('Language'), 'show_notes': _('Show notes'), @@ -66,10 +66,12 @@ class UserPreferenceForm(forms.ModelForm): 'show_links': _('Show links'), 'due_first': _('Always show due items first'), 'overview_lines': _('Lines in overview'), + 'due_time_suggestions': _('Time suggestions for tasks'), } widgets = { 'language': forms.Select(attrs={'class': 'form-select'}), 'overview_lines': forms.NumberInput(attrs={'class': 'form-control', 'min': 1, 'max': 50}), + 'due_time_suggestions': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': '08:00 Morgen\n12:00 Mittag\n17:00 Abend'}), } diff --git a/core/migrations/0024_userpreference_due_time_suggestions.py b/core/migrations/0024_userpreference_due_time_suggestions.py new file mode 100644 index 0000000..b416628 --- /dev/null +++ b/core/migrations/0024_userpreference_due_time_suggestions.py @@ -0,0 +1,18 @@ +# Generated by Pi coding agent + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0023_item_assignee'), + ] + + operations = [ + migrations.AddField( + model_name='userpreference', + name='due_time_suggestions', + field=models.TextField(blank=True, default=''), + ), + ] diff --git a/core/models.py b/core/models.py index 45a1738..a23c0ca 100644 --- a/core/models.py +++ b/core/models.py @@ -355,6 +355,7 @@ class UserPreference(models.Model): show_journal = models.BooleanField(default=False) due_first = models.BooleanField(default=True) overview_lines = models.PositiveSmallIntegerField(default=4) + due_time_suggestions = models.TextField(blank=True, default='') def __str__(self): return f'Einstellungen {self.user}' diff --git a/core/templates/core/_edit_form.html b/core/templates/core/_edit_form.html index 354591f..6aa2bc9 100644 --- a/core/templates/core/_edit_form.html +++ b/core/templates/core/_edit_form.html @@ -22,7 +22,7 @@ {% if item.visibility == 'team' %}{% endif %} - {% if item.kind == 'todo' %}
{% endif %} + {% if item.kind == 'todo' %}
{% for option in due_time_options %}
{% endif %}
{% if item.kind == 'link' %}{% endif %} diff --git a/core/templates/core/item_editor.html b/core/templates/core/item_editor.html index a9f1174..ef7be45 100644 --- a/core/templates/core/item_editor.html +++ b/core/templates/core/item_editor.html @@ -24,7 +24,7 @@ {% include 'core/_format_toolbar.html' %}
- {% if item.kind == 'todo' %}
{% endif %} + {% if item.kind == 'todo' %}
{% for option in due_time_options %}
{% endif %}
{% if item.kind == 'link' %}{% endif %} diff --git a/core/templates/core/settings.html b/core/templates/core/settings.html index 58c9502..620b743 100644 --- a/core/templates/core/settings.html +++ b/core/templates/core/settings.html @@ -44,6 +44,7 @@
{% trans "Sorting" %}
+
{{ preference_form.due_time_suggestions }}
{% trans "Optional: one time per line, with an optional label, e.g. '08:00 Morning'. Leave empty for 30-minute steps." %}
{% trans "Show in overview" %}
diff --git a/core/tests.py b/core/tests.py index 5ce3a19..93ad187 100644 --- a/core/tests.py +++ b/core/tests.py @@ -392,8 +392,42 @@ class NavigationAndLayoutTests(TestCase): response = self.client.get(reverse('settings')) preferences = response.content.decode().split('id="preferences"', 1)[1].split('name="due_first"', 1)[0] self.assertEqual(preferences.count('