beef-has_assets 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.6
1
+ 0.3.7
@@ -41,4 +41,23 @@ module Admin::AssetsHelper
41
41
  render :partial => 'admin/flickrs/selector', :locals => { :flickr_images => flickr_result }
42
42
  end
43
43
 
44
+
45
+ def lastest_flickr
46
+ return if Settings.flickr_api_key.blank? or Settings.flickr_user_id.blank?
47
+ Flickr::API.connect Settings.flickr_api_key, Settings.flickr_api_secret, Settings.flickr_auth_token
48
+ flickr_params = { :per_page => '5', :page => params[:page], :user_id => Settings.flickr_user_id, :sort => 'date-taken-desc', :tag_mode => 'all' }
49
+ flickr_params[:tags] = params[:tags] unless params[:tags].blank?
50
+ flickr_result = Flickr::Photo.find(:all, flickr_params)
51
+ render :partial => 'admin/shared/flickr_latest.html.erb', :locals => { :flickr_images => flickr_result }
52
+ end
53
+
54
+
55
+ def flickr_select
56
+ return if Settings.flickr_api_key.blank? or Settings.flickr_user_id.blank?
57
+ Flickr::API.connect Settings.flickr_api_key, Settings.flickr_api_secret, Settings.flickr_auth_token
58
+ flickr_params = { :per_page => '12', :page => params[:page], :user_id => Settings.flickr_user_id, :sort => 'date-taken-desc', :tag_mode => 'all' }
59
+ flickr_params[:tags] = params[:tags] unless params[:tags].blank?
60
+ flickr_result = Flickr::Photo.find(:all, flickr_params)
61
+ render :partial => 'admin/shared/flickr.html.erb', :locals => { :flickr_images => flickr_result }
62
+ end
44
63
  end
@@ -8,7 +8,7 @@
8
8
  <div class="auto_complete" id="asset_category_complete" style="display:none"></div>
9
9
 
10
10
  <p>
11
- <%= f.label :decription %><br />
11
+ <%= f.label :description %><br />
12
12
  <%= f.text_field :description %>
13
13
  </p>
14
14
 
@@ -0,0 +1,11 @@
1
+
2
+ <div id="flickr-select">
3
+ <% form_remote_tag( :url => admin_flickr_path ) do -%>
4
+ <p><label for="tags">Search by tag:</label>
5
+ <%= text_field_tag :tags, params[:tags] %> &nbsp; <%= submit_tag "go" %></p>
6
+
7
+ <% end -%>
8
+
9
+ <%= render :partial => 'admin/shared/flickr_image.html.erb', :collection => flickr_images -%>
10
+
11
+ </div>
@@ -0,0 +1 @@
1
+ <img src="/images/admin/flickr_logo.jpg" flickr_src="<%= flickr_image.source('s') %>" alt="<%= flickr_image.description || flickr_image.title %>" title="<%= flickr_image.title %>" onclick="addLinkedImage('<%= flickr_image.source %>',this.alt)"/>
@@ -0,0 +1,6 @@
1
+
2
+ <div id="flickr-select">
3
+
4
+ <%= render :partial => 'admin/shared/flickr_image.html.erb', :collection => flickr_images -%>
5
+
6
+ </div>
@@ -390,3 +390,11 @@ var Renameable = Class.create(Holdable, {
390
390
  });
391
391
  }
392
392
  });
393
+
394
+ var load_flickr_select = function(){
395
+ $$('#flickr-select img').each(function(el){
396
+
397
+ el.writeAttribute('src', el.readAttribute('flickr_src'));
398
+ });
399
+ }
400
+ document.observe('dom:loaded', load_flickr_select);
data/has_assets.gemspec CHANGED
@@ -1,12 +1,15 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{has_assets}
5
- s.version = "0.3.6"
8
+ s.version = "0.3.7"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
11
  s.authors = ["Steve England"]
9
- s.date = %q{2009-09-07}
12
+ s.date = %q{2009-09-14}
10
13
  s.email = %q{steve@wearebeef.co.uk}
11
14
  s.extra_rdoc_files = [
12
15
  "LICENSE",
@@ -40,15 +43,20 @@ Gem::Specification.new do |s|
40
43
  "app/views/admin/flickrs/_selector.html.erb",
41
44
  "app/views/admin/flickrs/show.html.erb",
42
45
  "app/views/admin/flickrs/show.js.rjs",
46
+ "app/views/admin/shared/_flickr.html.erb",
47
+ "app/views/admin/shared/_flickr_image.html.erb",
48
+ "app/views/admin/shared/_flickr_latest.html.erb",
43
49
  "config/routes.rb",
44
50
  "generators/asset_migration/asset_migration_generator.rb",
45
51
  "generators/asset_migration/templates/migration.rb",
46
52
  "generators/assets_admin_files/asset_admin_files_generator.rb",
47
53
  "generators/assets_admin_files/templates/public/flash/swfupload.swf",
54
+ "generators/assets_admin_files/templates/public/images/flickr_logo.jpg",
48
55
  "generators/assets_admin_files/templates/public/javascripts/admin/assets.js",
49
56
  "generators/assets_admin_files/templates/public/javascripts/swfupload.js",
50
57
  "generators/assets_admin_files/templates/public/javascripts/upload_progress.js",
51
58
  "has_assets.gemspec",
59
+ "lib/flickr.rb",
52
60
  "lib/has_assets.rb",
53
61
  "lib/has_assets/custom_redcloth_tags.rb",
54
62
  "lib/has_assets/flash_sesion_cookie_middleware.rb",
@@ -65,8 +73,8 @@ Gem::Specification.new do |s|
65
73
  s.rubygems_version = %q{1.3.5}
66
74
  s.summary = %q{Rails Engine. Adds uploadable assets to a model and admin area for files}
67
75
  s.test_files = [
68
- "test/has_assets_test.rb",
69
- "test/test_helper.rb"
76
+ "test/test_helper.rb",
77
+ "test/has_assets_test.rb"
70
78
  ]
71
79
 
72
80
  if s.respond_to? :specification_version then
data/lib/flickr.rb ADDED
@@ -0,0 +1,386 @@
1
+ # = Flickr
2
+ # An insanely easy interface to the Flickr photo-sharing service. By Scott Raymond.
3
+ # Modified by Steve England www.wearebeef.co.uk
4
+
5
+ # Now using ObjectiveFlickr gem as it makes auth easy
6
+ # gem 'objectiveflickr'
7
+ require 'objectiveflickr'
8
+
9
+ class Flickr
10
+
11
+ def self.connect(api_key, secret, auth_token = nil)
12
+ API.connect(api_key, secret, auth_token)
13
+ self
14
+ end
15
+
16
+ class Error < StandardError ; end
17
+
18
+ # Essentially a standard RuntimeError that can include the response as an
19
+ # REXML object reference.
20
+ class APIError < Error
21
+ attr_reader :response
22
+
23
+ # Creates a new exception.
24
+ def initialize(response)
25
+ super
26
+ @response = response
27
+ end
28
+
29
+ # The error string returned by the API call.
30
+ def to_s
31
+ response['message']
32
+ end
33
+ end
34
+
35
+ # Flickr client class. Requires an API key, and optionally takes an email and password for authentication
36
+ class API
37
+ class << self
38
+
39
+ # Replace this API key with your own (see http://www.flickr.com/services/api/misc.api_keys.html)
40
+ def connect(api_key, secret, auth_token = nil)
41
+ @api_key = api_key
42
+ @auth_token = auth_token
43
+ @fi = FlickrInvocation.new(api_key,secret)
44
+ self
45
+ end
46
+
47
+ def fi
48
+ raise Error.new('API not connected') if @fi.nil?
49
+ @fi
50
+ end
51
+
52
+ def login_url(permission='read')
53
+ fi.login_url(permission)
54
+ end
55
+
56
+ def unauthorised?
57
+ params = { :api_key => @api_key, :auth_token => @auth_token }
58
+ logger.debug params
59
+ data = fi.call('flickr.auth.checkToken',params).data
60
+ logger.debug data
61
+ return data['message'] if data['stat'] != 'ok'
62
+ false
63
+ end
64
+
65
+ def authorise(frob)
66
+ @auth_token = request('flickr.auth.getToken', { :api_key => @api_key, :frob => frob } )['auth']['token']['_content']
67
+ end
68
+
69
+ # Implements flickr.urls.lookupGroup and flickr.urls.lookupUser
70
+ def find_by_url(url)
71
+ response = urls_lookupUser('url'=>url) rescue urls_lookupGroup('url'=>url) rescue nil
72
+ (response['user']) ? User.new(response['user']['id']) : Group.new(response['group']['id']) unless response.nil?
73
+ end
74
+
75
+ # Implements flickr.photos.getRecent and flickr.photos.search, returns PhotoList object so
76
+ # that page_count, total etc. are avaiable for pagination.
77
+ def photos(params = {})
78
+ photos = (params.empty?) ? photos_getRecent['photos'] : photos_search(params)['photos']
79
+ PhotoList.new(photos, self)
80
+ end
81
+
82
+ # Implements flickr.people.getOnlineList, flickr.people.findByEmail, and flickr.people.findByUsername
83
+ def users(lookup=nil)
84
+ if(lookup)
85
+ user = people_findByEmail('find_email'=>lookup)['user'] rescue people_findByUsername('username'=>lookup)['user']
86
+ return User.find(user['nsid'])
87
+ else
88
+ return people_getOnlineList['online']['user'].collect { |person| User.new(person['nsid']) }
89
+ end
90
+ end
91
+
92
+ # Implements flickr.groups.getActiveList
93
+ def groups
94
+ groups_getActiveList['activegroups']['group'].collect { |group| Group.new(group['nsid']) }
95
+ end
96
+
97
+ # Implements flickr.tags.getRelated
98
+ def related_tags(tag)
99
+ tags_getRelated('tag_id'=>tag)['tags']['tag']
100
+ end
101
+
102
+ # Implements flickr.photos.licenses.getInfo
103
+ def licenses
104
+ photos_licenses_getInfo['licenses']['license']
105
+ end
106
+
107
+ # Todo:
108
+ # logged_in?
109
+ # if logged in:
110
+ # flickr.blogs.getList
111
+ # flickr.favorites.add
112
+ # flickr.favorites.remove
113
+ # flickr.groups.browse
114
+ # flickr.photos.getCounts
115
+ # flickr.photos.getNotInSet
116
+ # flickr.photos.getUntagged
117
+ # flickr.photosets.create
118
+ # flickr.photosets.orderSets
119
+ # flickr.tags.getListUserPopular
120
+ # flickr.test.login
121
+ # uploading
122
+
123
+ private
124
+
125
+ def logger
126
+ RAILS_DEFAULT_LOGGER
127
+ end
128
+
129
+ # Takes a Flickr API method name and set of parameters
130
+ def request(method, params = {}, auth = true)
131
+ params[:auth] = auth
132
+ params[:auth_token] = @auth_token unless @auth_token.nil?
133
+ logger.debug params.inspect
134
+
135
+
136
+ data = fi.call(method,params).data
137
+ logger.debug data.inspect
138
+ raise APIError.new(data) if data['stat'] != 'ok'
139
+ data
140
+ end
141
+
142
+ # Implements everything else.
143
+ # Any method not defined explicitly will be passed on to the Flickr API,
144
+ # and return an XmlSimple document. For example, Flickr#test_echo is not defined,
145
+ # so it will pass the call to the flickr.test.echo method.
146
+ # e.g., Flickr#test_echo['stat'] should == 'ok'
147
+ def method_missing(method_id, *params)
148
+ request('flickr.' + method_id.id2name.gsub(/_/, '.'), params[0])
149
+ end
150
+
151
+ end
152
+
153
+ end
154
+
155
+ class ApiObject
156
+
157
+ protected
158
+
159
+ def initialize(hash)
160
+ hash.each do |key, value|
161
+ instance_variable_set '@' + key, value
162
+ end
163
+ end
164
+
165
+ def self.find(*args)
166
+ case args.first
167
+ when :first then find_initial(args[1])
168
+ when :all then find_every(args[1])
169
+ else find_by_id(args)
170
+ end
171
+ end
172
+
173
+ end
174
+
175
+ class Person < ApiObject
176
+
177
+ attr_reader :nsid, :username, :name, :location, :count, :firstdate, :firstdatetaken
178
+
179
+ def self.find_by_id(id)
180
+ self.new(API.people_getInfo('user_id'=>id)['person'])
181
+ end
182
+
183
+ def self.find_by_email(email)
184
+ id = API.people_findByEmail('find_email'=>email)['user']['nsid']
185
+ find(id)
186
+ end
187
+
188
+ # Implements flickr.people.getPublicGroups
189
+ def groups
190
+ API.people_getPublicGroups('user_id'=>@nsid)['groups']['group'].collect { |group| Group.new(group['nsid']) }
191
+ end
192
+
193
+ def photos(params = {})
194
+ @photolist ||= API.photos(params.merge('user_id'=>@nsid, 'sort'=>'date-taken-desc'))
195
+ end
196
+
197
+ # Implements flickr.photosets.getList
198
+ def photosets
199
+ if @photosets.nil?
200
+ photosets = API.photosets_getList('user_id'=>@nsid)['photosets']
201
+ if photosets.empty?
202
+ @photosets = []
203
+ else
204
+ @photosets = photosets['photoset'].collect { |photoset| Photoset.new(photoset) }
205
+ end
206
+ else
207
+ @photosets
208
+ end
209
+ end
210
+
211
+ # Implements flickr.contacts.getPublicList and flickr.contacts.getList
212
+ def contacts
213
+ API.contacts_getPublicList('user_id'=>@nsid)['contacts']['contact'].collect { |contact| User.new(contact['nsid']) }
214
+ end
215
+
216
+ # Implements flickr.favorites.getPublicList and flickr.favorites.getList
217
+ def favorites
218
+ API.favorites_getPublicList('user_id'=>@nsid)['photos']['photo'].collect { |photo| Photo.new(photo) }
219
+ #or
220
+ end
221
+
222
+ # Implements flickr.tags.getListUser
223
+ def tags
224
+ API.tags_getListUser('user_id'=>@nsid)['who']['tags']['tag'].collect { |tag| tag }
225
+ end
226
+
227
+ # Implements flickr.photos.getContactsPublicPhotos and flickr.photos.getContactsPhotos
228
+ def contactsPhotos
229
+ API.photos_getContactsPublicPhotos('user_id'=>@nsid)['photos']['photo'].collect { |photo| Photo.new(photo) }
230
+ # or
231
+ #API.photos_getContactsPhotos['photos']['photo'].collect { |photo| Photo.new(photo['id']) }
232
+ end
233
+
234
+ def to_s
235
+ @name
236
+ end
237
+
238
+ end
239
+
240
+ class Photoset < ApiObject
241
+ attr_reader :id, :title, :description
242
+
243
+ def find_by_id(id)
244
+ self.new(photosets_getInfo('photoset_id'=>id)['photoset'])
245
+ end
246
+
247
+ def total
248
+ @photos
249
+ end
250
+
251
+ def photos
252
+ photo = API.photosets_getPhotos('photoset_id'=>id)['photoset']['photo']
253
+ return [] if photo.nil?
254
+ return [Photo.new(photo, self)] if photo.is_a? Hash
255
+ photo.collect { |photo| Photo.new(photo) }
256
+ end
257
+ end
258
+
259
+ class Photo < ApiObject
260
+
261
+ attr_reader :id, :title, :owner_id, :server, :isfavourite, :license, :rotation, :description, :notes
262
+ attr_writer :owner
263
+
264
+ def self.find_by_id(id)
265
+ self.new(API.photos_getInfo('photo_id'=>id)['photo'])
266
+ end
267
+
268
+ # Implements flickr.photos.getRecent and flickr.photos.search, returns PhotoList object so
269
+ # that page_count, total etc. are avaiable for pagination.
270
+ def self.find_every(params = {})
271
+ photos = (params.empty?) ? API.photos_getRecent['photos'] : API.photos_search(params)['photos']
272
+ PhotoList.new(photos)
273
+ end
274
+
275
+ def self.find_initial(params = {})
276
+ params[:per_page] = 1
277
+ find_every(params = {})
278
+ end
279
+
280
+ # Returns the URL for the photo page (default or any specified size)
281
+ def url(size='Medium')
282
+ if size=='Medium'
283
+ "http://flickr.com/photos/#{owner.username}/#{@id}"
284
+ else
285
+ sizes(size)['url']
286
+ end
287
+ end
288
+
289
+ # Returns the URL for the image (default or any specified size)
290
+ def source(size=nil)
291
+ url = "http://static.flickr.com/#{@server}/#{@id}_#{@secret}"
292
+ url << "_#{size}" unless size.nil?
293
+ url + ".jpg"
294
+ end
295
+
296
+ # Returns the photo file data itself, in any specified size. Example: File.open(photo.title, 'w') { |f| f.puts photo.file }
297
+ def file(size=nil)
298
+ Net::HTTP.get_response(URI.parse(source(size))).body
299
+ end
300
+
301
+ # Unique filename for the image, based on the Flickr NSID
302
+ def filename
303
+ "#{@id}.jpg"
304
+ end
305
+
306
+ # Implements flickr.photos.getContext
307
+ def context
308
+ context = API.photos_getContext('photo_id'=>@id)
309
+ @previousPhoto = Photo.new(context['prevphoto']['id'])
310
+ @nextPhoto = Photo.new(context['nextphoto']['id'])
311
+ return [@previousPhoto, @nextPhoto]
312
+ end
313
+
314
+ # Implements flickr.photos.getExif
315
+ def exif
316
+ API.photos_getExif('photo_id'=>@id)['photo']
317
+ end
318
+
319
+ # Implements flickr.photos.getPerms
320
+ def permissions
321
+ API.photos_getPerms('photo_id'=>@id)['perms']
322
+ end
323
+
324
+ # Implements flickr.photos.getSizes
325
+ def sizes(size=nil)
326
+ sizes = API.photos_getSizes('photo_id'=>@id)['sizes']['size']
327
+ sizes = sizes.find{|asize| asize['label']==size} if size
328
+ return sizes
329
+ end
330
+
331
+ # flickr.tags.getListPhoto
332
+ def tags
333
+ API.tags_getListPhoto('photo_id'=>@id)['photo']['tags']
334
+ end
335
+
336
+ # Implements flickr.blogs.postPhoto
337
+ def postToBlog(blog_id, title='', description='')
338
+ API.blogs_postPhoto('photo_id'=>@id, 'title'=>title, 'description'=>description)
339
+ end
340
+
341
+ # Converts the Photo to a string by returning its title
342
+ def to_s
343
+ @title
344
+ end
345
+
346
+ end
347
+
348
+ # Todo:
349
+ # flickr.groups.pools.add
350
+ # flickr.groups.pools.getContext
351
+ # flickr.groups.pools.getGroups
352
+ # flickr.groups.pools.getPhotos
353
+ # flickr.groups.pools.remove
354
+ class Group < ApiObject
355
+ attr_reader :id, :client, :name, :members, :online, :privacy, :chatid, :chatcount, :url
356
+
357
+ def self.find_by_id(id)
358
+ self.new(API.groups_getInfo('user_id'=>id)['person'])
359
+ end
360
+
361
+ def self.photos(id, params = {})
362
+ params['group_id'] = id
363
+ PhotoList.new(API.groups_pools_getPhotos(params)['photos'])
364
+ end
365
+
366
+
367
+ end
368
+
369
+ # Extended from array to allow perpage etc.
370
+ class PhotoList < Array
371
+ attr_reader :page, :pages, :perpage, :total
372
+
373
+ def initialize(flickr_response)
374
+ @page = flickr_response['page'].to_i
375
+ @perpage = flickr_response['perpage'].to_i
376
+ @total = flickr_response['total'].to_i
377
+ @pages = flickr_response['pages'].to_i
378
+
379
+ @photo = flickr_response['photo']
380
+
381
+ super Photo.new(@photo, self) if @photo.is_a? Hash
382
+ super @photo.collect { |photo| Photo.new(photo) }
383
+ end
384
+ end
385
+
386
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beef-has_assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve England
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-07 00:00:00 -07:00
12
+ date: 2009-09-14 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -50,15 +50,20 @@ files:
50
50
  - app/views/admin/flickrs/_selector.html.erb
51
51
  - app/views/admin/flickrs/show.html.erb
52
52
  - app/views/admin/flickrs/show.js.rjs
53
+ - app/views/admin/shared/_flickr.html.erb
54
+ - app/views/admin/shared/_flickr_image.html.erb
55
+ - app/views/admin/shared/_flickr_latest.html.erb
53
56
  - config/routes.rb
54
57
  - generators/asset_migration/asset_migration_generator.rb
55
58
  - generators/asset_migration/templates/migration.rb
56
59
  - generators/assets_admin_files/asset_admin_files_generator.rb
57
60
  - generators/assets_admin_files/templates/public/flash/swfupload.swf
61
+ - generators/assets_admin_files/templates/public/images/flickr_logo.jpg
58
62
  - generators/assets_admin_files/templates/public/javascripts/admin/assets.js
59
63
  - generators/assets_admin_files/templates/public/javascripts/swfupload.js
60
64
  - generators/assets_admin_files/templates/public/javascripts/upload_progress.js
61
65
  - has_assets.gemspec
66
+ - lib/flickr.rb
62
67
  - lib/has_assets.rb
63
68
  - lib/has_assets/custom_redcloth_tags.rb
64
69
  - lib/has_assets/flash_sesion_cookie_middleware.rb
@@ -70,7 +75,6 @@ files:
70
75
  - test/test_helper.rb
71
76
  has_rdoc: false
72
77
  homepage: http://github.com/beef/assets
73
- licenses:
74
78
  post_install_message:
75
79
  rdoc_options:
76
80
  - --charset=UTF-8
@@ -91,10 +95,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
95
  requirements: []
92
96
 
93
97
  rubyforge_project:
94
- rubygems_version: 1.3.5
98
+ rubygems_version: 1.2.0
95
99
  signing_key:
96
100
  specification_version: 3
97
101
  summary: Rails Engine. Adds uploadable assets to a model and admin area for files
98
102
  test_files:
99
- - test/has_assets_test.rb
100
103
  - test/test_helper.rb
104
+ - test/has_assets_test.rb