diff --git a/app/api/serializers/project_management/projects.py b/app/api/serializers/project_management/projects.py index 30c06974..0baff3e9 100644 --- a/app/api/serializers/project_management/projects.py +++ b/app/api/serializers/project_management/projects.py @@ -11,6 +11,10 @@ class ProjectSerializer( serializers.ModelSerializer, ): + percent_completed = serializers.CharField( + read_only = True, + ) + url = serializers.SerializerMethodField('get_url') @@ -58,6 +62,7 @@ class ProjectSerializer( 'manager_team', 'team_members', 'project_tasks_url', + 'percent_completed', 'created', 'modified', 'external_ref', diff --git a/app/project_management/forms/project.py b/app/project_management/forms/project.py index 4b289d2a..097e2808 100644 --- a/app/project_management/forms/project.py +++ b/app/project_management/forms/project.py @@ -136,10 +136,11 @@ class DetailForm(ProjectForm): initial = to_duration(self.instance.duration_project), ) - self.fields['resources'] = forms.CharField( - label = 'Available Resources', + self.fields['completed'] = forms.CharField( disabled = True, - initial = 'xx/yy CPU, xx/yy RAM, xx/yy Storage', + help_text = 'Project completion percentage.', + initial = self.instance.percent_completed, + label = 'Completed', ) self.tabs['details'].update({ diff --git a/app/project_management/models/projects.py b/app/project_management/models/projects.py index 4490d566..1a313f66 100644 --- a/app/project_management/models/projects.py +++ b/app/project_management/models/projects.py @@ -202,5 +202,36 @@ class Project(ProjectCommonFieldsName): str: Calculated percentage of project completion. """ - return 'xx %' + from core.models.ticket.ticket import Ticket + + ticket_status_closed = [ + TicketValues._CANCELLED_INT, + TicketValues._CLOSED_INT, + TicketValues._SOLVED_INT, + ] + + all_tickets = Ticket.objects.filter( + project = self.id, + ).exclude( + status__in = ticket_status_closed + ) + + closed_tickets = Ticket.objects.filter( + project = self.id, + status__in = ticket_status_closed + ) + + calculation: int = 0 + + if len(all_tickets) > 0: + + if len(closed_tickets) > 0: + + calculation: int = int( + ( + len(closed_tickets) / len(all_tickets) + ) * 100 + ) + + return str(calculation) + '%'