diff --git a/project/apps.py b/project/apps.py index 37068f2d2..70e723d6b 100644 --- a/project/apps.py +++ b/project/apps.py @@ -8,21 +8,12 @@ class ProjectConfig(AppConfig): def ready(self): from django.urls import include, path + from horilla.horilla_settings import APP_URLS, APPS from horilla.urls import urlpatterns + APPS.append("project") urlpatterns.append( path("project/", include("project.urls")), ) + APP_URLS.append("project.urls") super().ready() - try: - from django.urls import include, path - - from horilla.urls import urlpatterns - - urlpatterns.append( - path("project/", include("project.urls")), - ) - except: - """ - Models not ready yet - """ diff --git a/project/cbv/tasks.py b/project/cbv/tasks.py index d729f0560..03d1788b2 100644 --- a/project/cbv/tasks.py +++ b/project/cbv/tasks.py @@ -187,11 +187,8 @@ class TasksNavBar(HorillaNavView): managers = [ manager for project in projects for manager in project.managers.all() ] - members = [member for project in projects for member in project.members.all()] self.search_url = reverse("tasks-list-view") - if employee in managers + members or self.request.user.has_perm( - "project.add_task" - ): + if employee in managers or self.request.user.has_perm("project.add_task"): self.create_attrs = f""" onclick = "event.stopPropagation();" data-toggle="oh-modal-toggle" @@ -271,35 +268,36 @@ class TaskCreateForm(HorillaFormView): project_id = self.kwargs.get("project_id") stage_id = self.kwargs.get("stage_id") task_id = self.kwargs.get("pk") - try: - if project_id: - project = Project.objects.filter(id=project_id).first() - elif stage_id: - project = ProjectStage.objects.filter(id=stage_id).first().project - elif task_id: - task = Task.objects.filter(id=task_id).first() - project = task.project - elif not task_id: + # try: + if project_id: + project = Project.objects.filter(id=project_id).first() + elif stage_id: + project = ProjectStage.objects.filter(id=stage_id).first().project + elif task_id: + task = Task.objects.filter(id=task_id).first() + project = task.project + elif not task_id: + return super().get(request, *args, pk=pk, **kwargs) + if ( + request.user.employee_get in project.managers.all() + or request.user.is_superuser + or request.user.has_perm("project.add_task") + ): + self.dynamic_create_fields = [ + ("project", DynamicProjectCreationFormView), + ("stage", StageDynamicCreateForm), + ] + return super().get(request, *args, pk=pk, **kwargs) + elif task_id: + if request.user.employee_get in task.task_managers.all(): return super().get(request, *args, pk=pk, **kwargs) - if ( - request.user.employee_get in project.managers.all() - or request.user.is_superuser - ): - self.dynamic_create_fields = [ - ("project", DynamicProjectCreationFormView), - ("stage", StageDynamicCreateForm), - ] - return super().get(request, *args, pk=pk, **kwargs) - elif task_id: - if request.user.employee_get in task.task_managers.all(): - return super().get(request, *args, pk=pk, **kwargs) - else: - return you_dont_have_permission(request) - except Exception as e: - logger.error(e) - messages.error(request, _("Something went wrong!")) - return HttpResponse("") + else: + return you_dont_have_permission(request) + # except Exception as e: + # logger.error(e) + # messages.error(request, _("Something went wrong!")) + # return HttpResponse("") def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) diff --git a/project/cbv/timesheet.py b/project/cbv/timesheet.py index 296b6ae95..cf390b47b 100644 --- a/project/cbv/timesheet.py +++ b/project/cbv/timesheet.py @@ -258,7 +258,8 @@ class TaskTimeSheet(TimeSheetList): if employee_id: employee = Employee.objects.filter(id=employee_id).first() if ( - not employee in task.task_managers.all() + employee + and not employee in task.task_managers.all() and not employee in task.project.managers.all() and not employee.employee_user_id.is_superuser ): diff --git a/project/forms.py b/project/forms.py index e2c3e3ef9..7df47408e 100644 --- a/project/forms.py +++ b/project/forms.py @@ -187,10 +187,12 @@ class TaskAllForm(ModelForm): request = getattr(_thread_locals, "request", None) employee = request.user.employee_get if not self.instance.pk: - if request.user.is_superuser: + if request.user.is_superuser or request.user.has_perm("project.add_task"): projects = Project.objects.all() elif Project.objects.filter(managers=employee).exists(): projects = Project.objects.filter(managers=employee) + else: + projects = Project.objects.none() self.fields["project"].queryset = projects else: diff --git a/project/models.py b/project/models.py index cba958850..12ca044a0 100644 --- a/project/models.py +++ b/project/models.py @@ -17,7 +17,10 @@ from django.utils import timezone from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ +from base.horilla_company_manager import HorillaCompanyManager +from base.models import Company from employee.models import Employee +from horilla import horilla_middlewares from horilla.horilla_middlewares import _thread_locals from horilla.models import HorillaModel from horilla_views.cbv_methods import render_template @@ -75,6 +78,10 @@ class Project(HorillaModel): upload_to="project/files", blank=True, null=True, verbose_name=_("Project File") ) description = models.TextField(verbose_name=_("Description")) + company_id = models.ForeignKey( + Company, null=True, editable=False, on_delete=models.PROTECT + ) + objects = HorillaCompanyManager("company_id") def get_description(self, length=50): """ @@ -222,15 +229,15 @@ class Project(HorillaModel): self.status = "expired" def save(self, *args, **kwargs): - is_new = self.pk is None + is_new, request = self.pk is None, getattr( + horilla_middlewares._thread_locals, "request", None + ) + if is_new and (cid := request.session.get("selected_company")) and cid != "all": + self.company_id = Company.find(cid) super().save(*args, **kwargs) - if is_new: ProjectStage.objects.create( - title="Todo", - project=self, - sequence=1, - is_end_stage=False, + title="Todo", project=self, sequence=1, is_end_stage=False ) def __str__(self): @@ -261,6 +268,7 @@ class ProjectStage(HorillaModel): ) sequence = models.IntegerField(null=True, blank=True, editable=False) is_end_stage = models.BooleanField(default=False, verbose_name=_("Is end stage")) + objects = HorillaCompanyManager("project__company_id") def __str__(self) -> str: return f"{self.title}" @@ -351,6 +359,7 @@ class Task(HorillaModel): ) description = models.TextField(verbose_name=_("Description")) sequence = models.IntegerField(default=0) + objects = HorillaCompanyManager("project__company_id") def clean(self) -> None: if self.end_date is not None and self.project.end_date is not None: @@ -552,6 +561,7 @@ class TimeSheet(HorillaModel): verbose_name=_("Status"), ) description = models.TextField(blank=True, null=True, verbose_name=_("Description")) + objects = HorillaCompanyManager("project_id__company_id") class Meta: ordering = ("-id",) diff --git a/project/templates/task/new/task_kanban_view.html b/project/templates/task/new/task_kanban_view.html index 64fad9a94..9f1d17227 100644 --- a/project/templates/task/new/task_kanban_view.html +++ b/project/templates/task/new/task_kanban_view.html @@ -28,7 +28,7 @@ - {% if request.user|is_project_manager:stage.project or request.user.is_superuser %} + {% if request.user|is_project_manager:stage.project %}
- {% if request.user|is_project_manager:stage.project or request.user.is_superuser or request.user|is_task_manager:task %} + {% if request.user|is_project_manager:stage.project or request.user|is_task_manager:task %}
{% endfor %} - {% if request.user|is_project_manager:stages.first.project or request.user.is_superuser %} + {% if request.user|is_project_manager:stages.first.project %}
{{task.description}}
- {% if request.user|is_project_manager:stage.project or request.user.is_superuser %} + {% if request.user|is_project_manager:stage.project %}
- {% if request.user|is_project_manager:project or request.user.is_superuser %} + {% if perms.project.add_task or request.user|is_project_manager:project %}
diff --git a/project/templatetags/taskfilters.py b/project/templatetags/taskfilters.py index 8850ecea5..0029b3182 100644 --- a/project/templatetags/taskfilters.py +++ b/project/templatetags/taskfilters.py @@ -57,6 +57,8 @@ def is_project_manager(user, project): """ This method will return true, if the user is manager of the project """ + if user.is_superuser: + return True employee = user.employee_get return Project.objects.filter(id=project.id, managers=employee).exists() diff --git a/project/views.py b/project/views.py index 4924169c2..801b5ecdb 100644 --- a/project/views.py +++ b/project/views.py @@ -1141,11 +1141,14 @@ def task_all_create(request): @login_required def update_project_task_status(request, task_id): status = request.GET.get("status") - task = get_object_or_404(Task, id=task_id) + + if task.end_date and task.end_date < date.today(): + messages.warning(request, _("Cannot update status. Task has already expired.")) + return HttpResponse("") + task.status = status task.save() - messages.success(request, _("Task status has been updated successfully")) return HttpResponse("")