diff --git a/fet2020/fet2020/settings.py b/fet2020/fet2020/settings.py index dce58856..228c74cf 100644 --- a/fet2020/fet2020/settings.py +++ b/fet2020/fet2020/settings.py @@ -56,7 +56,6 @@ INSTALLED_APPS = [ "posts.apps.PostsConfig", "members.apps.MembersConfig", "blackboard.apps.BlackboardConfig", - "tasks.apps.TasksConfig", "gallery.apps.GalleryConfig", "intern.apps.InternConfig", "finance.apps.FinanceConfig", diff --git a/fet2020/fet2020/urls.py b/fet2020/fet2020/urls.py index ea72e004..1dc7cf75 100644 --- a/fet2020/fet2020/urls.py +++ b/fet2020/fet2020/urls.py @@ -39,7 +39,6 @@ urlpatterns = [ path("jobs/", include("blackboard.urls")), path("posts/", include("posts.urls")), path("search/", include("search.urls")), - path("tasks/", include("tasks.urls")), path( "discord/", RedirectView.as_view(url="https://discord.com/invite/7qRuuMA"), diff --git a/fet2020/intern/forms.py b/fet2020/intern/forms.py index 0a802a87..d952f5e1 100644 --- a/fet2020/intern/forms.py +++ b/fet2020/intern/forms.py @@ -3,8 +3,6 @@ from ckeditor_uploader.widgets import CKEditorUploadingWidget from django import forms from django.forms.widgets import HiddenInput -from tasks.models import Task, TaskList - from .models import Attachment, Etherpad, FileUpload, Topic, TopicGroup @@ -33,7 +31,6 @@ class TopicAdminForm(forms.ModelForm): labels = { "title": "Titel", "slug": "Permalink", - "task_list": "Aufgabenbereich", "description": "Beschreibung", } diff --git a/fet2020/intern/migrations/0001_initial.py b/fet2020/intern/migrations/0001_initial.py index 8f15595b..9a4e6c83 100644 --- a/fet2020/intern/migrations/0001_initial.py +++ b/fet2020/intern/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.2 on 2022-12-21 11:42 +# Generated by Django 4.2.6 on 2023-11-08 11:32 import datetime from django.db import migrations, models @@ -7,12 +7,9 @@ import fet2020.utils class Migration(migrations.Migration): - initial = True - dependencies = [ - ("tasks", "0004_set_fields_unique"), - ] + dependencies = [] operations = [ migrations.CreateModel( @@ -83,15 +80,6 @@ class Migration(migrations.Migration): ("slug", models.SlugField()), ("archive", models.BooleanField(default=False, verbose_name="Archiv")), ("description", models.TextField(blank=True, null=True)), - ( - "task_list", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - to="tasks.tasklist", - ), - ), ( "topic_group", models.ForeignKey( diff --git a/fet2020/intern/models.py b/fet2020/intern/models.py index 9ce32402..44a7aafa 100644 --- a/fet2020/intern/models.py +++ b/fet2020/intern/models.py @@ -12,7 +12,6 @@ from django.utils.text import slugify from documents import create_pad, get_pad_html from documents.api import get_pad_link from fet2020.utils import create_random_id -from tasks.models import TaskList logger = logging.getLogger(__name__) @@ -58,9 +57,6 @@ class Topic(models.Model): topic_group = models.ForeignKey( TopicGroup, on_delete=models.CASCADE, verbose_name="Themenbereich" ) - task_list = models.ForeignKey( - TaskList, blank=True, on_delete=models.CASCADE, null=True - ) objects = models.Manager() diff --git a/fet2020/intern/urls.py b/fet2020/intern/urls.py index 66d4ee13..68caa2a4 100644 --- a/fet2020/intern/urls.py +++ b/fet2020/intern/urls.py @@ -7,7 +7,6 @@ from .views import ( AttachmentUpdateView, EtherpadCreateView, FileUploadCreateView, - TaskCreateView, TopicCreateView, TopicDetailView, TopicUpdateView, @@ -50,7 +49,6 @@ topic_urlpatterns = [ AttachmentCreateView.as_view(), name="attachment_create", ), - path("create-task/", TaskCreateView.as_view(), name="task_create"), ] urlpatterns = [ diff --git a/fet2020/intern/views.py b/fet2020/intern/views.py index f77ad5f2..c4d5f2c9 100644 --- a/fet2020/intern/views.py +++ b/fet2020/intern/views.py @@ -11,8 +11,6 @@ from django.views.generic.edit import CreateView, UpdateView from authentications.decorators import authenticated_user from documents.etherpadlib import add_ep_cookie from fet2020.utils import add_log_action -from tasks.forms import InternTaskCreateForm -from tasks.models import Task from .forms import ( AttachmentCreateForm, @@ -70,21 +68,8 @@ class TopicDetailView(LoginRequiredMixin, DetailView): context = super().get_context_data(**kwargs) attachments = Attachment.objects.filter(topic=self.object).order_by("title") - - tasks = None - if self.object.task_list: - tasks = deque( - Task.taskmanager.get_tasks( - user=None, - assigned_tasks=True, - task_list=self.object.task_list, - completed=False, - ) - ) - - context["topic"] = self.object context["attachments"] = attachments - context["tasks"] = tasks + context["topic"] = self.object return context @@ -238,24 +223,3 @@ class FileUploadCreateView(LoginRequiredMixin, CreateView): def get_success_url(self): return reverse("intern:attachment", kwargs=self.kwargs) - - -class TaskCreateView(LoginRequiredMixin, CreateView): - form_class = InternTaskCreateForm - model = Task - template_name = "intern/task_create.html" - - def form_valid(self, form): - form.instance.created_by = self.request.user - add_log_action(self.request, form, "tasks", "task", True) - return super().form_valid(form) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - slug = self.kwargs.get("slug") - topic = Topic.objects.get(slug=slug) - context["topic"] = topic - return context - - def get_success_url(self): - return reverse("intern:topic", kwargs=self.kwargs) diff --git a/fet2020/tasks/__init__.py b/fet2020/tasks/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/fet2020/tasks/admin.py b/fet2020/tasks/admin.py deleted file mode 100644 index 813ab541..00000000 --- a/fet2020/tasks/admin.py +++ /dev/null @@ -1,127 +0,0 @@ -from django.contrib import admin - -from .forms import DocumentInlineForm, TaskAdminForm, TaskListAdminForm -from .models import Document, Task, TaskList - - -class DocumentInline(admin.TabularInline): - form = DocumentInlineForm - model = Document - extra = 0 - verbose_name = "Dokument" - verbose_name_plural = "Do­ku­men­ten­samm­lung" - - -class TaskListAdmin(admin.ModelAdmin): - form = TaskListAdminForm - model = TaskList - - fieldsets = ( - ( - None, - { - "fields": ( - "name", - "shortterm", - "slug", - "users", - ) - }, - ), - ) - readonly_fields = ("slug",) - - def add_view(self, request, form_url="", extra_context=None): - extra_context = extra_context or {} - extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." - return super().add_view( - request, - form_url, - extra_context=extra_context, - ) - - def change_view(self, request, object_id, form_url="", extra_context=None): - extra_context = extra_context or {} - extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." - return super().change_view( - request, - object_id, - form_url, - extra_context=extra_context, - ) - - -class TaskAdmin(admin.ModelAdmin): - form = TaskAdminForm - model = Task - inlines = (DocumentInline,) - - fieldsets = ( - ( - None, - { - "fields": ( - "title", - "task_list", - "note", - "priority", - ), - }, - ), - ( - "Fälligkeit", - { - "fields": ( - "due_date", - "assigned_to", - ), - }, - ), - ( - "Abgeschlossen", - { - "fields": ( - "completed_date", - "completed", - ), - }, - ), - ) - - list_display = [ - "title", - "task_list", - "assigned_to", - "due_date", - "completed", - "priority", - ] - list_filter = ("task_list",) - search_fields = ("title",) - - def add_view(self, request, form_url="", extra_context=None): - extra_context = extra_context or {} - extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." - return super().add_view( - request, - form_url, - extra_context=extra_context, - ) - - def change_view(self, request, object_id, form_url="", extra_context=None): - extra_context = extra_context or {} - extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." - return super().change_view( - request, - object_id, - form_url, - extra_context=extra_context, - ) - - def save_model(self, request, obj, form, change): - obj.created_by = request.user - super().save_model(request, obj, form, change) - - -admin.site.register(TaskList, TaskListAdmin) -admin.site.register(Task, TaskAdmin) diff --git a/fet2020/tasks/apps.py b/fet2020/tasks/apps.py deleted file mode 100644 index 126d08bf..00000000 --- a/fet2020/tasks/apps.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.apps import AppConfig -from django.db.models.signals import post_migrate - -from fet2020.utils import create_perms - - -class TasksConfig(AppConfig): - name = "tasks" - - def ready(self): - post_migrate.connect(create_perms, sender=self) diff --git a/fet2020/tasks/forms.py b/fet2020/tasks/forms.py deleted file mode 100644 index 67fee02d..00000000 --- a/fet2020/tasks/forms.py +++ /dev/null @@ -1,221 +0,0 @@ -from ckeditor.widgets import CKEditorWidget -from django import forms -from django.contrib.admin.widgets import FilteredSelectMultiple -from django.contrib.auth.models import User -from django.core.validators import ValidationError -from django.forms.widgets import HiddenInput -from django.utils import timezone - -from .models import Document, Task, TaskList - - -class DateInput(forms.DateInput): - input_type = "date" - - -class DocumentInlineForm(forms.ModelForm): - class Meta: - model = Document - fields = [ - "title", - "date", - ] - - labels = { - "title": "Titel", - } - - -class TaskListAdminForm(forms.ModelForm): - users = forms.ModelMultipleChoiceField( - label="Benutzer", - help_text="Es können nur die Benutzer ausgewählt werden, die sich auf der Homepage angemeldet haben.", - queryset=User.objects.all().order_by("username"), - widget=FilteredSelectMultiple("User", is_stacked=False), - ) - - class Meta: - model = TaskList - fields = "__all__" - - labels = { - "name": "Titel", - "shortterm": "Kürzel für den Link", - "slug": "Permalink", - } - - -class TaskAdminForm(forms.ModelForm): - class Meta: - model = Task - fields = "__all__" - - labels = { - "title": "Titel", - "shortterm": "Kürzel für den Link", - "slug": "Permalink", - "task_list": "Aufgabenbereich", - "due_date": "Fälligkeit", - "completed": "Abgeschlossen", - "completed_date": "Datum der Fertigstellung", - "assigned_to": "Zuweisen an", - "note": "Notizen", - "priority": "Priorität", - } - - widgets = { - "note": CKEditorWidget(config_name="default"), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - self.fields["assigned_to"].empty_label = "Alle" - self.fields["assigned_to"].queryset = self.fields[ - "assigned_to" - ].queryset.order_by("username") - - -class TaskCreateForm(forms.ModelForm): - class Meta: - model = Task - - fields = [ - "title", - "task_list", - "due_date", - "assigned_to", - "note", - ] - - labels = { - "title": "Titel des Tasks", - "task_list": "Task-Gruppe", - "assigned_to": "Zuweisen an", - "due_date": "Fälligkeitsdatum", - "note": "Notizen", - } - - widgets = { - "due_date": DateInput(format=("%Y-%m-%d")), - "note": CKEditorWidget(config_name="intern"), - } - - def __init__(self, *args, **kwargs): - if "user" in kwargs: - user = kwargs.pop("user") - else: - user = None - - super().__init__(*args, **kwargs) # to get the self.fields set - self.fields["assigned_to"].empty_label = "Alle" - qs = self.fields["assigned_to"].queryset - self.fields["assigned_to"].queryset = qs.order_by("username") - - if user: - self.fields["task_list"].queryset = TaskList.objects.filter(users=user) - - def clean(self): - cleaned_data = super().clean() - assigned_to = cleaned_data["assigned_to"] - - if assigned_to: - task_list = TaskList.objects.get(id=cleaned_data["task_list"].id) - if not task_list.users.filter(username=assigned_to.username): - raise ValidationError( - _( - f"User '{assigned_to}' gibt es nicht in der User-Liste der Task-Gruppe '{task_list}'." - ) - ) - - return cleaned_data - - -class TaskUpdateForm(forms.ModelForm): - class Meta: - model = Task - - fields = [ - "assigned_to", - "due_date", - "completed", - "completed_date", - "note", - "task_list", - ] - - labels = { - "assigned_to": "Zuweisen an", - "due_date": "Fälligkeitsdatum", - "completed": "Abgeschlossen", - "completed_date": "Datum der Fertigstellung", - "note": "Notizen", - } - - widgets = { - "due_date": DateInput( - format=("%Y-%m-%d"), - ), - "note": CKEditorWidget(config_name="intern"), - "task_list": HiddenInput, - } - - def __init__(self, *args, **kwargs): - if "task_list" in kwargs: - task_list = kwargs.pop("task_list") - else: - task_list = None - - super().__init__(*args, **kwargs) # to get the self.fields set - self.fields["assigned_to"].empty_label = "Alle" - if task_list: - qs = TaskList.objects.get(id=task_list.id).users - self.fields["assigned_to"].queryset = qs.order_by("username") - - -class DocumentCreateForm(forms.ModelForm): - class Meta: - model = Document - - fields = [ - "title", - "date", - "task", - ] - - labels = { - "title": "Titel", - "date": "Datum", - } - - widgets = { - "date": DateInput(format=("%d-%m-%Y")), - "task": HiddenInput, - } - - -class InternTaskCreateForm(TaskCreateForm): - # form for creating a task from intern page. - class Meta: - model = Task - - fields = [ - "title", - "task_list", - "due_date", - "assigned_to", - "note", - ] - - labels = { - "title": "Titel des Tasks", - "task_list": "Task-Gruppe", - "due_date": "Fälligkeitsdatum", - "assigned_to": "Zuweisen an", - } - - widgets = { - "due_date": DateInput( - format=("%d-%m-%Y"), - ), - "task_list": HiddenInput, - } diff --git a/fet2020/tasks/managers.py b/fet2020/tasks/managers.py deleted file mode 100644 index f07bb75d..00000000 --- a/fet2020/tasks/managers.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import models -from django.db.models import Q - - -class TaskManager(models.Manager): - def get_tasks(self, user, assigned_tasks, task_list, completed): - # None ... assigned to all users - qs_all = self.get_queryset() - qs = qs_all.filter(assigned_to__id=user) - - if not assigned_tasks: - qs_tmp = qs_all.filter( - Q(assigned_to=None) & Q(task_list__users__id__exact=user) - ) - qs = (qs | qs_tmp).distinct() - - if task_list: - qs = qs.filter(task_list=task_list) - - return qs.filter(completed=completed) diff --git a/fet2020/tasks/migrations/0001_initial.py b/fet2020/tasks/migrations/0001_initial.py deleted file mode 100644 index 6c955878..00000000 --- a/fet2020/tasks/migrations/0001_initial.py +++ /dev/null @@ -1,50 +0,0 @@ -# Generated by Django 3.1.5 on 2021-01-29 18:35 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='TaskList', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=60)), - ('slug', models.SlugField(blank=True, null=True, unique=True)), - ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'Auf\xadga\xadben\xadbe\xadreich', - 'verbose_name_plural': 'Auf\xadga\xadben\xadbe\xadreiche', - }, - ), - migrations.CreateModel( - name='Task', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=140, verbose_name='Titel')), - ('created_date', models.DateTimeField(auto_now_add=True)), - ('due_date', models.DateField(blank=True, null=True, verbose_name='Fälligkeit')), - ('completed', models.BooleanField(default=False, verbose_name='Abgeschlossen')), - ('completed_date', models.DateField(blank=True, null=True)), - ('note', models.TextField(blank=True, null=True, verbose_name='Notizen')), - ('priority', models.PositiveIntegerField(blank=True, null=True, verbose_name='Priorität')), - ('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='assigned_to', to=settings.AUTH_USER_MODEL, verbose_name='Zugewiesen an')), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_by', to=settings.AUTH_USER_MODEL)), - ('task_list', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='tasks.tasklist', verbose_name='Aufgabenbereich')), - ], - options={ - 'verbose_name': 'Aufgabe', - 'verbose_name_plural': 'Aufgaben', - }, - ), - ] diff --git a/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py b/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py deleted file mode 100644 index 9853d159..00000000 --- a/fet2020/tasks/migrations/0002_alter_task_options_task_slug_task_slug_id_and_more.py +++ /dev/null @@ -1,103 +0,0 @@ -# Generated by Django 4.1.2 on 2022-12-21 11:42 - -import datetime -from django.db import migrations, models -import django.db.models.deletion -import fet2020.utils - - -class Migration(migrations.Migration): - - dependencies = [ - ("tasks", "0001_initial"), - ] - - operations = [ - migrations.AlterModelOptions( - name="task", - options={ - "ordering": ( - "task_list", - models.OrderBy( - models.F("due_date"), descending=True, nulls_first=True - ), - ), - "verbose_name": "Aufgabe", - "verbose_name_plural": "Aufgaben", - }, - ), - migrations.AddField( - model_name="task", - name="slug", - field=models.SlugField(blank=True, null=True), - ), - migrations.AddField( - model_name="task", - name="slug_id", - field=models.CharField( - default=fet2020.utils.create_random_id, - editable=False, - max_length=8, - null=True, - ), - ), - migrations.AddField( - model_name="tasklist", - name="shortterm", - field=models.CharField(blank=True, max_length=128, null=True), - ), - migrations.AlterField( - model_name="task", - name="title", - field=models.CharField(max_length=128, verbose_name="Titel"), - ), - migrations.AlterField( - model_name="tasklist", - name="name", - field=models.CharField(max_length=128), - ), - migrations.AlterField( - model_name="tasklist", - name="slug", - field=models.SlugField(blank=True, null=True), - ), - migrations.CreateModel( - name="Document", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("title", models.CharField(max_length=128, verbose_name="Titel")), - ( - "slug_id", - models.CharField( - default=fet2020.utils.create_random_id, - editable=False, - max_length=8, - unique=True, - ), - ), - ("etherpad_key", models.CharField(blank=True, max_length=50)), - ( - "date", - models.DateField(default=datetime.date.today, verbose_name="Datum"), - ), - ( - "task", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to="tasks.task" - ), - ), - ], - options={ - "verbose_name": "Dokument", - "verbose_name_plural": "Dokumente", - }, - ), - ] diff --git a/fet2020/tasks/migrations/0003_populate_unique_values.py b/fet2020/tasks/migrations/0003_populate_unique_values.py deleted file mode 100644 index ceda555c..00000000 --- a/fet2020/tasks/migrations/0003_populate_unique_values.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 4.1.2 on 2022-12-21 11:43 - -from django.db import migrations -import fet2020.utils -from django.utils.text import slugify - - -def forwards_func(apps, schema_editor): - Tasks = apps.get_model("tasks", "Task") - for elem in Tasks.objects.all(): - elem.slug_id = fet2020.utils.create_random_id() - elem.slug = elem.slug_id + "-" + slugify(elem.title) - elem.save(update_fields=["slug_id", "slug"]) - - TaskLists = apps.get_model("tasks", "TaskList") - for elem in TaskLists.objects.all(): - elem.shortterm = slugify(elem.name) - elem.slug = slugify(elem.shortterm) - elem.save(update_fields=["shortterm", "slug"]) - - -class Migration(migrations.Migration): - - dependencies = [ - ("tasks", "0002_alter_task_options_task_slug_task_slug_id_and_more"), - ] - - operations = [ - migrations.RunPython(forwards_func, reverse_code=migrations.RunPython.noop), - ] diff --git a/fet2020/tasks/migrations/0004_set_fields_unique.py b/fet2020/tasks/migrations/0004_set_fields_unique.py deleted file mode 100644 index bdfe32b6..00000000 --- a/fet2020/tasks/migrations/0004_set_fields_unique.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 4.1.2 on 2022-12-21 11:43 - -from django.db import migrations, models -import fet2020.utils - - -class Migration(migrations.Migration): - - dependencies = [ - ("tasks", "0003_populate_unique_values"), - ] - - operations = [ - migrations.AlterField( - model_name="task", - name="slug", - field=models.SlugField(blank=True, unique=True), - ), - migrations.AlterField( - model_name="task", - name="slug_id", - field=models.CharField( - default=fet2020.utils.create_random_id, - editable=False, - max_length=8, - unique=True, - ), - ), - migrations.AlterField( - model_name="tasklist", - name="shortterm", - field=models.CharField(blank=True, max_length=128, unique=True), - ), - migrations.AlterField( - model_name="tasklist", - name="slug", - field=models.SlugField(blank=True, unique=True), - ), - ] diff --git a/fet2020/tasks/migrations/__init__.py b/fet2020/tasks/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/fet2020/tasks/models.py b/fet2020/tasks/models.py deleted file mode 100644 index a1fa2d81..00000000 --- a/fet2020/tasks/models.py +++ /dev/null @@ -1,145 +0,0 @@ -from datetime import date - -from django.conf import settings -from django.contrib.auth.models import User -from django.core.validators import ValidationError -from django.db import models -from django.db.models import F -from django.db.models.constraints import UniqueConstraint -from django.urls import reverse -from django.utils import timezone -from django.utils.text import slugify - -from documents import create_pad -from documents.api import get_pad_link -from fet2020.utils import create_random_id - -from .managers import TaskManager - - -class TaskList(models.Model): - name = models.CharField(max_length=128) - - shortterm = models.CharField(max_length=128, unique=True, blank=True) - slug = models.SlugField(unique=True, blank=True) - - users = models.ManyToManyField(User, blank=True) - - objects = models.Manager() - - class Meta: - verbose_name = "Auf­ga­ben­be­reich" - verbose_name_plural = "Auf­ga­ben­be­reiche" - - def __str__(self): - return self.name - - def get_absolute_url(self): - return reverse("tasks:index") - - def clean(self): - if not self.shortterm: - self.shortterm = slugify(self.name) - self.slug = slugify(self.shortterm) - - -class Task(models.Model): - title = models.CharField(verbose_name="Titel", max_length=128) - - slug_id = models.CharField( - default=create_random_id, max_length=8, unique=True, editable=False - ) - slug = models.SlugField(unique=True, blank=True) - - task_list = models.ForeignKey( - TaskList, verbose_name="Aufgabenbereich", on_delete=models.CASCADE, null=True - ) - - created_date = models.DateTimeField(auto_now_add=True) - due_date = models.DateField(verbose_name="Fälligkeit", blank=True, null=True) - - completed = models.BooleanField(verbose_name="Abgeschlossen", default=False) - completed_date = models.DateField(blank=True, null=True) - - created_by = models.ForeignKey( - User, - related_name="created_by", - on_delete=models.CASCADE, - ) - assigned_to = models.ForeignKey( - User, - blank=True, - null=True, - related_name="assigned_to", - on_delete=models.CASCADE, - verbose_name="Zugewiesen an", - ) - - note = models.TextField(verbose_name="Notizen", blank=True, null=True) - priority = models.PositiveIntegerField( - verbose_name="Priorität", blank=True, null=True - ) - - objects = models.Manager() - taskmanager = TaskManager() - - class Meta: - ordering = ("task_list", F("due_date").desc(nulls_first=True)) - verbose_name = "Aufgabe" - verbose_name_plural = "Aufgaben" - - def __str__(self): - return self.title - - def get_absolute_url(self): - return reverse("tasks:task", kwargs={"slug": self.slug}) - - def save(self, *args, **kwargs): - if not self.slug: - self.slug = self.slug_id + "-" + slugify(self.title) - - if self.completed and not self.completed_date: - self.completed_date = timezone.now().date() - - if not self.completed and self.completed_date: - self.completed_date = None - - super().save(*args, **kwargs) - - -class Document(models.Model): - title = models.CharField(verbose_name="Titel", max_length=128) - - slug_id = models.CharField( - default=create_random_id, max_length=8, unique=True, editable=False - ) - etherpad_key = models.CharField(max_length=50, blank=True) - - date = models.DateField(verbose_name="Datum", default=date.today) - - task = models.ForeignKey(Task, on_delete=models.CASCADE) - - objects = models.Manager() - - class Meta: - verbose_name = "Dokument" - verbose_name_plural = "Dokumente" - - def __str__(self): - return self.title - - def get_absolute_url(self): - return get_pad_link(self.etherpad_key) - - def clean(self): - pad_name = slugify(str(self.slug_id) + "-" + self.title[:40]) - if len(pad_name) > 50: - raise ValidationError( - f"Name zum Erstellen des Etherpads ist zu lange - max. 50 Zeichen. (Länge: {len(pad_name)}, Name: {pad_name})" - ) - - self.etherpad_key = create_pad(pad_name) - if not self.etherpad_key: - raise ValidationError( - f"Etherpad '{pad_name}' konnte nicht erstellt werden." - ) diff --git a/fet2020/tasks/tests.py b/fet2020/tasks/tests.py deleted file mode 100644 index e69de29b..00000000 diff --git a/fet2020/tasks/urls.py b/fet2020/tasks/urls.py deleted file mode 100644 index 578c9291..00000000 --- a/fet2020/tasks/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.urls import path - -from . import apps, views -from .views import DocumentCreateView, TaskCreateView, TaskDetailView, TaskUpdateView - -app_name = apps.TasksConfig.name - -urlpatterns = [ - path("", views.index, name="index"), - path("create-task/", TaskCreateView.as_view(), name="task_create"), - path("/", TaskDetailView.as_view(), name="task"), - path("/update/", TaskUpdateView.as_view(), name="task_update"), - path( - "/create-document/", DocumentCreateView.as_view(), name="docu_create" - ), -] diff --git a/fet2020/tasks/views.py b/fet2020/tasks/views.py deleted file mode 100644 index d073edaa..00000000 --- a/fet2020/tasks/views.py +++ /dev/null @@ -1,149 +0,0 @@ -import logging -from collections import deque - -from django.contrib.auth.mixins import LoginRequiredMixin -from django.contrib.auth.models import User -from django.core.exceptions import ObjectDoesNotExist -from django.shortcuts import render -from django.urls import reverse, reverse_lazy -from django.utils import timezone -from django.views.generic.detail import DetailView -from django.views.generic.edit import CreateView, UpdateView - -from authentications.decorators import authenticated_user -from documents.api import get_pad_link -from documents.etherpadlib import add_ep_cookie -from fet2020.utils import add_log_action -from intern.models import Topic - -from .forms import DocumentCreateForm, TaskCreateForm, TaskUpdateForm -from .models import Document, Task, TaskList - -logger = logging.getLogger(__name__) - - -@authenticated_user -def index(request): - tasklist = None - show_tasklist = None - assigned_tasks = None - completed = False - state_open = False - state_closed = False - - if request.method == "POST": - if "btn_checkbox" in request.POST: - for task_id in request.POST.getlist("checkbox"): - task = Task.objects.get(id=task_id) - - if not task.completed: - task.completed = True - task.completed_date = timezone.now().date() - task.save() - - if request.method == "GET": - if request.GET.get("tasklist"): - if request.GET.get("tasklist") != "all": - tasklist = TaskList.objects.filter(id=request.GET["tasklist"]).first() - show_tasklist = tasklist.id - - if request.GET.get("tasks") == "assigned": - assigned_tasks = True - - if request.GET.get("open_tasks"): - completed = False - state_open = True - - if request.GET.get("closed_tasks"): - completed = True - state_closed = True - - tasks = Task.taskmanager.get_tasks( - user=request.user.id, - assigned_tasks=assigned_tasks, - task_list=tasklist, - completed=completed, - ) - - context = { - "tasks": tasks, - "show_tasklist": show_tasklist, - "assigned_tasks": assigned_tasks, - "state_open": state_open, - "state_closed": state_closed, - } - - return render(request, "tasks/index.html", context) - - -class TaskCreateView(LoginRequiredMixin, CreateView): - model = Task - success_url = reverse_lazy("tasks:index") - template_name = "tasks/task_create.html" - form_class = TaskCreateForm - - def form_valid(self, form): - form.instance.created_by = self.request.user - add_log_action(self.request, form, "tasks", "task", True) - return super().form_valid(form) - - def get_form_kwargs(self): - kwargs = super().get_form_kwargs() - kwargs["user"] = self.request.user - return kwargs - - -class TaskUpdateView(LoginRequiredMixin, UpdateView): - form_class = TaskUpdateForm - model = Task - template_name = "tasks/task_update.html" - - def form_valid(self, form): - add_log_action(self.request, form, "tasks", "task", False) - return super().form_valid(form) - - -class TaskDetailView(LoginRequiredMixin, DetailView): - model = Task - template_name = "tasks/task_detail.html" - - def get(self, request, *args, **kwargs): - response = super().get(request, *args, **kwargs) - - try: - response = add_ep_cookie(self.request, response) - except Exception as e: - logger.info("Etherpad Server doesn't work. Error: %s", e) - - return response - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - docus = Document.objects.filter(task__id=self.object.id).order_by("-date") - context["documents"] = docus - try: - context["topic"] = Topic.objects.get(task_list=self.object.task_list) - except ObjectDoesNotExist: - context["topic"] = None - return context - - -class DocumentCreateView(LoginRequiredMixin, CreateView): - model = Document - template_name = "tasks/attachment_create.html" - form_class = DocumentCreateForm - - def form_valid(self, form): - form.instance.created_by = self.request.user - add_log_action(self.request, form, "tasks", "document", True) - return super().form_valid(form) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - slug = self.kwargs.get("slug") - context["task"] = Task.objects.get(slug=slug) - return context - - def get_success_url(self): - return reverse("tasks:task", kwargs=self.kwargs) diff --git a/fet2020/templates/base.html b/fet2020/templates/base.html index 40b787ef..865933d8 100644 --- a/fet2020/templates/base.html +++ b/fet2020/templates/base.html @@ -161,7 +161,6 @@ x-transition:leave-end="transform origin-top opacity-0 scale-95" > - diff --git a/fet2020/templates/intern/topic/topic_detail.html b/fet2020/templates/intern/topic/topic_detail.html index 3c0f0153..0a1aedfa 100644 --- a/fet2020/templates/intern/topic/topic_detail.html +++ b/fet2020/templates/intern/topic/topic_detail.html @@ -19,17 +19,6 @@ {% endif %} - - {% if tasks %} -
    - {% for task in tasks %} -
  • - {{ task.title|truncatechars:45 }} Link -
  • - {% endfor %} -
- {% endif %} -
    {% for attachment in attachments %}
  • {{ attachment.title }}
  • diff --git a/fet2020/templates/tasks/attachment_create.html b/fet2020/templates/tasks/attachment_create.html deleted file mode 100644 index 830aa08c..00000000 --- a/fet2020/templates/tasks/attachment_create.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends 'base.html' %} - -{% block title %}Etherpad hinzufügen{% endblock %} - -{% block content %} - -
    -

    Etherpad hinzufügen

    -
    -
    - {% csrf_token %} - - {% if form.non_field_errors %} -
    - -

    Fehler:

    -
    {{ form.non_field_errors }}
    -
    - {% endif %} - - - - - - - - -
    -
    -
    -{% endblock %} diff --git a/fet2020/templates/tasks/index.html b/fet2020/templates/tasks/index.html deleted file mode 100644 index 0dadc5a9..00000000 --- a/fet2020/templates/tasks/index.html +++ /dev/null @@ -1,128 +0,0 @@ -{% extends 'base.html' %} - -{% block title %}Tasks{% endblock %} - -{% block content %} - -
    -

    Tasks

    -
    - - - {% if tasks %} -
    - {% csrf_token %} - - {% regroup tasks by task_list as section_list %} - {% for group in section_list %} -
    -

    {{ group.grouper }}

    - - {% for task in group.list %} - - {% endfor %} -
    - {% endfor %} - - -
    - {% else %} -
    -

    Keine Tasks in dieser Liste für dich.

    - - -
    - {% endif %} -
    -
    -{% endblock %} diff --git a/fet2020/templates/tasks/task_create.html b/fet2020/templates/tasks/task_create.html deleted file mode 100644 index 43a6a986..00000000 --- a/fet2020/templates/tasks/task_create.html +++ /dev/null @@ -1,86 +0,0 @@ -{% extends 'base.html' %} - -{% block title %}Task hinzufügen{% endblock %} - -{% block content %} - -
    -

    Task hinzufügen

    -
    -
    - {% csrf_token %} - - {% if form.non_field_errors %} -
    - -

    Fehler:

    -
    {{ form.non_field_errors }}
    -
    - {% endif %} - - - - - - - - - - -
    - - -
    -
    -{% endblock %} diff --git a/fet2020/templates/tasks/task_detail.html b/fet2020/templates/tasks/task_detail.html deleted file mode 100644 index f0c9f468..00000000 --- a/fet2020/templates/tasks/task_detail.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends 'base.html' %} - -{% block title %}{{ task.title }}{% endblock %} - -{% block content %} - -
    -

    Task-Detailansicht

    -
    - - {% if task.note %} -
    - {{ task.note|safe }} -
    - {% endif %} - - {% if task.due_date %} -
    - {{ task.due_date }} -
    - {% endif %} - -
    -
    - -

    Neues Etherpad erstellen

    -
    - - {% for document in documents %} - -

    {{ document.title }}

    - {{ document.date }} -
    - {% endfor %} - -
    -
    - - Task bearbeiten -
    -
    -{% endblock %} diff --git a/fet2020/templates/tasks/task_update.html b/fet2020/templates/tasks/task_update.html deleted file mode 100644 index b4fcee4e..00000000 --- a/fet2020/templates/tasks/task_update.html +++ /dev/null @@ -1,89 +0,0 @@ -{% extends 'base.html' %} - -{% block title %}{{ task.title }} bearbeiten{% endblock %} - -{% block content %} - -
    -

    Task '{{ task.title }}' bearbeiten

    -
    -
    - {% csrf_token %} - - {% if form.non_field_errors %} -
    - -

    Fehler:

    -
    {{ form.non_field_errors }}
    -
    - {% endif %} - - - - - - - - - - - - - - -
    -
    -
    -{% endblock %}