Add support for synchronizing bootstrap setups available with the official repository

This commit is contained in:
Roberto Rosario
2012-12-11 01:22:46 -04:00
parent 74689a970d
commit 1743ce93f2
8 changed files with 76 additions and 12 deletions
+34 -5
View File
@@ -6,9 +6,13 @@ import requests
from django.db import models
from django.core import serializers
from django.utils.simplejson import loads
from django.db import IntegrityError
from django.db.models import Q
from .classes import BootstrapModel, FixtureMetadata
from .literals import (FIXTURE_TYPE_FIXTURE_PROCESS, FIXTURE_TYPE_EMPTY_FIXTURE)
from .literals import (FIXTURE_TYPE_FIXTURE_PROCESS, FIXTURE_TYPE_EMPTY_FIXTURE,
BOOTSTRAP_REPOSITORY_URL, BOOTSTRAP_REPOSITORY_INDEX_FILE)
logger = logging.getLogger(__name__)
@@ -28,19 +32,44 @@ class BootstrapSetupManager(models.Manager):
result.append(model_fixture)
return FIXTURE_TYPE_FIXTURE_PROCESS[serialization_format]('\n'.join(result))
def import_setup(self, file_data):
def import_setup(self, file_data, overwrite=False):
BootstrapModel.check_magic_number(file_data)
metadata = FixtureMetadata.read_all(file_data)
instance = self.model(fixture=file_data, **metadata)
instance.save(update_metadata=False)
try:
instance.save(update_metadata=False)
except IntegrityError:
if not overwrite:
raise
else:
# Delete conflicting bootstrap setups
query = Q()
if 'slug' in metadata:
query = query | Q(slug=metadata['slug'])
if 'name' in metadata:
query = query | Q(name=metadata['name'])
self.model.objects.filter(query).delete()
self.import_setup(file_data)
def import_from_file(self, files):
file_data = files.read()
self.import_setup(file_data)
def import_from_url(self, url):
def import_from_url(self, url, **kwargs):
response = requests.get(url)
if response.status_code == requests.codes.ok:
self.import_setup(response.text)
self.import_setup(response.text, **kwargs)
else:
response.raise_for_status()
def repository_sync(self):
response = requests.get('%s/%s' % (BOOTSTRAP_REPOSITORY_URL, BOOTSTRAP_REPOSITORY_INDEX_FILE))
if response.status_code == requests.codes.ok:
for entry in loads(response.text):
bootstrap_setup_url = '%s/%s' % (BOOTSTRAP_REPOSITORY_URL, entry['filename'])
self.import_from_url(bootstrap_setup_url, overwrite=True)
else:
response.raise_for_status()