oxen_media 0.0.2
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.
- checksums.yaml +7 -0
- data/.bowerrc +3 -0
- data/.envrc +1 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +331 -0
- data/Guardfile +135 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +31 -0
- data/Rakefile +15 -0
- data/app/assets/images/oxen_media/.keep +0 -0
- data/app/assets/javascripts/jsrender.min.js +4 -0
- data/app/assets/javascripts/jsrender.min.js.map +463 -0
- data/app/assets/javascripts/oxen_media.js +3 -0
- data/app/assets/javascripts/oxen_media/.keep +0 -0
- data/app/assets/javascripts/oxen_media/carrier_wave_cropper.js.coffee +22 -0
- data/app/assets/javascripts/oxen_media/media.js.coffee +469 -0
- data/app/assets/javascripts/oxen_media/medium_pane.js.coffee +107 -0
- data/app/assets/javascripts/templates/selected_files.html +35 -0
- data/app/assets/stylesheets/media.css +10 -0
- data/app/assets/stylesheets/oxen_media/.keep +0 -0
- data/app/assets/stylesheets/scaffold.css +56 -0
- data/app/controllers/.keep +0 -0
- data/app/controllers/media_controller.rb +106 -0
- data/app/helpers/.keep +0 -0
- data/app/helpers/media_helper.rb +2 -0
- data/app/mailers/.keep +0 -0
- data/app/models/.keep +0 -0
- data/app/models/concerns/roleable.rb +61 -0
- data/app/models/medium.rb +25 -0
- data/app/policies/oxen_medium_policy.rb +12 -0
- data/app/uploaders/medium_uploader.rb +106 -0
- data/app/views/.keep +0 -0
- data/app/views/media/_fields.html.haml +42 -0
- data/app/views/media/_form.html.haml +48 -0
- data/app/views/media/_media.html.haml +18 -0
- data/app/views/media/_medium.html.haml +25 -0
- data/app/views/media/_medium_fields.html.haml +4 -0
- data/app/views/media/create.js.haml +2 -0
- data/app/views/media/crop.html.haml +3 -0
- data/app/views/media/edit.html.haml +2 -0
- data/app/views/media/index.html.haml +29 -0
- data/app/views/media/index.json.jbuilder +4 -0
- data/app/views/media/new.html.erb +5 -0
- data/app/views/media/show.html.haml +21 -0
- data/app/views/media/show.json.jbuilder +1 -0
- data/app/views/media/update_crop.js.haml +1 -0
- data/bin/rails +12 -0
- data/config/initializers/backtrace_silencers.rb +9 -0
- data/config/initializers/carrier_wave.rb +11 -0
- data/config/initializers/simple_form.rb +14 -0
- data/config/locales/media.en.yml +20 -0
- data/config/routes.rb +6 -0
- data/db/migrate/20150629071720_create_media.rb +13 -0
- data/lib/generators/media/USAGE +8 -0
- data/lib/generators/media/media_generator.rb +48 -0
- data/lib/generators/media/templates/medium.rb +13 -0
- data/lib/oxen_media.rb +7 -0
- data/lib/oxen_media/engine.rb +19 -0
- data/lib/oxen_media/version.rb +3 -0
- data/lib/tasks/oxen_media_tasks.rake +4 -0
- data/oxen_media.gemspec +59 -0
- data/test/controllers/media_controller_test.rb +49 -0
- data/test/fixtures/media.yml +17 -0
- data/test/integration/oxen_media_test.rb +7 -0
- data/test/lib/generators/media_generator_test.rb +14 -0
- data/test/models/medium_test.rb +7 -0
- data/test/test_helper.rb +13 -0
- metadata +387 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
class MediumPaneClass
|
2
|
+
|
3
|
+
constructor: (@list, @loader='span.medium-loader') ->
|
4
|
+
@media = []
|
5
|
+
|
6
|
+
listFile: (template,data,selector) ->
|
7
|
+
$.tmpl(template, data).prependTo(selector)
|
8
|
+
|
9
|
+
#
|
10
|
+
# set Buttons
|
11
|
+
#
|
12
|
+
setButtons: (c) ->
|
13
|
+
@setNewLink(c)
|
14
|
+
@setLinks(c)
|
15
|
+
|
16
|
+
|
17
|
+
#
|
18
|
+
# set links for Uri, and current Contact
|
19
|
+
#
|
20
|
+
setFormLinks: (self) ->
|
21
|
+
@setCancel(self)
|
22
|
+
@setSave(self)
|
23
|
+
|
24
|
+
|
25
|
+
setCancel: (self) ->
|
26
|
+
me=self
|
27
|
+
$('.cancel_medium').on 'click', () ->
|
28
|
+
$(me.list + ' .medium-form').remove()
|
29
|
+
|
30
|
+
setNewLink: (self) ->
|
31
|
+
me=self
|
32
|
+
try
|
33
|
+
me=self
|
34
|
+
$('a.new_medium').on 'click', (e) ->
|
35
|
+
e.preventDefault()
|
36
|
+
e.stopPropagation()
|
37
|
+
setLoader $(me.loader)
|
38
|
+
url = $(this).attr('href') + '?scope=' + me.list.replace('#','')
|
39
|
+
|
40
|
+
$.ajax
|
41
|
+
url: url,
|
42
|
+
type: 'GET'
|
43
|
+
success: (data, textStatus, jqXHR) ->
|
44
|
+
releaseLoader $(me.loader)
|
45
|
+
$(me.list).prepend(data)
|
46
|
+
error: (jqXHR, textStatus, errorThrown) ->
|
47
|
+
releaseLoader $(me.loader)
|
48
|
+
swal 'Fejl!!', textStatus, 'error'
|
49
|
+
catch e
|
50
|
+
console.log e
|
51
|
+
|
52
|
+
|
53
|
+
setLinks: (self) ->
|
54
|
+
try
|
55
|
+
me=self
|
56
|
+
$(".medium.collection-item i.circle").on 'click', (e) ->
|
57
|
+
setLoader $(me.loader)
|
58
|
+
elem = $(this).closest('li')
|
59
|
+
_id = elem.data('id')
|
60
|
+
$.ajax
|
61
|
+
url: '/uris/' + _id + '/edit?scope='+me.list.replace('#',''),
|
62
|
+
type: 'GET'
|
63
|
+
success: (data, textStatus, jqXHR) ->
|
64
|
+
releaseLoader $(me.loader)
|
65
|
+
$(me.list).prepend(data)
|
66
|
+
error: (jqXHR, textStatus, errorThrown) ->
|
67
|
+
releaseLoader $(me.loader)
|
68
|
+
swal 'Fejl!!',textStatus, 'error'
|
69
|
+
catch e
|
70
|
+
console.log e
|
71
|
+
|
72
|
+
setSave: (self) ->
|
73
|
+
me=self
|
74
|
+
$('.save_medium').on 'click', () ->
|
75
|
+
setLoader $(me.loader)
|
76
|
+
elem = $(this).closest('form')
|
77
|
+
type = elem.attr('method')
|
78
|
+
url = elem.attr('action')
|
79
|
+
if elem.attr('id')=='new_medium'
|
80
|
+
elem= $(me.list + ' ul.collection')
|
81
|
+
else
|
82
|
+
elem=$('#' + url.replace('/media/','medium-'))
|
83
|
+
url = url + '.js'
|
84
|
+
#type = "#{params[:action]=='edit' ? 'PUT' : 'POST'}"
|
85
|
+
$inputs = $(this).closest('form').find "input, select, button, textarea"
|
86
|
+
serializedData = $inputs.serialize()
|
87
|
+
|
88
|
+
$.ajax
|
89
|
+
url: url
|
90
|
+
type: type
|
91
|
+
data: serializedData
|
92
|
+
statusCode:
|
93
|
+
200: (response,textStatus,jqXHR) ->
|
94
|
+
releaseLoader $(me.loader)
|
95
|
+
console.log elem
|
96
|
+
console.log me.list
|
97
|
+
if $(me.list + ' form').attr('id')=='new_medium'
|
98
|
+
elem.prepend(response.responseText)
|
99
|
+
else
|
100
|
+
elem.replaceWith(response.responseText)
|
101
|
+
$(me.list + ' .uri-form').remove()
|
102
|
+
me.setLinks(me)
|
103
|
+
301: (response,textStatus,jqXHR) ->
|
104
|
+
$('body').append "301 response to AJAX call: #{response}"
|
105
|
+
|
106
|
+
|
107
|
+
@MediumPane = MediumPaneClass
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<div class="col s4">
|
2
|
+
<div class="card small new_upload" id="" data="" >
|
3
|
+
<div class="card-image new_upload waves-effect waves-block waves-light">
|
4
|
+
<img id="{{:id}}" src="" class="activator">
|
5
|
+
<input name="media[{{:id}}][file]" type="file" style="display:none" />
|
6
|
+
</div>
|
7
|
+
<div class="card-action">
|
8
|
+
<div class="progress fileupload-progress fade" style="display:none"><div class="determinate" style:"width:0%;"></div></div>
|
9
|
+
<div class="row">
|
10
|
+
<div class="col s12">
|
11
|
+
<!-- <i class="material-icons activator right" style="margin-top: 6px; margin-top: 5px">mort_vert</i> -->
|
12
|
+
<!-- <strong class="error text-danger"></strong> -->
|
13
|
+
<!-- <a class="edit_link file-upload" href="#!">
|
14
|
+
<i class="material-icons edit green-text">mode_edit</i>
|
15
|
+
</a> -->
|
16
|
+
<a class="start file-upload" href="#!">
|
17
|
+
<i class="material-icons file_upload green-text">file_upload</i>
|
18
|
+
</a>
|
19
|
+
<!-- <a class="cancel file-upload" href="#!">
|
20
|
+
<i class="material-icons cancel orange-text">cancel</i>
|
21
|
+
</a> -->
|
22
|
+
<a class="delete file-upload" href="#!">
|
23
|
+
<i class="material-icons delete red-text">delete</i>
|
24
|
+
</a>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
<div class="card-reveal">
|
29
|
+
<span class="card-title grey-text text-darken-4">Billed egenskaber<i class="material-icons right">close</i></span>
|
30
|
+
<p><span class="card-title grey-text text-darken-4">{{:name}}</span></p>
|
31
|
+
<p><input class="string optional" name="media[{{:id}}][name]" placeholder="Titel" /></p>
|
32
|
+
<p><textarea class="text optional materialize-textarea" name="media[{{:id}}][description]" placeholder="Beskrivelse" /></p>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</div>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/*
|
2
|
+
Place all the styles related to the matching controller here.
|
3
|
+
They will automatically be included in application.css.
|
4
|
+
*/
|
5
|
+
*= require jquery.jcrop
|
6
|
+
/*
|
7
|
+
@media only screen (min-width : 971px) and (max-width : 600px) {
|
8
|
+
.card.small { height: 180px}
|
9
|
+
span.card-title { display:none}
|
10
|
+
}*/
|
File without changes
|
@@ -0,0 +1,56 @@
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
2
|
+
|
3
|
+
body, p, ol, ul, td {
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
pre {
|
10
|
+
background-color: #eee;
|
11
|
+
padding: 10px;
|
12
|
+
font-size: 11px;
|
13
|
+
}
|
14
|
+
|
15
|
+
a { color: #000; }
|
16
|
+
a:visited { color: #666; }
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
18
|
+
|
19
|
+
div.field, div.actions {
|
20
|
+
margin-bottom: 10px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#notice {
|
24
|
+
color: green;
|
25
|
+
}
|
26
|
+
|
27
|
+
.field_with_errors {
|
28
|
+
padding: 2px;
|
29
|
+
background-color: red;
|
30
|
+
display: table;
|
31
|
+
}
|
32
|
+
|
33
|
+
#error_explanation {
|
34
|
+
width: 450px;
|
35
|
+
border: 2px solid red;
|
36
|
+
padding: 7px;
|
37
|
+
padding-bottom: 0;
|
38
|
+
margin-bottom: 20px;
|
39
|
+
background-color: #f0f0f0;
|
40
|
+
}
|
41
|
+
|
42
|
+
#error_explanation h2 {
|
43
|
+
text-align: left;
|
44
|
+
font-weight: bold;
|
45
|
+
padding: 5px 5px 5px 15px;
|
46
|
+
font-size: 12px;
|
47
|
+
margin: -7px;
|
48
|
+
margin-bottom: 0px;
|
49
|
+
background-color: #c00;
|
50
|
+
color: #fff;
|
51
|
+
}
|
52
|
+
|
53
|
+
#error_explanation ul li {
|
54
|
+
font-size: 12px;
|
55
|
+
list-style: square;
|
56
|
+
}
|
File without changes
|
@@ -0,0 +1,106 @@
|
|
1
|
+
class MediaController < AbstractResourcesController
|
2
|
+
|
3
|
+
def update_crop
|
4
|
+
authorize resource
|
5
|
+
result = resource.new_record? ? resource.save(resource_params) : resource.update_attributes(resource_params)
|
6
|
+
render layout: false
|
7
|
+
end
|
8
|
+
|
9
|
+
def crop
|
10
|
+
authorize resource
|
11
|
+
render layout: false
|
12
|
+
end
|
13
|
+
#
|
14
|
+
# def index
|
15
|
+
# authorize Medium
|
16
|
+
# render :json => resources.collect { |p| p.to_jq_upload }.to_json
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def create
|
20
|
+
# authorize Medium
|
21
|
+
# p_attr = resource_params #params[:media]
|
22
|
+
# p_attr[:media] = p_attr[:media].first if p_attr[:media].class == Array
|
23
|
+
#
|
24
|
+
# @resource = Medium.new(p_attr)
|
25
|
+
# if @resource.save
|
26
|
+
# respond_to do |format|
|
27
|
+
# format.html {
|
28
|
+
# render :json => [@resource.to_jq_upload].to_json,
|
29
|
+
# :content_type => 'text/html',
|
30
|
+
# :layout => false
|
31
|
+
# }
|
32
|
+
# format.json {
|
33
|
+
# render :json => { :files => [@resource.to_jq_upload] }
|
34
|
+
# }
|
35
|
+
# end
|
36
|
+
# else
|
37
|
+
# render :json => [{:error => "custom_failure"}], :status => 304
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# def destroy
|
42
|
+
# authorize Medium
|
43
|
+
# @resource = Medium.find(params[:id])
|
44
|
+
# @resource.destroy
|
45
|
+
# render :json => true
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
#
|
49
|
+
|
50
|
+
# before_action :set_medium, only: [:show, :edit, :update, :destroy]
|
51
|
+
#
|
52
|
+
# # GET /media
|
53
|
+
# def index
|
54
|
+
# @media = Medium.all
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# # GET /media/1
|
58
|
+
# def show
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# # GET /media/new
|
62
|
+
# def new
|
63
|
+
# @medium = Medium.new
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# # GET /media/1/edit
|
67
|
+
# def edit
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# # POST /media
|
71
|
+
# def create
|
72
|
+
# @medium = Medium.new(medium_params)
|
73
|
+
#
|
74
|
+
# if @medium.save
|
75
|
+
# redirect_to @medium, notice: 'Medium was successfully created.'
|
76
|
+
# else
|
77
|
+
# render :new
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# # PATCH/PUT /media/1
|
82
|
+
# def update
|
83
|
+
# if @medium.update(medium_params)
|
84
|
+
# redirect_to @medium, notice: 'Medium was successfully updated.'
|
85
|
+
# else
|
86
|
+
# render :edit
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# # DELETE /media/1
|
91
|
+
# def destroy
|
92
|
+
# @medium.destroy
|
93
|
+
# redirect_to media_url, notice: 'Medium was successfully destroyed.'
|
94
|
+
# end
|
95
|
+
|
96
|
+
private
|
97
|
+
# Use callbacks to share common setup or constraints between actions.
|
98
|
+
# def set_medium
|
99
|
+
# @medium = Medium.find(params[:id])
|
100
|
+
# end
|
101
|
+
|
102
|
+
# Only allow a trusted parameter "white list" through.
|
103
|
+
def resource_params
|
104
|
+
params.require(:medium).permit(:title, :imageable_id, :imageable_type, :medium, :medium_crop_w, :medium_crop_h, :medium_crop_y, :medium_crop_x, :lng_lat, :description)
|
105
|
+
end
|
106
|
+
end
|
data/app/helpers/.keep
ADDED
File without changes
|
data/app/mailers/.keep
ADDED
File without changes
|
data/app/models/.keep
ADDED
File without changes
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
# TODO 05-05-2015 make Roleable work with other resource_class too
|
4
|
+
|
5
|
+
module Roleable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
# has_many :somthing
|
10
|
+
enum role: [:user, :vip, :account_admin, :admin]
|
11
|
+
attr_accessor :max_role
|
12
|
+
after_initialize :set_default_role, :if => :new_record?
|
13
|
+
|
14
|
+
validates_with RoleValidator
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def policed_roles user
|
20
|
+
User.roles.keys.map {|role| [role.titleize,role] if User.roles[role] <= User.roles[user.role] }.compact
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# role management
|
25
|
+
# ---------------
|
26
|
+
# enum listing possible roles
|
27
|
+
# max_role setting the model max role to that of the current user - you never can promote anyone above your own level
|
28
|
+
# set_default_role sets the role of a new user
|
29
|
+
#
|
30
|
+
|
31
|
+
class RoleValidator < ActiveModel::Validator
|
32
|
+
attr_accessor :user
|
33
|
+
def validate(record)
|
34
|
+
@user = record
|
35
|
+
Rails.logger.info ("roles: old %s new %s" % [ User.roles[record.previous_version.role], User.roles[record.role] ] ) rescue "no previous role"
|
36
|
+
if max_role_exhausted and old_role_less_than_new
|
37
|
+
record.errors[:role] << I18n.t('.assigned_role_not_allowed')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def old_role_less_than_new
|
42
|
+
User.roles[user.previous_version.role] < User.roles[user.role]
|
43
|
+
rescue
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
def max_role_exhausted
|
48
|
+
User.roles[user.role] > User.roles[user.max_role]
|
49
|
+
rescue
|
50
|
+
false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
def set_default_role
|
57
|
+
self.role ||= :user
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Medium < AbstractResource
|
2
|
+
belongs_to :imageable, polymorphic: true
|
3
|
+
belongs_to :account
|
4
|
+
|
5
|
+
mount_uploader :medium, MediumUploader
|
6
|
+
crop_uploaded :medium
|
7
|
+
#
|
8
|
+
# # attr_accessible :upload
|
9
|
+
# # has_attached_file :upload
|
10
|
+
# #
|
11
|
+
include Rails.application.routes.url_helpers
|
12
|
+
|
13
|
+
def to_jq_upload
|
14
|
+
{
|
15
|
+
"name" => self.medium.filename,
|
16
|
+
"size" => self.medium.size,
|
17
|
+
"url" => self.medium.url,
|
18
|
+
"thumbnailUrl" => self.medium.url,
|
19
|
+
"deleteUrl" => media_url(self, host: 'localhost:3000').gsub( '.','/'),
|
20
|
+
"deleteType" => "DELETE"
|
21
|
+
# "error": "Filetype not allowed"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'carrierwave/processing/mime_types'
|
3
|
+
require 'carrierwave/crop'
|
4
|
+
require 'carrierwave'
|
5
|
+
|
6
|
+
class MediumUploader < CarrierWave::Uploader::Base
|
7
|
+
|
8
|
+
# Include RMagick or MiniMagick support:
|
9
|
+
# include CarrierWave::RMagick
|
10
|
+
# include CarrierWave::MiniMagick
|
11
|
+
include CarrierWave::MiniMagick
|
12
|
+
include CarrierWave::MimeTypes
|
13
|
+
include CarrierWave::Crop::Uploader
|
14
|
+
# include CarrierWave::Processing::MiniMagick
|
15
|
+
|
16
|
+
process :set_content_type
|
17
|
+
process crop: :medium, if: :is_image?
|
18
|
+
|
19
|
+
version :thumb do
|
20
|
+
process resize_to_fill: [200, 150], if: :is_image?
|
21
|
+
|
22
|
+
# if self.is_pdf?
|
23
|
+
# asset_path "2.jpg"
|
24
|
+
# elsif is_doc?
|
25
|
+
# asset_path "2.jpg"
|
26
|
+
# else
|
27
|
+
# asset_path "1.JPG"
|
28
|
+
# end
|
29
|
+
end
|
30
|
+
|
31
|
+
# process resize_to_limit: [400, 400]
|
32
|
+
# process :strip # strip image of all profiles and comments
|
33
|
+
# process :resize_to_fill => [200, 200]
|
34
|
+
# process :quality => 90 # Set JPEG/MIFF/PNG compression level (0-100)
|
35
|
+
# # process :convert => 'png'
|
36
|
+
# process :colorspace => :rgb # Set colorspace to rgb or cmyk
|
37
|
+
# process :blur => [0, 8] #reduce image noise and reduce detail levels [radius,sigma]
|
38
|
+
|
39
|
+
def _url version
|
40
|
+
case content_type
|
41
|
+
when /docx?|document$/; "1.JPG"
|
42
|
+
when /pdf$/; "2.jpg"
|
43
|
+
when /^image/; url
|
44
|
+
else default_url
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
# if Rails.env.production?
|
50
|
+
# storage :fog
|
51
|
+
# else
|
52
|
+
storage :file
|
53
|
+
# end
|
54
|
+
|
55
|
+
# Override the directory where uploaded files will be stored.
|
56
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
57
|
+
def store_dir
|
58
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
59
|
+
end
|
60
|
+
|
61
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
62
|
+
def default_url
|
63
|
+
# For Rails 3.1+ asset pipeline compatibility:
|
64
|
+
ActionController::Base.helpers.asset_path("" + [version_name, "default.jpg"].compact.join('_'))
|
65
|
+
|
66
|
+
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
# Process files as they are uploaded:
|
71
|
+
# process :scale => [200, 300]
|
72
|
+
#
|
73
|
+
# def scale(width, height)
|
74
|
+
# # do something
|
75
|
+
# end
|
76
|
+
|
77
|
+
# Create different versions of your uploaded files:
|
78
|
+
# version :thumb do
|
79
|
+
# process :resize_to_fit => [50, 50]
|
80
|
+
# end
|
81
|
+
|
82
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
83
|
+
# For images you might use something like this:
|
84
|
+
# def extension_white_list
|
85
|
+
# %w(jpg jpeg gif png pdf zip mp4 docx xlsx)
|
86
|
+
# end
|
87
|
+
|
88
|
+
# Override the filename of the uploaded files:
|
89
|
+
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
90
|
+
# def filename
|
91
|
+
# "something.jpg" if original_filename
|
92
|
+
# end
|
93
|
+
|
94
|
+
def is_image? picture
|
95
|
+
picture.content_type =~ /jpg|png|gif/
|
96
|
+
end
|
97
|
+
|
98
|
+
def is_pdf? picture
|
99
|
+
picture.content_type =~ /pdf/
|
100
|
+
end
|
101
|
+
|
102
|
+
def is_doc? picture
|
103
|
+
picture.content_type =~ /docx?$/
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|