applications: move bundle creation to be a method (#70501)
This commit is contained in:
parent
1475e2b72e
commit
687de551e4
|
@ -16,11 +16,13 @@
|
|||
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import tarfile
|
||||
import urllib.parse
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.postgres.fields import JSONField
|
||||
from django.core.files.base import ContentFile
|
||||
from django.db import models
|
||||
from django.utils.text import slugify
|
||||
from django.utils.timezone import now
|
||||
|
@ -139,6 +141,54 @@ class Version(models.Model):
|
|||
def __repr__(self):
|
||||
return '<Version %s>' % self.application.slug
|
||||
|
||||
def create_bundle(self):
|
||||
app = self.application
|
||||
elements = app.scandeps()
|
||||
tar_io = io.BytesIO()
|
||||
with tarfile.open(mode='w', fileobj=tar_io) as tar:
|
||||
manifest_json = {
|
||||
'application': app.name,
|
||||
'slug': app.slug,
|
||||
'description': app.description,
|
||||
'documentation_url': app.documentation_url,
|
||||
'icon': os.path.basename(app.icon.name) if app.icon.name else None,
|
||||
'version_number': self.number,
|
||||
'version_notes': self.notes,
|
||||
'elements': [],
|
||||
}
|
||||
|
||||
for element, relation in elements.values():
|
||||
manifest_json['elements'].append(
|
||||
{
|
||||
'type': element.type,
|
||||
'slug': element.slug,
|
||||
'name': element.name,
|
||||
'auto-dependency': relation.auto_dependency,
|
||||
}
|
||||
)
|
||||
|
||||
response = requests.get(element.cache['urls']['export'])
|
||||
tarinfo = tarfile.TarInfo('%s/%s' % (element.type, element.slug))
|
||||
tarinfo.mtime = self.last_update_timestamp.timestamp()
|
||||
tarinfo.size = int(response.headers['content-length'])
|
||||
tar.addfile(tarinfo, fileobj=io.BytesIO(response.content))
|
||||
|
||||
manifest_fd = io.BytesIO(json.dumps(manifest_json, indent=2).encode())
|
||||
tarinfo = tarfile.TarInfo('manifest.json')
|
||||
tarinfo.size = len(manifest_fd.getvalue())
|
||||
tarinfo.mtime = self.last_update_timestamp.timestamp()
|
||||
tar.addfile(tarinfo, fileobj=manifest_fd)
|
||||
|
||||
if app.icon.name:
|
||||
icon_fd = app.icon.file
|
||||
tarinfo = tarfile.TarInfo(manifest_json['icon'])
|
||||
tarinfo.size = icon_fd.size
|
||||
tarinfo.mtime = self.last_update_timestamp.timestamp()
|
||||
tar.addfile(tarinfo, fileobj=icon_fd)
|
||||
|
||||
self.bundle.save('%s.tar' % app.slug, content=ContentFile(tar_io.getvalue()))
|
||||
self.save()
|
||||
|
||||
def deploy(self):
|
||||
bundle_content = self.bundle.read()
|
||||
self.deploy_roles(bundle_content)
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import tarfile
|
||||
import urllib.parse
|
||||
|
||||
|
@ -207,7 +206,6 @@ class GenerateView(FormView):
|
|||
|
||||
def form_valid(self, form):
|
||||
app = self.app
|
||||
elements = app.scandeps()
|
||||
|
||||
version = (
|
||||
app.version_set.filter(number=form.cleaned_data['number'])
|
||||
|
@ -219,51 +217,7 @@ class GenerateView(FormView):
|
|||
version.number = form.cleaned_data['number']
|
||||
version.notes = form.cleaned_data['notes']
|
||||
version.save()
|
||||
|
||||
tar_io = io.BytesIO()
|
||||
with tarfile.open(mode='w', fileobj=tar_io) as tar:
|
||||
manifest_json = {
|
||||
'application': app.name,
|
||||
'slug': app.slug,
|
||||
'icon': os.path.basename(app.icon.name) if app.icon.name else None,
|
||||
'description': app.description,
|
||||
'documentation_url': app.documentation_url,
|
||||
'version_number': version.number,
|
||||
'version_notes': version.notes,
|
||||
'elements': [],
|
||||
}
|
||||
|
||||
for element, relation in elements.values():
|
||||
manifest_json['elements'].append(
|
||||
{
|
||||
'type': element.type,
|
||||
'slug': element.slug,
|
||||
'name': element.name,
|
||||
'auto-dependency': relation.auto_dependency,
|
||||
}
|
||||
)
|
||||
|
||||
response = requests.get(element.cache['urls']['export'])
|
||||
tarinfo = tarfile.TarInfo('%s/%s' % (element.type, element.slug))
|
||||
tarinfo.mtime = version.last_update_timestamp.timestamp()
|
||||
tarinfo.size = int(response.headers['content-length'])
|
||||
tar.addfile(tarinfo, fileobj=io.BytesIO(response.content))
|
||||
|
||||
manifest_fd = io.BytesIO(json.dumps(manifest_json, indent=2).encode())
|
||||
tarinfo = tarfile.TarInfo('manifest.json')
|
||||
tarinfo.size = len(manifest_fd.getvalue())
|
||||
tarinfo.mtime = version.last_update_timestamp.timestamp()
|
||||
tar.addfile(tarinfo, fileobj=manifest_fd)
|
||||
|
||||
if app.icon.name:
|
||||
icon_fd = app.icon.file
|
||||
tarinfo = tarfile.TarInfo(manifest_json['icon'])
|
||||
tarinfo.size = icon_fd.size
|
||||
tarinfo.mtime = version.last_update_timestamp.timestamp()
|
||||
tar.addfile(tarinfo, fileobj=icon_fd)
|
||||
|
||||
version.bundle.save('%s.tar' % self.kwargs['app_slug'], content=ContentFile(tar_io.getvalue()))
|
||||
version.save()
|
||||
version.create_bundle()
|
||||
|
||||
return super().form_valid(form)
|
||||
|
||||
|
|
Loading…
Reference in New Issue