PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/applications/list.py

https://bitbucket.org/viur/server
Python | 280 lines | 278 code | 1 blank | 1 comment | 0 complexity | 4a64352c3bb68f09928a1c2601a96983 MD5 | raw file
Possible License(s): LGPL-3.0
  1. # -*- coding: utf-8 -*-
  2. from server.bones import baseBone
  3. from server.skeleton import Skeleton
  4. from server.skellist import Skellist
  5. from server import utils, session, errors, conf
  6. from google.appengine.api import users
  7. import logging
  8. class List( object ):
  9. adminInfo = { "name": "BaseApplication", #Name of this modul, as shown in Apex (will be translated at runtime)
  10. "handler": "list", #Which handler to invoke
  11. "icon": "", #Icon for this modul
  12. }
  13. def __init__( self, modulName, modulPath, *args, **kwargs ):
  14. super( List, self ).__init__( *args, **kwargs )
  15. self.modulName = modulName
  16. self.modulPath = modulPath
  17. if self.adminInfo:
  18. rights = ["add", "edit", "view", "delete"]
  19. for r in rights:
  20. rightName = "%s-%s" % ( modulName, r )
  21. if not rightName in conf["viur.accessRights"]:
  22. conf["viur.accessRights"].append( rightName )
  23. def preview( self, skey, *args, **kwargs ):
  24. """
  25. Renders the viewTemplate with the values given.
  26. This allows to preview an entry without having to save it first
  27. """
  28. if not self.canPreview( ):
  29. raise errors.Unauthorized()
  30. if not utils.validateSecurityKey( skey ):
  31. raise errors.PreconditionFailed()
  32. skel = self.viewSkel()
  33. skel.fromClient( kwargs )
  34. return( self.render.view( skel ) )
  35. preview.exposed = True
  36. def view( self, *args, **kwargs ):
  37. """
  38. Prepares and renders a single entry for viewing
  39. """
  40. if "id" in kwargs:
  41. id = kwargs["id"]
  42. elif( len( args ) >= 1 ):
  43. id= args[0]
  44. else:
  45. raise errors.NotAcceptable()
  46. skel = self.viewSkel()
  47. if "canView" in dir( self ):
  48. if not self.canView( id ):
  49. raise errors.Unauthorized()
  50. if not skel.fromDB( id ):
  51. raise errors.NotFound()
  52. else:
  53. queryObj = utils.buildDBFilter( skel, {"id": id} )
  54. queryObj = self.listFilter( queryObj ) #Access control
  55. if not queryObj:
  56. raise errors.Unauthorized()
  57. if not skel.fromDB( queryObj ):
  58. raise errors.NotFound()
  59. return( self.render.view( skel ) )
  60. view.exposed = True
  61. def list( self, *args, **kwargs ):
  62. """
  63. Renders a list of entries.
  64. All supplied parameters are interpreted as filters for the elements displayed
  65. Unlike Tree, Hierarchy or Singleton, access control in this function is realized
  66. by calling the function listFilter, which updates the query-filter to contain only
  67. elements which the user is allowed to view.
  68. """
  69. mylist = Skellist( self.viewSkel )
  70. queryObj = utils.buildDBFilter( self.viewSkel(), kwargs ) #Build the initial one
  71. queryObj = self.listFilter( queryObj ) #Access control
  72. if not queryObj:
  73. raise( errors.Unauthorized() )
  74. mylist.fromDB( queryObj )
  75. return( self.render.list( mylist ) )
  76. list.exposed = True
  77. def edit( self, *args, **kwargs ):
  78. """
  79. Edit the entry with the given id
  80. """
  81. if "skey" in kwargs:
  82. skey = kwargs["skey"]
  83. else:
  84. skey = ""
  85. if( len( args ) == 1 ):
  86. id= args[0]
  87. elif "id" in kwargs:
  88. id = kwargs["id"]
  89. else:
  90. raise errors.NotAcceptable()
  91. skel = self.editSkel()
  92. if id == "0":
  93. return( self.render.edit( skel ) )
  94. if not self.canEdit( id ):
  95. raise errors.Unauthorized()
  96. if not skel.fromDB( id ):
  97. raise errors.NotAcceptable()
  98. if len(kwargs)==0 or skey=="" or not skel.fromClient( kwargs ) or ("bounce" in list(kwargs.keys()) and kwargs["bounce"]=="1"):
  99. return( self.render.edit( skel ) )
  100. if not utils.validateSecurityKey( skey ):
  101. raise errors.PreconditionFailed()
  102. skel.toDB( id )
  103. self.onItemEdited( id, skel )
  104. return self.render.editItemSuccess( skel )
  105. edit.exposed = True
  106. edit.forceSSL = True
  107. def add( self, *args, **kwargs ):
  108. """
  109. Add a new entry.
  110. """
  111. if "skey" in kwargs:
  112. skey = kwargs["skey"]
  113. else:
  114. skey = ""
  115. if not self.canAdd( ):
  116. raise errors.Unauthorized()
  117. skel = self.addSkel()
  118. if not skel.fromClient( kwargs ) or len(kwargs)==0 or skey=="" or ("bounce" in list(kwargs.keys()) and kwargs["bounce"]=="1"):
  119. return( self.render.add( skel ) )
  120. if not utils.validateSecurityKey( skey ):
  121. raise errors.PreconditionFailed()
  122. id = skel.toDB( )
  123. self.onItemAdded( id, skel )
  124. return self.render.addItemSuccess( id, skel )
  125. add.exposed = True
  126. add.forceSSL = True
  127. def delete( self, id, skey, *args, **kwargs ):
  128. """
  129. Delete an entry.
  130. """
  131. if not self.canDelete( id ):
  132. raise errors.Unauthorized()
  133. skel = self.editSkel()
  134. if not skel.fromDB( id ):
  135. raise errors.NotFound()
  136. if not utils.validateSecurityKey( skey ):
  137. raise errors.PreconditionFailed()
  138. skel.delete( id )
  139. self.onItemDeleted( id, skel )
  140. return self.render.deleteSuccess( skel )
  141. delete.exposed = True
  142. delete.forceSSL = True
  143. def listFilter( self, filter ):
  144. """
  145. Changes the db-filter, sothat the result will only include entries the user is allowed to view
  146. @param filter: Query which should be altered.
  147. @type filter: ndb.query
  148. @return: altered ndb.query
  149. """
  150. user = users.get_current_user() #Check the GAE API
  151. if users.is_current_user_admin():
  152. return( filter )
  153. if "user" in dir( conf["viur.mainApp"] ): #Check for our custom user-api
  154. user = conf["viur.mainApp"].user.getCurrentUser()
  155. if user and user["access"] \
  156. and ("%s-view" % self.modulName in user["access"] or "root" in user["access"] ) :
  157. return( filter )
  158. return( None )
  159. def canAdd( self ):
  160. """
  161. Checks if the current user has the right to add a new entry
  162. @returns: True, if hes allowed to do so, False otherwise.
  163. """
  164. user = utils.getCurrentUser()
  165. if not user:
  166. return( False )
  167. if user["access"] and "root" in user["access"]:
  168. return( True )
  169. if user and user["access"] and "%s-add" % self.modulName in user["access"]:
  170. return( True )
  171. return( False )
  172. def canPreview( self ):
  173. """
  174. Checks if the current user has the right to use the preview function
  175. @returns: True, if hes allowed to do so, False otherwise.
  176. """
  177. user = utils.getCurrentUser()
  178. if not user:
  179. return( False )
  180. if user["access"] and "root" in user["access"]:
  181. return( True )
  182. if user and user["access"] and ("%s-add" % self.modulName in user["access"] or "%s-edit" % self.modulName in user["access"] ):
  183. return( True )
  184. def canEdit( self, id ):
  185. """
  186. Checks if the current user has the right to edit the given entry
  187. @param id: Urlsafe-key of the entry
  188. @type id: String
  189. @returns: True, if hes allowed to do so, False otherwise.
  190. """
  191. user = utils.getCurrentUser()
  192. if not user:
  193. return( False )
  194. if user["access"] and "root" in user["access"]:
  195. return( True )
  196. if user and user["access"] and "%s-edit" % self.modulName in user["access"]:
  197. return( True )
  198. return( False )
  199. def canDelete( self, id ):
  200. """
  201. Checks if the current user has the right to delete the given entry
  202. @param id: Urlsafe-key of the entry
  203. @type id: String
  204. @returns: True, if hes allowed to do so, False otherwise.
  205. """
  206. user = utils.getCurrentUser()
  207. if not user:
  208. return( False )
  209. if user["access"] and "root" in user["access"]:
  210. return( True )
  211. if user and user["access"] and "%s-delete" % self.modulName in user["access"]:
  212. return( True )
  213. return( False )
  214. def onItemAdded( self, id, skel ):
  215. """
  216. Hook. Can be overriden to hook the onItemAdded-Event
  217. @param id: Urlsafe-key of the entry added
  218. @type id: String
  219. @param skel: Skeleton with the data which has been added
  220. @type skel: Skeleton
  221. """
  222. logging.info("Entry added: %s" % id )
  223. user = utils.getCurrentUser()
  224. if user:
  225. logging.info("User: %s (%s)" % (user["name"], user["id"] ) )
  226. def onItemEdited( self, id, skel ):
  227. """
  228. Hook. Can be overriden to hook the onItemEdited-Event
  229. @param id: Urlsafe-key of the entry edited
  230. @type id: String
  231. @param skel: Skeleton with the data which has been edited
  232. @type skel: Skeleton
  233. """
  234. logging.info("Entry changed: %s" % id )
  235. user = utils.getCurrentUser()
  236. if user:
  237. logging.info("User: %s (%s)" % (user["name"], user["id"] ) )
  238. def onItemViewed( self, id, skel ):
  239. """
  240. Hook. Can be overriden to hook the onItemViewed-Event
  241. @param id: Urlsafe-key of the entry viewed
  242. @type id: String
  243. @param skel: Skeleton with the data which has been viewed
  244. @type skel: Skeleton
  245. """
  246. pass
  247. def onItemDeleted( self, id, skel ):
  248. """
  249. Hook. Can be overriden to hook the onItemDeleted-Event
  250. Note: Saving the skeleton again will undo the deletion.
  251. @param id: Urlsafe-key of the entry deleted
  252. @type id: String
  253. @param skel: Skeleton with the data which has been deleted
  254. @type skel: Skeleton
  255. """
  256. logging.info("Entry deleted: %s" % id )
  257. user = utils.getCurrentUser()
  258. if user:
  259. logging.info("User: %s (%s)" % (user["name"], user["id"] ) )
  260. List.admin=True
  261. List.jinja2=True
  262. List.ops=True