diff --git a/app/core/forms/ticket.py b/app/core/forms/ticket.py
index f2a5a71fe..f6849829d 100644
--- a/app/core/forms/ticket.py
+++ b/app/core/forms/ticket.py
@@ -52,6 +52,18 @@ def __init__(self, request, *args, **kwargs):
self.fields['ticket_type'].widget = self.fields['ticket_type'].hidden_widget()
self.fields['organization'].widget = self.fields['organization'].hidden_widget()
+ if self.instance.project is not None:
+
+ self.fields['milestone'].queryset = self.fields['milestone'].queryset.filter(
+ project=self.instance.project
+ )
+
+ else:
+
+ self.fields['milestone'].queryset = self.fields['milestone'].queryset.filter(
+ id=0
+ )
+
original_fields = self.fields.copy()
ticket_type = []
diff --git a/app/core/forms/validate_ticket.py b/app/core/forms/validate_ticket.py
index a50247e5a..ffd454947 100644
--- a/app/core/forms/validate_ticket.py
+++ b/app/core/forms/validate_ticket.py
@@ -49,6 +49,7 @@ class TicketValidation(
'planned_finish_date',
'priority',
'project',
+ 'milestone',
'real_start_date',
'real_finish_date',
'subscribed_users',
@@ -67,6 +68,7 @@ class TicketValidation(
'planned_finish_date',
'priority',
'project',
+ 'milestone',
'real_start_date',
'real_finish_date',
'subscribed_users',
diff --git a/app/core/migrations/0005_ticketcategory_ticketcomment_ticketcommentcategory_and_more.py b/app/core/migrations/0005_ticketcategory_ticketcomment_ticketcommentcategory_and_more.py
index 9ad5d5d0d..ed57713c6 100644
--- a/app/core/migrations/0005_ticketcategory_ticketcomment_ticketcommentcategory_and_more.py
+++ b/app/core/migrations/0005_ticketcategory_ticketcomment_ticketcommentcategory_and_more.py
@@ -1,7 +1,8 @@
-# Generated by Django 5.0.8 on 2024-09-13 05:06
+# Generated by Django 5.0.8 on 2024-09-14 06:29
import access.fields
import access.models
+import core.lib.slash_commands
import core.models.ticket.ticket
import core.models.ticket.ticket_comment
import django.db.models.deletion
@@ -66,6 +67,7 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Comments',
'ordering': ['ticket', 'parent_id'],
},
+ bases=(core.lib.slash_commands.SlashCommands, models.Model),
),
migrations.CreateModel(
name='TicketCommentCategory',
@@ -121,8 +123,6 @@ class Migration(migrations.Migration):
('real_finish_date', models.DateTimeField(blank=True, help_text='Real finish date', null=True, verbose_name='Real Finish Date')),
('assigned_teams', models.ManyToManyField(blank=True, help_text='Assign the ticket to a Team(s)', related_name='assigned_teams', to='access.team', verbose_name='Assigned Team(s)')),
('assigned_users', models.ManyToManyField(blank=True, help_text='Assign the ticket to a User(s)', related_name='assigned_users', to=settings.AUTH_USER_MODEL, verbose_name='Assigned User(s)')),
- ('opened_by', models.ForeignKey(help_text='Who is the ticket for', on_delete=django.db.models.deletion.DO_NOTHING, related_name='opened_by', to=settings.AUTH_USER_MODEL, verbose_name='Opened By')),
- ('organization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='access.organization', validators=[access.models.TenancyObject.validatate_organization_exists])),
],
options={
'verbose_name': 'Ticket',
@@ -130,5 +130,6 @@ class Migration(migrations.Migration):
'ordering': ['id'],
'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')],
},
+ bases=(core.lib.slash_commands.SlashCommands, models.Model),
),
]
diff --git a/app/core/migrations/0006_ticket_project_ticket_subscribed_teams_and_more.py b/app/core/migrations/0006_ticket_milestone_ticket_opened_by_and_more.py
similarity index 88%
rename from app/core/migrations/0006_ticket_project_ticket_subscribed_teams_and_more.py
rename to app/core/migrations/0006_ticket_milestone_ticket_opened_by_and_more.py
index 834f0003f..685b3f18e 100644
--- a/app/core/migrations/0006_ticket_project_ticket_subscribed_teams_and_more.py
+++ b/app/core/migrations/0006_ticket_milestone_ticket_opened_by_and_more.py
@@ -1,4 +1,4 @@
-# Generated by Django 5.0.8 on 2024-09-13 05:06
+# Generated by Django 5.0.8 on 2024-09-14 06:29
import access.models
import core.models.ticket.ticket_comment
@@ -18,6 +18,21 @@ class Migration(migrations.Migration):
]
operations = [
+ migrations.AddField(
+ model_name='ticket',
+ name='milestone',
+ field=models.ForeignKey(blank=True, help_text='Assign to a milestone', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='project_management.projectmilestone', verbose_name='Project Milestone'),
+ ),
+ migrations.AddField(
+ model_name='ticket',
+ name='opened_by',
+ field=models.ForeignKey(help_text='Who is the ticket for', on_delete=django.db.models.deletion.DO_NOTHING, related_name='opened_by', to=settings.AUTH_USER_MODEL, verbose_name='Opened By'),
+ ),
+ migrations.AddField(
+ model_name='ticket',
+ name='organization',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='access.organization', validators=[access.models.TenancyObject.validatate_organization_exists]),
+ ),
migrations.AddField(
model_name='ticket',
name='project',
diff --git a/app/core/models/ticket/ticket.py b/app/core/models/ticket/ticket.py
index 4944e8058..0e7e73a35 100644
--- a/app/core/models/ticket/ticket.py
+++ b/app/core/models/ticket/ticket.py
@@ -11,7 +11,7 @@
from core.middleware.get_request import get_request
from core.models.ticket.ticket_category import TicketCategory
-from project_management.models.projects import Project
+from project_management.models.project_milestone import Project, ProjectMilestone
@@ -528,6 +528,15 @@ def validation_title(field):
verbose_name = 'Project',
)
+ milestone = models.ForeignKey(
+ ProjectMilestone,
+ blank= True,
+ help_text = 'Assign to a milestone',
+ null = True,
+ on_delete = models.DO_NOTHING,
+ verbose_name = 'Project Milestone',
+ )
+
opened_by = models.ForeignKey(
User,
@@ -642,6 +651,7 @@ def __str__(self):
'category'
'urgency',
'project',
+ 'milestone',
'priority',
'impact',
'subscribed_teams',
@@ -680,6 +690,7 @@ def __str__(self):
fields_project_task: list(str()) = common_fields + [
'category',
+ 'milestone',
'status',
'urgency',
'priority',
@@ -695,6 +706,7 @@ def __str__(self):
tech_fields = [
'category',
'project',
+ 'milestone',
'assigned_users',
'assigned_teams',
'subscribed_teams',
diff --git a/app/core/templates/core/ticket.html.j2 b/app/core/templates/core/ticket.html.j2
index 0e02ca135..c18fd6868 100644
--- a/app/core/templates/core/ticket.html.j2
+++ b/app/core/templates/core/ticket.html.j2
@@ -132,16 +132,22 @@
{% endif %}
+ {% if ticket.project %}
+ {% endif %}
+ {% if ticket.milestone %}
+
+ {% endif %}