@@ -111,8 +111,9 @@ def get(self, request, uid=None):
111
111
app = get_object_or_404 (
112
112
App ,
113
113
Q (uuid = uuid .UUID (uid ), owner = request .user ) |
114
- Q (uuid = uuid .UUID (uid ), accessible_by__contains = [
115
- request .user .email ], visibility = AppVisibility .PRIVATE , is_published = True ),
114
+ Q (uuid = uuid .UUID (uid ), read_accessible_by__contains = [
115
+ request .user .email ], is_published = True ) | Q (uuid = uuid .UUID (uid ), write_accessible_by__contains = [
116
+ request .user .email ], is_published = True ),
116
117
)
117
118
serializer = AppSerializer (
118
119
instance = app , fields = fields , request_user = request .user ,
@@ -131,9 +132,8 @@ def getShared(self, request):
131
132
fields = fields .split (',' )
132
133
133
134
queryset = App .objects .all ().filter (
134
- accessible_by__contains = [
135
- request .user .email ,
136
- ], visibility = AppVisibility .PRIVATE , is_published = True ,
135
+ Q (read_accessible_by__contains = [request .user .email ,]) |
136
+ Q (write_accessible_by__contains = [request .user .email ,]), is_published = True ,
137
137
).order_by ('-last_updated_at' )
138
138
serializer = AppSerializer (
139
139
queryset , many = True , fields = fields , request_user = request .user ,
@@ -149,8 +149,8 @@ def versions(self, request, uid=None, version=None):
149
149
app = get_object_or_404 (
150
150
App ,
151
151
Q (uuid = uuid .UUID (uid ), owner = request .user ) |
152
- Q (uuid = uuid .UUID (uid ), accessible_by__contains = [
153
- request .user .email ], visibility = AppVisibility . PRIVATE , is_published = True ),
152
+ Q (uuid = uuid .UUID (uid ), write_accessible_by__contains = [
153
+ request .user .email ], is_published = True ),
154
154
)
155
155
156
156
if version :
@@ -182,8 +182,8 @@ def getByPublishedUUID(self, request, published_uuid):
182
182
(app .visibility == AppVisibility .PUBLIC or app .visibility == AppVisibility .UNLISTED ) or \
183
183
(
184
184
request .user .is_authenticated and ((app .visibility == AppVisibility .ORGANIZATION and Profile .objects .get (user = app .owner ).organization == Profile .objects .get (user = request .user ).organization ) or
185
- (app . visibility == AppVisibility . PRIVATE and request .user .email in app .accessible_by ))
186
- ):
185
+ (request . user . email in app . read_accessible_by or request .user .email in app .write_accessible_by ))
186
+ ):
187
187
serializer = AppSerializer (
188
188
instance = app , request_user = request .user ,
189
189
)
@@ -279,40 +279,52 @@ def publish(self, request, uid):
279
279
app .visibility = AppVisibility .ORGANIZATION
280
280
elif request .data ['visibility' ] == 0 and (flag_enabled ('CAN_PUBLISH_PRIVATE_APPS' , request = request ) or app .visibility == AppVisibility .PRIVATE ):
281
281
app .visibility = AppVisibility .PRIVATE
282
- if 'accessible_by' in request .data :
283
- # Filter out invalid email addresses from accessible_by
284
- valid_emails = []
285
- for email in request .data ['accessible_by' ]:
286
- try :
287
- validate_email (email )
288
- valid_emails .append (email )
289
- except ValidationError :
290
- pass
291
-
292
- # Only allow a maximum of 20 users to be shared with. Trim the list if it is more than 20
293
- if len (valid_emails ) > 20 :
294
- valid_emails = valid_emails [:20 ]
295
-
296
- new_emails = list (
297
- set (valid_emails ) -
298
- set (app .accessible_by ),
299
- )
300
- app .accessible_by = valid_emails
301
- app .access_permission = request .data [
302
- 'access_permission'
303
- ] if 'access_permission' in request .data else AppAccessPermission .READ
304
-
305
- # Send email to new users
306
- # TODO: Use multisend to send emails in bulk
307
- for new_email in new_emails :
308
- email_template_cls = EmailTemplateFactory .get_template_by_name (
309
- 'app_shared'
310
- )
311
- share_email = email_template_cls (
312
- uuid = app .uuid , published_uuid = app .published_uuid , app_name = app .name , owner_first_name = app .owner .first_name , owner_email = app .owner .email , can_edit = app .access_permission == AppAccessPermission .WRITE , share_to = new_email
313
- )
314
- share_email_sender = EmailSender (share_email )
315
- share_email_sender .send ()
282
+
283
+ if flag_enabled ('CAN_PUBLISH_PRIVATE_APPS' , request = request ) or app .visibility == AppVisibility .PRIVATE :
284
+ new_emails = []
285
+ old_read_accessible_by = app .read_accessible_by or []
286
+ old_write_accessible_by = app .write_accessible_by or []
287
+ if 'read_accessible_by' in request .data :
288
+ # Filter out invalid email addresses from read_accessible_by
289
+ valid_emails = []
290
+ for email in request .data ['read_accessible_by' ]:
291
+ try :
292
+ validate_email (email )
293
+ valid_emails .append (email )
294
+ except ValidationError :
295
+ pass
296
+
297
+ app .read_accessible_by = valid_emails [:20 ]
298
+
299
+ if 'write_accessible_by' in request .data :
300
+ # Filter out invalid email addresses from write_accessible_by
301
+ valid_emails = []
302
+ for email in request .data ['write_accessible_by' ]:
303
+ try :
304
+ validate_email (email )
305
+ valid_emails .append (email )
306
+ except ValidationError :
307
+ pass
308
+
309
+ app .write_accessible_by = valid_emails [:20 ]
310
+
311
+ new_emails = list (
312
+ set (app .read_accessible_by ).union (set (app .write_accessible_by )) -
313
+ set (old_read_accessible_by ).union (
314
+ set (old_write_accessible_by )),
315
+ )
316
+
317
+ # Send email to new users
318
+ # TODO: Use multisend to send emails in bulk
319
+ for new_email in new_emails :
320
+ email_template_cls = EmailTemplateFactory .get_template_by_name (
321
+ 'app_shared'
322
+ )
323
+ share_email = email_template_cls (
324
+ uuid = app .uuid , published_uuid = app .published_uuid , app_name = app .name , owner_first_name = app .owner .first_name , owner_email = app .owner .email , can_edit = app .access_permission == AppAccessPermission .WRITE , share_to = new_email
325
+ )
326
+ share_email_sender = EmailSender (share_email )
327
+ share_email_sender .send ()
316
328
317
329
app_newly_published = not app .is_published
318
330
app .is_published = True
@@ -379,9 +391,8 @@ def patch(self, request, uid):
379
391
app = get_object_or_404 (App , uuid = uuid .UUID (uid ))
380
392
app_owner_profile = get_object_or_404 (Profile , user = app .owner )
381
393
if app .owner != request .user and not (
382
- app .visibility == AppVisibility .PRIVATE
383
- and app .access_permission == AppAccessPermission .WRITE
384
- and request .user .email in app .accessible_by
394
+ app .is_published == True
395
+ and request .user .email in app .write_accessible_by
385
396
):
386
397
return DRFResponse (status = 403 )
387
398
0 commit comments