forked from extern/django-helpdesk
Create models and admin for Checklist
This commit is contained in:
parent
eadf23ce3f
commit
9e9ebd45a7
@ -13,7 +13,7 @@ from helpdesk.models import (
|
|||||||
PreSetReply,
|
PreSetReply,
|
||||||
Queue,
|
Queue,
|
||||||
Ticket,
|
Ticket,
|
||||||
TicketChange
|
TicketChange, Checklist, ChecklistTemplate, ChecklistTask
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -41,6 +41,7 @@ class TicketAdmin(admin.ModelAdmin):
|
|||||||
'hidden_submitter_email', 'time_spent')
|
'hidden_submitter_email', 'time_spent')
|
||||||
date_hierarchy = 'created'
|
date_hierarchy = 'created'
|
||||||
list_filter = ('queue', 'assigned_to', 'status')
|
list_filter = ('queue', 'assigned_to', 'status')
|
||||||
|
search_fields = ('id', 'title')
|
||||||
|
|
||||||
def hidden_submitter_email(self, ticket):
|
def hidden_submitter_email(self, ticket):
|
||||||
if ticket.submitter_email:
|
if ticket.submitter_email:
|
||||||
@ -115,5 +116,24 @@ class IgnoreEmailAdmin(admin.ModelAdmin):
|
|||||||
list_display = ('name', 'queue_list', 'email_address', 'keep_in_mailbox')
|
list_display = ('name', 'queue_list', 'email_address', 'keep_in_mailbox')
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(ChecklistTemplate)
|
||||||
|
class ChecklistTemplateAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'task_list')
|
||||||
|
search_fields = ('name', 'task_list')
|
||||||
|
|
||||||
|
|
||||||
|
class ChecklistTaskInline(admin.TabularInline):
|
||||||
|
model = ChecklistTask
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Checklist)
|
||||||
|
class ChecklistAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'ticket')
|
||||||
|
search_fields = ('name', 'ticket__id', 'ticket__title')
|
||||||
|
autocomplete_fields = ('ticket',)
|
||||||
|
list_select_related = ('ticket',)
|
||||||
|
inlines = (ChecklistTaskInline,)
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(PreSetReply)
|
admin.site.register(PreSetReply)
|
||||||
admin.site.register(EscalationExclusion)
|
admin.site.register(EscalationExclusion)
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
# Generated by Django 4.2 on 2023-04-22 20:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import helpdesk.models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('helpdesk', '0037_alter_queue_email_box_type'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Checklist',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=100, verbose_name='Name')),
|
||||||
|
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checklists', to='helpdesk.ticket', verbose_name='Ticket')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Checklist',
|
||||||
|
'verbose_name_plural': 'Checklists',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChecklistTemplate',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=100, verbose_name='Name')),
|
||||||
|
('task_list', models.JSONField(validators=[helpdesk.models.is_a_list_without_empty_element], verbose_name='Task List')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Checklist Template',
|
||||||
|
'verbose_name_plural': 'Checklist Templates',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChecklistTask',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('description', models.CharField(max_length=250, verbose_name='Description')),
|
||||||
|
('completion_date', models.DateTimeField(blank=True, null=True, verbose_name='Completion Date')),
|
||||||
|
('checklist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='helpdesk.checklist', verbose_name='Checklist')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Checklist Task',
|
||||||
|
'verbose_name_plural': 'Checklist Tasks',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
@ -2002,3 +2002,73 @@ class TicketDependency(models.Model):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%s / %s' % (self.ticket, self.depends_on)
|
return '%s / %s' % (self.ticket, self.depends_on)
|
||||||
|
|
||||||
|
|
||||||
|
def is_a_list_without_empty_element(task_list):
|
||||||
|
if not isinstance(task_list, list):
|
||||||
|
raise ValidationError(f'{task_list} is not a list')
|
||||||
|
for task in task_list:
|
||||||
|
if not isinstance(task, str):
|
||||||
|
raise ValidationError(f'{task} is not a string')
|
||||||
|
if task == '':
|
||||||
|
raise ValidationError('A task cannot be an empty string')
|
||||||
|
|
||||||
|
|
||||||
|
class ChecklistTemplate(models.Model):
|
||||||
|
name = models.CharField(
|
||||||
|
verbose_name=_('Name'),
|
||||||
|
max_length=100
|
||||||
|
)
|
||||||
|
task_list = models.JSONField(verbose_name=_('Task List'), validators=[is_a_list_without_empty_element])
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Checklist Template')
|
||||||
|
verbose_name_plural = _('Checklist Templates')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class Checklist(models.Model):
|
||||||
|
ticket = models.ForeignKey(
|
||||||
|
Ticket,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
verbose_name=_('Ticket'),
|
||||||
|
related_name='checklists',
|
||||||
|
)
|
||||||
|
name = models.CharField(
|
||||||
|
verbose_name=_('Name'),
|
||||||
|
max_length=100
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Checklist')
|
||||||
|
verbose_name_plural = _('Checklists')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class ChecklistTask(models.Model):
|
||||||
|
checklist = models.ForeignKey(
|
||||||
|
Checklist,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
verbose_name=_('Checklist'),
|
||||||
|
related_name='tasks',
|
||||||
|
)
|
||||||
|
description = models.CharField(
|
||||||
|
verbose_name=_('Description'),
|
||||||
|
max_length=250
|
||||||
|
)
|
||||||
|
completion_date = models.DateTimeField(
|
||||||
|
verbose_name=_('Completion Date'),
|
||||||
|
null=True,
|
||||||
|
blank=True
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Checklist Task')
|
||||||
|
verbose_name_plural = _('Checklist Tasks')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.description
|
||||||
|
Loading…
Reference in New Issue
Block a user