|  | @@ -12,7 +12,6 @@ from sqlalchemy.orm import joinedload_all
 | 
	
		
			
			| 12 | 12 |  import sqlalchemy.orm as sqlao
 | 
	
		
			
			| 13 | 13 |  import sqlalchemy as sqla
 | 
	
		
			
			| 14 | 14 |  
 | 
	
		
			
			| 15 |  | -from pboard.model import DeclarativeBase, metadata, DBSession
 | 
	
		
			
			| 16 | 15 |  from pboard.model import data as pbmd
 | 
	
		
			
			| 17 | 16 |  from pboard.model import auth as pbma
 | 
	
		
			
			| 18 | 17 |  import pboard.model as pbm
 | 
	
	
		
			
			|  | @@ -34,16 +33,93 @@ class PODStaticController(object):
 | 
	
		
			
			| 34 | 33 |      return loUser
 | 
	
		
			
			| 35 | 34 |    
 | 
	
		
			
			| 36 | 35 |    @classmethod
 | 
	
		
			
			| 37 |  | -  def createUser(cls):
 | 
	
		
			
			|  | 36 | +  def createNewUser(cls, real_name, email_address, password, groups):
 | 
	
		
			
			| 38 | 37 |      loUser = pbma.User()
 | 
	
		
			
			| 39 |  | -    return loUser
 | 
	
		
			
			| 40 |  | -  
 | 
	
		
			
			|  | 38 | +    new_user = pbma.User()
 | 
	
		
			
			|  | 39 | +    new_user.email_address = email_address
 | 
	
		
			
			|  | 40 | +    new_user.display_name  = real_name if real_name!='' else email_address
 | 
	
		
			
			|  | 41 | +    new_user.password      = password
 | 
	
		
			
			|  | 42 | +
 | 
	
		
			
			|  | 43 | +    public_group = cls.getGroupById(pbma.Group.GROUP_ID_ALL_USERS)
 | 
	
		
			
			|  | 44 | +    public_group.users.append(new_user)
 | 
	
		
			
			|  | 45 | +
 | 
	
		
			
			|  | 46 | +    pbm.DBSession.add(new_user)
 | 
	
		
			
			|  | 47 | +    pbm.DBSession.flush()
 | 
	
		
			
			|  | 48 | +    pbm.DBSession.refresh(new_user)
 | 
	
		
			
			|  | 49 | +
 | 
	
		
			
			|  | 50 | +    user_dedicated_group = cls.createGroup()
 | 
	
		
			
			|  | 51 | +    user_dedicated_group.group_id = 0-new_user.user_id # group id of a given user is the opposite of the user id
 | 
	
		
			
			|  | 52 | +    user_dedicated_group.group_name = 'user_%d' % new_user.user_id
 | 
	
		
			
			|  | 53 | +    user_dedicated_group.personnal_group = True
 | 
	
		
			
			|  | 54 | +    user_dedicated_group.users.append(new_user)
 | 
	
		
			
			|  | 55 | +
 | 
	
		
			
			|  | 56 | +    for group_id in groups:
 | 
	
		
			
			|  | 57 | +        selected_group = cls.getGroupById(group_id)
 | 
	
		
			
			|  | 58 | +        selected_group.users.append(new_user)
 | 
	
		
			
			|  | 59 | +
 | 
	
		
			
			|  | 60 | +    pbm.DBSession.flush()
 | 
	
		
			
			|  | 61 | +
 | 
	
		
			
			|  | 62 | +    return new_user
 | 
	
		
			
			|  | 63 | +
 | 
	
		
			
			|  | 64 | +  @classmethod
 | 
	
		
			
			|  | 65 | +  def updateUser(cls, user_id, real_name, email, group_ids):
 | 
	
		
			
			|  | 66 | +
 | 
	
		
			
			|  | 67 | +      group_ids = list(map(int, group_ids))
 | 
	
		
			
			|  | 68 | +      group_ids.append(pbma.Group.GROUP_ID_ALL_USERS)
 | 
	
		
			
			|  | 69 | +      print('new group ids:', group_ids)
 | 
	
		
			
			|  | 70 | +      user_to_update = pbm.DBSession.query(pbma.User).filter(pbma.User.user_id==user_id).one()
 | 
	
		
			
			|  | 71 | +      user_to_update.display_name = real_name
 | 
	
		
			
			|  | 72 | +      user_to_update.email_address = email
 | 
	
		
			
			|  | 73 | +
 | 
	
		
			
			|  | 74 | +      merged_new_groups = []
 | 
	
		
			
			|  | 75 | +
 | 
	
		
			
			|  | 76 | +      for group in user_to_update.groups:
 | 
	
		
			
			|  | 77 | +          if group.group_id==pbma.Group.GROUP_ID_MANAGERS:
 | 
	
		
			
			|  | 78 | +              print('adding group (3)', group.group_id)
 | 
	
		
			
			|  | 79 | +              merged_new_groups.append(group)
 | 
	
		
			
			|  | 80 | +
 | 
	
		
			
			|  | 81 | +          elif group.group_id==pbma.Group.GROUP_ID_ALL_USERS:
 | 
	
		
			
			|  | 82 | +              print('adding group (2)', group.group_id)
 | 
	
		
			
			|  | 83 | +              merged_new_groups.append(group)
 | 
	
		
			
			|  | 84 | +
 | 
	
		
			
			|  | 85 | +          elif group.group_id in group_ids:
 | 
	
		
			
			|  | 86 | +              print('adding group', group.group_id)
 | 
	
		
			
			|  | 87 | +              merged_new_groups.append(group)
 | 
	
		
			
			|  | 88 | +
 | 
	
		
			
			|  | 89 | +          else:
 | 
	
		
			
			|  | 90 | +              print('remove group', group.group_id)
 | 
	
		
			
			|  | 91 | +              user_to_update.groups.remove(group)
 | 
	
		
			
			|  | 92 | +
 | 
	
		
			
			|  | 93 | +      for group_id in group_ids:
 | 
	
		
			
			|  | 94 | +          group = cls.getGroupById(group_id)
 | 
	
		
			
			|  | 95 | +
 | 
	
		
			
			|  | 96 | +          if group not in merged_new_groups:
 | 
	
		
			
			|  | 97 | +              merged_new_groups.append(group)
 | 
	
		
			
			|  | 98 | +
 | 
	
		
			
			|  | 99 | +      user_to_update.groups = merged_new_groups
 | 
	
		
			
			|  | 100 | +
 | 
	
		
			
			|  | 101 | +      for group in merged_new_groups:
 | 
	
		
			
			|  | 102 | +          print("group => ", group.group_id)
 | 
	
		
			
			|  | 103 | +      pbm.DBSession.flush()
 | 
	
		
			
			|  | 104 | +
 | 
	
		
			
			|  | 105 | +  @classmethod
 | 
	
		
			
			|  | 106 | +  def deleteUser(cls, user_id):
 | 
	
		
			
			|  | 107 | +      user_to_delete = pbm.DBSession.query(pbma.User).filter(pbma.User.user_id==user_id).one()
 | 
	
		
			
			|  | 108 | +      user_dedicated_group = pbm.DBSession.query(pbma.Group).filter(pbma.Group.group_id==-user_id).one()
 | 
	
		
			
			|  | 109 | +      pbm.DBSession.delete(user_to_delete)
 | 
	
		
			
			|  | 110 | +      pbm.DBSession.delete(user_dedicated_group)
 | 
	
		
			
			|  | 111 | +      pbm.DBSession.flush()
 | 
	
		
			
			|  | 112 | +
 | 
	
		
			
			| 41 | 113 |    @classmethod
 | 
	
		
			
			| 42 | 114 |    def getGroup(cls, psGroupName):
 | 
	
		
			
			| 43 | 115 |      loGroup = pbma.Group.by_group_name(psGroupName)
 | 
	
		
			
			| 44 | 116 |      return loGroup
 | 
	
		
			
			| 45 | 117 |  
 | 
	
		
			
			| 46 | 118 |    @classmethod
 | 
	
		
			
			|  | 119 | +  def getGroupById(cls, group_id):
 | 
	
		
			
			|  | 120 | +    return pbm.DBSession.query(pbma.Group).filter(pbma.Group.group_id==group_id).one()
 | 
	
		
			
			|  | 121 | +
 | 
	
		
			
			|  | 122 | +  @classmethod
 | 
	
		
			
			| 47 | 123 |    def createGroup(cls):
 | 
	
		
			
			| 48 | 124 |      loGroup = pbma.Group()
 | 
	
		
			
			| 49 | 125 |      return loGroup
 | 
	
	
		
			
			|  | @@ -56,7 +132,7 @@ class PODStaticController(object):
 | 
	
		
			
			| 56 | 132 |    @classmethod
 | 
	
		
			
			| 57 | 133 |    def getRealGroupRightsOnNode(cls, piNodeId: int) -> pbmd.DIRTY_GroupRightsOnNode:
 | 
	
		
			
			| 58 | 134 |  
 | 
	
		
			
			| 59 |  | -    groupRightsOnNodeCustomSelect = DBSession\
 | 
	
		
			
			|  | 135 | +    groupRightsOnNodeCustomSelect = pbm.DBSession\
 | 
	
		
			
			| 60 | 136 |          .query(pbmd.DIRTY_GroupRightsOnNode)\
 | 
	
		
			
			| 61 | 137 |          .from_statement(pbmd.DIRTY_RealGroupRightOnNodeSqlQuery)\
 | 
	
		
			
			| 62 | 138 |          .params(node_id=piNodeId)\
 | 
	
	
		
			
			|  | @@ -67,7 +143,7 @@ class PODStaticController(object):
 | 
	
		
			
			| 67 | 143 |    @classmethod
 | 
	
		
			
			| 68 | 144 |    def getUserDedicatedGroupRightsOnNode(cls, piNodeId: int) -> pbmd.DIRTY_GroupRightsOnNode:
 | 
	
		
			
			| 69 | 145 |  
 | 
	
		
			
			| 70 |  | -    groupRightsOnNodeCustomSelect = DBSession\
 | 
	
		
			
			|  | 146 | +    groupRightsOnNodeCustomSelect = pbm.DBSession\
 | 
	
		
			
			| 71 | 147 |          .query(pbmd.DIRTY_GroupRightsOnNode)\
 | 
	
		
			
			| 72 | 148 |          .from_statement(pbmd.DIRTY_UserDedicatedGroupRightOnNodeSqlQuery)\
 | 
	
		
			
			| 73 | 149 |          .params(node_id=piNodeId)\
 | 
	
	
		
			
			|  | @@ -101,10 +177,10 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 101 | 177 |          loNode.parent_id = parent_id
 | 
	
		
			
			| 102 | 178 |  
 | 
	
		
			
			| 103 | 179 |      if inherit_rights:
 | 
	
		
			
			| 104 |  | -        parent_node = DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.node_id==parent_id).one()
 | 
	
		
			
			|  | 180 | +        parent_node = pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.node_id==parent_id).one()
 | 
	
		
			
			| 105 | 181 |          self.copy_rights(parent_node, loNode)
 | 
	
		
			
			| 106 | 182 |  
 | 
	
		
			
			| 107 |  | -    DBSession.add(loNode)
 | 
	
		
			
			|  | 183 | +    pbm.DBSession.add(loNode)
 | 
	
		
			
			| 108 | 184 |  
 | 
	
		
			
			| 109 | 185 |      return loNode
 | 
	
		
			
			| 110 | 186 |  
 | 
	
	
		
			
			|  | @@ -144,7 +220,7 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 144 | 220 |      lsNodeIdFiltering = lsSqlSelectQuery % (str(self._iCurrentUserId))
 | 
	
		
			
			| 145 | 221 |  
 | 
	
		
			
			| 146 | 222 |      if liNodeId!=None and liNodeId!=0:
 | 
	
		
			
			| 147 |  | -      return DBSession.query(pbmd.PBNode).options(sqlao.joinedload_all("_oParent"), sqlao.joinedload_all("_lAllChildren"))\
 | 
	
		
			
			|  | 223 | +      return pbm.DBSession.query(pbmd.PBNode).options(sqlao.joinedload_all("_oParent"), sqlao.joinedload_all("_lAllChildren"))\
 | 
	
		
			
			| 148 | 224 |          .filter(pbmd.PBNode.node_id==liNodeId)\
 | 
	
		
			
			| 149 | 225 |          .filter(
 | 
	
		
			
			| 150 | 226 |            sqla.or_(
 | 
	
	
		
			
			|  | @@ -160,7 +236,7 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 160 | 236 |      Returns a list of nodes order by modification time and limited to piMaxNodeNb nodes
 | 
	
		
			
			| 161 | 237 |      """
 | 
	
		
			
			| 162 | 238 |      liOwnerIdList = self._getUserIdListForFiltering()
 | 
	
		
			
			| 163 |  | -    return DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).order_by(pbmd.PBNode.updated_at.desc()).limit(piMaxNodeNb).all()
 | 
	
		
			
			|  | 239 | +    return pbm.DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).order_by(pbmd.PBNode.updated_at.desc()).limit(piMaxNodeNb).all()
 | 
	
		
			
			| 164 | 240 |  
 | 
	
		
			
			| 165 | 241 |  
 | 
	
		
			
			| 166 | 242 |    def getListOfAllowedNodes(self, reset_cache=False) -> pbmd.PBNode:
 | 
	
	
		
			
			|  | @@ -224,7 +300,7 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 224 | 300 |              ORDER BY node_id ASC
 | 
	
		
			
			| 225 | 301 |          """
 | 
	
		
			
			| 226 | 302 |  
 | 
	
		
			
			| 227 |  | -        loNodeListResult = DBSession.query(pbmd.PBNode).\
 | 
	
		
			
			|  | 303 | +        loNodeListResult = pbm.DBSession.query(pbmd.PBNode).\
 | 
	
		
			
			| 228 | 304 |              from_statement(lsSqlQuery).\
 | 
	
		
			
			| 229 | 305 |              params(owner_id=self._iCurrentUserId)
 | 
	
		
			
			| 230 | 306 |          allowed_nodes = loNodeListResult.all()
 | 
	
	
		
			
			|  | @@ -248,7 +324,7 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 248 | 324 |  
 | 
	
		
			
			| 249 | 325 |      loKeywordFilteringClausesAsOr = sqla.or_(*loKeywordFilteringClauses) # Combine them with or to a BooleanClauseList
 | 
	
		
			
			| 250 | 326 |  
 | 
	
		
			
			| 251 |  | -    loResultsForSomeKeywords = DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).join(pbma.Rights).join(pbma.user_group_table, pbma.Rights.group_id==pbma.user_group_table.columns['group_id'])\
 | 
	
		
			
			|  | 327 | +    loResultsForSomeKeywords = pbm.DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).join(pbma.Rights).join(pbma.user_group_table, pbma.Rights.group_id==pbma.user_group_table.columns['group_id'])\
 | 
	
		
			
			| 252 | 328 |          .filter(loKeywordFilteringClausesAsOr)\
 | 
	
		
			
			| 253 | 329 |          .filter((pbmd.PBNode.owner_id.in_(liOwnerIdList)) | (pbma.user_group_table.c.user_id.in_(liOwnerIdList) & pbmd.PBNode.is_shared))\
 | 
	
		
			
			| 254 | 330 |          .order_by(sqla.desc(pbmd.PBNode.node_type))\
 | 
	
	
		
			
			|  | @@ -259,7 +335,7 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 259 | 335 |  
 | 
	
		
			
			| 260 | 336 |    def getNodesByStatus(self, psNodeStatus, piMaxNodeNb=5):
 | 
	
		
			
			| 261 | 337 |      liOwnerIdList = self._getUserIdListForFiltering()
 | 
	
		
			
			| 262 |  | -    return DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_status==psNodeStatus).order_by(pbmd.PBNode.updated_at).limit(piMaxNodeNb).all()
 | 
	
		
			
			|  | 338 | +    return pbm.DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_status==psNodeStatus).order_by(pbmd.PBNode.updated_at).limit(piMaxNodeNb).all()
 | 
	
		
			
			| 263 | 339 |  
 | 
	
		
			
			| 264 | 340 |  
 | 
	
		
			
			| 265 | 341 |    def getChildNodesForMenu(self, poParentNode: pbmd.PBNode, allowed_nodes: [pbmd.PBNode]) -> [pbmd.PBNode]:
 | 
	
	
		
			
			|  | @@ -275,7 +351,7 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 275 | 351 |              visible_child_nodes.append(child_node)
 | 
	
		
			
			| 276 | 352 |      else:
 | 
	
		
			
			| 277 | 353 |          # Root case
 | 
	
		
			
			| 278 |  | -        parent_nodes = DBSession
 | 
	
		
			
			|  | 354 | +        parent_nodes = pbm.DBSession
 | 
	
		
			
			| 279 | 355 |          for allowed_node in allowed_nodes:
 | 
	
		
			
			| 280 | 356 |              print("     @@@@@@@@@@@@@@@@ BEFORE @@@@@@@@@@@@@@@@ ")
 | 
	
		
			
			| 281 | 357 |              # loParent = allowed_node._oParent
 | 
	
	
		
			
			|  | @@ -410,15 +486,15 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 410 | 486 |  
 | 
	
		
			
			| 411 | 487 |    def getParentNode(self, loNode):
 | 
	
		
			
			| 412 | 488 |      liOwnerIdList = self._getUserIdListForFiltering()
 | 
	
		
			
			| 413 |  | -    return DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==loNode.parent_id).one()
 | 
	
		
			
			|  | 489 | +    return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==loNode.parent_id).one()
 | 
	
		
			
			| 414 | 490 |  
 | 
	
		
			
			| 415 | 491 |    def getSiblingNodes(self, poNode, pbReverseOrder=False):
 | 
	
		
			
			| 416 | 492 |      liOwnerIdList = self._getUserIdListForFiltering()
 | 
	
		
			
			| 417 | 493 |      
 | 
	
		
			
			| 418 | 494 |      if pbReverseOrder:
 | 
	
		
			
			| 419 |  | -      return DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.parent_id==poNode.parent_id).order_by(pbmd.PBNode.node_order.desc()).all()
 | 
	
		
			
			|  | 495 | +      return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.parent_id==poNode.parent_id).order_by(pbmd.PBNode.node_order.desc()).all()
 | 
	
		
			
			| 420 | 496 |      else:
 | 
	
		
			
			| 421 |  | -      return DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.parent_id==poNode.parent_id).order_by(pbmd.PBNode.node_order).all()
 | 
	
		
			
			|  | 497 | +      return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.parent_id==poNode.parent_id).order_by(pbmd.PBNode.node_order).all()
 | 
	
		
			
			| 422 | 498 |  
 | 
	
		
			
			| 423 | 499 |    def resetNodeOrderOfSiblingNodes(self, loSiblingNodes):
 | 
	
		
			
			| 424 | 500 |      liNewWeight = 0
 | 
	
	
		
			
			|  | @@ -470,11 +546,11 @@ class PODUserFilteredApiController(object):
 | 
	
		
			
			| 470 | 546 |  
 | 
	
		
			
			| 471 | 547 |    def getNodeFileContent(self, liNodeId):
 | 
	
		
			
			| 472 | 548 |      liOwnerIdList = self._getUserIdListForFiltering()
 | 
	
		
			
			| 473 |  | -    return DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==liNodeId).one().data_file_content
 | 
	
		
			
			|  | 549 | +    return pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==liNodeId).one().data_file_content
 | 
	
		
			
			| 474 | 550 |  
 | 
	
		
			
			| 475 | 551 |    def deleteNode(loNode):
 | 
	
		
			
			| 476 | 552 |      # INFO - D.A. - 2013-11-07 - should be save as getNode should return only accessible nodes
 | 
	
		
			
			| 477 |  | -    DBSession.delete(loNode)
 | 
	
		
			
			|  | 553 | +    pbm.DBSession.delete(loNode)
 | 
	
		
			
			| 478 | 554 |      return
 | 
	
		
			
			| 479 | 555 |  
 | 
	
		
			
			| 480 | 556 |    def createRight(self):
 |