From 0821293c3f36004b993f684919eed4f42eacf637 Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 20 Apr 2020 17:57:18 +0200 Subject: [PATCH 1/4] define on_delete flags for all foreign key relations and recreate migration file --- tickets/migrations/0001_initial.py | 36 ++++++++++++++---------------- tickets/models.py | 8 +++---- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/tickets/migrations/0001_initial.py b/tickets/migrations/0001_initial.py index 96e2c82..33699ea 100644 --- a/tickets/migrations/0001_initial.py +++ b/tickets/migrations/0001_initial.py @@ -1,12 +1,14 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals +# Generated by Django 3.0.5 on 2020-04-20 15:53 -from django.db import models, migrations 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), ] @@ -15,33 +17,29 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Ticket', fields=[ - ('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')), - ('date', models.DateTimeField(verbose_name='Date', auto_now_add=True)), - ('last_update', models.DateTimeField(verbose_name='Date', auto_now=True)), - ('subject', models.CharField(verbose_name='Subject', max_length=255)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateTimeField(auto_now_add=True, verbose_name='Date')), + ('last_update', models.DateTimeField(auto_now=True, verbose_name='Date')), + ('subject', models.CharField(max_length=255, verbose_name='Subject')), ('description', models.TextField(help_text='A detailed description of your problem.', verbose_name='Description')), - ('status', models.SmallIntegerField(verbose_name='Status', default=0, choices=[(0, 'New'), (1, 'Feedback'), (3, 'In Progress'), (4, 'Resolved'), (5, 'Closed')])), - ('assignee', models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL, related_name='assigned_tickets', blank=True, verbose_name='Assignee')), - ('creator', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Creator', related_name='tickets')), + ('status', models.SmallIntegerField(choices=[(0, 'New'), (1, 'Feedback'), (3, 'In Progress'), (4, 'Resolved'), (5, 'Closed')], default=0, verbose_name='Status')), + ('assignee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_tickets', to=settings.AUTH_USER_MODEL, verbose_name='Assignee')), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), ], - options={ - }, - bases=(models.Model,), ), migrations.CreateModel( name='TicketComment', fields=[ - ('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')), - ('date', models.DateTimeField(verbose_name='Date', auto_now_add=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateTimeField(auto_now_add=True, verbose_name='Date')), ('comment', models.TextField(verbose_name='Comment')), - ('author', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Author')), - ('ticket', models.ForeignKey(to='tickets.Ticket', verbose_name='Ticket', related_name='comments')), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Author')), + ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='tickets.Ticket', verbose_name='Ticket')), ], options={ 'verbose_name': 'Ticket comment', - 'ordering': ['date'], 'verbose_name_plural': 'Ticket comments', + 'ordering': ['date'], }, - bases=(models.Model,), ), ] diff --git a/tickets/models.py b/tickets/models.py index b88c34b..24fdc16 100644 --- a/tickets/models.py +++ b/tickets/models.py @@ -6,12 +6,12 @@ class Ticket(models.Model): - creator = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("Creator"), related_name='tickets') + creator = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("Creator"), related_name='tickets', on_delete=models.CASCADE) date = models.DateTimeField(_("Date"), auto_now_add=True) last_update = models.DateTimeField(_("Date"), auto_now=True) subject = models.CharField(_("Subject"), max_length=255) description = models.TextField(_("Description"), help_text=_("A detailed description of your problem.")) - assignee = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("Assignee"), related_name="assigned_tickets", blank=True, null=True) + assignee = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("Assignee"), related_name="assigned_tickets", blank=True, null=True, on_delete=models.SET_NULL) status = models.SmallIntegerField(_("Status"), choices=STATUS_CHOICES, default=0) class meta: @@ -42,9 +42,9 @@ def is_answered(self): class TicketComment(models.Model): - ticket = models.ForeignKey(Ticket, verbose_name=_("Ticket"), related_name='comments') + ticket = models.ForeignKey(Ticket, verbose_name=_("Ticket"), related_name='comments', on_delete=models.CASCADE) date = models.DateTimeField(auto_now_add=True, verbose_name=_("Date")) - author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("Author")) + author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_("Author"), on_delete=models.CASCADE) comment = models.TextField(_("Comment")) class Meta: From f1fd30ec6bd1c4d44cf06c01f6feebce7fe68540 Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 20 Apr 2020 18:16:10 +0200 Subject: [PATCH 2/4] fix reverse import (no more urlresolvers) --- tickets/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tickets/views.py b/tickets/views.py index 78cfeaa..492fcfe 100644 --- a/tickets/views.py +++ b/tickets/views.py @@ -1,5 +1,5 @@ from django.contrib import messages -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from django.views.generic import ListView, DetailView, CreateView From 4ca9cf36f46d2a24af643f5cfcb961c52c012cba Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 20 Apr 2020 18:16:40 +0200 Subject: [PATCH 3/4] refactor urls.py to use path instead of deprecated url regex syntax --- tickets/urls.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tickets/urls.py b/tickets/urls.py index bcba0bc..90f5ddb 100644 --- a/tickets/urls.py +++ b/tickets/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import patterns, url +from django.urls import path from django.contrib.auth.decorators import login_required from tickets.views import MyTicketListView, MyTicketDetailView, TicketCreateView -urlpatterns = patterns('', - url(r'^my/$', login_required(MyTicketListView.as_view()), name='list'), - url(r'^my/(?P\d+)/$', login_required(MyTicketDetailView.as_view()), name='detail'), - url(r'^create/$', login_required(TicketCreateView.as_view()), name='create'), -) +urlpatterns = [ + path('my/', login_required(MyTicketListView.as_view()), name='list'), + path('my//', login_required(MyTicketDetailView.as_view()), name='detail'), + path('create/', login_required(TicketCreateView.as_view()), name='create'), +] From c102d9beb630937a7f6648045116ad85aed67204 Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 20 Apr 2020 18:16:49 +0200 Subject: [PATCH 4/4] add app_name to urls.py --- tickets/urls.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tickets/urls.py b/tickets/urls.py index 90f5ddb..ee8b5c6 100644 --- a/tickets/urls.py +++ b/tickets/urls.py @@ -9,3 +9,5 @@ path('my//', login_required(MyTicketDetailView.as_view()), name='detail'), path('create/', login_required(TicketCreateView.as_view()), name='create'), ] + +app_name = 'tickets'