Skip to content

Commit

Permalink
feat(core): Add ticket categories
Browse files Browse the repository at this point in the history
ref: #283
  • Loading branch information
jon-nfc committed Sep 13, 2024
1 parent 9d8c894 commit d537881
Show file tree
Hide file tree
Showing 10 changed files with 543 additions and 1 deletion.
120 changes: 120 additions & 0 deletions app/core/forms/ticket_categories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
from django import forms
from django.forms import ValidationError
from django.urls import reverse

from app import settings

from core.forms.common import CommonModelForm
from core.models.ticket.ticket_category import TicketCategory



class TicketCategoryForm(CommonModelForm):


class Meta:

fields = '__all__'

model = TicketCategory

prefix = 'ticket_category'

def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)

self.fields['parent'].queryset = self.fields['parent'].queryset.exclude(
id=self.instance.pk
)


def clean(self):

cleaned_data = super().clean()

pk = self.instance.id

parent = cleaned_data.get("parent")

if pk:

if parent == pk:

raise ValidationError("Category can't have itself as its parent category")

return cleaned_data



class DetailForm(TicketCategoryForm):


tabs: dict = {
"details": {
"name": "Details",
"slug": "details",
"sections": [
{
"layout": "double",
"left": [
'parent',
'name',
'runbook',
'organization',
'c_created',
'c_modified'
],
"right": [
'model_notes',
]
},
{
"layout": "double",
"name": "Ticket Types",
"left": [
'change',
'problem'
'request'
],
"right": [
'incident',
'project_task'
]
},
]
},
"notes": {
"name": "Notes",
"slug": "notes",
"sections": []
}
}


def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)


self.fields['c_created'] = forms.DateTimeField(
label = 'Created',
input_formats=settings.DATETIME_FORMAT,
disabled = True,
initial = self.instance.created,
)

self.fields['c_modified'] = forms.DateTimeField(
label = 'Modified',
input_formats=settings.DATETIME_FORMAT,
disabled = True,
initial = self.instance.modified,
)


self.tabs['details'].update({
"edit_url": reverse('Settings:_ticket_category_change', kwargs={'pk': self.instance.pk})
})

self.url_index_view = reverse('Settings:_ticket_categories')

43 changes: 43 additions & 0 deletions app/core/migrations/0006_ticketcategory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Generated by Django 5.0.8 on 2024-09-13 01:10

import access.fields
import access.models
import django.db.models.deletion
import django.utils.timezone
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('access', '0001_initial'),
('assistance', '0001_initial'),
('core', '0005_ticket_relatedtickets_ticketcomment'),
]

operations = [
migrations.CreateModel(
name='TicketCategory',
fields=[
('is_global', models.BooleanField(default=False)),
('model_notes', models.TextField(blank=True, default=None, null=True, verbose_name='Notes')),
('id', models.AutoField(help_text='Category ID Number', primary_key=True, serialize=False, unique=True, verbose_name='Number')),
('created', access.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False)),
('modified', access.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False)),
('name', models.CharField(help_text='Category Name', max_length=50, verbose_name='Name')),
('change', models.BooleanField(default=True, help_text='Use category for change tickets', verbose_name='Change Tickets')),
('incident', models.BooleanField(default=True, help_text='Use category for incident tickets', verbose_name='Incident Tickets')),
('problem', models.BooleanField(default=True, help_text='Use category for problem tickets', verbose_name='Problem Tickets')),
('project_task', models.BooleanField(default=True, help_text='Use category for Project tasks', verbose_name='Project Tasks')),
('request', models.BooleanField(default=True, help_text='Use category for request tickets', verbose_name='Request Tickets')),
('organization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='access.organization', validators=[access.models.TenancyObject.validatate_organization_exists])),
('parent', models.ForeignKey(blank=True, help_text='The Parent Category', null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.ticketcategory', verbose_name='Parent Category')),
('runbook', models.ForeignKey(blank=True, help_text='The runbook for this category', null=True, on_delete=django.db.models.deletion.SET_NULL, to='assistance.knowledgebase', verbose_name='Runbook')),
],
options={
'verbose_name': 'Ticket Category',
'verbose_name_plural': 'Ticket Categories',
'ordering': ['name'],
},
),
]
111 changes: 111 additions & 0 deletions app/core/models/ticket/ticket_category.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
from django.db import models

from access.fields import AutoCreatedField, AutoLastModifiedField
from access.models import TenancyObject, Team

from assistance.models.knowledge_base import KnowledgeBase



class TicketCategoryCommonFields(TenancyObject):

class Meta:
abstract = True

id = models.AutoField(
blank=False,
help_text = 'Category ID Number',
primary_key=True,
unique=True,
verbose_name = 'Number',
)

created = AutoCreatedField()

modified = AutoLastModifiedField()



class TicketCategory(TicketCategoryCommonFields):


class Meta:

ordering = [
'name'
]

verbose_name = "Ticket Category"

verbose_name_plural = "Ticket Categories"


parent = models.ForeignKey(
'self',
blank= True,
help_text = 'The Parent Category',
null = True,
on_delete = models.SET_NULL,
verbose_name = 'Parent Category',
)

name = models.CharField(
blank = False,
help_text = "Category Name",
max_length = 50,
verbose_name = 'Name',
)

runbook = models.ForeignKey(
KnowledgeBase,
blank= True,
help_text = 'The runbook for this category',
null = True,
on_delete = models.SET_NULL,
verbose_name = 'Runbook',
)

change = models.BooleanField(
blank = False,
default = True,
help_text = 'Use category for change tickets',
null = False,
verbose_name = 'Change Tickets',
)

incident = models.BooleanField(
blank = False,
default = True,
help_text = 'Use category for incident tickets',
null = False,
verbose_name = 'Incident Tickets',
)

problem = models.BooleanField(
blank = False,
default = True,
help_text = 'Use category for problem tickets',
null = False,
verbose_name = 'Problem Tickets',
)

project_task = models.BooleanField(
blank = False,
default = True,
help_text = 'Use category for Project tasks',
null = False,
verbose_name = 'Project Tasks',
)

request = models.BooleanField(
blank = False,
default = True,
help_text = 'Use category for request tickets',
null = False,
verbose_name = 'Request Tickets',
)


def __str__(self):

return self.name
29 changes: 29 additions & 0 deletions app/core/templates/core/index_ticket_categories.html.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{% extends 'base.html.j2' %}

{% block content %}
<input type="button" value="New Category" onclick="window.location='{% url 'Settings:_ticket_category_add' %}';">

<table style="max-width: 100%;">
<thead>
<th>Name</th>
<th>Organization</th>
<th>created</th>
<th>modified</th>
<th>&nbsp;</th>
</thead>
{% if items %}
{% for category in items %}
<tr>
<td><a href="{% url 'Settings:_ticket_category_view' pk=category.id %}">{{ category.name }}</a></td>
<td>{{ category.organization }}</td>
<td>{{ category.created }}</td>
<td>{{ category.modified }}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="5">Nothing Found</td></tr>
{% endif%}
</table>

{% endblock %}
12 changes: 12 additions & 0 deletions app/core/templates/core/ticket_category.html.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% extends 'detail.html.j2' %}


{% block tabs %}

<div id="details" class="content-tab">

{% include 'content/section.html.j2' with tab=form.tabs.details %}

</div>

{% endblock %}
Loading

0 comments on commit d537881

Please sign in to comment.