@@ -111,8 +111,9 @@ def get(self, request, uid=None):
111111 app = get_object_or_404 (
112112 App ,
113113 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 ),
116117 )
117118 serializer = AppSerializer (
118119 instance = app , fields = fields , request_user = request .user ,
@@ -131,9 +132,8 @@ def getShared(self, request):
131132 fields = fields .split (',' )
132133
133134 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 ,
137137 ).order_by ('-last_updated_at' )
138138 serializer = AppSerializer (
139139 queryset , many = True , fields = fields , request_user = request .user ,
@@ -149,8 +149,8 @@ def versions(self, request, uid=None, version=None):
149149 app = get_object_or_404 (
150150 App ,
151151 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 ),
154154 )
155155
156156 if version :
@@ -182,8 +182,8 @@ def getByPublishedUUID(self, request, published_uuid):
182182 (app .visibility == AppVisibility .PUBLIC or app .visibility == AppVisibility .UNLISTED ) or \
183183 (
184184 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+ ):
187187 serializer = AppSerializer (
188188 instance = app , request_user = request .user ,
189189 )
@@ -279,40 +279,52 @@ def publish(self, request, uid):
279279 app .visibility = AppVisibility .ORGANIZATION
280280 elif request .data ['visibility' ] == 0 and (flag_enabled ('CAN_PUBLISH_PRIVATE_APPS' , request = request ) or app .visibility == AppVisibility .PRIVATE ):
281281 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 ()
316328
317329 app_newly_published = not app .is_published
318330 app .is_published = True
@@ -379,9 +391,8 @@ def patch(self, request, uid):
379391 app = get_object_or_404 (App , uuid = uuid .UUID (uid ))
380392 app_owner_profile = get_object_or_404 (Profile , user = app .owner )
381393 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
385396 ):
386397 return DRFResponse (status = 403 )
387398
0 commit comments