Guest User

Untitled

a guest
Jun 20th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.55 KB | None | 0 0
  1. import zExceptions
  2. from Products.CMFPlone.factory import addPloneSite
  3. from Products.Five.browser import BrowserView
  4. import plone.api
  5. from plone.app.textfield.value import RichTextValue
  6. from plone.app.theming.browser.controlpanel import ThemingControlpanel
  7.  
  8. import json
  9. import lxml.html
  10.  
  11.  
  12. class MyThemingControlpanel(ThemingControlpanel):
  13.  
  14. def authorize(self):
  15. return True
  16.  
  17.  
  18. class API(BrowserView):
  19.  
  20. def recreate_plone_site(self):
  21. """ Recreate a Plone site """
  22.  
  23. data = json.loads(self.request.BODY)
  24. site_id = str(data['site_id'])
  25. extension_ids = data['extension_ids']
  26.  
  27. root = self.context.restrictedTraverse('/')
  28. if site_id in root.objectIds():
  29. print 'Deleting Plone site "{0}"'.format(site_id)
  30. root.manage_delObjects([site_id])
  31.  
  32. print 'Creating Plone site "{0}" with {1}'.format(
  33. site_id, extension_ids)
  34. addPloneSite(root, site_id, extension_ids=extension_ids)
  35. print 'Created Plone site "{0}" with {1}'.format(
  36. site_id, extension_ids)
  37.  
  38. self.request.form['form.button.Enable'] = 'DONE'
  39. self.request.form['themeName'] = 'barceloneta'
  40. view = MyThemingControlpanel(root[site_id], self.request)
  41. view.update()
  42.  
  43. self.request.response.setStatus(201)
  44. self.request.response.write('Created')
  45.  
  46. def remote_exists(self, path):
  47. """ Check if `path` exists based on our own traversal.
  48. The purpose of this method is to provide a traversal
  49. lookup that is not dependent on Acquisition but on
  50. real traversal.
  51. E.g. a request to `/plone/papers/conference/papers` would
  52. resolve to the first `papers` folder if the second
  53. `papers` folder does not exist.
  54. """
  55. current = self.context.restrictedTraverse('/')
  56. for c in path.split('/'):
  57. if not c:
  58. continue
  59. if c in current.objectIds():
  60. current = current[c]
  61. else:
  62. raise zExceptions.NotFound(path)
  63. self.request.response.setStatus(200)
  64. self.request.response.write('FOUND')
  65.  
  66. def setuid(self, uid):
  67. """ Set given `uid` on current context object """
  68. from plone.protect.interfaces import IDisableCSRFProtection
  69. from zope.interface import alsoProvides
  70.  
  71. alsoProvides(self.request, IDisableCSRFProtection)
  72. setattr(self.context, '_plone.uuid', uid)
  73. self.context.reindexObject(idxs=['UID'])
  74. self.request.response.setStatus(200)
  75.  
  76. def convert_to_uids(self):
  77. """ Convert all links inside a RichText field from path to UID """
  78. from plone.protect.interfaces import IDisableCSRFProtection
  79. from zope.interface import alsoProvides
  80.  
  81. alsoProvides(self.request, IDisableCSRFProtection)
  82.  
  83. catalog = plone.api.portal.get_tool('portal_catalog')
  84.  
  85. for brain in catalog():
  86. obj = brain.getObject()
  87.  
  88. try:
  89. html = obj.text.raw
  90. except AttributeError:
  91. continue
  92.  
  93. root = lxml.html.fromstring(html)
  94. for img in root.xpath('//img') :
  95. src = img.attrib['src']
  96. if src.startswith('resolveuid/'):
  97. continue
  98. src_parts = src.split('/')
  99. scale = ''
  100. if src_parts[-1] in ('image_preview', 'image_large', 'image_mini', 'image_thumb', 'image_tile', 'image_icon', 'image_listing'):
  101. src = '/'.join(src_parts[:-1])
  102. scale = src_parts[-1].replace('image_', '')
  103. target = self.context.restrictedTraverse(src, None)
  104. if target is not None:
  105. img.attrib['src'] = 'resolveuid/{}'.format(target.UID())
  106. class_ = img.attrib.get('class', '')
  107. if scale:
  108. img.attrib['class'] = 'scale-{} '.format(scale) + class_
  109.  
  110. html = lxml.html.tostring(root)
  111. obj.text = RichTextValue(html, 'text/html', 'text/html')
  112.  
  113. self.request.response.setStatus(200)
  114. self.request.response.write('DONE')
  115.  
  116.  
  117. def set_navigationroot(self):
  118. """ Set INavigationRoot on current context object """
  119. from Products.Five.utilities.marker import mark
  120. from plone.app.layout.navigation.interfaces import INavigationRoot
  121. from plone.protect.interfaces import IDisableCSRFProtection
  122. from zope.interface import alsoProvides
  123.  
  124. alsoProvides(self.request, IDisableCSRFProtection)
  125. mark(self.context, INavigationRoot)
Add Comment
Please, Sign In to add comment