applications: move bundle creation to be a method (#70501)

This commit is contained in:
Frédéric Péters 2022-10-30 11:20:24 +01:00
parent 1475e2b72e
commit 687de551e4
2 changed files with 51 additions and 47 deletions

View File

@ -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)

View File

@ -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)