api.py 10KB

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