Skip to content

Ticket Object


This page contains the Ticket API Documentation.

Ticket Status

Ticket Status

Status of the ticket. By design, not all statuses are available for ALL ticket types.

Request / Incident ticket

  • Draft
  • New
  • Assigned
  • Assigned (Planned)
  • Pending
  • Solved
  • Closed

Problem Ticket

  • Draft
  • New
  • Accepted
  • Assigned
  • Assigned (Planned)
  • Pending
  • Solved
  • Under Observation
  • Closed

Change Ticket

  • Draft
  • New
  • Evaluation
  • Approvals
  • Accepted
  • Pending
  • Testing
  • Qualification
  • Applied
  • Review
  • Closed
  • Cancelled
  • Refused

Ticket External System

Bases: IntegerChoices

Attributes

CUSTOM_1

CUSTOM_1 = (_CUSTOM_1_INT, _CUSTOM_1_VALUE)

CUSTOM_2

CUSTOM_2 = (_CUSTOM_2_INT, _CUSTOM_2_VALUE)

CUSTOM_3

CUSTOM_3 = (_CUSTOM_3_INT, _CUSTOM_3_VALUE)

CUSTOM_4

CUSTOM_4 = (_CUSTOM_4_INT, _CUSTOM_4_VALUE)

CUSTOM_5

CUSTOM_5 = (_CUSTOM_5_INT, _CUSTOM_5_VALUE)

CUSTOM_6

CUSTOM_6 = (_CUSTOM_6_INT, _CUSTOM_6_VALUE)

CUSTOM_7

CUSTOM_7 = (_CUSTOM_7_INT, _CUSTOM_7_VALUE)

CUSTOM_8

CUSTOM_8 = (_CUSTOM_8_INT, _CUSTOM_8_VALUE)

CUSTOM_9

CUSTOM_9 = (_CUSTOM_9_INT, _CUSTOM_9_VALUE)

GITHUB

GITHUB = (_GITHUB_INT, _GITHUB_VALUE)

GITLAB

GITLAB = (_GITLAB_INT, _GITLAB_VALUE)

Ticket Type

Bases: IntegerChoices

Centurion ERP has the following ticket types available:

  • Request

  • Incident

  • Change

  • Problem

As we use a common model for ALL ticket types. Effort has been made to limit fields showing for a ticket type that it does not belong. If you find a field displayed that does not belong to a ticket, please create an issue.

Attributes

CHANGE

CHANGE = ('3', 'Change')

INCIDENT

INCIDENT = ('2', 'Incident')

ISSUE

ISSUE = ('5', 'Issue')

MERGE_REQUEST

MERGE_REQUEST = ('6', 'Merge Request')

PROBLEM

PROBLEM = ('4', 'Problem')

PROJECT_TASK

PROJECT_TASK = ('7', 'Project Task')

REQUEST

REQUEST = ('1', 'Request')

Ticket Urgency

Bases: IntegerChoices

Attributes

HIGH

HIGH = ('4', 'High')

LOW

LOW = ('2', 'Low')

MEDIUM

MEDIUM = ('3', 'Medium')

VERY_HIGH

VERY_HIGH = ('5', 'Very High')

VERY_LOW

VERY_LOW = ('1', 'Very Low')

Ticket Impact

Bases: IntegerChoices

Attributes

HIGH

HIGH = ('4', 'High')

LOW

LOW = ('2', 'Low')

MEDIUM

MEDIUM = ('3', 'Medium')

VERY_HIGH

VERY_HIGH = ('5', 'Very High')

VERY_LOW

VERY_LOW = ('1', 'Very Low')

Ticket Priority

Bases: IntegerChoices

Attributes

HIGH

HIGH = (_HIGH_INT, _HIGH_VALUE)

LOW

LOW = (_LOW_INT, _LOW_VALUE)

MAJOR

MAJOR = (_MAJOR_INT, _MAJOR_VALUE)

MEDIUM

MEDIUM = (_MEDIUM_INT, _MEDIUM_VALUE)

VERY_HIGH

VERY_HIGH = (_VERY_HIGH_INT, _VERY_HIGH_VALUE)

VERY_LOW

VERY_LOW = (_VERY_LOW_INT, _VERY_LOW_VALUE)

Ticket Object Model Abstract class

Bases: SlashCommands, TenancyObject, TicketCommonFields

Attributes

assigned_teams

assigned_teams = ManyToManyField(Team, blank=True, help_text='Assign the ticket to a Team(s)', related_name='assigned_teams', symmetrical=False, verbose_name='Assigned Team(s)')

assigned_users

assigned_users = ManyToManyField(AUTH_USER_MODEL, blank=True, help_text='Assign the ticket to a User(s)', related_name='assigned_users', symmetrical=False, verbose_name='Assigned User(s)')

category

category = ForeignKey(TicketCategory, blank=True, help_text='Category for this ticket', null=True, on_delete=SET_NULL, verbose_name='Category')

comments

comments

common_fields

common_fields: list(str()) = ['organization', 'title', 'description', 'opened_by', 'ticket_type', 'assigned_users', 'assigned_teams', 'estimate']

common_git_fields

common_git_fields: list(str()) = common_fields + []

common_itsm_fields

common_itsm_fields: list(str()) = common_fields + ['status', 'categoryurgency', 'project', 'milestone', 'priority', 'impact', 'subscribed_teams', 'subscribed_users']

date_closed

date_closed = DateTimeField(blank=True, help_text='Date ticket closed', null=True, verbose_name='Closed Date')

description

description = TextField(blank=False, help_text='Ticket Description', null=False, verbose_name='Description')

duration_ticket

duration_ticket: str

estimate

estimate = IntegerField(blank=False, default=0, help_text='Time Eastimated to complete this ticket in seconds', null=False, verbose_name='Estimation')

external_ref

external_ref = IntegerField(blank=True, default=None, help_text='External System reference', null=True, verbose_name='Reference Number')

external_system

external_system = IntegerField(blank=True, choices=Ticket_ExternalSystem, default=None, help_text='External system this item derives', null=True, verbose_name='External System')

fields_git_issue

fields_git_issue: list(str()) = common_fields + []

fields_git_merge_request

fields_git_merge_request: list(str()) = common_fields + []

fields_itsm_change

fields_itsm_change: list(str()) = common_itsm_fields + []

fields_itsm_incident

fields_itsm_incident: list(str()) = common_itsm_fields + []

fields_itsm_problem

fields_itsm_problem: list(str()) = common_itsm_fields + []

fields_itsm_request

fields_itsm_request: list(str()) = common_itsm_fields + []

fields_project_task

fields_project_task: list(str()) = common_fields + ['category', 'milestone', 'status', 'urgency', 'priority', 'impact', 'subscribed_teams', 'subscribed_users', 'planned_start_date', 'planned_finish_date', 'real_start_date', 'real_finish_date']

impact

impact = IntegerField(blank=True, choices=TicketImpact, default=VERY_LOW, help_text='End user assessed impact', null=True, verbose_name='Impact')

impact_badge

impact_badge

is_deleted

is_deleted = BooleanField(blank=False, default=False, help_text='Is the ticket deleted? And ready to be purged', null=False, verbose_name='Deleted')

is_global

is_global = None

linked_items

linked_items: list(dict())

Fetch items linked to ticket

Returns:

Type Description
list(dict())

List of dict (list): List of dictionary with fields: id, name, type and url.

list(dict())

Empty List (list): No items were found

milestone

milestone = ForeignKey(ProjectMilestone, blank=True, help_text='Assign to a milestone', null=True, on_delete=SET_NULL, verbose_name='Project Milestone')

model_notes

model_notes = None

opened_by

opened_by = ForeignKey(AUTH_USER_MODEL, blank=False, help_text='Who is the ticket for', null=False, on_delete=DO_NOTHING, related_name='opened_by', verbose_name='Opened By')

page_layout

page_layout: list = []

parent_ticket

parent_ticket = ForeignKey('self', blank=True, default=None, help_text='Parent of this ticket', null=True, on_delete=SET_NULL, verbose_name='Parent Ticket')

planned_finish_date

planned_finish_date = DateTimeField(blank=True, help_text='Planned finish date', null=True, verbose_name='Planned Finish Date')

planned_start_date

planned_start_date = DateTimeField(blank=True, help_text='Planned start date.', null=True, verbose_name='Planned Start Date')

priority

priority = IntegerField(blank=True, choices=TicketPriority, default=VERY_LOW, help_text='What priority should this ticket for its completion', null=True, verbose_name='Priority')

priority_badge

priority_badge

project

project = ForeignKey(Project, blank=True, help_text='Assign to a project', null=True, on_delete=SET_NULL, verbose_name='Project')

real_finish_date

real_finish_date = DateTimeField(blank=True, help_text='Real finish date', null=True, verbose_name='Real Finish Date')

real_start_date

real_start_date = DateTimeField(blank=True, help_text='Real start date', null=True, verbose_name='Real Start Date')

related_tickets

related_tickets: list(dict())

save_model_history

save_model_history: bool = False

status

status = IntegerField(blank=False, choices=All, default=NEW, help_text='Status of ticket', verbose_name='Status')

status_badge

status_badge

subscribed_teams

subscribed_teams = ManyToManyField(Team, blank=True, help_text='Subscribe a Team(s) to the ticket to receive updates', related_name='subscribed_teams', symmetrical=False, verbose_name='Subscribed Team(s)')

subscribed_users

subscribed_users = ManyToManyField(AUTH_USER_MODEL, blank=True, help_text='Subscribe a User(s) to the ticket to receive updates', related_name='subscribed_users', symmetrical=False, verbose_name='Subscribed User(s)')

table_fields

table_fields: list = ['id', 'title', 'status_badge', 'priority_badge', 'impact_badge', 'urgency_badge', 'opened_by', 'organization', 'created']

tech_fields

tech_fields = ['category', 'project', 'milestone', 'assigned_users', 'assigned_teams', 'subscribed_teams', 'subscribed_users', 'status', 'urgency', 'impact', 'priority', 'planned_start_date', 'planned_finish_date']

ticket_type

ticket_type = IntegerField(blank=False, choices=TicketType, help_text='The type of ticket this is', validators=[validation_ticket_type], verbose_name='Type')

title

title = CharField(blank=False, help_text='Title of the Ticket', max_length=100, unique=True, verbose_name='Title')

urgency

urgency = IntegerField(blank=True, choices=TicketUrgency, default=VERY_LOW, help_text='How urgent is this tickets resolution for the user?', null=True, verbose_name='Urgency')

urgency_badge

urgency_badge

Classes

Meta

Attributes
ordering
ordering = ['id']
permissions
permissions = [('add_ticket_request', 'Can add a request ticket'), ('change_ticket_request', 'Can change any request ticket'), ('delete_ticket_request', 'Can delete a request ticket'), ('import_ticket_request', 'Can import a request ticket'), ('purge_ticket_request', 'Can purge a request ticket'), ('triage_ticket_request', 'Can triage all request ticket'), ('view_ticket_request', 'Can view all request ticket'), ('add_ticket_incident', 'Can add a incident ticket'), ('change_ticket_incident', 'Can change any incident ticket'), ('delete_ticket_incident', 'Can delete a incident ticket'), ('import_ticket_incident', 'Can import a incident ticket'), ('purge_ticket_incident', 'Can purge a incident ticket'), ('triage_ticket_incident', 'Can triage all incident ticket'), ('view_ticket_incident', 'Can view all incident ticket'), ('add_ticket_problem', 'Can add a problem ticket'), ('change_ticket_problem', 'Can change any problem ticket'), ('delete_ticket_problem', 'Can delete a problem ticket'), ('import_ticket_problem', 'Can import a problem ticket'), ('purge_ticket_problem', 'Can purge a problem ticket'), ('triage_ticket_problem', 'Can triage all problem ticket'), ('view_ticket_problem', 'Can view all problem ticket'), ('add_ticket_change', 'Can add a change ticket'), ('change_ticket_change', 'Can change any change ticket'), ('delete_ticket_change', 'Can delete a change ticket'), ('import_ticket_change', 'Can import a change ticket'), ('purge_ticket_change', 'Can purge a change ticket'), ('triage_ticket_change', 'Can triage all change ticket'), ('view_ticket_change', 'Can view all change ticket'), ('add_ticket_project_task', 'Can add a project task'), ('change_ticket_project_task', 'Can change any project task'), ('delete_ticket_project_task', 'Can delete a project task'), ('import_ticket_project_task', 'Can import a project task'), ('purge_ticket_project_task', 'Can purge a project task'), ('triage_ticket_project_task', 'Can triage all project task'), ('view_ticket_project_task', 'Can view all project task')]
unique_together
unique_together = ('external_system', 'external_ref')
verbose_name
verbose_name = 'Ticket'
verbose_name_plural
verbose_name_plural = 'Tickets'

Functions

__str__

__str__()

action_comment_ticket_teams

action_comment_ticket_teams(sender, instance, action, reverse, model, pk_set, **kwargs)

Ticket *_teams many2many field

  • Create the action comment
  • Update ticket status to New/Assigned

action_comment_ticket_users

action_comment_ticket_users(sender, instance, action, reverse, model, pk_set, **kwargs)

Ticket *_users many2many field

  • Create the action comment
  • Update ticket status to New/Assigned

assigned_status_update

assigned_status_update(instance) -> None

Update Ticket status based off of assigned

  • If the ticket has any assigned team(s)/user(s), update the status to assigned.
  • If the ticket does not have any assigned team(s)/user(s), update the status to new.

This method only updates the status if the existing status is New or Assigned.

circular_dependency_check

circular_dependency_check(ticket, parent, depth: int = 0) -> bool

Confirm the parent ticket does not create circular dependencies

A recursive check from ticket to depth. If a dependency is found. False will be returned

Parameters:

Name Type Description Default
ticket Ticket

The initial ticket to check against

required
parent Ticket

The parent ticket to check,

required
depth int

How deep the recursive check should go. Defaults to 0.

0

Returns:

Name Type Description
True bool

No circular dependency found

False bool

Circular dependency was found

get_url

get_url(request=None) -> str

get_url_kwargs_notes

get_url_kwargs_notes()

save

save(force_insert=False, force_update=False, using=None, update_fields=None)

ticketassigned

ticketassigned(instance) -> bool

Check if the ticket has any assigned user(s)/team(s)

validation_ticket_type

validation_ticket_type(field)

validation_title

validation_title(field)

About:

This page forms part of our Project Centurion ERP.

Page Metadata
Version: ToDo: place files short git commit here
Date Created: 2024-09-01
Date Edited: 2024-09-01

Contribution:

Would You like to contribute to our Centurion ERP project? You can assist in the following ways:

 

ToDo: Add the page list of contributors