tienda 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/tienda/application.coffee +18 -0
- data/app/assets/stylesheets/tienda/custom-styles.scss +9 -0
- data/app/controllers/tienda/products_controller.rb +4 -3
- data/app/helpers/tienda/application_helper.rb +5 -4
- data/app/models/tienda/product.rb +5 -15
- data/app/models/tienda/product_category.rb +3 -2
- data/app/models/tienda/product_image.rb +9 -0
- data/app/uploaders/tienda/category_image_uploader.rb +6 -0
- data/app/uploaders/tienda/image_uploader.rb +48 -0
- data/app/uploaders/tienda/product_image_uploader.rb +6 -0
- data/app/views/tienda/products/_form.html.haml +23 -39
- data/config/initializers/carrierwave.rb +15 -0
- data/config/routes.rb +0 -1
- data/db/migrate/20150626045455_create_tienda_product_images.rb +12 -0
- data/db/migrate/20150628230608_convert_product_images_to_carrierwave.rb +31 -0
- data/lib/tienda.rb +3 -1
- data/lib/tienda/version.rb +1 -1
- metadata +47 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b97ea39013c44c15d7d18bce2149a6a07bb2bc18
|
4
|
+
data.tar.gz: 816df89676e8e4d64bf1699a23c101e0ea8268ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed72a17c07f45fc268b18f449c13f0ba9586ded6d3c85210ba431ece3e231ffcdcc9d801e429b58bef666d94aa227b5713165baf715110c67b9f7407a00964f6
|
7
|
+
data.tar.gz: beea1c4e4b04efe87f531cfe7c6929605741697a3e0e87c3c07509bdf0205dbad9abaef3a60f008542d73304d333500cb5bdef77ee5126f45695230add127784
|
@@ -39,6 +39,24 @@ $ ->
|
|
39
39
|
$('a[rel=searchOrders]').on 'click', ->
|
40
40
|
$('div.search-orders').toggleClass('hide')
|
41
41
|
|
42
|
+
# Add a new image to a table
|
43
|
+
$('a[data-behavior=addImageToImagesTable]').on 'click', ->
|
44
|
+
table = $('table.productImages')
|
45
|
+
nextid = table.find('tbody tr:not(.template)').length
|
46
|
+
template = $('tr.template', table).html().replace('[]', "[#{nextid}]")
|
47
|
+
table.append("<tr>#{template}</tr>")
|
48
|
+
false
|
49
|
+
|
50
|
+
# Remove an image from a table
|
51
|
+
$('table.productImages tbody').on 'click', 'tr td.remove a', ->
|
52
|
+
row = $(this).closest('tr')
|
53
|
+
if row.find('.destroy').length
|
54
|
+
row.find('.destroy').val('true')
|
55
|
+
row.fadeOut()
|
56
|
+
else
|
57
|
+
row.remove()
|
58
|
+
false
|
59
|
+
|
42
60
|
# Add a new attribute to a table
|
43
61
|
$('a[data-behavior=addAttributeToAttributesTable]').on 'click', ->
|
44
62
|
table = $('table.productAttributes')
|
@@ -409,11 +409,20 @@ line-height: 1.428571429;
|
|
409
409
|
PRODUCT STYLES
|
410
410
|
------------------------------------------------*/
|
411
411
|
|
412
|
+
.productImages.table > tbody > tr > td {
|
413
|
+
vertical-align: middle;
|
414
|
+
}
|
415
|
+
|
416
|
+
.productImages td.handle,
|
412
417
|
.productAttributes td.handle {
|
413
418
|
background: image-url('tienda/move.svg') no-repeat center;
|
414
419
|
background-size: 16px
|
415
420
|
}
|
416
421
|
|
422
|
+
.productImages .img_preview {
|
423
|
+
max-height: 60px;
|
424
|
+
}
|
425
|
+
|
417
426
|
/*----------------------------------------------
|
418
427
|
ORDER STATUS STYLES
|
419
428
|
------------------------------------------------*/
|
@@ -6,9 +6,9 @@ module Tienda
|
|
6
6
|
|
7
7
|
def index
|
8
8
|
if params[:filter].blank?
|
9
|
-
@products = Tienda::Product.root.includes(:stock_level_adjustments, :
|
9
|
+
@products = Tienda::Product.root.includes(:stock_level_adjustments, :product_images, :product_category, :variants).order(:name).group_by(&:product_category).sort_by { |cat, pro| cat.name }
|
10
10
|
else
|
11
|
-
@products = Tienda::Product.root.send(params[:filter]).includes(:stock_level_adjustments, :
|
11
|
+
@products = Tienda::Product.root.send(params[:filter]).includes(:stock_level_adjustments, :product_images, :product_category, :variants).order(:name).group_by(&:product_category).sort_by { |cat, pro| cat.name }
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -60,7 +60,8 @@ module Tienda
|
|
60
60
|
:tax_rate_id, :stock_control, :default_image_file, :second_image_file,
|
61
61
|
:third_image_file, :fourth_image_file, :fifth_image_file,
|
62
62
|
:data_sheet_file, :active, :featured, :in_the_box,
|
63
|
-
:product_attributes_array => [:key, :value, :searchable, :public]
|
63
|
+
:product_attributes_array => [:key, :value, :searchable, :public],
|
64
|
+
:product_images_attributes => [:image, :_destroy, :id])
|
64
65
|
end
|
65
66
|
|
66
67
|
end
|
@@ -18,15 +18,16 @@ module Tienda
|
|
18
18
|
def attachment_preview(attachment, options = {})
|
19
19
|
if attachment
|
20
20
|
String.new.tap do |s|
|
21
|
-
if attachment.image
|
22
|
-
style = "style='background-image:url(#{attachment.
|
21
|
+
if attachment.mounted_as == :image
|
22
|
+
style = "style='background-image:url(#{attachment.url})'"
|
23
23
|
else
|
24
24
|
style = ''
|
25
25
|
end
|
26
|
-
s << "<div class='attachmentPreview #{attachment.image
|
26
|
+
s << "<div class='attachmentPreview #{attachment.mounted_as == :image ? 'image' : 'doc'}'>"
|
27
27
|
s << "<div class='imgContainer'><div class='img' #{style}></div></div>"
|
28
28
|
s << "<div class='desc'>"
|
29
|
-
s << "<span class='filename'
|
29
|
+
s << "<span class='filename'>#{link_to File.basename(attachment.path), attachment.url}</span>"
|
30
|
+
# s << "<span class='filename'><a href='#{attachment_path(attachment)}'>#{attachment.file_name}</a></span>"
|
30
31
|
s << "<span class='delete'>"
|
31
32
|
s << link_to(t('helpers.attachment_preview.delete', :default => 'Delete this file?'), attachment_path(attachment), :method => :delete, :data => {:confirm => t('helpers.attachment_preview.delete_confirm', :default => "Are you sure you wish to remove this attachment?")})
|
32
33
|
s << "</span>"
|
@@ -7,16 +7,9 @@ module Tienda
|
|
7
7
|
require_dependency 'tienda/product/product_attributes'
|
8
8
|
require_dependency 'tienda/product/variants'
|
9
9
|
|
10
|
-
# Products have 5 images and a data_sheet
|
11
|
-
attachment :default_image
|
12
|
-
attachment :second_image
|
13
|
-
attachment :third_image
|
14
|
-
attachment :fourth_image
|
15
|
-
attachment :fifth_image
|
16
|
-
attachment :data_sheet
|
17
|
-
|
18
10
|
# To preserve backwards compatibility
|
19
11
|
alias_attribute :stock, :stock_count
|
12
|
+
alias_attribute :images, :product_images
|
20
13
|
|
21
14
|
# The product's category
|
22
15
|
#
|
@@ -37,6 +30,10 @@ module Tienda
|
|
37
30
|
# Stock level adjustments for this product
|
38
31
|
has_many :stock_level_adjustments, dependent: :destroy
|
39
32
|
|
33
|
+
# Product Images
|
34
|
+
has_many :product_images, dependent: :destroy
|
35
|
+
accepts_nested_attributes_for :product_images, reject_if: proc { |attributes| attributes['image'].blank? }, allow_destroy: true
|
36
|
+
|
40
37
|
# Validations
|
41
38
|
with_options if: Proc.new { |p| p.parent.nil? } do |product|
|
42
39
|
product.validates :product_category_id, presence: true
|
@@ -101,13 +98,6 @@ module Tienda
|
|
101
98
|
self.default_variant ? self.default_variant.in_stock? : (stock_control? ? stock_count > 0 : true)
|
102
99
|
end
|
103
100
|
|
104
|
-
# Return all product images
|
105
|
-
#
|
106
|
-
# @return [Array]
|
107
|
-
def images
|
108
|
-
nifty_attachments.select { |attachment| attachment.role != "data_sheet" }
|
109
|
-
end
|
110
|
-
|
111
101
|
# Return all product categories
|
112
102
|
#
|
113
103
|
# @return [Array]
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Tienda
|
2
2
|
class ProductCategory < ActiveRecord::Base
|
3
3
|
|
4
|
-
#
|
5
|
-
|
4
|
+
# Mount Uploader
|
5
|
+
mount_uploader :image, CategoryImageUploader
|
6
6
|
|
7
7
|
# All products within this category
|
8
8
|
has_many :products, dependent: :restrict_with_exception
|
9
|
+
has_many :active_featured_root_products, -> { where(active: true, featured: true, parent_id: nil) }, class_name: 'Tienda::Product'
|
9
10
|
# Sub Categories relationships
|
10
11
|
has_many :children, class_name: 'Tienda::ProductCategory', foreign_key: :parent_id
|
11
12
|
belongs_to :parent, class_name: 'Tienda::ProductCategory'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Tienda
|
3
|
+
class ImageUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :aws
|
8
|
+
|
9
|
+
# Override the directory where uploaded files will be stored.
|
10
|
+
# This is a sensible default for uploaders that are meant to be mounted:
|
11
|
+
def store_dir
|
12
|
+
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Provide a default URL as a default if there hasn't been a file uploaded:
|
16
|
+
# def default_url
|
17
|
+
# # For Rails 3.1+ asset pipeline compatibility:
|
18
|
+
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
|
19
|
+
#
|
20
|
+
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
|
21
|
+
# end
|
22
|
+
|
23
|
+
# Process files as they are uploaded:
|
24
|
+
# process :scale => [200, 300]
|
25
|
+
#
|
26
|
+
# def scale(width, height)
|
27
|
+
# # do something
|
28
|
+
# end
|
29
|
+
|
30
|
+
# Create different versions of your uploaded files:
|
31
|
+
# version :thumb do
|
32
|
+
# process :resize_to_fit => [50, 50]
|
33
|
+
# end
|
34
|
+
|
35
|
+
# Add a white list of extensions which are allowed to be uploaded.
|
36
|
+
# For images you might use something like this:
|
37
|
+
def extension_white_list
|
38
|
+
%w(jpg jpeg gif png)
|
39
|
+
end
|
40
|
+
|
41
|
+
# You can find full list of custom headers in AWS SDK documentation on
|
42
|
+
# AWS::S3::S3Object
|
43
|
+
def download_url(filename)
|
44
|
+
url(response_content_disposition: %Q{attachment; filename="#{filename}"})
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -73,45 +73,29 @@
|
|
73
73
|
.panel-heading
|
74
74
|
= t('tienda.products.attachments')
|
75
75
|
.panel-body
|
76
|
-
.
|
77
|
-
|
78
|
-
|
79
|
-
=
|
80
|
-
%
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
.
|
85
|
-
=
|
86
|
-
%
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
%p= f.file_field :fourth_image_file, class: 'form-control'
|
100
|
-
%div
|
101
|
-
= attachment_preview @product.fourth_image
|
102
|
-
.row
|
103
|
-
.col-md-6
|
104
|
-
.form-group
|
105
|
-
= f.label :fifth_image_file, t('tienda.products.fifth_image')
|
106
|
-
%p= f.file_field :fifth_image_file, class: 'form-control'
|
107
|
-
%div
|
108
|
-
= attachment_preview @product.fifth_image
|
109
|
-
.col-md-6
|
110
|
-
.form-group
|
111
|
-
= f.label :data_sheet_file, t('tienda.products.datasheet')
|
112
|
-
%p= f.file_field :data_sheet_file, class: 'form-control'
|
113
|
-
%div
|
114
|
-
= attachment_preview @product.data_sheet
|
76
|
+
%table.productImages.table.table-hover
|
77
|
+
%thead
|
78
|
+
%tr
|
79
|
+
%th= t('tienda.products.preview')
|
80
|
+
%th= t('tienda.products.file_name')
|
81
|
+
%th.remove= t('tienda.products.remove')
|
82
|
+
%th
|
83
|
+
%tbody
|
84
|
+
%tr.template{style: 'display:none;'}
|
85
|
+
%td= file_field_tag 'product[product_images_attributes][][image]', class: 'form-control'
|
86
|
+
%td= t('tienda.products.file_name')
|
87
|
+
%td.remove= link_to t('tienda.remove') , '#', class: 'btn btn-sm btn-danger'
|
88
|
+
%td
|
89
|
+
- @product.product_images.each_with_index do |image, i|
|
90
|
+
%tr
|
91
|
+
%td= image_tag image.image.url, class: :img_preview
|
92
|
+
%td= File.basename(image.image.path)
|
93
|
+
%td.remove
|
94
|
+
= link_to t("tienda.remove"), '#', class: 'btn btn-sm btn-danger'
|
95
|
+
= hidden_field_tag "product[product_images_attributes][#{i}][id]", image.id
|
96
|
+
= hidden_field_tag "product[product_images_attributes][#{i}][_destroy]", '', class: 'destroy'
|
97
|
+
%td
|
98
|
+
%p.addImage= link_to t('tienda.products.add_image') , '#', data: {behavior: 'addImageToImagesTable'}, class: 'btn btn-success btn-sm'
|
115
99
|
|
116
100
|
.panel.panel-default
|
117
101
|
.panel-heading
|
@@ -0,0 +1,15 @@
|
|
1
|
+
CarrierWave.configure do |config|
|
2
|
+
AWS_CONFIG = Rails.application.secrets.aws_config
|
3
|
+
|
4
|
+
config.storage = :aws
|
5
|
+
config.aws_bucket = AWS_CONFIG['s3_bucket_name']
|
6
|
+
config.aws_acl = :'public-read'
|
7
|
+
config.asset_host = 'https://cdn.masinfinitocasa.com'
|
8
|
+
config.aws_authenticated_url_expiration = 60 * 60 * 24 * 365
|
9
|
+
|
10
|
+
config.aws_credentials = {
|
11
|
+
access_key_id: AWS_CONFIG['s3_key'],
|
12
|
+
secret_access_key: AWS_CONFIG['s3_secret'],
|
13
|
+
region: AWS_CONFIG['s3_region']
|
14
|
+
}
|
15
|
+
end
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateTiendaProductImages < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :tienda_product_images do |t|
|
4
|
+
t.references :product, index: true
|
5
|
+
t.string :image
|
6
|
+
|
7
|
+
t.timestamps null: false
|
8
|
+
end
|
9
|
+
add_column :tienda_product_categories, :image, :string
|
10
|
+
# add_foreign_key :tienda_product_images, :products
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class ConvertProductImagesToCarrierwave < ActiveRecord::Migration
|
2
|
+
PRODUCT_IMAGE_TYPES = [:default_image, :second_image, :third_image, :fourth_image, :fifth_image]
|
3
|
+
def up
|
4
|
+
# Product Images
|
5
|
+
PRODUCT_IMAGE_TYPES.each do |image_type|
|
6
|
+
puts "Converting Product's #{image_type}s"
|
7
|
+
sql = "SELECT parent_id, file_name, data FROM nifty_attachments WHERE parent_type = 'Tienda::Product' AND role = '#{image_type}'"
|
8
|
+
ActiveRecord::Base.connection.execute(sql).each do |attachment|
|
9
|
+
File.open(attachment[1], 'wb') { |f| f.write(attachment[2]) }
|
10
|
+
image = Tienda::ProductImage.new
|
11
|
+
image.product_id = attachment[0]
|
12
|
+
File.open(attachment[1], 'r') { |f| image.image = f }
|
13
|
+
image.save
|
14
|
+
File.delete(attachment[1])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
#Product Categories Images
|
19
|
+
puts "Converting Product Categoeies' images"
|
20
|
+
sql = "SELECT parent_id, file_name, data FROM nifty_attachments WHERE parent_type = 'Tienda::ProductCategory'"
|
21
|
+
ActiveRecord::Base.connection.execute(sql).each do |attachment|
|
22
|
+
File.open(attachment[1], 'wb') { |f| f.write(attachment[2]) }
|
23
|
+
category = Tienda::ProductCategory.find attachment[0]
|
24
|
+
File.open(attachment[1], 'r') { |f| category.image = f }
|
25
|
+
category.save
|
26
|
+
File.delete(attachment[1])
|
27
|
+
end
|
28
|
+
|
29
|
+
drop_table :nifty_attachments
|
30
|
+
end
|
31
|
+
end
|
data/lib/tienda.rb
CHANGED
@@ -4,10 +4,12 @@ require 'dynamic_form'
|
|
4
4
|
require 'kaminari'
|
5
5
|
require 'ransack'
|
6
6
|
require 'counter_culture'
|
7
|
+
require 'carrierwave'
|
8
|
+
require 'carrierwave-aws'
|
9
|
+
require 'mini_magick'
|
7
10
|
|
8
11
|
require 'nifty/utils'
|
9
12
|
require 'nifty/key_value_store'
|
10
|
-
require 'nifty/attachments'
|
11
13
|
|
12
14
|
module Tienda
|
13
15
|
class << self
|
data/lib/tienda/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tienda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gonzalo Robaina
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -199,46 +199,54 @@ dependencies:
|
|
199
199
|
- !ruby/object:Gem::Version
|
200
200
|
version: 0.1.23
|
201
201
|
- !ruby/object:Gem::Dependency
|
202
|
-
name:
|
202
|
+
name: carrierwave
|
203
203
|
requirement: !ruby/object:Gem::Requirement
|
204
204
|
requirements:
|
205
205
|
- - ">="
|
206
206
|
- !ruby/object:Gem::Version
|
207
|
-
version:
|
208
|
-
- - "<"
|
209
|
-
- !ruby/object:Gem::Version
|
210
|
-
version: 2.0.0
|
207
|
+
version: 0.10.0
|
211
208
|
type: :runtime
|
212
209
|
prerelease: false
|
213
210
|
version_requirements: !ruby/object:Gem::Requirement
|
214
211
|
requirements:
|
215
212
|
- - ">="
|
216
213
|
- !ruby/object:Gem::Version
|
217
|
-
version:
|
218
|
-
|
214
|
+
version: 0.10.0
|
215
|
+
- !ruby/object:Gem::Dependency
|
216
|
+
name: carrierwave-aws
|
217
|
+
requirement: !ruby/object:Gem::Requirement
|
218
|
+
requirements:
|
219
|
+
- - ">="
|
219
220
|
- !ruby/object:Gem::Version
|
220
|
-
version:
|
221
|
+
version: 0.5.0
|
222
|
+
type: :runtime
|
223
|
+
prerelease: false
|
224
|
+
version_requirements: !ruby/object:Gem::Requirement
|
225
|
+
requirements:
|
226
|
+
- - ">="
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: 0.5.0
|
221
229
|
- !ruby/object:Gem::Dependency
|
222
|
-
name:
|
230
|
+
name: mini_magick
|
223
231
|
requirement: !ruby/object:Gem::Requirement
|
224
232
|
requirements:
|
225
|
-
- - "
|
233
|
+
- - ">="
|
226
234
|
- !ruby/object:Gem::Version
|
227
|
-
version:
|
235
|
+
version: 4.2.7
|
228
236
|
type: :runtime
|
229
237
|
prerelease: false
|
230
238
|
version_requirements: !ruby/object:Gem::Requirement
|
231
239
|
requirements:
|
232
|
-
- - "
|
240
|
+
- - ">="
|
233
241
|
- !ruby/object:Gem::Version
|
234
|
-
version:
|
242
|
+
version: 4.2.7
|
235
243
|
- !ruby/object:Gem::Dependency
|
236
|
-
name: nifty-
|
244
|
+
name: nifty-key-value-store
|
237
245
|
requirement: !ruby/object:Gem::Requirement
|
238
246
|
requirements:
|
239
247
|
- - ">="
|
240
248
|
- !ruby/object:Gem::Version
|
241
|
-
version: 1.0.
|
249
|
+
version: 1.0.1
|
242
250
|
- - "<"
|
243
251
|
- !ruby/object:Gem::Version
|
244
252
|
version: 2.0.0
|
@@ -248,10 +256,24 @@ dependencies:
|
|
248
256
|
requirements:
|
249
257
|
- - ">="
|
250
258
|
- !ruby/object:Gem::Version
|
251
|
-
version: 1.0.
|
259
|
+
version: 1.0.1
|
252
260
|
- - "<"
|
253
261
|
- !ruby/object:Gem::Version
|
254
262
|
version: 2.0.0
|
263
|
+
- !ruby/object:Gem::Dependency
|
264
|
+
name: nifty-utils
|
265
|
+
requirement: !ruby/object:Gem::Requirement
|
266
|
+
requirements:
|
267
|
+
- - "~>"
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '1.0'
|
270
|
+
type: :runtime
|
271
|
+
prerelease: false
|
272
|
+
version_requirements: !ruby/object:Gem::Requirement
|
273
|
+
requirements:
|
274
|
+
- - "~>"
|
275
|
+
- !ruby/object:Gem::Version
|
276
|
+
version: '1.0'
|
255
277
|
- !ruby/object:Gem::Dependency
|
256
278
|
name: sqlite3
|
257
279
|
requirement: !ruby/object:Gem::Requirement
|
@@ -447,10 +469,14 @@ files:
|
|
447
469
|
- app/models/tienda/product/variants.rb
|
448
470
|
- app/models/tienda/product_attribute.rb
|
449
471
|
- app/models/tienda/product_category.rb
|
472
|
+
- app/models/tienda/product_image.rb
|
450
473
|
- app/models/tienda/setting.rb
|
451
474
|
- app/models/tienda/stock_level_adjustment.rb
|
452
475
|
- app/models/tienda/tax_rate.rb
|
453
476
|
- app/models/tienda/user.rb
|
477
|
+
- app/uploaders/tienda/category_image_uploader.rb
|
478
|
+
- app/uploaders/tienda/image_uploader.rb
|
479
|
+
- app/uploaders/tienda/product_image_uploader.rb
|
454
480
|
- app/validators/permalink_validator.rb
|
455
481
|
- app/views/layouts/tienda/application.html.haml
|
456
482
|
- app/views/layouts/tienda/printable.html.haml
|
@@ -514,6 +540,7 @@ files:
|
|
514
540
|
- app/views/tienda/variants/form.html.haml
|
515
541
|
- app/views/tienda/variants/index.html.haml
|
516
542
|
- config/initializers/assets.rb
|
543
|
+
- config/initializers/carrierwave.rb
|
517
544
|
- config/locales/en.yml
|
518
545
|
- config/locales/pl.yml
|
519
546
|
- config/locales/pt-BR.yml
|
@@ -525,6 +552,8 @@ files:
|
|
525
552
|
- db/migrate/20150517212100_update_stock_counter_cache.rb
|
526
553
|
- db/migrate/20150603235417_add_document_to_orders.rb
|
527
554
|
- db/migrate/20150605232554_add_parent_id_to_categories.rb
|
555
|
+
- db/migrate/20150626045455_create_tienda_product_images.rb
|
556
|
+
- db/migrate/20150628230608_convert_product_images_to_carrierwave.rb
|
528
557
|
- db/seeds.rb
|
529
558
|
- db/seeds_data/poe400.jpg
|
530
559
|
- db/seeds_data/snom-870-blk.jpg
|