[mb-commits] branch, data-nes, updated. When creating relationships, don't override existing relationships

MusicBrainz Git Server <[email protected]> Mon, 04 Feb 2013 09:04:40 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1U2Hyi-0005hK-Ml@wiley>
The branch, data-nes has been updated
       via  http://git.musicbrainz.org/gitweb/?p=musicbrainz-server/core.git;a=commit;h=22226df9992faefdb58f3684a57cf72c9b1f77b7 (commit)
      from  http://git.musicbrainz.org/gitweb/?p=musicbrainz-server/core.git;a=commit;h=6a9f4af999e21c5f1866268cf3f25542b123aac9 (commit)

Summary of changes:
 .../Server/Controller/Edit/Relationship.pm         |  164 ++++++++++---------
 1 files changed, 86 insertions(+), 78 deletions(-)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 22226df9992faefdb58f3684a57cf72c9b1f77b7
Author: Oliver Charles <[email protected]>
Date:   Mon Feb 4 12:00:03 2013 +0000

    When creating relationships, don't override existing relationships

diff --git a/lib/MusicBrainz/Server/Controller/Edit/Relationship.pm b/lib/MusicBrainz/Server/Controller/Edit/Relationship.pm
index 3a256c9..dce1938 100644
--- a/lib/MusicBrainz/Server/Controller/Edit/Relationship.pm
+++ b/lib/MusicBrainz/Server/Controller/Edit/Relationship.pm
@@ -203,82 +203,78 @@ sub create : Local RequireAuth Edit
         $c->detach('/error_500');
     }
 
-    my ($source, $dest) = $c->model('MB')->with_nes_transaction(sub {
-        return ($source_model->get_by_gid($source_gid), $dest_model->get_by_gid($dest_gid));
-    });
+    $c->model('MB')->with_nes_transaction(sub {
+        my ($source, $dest) = ($source_model->get_by_gid($source_gid), $dest_model->get_by_gid($dest_gid));
 
-    if ($type0 eq $type1 && $source->gid == $dest->gid) {
-        $c->stash( message => l('A relationship requires 2 different entities') );
-        $c->detach('/error_500');
-    }
+        if ($type0 eq $type1 && $source->gid == $dest->gid) {
+            $c->stash( message => l('A relationship requires 2 different entities') );
+            $c->detach('/error_500');
+        }
 
-    my $tree = $c->model('LinkType')->get_tree($type0, $type1);
-    my %type_info = build_type_info($tree);
+        my $tree = $c->model('LinkType')->get_tree($type0, $type1);
+        my %type_info = build_type_info($tree);
+
+        if (!%type_info) {
+            $c->stash(
+                template => 'edit/relationship/cannot_create.tt',
+                type0 => $type0,
+                type1 => $type1
+            );
+            $c->detach;
+        }
 
-    if (!%type_info) {
         $c->stash(
-            template => 'edit/relationship/cannot_create.tt',
-            type0 => $type0,
-            type1 => $type1
+            root      => $tree,
+            type_info => JSON->new->latin1->encode(\%type_info),
         );
-        $c->detach;
-    }
-
-    $c->stash(
-        root      => $tree,
-        type_info => JSON->new->latin1->encode(\%type_info),
-    );
 
-    my $attr_tree = $c->model('LinkAttributeType')->get_tree();
-    $c->stash( attr_tree => $attr_tree );
-    $self->attr_tree($attr_tree);
+        my $attr_tree = $c->model('LinkAttributeType')->get_tree();
+        $c->stash( attr_tree => $attr_tree );
+        $self->attr_tree($attr_tree);
 
-    my $form = $c->form(
-        form => 'Relationship',
-        attr_tree => $attr_tree,
-        root => $tree
-    );
-    $c->stash(
-        source => $source, source_type => $type0,
-        dest   => $dest,   dest_type   => $type1
-    );
+        my $form = $c->form(
+            form => 'Relationship',
+            attr_tree => $attr_tree,
+            root => $tree
+        );
+        $c->stash(
+            source => $source, source_type => $type0,
+            dest   => $dest,   dest_type   => $type1
+        );
 
-    if ($c->form_posted && $form->submitted_and_valid($c->req->params)) {
-        my @attributes = $self->flatten_attributes($form->field('attrs'));
+        if ($c->form_posted && $form->submitted_and_valid($c->req->params)) {
+            my @attributes = $self->flatten_attributes($form->field('attrs'));
 
-        my $entity0 = $source;
-        my $entity1 = $dest;
+            my $entity0 = $source;
+            my $entity1 = $dest;
 
-        if ($type0 eq $type1 && $form->field('direction')->value)
-        {
-            ($entity0, $entity1) = ($entity1, $entity0);
-        }
+            if ($type0 eq $type1 && $form->field('direction')->value)
+                {
+                    ($entity0, $entity1) = ($entity1, $entity0);
+                }
 
-        $c->model('MB')->with_nes_transaction(sub {
             my $edit = $c->model('NES::Edit')->open;
-
-            $c->model('NES::Work')->update(
-                $edit, $c->user, $entity0,
-                MusicBrainz::Server::Entity::Tree::Work->new(
-                    relationships => [
-                        MusicBrainz::Server::Entity::NES::Relationship->new(
-                            link => MusicBrainz::Server::Entity::Link->new(
-                                type_id => $form->field('link_type_id')->value
-                            ),
-                            target => $entity1,
-                            target_type => 'work'
-                        )
-                    ]
-                )
-            );
-        });
-
-        delete $c->session->{relationship};
-        my $redirect = $c->req->params->{returnto} ||
-            $c->uri_for_action($c->controller(type_to_controller($type0))->action_for('show'), [ $source_gid ]);
-        $c->response->redirect($redirect);
-        $c->detach;
-    }
+            run_update($c, $edit, 'NES::Work', $entity0, sub {
+                my $rels = shift;
+                return [
+                    @$rels,
+                    MusicBrainz::Server::Entity::NES::Relationship->new(
+                        link => MusicBrainz::Server::Entity::Link->new(
+                            type_id => $form->field('link_type_id')->value
+                        ),
+                        target => $entity1,
+                        target_type => 'work'
+                    )
+                  ];
+            });
+
+            delete $c->session->{relationship};
+            my $redirect = $c->req->params->{returnto} ||
+                $c->uri_for_action($c->controller(type_to_controller($type0))->action_for('show'), [ $source_gid ]);
+            $c->response->redirect($redirect);
+            $c->detach;
+        }
+    });
 }
 
 sub create_url : Local RequireAuth Edit
@@ -347,20 +343,19 @@ sub create_url : Local RequireAuth Edit
             my @attributes = $self->flatten_attributes($form->field('attrs'));
             my $url = $c->model('NES::URL')->find_or_insert($edit, $c->user, $form->field('url')->value);
 
-            $c->model('NES::Work')->update(
-                $edit, $c->user, $entity,
-                MusicBrainz::Server::Entity::Tree::Work->new(
-                    relationships => [
-                        MusicBrainz::Server::Entity::NES::Relationship->new(
-                            link => MusicBrainz::Server::Entity::Link->new(
-                                type_id => $form->field('link_type_id')->value
-                            ),
-                            target => $url,
-                            target_type => 'url'
-                        )
-                    ]
-                )
-            );
+            run_update($c, $edit, 'NES::Work', $entity, sub {
+                my $rels = shift;
+                return [
+                    @$rels,
+                    MusicBrainz::Server::Entity::NES::Relationship->new(
+                        link => MusicBrainz::Server::Entity::Link->new(
+                            type_id => $form->field('link_type_id')->value
+                        ),
+                        target => $url,
+                        target_type => 'url'
+                    )
+                ]
+            });
 
             my $redirect = $c->controller(type_to_controller($type))->action_for('show');
             $c->response->redirect($c->uri_for_action($redirect, [ $gid ]));
@@ -369,6 +364,19 @@ sub create_url : Local RequireAuth Edit
     });
 }
 
+sub run_update {
+    my ($c, $edit, $m, $source, $update) = @_;
+
+    my $relationships = $c->model($m)->get_relationships($source);
+
+    $c->model('NES::Work')->update(
+        $edit, $c->user, $source,
+        MusicBrainz::Server::Entity::Tree::Work->new(
+            relationships => $update->($relationships)
+        )
+    );
+}
+
 sub delete : Local RequireAuth Edit
 {
     my ($self, $c) = @_;

-----------------------------------------------------------------------


hooks/post-receive
-- 
mb_server