add package dependencies
This commit is contained in:
parent
470815c859
commit
fd5f402d95
3 changed files with 50 additions and 0 deletions
20
src/c3nav/mapdata/migrations/0002_package_depends.py
Normal file
20
src/c3nav/mapdata/migrations/0002_package_depends.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.9 on 2016-09-04 12:20
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mapdata', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='package',
|
||||||
|
name='depends',
|
||||||
|
field=models.ManyToManyField(to='mapdata.Package'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -10,6 +10,7 @@ class Package(models.Model):
|
||||||
"""
|
"""
|
||||||
name = models.CharField(_('package identifier'), unique=True, max_length=50,
|
name = models.CharField(_('package identifier'), unique=True, max_length=50,
|
||||||
help_text=_('e.g. de.c3nav.33c3.base'))
|
help_text=_('e.g. de.c3nav.33c3.base'))
|
||||||
|
depends = models.ManyToManyField('Package')
|
||||||
|
|
||||||
bottom = models.DecimalField(_('bottom coordinate'), null=True, max_digits=6, decimal_places=2)
|
bottom = models.DecimalField(_('bottom coordinate'), null=True, max_digits=6, decimal_places=2)
|
||||||
left = models.DecimalField(_('left coordinate'), null=True, max_digits=6, decimal_places=2)
|
left = models.DecimalField(_('left coordinate'), null=True, max_digits=6, decimal_places=2)
|
||||||
|
@ -28,6 +29,11 @@ class Package(models.Model):
|
||||||
raise ValueError('pkg.json: missing package name.')
|
raise ValueError('pkg.json: missing package name.')
|
||||||
kwargs['name'] = data['name']
|
kwargs['name'] = data['name']
|
||||||
|
|
||||||
|
depends = data.get('depends', [])
|
||||||
|
if not isinstance(depends, list):
|
||||||
|
raise TypeError('pkg.json: depends has to be a list')
|
||||||
|
kwargs['depends'] = depends
|
||||||
|
|
||||||
if 'bounds' in data:
|
if 'bounds' in data:
|
||||||
bounds = data['bounds']
|
bounds = data['bounds']
|
||||||
if len(bounds) != 2 or len(bounds[0]) != 2 or len(bounds[1]) != 2:
|
if len(bounds) != 2 or len(bounds[0]) != 2 or len(bounds[1]) != 2:
|
||||||
|
@ -49,5 +55,7 @@ class Package(models.Model):
|
||||||
data['name'] = self.name
|
data['name'] = self.name
|
||||||
if self.bottom is not None:
|
if self.bottom is not None:
|
||||||
data['bounds'] = ((float(self.bottom), float(self.left)), (float(self.top), float(self.right)))
|
data['bounds'] = ((float(self.bottom), float(self.left)), (float(self.top), float(self.right)))
|
||||||
|
if self.depends.exists():
|
||||||
|
data['depends'] = tuple(package.name for package in self.depends.all().order_by('name'))
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
|
@ -39,7 +39,15 @@ class ObjectCollection:
|
||||||
|
|
||||||
def apply_to_db(self):
|
def apply_to_db(self):
|
||||||
for name, package in tuple(self.packages.items()):
|
for name, package in tuple(self.packages.items()):
|
||||||
|
for depname in package['depends']:
|
||||||
|
if depname not in self.packages:
|
||||||
|
raise CommandError('Missing dependency: %s' % depname)
|
||||||
|
|
||||||
|
for name, package in tuple(self.packages.items()):
|
||||||
|
package = package.copy()
|
||||||
|
orig_deps = package.pop('depends', [])
|
||||||
package, created = Package.objects.update_or_create(name=name, defaults=package)
|
package, created = Package.objects.update_or_create(name=name, defaults=package)
|
||||||
|
package.orig_deps = orig_deps
|
||||||
self.packages[name] = package
|
self.packages[name] = package
|
||||||
if created:
|
if created:
|
||||||
print('- Created package: '+name)
|
print('- Created package: '+name)
|
||||||
|
@ -70,6 +78,20 @@ class ObjectCollection:
|
||||||
print('- Deleted package: '+package.name)
|
print('- Deleted package: '+package.name)
|
||||||
package.delete()
|
package.delete()
|
||||||
|
|
||||||
|
for name, package in tuple(self.packages.items()):
|
||||||
|
has_deps = []
|
||||||
|
for dependency in tuple(package.depends.all()):
|
||||||
|
if dependency.name not in package.orig_deps:
|
||||||
|
package.depends.remove(dependency)
|
||||||
|
print('- Removed dependency: '+dependency.name)
|
||||||
|
else:
|
||||||
|
has_deps.append(dependency.name)
|
||||||
|
|
||||||
|
for depname in package.orig_deps:
|
||||||
|
if depname not in has_deps:
|
||||||
|
package.depends.add(self.packages[depname])
|
||||||
|
print('- Added dependency: '+depname)
|
||||||
|
|
||||||
|
|
||||||
def _preencode(data, magic_marker):
|
def _preencode(data, magic_marker):
|
||||||
if isinstance(data, dict):
|
if isinstance(data, dict):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue