From 6918a3d4979dcc672d24c781cd87f639b2320c9e Mon Sep 17 00:00:00 2001 From: Adam Goldsmith Date: Wed, 19 May 2021 17:01:28 -0400 Subject: [PATCH] Add slug field for tools, and base URLs on it --- tasks/admin.py | 4 +--- tasks/migrations/0002_tool_slug.py | 29 +++++++++++++++++++++++++++++ tasks/models.py | 7 ++++--- tasks/urls.py | 6 +++--- tasks/views.py | 8 ++++---- 5 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 tasks/migrations/0002_tool_slug.py diff --git a/tasks/admin.py b/tasks/admin.py index 46ea8a5..a9fb681 100644 --- a/tasks/admin.py +++ b/tasks/admin.py @@ -28,6 +28,4 @@ class TaskAdmin(MarkdownxModelAdmin): @admin.register(Tool) class ToolAdmin(admin.ModelAdmin): inlines = [GroupToolSubscriptionInline] - - - + prepopulated_fields = {"slug": ("name",)} diff --git a/tasks/migrations/0002_tool_slug.py b/tasks/migrations/0002_tool_slug.py new file mode 100644 index 0000000..5df6d22 --- /dev/null +++ b/tasks/migrations/0002_tool_slug.py @@ -0,0 +1,29 @@ +from django.db import migrations, models +from django.utils.text import slugify + + +def slugify_name(apps, schema_editor): + Tool = apps.get_model('tasks', 'tool') + for tool in Tool.objects.all(): + tool.slug = slugify(tool.name) + tool.save(update_fields=['slug']) + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='tool', + name='slug', + field=models.SlugField(blank=True, null=True, unique=True), + ), + migrations.RunPython(slugify_name), + migrations.AlterField( + model_name='tool', + name='slug', + field=models.SlugField(unique=True), + ) + ] diff --git a/tasks/models.py b/tasks/models.py index c750c46..eed329d 100644 --- a/tasks/models.py +++ b/tasks/models.py @@ -9,13 +9,14 @@ from markdownx.models import MarkdownxField class Tool(models.Model): name = models.CharField(max_length=200) + slug = models.SlugField(unique=True) asset_tag = models.CharField(max_length=10, unique=True, blank=True) def __str__(self): - return f"{self.name} - {self.asset_tag}" + return f"{self.name}{(' - ' + self.asset_tag) if self.asset_tag else ''}" def get_absolute_url(self): - return reverse('toolDetail', args=[self.asset_tag]) + return reverse('toolDetail', args=[self.slug]) class Task(models.Model): @@ -33,7 +34,7 @@ class Task(models.Model): return f"{self.tool.name}: {self.name}" def get_absolute_url(self): - return reverse('taskDetail', args=[self.tool.asset_tag, self.slug]) + return reverse('taskDetail', args=[self.tool.slug, self.slug]) @property def last_event(self): diff --git a/tasks/urls.py b/tasks/urls.py index 74c3d49..a3ee87d 100644 --- a/tasks/urls.py +++ b/tasks/urls.py @@ -6,9 +6,9 @@ from . import views urlpatterns = [ path('', views.index, name='index'), # ex: /CMS00001/ - path('/', views.toolDetail, name='toolDetail'), + path('/', views.toolDetail, name='toolDetail'), # ex: /CMS00001/tasks/ - path('/tasks/', lambda request, asset_tag: redirect('toolDetail', asset_tag)), + path('/tasks/', lambda request, tool_slug: redirect('toolDetail', tool_slug)), # ex: /CMS00001/tasks/task_name/ - path('/tasks/', views.taskDetail, name='taskDetail'), + path('/tasks/', views.taskDetail, name='taskDetail'), ] diff --git a/tasks/views.py b/tasks/views.py index f524f90..9894b48 100644 --- a/tasks/views.py +++ b/tasks/views.py @@ -13,8 +13,8 @@ def index(request): return render(request, 'tasks/index.djhtml', context) -def toolDetail(request, asset_tag): - tool = get_object_or_404(Tool, asset_tag=asset_tag) +def toolDetail(request, tool_slug): + tool = get_object_or_404(Tool, slug=tool_slug) tasks = tool.task_set.all() context = { 'tool': tool, @@ -23,8 +23,8 @@ def toolDetail(request, asset_tag): return render(request, 'tasks/toolDetail.djhtml', context) -def taskDetail(request, asset_tag, task_slug): - tool = get_object_or_404(Tool, asset_tag=asset_tag) +def taskDetail(request, tool_slug, task_slug): + tool = get_object_or_404(Tool, slug=tool_slug) task = get_object_or_404(tool.task_set, slug=task_slug) events = task.event_set.all()