api.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. # -*- coding: utf-8 -*-
  2. """Sample controller with all its actions protected."""
  3. from datetime import datetime
  4. # TODO - D.A. - 2013-11-19
  5. # Check if the new import (ie import io instead of cStringIO)
  6. # is working correctly
  7. #import io as csio
  8. # INFO - D.A. - 2013-11-19
  9. # The PIL import is now taken from the pillow
  10. # which is the python3 port of PIL
  11. #
  12. from PIL import Image as pil
  13. import tg
  14. from tg import expose, flash, require, url, lurl, request, redirect, tmpl_context
  15. from tg.i18n import ugettext as _, lazy_ugettext as l_
  16. from tg import predicates as tgp
  17. from tg.i18n import ugettext as _, lazy_ugettext as l_
  18. from pboard.lib.base import BaseController
  19. from pboard.lib import dbapi as pld
  20. from pboard.model import data as pmd
  21. from pboard import model as pm
  22. __all__ = ['PODPublicApiController', 'PODApiController']
  23. FIXME_ERROR_CODE=-1
  24. class PODPublicApiController(BaseController):
  25. @expose()
  26. def create_account(self, email='', password='', retyped_password='', **kw):
  27. if email=='' or password=='' or retyped_password=='':
  28. flash(_('Account creation error: please fill all the fields'), 'error')
  29. redirect(lurl('/'))
  30. elif password!=retyped_password:
  31. flash(_('Account creation error: passwords do not match'), 'error')
  32. redirect(lurl('/'))
  33. else:
  34. loExistingUser = pld.PODStaticController.getUserByEmailAddress(email)
  35. if loExistingUser!=None:
  36. flash(_('Account creation error: account already exist: %s') % (email), 'error')
  37. redirect(lurl('/'))
  38. loNewAccount = pld.PODStaticController.createUser()
  39. loNewAccount.email_address = email
  40. loNewAccount.display_name = email
  41. loNewAccount.password = password
  42. loUserGroup = pld.PODStaticController.getGroup('user')
  43. loUserGroup.users.append(loNewAccount)
  44. pm.DBSession.flush()
  45. flash(_('Account successfully created: %s') % (email), 'info')
  46. redirect(lurl('/'))
  47. class PODApiController(BaseController):
  48. """Sample controller-wide authorization"""
  49. allow_only = tgp.in_group('user', msg=l_('You need to login in order to access this ressource'))
  50. @expose()
  51. def create_event(self, parent_id=None, data_label='', data_datetime=None, data_content='', data_reminder_datetime=None, add_reminder=False, **kw):
  52. loCurrentUser = pld.PODStaticController.getCurrentUser()
  53. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  54. loNewNode = loApiController.createNode()
  55. loNewNode.parent_id = int(parent_id)
  56. loNewNode.node_type = pmd.PBNodeType.Event
  57. loNewNode.data_label = data_label
  58. loNewNode.data_content = data_content
  59. loNewNode.data_datetime = datetime.strptime(data_datetime, '%d/%m/%Y %H:%M')
  60. if add_reminder:
  61. loNewNode.data_reminder_datetime = data_reminder_datetime
  62. pm.DBSession.flush()
  63. redirect(lurl('/document/%i'%(loNewNode.parent_id)))
  64. @expose()
  65. def create_contact(self, parent_id=None, data_label='', data_content='', **kw):
  66. loCurrentUser = pld.PODStaticController.getCurrentUser()
  67. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  68. loNewNode = loApiController.createNode()
  69. loNewNode.parent_id = int(parent_id)
  70. loNewNode.node_type = pmd.PBNodeType.Contact
  71. loNewNode.data_label = data_label
  72. loNewNode.data_content = data_content
  73. pm.DBSession.flush()
  74. redirect(lurl('/document/%i'%(loNewNode.parent_id)))
  75. @expose()
  76. def create_comment(self, parent_id=None, data_label='', data_content='', **kw):
  77. loCurrentUser = pld.PODStaticController.getCurrentUser()
  78. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  79. loNewNode = loApiController.createNode()
  80. loNewNode.parent_id = int(parent_id)
  81. loNewNode.node_type = pmd.PBNodeType.Comment
  82. loNewNode.data_label = data_label
  83. loNewNode.data_content = data_content
  84. pm.DBSession.flush()
  85. redirect(lurl('/document/%i'%(loNewNode.parent_id)))
  86. @expose()
  87. def create_file(self, parent_id=None, data_label='', data_content='', data_file=None, **kw):
  88. loCurrentUser = pld.PODStaticController.getCurrentUser()
  89. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  90. loNewNode = loApiController.createNode()
  91. loNewNode.parent_id = int(parent_id)
  92. loNewNode.node_type = pmd.PBNodeType.File
  93. loNewNode.data_label = data_label
  94. loNewNode.data_content = data_content
  95. loNewNode.data_file_name = data_file.filename
  96. loNewNode.data_file_mime_type = data_file.type
  97. loNewNode.data_file_content = data_file.file.read()
  98. pm.DBSession.flush()
  99. redirect(lurl('/document/%i'%(loNewNode.parent_id)))
  100. @expose()
  101. def get_file_content(self, node_id=None, **kw):
  102. if node_id==None:
  103. return
  104. else:
  105. loCurrentUser = pld.PODStaticController.getCurrentUser()
  106. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  107. loFile = loApiController.getNode(node_id)
  108. lsContentType = "application/x-download"
  109. if loFile.data_file_mime_type!='':
  110. tg.response.headers['Content-type'] = str(loFile.data_file_mime_type)
  111. tg.response.headers['Content-Type'] = lsContentType
  112. tg.response.headers['Content-Disposition'] = str('attachment; filename="%s"'%(loFile.data_file_name))
  113. return loFile.data_file_content
  114. @expose()
  115. def get_file_content_thumbnail(self, node_id=None, **kw):
  116. if node_id==None:
  117. return
  118. else:
  119. loCurrentUser = pld.PODStaticController.getCurrentUser()
  120. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  121. loFile = loApiController.getNode(node_id)
  122. loJpegBytes = csio.StringIO(loFile.data_file_content)
  123. loImage = pil.open(loJpegBytes)
  124. loImage.thumbnail([140,140], pil.ANTIALIAS)
  125. loResultBuffer = StringIO()
  126. loImage.save(loResultBuffer,"JPEG")
  127. tg.response.headers['Content-type'] = str(loFile.data_file_mime_type)
  128. return loResultBuffer.getvalue()
  129. @expose()
  130. def set_parent_node(self, node_id, new_parent_id, **kw):
  131. loCurrentUser = pld.PODStaticController.getCurrentUser()
  132. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  133. # TODO - D.A. - 2013-11-07 - Check that new parent is accessible by the user !!!
  134. loNewNode = loApiController.getNode(node_id)
  135. if new_parent_id!='':
  136. loNewNode.parent_id = int(new_parent_id)
  137. pm.DBSession.flush()
  138. redirect(lurl('/document/%s'%(node_id)))
  139. @expose()
  140. def move_node_upper(self, node_id=0):
  141. loCurrentUser = pld.PODStaticController.getCurrentUser()
  142. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  143. loNode = loApiController.getNode(node_id)
  144. if loApiController.moveNodeUpper(loNode)==FIXME_ERROR_CODE:
  145. flash(_('Document #%s can\'t move upper.')%(node_id))
  146. redirect(lurl('/document/%s'%(node_id)))
  147. @expose()
  148. def move_node_lower(self, node_id=0):
  149. loCurrentUser = pld.PODStaticController.getCurrentUser()
  150. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  151. loNode = loApiController.getNode(node_id)
  152. if loApiController.moveNodeLower(loNode)==FIXME_ERROR_CODE:
  153. flash(_('Document #%s can\'t move lower.')%(node_id))
  154. redirect(lurl('/document/%s'%(node_id)))
  155. @expose()
  156. def create_document(self, parent_id=None):
  157. loCurrentUser = pld.PODStaticController.getCurrentUser()
  158. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  159. loNewNode = loApiController.createDummyNode()
  160. loNewNode.data_label = 'New document'
  161. loNewNode.data_content = 'insert content...'
  162. if int(parent_id)==0:
  163. loNewNode.parent_id = None
  164. else:
  165. loNewNode.parent_id = parent_id
  166. pm.DBSession.flush()
  167. redirect(lurl('/document/%i'%(loNewNode.node_id)))
  168. @expose()
  169. def edit_status(self, node_id, node_status):
  170. loCurrentUser = pld.PODStaticController.getCurrentUser()
  171. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  172. loNode = loApiController.getNode(node_id)
  173. loNode.node_status = node_status
  174. redirect(lurl('/document/%s'%(node_id)))
  175. @expose()
  176. def edit_label_and_content(self, node_id, data_label, data_content):
  177. loCurrentUser = pld.PODStaticController.getCurrentUser()
  178. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  179. loNode = loApiController.getNode(node_id)
  180. loNode.data_label = data_label
  181. loNode.data_content = data_content
  182. redirect(lurl('/document/%s'%(node_id)))
  183. @expose()
  184. def force_delete_node(self, node_id=None):
  185. loCurrentUser = pld.PODStaticController.getCurrentUser()
  186. loApiController = pld.PODUserFilteredApiController(loCurrentUser.user_id)
  187. loNode = loApiController.getNode(node_id)
  188. liParentId = loNode.parent_id
  189. if loNode.getChildNb()<=0:
  190. pm.DBSession.delete(loNode)
  191. flash(_('Document #%s has been deleted')%(node_id))
  192. else:
  193. flash(_('Document #%s can\'t be deleted because it is not empty.')%(node_id), 'error')
  194. redirect(lurl('/document/%s'%(node_id)))
  195. redirect(lurl('/document/%i'%(liParentId or 0)))
  196. @expose()
  197. def reindex_nodes(self, back_to_node_id=0):
  198. # FIXME - NOT SAFE
  199. loRootNodeList = pm.DBSession.query(pmd.PBNode).order_by(pmd.PBNode.parent_id).all()
  200. for loNode in loRootNodeList:
  201. if loNode.parent_id==None:
  202. loNode.node_depth = 0
  203. loNode.parent_tree_path = '/'
  204. else:
  205. loNode.node_depth = loNode._oParent.node_depth+1
  206. loNode.parent_tree_path = '%s%i/'%(loNode._oParent.parent_tree_path,loNode.parent_id)
  207. pm.DBSession.flush()
  208. flash(_('Documents re-indexed'), 'info')
  209. redirect(lurl('/document/%s'%(back_to_node_id)))