-import os, tarfile, datetime, logging, re, ConfigParser, shutil
+import os, tarfile, datetime, logging, re, ConfigParser, shutil, zipfile
from django.core.cache import cache
from django.utils.translation import ugettext as _
EXPORT_STEPS = []
TMP_FOLDER = os.path.join(os.path.dirname(__file__), 'tmp')
-LAST_BACKUP = os.path.join(TMP_FOLDER, 'backup.tar.gz')
DATE_AND_AUTHOR_INF_SECTION = 'DateAndAuthor'
OPTIONS_INF_SECTION = 'Options'
tag = ET.SubElement(el, tag_name)
if content:
- tag.text = unicode(content)
+ try:
+ tag.text = unicode(content)
+ except:
+ tag.text = u''
for k, v in attrs.items():
tag.set(k, unicode(v))
tree = ET.ElementTree(root)
tree.write(os.path.join(tmp, filename), encoding='UTF-8')
-def create_targz(tmp, files, start_time, options, user, state, set_state):
- if os.path.exists(LAST_BACKUP):
- os.remove(LAST_BACKUP)
-
- t = tarfile.open(name=LAST_BACKUP, mode = 'w:gz')
+def create_targz(tmp, files, start_time, options, user, state, set_state, file_format):
+ now = datetime.datetime.now()
+ domain = re.match('[\w-]+\.[\w-]+(\.[\w-]+)*', djsettings.APP_URL)
+ if domain:
+ domain = '_'.join(domain.get(0).split('.'))
+ else:
+ domain = 'localhost'
+
+ fname = "%s-%s" % (domain, now.strftime('%Y%m%d%H%M'))
+ if file_format == 'zip':
+ full_fname = "%s.zip" % fname
+ else:
+ full_fname = "%s.tar.gz" % fname
+
+ if file_format == 'zip':
+ t = zipfile.ZipFile(os.path.join(selfsettings.EXPORTER_BACKUP_STORAGE, full_fname), 'w')
+
+ def add_to_file(f, a):
+ t.write(f, a)
+ else:
+ t = tarfile.open(os.path.join(selfsettings.EXPORTER_BACKUP_STORAGE, full_fname), mode = 'w:gz')
+
+ def add_to_file(f, a):
+ t.add(f, a)
state['overall']['status'] = _('Compressing xml files')
set_state()
for f in files:
- t.add(os.path.join(tmp, f), arcname="/%s" % f)
+ add_to_file(os.path.join(tmp, f), "/%s" % f)
if options.get('uplodaded_files', False):
state['overall']['status'] = _('Importing uploaded files')
state['overall']['status'] = _('Writing inf file.')
set_state()
- now = datetime.datetime.now()
- domain = re.match('[\w-]+\.[\w-]+(\.[\w-]+)*', djsettings.APP_URL)
- if domain:
- domain = '_'.join(domain.get(0).split('.'))
- else:
- domain = 'localhost'
-
- fname = "%s-%s" % (domain, now.strftime('%Y%m%d%H%M'))
-
inf = ConfigParser.SafeConfigParser()
inf.add_section(DATE_AND_AUTHOR_INF_SECTION)
- inf.set(DATE_AND_AUTHOR_INF_SECTION, 'file-name', "%s.tar.gz" % fname)
+ inf.set(DATE_AND_AUTHOR_INF_SECTION, 'file-name', full_fname)
inf.set(DATE_AND_AUTHOR_INF_SECTION, 'author', unicode(user.id))
inf.set(DATE_AND_AUTHOR_INF_SECTION, 'site', djsettings.APP_URL)
inf.set(DATE_AND_AUTHOR_INF_SECTION, 'started', start_time.strftime(DATETIME_FORMAT))
for id, s in state.items():
inf.set(META_INF_SECTION, id, str(s['count']))
- with open(os.path.join(tmp, 'backup.inf'), 'wb') as inffile:
+ with open(os.path.join(tmp, '%s.backup.inf' % fname), 'wb') as inffile:
inf.write(inffile)
- t.add(os.path.join(tmp, 'backup.inf'), arcname='backup.inf')
+ add_to_file(os.path.join(tmp, '%s.backup.inf' % fname), '/backup.inf')
state['overall']['status'] = _('Saving backup file')
set_state()
t.close()
- shutil.copyfile(LAST_BACKUP, os.path.join(selfsettings.EXPORTER_BACKUP_STORAGE, "%s.tar.gz" % fname))
- shutil.copyfile(os.path.join(tmp, 'backup.inf'), os.path.join(selfsettings.EXPORTER_BACKUP_STORAGE, "%s.backup.inf" % fname))
+ return full_fname
-
def export_upfiles(tf):
folder = str(settings.UPFILES_FOLDER)
state['overall']['status'] = _('Compressing files')
set_state()
- create_targz(tmp, dump_files, start_time, options, user, state, set_state)
+ fname = create_targz(tmp, dump_files, start_time, options, user, state, set_state, options['file_format'])
full_state['running'] = False
full_state['errors'] = False
state['overall']['status'] = _('Done')
+ state['overall']['fname'] = fname
set_state()
except Exception, e:
import settings as selsettings
from forum import settings
-from exporter import export, CACHE_KEY, EXPORT_STEPS, LAST_BACKUP, DATE_AND_AUTHOR_INF_SECTION, DATETIME_FORMAT
+from exporter import export, CACHE_KEY, EXPORT_STEPS, DATE_AND_AUTHOR_INF_SECTION, DATETIME_FORMAT
from importer import start_import
@admin_page
def download(request):
- fname = LAST_BACKUP
+ if request.GET and request.GET.get('file', None):
+ fname = os.path.join(selsettings.EXPORTER_BACKUP_STORAGE, request.GET.get('file'))
+ else:
+ raise Http404
if not os.path.exists(fname):
raise Http404
- response = HttpResponse(open(fname, 'rb').read(), content_type='application/x-gzip')
+ if fname.endswith('.gz'):
+ content_type='application/x-gzip'
+ filename = 'backup.tar.gz'
+ else:
+ content_type='application/zip'
+ filename = 'backup.zip'
+
+ response = HttpResponse(open(fname, 'rb').read(), content_type=content_type)
response['Content-Length'] = os.path.getsize(fname)
- response['Content-Disposition'] = 'attachment; filename=backup.tar.gz'
+ response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response