From 276ead54e71d278804bb3f5a93602a9876528f87 Mon Sep 17 00:00:00 2001 From: Scot Hacker Date: Sat, 6 Apr 2019 16:30:01 -0700 Subject: [PATCH] Modeling and admin for attachment support --- todo/admin.py | 11 +++++++++-- todo/migrations/0010_attachment.py | 28 ++++++++++++++++++++++++++++ todo/models.py | 23 +++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 todo/migrations/0010_attachment.py diff --git a/todo/admin.py b/todo/admin.py index fa5d4ef..a8e6d13 100644 --- a/todo/admin.py +++ b/todo/admin.py @@ -1,18 +1,25 @@ from django.contrib import admin -from todo.models import Task, TaskList, Comment + +from todo.models import Attachment, Comment, Task, TaskList class TaskAdmin(admin.ModelAdmin): list_display = ("title", "task_list", "completed", "priority", "due_date") list_filter = ("task_list",) ordering = ("priority",) - search_fields = ("name",) + search_fields = ("title",) class CommentAdmin(admin.ModelAdmin): list_display = ("author", "date", "snippet") +class AttachmentAdmin(admin.ModelAdmin): + list_display = ("task", "added_by", "timestamp", "file") + autocomplete_fields = ["added_by", "task"] + + admin.site.register(TaskList) admin.site.register(Comment, CommentAdmin) admin.site.register(Task, TaskAdmin) +admin.site.register(Attachment, AttachmentAdmin) diff --git a/todo/migrations/0010_attachment.py b/todo/migrations/0010_attachment.py new file mode 100644 index 0000000..885411a --- /dev/null +++ b/todo/migrations/0010_attachment.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2 on 2019-04-06 16:28 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import todo.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('todo', '0009_priority_optional'), + ] + + operations = [ + migrations.CreateModel( + name='Attachment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField(default=datetime.datetime.now)), + ('file', models.FileField(max_length=255, upload_to=todo.models.get_attachment_upload_dir)), + ('added_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='todo.Task')), + ], + ), + ] diff --git a/todo/models.py b/todo/models.py index 01bb19a..2151fc8 100644 --- a/todo/models.py +++ b/todo/models.py @@ -10,6 +10,13 @@ from django.urls import reverse from django.utils import timezone +def get_attachment_upload_dir(instance, filename): + """Determine upload dir for task attachment files. + """ + + return "/".join(["tasks", "attachments", str(instance.task.id), filename]) + + class LockedAtomicTransaction(Atomic): """ modified from https://stackoverflow.com/a/41831049 @@ -156,3 +163,19 @@ class Comment(models.Model): def __str__(self): return self.snippet + + +class Attachment(models.Model): + """ + Defines a generic file attachment for use in M2M relation with Task. + """ + + task = models.ForeignKey(Task, on_delete=models.CASCADE) + added_by = models.ForeignKey( + settings.AUTH_USER_MODEL, on_delete=models.CASCADE + ) + timestamp = models.DateTimeField(default=datetime.datetime.now) + file = models.FileField(upload_to=get_attachment_upload_dir, max_length=255) + + def __str__(self): + return f"{self.task.id} - {self.file.name}"