1
1
from seaserv import ccnet_api
2
2
from seatable_thumbnail .models import DTables , DTableShare , \
3
3
DTableGroupShare , DTableViewUserShare , DTableViewGroupShare , \
4
- DTableExternalLinks , DTableCollectionTables , DepartmentMembersV2 , DepartmentV2Groups
4
+ DTableExternalLinks , DTableCollectionTables , DepartmentMembersV2 , \
5
+ DepartmentsV2 , DepartmentV2Groups
5
6
from seatable_thumbnail .constants import PERMISSION_READ , PERMISSION_READ_WRITE
6
7
from seatable_thumbnail import redis_client
7
8
@@ -123,6 +124,33 @@ def is_group_member(self, group_id, email, in_structure=None):
123
124
else :
124
125
return ccnet_api .is_group_user (group_id , email )
125
126
127
+ def get_ancestor_department_v2_ids (self , department , include_self = True ):
128
+ dep_ids = []
129
+ for dep_id in department .path .strip ('/' ).split ('/' ):
130
+ if not include_self and dep_id == department .id :
131
+ continue
132
+ try :
133
+ dep_ids .append (int (dep_id ))
134
+ except :
135
+ pass
136
+ return dep_ids
137
+
138
+ def get_departments_v2_by_user (self , username ):
139
+ department_member_query = self .db_session .query (
140
+ DepartmentMembersV2 ).filter_by (username = username )
141
+ department_query = self .db_session .query (
142
+ DepartmentsV2 ).filter (DepartmentsV2 .id .in_ ([item .department_id for item in department_member_query ]))
143
+ return department_query
144
+
145
+ def get_department_v2_groups_by_user (self , username ):
146
+ departments = self .get_departments_v2_by_user (username )
147
+ departments_ids_set = set ()
148
+ for department in departments :
149
+ for department_id in self .get_ancestor_department_v2_ids (department ):
150
+ departments_ids_set .add (department_id )
151
+ return self .db_session .query (
152
+ DepartmentV2Groups ).filter (DepartmentV2Groups .department_id .in_ (list (departments_ids_set )))
153
+
126
154
def check_dtable_permission (self ):
127
155
"""Check workspace/dtable access permission of a user.
128
156
"""
@@ -156,6 +184,11 @@ def check_dtable_permission(self):
156
184
else :
157
185
groups = ccnet_api .get_groups (username , return_ancestors = True )
158
186
group_ids = [group .id for group in groups ]
187
+
188
+ groups_v2 = self .get_department_v2_groups_by_user (username )
189
+ groups_v2_ids = [group .group_id for group in groups_v2 ]
190
+ group_ids .extend (groups_v2_ids )
191
+
159
192
group_permissions = self .db_session .query (
160
193
DTableGroupShare .permission ).filter (DTableGroupShare .dtable_id == dtable .id , DTableGroupShare .group_id .in_ (group_ids )).all ()
161
194
@@ -165,6 +198,14 @@ def check_dtable_permission(self):
165
198
return group_permission [0 ]
166
199
return permission
167
200
201
+ if '@seafile_group' not in owner :
202
+ departments = self .get_departments_v2_by_user (owner )
203
+ for department in departments :
204
+ department_ids = self .get_ancestor_department_v2_ids (department )
205
+ if self .db_session .query (
206
+ DepartmentMembersV2 ).filter (DepartmentMembersV2 .department_id .in_ (department_ids ), DepartmentMembersV2 .username == username ).first ():
207
+ return PERMISSION_READ_WRITE
208
+
168
209
return ''
169
210
170
211
def get_view_share_permission (self ):
0 commit comments