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