Skip to content

Commit bc4f452

Browse files
committed
feat(label-cmd): support new label cmd
Support new label command. Labels are general key value string to each app just for administration purpose. See workflow#597 This commit include database migration.
1 parent 06211a2 commit bc4f452

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.2 on 2016-11-19 16:11
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import jsonfield.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('api', '0020_release_failed'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='appsettings',
18+
name='label',
19+
field=jsonfield.fields.JSONField(blank=True, default={}),
20+
),
21+
]

rootfs/api/models/appsettings.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class AppSettings(UuidAuditedModel):
2323
# and user just updating other fields meaning the values needs to be copied from prev release
2424
whitelist = ArrayField(models.CharField(max_length=50), default=None)
2525
autoscale = JSONField(default={}, blank=True)
26+
label = JSONField(default={}, blank=True)
2627

2728
class Meta:
2829
get_latest_by = 'created'
@@ -133,6 +134,38 @@ def update_autoscale(self, previous_settings):
133134
if changes:
134135
self.summary += ["{} {}".format(self.owner, changes)]
135136

137+
def update_label(self, previous_settings):
138+
data = getattr(previous_settings, 'label', {}).copy()
139+
new = getattr(self, 'label', {}).copy()
140+
if not previous_settings:
141+
return
142+
143+
# if nothing changed copy the settings from previous
144+
if not new and data:
145+
setattr(self, 'label', data)
146+
elif data != new:
147+
for k, v in new.items():
148+
if v is not None:
149+
data[k] = v
150+
else:
151+
if k not in data:
152+
raise UnprocessableEntity('{} does not exist under {}'.format(k, 'label')) # noqa
153+
del data[k]
154+
setattr(self, 'label', data)
155+
156+
diff = dict_diff(self.label, getattr(previous_settings, 'label', {}))
157+
added = ', '.join(list(map(lambda x: 'default' if x == '' else x, [k for k in diff.get('added', {})]))) # noqa
158+
added = 'added label ' + added if added else ''
159+
changed = ', '.join(list(map(lambda x: 'default' if x == '' else x, [k for k in diff.get('changed', {})]))) # noqa
160+
changed = 'changed label ' + changed if changed else ''
161+
deleted = ', '.join(list(map(lambda x: 'default' if x == '' else x, [k for k in diff.get('deleted', {})]))) # noqa
162+
deleted = 'deleted label ' + deleted if deleted else ''
163+
changes = ', '.join(i for i in (added, changed, deleted) if i)
164+
if changes:
165+
if self.summary:
166+
self.summary += ' and '
167+
self.summary += ["{} {}".format(self.owner, changes)]
168+
136169
def save(self, *args, **kwargs):
137170
self.summary = []
138171
previous_settings = None
@@ -146,6 +179,7 @@ def save(self, *args, **kwargs):
146179
self.update_routable(previous_settings)
147180
self.update_whitelist(previous_settings)
148181
self.update_autoscale(previous_settings)
182+
self.update_label(previous_settings)
149183
except (UnprocessableEntity, NotFound):
150184
raise
151185
except Exception as e:

rootfs/api/serializers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,7 @@ class AppSettingsSerializer(serializers.ModelSerializer):
489489
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
490490
owner = serializers.ReadOnlyField(source='owner.username')
491491
autoscale = JSONFieldSerializer(convert_to_str=False, required=False, binary=True)
492+
label = JSONFieldSerializer(convert_to_str=False, required=False, binary=True)
492493

493494
class Meta:
494495
"""Metadata options for a :class:`AppSettingsSerializer`."""

0 commit comments

Comments
 (0)