r12291 - in mb_server/trunk: admin/sql lib/MusicBrainz/Server lib/MusicBrainz/Server/Controller lib/MusicBrainz/Server/Data lib/MusicBrainz/Server/Edit/Medium lib/MusicBrainz/Server/Edit/Tracklist lib/MusicBrainz/Server/Form t t/sql

View: New views
1 Messages — Rating Filter:   Alert me  

r12291 - in mb_server/trunk: admin/sql lib/MusicBrainz/Server lib/MusicBrainz/Server/Controller lib/MusicBrainz/Server/Data lib/MusicBrainz/Server/Edit/Medium lib/MusicBrainz/Server/Edit/Tracklist lib/MusicBrainz/Server/Form t t/sql

by root-97 :: Rate this Message:

Reply (Restricted by the Administrator) | Reply to Author | View Threaded | Show Only this Message

Author: acid2
Date: 2009-11-08 16:37:14 +0000 (Sun, 08 Nov 2009)
New Revision: 12291

Added:
   mb_server/trunk/lib/MusicBrainz/Server/Edit/Medium/Delete.pm
   mb_server/trunk/lib/MusicBrainz/Server/Edit/Tracklist/Create.pm
   mb_server/trunk/t/controller_release_edit.t
   mb_server/trunk/t/edit_medium_delete.t
   mb_server/trunk/t/edit_tracklist_create.t
   mb_server/trunk/t/sql/create_tracklist.sql
Modified:
   mb_server/trunk/admin/sql/InsertTestData.sql
   mb_server/trunk/lib/MusicBrainz/Server/Constants.pm
   mb_server/trunk/lib/MusicBrainz/Server/Controller/Release.pm
   mb_server/trunk/lib/MusicBrainz/Server/Data/Tracklist.pm
   mb_server/trunk/lib/MusicBrainz/Server/Edit/Tracklist/AddTrack.pm
   mb_server/trunk/lib/MusicBrainz/Server/EditRegistry.pm
   mb_server/trunk/lib/MusicBrainz/Server/Form/Release.pm
   mb_server/trunk/t/data_tracklist.t
Log:
Support for entering all the edit release edit types

See review 453

Modified: mb_server/trunk/admin/sql/InsertTestData.sql
===================================================================
--- mb_server/trunk/admin/sql/InsertTestData.sql 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/admin/sql/InsertTestData.sql 2009-11-08 16:37:14 UTC (rev 12291)
@@ -119,20 +119,24 @@
 TRUNCATE release_status CASCADE;
 
 INSERT INTO release_status (id, name) VALUES (1, 'Official');
+INSERT INTO release_status (id, name) VALUES (2, 'Promotional');
 
 TRUNCATE release_packaging CASCADE;
 
 INSERT INTO release_packaging (id, name) VALUES (1, 'Jewel Case');
+INSERT INTO release_packaging (id, name) VALUES (2, 'Digipak');
 
 TRUNCATE language CASCADE;
 
 INSERT INTO language (id, isocode_3t, isocode_3b, isocode_2, name, frequency)
-    VALUES (1, 'deu', 'ger', 'de', 'German', 2);
+    VALUES (1, 'deu', 'ger', 'de', 'German', 2),
+           (2, 'lit', 'lit', 'lt', 'Lithuanian', 1);
 
 TRUNCATE script CASCADE;
 
 INSERT INTO script (id, isocode, isonumber, name, frequency)
-    VALUES (1, 'Ugar', '040', 'Ugaritic', 2);
+    VALUES (1, 'Ugar', '040', 'Ugaritic', 2),
+           (2, 'Hebr', '125', 'Hebrew', 4);
 
 TRUNCATE label_type CASCADE;
 
@@ -462,6 +466,7 @@
 ALTER SEQUENCE artist_id_seq RESTART 10;
 ALTER SEQUENCE artist_credit_id_seq RESTART 5;
 ALTER SEQUENCE label_id_seq RESTART 4;
+ALTER SEQUENCE medium_id_seq RESTART 7;
 ALTER SEQUENCE recording_id_seq RESTART 18;
 ALTER SEQUENCE release_id_seq RESTART 4;
 ALTER SEQUENCE release_group_id_seq RESTART 5;
@@ -477,6 +482,8 @@
 
 ALTER SEQUENCE artist_alias_id_seq RESTART 8;
 ALTER SEQUENCE label_alias_id_seq RESTART 8;
+ALTER SEQUENCE track_id_seq RESTART 20;
+ALTER SEQUENCE medium_id_seq RESTART 7;
 
 ALTER SEQUENCE tag_id_seq RESTART 100;
 

Modified: mb_server/trunk/lib/MusicBrainz/Server/Constants.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Constants.pm 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/lib/MusicBrainz/Server/Constants.pm 2009-11-08 16:37:14 UTC (rev 12291)
@@ -75,12 +75,13 @@
 
 Readonly our $EDIT_MEDIUM_CREATE => 51;
 Readonly our $EDIT_MEDIUM_EDIT => 52;
+Readonly our $EDIT_MEDIUM_DELETE => 53;
 
 Readonly our $EDIT_TRACK_EDIT => 62;
 
 Readonly our $EDIT_RECORDING_ADD_ANNOTATION => 75;
 
-
+Readonly our $EDIT_TRACKLIST_CREATE => 81;
 Readonly our $EDIT_TRACKLIST_ADDTRACK => 85;
 Readonly our $EDIT_TRACKLIST_DELETETRACK => 86;
 

Modified: mb_server/trunk/lib/MusicBrainz/Server/Controller/Release.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Controller/Release.pm 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/lib/MusicBrainz/Server/Controller/Release.pm 2009-11-08 16:37:14 UTC (rev 12291)
@@ -15,7 +15,16 @@
 use MusicBrainz::Server::Adapter qw(Google);
 use MusicBrainz::Server::Controller::TagRole;
 
-use MusicBrainz::Server::Constants qw( $EDIT_RELEASE_EDIT );
+use MusicBrainz::Server::Constants qw(
+    $EDIT_RELEASE_EDIT
+    $EDIT_TRACK_EDIT
+    $EDIT_TRACKLIST_DELETETRACK
+    $EDIT_TRACKLIST_ADDTRACK
+    $EDIT_TRACKLIST_CREATE
+    $EDIT_MEDIUM_CREATE
+    $EDIT_MEDIUM_DELETE
+    $EDIT_MEDIUM_EDIT
+);
 
 # A duration lookup has to match within this many milliseconds
 use constant DURATION_LOOKUP_RANGE => 10000;
@@ -317,22 +326,117 @@
 
     my $form = $c->form(form => 'Release', init_object => $release);
     if ($c->form_posted && $form->submitted_and_valid($c->req->params)) {
-        my %args = map { $_ => $form->field($_)->value }
-            qw( name comment packaging_id status_id script_id language_id
-                country_id barcode artist_credit date );
-
-        my $edit = $c->model('Edit')->create(
-            edit_type => $EDIT_RELEASE_EDIT,
-            editor_id => $c->user->id,
+        my $release_edit = $self->_create_edit($c, $EDIT_RELEASE_EDIT,
+            $form => [qw( name comment packaging_id status_id script_id language_id
+                         country_id barcode artist_credit date )],
             release => $release,
-            %args
-        );
+        ),
 
+        my %track_id = map { $_->id => $_ } @tracks;
+        my %medium_id = map { $_->id => $_ } @mediums;
+
+        for my $medium_field ($form->field('mediums')->fields) {
+            # Editing mediums
+            # First check if we need to create a new tracklist
+            my $tracklist_id = $medium_field->field('tracklist')->field('id')->value;
+
+            # Editing tracks
+            for my $track_field ($medium_field->field('tracklist')->field('tracks')->fields) {
+                if ($track_field->field('id')->has_value) {
+                    my $track = $track_id{ $track_field->field('id')->value };
+                    if ($track_field->field('deleted')->value) {
+                        $c->model('Edit')->create(
+                            editor_id => $c->user->id,
+                            edit_type => $EDIT_TRACKLIST_DELETETRACK,
+                            track_id => $track->id
+                        );
+                    }
+                    else {
+                        # Editing an existing track
+                        $self->_create_edit($c, $EDIT_TRACK_EDIT,
+                            $track_field => [qw( position name artist_credit )],
+                            track => $track,
+                        );
+                    }
+                }
+                elsif ($tracklist_id) {
+                    # We are creating a new track (and not a new tracklist)
+                    $self->_create_edit($c, $EDIT_TRACKLIST_ADDTRACK,
+                        $track_field => [qw( position name artist_credit )],
+                        tracklist_id => $tracklist_id,
+                    );
+                }
+            }
+
+            my $has_tracks = $medium_field->field('tracklist')->field('tracks')->has_fields;
+            if(!$tracklist_id && $has_tracks) {
+                # We have some tracks but no tracklist ID - so create a new tracklist
+                my @tracks = map { +{
+                    name          => $_->field('name')->value,
+                    position      => $_->field('position')->value,
+                    artist_credit => $_->field('artist_credit')->value,
+                } } $medium_field->field('tracklist')->field('tracks')->fields;
+
+                my $create_tl = $c->model('Edit')->create(
+                    editor_id => $c->user->id,
+                    edit_type => $EDIT_TRACKLIST_CREATE,
+                    tracks    => \@tracks,
+                );
+
+                $tracklist_id = $create_tl->tracklist_id;
+            }
+
+            if($medium_field->field('id')->has_value) {
+                my $medium = $medium_id{ $medium_field->field('id')->value };
+                # Edit existing medium
+                if($medium_field->field('deleted')->value) {
+                    $c->model('Edit')->create(
+                        editor_id => $c->user->id,
+                        edit_type => $EDIT_MEDIUM_DELETE,
+                        medium_id => $medium->id
+                    );
+                }
+                else {
+                    $self->_create_edit(
+                        $c, $EDIT_MEDIUM_EDIT,
+                        $medium_field => [qw( name format_id position )],
+                        medium => $medium
+                    );
+                }
+            }
+            else {
+                # Create a new medium
+                $self->_create_edit($c, $EDIT_MEDIUM_CREATE,
+                    $medium_field => [qw( name format_id position )],
+                    tracklist_id => $tracklist_id,
+                    release_id => $release->id
+                );
+            }
+        }
+
         $c->response->redirect($c->uri_for_action('/release/show', [ $release->gid ]));
         $c->detach;
     }
 }
 
+sub _create_edit {
+    my ($self, $c, $type, $parent, $fields, %extra) = @_;
+
+    my %args = map { $_ => $parent->field($_)->value }
+        grep { $parent->field($_)->has_value }
+            @$fields;
+
+    return unless %args;
+
+    $args{$_} = $extra{$_} for keys %extra;
+
+    $c->model('Edit')->create(
+        edit_type => $type,
+        editor_id => $c->user->id,
+        %args,
+    );
+}
+
 =head2 duplicate
 
 Duplicate a release into the add release editor

Modified: mb_server/trunk/lib/MusicBrainz/Server/Data/Tracklist.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Data/Tracklist.pm 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/lib/MusicBrainz/Server/Data/Tracklist.pm 2009-11-08 16:37:14 UTC (rev 12291)
@@ -2,6 +2,7 @@
 
 use Moose;
 use MusicBrainz::Server::Entity::Tracklist;
+use MusicBrainz::Server::Data::Utils qw( load_subobjects placeholders );
 
 extends 'MusicBrainz::Server::Data::Entity';
 
@@ -29,6 +30,34 @@
     $sql->do($query, $offset, $start_position, $tracklist_id);
 }
 
+sub insert
+{
+    my ($self, $tracks) = @_;
+    my $sql = Sql->new($self->c->dbh);
+    my $id = $sql->insert_row('tracklist', { trackcount => 0 }, 'id');
+    my @tracks = @$tracks;
+    $_->{tracklist} = $id for @tracks;
+    $self->c->model('Track')->insert(@tracks);
+    my $class = $self->_entity_class;
+    return $class->new( id => $id );
+}
+
+sub delete
+{
+    my ($self, @tracklist_ids) = @_;
+    my $sql = Sql->new($self->c->dbh);
+    my $query = 'DELETE FROM track WHERE tracklist IN (' . placeholders(@tracklist_ids). ')';
+    $sql->do($query, @tracklist_ids);
+    $query = 'DELETE FROM tracklist WHERE id IN ('. placeholders(@tracklist_ids) . ')';
+    $sql->do($query, @tracklist_ids);
+}
+
+sub load
+{
+    my ($self, @objs) = @_;
+    load_subobjects($self, 'tracklist', @objs);
+}
+
 __PACKAGE__->meta->make_immutable;
 no Moose;
 1;

Modified: mb_server/trunk/lib/MusicBrainz/Server/Edit/Tracklist/AddTrack.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Edit/Tracklist/AddTrack.pm 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/lib/MusicBrainz/Server/Edit/Tracklist/AddTrack.pm 2009-11-08 16:37:14 UTC (rev 12291)
@@ -83,6 +83,8 @@
     $self->track_id(delete $hash->{track_id});
 };
 
+sub _xml_arguments { ForceArray => [ 'artist_credit' ] }
+
 __PACKAGE__->meta->make_immutable;
 no Moose;
 

Modified: mb_server/trunk/lib/MusicBrainz/Server/EditRegistry.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/EditRegistry.pm 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/lib/MusicBrainz/Server/EditRegistry.pm 2009-11-08 16:37:14 UTC (rev 12291)
@@ -21,6 +21,7 @@
     MusicBrainz::Server::Edit::Label::Edit
     MusicBrainz::Server::Edit::Label::Merge
     MusicBrainz::Server::Edit::Medium::Create
+    MusicBrainz::Server::Edit::Medium::Delete
     MusicBrainz::Server::Edit::Medium::Edit
     MusicBrainz::Server::Edit::Recording::AddAnnotation
     MusicBrainz::Server::Edit::Relationship::Edit
@@ -35,6 +36,7 @@
     MusicBrainz::Server::Edit::ReleaseGroup::Merge
     MusicBrainz::Server::Edit::Track::Edit
     MusicBrainz::Server::Edit::Tracklist::AddTrack
+    MusicBrainz::Server::Edit::Tracklist::Create
     MusicBrainz::Server::Edit::Tracklist::DeleteTrack
     MusicBrainz::Server::Edit::WikiDoc::Change
     MusicBrainz::Server::Edit::Work::AddAnnotation

Modified: mb_server/trunk/lib/MusicBrainz/Server/Form/Release.pm
===================================================================
--- mb_server/trunk/lib/MusicBrainz/Server/Form/Release.pm 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/lib/MusicBrainz/Server/Form/Release.pm 2009-11-08 16:37:14 UTC (rev 12291)
@@ -18,7 +18,6 @@
 
 has_field 'artist_credit' => (
     type => '+MusicBrainz::Server::Form::Field::ArtistCredit',
-    required => 1,
 );
 
 has_field 'barcode' => (
@@ -54,14 +53,23 @@
 has_field 'labels.deleted' => ( type => 'Checkbox' );
 has_field 'labels.label_id' => ( type => 'Text' );
 
-has_field 'mediums' => ( type => 'Repeatable' );
+has_field 'mediums' => (
+    num_when_empty => 0,
+    type => 'Repeatable'
+);
+has_field 'mediums.id' => ( type => 'Integer' );
 has_field 'mediums.name' => ( type => 'Text' );
-has_field 'mediums.remove' => ( type => 'Checkbox' );
+has_field 'mediums.deleted' => ( type => 'Checkbox' );
 has_field 'mediums.format_id' => ( type => 'Select' );
 has_field 'mediums.position' => ( type => 'Integer' );
 
 has_field 'mediums.tracklist' => ( type => 'Compound' );
-has_field 'mediums.tracklist.tracks' => ( type => 'Repeatable' );
+has_field 'mediums.tracklist.id' => ( type => 'Integer' );
+has_field 'mediums.tracklist.tracks' => (
+    num_when_empty => 0,
+    type => 'Repeatable'
+);
+has_field 'mediums.tracklist.tracks.id' => ( type => 'Integer' );
 has_field 'mediums.tracklist.tracks.position' => ( type => 'Integer' );
 has_field 'mediums.tracklist.tracks.name' => ( type => 'Text' );
 has_field 'mediums.tracklist.tracks.artist_credit' => ( type => '+MusicBrainz::Server::Form::Field::ArtistCredit' );

Modified: mb_server/trunk/t/data_tracklist.t
===================================================================
--- mb_server/trunk/t/data_tracklist.t 2009-11-08 14:43:39 UTC (rev 12290)
+++ mb_server/trunk/t/data_tracklist.t 2009-11-08 16:37:14 UTC (rev 12291)
@@ -45,4 +45,30 @@
     is($tracklist1->tracks->[6]->position, 8);
 }, $sql);
 
+my $tracklist = $tracklist_data->insert([{
+    name => 'Track 1',
+    position => 1,
+    artist_credit => 1,
+    recording => 1
+}, {
+    name => 'Track 2',
+    position => 2,
+    artist_credit => 1,
+    recording => 2
+}]);
+isa_ok($tracklist, 'MusicBrainz::Server::Entity::Tracklist');
+
+$tracklist = $tracklist_data->get_by_id($tracklist->id);
+$track_data->load_for_tracklists($tracklist);
+is($tracklist->track_count, 2);
+is($tracklist->all_tracks, 2);
+is($tracklist->tracks->[0]->name, 'Track 1');
+is($tracklist->tracks->[0]->position, 1);
+is($tracklist->tracks->[0]->artist_credit_id, 1);
+is($tracklist->tracks->[0]->recording_id, 1);
+is($tracklist->tracks->[1]->name, 'Track 2');
+is($tracklist->tracks->[1]->position, 2);
+is($tracklist->tracks->[1]->artist_credit_id, 1);
+is($tracklist->tracks->[1]->recording_id, 2);
+
 done_testing;


_______________________________________________
MusicBrainz-commits mailing list
MusicBrainz-commits@...
http://lists.musicbrainz.org/mailman/listinfo/musicbrainz-commits