Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 1 addition & 34 deletions backend/src/processes/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@
OrderingFilter,
)
from django_filters.constants import EMPTY_VALUES
from django_filters.rest_framework import (
FilterSet,
IsoDateTimeFilter,
)
from django_filters.rest_framework import FilterSet

from src.generics.filters import (
DefaultOrderingFilter,
Expand All @@ -28,36 +25,6 @@ def filter(self, qs, value):
return super().filter(qs, ordering)


class WorkflowDurationFilter(FilterSet):
date_from = IsoDateTimeFilter(method='filter_date_from')
date_to = IsoDateTimeFilter(method='filter_date_to')

def filter_date_from(self, queryset, name, value):
if value:
return queryset.workflows_updated_from(value, as_combine=True)
return queryset

def filter_date_to(self, queryset, name, value):
if value:
return queryset.workflows_updated_to(value, as_combine=True)
return queryset


class WorkflowSuccessRateFilter(FilterSet):
date_from = IsoDateTimeFilter(method='filter_date_from')
date_to = IsoDateTimeFilter(method='filter_date_to')

def filter_date_from(self, queryset, name, value):
if value:
return queryset.workflows_updated_from(value, as_combine=True)
return queryset

def filter_date_to(self, queryset, name, value):
if value:
return queryset.workflows_updated_to(value, as_combine=True)
return queryset


class WorkflowWebhookFilterSet(FilterSet):

status = ChoiceFilter(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 2.2.28 on 2026-08-20 11:09

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('processes', '0259_populate_fieldset_title_from_name'),
]

operations = [
migrations.RemoveField(
model_name='workflow',
name='status_updated',
),
]
8 changes: 0 additions & 8 deletions backend/src/processes/models/workflows/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from django.contrib.auth import get_user_model
from django.db import models
from django.db.models import Q
from django.utils import timezone

from src.accounts.models import AccountBaseMixin
from src.generics.managers import BaseSoftDeleteManager
Expand Down Expand Up @@ -43,7 +42,6 @@ class Meta:
choices=WorkflowStatus.CHOICES,
default=WorkflowStatus.RUNNING,
)
status_updated = models.DateTimeField(db_index=True)
is_external = models.BooleanField(default=False)
is_urgent = models.BooleanField(default=False)
is_legacy_template = models.BooleanField(
Expand Down Expand Up @@ -82,12 +80,6 @@ def __str__(self):
def is_version_lower(self, version):
return version > self.version

def save(self, update_fields=None, **kwargs):
if update_fields is not None and 'status' in update_fields:
self.status_updated = timezone.now()
update_fields.append('status_updated')
super().save(update_fields=update_fields, **kwargs)

def _get_kickoff(self):
kickoff = self.kickoff.prefetch_related('output__selections').first()
if not kickoff:
Expand Down
17 changes: 0 additions & 17 deletions backend/src/processes/querysets.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@
from django.contrib.auth import get_user_model
from django.db import transaction
from django.db.models import (
Avg,
Count,
Exists,
F,
Max,
OuterRef,
Prefetch,
Expand Down Expand Up @@ -209,21 +207,6 @@ def by_events_datetime(
**filter_,
).distinct()

def workflows_updated_from(self, value, as_combine=False):
filter_ = Q(workflows__status_updated__gte=value)
return self._add_filter(filter_, as_combine, '_workflows_filters')

def workflows_updated_to(self, value, as_combine=False):
filter_ = Q(workflows__status_updated__lt=value)
return self._add_filter(filter_, as_combine, '_workflows_filters')

def avg_workflow_duration(self):
duration = (
F('workflow__status_updated') -
F('workflow__date_created')
)
return self.annotate(avg_workflow_duration=Avg(duration))

def onboarding_owner(self):
return self.filter(type=TemplateType.ONBOARDING_ACCOUNT_OWNER)

Expand Down
6 changes: 3 additions & 3 deletions backend/src/processes/serializers/workflows/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ class Meta:
'date_started_tsp',
'date_completed_tsp',
'due_date_tsp',
'is_completed', # TODO deprecated
'is_completed',
'performers',
'is_urgent',
'checklists_marked',
Expand All @@ -130,7 +130,6 @@ class Meta:
workflow = serializers.SerializerMethodField()
output = TaskFieldSerializer(many=True)
delay = serializers.SerializerMethodField(required=False, allow_null=True)
# TODO Remove in 41258
is_completed = serializers.SerializerMethodField(read_only=True)
Comment thread
cursor[bot] marked this conversation as resolved.
is_urgent = serializers.BooleanField(read_only=True)
checklists_marked = serializers.IntegerField(read_only=True)
Expand All @@ -146,7 +145,8 @@ def get_performers(self, instance) -> List[Dict[str, Any]]:
return get_performers_for_task(instance)

def get_is_completed(self, instance):
# TODO Remove in 41258
# Cannot be derived from `performers`: a group member completion is
# stored in a hidden GROUP_USER row, which is not serialized there.
if instance.is_completed:
return True
if self.context.get('user'):
Expand Down
2 changes: 1 addition & 1 deletion backend/src/processes/serializers/workflows/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class Meta:
'owners',
'tasks',
'fields',
'due_date_tsp', # TODO Remove in 41258
Comment thread
cursor[bot] marked this conversation as resolved.
'due_date_tsp',
)

template = WorkflowTemplateSerializer()
Expand Down
1 change: 0 additions & 1 deletion backend/src/processes/services/workflows/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ def _create_instance(
description=instance_template.description,
account_id=instance_template.account_id,
finalizable=instance_template.finalizable,
status_updated=timezone.now(),
version=instance_template.version,
reminder_notification=instance_template.reminder_notification,
completion_notification=instance_template.completion_notification,
Expand Down
1 change: 0 additions & 1 deletion backend/src/processes/tests/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,6 @@ def create_test_workflow(
account=template.account,
template=template,
status=status,
status_updated=timezone.now(),
date_completed=date_completed,
workflow_starter=workflow_starter,
is_external=is_external,
Expand Down
3 changes: 0 additions & 3 deletions backend/src/processes/tests/test_models/test_template.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import pytest
from django.contrib.auth import get_user_model
from django.utils import timezone

from src.processes.enums import (
FieldType,
Expand Down Expand Up @@ -177,7 +176,6 @@ def test_delete__workflow_template_set_null(
description=template.description,
account_id=template.account_id,
template=template,
status_updated=timezone.now(),
)
template_id = template.id

Expand Down Expand Up @@ -208,7 +206,6 @@ def test_queryset_delete__with_workflow__set_legacy_template(
description=template.description,
account_id=template.account_id,
template=template,
status_updated=timezone.now(),
)
template_id = template.id

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ def test_create_instance__only_required_fields__ok(mocker):
assert workflow.description == template.description
assert workflow.account == account
assert workflow.finalizable is True
assert workflow.status_updated
assert workflow.version == template.version
assert workflow.workflow_starter == owner
assert workflow.workflow_starter == owner
Expand Down Expand Up @@ -147,7 +146,6 @@ def test_create_instance__all_fields__ok(mocker):
assert workflow.description == template.description
assert workflow.account == account
assert workflow.finalizable is True
assert workflow.status_updated
assert workflow.version == template.version
assert workflow.workflow_starter == owner
assert workflow.is_external == is_external
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1406,7 +1406,6 @@ def test_retrieve__sub_workflows__ok(api_client, mocker):
assert data['status'] == sub_wf.status
assert data['description'] == sub_wf.description
assert data['date_created_tsp'] == sub_wf.date_created.timestamp()
assert data['due_date_tsp'] == sub_wf.due_date.timestamp()
assert data['is_external'] is False
assert data['is_urgent'] is True
assert data['finalizable'] == sub_wf.finalizable
Expand Down
2 changes: 0 additions & 2 deletions backend/src/reports/tests/test_tasks/test_tasks_digest.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ def test_send(self, mocker, api_client):
date_created=date_from + timedelta(days=2),
)
second_workflow.refresh_from_db()
second_workflow.status_updated = date_from + timedelta(days=2)
second_workflow.date_completed = date_to - timedelta(days=1)
second_workflow.save()
email_service_tasks_digest = mocker.patch(
Expand Down Expand Up @@ -553,7 +552,6 @@ def test_send__specified_user__send_only_for(
date_created=date_from + timedelta(days=2),
)
second_workflow.refresh_from_db()
second_workflow.status_updated = date_from + timedelta(days=2)
second_workflow.date_completed = date_to - timedelta(days=1)
second_workflow.save()
email_service_tasks_digest = mocker.patch(
Expand Down
2 changes: 0 additions & 2 deletions backend/src/reports/tests/test_tasks/test_workflows_digest.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ def test_send(self, mocker, api_client):
date_created=date_from + timedelta(days=2),
)
second_workflow.refresh_from_db()
second_workflow.status_updated = date_from + timedelta(days=2)
second_workflow.date_completed = date_to - timedelta(days=1)
second_workflow.save()
email_service_digest = mocker.patch(
Expand Down Expand Up @@ -411,7 +410,6 @@ def test_send__specified_user__send_only_for(
date_created=date_from + timedelta(days=2),
)
second_workflow.refresh_from_db()
second_workflow.status_updated = date_from + timedelta(days=2)
second_workflow.date_completed = date_to - timedelta(days=1)
second_workflow.save()
email_service_digest = mocker.patch(
Expand Down