瀏覽代碼

修复 bug:#824。超级管理员给某个空间赋值给某个用户后,members 表中的数据没有及时更新导致此用户仍然不属于此空间。

flying1020 6 年之前
父節點
當前提交
0a33317f4a
共有 2 個文件被更改,包括 35 次插入6 次删除
  1. 12 6
      walle/api/space.py
  2. 23 0
      walle/model/member.py

+ 12 - 6
walle/api/space.py

@@ -125,16 +125,22 @@ class SpaceAPI(SecurityResource):
             space = SpaceModel().get_by_id(space_id)
             data = form.form2dict()
             current_app.logger.info(data)
-
+            member_model = MemberModel(group_id=space_id)
+            old_owner = space.user_id
+            new_owner = data['user_id']
             # a new type to update a model
-            ret = space.update(data)
+            space.update(data)
+
+            if str(old_owner) != str(new_owner):
+                # owner has changed
+                member_model.change_owner(old_owner, new_owner)
+
             # create group
-            member = {"user_id": data['user_id'], "role": OWNER}
-            members = []
+            current_owner = {"user_id": new_owner, "role": OWNER}
             if 'members' in request.form:
                 members = json.loads(request.form['members'])
-                members.append(member)
-                MemberModel(group_id=space_id).update_group(members=members)
+                members.append(current_owner)
+                member_model.update_group(members=members)
             return self.render_json(data=space.item())
         else:
             return self.render_error(code=Code.form_error, message=form.errors)

+ 23 - 0
walle/model/member.py

@@ -141,6 +141,29 @@ class MemberModel(SurrogatePK, Model):
 
         return ret
 
+    def change_owner(self, old_owner_id, new_owner_id):
+        # change owner for space
+        if not new_owner_id or str(new_owner_id) == str(old_owner_id):
+            return
+
+        filters = {
+            MemberModel.source_id == self.group_id,
+            MemberModel.source_type == self.source_type_group,
+            MemberModel.user_id.in_([old_owner_id, new_owner_id])
+        }
+        MemberModel.query.filter(*filters).delete(synchronize_session=False)
+
+        update = {
+            'user_id': new_owner_id,
+            'source_id': self.group_id,
+            'source_type': self.source_type_group,
+            'access_level': OWNER,
+            'status': self.status_available,
+        }
+        m = MemberModel(**update)
+        db.session.add(m)
+        db.session.commit()
+
     def update_project(self, project_id, members, group_name=None):
         space_info = model.project.ProjectModel.query.filter_by(id=project_id).first().to_json()
         space_members, count, user_ids = self.members(group_id=space_info['space_id'], size=-1)