[mb-commits] r9900 - in mb_server/branches/TemplateToolkit: lib/MusicBrainz/Server/Controller root/artist root/forms/user root/user

root at musicbrainz.org root at musicbrainz.org
Sun Jun 29 16:09:08 UTC 2008


Author: acid2
Date: 2008-06-29 16:09:08 +0000 (Sun, 29 Jun 2008)
New Revision: 9900

Added:
   mb_server/branches/TemplateToolkit/root/forms/user/preferences.fb
   mb_server/branches/TemplateToolkit/root/user/preferences.tt
Modified:
   mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm
   mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/User.pm
   mb_server/branches/TemplateToolkit/root/artist/show.tt
   mb_server/branches/TemplateToolkit/root/forms/user/register.fb
Log:
Done most of the work loading releases on the show album page (but this still needs options to decide between all release types and just albums, singles & eps). Updated the show artist page with a basic use of this new data

Modified: mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm
===================================================================
--- mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm	2008-06-29 15:09:26 UTC (rev 9899)
+++ mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm	2008-06-29 16:09:08 UTC (rev 9900)
@@ -28,6 +28,7 @@
     require MusicBrainz::Server::Validation;
     require MusicBrainz::Server::Artist;
     require ModDefs;
+    use MusicBrainz::Server::Release;
 
     if($mbid ne "")
     {
@@ -41,6 +42,70 @@
     $artist->SetMBId($mbid);
     $artist->LoadFromId(1) or $c->error("Failed to load artist");
 
+    # Load releases
+    my @releases = $artist->GetReleases(1, 1);
+    my $onlyHasVAReleases = (scalar @releases) == 0;
+
+    my @shortList;
+
+    for my $release (@releases)
+    {
+	my ($type, $status) = $release->GetReleaseTypeAndStatus;
+
+	# Construct values to sort on
+	use Encode qw( decode );
+
+	$release->SetMultipleTrackArtists($release->GetArtist != $release->GetId() ? 1 : 0);
+	$release->{_is_va_} = ($release->GetArtist == &ModDefs::VARTIST_ID or
+			       $release->GetArtist != $release->GetId());
+	$release->{_is_nonalbum_} = ($type == MusicBrainz::Server::Release::RELEASE_ATTR_NONALBUMTRACKS);
+	$release->{_section_key_} = ($release->{_is_va_} . " " . $type);
+	$release->{_name_sort_} = lc decode "utf-8", $release->GetName;
+	$release->{_disc_max_} = 0;
+	$release->{_disc_no_} = 0;
+	$release->{_firstreleasedate_} = ($release->GetFirstReleaseDate || "9999-99-99");
+
+	CheckAttributes($release);
+	
+	# Attempt to sort "disc x [of y]" correctly
+	if ($release->{_name_sort_} =~
+	    /^(.*)                              # $1 <main title>
+	        (?:[(]disc\ (\d+)               # $2 (disc x
+	            (?:\ of\ (\d+))?            # $3 [of y]
+	            (?::[^()]*                  #    [: <disc title>
+		        (?:[(][^()]*[)][^()]*)* #     [<1 level of nested par.>]
+	            )?                          #    ]
+	            [)]                         #    )
+	        )
+	        (.*)$                           # $4 [<rest of main title>]
+	    /xi)
+	{
+	    $release->{_name_sort_} = "$1 $4";
+	    $release->{_disc_no_} = $2;
+	    $release->{_disc_max_} = $3 || 0;
+	}
+
+	# Push onto our list of releases we are actually interested in
+	push @shortList, $release
+	    if ($type == MusicBrainz::Server::Release::RELEASE_ATTR_ALBUM ||
+		$type == MusicBrainz::Server::Release::RELEASE_ATTR_EP ||
+		$type == MusicBrainz::Server::Release::RELEASE_ATTR_COMPILATION ||
+		$type == MusicBrainz::Server::Release::RELEASE_ATTR_SINGLE);
+    }
+
+    if(scalar @shortList)
+    {
+	@releases = @shortList;
+	@releases = sort SortAlbums @releases;
+    }
+    else
+    {
+	$c->error("No releases to show");
+    }
+
+    # Create data structures for the template
+    #
+    # Artist:
     $c->stash->{artist} = {
 	name => $artist->GetName,
 	type => MusicBrainz::Server::Artist::GetTypeName($artist->GetType) || '',
@@ -52,10 +117,93 @@
         resolution => $artist->GetResolution,
     };
 
+    # Releases, sorted into "release groups":
+    $c->stash->{groups} = [];
+
+    my $currentGroup;
+    for my $release (@releases)
+    {
+	my ($type, $status) = $release->GetReleaseTypeAndStatus;
+
+	# Releases should have sorted into groups, so if $type has changed, we need to create
+	# a new "release group"
+	if(not defined $currentGroup or $currentGroup->{type} != $type)
+	{
+	    $currentGroup = {
+			       name => $release->GetAttributeNamePlural($type),
+			       releases => [],
+			       type => $type
+			    };
+
+	    push @{$c->stash->{groups}}, $currentGroup;
+	}
+
+	my $rel = {
+	    title => $release->GetName,
+	    id => $release->GetMBId
+	};
+
+	push @{$currentGroup->{releases}}, $rel;
+    }
+
     $c->stash->{template} = 'artist/show.tt';
 }
 
+sub CheckAttributes
+{
+    my ($a) = @_;
 
+    use MusicBrainz::Server::Release;
+
+    for my $attr ($a->GetAttributes)
+    {
+	$a->{_attr_type} = $attr if ($attr >= MusicBrainz::Server::Release::RELEASE_ATTR_SECTION_TYPE_START &&
+				     $attr <= MusicBrainz::Server::Release::RELEASE_ATTR_SECTION_TYPE_END);
+	$a->{_attr_status} = $attr if ($attr >= MusicBrainz::Server::Release::RELEASE_ATTR_SECTION_STATUS_START &&
+				       $attr <= MusicBrainz::Server::Release::RELEASE_ATTR_SECTION_STATUS_END);
+	$a->{_attr_type} = $attr if ($attr == MusicBrainz::Server::Release::RELEASE_ATTR_NONALBUMTRACKS);
+    }
+
+    # The "actual values", used for display
+    $a->{_actual_attr_type} = $a->{_attr_type};
+    $a->{_actual_attr_status} = $a->{_attr_status};
+
+    # Used for sorting
+    $a->{_attr_type} = MusicBrainz::Server::Release::RELEASE_ATTR_SECTION_TYPE_END + 1 if (not defined $a->{_attr_type});
+    $a->{_attr_status} = MusicBrainz::Server::Release::RELEASE_ATTR_SECTION_STATUS_END + 1 if (not defined $a->{_attr_status});
+};
+
+sub SortAlbums
+{
+    require MusicBrainz::Server::Release;
+
+    # I edited these out of one huge "or"ed conditional as it was a bitch to debug
+
+    my $p1 = $a->{_is_va_} <=> $b->{_is_va_};
+    my $p2 = $b->{_is_nonalbum_} <=> $a->{_is_nonalbum_};
+    my $p3 = $a->{_attr_type} <=> $b->{_attr_type};
+
+    $p1 or $p2 or $p3 or
+      
+    ($a->{_firstreleasedate_} cmp $b->{_firstreleasedate_}) or
+
+    ($a->{_name_sort_} cmp $b->{_name_sort_}) or
+
+    ($a->{_disc_max_} <=> $b->{_disc_max_}) or
+
+    ($a->{_disc_no_} <=> $b->{_disc_no_}) or
+
+    ($a->{_attr_status} <=> $b->{_attr_status}) or
+
+    ($a->{trackcount} cmp $b->{trackcount}) or
+
+    ($b->{trmidcount} cmp $a->{trmidcount}) or
+
+    ($b->{puidcount} cmp $a->{puidcount}) or
+
+    ($a->GetId cmp $b->GetId)
+};
+
 =head1 AUTHOR
 
 Oliver Charles <oliver.g.charles at googlemail.com>

Modified: mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/User.pm
===================================================================
--- mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/User.pm	2008-06-29 15:09:26 UTC (rev 9899)
+++ mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/User.pm	2008-06-29 16:09:08 UTC (rev 9900)
@@ -207,6 +207,18 @@
     $c->response->redirect($c->uri_for('/user/login'));
 }
 
+=head2 preferences
+
+Change the users preferences
+
+=cut
+
+sub preferences : Local Form {
+  my ($self, $c) = @_;
+
+  $c->stash->{template} = 'user/preferences.tt';
+}
+
 =head1 AUTHOR
 
 Oliver Charles <oliver.g.charles at googlemail.com>

Modified: mb_server/branches/TemplateToolkit/root/artist/show.tt
===================================================================
--- mb_server/branches/TemplateToolkit/root/artist/show.tt	2008-06-29 15:09:26 UTC (rev 9899)
+++ mb_server/branches/TemplateToolkit/root/artist/show.tt	2008-06-29 16:09:08 UTC (rev 9900)
@@ -42,4 +42,16 @@
   </div>
 </div>
 
+<h1>Releases</h1>
+[% FOREACH group IN groups %]
+  <h2>[% group.name %]</h2>
+  <ul>
+    [% FOREACH release IN group.releases %]
+      <li>
+      <a href="[% c.uri_for('/release', release.id) %]">[% release.title %]</a>
+      </li>
+    [% END %]
+  </ul>
 [% END %]
+
+[% END %]

Added: mb_server/branches/TemplateToolkit/root/forms/user/preferences.fb

Modified: mb_server/branches/TemplateToolkit/root/forms/user/register.fb
===================================================================
--- mb_server/branches/TemplateToolkit/root/forms/user/register.fb	2008-06-29 15:09:26 UTC (rev 9899)
+++ mb_server/branches/TemplateToolkit/root/forms/user/register.fb	2008-06-29 16:09:08 UTC (rev 9900)
@@ -1,27 +1,27 @@
 name: user_register
 method: post
 fields:
-	username:
-		label:	  Username
-		size:	  50
-		required: 1
-		
-	password:
-		label:    Password
-		type:	  password
-		size:	  50
-		required: 1
-		
-	confirm_password:
-		label:	  Confirm Password
-		type: 	  password
-		size:	  50
-		required: 1
-		
-	email:
-		size:	  50
-		required: 0
+  username:
+    label: Username
+    size: 50
+    required: 1
+    
+    password:
+      label: Password
+      type: password
+      size: 50
+      required: 1
+      
+    confirm_password:
+      label: Confirm Password
+      type: password
+      size: 50
+      required: 1
+      
+    email:
+      size: 50
+      required: 0
 
 validate:
-	confirm_password:
-		perl:	    eq $form->field("password")
\ No newline at end of file
+  confirm_password:
+    perl: eq $form->field("password")
\ No newline at end of file

Added: mb_server/branches/TemplateToolkit/root/user/preferences.tt




More information about the MusicBrainz-commits mailing list