diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb index a4da1e19a..ac88a7ce3 100644 --- a/app/controllers/photos_controller.rb +++ b/app/controllers/photos_controller.rb @@ -33,11 +33,10 @@ class PhotosController < ApplicationController @flickr_auth = current_member.auth('flickr') if @flickr_auth @sets = current_member.flickr_sets - photos = current_member.flickr_photos(page, params[:set]) - total = photos.instance_of?(FlickRaw::ResponseList) ? photos.total : 0 + photos, total = current_member.flickr_photos(page, params[:set]) @photos = WillPaginate::Collection.create(page, 30, total) do |pager| - pager.replace photos.to_a + pager.replace photos end end diff --git a/app/models/member.rb b/app/models/member.rb index d76c20a82..1071c51e4 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -150,19 +150,37 @@ class Member < ActiveRecord::Base end # Fetches a collection of photos from Flickr + # Returns a [[page of photos], total] pair. + # Total is needed for pagination. def flickr_photos(page_num=1, set=nil) + # FlickRaw returns a ResponseList when asked for a user's photos, but a + # Response when asked for photos in a set. Only ResponseList supports + # to_a(). Both support total(). Hence the following. + # + # We think this is a bug in FlickRaw, and have reported it here: + # https://github.com/hanklords/flickraw/issues/58 if set - return flickr.photosets.getPhotos( + result = flickr.photosets.getPhotos( :photoset_id => set, :page => page_num, :per_page => 30 ) + if result + return [result.photo, result.total] + else + return [[], 0] + end else - return flickr.people.getPhotos( + result_list = flickr.people.getPhotos( :user_id => 'me', :page => page_num, :per_page => 30 ) + if result_list + return [result_list.to_a, result_list.total] + else + return [[], 0] + end end end diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb index 3a6ef9901..983ed1e0c 100644 --- a/spec/controllers/photos_controller_spec.rb +++ b/spec/controllers/photos_controller_spec.rb @@ -23,12 +23,15 @@ describe PhotosController do end describe "GET new" do - it "assigns the flickr auth as @flickr_auth" do + before(:each) do @member = FactoryGirl.create(:member) sign_in @member - @member.stub(:flickr_photos) { [] } + @member.stub(:flickr_photos) { [[], 0] } @member.stub(:flickr_sets) { [] } controller.stub(:current_member) { @member } + end + + it "assigns the flickr auth as @flickr_auth" do @auth = FactoryGirl.create(:flickr_authentication, :member => @member) get :new, {} assigns(:flickr_auth).should be_an_instance_of(Authentication)