dbapi.py 7.8KB

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