dbapi.py 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. # -*- coding: utf-8 -*-
  2. """
  3. """
  4. import os
  5. from datetime import datetime
  6. from hashlib import sha256
  7. from sqlalchemy import Table, ForeignKey, Column
  8. from sqlalchemy.types import Unicode, Integer, DateTime, Text
  9. from sqlalchemy.orm import relation, synonym
  10. from sqlalchemy.orm import joinedload_all
  11. from pboard.model import DeclarativeBase, metadata, DBSession
  12. from pboard.model import data as pbmd
  13. from pboard.model import auth as pbma
  14. import pboard.model as pbm
  15. import tg
  16. FIXME_ERROR_CODE=-1
  17. class PODStaticController(object):
  18. @classmethod
  19. def getCurrentUser(cls):
  20. loCurrentUser = pbma.User.by_email_address(tg.request.identity['repoze.who.userid'])
  21. return loCurrentUser
  22. @classmethod
  23. def getUserByEmailAddress(cls, psEmailAddress):
  24. loUser = pbma.User.by_email_address(psEmailAddress)
  25. return loUser
  26. @classmethod
  27. def createUser(cls):
  28. loUser = pbma.User()
  29. return loUser
  30. @classmethod
  31. def getGroup(cls, psGroupName):
  32. loGroup = pbma.Group.by_group_name(psGroupName)
  33. return loGroup
  34. class PODUserFilteredApiController(object):
  35. def __init__(self, piUserId, piExtraUserIdList=[]):
  36. self._iCurrentUserId = piUserId
  37. self._iExtraUserIdList = piExtraUserIdList
  38. self._iUserIdFilteringList = None
  39. def _getUserIdListForFiltering(self):
  40. if self._iUserIdFilteringList==None:
  41. self._iUserIdFilteringList = list()
  42. self._iUserIdFilteringList.append(self._iCurrentUserId)
  43. for liUserId in self._iExtraUserIdList:
  44. self._iUserIdFilteringList.append(liUserId)
  45. return self._iUserIdFilteringList
  46. def createNode(self):
  47. loNode = pbmd.PBNode()
  48. loNode.owner_id = self._iCurrentUserId
  49. DBSession.add(loNode)
  50. return loNode
  51. query.filter(User.name.in_(['ed', 'wendy', 'jack']))
  52. def createDummyNode(self):
  53. loNewNode = self.createNode()
  54. loNewNode.data_label = 'New document'
  55. loNewNode.data_content = 'insert content...'
  56. return loNewNode
  57. def getNode(self, liNodeId):
  58. liOwnerIdList = self._getUserIdListForFiltering()
  59. if liNodeId==0:
  60. return DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).first()
  61. else:
  62. return DBSession.query(pbmd.PBNode).options(joinedload_all("_lAllChildren")).filter(pbmd.PBNode.node_id==liNodeId).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).one()
  63. def getLastModifiedNodes(self, piMaxNodeNb):
  64. """
  65. Returns a list of nodes order by modification time and limited to piMaxNodeNb nodes
  66. """
  67. liOwnerIdList = self._getUserIdListForFiltering()
  68. 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()
  69. def getNodesByStatus(self, psNodeStatus, piMaxNodeNb=5):
  70. liOwnerIdList = self._getUserIdListForFiltering()
  71. 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()
  72. def buildTreeListForMenu(self, plViewableStatusId):
  73. liOwnerIdList = self._getUserIdListForFiltering()
  74. loNodeList = pbm.DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_type==pbmd.PBNodeType.Data).filter(pbmd.PBNode.node_status.in_(plViewableStatusId)).order_by(pbmd.PBNode.parent_tree_path).order_by(pbmd.PBNode.node_order).order_by(pbmd.PBNode.node_id).all()
  75. loTreeList = []
  76. loTmpDict = {}
  77. for loNode in loNodeList:
  78. loTmpDict[loNode.node_id] = loNode
  79. if loNode.parent_id==None:
  80. loTreeList.append(loNode)
  81. else:
  82. # append the node to the parent list
  83. # FIXME - D.A - 2013-10-08
  84. # The following line may raise an exception
  85. # We suppose that the parent node has already been added
  86. # this *should* be the case, but the code does not check it
  87. if loNode.parent_id not in loTmpDict.keys():
  88. loTmpDict[loNode.parent_id] = self.getNode(loNode.parent_id)
  89. loTmpDict[loNode.parent_id].appendStaticChild(loNode)
  90. return loTreeList
  91. def getParentNode(self, loNode):
  92. liOwnerIdList = self._getUserIdListForFiltering()
  93. return DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==loNode.parent_id).one()
  94. def getSiblingNodes(self, poNode, pbReverseOrder=False):
  95. liOwnerIdList = self._getUserIdListForFiltering()
  96. if pbReverseOrder:
  97. 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()
  98. else:
  99. 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()
  100. def resetNodeOrderOfSiblingNodes(self, loSiblingNodes):
  101. liNewWeight = 0
  102. for loNode in loSiblingNodes:
  103. liNewWeight = liNewWeight + 1
  104. loNode.node_order = liNewWeight
  105. # DBSession.save()
  106. def moveNodeUpper(self, loNode):
  107. # FIXME - manage errors and logging
  108. loSiblingNodes = self.getSiblingNodes(loNode)
  109. self.resetNodeOrderOfSiblingNodes(loSiblingNodes)
  110. loPreviousItem = None
  111. for loItem in loSiblingNodes:
  112. if loItem==loNode:
  113. if loPreviousItem==None:
  114. return FIXME_ERROR_CODE # FIXME - D.A. Do not use hard-coded error codes
  115. print("No previous node")
  116. else:
  117. liPreviousItemOrder = loPreviousItem.node_order
  118. loPreviousItem.node_order = loNode.node_order
  119. loNode.node_order = liPreviousItemOrder
  120. # DBSession.save()
  121. break
  122. loPreviousItem = loItem
  123. def moveNodeLower(self, loNode):
  124. # FIXME - manage errors and logging
  125. loSiblingNodes = self.getSiblingNodes(loNode)
  126. self.resetNodeOrderOfSiblingNodes(loSiblingNodes)
  127. loPreviousItem = None
  128. for loItem in reversed(loSiblingNodes):
  129. if loItem==loNode:
  130. if loPreviousItem==None:
  131. return FIXME_ERROR_CODE # FIXME - D.A. Do not use hard-coded error codes
  132. # FIXME
  133. print("No previous node")
  134. else:
  135. liPreviousItemOrder = loPreviousItem.node_order
  136. loPreviousItem.node_order = loNode.node_order
  137. loNode.node_order = liPreviousItemOrder
  138. # DBSession.save()
  139. break
  140. loPreviousItem = loItem
  141. def getNodeFileContent(self, liNodeId):
  142. liOwnerIdList = self._getUserIdListForFiltering()
  143. return DBSession.query(pbmd.PBNode).filter(pbmd.PBNode.owner_id.in_(liOwnerIdList)).filter(pbmd.PBNode.node_id==liNodeId).one().data_file_content
  144. def deleteNode(loNode):
  145. # INFO - D.A. - 2013-11-07 - should be save as getNode should return only accessible nodes
  146. DBSession.delete(loNode)
  147. return