diff --git a/pms/forms.py b/pms/forms.py index 45e70baa7..e9388c50c 100644 --- a/pms/forms.py +++ b/pms/forms.py @@ -144,6 +144,12 @@ class ObjectiveForm(forms.ModelForm): "employee", None ) # access the logged-in user's information super(ObjectiveForm, self).__init__(*args, **kwargs) + + self.fields["period"].choices = list(self.fields["period"].choices) + self.fields["period"].choices.append( + ("create_new_period", "Create new period") + ) + if employee and Employee.objects.filter( employee_work_info__reporting_manager_id=employee ): @@ -433,6 +439,12 @@ class FeedbackForm(forms.ModelForm): if instance: kwargs["initial"] = set_date_field_initial(instance) super().__init__(*args, **kwargs) + + self.fields["period"].choices = list(self.fields["period"].choices) + self.fields["period"].choices.append( + ("create_new_period", "Create new period") + ) + if instance: self.fields["employee_id"].widget.attrs.update( {"class": "oh-select oh-select-2"} diff --git a/pms/models.py b/pms/models.py index fe4e541d6..f246fa813 100644 --- a/pms/models.py +++ b/pms/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.forms import ValidationError from django.utils.translation import gettext_lazy as _ # importing simple history @@ -13,8 +14,8 @@ class Period(models.Model): """this is a period model used for creating period""" period_name = models.CharField(max_length=150, unique=True) - start_date = models.DateField(null=True, blank=True) - end_date = models.DateField(null=True, blank=True) + start_date = models.DateField() + end_date = models.DateField() objects = models.Manager() def __str__(self): diff --git a/pms/static/src/dashboard/pmsChart.js b/pms/static/src/dashboard/pmsChart.js index 217086068..edc664413 100644 --- a/pms/static/src/dashboard/pmsChart.js +++ b/pms/static/src/dashboard/pmsChart.js @@ -1,7 +1,9 @@ const objectiveChart = document.getElementById('objectiveChart'); - +console.log('--------------------------------'); +console.log(objectiveChart); +console.log('--------------------------------'); // data dictionary var objectiveStatusData = { labels: [], @@ -13,11 +15,14 @@ var objectiveStatusData = { }] }; + // chart constructor -var objectiveStatusChart = new Chart(objectiveChart, { - type: "doughnut", - data: objectiveStatusData, -}); +if (objectiveChart != null) { + var objectiveStatusChart = new Chart(objectiveChart, { + type: "doughnut", + data: objectiveStatusData, + }); +} function objectiveStatusDataUpdate(data){ objectiveStatusData.labels = data.objective_label @@ -75,10 +80,12 @@ var keyResultStatusData = { }; // chart constructor -var keyResultStatusChart = new Chart(keyResultStatusChartCtx, { - type: "pie", - data: keyResultStatusData, -}); +if (keyResultStatusChartCtx != null) { + var keyResultStatusChart = new Chart(keyResultStatusChartCtx, { + type: "pie", + data: keyResultStatusData, + }); +} function keyResultStatusDataUpdate(data){ keyResultStatusData.labels = data.key_result_label @@ -128,7 +135,7 @@ const feedbackStatusChartCtx = document.getElementById('feedbackChart'); var feedbackStatusData = { labels: [], datasets: [{ - label: '', + label: 'Feedback', data: [], backgroundColor: [ '#8de5b3', '#f0a8a6', '#8ed1f7', '#f8e08e', '#c2c7cc'], hoverOffset: 3 @@ -136,11 +143,13 @@ var feedbackStatusData = { }; // chart constructor -var feedbackStatusChart = new Chart(feedbackStatusChartCtx, { - type: "line", - data: feedbackStatusData, -}); - +if (feedbackStatusChartCtx != null) { + var feedbackStatusChart = new Chart(feedbackStatusChartCtx, { + type: "line", + data: feedbackStatusData, + }); +} + function feedbackStatusDataUpdate(data){ feedbackStatusData.labels = data.feedback_label feedbackStatusData.datasets[0].data = data.feedback_value diff --git a/pms/static/src/feedback/feedback_creation.js b/pms/static/src/feedback/feedback_creation.js index 69d195989..3e269e9e7 100644 --- a/pms/static/src/feedback/feedback_creation.js +++ b/pms/static/src/feedback/feedback_creation.js @@ -78,6 +78,21 @@ $(document).ready(function () { }); } + $("#id_period").on("change",function(){ + period_id = $(this).val() + if (period_id === 'create_new_period'){ + $.ajax({ + type: "GET", + url: 'create-period', + success: function (response) { + $("#PeriodModal").addClass("oh-modal--show"); + $("#periodModalTarget").html(response); + }, + }); + } + }); + + }); diff --git a/pms/static/src/okr/objective_creation.js b/pms/static/src/okr/objective_creation.js index a9584bc46..2eb3cf92f 100644 --- a/pms/static/src/okr/objective_creation.js +++ b/pms/static/src/okr/objective_creation.js @@ -23,4 +23,18 @@ $(document).ready(function () { $(`[name=${value}]`).attr('required',true) }) + + $("#id_period").on("change",function(){ + period_id = $(this).val() + if (period_id === 'create_new_period'){ + $.ajax({ + type: "GET", + url: 'create-period', + success: function (response) { + $("#PeriodModal").addClass("oh-modal--show"); + $("#periodModalTarget").html(response); + }, + }); + } + }); }); \ No newline at end of file diff --git a/pms/templates/dashboard/pms_dashboard.html b/pms/templates/dashboard/pms_dashboard.html index 2d0465bc9..aa93b15e9 100644 --- a/pms/templates/dashboard/pms_dashboard.html +++ b/pms/templates/dashboard/pms_dashboard.html @@ -2,7 +2,11 @@ {% block content %} {% load static i18n %} {% load i18n %} - +
@@ -48,37 +52,64 @@
-
+
{% trans "Objective Status" %} - +
- + {% if count_objective %} + + {% else %} +
+
+ Page not found. 404. +

{% trans "No Objectives are available." %}

+
+
+ {% endif %}
-
+
{% trans "Key Result Status" %} - +
- + {% if count_key_result %} + + {% else %} +
+
+ +

{% trans "No Key Results are available." %}

+
+
+ {% endif %}
-
+
{% trans "Feedback Status" %} - +
- + {% if count_feedback %} + + {% else %} +
+
+ +

{% trans "No Feedbacks are available." %}

+
+
+ {% endif %}
@@ -95,11 +126,11 @@
-
+
{% trans "OKR At-Risk" %}
-
+ {% comment %}
    {% for okr in okr_at_risk %}
  • @@ -116,6 +147,27 @@ {% endfor %}
+
{% endcomment %} +
+ {% if okr_at_risk %} + + {% else %} +
{% trans "No OKRs are currently At-Risk." %}
+ {% endif %}
diff --git a/pms/templates/feedback/feedback_creation.html b/pms/templates/feedback/feedback_creation.html index 5ab6fb576..25993612f 100644 --- a/pms/templates/feedback/feedback_creation.html +++ b/pms/templates/feedback/feedback_creation.html @@ -138,6 +138,23 @@
+ + + + +
diff --git a/pms/templates/okr/create_period.html b/pms/templates/okr/create_period.html new file mode 100644 index 000000000..db60ab424 --- /dev/null +++ b/pms/templates/okr/create_period.html @@ -0,0 +1,121 @@ +{% load i18n %} +{% if form.errors %} + +
+
+ {% for error in form.non_field_errors %} +
+ {{ error }} +
+ {% endfor %} +
+
+{% endif %} +{% trans "Create Period" %} +
+ {% csrf_token %} +
+
+
+
+ +
+ + {{ form.period_name }} + {{ form.period_name.errors }} + +
+
+
+
+ + {{form.start_date}} + +
+ + +
+
+
+
+ + {{form.end_date}} + +
+
+
+
+ +
+ +
+
+ \ No newline at end of file diff --git a/pms/templates/okr/objective_creation.html b/pms/templates/okr/objective_creation.html index 2536c98cb..e3bcdeb5c 100644 --- a/pms/templates/okr/objective_creation.html +++ b/pms/templates/okr/objective_creation.html @@ -109,6 +109,23 @@ + + + + + diff --git a/pms/urls.py b/pms/urls.py index 50386e91f..64cab681a 100644 --- a/pms/urls.py +++ b/pms/urls.py @@ -162,4 +162,9 @@ urlpatterns = [ views.dashboard_feedback_status, name="dashboard-feedback-status", ), + path( + "create-period", + views.create_period, + name="create-period", + ), ] diff --git a/pms/views.py b/pms/views.py index afe4a865a..c46e59a84 100644 --- a/pms/views.py +++ b/pms/views.py @@ -215,8 +215,8 @@ def objective_filter_pagination(request, objective_own, objective_all): previous_data = request.GET.urlencode() initial_data = {"archive": False} # set initial value of archive filter to False if request.GET.get("status") != "Closed": - objective_own = objective_own.exclude(status="Closed") - objective_all = objective_all.exclude(status="Closed") + objective_own = objective_own + objective_all = objective_all objective_filter_own = ObjectiveFilter( request.GET or initial_data, queryset=objective_own ) @@ -257,40 +257,29 @@ def objective_list_view(request): ) if request.user.has_perm("pms.view_employeeobjective"): - objective_own = EmployeeObjective.objects.filter(employee_id=employee).exclude( - status="Closed" - ) | EmployeeObjective.objects.filter(emp_obj_id__employee_id=employee).exclude( - status="Closed" - ) + objective_own = EmployeeObjective.objects.filter(employee_id=employee + ) | EmployeeObjective.objects.filter(emp_obj_id__employee_id=employee) objective_own = objective_own.distinct() - objective_all = EmployeeObjective.objects.all().exclude(status="Closed") + objective_all = EmployeeObjective.objects.all() context = objective_filter_pagination(request, objective_own, objective_all) elif is_manager: # if user is a manager employees_ids = [employee.id for employee in is_manager] - objective_own = EmployeeObjective.objects.filter(employee_id=employee).exclude( - status="Closed" - ) | EmployeeObjective.objects.filter(emp_obj_id__employee_id=employee).exclude( - status="Closed" - ) + objective_own = EmployeeObjective.objects.filter(employee_id=employee + ) | EmployeeObjective.objects.filter(emp_obj_id__employee_id=employee) objective_own = objective_own.distinct() objective_all = EmployeeObjective.objects.filter( employee_id__in=employees_ids - ).exclude(status="Closed") | EmployeeObjective.objects.filter( + )| EmployeeObjective.objects.filter( emp_obj_id__employee_id__in=employees_ids - ).exclude( - status="Closed" ) objective_all = objective_all.distinct() context = objective_filter_pagination(request, objective_own, objective_all) else: # for normal user - objective_own = EmployeeObjective.objects.filter(employee_id=employee).exclude( - status="Closed" - ) | EmployeeObjective.objects.filter(emp_obj_id__employee_id=employee).exclude( - status="Closed" - ) + objective_own = EmployeeObjective.objects.filter(employee_id=employee + ) | EmployeeObjective.objects.filter(emp_obj_id__employee_id=employee) objective_own = objective_own.distinct() objective_all = EmployeeObjective.objects.none() context = objective_filter_pagination(request, objective_own, objective_all) @@ -1004,13 +993,12 @@ def feedback_list_view(request): ).values_list("id", flat=True) feedback_own = ( Feedback.objects.filter(employee_id=employee) - .exclude(status="Closed") .filter(archive=False) ) feedback_requested = Feedback.objects.filter(pk__in=feedback_requested_ids).filter( archive=False ) - feedback_all = Feedback.objects.all().exclude(status="Closed").filter(archive=False) + feedback_all = Feedback.objects.all().filter(archive=False) employees = Employee.objects.filter( employee_work_info__reporting_manager_id=employee ) # checking the user is reporting manager or not @@ -1723,7 +1711,7 @@ def dashboard_view(request): count_key_result = EmployeeKeyResult.objects.all().count() count_feedback = Feedback.objects.all().count() okr_at_risk = EmployeeObjective.objects.filter(status="At Risk") - if is_manager: + elif is_manager: employees_ids = [employee.id for employee in is_manager] count_objective = EmployeeObjective.objects.filter( employee_id__in=employees_ids @@ -1822,3 +1810,24 @@ def filtersubordinates(request, queryset, perm=None): else: queryset = queryset.filter(employee_id=user.employee_get) return queryset + + +@login_required +def create_period(request): + """ + This is an ajax method to return json response to create stage related + to the project in the task-all form fields + """ + + if request.method == 'GET': + form = PeriodForm() + if request.method == 'POST': + form = PeriodForm(request.POST) + if form.is_valid(): + instance = form.save() + return JsonResponse({"id": instance.id, "name": instance.period_name, "start_date": instance.start_date, "end_date": instance.end_date}) + errors = form.errors.as_json() + print('-------------------------------------') + print(errors) + return JsonResponse({"errors": errors}) + return render(request,"okr/create_period.html",context={"form": form})