Skip to content

Commit

Permalink
Merge 1a4a23d into 1799b9e
Browse files Browse the repository at this point in the history
  • Loading branch information
petschki committed Nov 29, 2018
2 parents 1799b9e + 1a4a23d commit 0014da1
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 24 deletions.
7 changes: 7 additions & 0 deletions CHANGES.rst
@@ -1,6 +1,13 @@
Changes
=======

1.5.2 (unreleased)
------------------

- export selected taxonomies as ZIPed folder with XML files
[petschki]


1.5.1 (2018-10-25)
------------------

Expand Down
8 changes: 8 additions & 0 deletions src/collective/taxonomy/configure.zcml
Expand Up @@ -68,6 +68,14 @@
layer=".interfaces.IBrowserLayer"
/>

<browser:page
name="taxonomy-export"
for="Products.CMFCore.interfaces.ISiteRoot"
class=".controlpanel.TaxonomyExport"
permission="cmf.ManagePortal"
layer=".interfaces.IBrowserLayer"
/>

<browser:page
name="taxonomy"
for="*"
Expand Down
76 changes: 52 additions & 24 deletions src/collective/taxonomy/controlpanel.py
@@ -1,29 +1,31 @@
# -*- coding: utf-8 -*-
import logging
import zipfile

from Products.CMFPlone.interfaces import IPloneSiteRoot
from Products.Five.browser import BrowserView
from collective.taxonomy.exportimport import TaxonomyImportExportAdapter
from collective.taxonomy.factory import registerTaxonomy
from collective.taxonomy.i18n import CollectiveTaxonomyMessageFactory as _
from collective.taxonomy.interfaces import ITaxonomy
from collective.taxonomy.interfaces import ITaxonomyForm
from collective.taxonomy.interfaces import ITaxonomySettings
from plone import api
from plone.app.registry.browser import controlpanel
from z3c.form.browser.checkbox import CheckBoxFieldWidget
from plone.behavior.interfaces import IBehavior
from plone import api
from plone.memoize import view

from Products.CMFPlone.interfaces import IPloneSiteRoot

from zope.interface import implements
from six import BytesIO
from zExceptions import NotFound
from z3c.form import button
from z3c.form import field
from z3c.form import form
from z3c.form.browser.checkbox import CheckBoxFieldWidget
from z3c.form.interfaces import HIDDEN_MODE
from zope.component import adapts
from zope.i18n.interfaces import ITranslationDomain
from zope.interface import implements
from zope.schema.interfaces import IVocabularyFactory


from z3c.form import form, field, button
from z3c.form.interfaces import HIDDEN_MODE

from collective.taxonomy.i18n import CollectiveTaxonomyMessageFactory as _
from collective.taxonomy.factory import registerTaxonomy
from collective.taxonomy.interfaces import ITaxonomy
from collective.taxonomy.interfaces import ITaxonomySettings
from collective.taxonomy.interfaces import ITaxonomyForm
from collective.taxonomy.exportimport import TaxonomyImportExportAdapter

logger = logging.getLogger("taxonomy.controlpanel")


Expand Down Expand Up @@ -104,27 +106,53 @@ def handle_delete_taxonomy_action(self, action):
api.portal.show_message(_(u"Please select at least one taxonomy."),
request=self.request)

return self.request.RESPONSE.redirect(self.context.portal_url() + '/@@taxonomy-settings')
return self.request.RESPONSE.redirect(
self.context.portal_url() + '/@@taxonomy-settings')

@button.buttonAndHandler(_(u'label_export', default='Export'),
name='export')
def handle_export_action(self, action):
data, errors = self.extractData()
sm = self.context.getSiteManager()
taxonomies = data.get('taxonomies', [])

if len(taxonomies) > 0:
adapter = TaxonomyImportExportAdapter(self.context)
self.request.RESPONSE.setHeader('Content-type', 'text/xml')
utility = sm.queryUtility(ITaxonomy, name=taxonomies[0])
result = adapter.exportDocument(utility)
self.render = lambda: result
return self.request.RESPONSE.redirect(
self.context.portal_url() + '/@@taxonomy-export?taxonomies=' + ','.join(taxonomies)) # noqa


class TaxonomySettingsControlPanel(controlpanel.ControlPanelFormWrapper):
form = TaxonomySettingsControlPanelForm


class TaxonomyExport(BrowserView):

def __call__(self, REQUEST):
taxonomies = REQUEST.get('taxonomies')
if not bool(taxonomies):
raise NotFound()

stream = BytesIO()
z_file = zipfile.ZipFile(
stream, "w", zipfile.ZIP_DEFLATED, True)
sm = self.context.getSiteManager()
adapter = TaxonomyImportExportAdapter(self.context)

for taxonomy in taxonomies.split(","):
utility = sm.queryUtility(ITaxonomy, name=taxonomy)
if utility is None:
continue
result = adapter.exportDocument(utility)
z_file.writestr("%s.xml" % taxonomy, result)

z_file.close()
self.request.RESPONSE.setHeader(
'Content-type', 'application/x-zip-compressed')
self.request.RESPONSE.setHeader(
'Content-disposition',
'attachment; filename="taxonomy_export.zip"')
return stream.getvalue()


class TaxonomyAddForm(form.AddForm):

fields = field.Fields(ITaxonomyForm)
Expand Down

0 comments on commit 0014da1

Please sign in to comment.