Skip to content

Commit 63016f4

Browse files
Merge pull request #21 from seatable/department_v2_groups-share
Department v2 groups share
2 parents 167fd92 + 3497459 commit 63016f4

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

seatable_thumbnail/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class DepartmentsV2(Base):
121121
parent_id = Column(Integer, index=True)
122122
org_id = Column(Integer)
123123
id_in_org = Column(Integer)
124+
path = Column(String(1024), index=True)
124125

125126

126127
class DepartmentMembersV2(Base):

seatable_thumbnail/permissions.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from seaserv import ccnet_api
22
from seatable_thumbnail.models import DTables, DTableShare, \
33
DTableGroupShare, DTableViewUserShare, DTableViewGroupShare, \
4-
DTableExternalLinks, DTableCollectionTables, DepartmentMembersV2, DepartmentV2Groups
4+
DTableExternalLinks, DTableCollectionTables, DepartmentMembersV2, \
5+
DepartmentsV2, DepartmentV2Groups
56
from seatable_thumbnail.constants import PERMISSION_READ, PERMISSION_READ_WRITE
67
from seatable_thumbnail import redis_client
78

@@ -123,6 +124,33 @@ def is_group_member(self, group_id, email, in_structure=None):
123124
else:
124125
return ccnet_api.is_group_user(group_id, email)
125126

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+
126154
def check_dtable_permission(self):
127155
"""Check workspace/dtable access permission of a user.
128156
"""
@@ -156,6 +184,11 @@ def check_dtable_permission(self):
156184
else:
157185
groups = ccnet_api.get_groups(username, return_ancestors=True)
158186
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+
159192
group_permissions = self.db_session.query(
160193
DTableGroupShare.permission).filter(DTableGroupShare.dtable_id == dtable.id, DTableGroupShare.group_id.in_(group_ids)).all()
161194

@@ -165,6 +198,14 @@ def check_dtable_permission(self):
165198
return group_permission[0]
166199
return permission
167200

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+
168209
return ''
169210

170211
def get_view_share_permission(self):

0 commit comments

Comments
 (0)