Skip to content

Commit 60a0f8a

Browse files
committed
Merge branch 'master' into backend/notifications/44797__email_notifications_not_sent_group_user
2 parents 178038e + 544d84c commit 60a0f8a

29 files changed

Lines changed: 692 additions & 48 deletions

File tree

backend/src/processes/enums.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,3 +677,15 @@ class SearchContentType:
677677
(EVENT, EVENT),
678678
(TASK_TEMPLATE, TASK_TEMPLATE),
679679
)
680+
681+
682+
class SystemVariable:
683+
684+
DATE = 'date'
685+
TEMPLATE_NAME = 'template-name'
686+
WORKFLOW_ID = 'workflow-id'
687+
WORKFLOW_STARTER = 'workflow-starter'
688+
689+
WORKFLOW_NAME_VARS = {DATE, TEMPLATE_NAME, WORKFLOW_ID, WORKFLOW_STARTER}
690+
691+
TASK_VARS = {WORKFLOW_STARTER}

backend/src/processes/locale/de/LC_MESSAGES/django.po

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,10 @@ msgstr "Sie können keinen Kommentar zu einer inaktiven Aufgabe schreiben."
618618
msgid "The user or group specified for a \"User\" field does not exist."
619619
msgstr "Der Benutzer oder die Gruppe, die für ein Feld des Typs \"Benutzer\" angegeben wurde, existiert nicht."
620620

621+
#: src/processes/messages/workflow.py:182
622+
msgid "Guest"
623+
msgstr "Gast"
624+
621625
#: src/processes/messages/template.py:281
622626
msgid "Permission denied. You do not have access to this template."
623627
msgstr "Zugriff verweigert. Sie haben keinen Zugriff auf diese Vorlage."

backend/src/processes/locale/es/LC_MESSAGES/django.po

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,10 @@ msgstr "No puedes escribir un comentario en una tarea inactiva."
618618
msgid "The user or group specified for a \"User\" field does not exist."
619619
msgstr "El usuario o grupo especificado para un campo de tipo \"Usuario\" no existe."
620620

621+
#: src/processes/messages/workflow.py:182
622+
msgid "Guest"
623+
msgstr "Invitado"
624+
621625
#: src/processes/messages/template.py:281
622626
msgid "Permission denied. You do not have access to this template."
623627
msgstr "Permiso denegado. No tienes acceso a esta plantilla."

backend/src/processes/locale/fr/LC_MESSAGES/django.po

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,10 @@ msgstr "Vous ne pouvez pas écrire un commentaire sur une tâche inactive."
617617
msgid "The user or group specified for a \"User\" field does not exist."
618618
msgstr "L'utilisateur ou le groupe spécifié pour un champ de type \"Utilisateur\" n'existe pas."
619619

620+
#: src/processes/messages/workflow.py:182
621+
msgid "Guest"
622+
msgstr "Invité"
623+
620624
#: src/processes/messages/template.py:281
621625
msgid "Permission denied. You do not have access to this template."
622626
msgstr "Accès refusé. Vous n’avez pas accès à ce modèle."

backend/src/processes/locale/ru/LC_MESSAGES/django.po

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,10 @@ msgstr "Нельзя написать комментарий к неактивн
620620
msgid "The user or group specified for a \"User\" field does not exist."
621621
msgstr "Указанный пользователь или группа для поля типа \"Пользователь\" не существует."
622622

623+
#: src/processes/messages/workflow.py:182
624+
msgid "Guest"
625+
msgstr "Гость"
626+
623627
#: src/processes/messages/template.py:281
624628
msgid "Permission denied. You do not have access to this template."
625629
msgstr "Доступ запрещён. У вас нет доступа к этому шаблону."

backend/src/processes/messages/workflow.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,4 @@
179179
MSG_PW_0090 = _(
180180
'The user or group specified for a "User" field does not exist.',
181181
)
182+
MSG_PW_0091 = _('Guest')

backend/src/processes/serializers/templates/task.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from src.processes.enums import (
2020
PerformerType,
2121
PredicateType,
22+
SystemVariable,
2223
)
2324
from src.processes.messages import template as messages
2425
from src.processes.models.templates.fields import FieldTemplate
@@ -160,11 +161,14 @@ def additional_validate_name(
160161
**kwargs,
161162
):
162163

163-
""" Checks three cases:
164-
1. If api-name is in task name, this field is available
165-
(created in previous steps).
166-
2. If only api-names is in task name, at least one field
167-
must be required. """
164+
""" Validates variables {{ ... }} in task name.
165+
1. Each variable must reference an existing field
166+
from previous steps, OR be a known system variable.
167+
2. If the name consists ONLY of variables,
168+
at least one field must be required
169+
(so the name won't be empty at runtime).
170+
System variables always have a value,
171+
so this check is skipped when they're present. """
168172

169173
api_names_in_name = {
170174
api_name.strip()
@@ -173,6 +177,9 @@ def additional_validate_name(
173177
if not api_names_in_name:
174178
return
175179

180+
sys_vars_is_used = bool(api_names_in_name & SystemVariable.TASK_VARS)
181+
api_names_in_name -= SystemVariable.TASK_VARS
182+
176183
available_fields = self._get_task_available_fields()
177184
available_api_names = {field.api_name for field in available_fields}
178185
failed_api_names = api_names_in_name - available_api_names
@@ -183,7 +190,7 @@ def additional_validate_name(
183190
)
184191

185192
contains_only_api_names = VAR_PATTERN.sub('', value).strip() == ''
186-
if contains_only_api_names:
193+
if contains_only_api_names and not sys_vars_is_used:
187194
not_required_fields = True
188195
for field in available_fields:
189196
if field.api_name in api_names_in_name and field.is_required:
@@ -201,8 +208,9 @@ def additional_validate_description(
201208
data: Dict[str, Any],
202209
):
203210

204-
""" Checks that api-name in text should be available
205-
(created in previous steps) """
211+
""" Validates variables {{ ... }} in task description.
212+
Each variable must reference an existing field
213+
from previous steps, OR be a known system variable. """
206214

207215
if not value:
208216
return None
@@ -214,6 +222,8 @@ def additional_validate_description(
214222
if not api_names_in_description:
215223
return True
216224

225+
api_names_in_description -= SystemVariable.TASK_VARS
226+
217227
available_api_names_for_description = {
218228
field.api_name for field in self._get_task_available_fields()
219229
}

backend/src/processes/serializers/templates/template.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
OwnerRole,
3535
OwnerType,
3636
PerformerType,
37+
SystemVariable,
3738
TemplateOrdering,
3839
TemplateType,
3940
WorkflowApiStatus, TaskStatus,
@@ -302,7 +303,7 @@ def additional_validate_wf_name_template(self, value: str, data: dict):
302303
if not api_names_in_name:
303304
return
304305

305-
sys_vars = {'template-name', 'date', 'workflow-id'}
306+
sys_vars = SystemVariable.WORKFLOW_NAME_VARS
306307
sys_vars_is_used = bool(api_names_in_name & sys_vars)
307308
api_names_in_name -= sys_vars
308309
available_fields = self._get_raw_fields_from_kickoff(data)

backend/src/processes/services/workflow_action.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from django.db.models import Q
88
from django.utils import timezone
99

10+
from src.processes.utils.common import get_workflow_starter_name
1011
from src.analysis.services import AnalyticService
1112
from src.authentication.enums import AuthTokenType
1213
from src.authentication.services.guest_auth import GuestJWTAuthService
@@ -322,6 +323,11 @@ def skip_task(
322323
TaskStatus.COMPLETED, TaskStatus.SKIPPED,
323324
)},
324325
)
326+
327+
fields_values['workflow-starter'] = get_workflow_starter_name(
328+
self.workflow.workflow_starter,
329+
)
330+
325331
task_service.insert_fields_values(fields_values=fields_values)
326332

327333
WorkflowEventService.task_skip_event(task)
@@ -403,6 +409,10 @@ def start_workflow(self):
403409
for task in tasks:
404410
task_service = TaskService(instance=task, user=self.user)
405411
fields_values = self.workflow.get_kickoff_fields_markdown_values()
412+
fields_values['workflow-starter'] = get_workflow_starter_name(
413+
self.workflow.workflow_starter,
414+
)
415+
406416
task_service.insert_fields_values(fields_values=fields_values)
407417

408418
WorkflowEventService.workflow_run_event(
@@ -634,6 +644,11 @@ def start_task(
634644
TaskStatus.COMPLETED, TaskStatus.SKIPPED,
635645
)},
636646
)
647+
648+
fields_values['workflow-starter'] = get_workflow_starter_name(
649+
self.workflow.workflow_starter,
650+
)
651+
637652
task_service.insert_fields_values(fields_values=fields_values)
638653
task.update_performers(restore_performers=True)
639654
task_performers_exists = (

backend/src/processes/services/workflows/workflow.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from src.analysis.services import AnalyticService
1111
from src.authentication.enums import AuthTokenType
1212
from src.processes.consts import WORKFLOW_NAME_LENGTH
13+
from src.processes.utils.common import get_workflow_starter_name
1314
from src.processes.models.templates.template import Template
1415
from src.processes.models.workflows.workflow import Workflow
1516
from src.processes.serializers.workflows.kickoff_value import (
@@ -70,6 +71,10 @@ def _create_workflow_name(
7071
if workflow_starter:
7172
values.update(workflow_starter.get_dynamic_mapping())
7273

74+
values['workflow-starter'] = get_workflow_starter_name(
75+
workflow_starter,
76+
)
77+
7378
if user_provided_name:
7479
result = insert_fields_values_to_text(
7580
text=user_provided_name,

0 commit comments

Comments
 (0)