Skip to content

Commit 178038e

Browse files
committed
Merge branch 'master' into backend/notifications/44797__email_notifications_not_sent_group_user
2 parents 66f4d91 + 47fca0d commit 178038e

162 files changed

Lines changed: 11513 additions & 302 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

backend/src/accounts/tests/services/test_transfer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from src.authentication.enums import AuthTokenType
1515
from src.payment.stripe.service import StripeService
1616
from src.processes.enums import (
17+
OwnerRole,
1718
OwnerType,
1819
PerformerType,
1920
)
@@ -748,10 +749,12 @@ def test_accept_transfer__template_owner_in_template__ok(
748749
token['new_user_id'] = account_2_new_user.id
749750
request_template_owners = [
750751
{
752+
'role': OwnerRole.OWNER,
751753
'type': OwnerType.USER,
752754
'source_id': f'{account_2_owner.id}',
753755
},
754756
{
757+
'role': OwnerRole.OWNER,
755758
'type': OwnerType.USER,
756759
'source_id': account_2_new_user.id,
757760
},

backend/src/accounts/tests/views/test_users/test_count_workflows.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
UserInvite,
55
)
66
from src.processes.enums import (
7+
OwnerRole,
78
OwnerType,
89
PerformerType,
910
)
@@ -170,6 +171,7 @@ def test_count_templates__raw_performer__ok(api_client):
170171
api_client.token_authenticate(user)
171172
request_template_owners = [
172173
{
174+
'role': OwnerRole.OWNER,
173175
'type': OwnerType.USER,
174176
'source_id': f'{user.id}',
175177
},

backend/src/authentication/serializers.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.contrib.auth import authenticate, get_user_model
22
from django.core.validators import RegexValidator
3+
from django.db.models import Exists, Q
34
from drf_recaptcha.fields import ReCaptchaV2Field
45
from rest_framework import serializers
56
from typing import Any, Dict, Optional
@@ -15,6 +16,8 @@
1516
from src.generics.fields import DateFormatField, TimeStampField
1617
from src.generics.mixins.services import EncryptionMixin
1718
from src.generics.serializers import CustomValidationErrorMixin
19+
from src.processes.enums import OwnerRole, OwnerType
20+
from src.processes.models.templates.owner import TemplateOwner
1821

1922
UserModel = get_user_model()
2023

@@ -182,13 +185,59 @@ class Meta:
182185
'timezone',
183186
'date_fmt',
184187
'date_fdw',
188+
'has_workflow_viewer_access',
189+
'has_workflow_starter_access',
185190
)
186191

187192
account = ContextAccountSerializer()
188193
is_supermode = serializers.BooleanField(required=False)
194+
has_workflow_viewer_access = serializers.SerializerMethodField()
195+
has_workflow_starter_access = serializers.SerializerMethodField()
189196
date_joined_tsp = TimeStampField(source='date_joined', read_only=True)
190197
date_fmt = DateFormatField(read_only=True)
191198

199+
def get_has_workflow_viewer_access(self, obj) -> bool:
200+
access = self._get_template_access(obj)
201+
return access['viewer']
202+
203+
def get_has_workflow_starter_access(self, obj) -> bool:
204+
access = self._get_template_access(obj)
205+
return access['starter']
206+
207+
def _get_template_access(self, obj) -> dict:
208+
if hasattr(self, '_template_access_cache'):
209+
return self._template_access_cache
210+
211+
user_id = obj.id
212+
account_id = obj.account_id
213+
214+
base_qs = TemplateOwner.objects.filter(
215+
template__account_id=account_id,
216+
is_deleted=False,
217+
).filter(
218+
Q(type=OwnerType.USER, user_id=user_id) |
219+
Q(type=OwnerType.GROUP, group__users__id=user_id),
220+
)
221+
owner_subq = base_qs.filter(role=OwnerRole.OWNER)
222+
viewer_subq = base_qs.filter(role=OwnerRole.VIEWER)
223+
starter_subq = base_qs.filter(role=OwnerRole.STARTER)
224+
225+
result = UserModel.objects.filter(pk=user_id).annotate(
226+
has_owner=Exists(owner_subq),
227+
has_viewer=Exists(viewer_subq),
228+
has_starter=Exists(starter_subq),
229+
).values('has_owner', 'has_viewer', 'has_starter').first()
230+
231+
has_owner = result['has_owner'] if result else False
232+
has_viewer = result['has_viewer'] if result else False
233+
has_starter = result['has_starter'] if result else False
234+
235+
self._template_access_cache = {
236+
'viewer': has_owner or has_viewer,
237+
'starter': has_owner or has_viewer or has_starter,
238+
}
239+
return self._template_access_cache
240+
192241
def to_representation(self, data):
193242
data = super().to_representation(data)
194243
data['is_supermode'] = self.context.get('is_supermode', False)

0 commit comments

Comments
 (0)