Skip to content

Commit

Permalink
Clone OSBS together with components
Browse files Browse the repository at this point in the history
When a new release is cloned from an old one, its components will get
cloned. With this patch, the osbs record is cloned as well, so the list
will not need to be populated again.

JIRA: PDC-958
  • Loading branch information
lubomir committed Oct 5, 2015
1 parent afad489 commit d8ba479
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 0 deletions.
6 changes: 6 additions & 0 deletions pdc/apps/component/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from pdc.apps.common import hacks
from pdc.apps.release.models import Release
from pdc.apps.release import signals
from .signals import releasecomponent_clone


__all__ = [
Expand Down Expand Up @@ -351,6 +352,11 @@ def clone_release_components_and_groups(sender, request, original_release, relea
request.changeset.add("ReleaseComponent", rc.pk, "null", json.dumps(rc.export()))
rc_map[org_rc_pk] = rc

releasecomponent_clone.send(sender=rc.__class__,
request=request,
orig_component_pk=org_rc_pk,
component=rc)

for group in ReleaseComponentGroup.objects.filter(release=original_release):
group_type = group.group_type
description = group.description
Expand Down
8 changes: 8 additions & 0 deletions pdc/apps/component/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@

# This signal is sent after an existing release_component is updated.
releasecomponent_serializer_post_update = dispatch.Signal(providing_args=['release_component'])


# This signal is sent after a release component is cloned. It is a reaction to
# `pdc.apps.release.signals.release_clone` signal. The handler will get access
# to request, primary key of the cloned component and the new instance.
releasecomponent_clone = dispatch.Signal(providing_args=['request',
'orig_component_pk',
'new_component'])
14 changes: 14 additions & 0 deletions pdc/apps/osbs/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
# Licensed under The MIT License (MIT)
# http://opensource.org/licenses/MIT
#
import json

from django.dispatch import receiver
from django.db.models.signals import post_save

from . import models
from pdc.apps.component import signals as component_signals
from pdc.apps.component import models as component_models


Expand Down Expand Up @@ -34,3 +37,14 @@ def type_post_save_handler(sender, instance, **kwargs):
)
else:
models.OSBSRecord.objects.filter(component__type=instance).delete()


@receiver(component_signals.releasecomponent_clone)
def clone_osbs_record(sender, request, orig_component_pk, component, **kwargs):
if not component.type.has_osbs:
return
old_record = models.OSBSRecord.objects.get(component_id=orig_component_pk)
component.osbs.autorebuild = old_record.autorebuild
component.osbs.save()
request.changeset.add('osbsrecord', component.osbs.pk,
'null', json.dumps(component.osbs.export()))
10 changes: 10 additions & 0 deletions pdc/apps/osbs/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,13 @@ def test_can_unset_autorebuild(self):
self.assertNumChanges([1])
r = models.OSBSRecord.objects.get(component_id=1)
self.assertIsNone(r.autorebuild)

def test_cloning_release_clones_osbs(self):
self.client.post(reverse('releaseclone-list'),
{'old_release_id': 'release-1.0', 'version': '1.1'},
format='json')
records = models.OSBSRecord.objects.filter(component__release__release_id='release-1.1')
self.assertEqual(2, len(records))
self.assertTrue(records.get(component__name='python27').autorebuild)
self.assertFalse(records.get(component__name='MySQL-python').autorebuild)
self.assertNumChanges([6]) # 1 release, 3 components, 2 osbs records

0 comments on commit d8ba479

Please sign in to comment.