diff --git a/daemon.py b/daemon.py
index 6c4b31b3e..60fc2a744 100644
--- a/daemon.py
+++ b/daemon.py
@@ -256,6 +256,7 @@ from cache import checkForChangedActor
from cache import storePersonInCache
from cache import getPersonFromCache
from httpsig import verifyPostHeaders
+from theme import exportTheme
from theme import isNewsThemeName
from theme import getTextModeBanner
from theme import setNewsAvatar
@@ -4135,6 +4136,18 @@ class PubServer(BaseHTTPRequestHandler):
welcomeScreenIsComplete(self.server.baseDir, nickname,
self.server.domain)
onFinalWelcomeScreen = True
+ elif 'name="submitExportTheme"' in postBytesStr:
+ print('submitExportTheme')
+ themeDownloadPath = actorStr
+ if exportTheme(self.server.baseDir,
+ self.server.themeName):
+ themeDownloadPath += \
+ '/exports/' + self.server.themeName + '.zip'
+ print('submitExportTheme path=' + themeDownloadPath)
+ self._redirect_headers(themeDownloadPath,
+ cookie, callingDomain)
+ self.server.POSTbusy = False
+ return
# extract all of the text fields into a dict
fields = \
@@ -5483,6 +5496,23 @@ class PubServer(BaseHTTPRequestHandler):
None, callingDomain)
self._write(msg)
+ def _getExportedTheme(self, callingDomain: str, path: str,
+ baseDir: str, domainFull: str,
+ debug: bool) -> None:
+ """Returns an exported theme zip file
+ """
+ filename = path.split('/exports/', 1)[1]
+ filename = baseDir + '/exports/' + filename
+ if os.path.isfile(filename):
+ with open(filename, 'rb') as fp:
+ exportBinary = fp.read()
+ exportType = 'application/zip'
+ self._set_headers_etag(filename, exportType,
+ exportBinary, None,
+ domainFull)
+ self._write(exportBinary)
+ self._404()
+
def _getFonts(self, callingDomain: str, path: str,
baseDir: str, debug: bool,
GETstartTime, GETtimings: {}) -> None:
@@ -10815,6 +10845,13 @@ class PubServer(BaseHTTPRequestHandler):
GETstartTime, GETtimings):
return
+ if authorized and '/exports/' in self.path:
+ self._getExportedTheme(callingDomain, self.path,
+ self.server.baseDir,
+ self.server.domainFull,
+ self.server.debug)
+ return
+
# get fonts
if '/fonts/' in self.path:
self._getFonts(callingDomain, self.path,
diff --git a/theme.py b/theme.py
index 4aec87b13..894ee0cc0 100644
--- a/theme.py
+++ b/theme.py
@@ -11,9 +11,28 @@ from utils import loadJson
from utils import saveJson
from utils import getImageExtensions
from shutil import copyfile
+from shutil import make_archive
from content import dangerousCSS
+def exportTheme(baseDir: str, theme: str) -> bool:
+ """Exports a theme as a zip file
+ """
+ themeDir = baseDir + '/theme/' + theme
+ if not os.path.isfile(themeDir + '/theme.json'):
+ return False
+ if not os.path.isdir(baseDir + '/exports'):
+ os.mkdir(baseDir + '/exports')
+ exportFilename = baseDir + '/exports/' + theme + '.zip'
+ if os.path.isfile(exportFilename):
+ os.remove(exportFilename)
+ try:
+ make_archive(baseDir + '/exports/' + theme, 'zip', themeDir)
+ except BaseException:
+ pass
+ return os.path.isfile(exportFilename)
+
+
def _getThemeFiles() -> []:
"""Gets the list of theme style sheets
"""
diff --git a/webapp_profile.py b/webapp_profile.py
index 4f4dac110..19d8ce03e 100644
--- a/webapp_profile.py
+++ b/webapp_profile.py
@@ -1347,7 +1347,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str,
translate['Export Theme'] + '
\n'
graphicsStr += \
' \n'
+ 'name="submitExportTheme">➤\n'
graphicsStr += ' \n'