kkt_shoppe 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/app/assets/javascripts/kkt_shoppe/application.coffee +5 -0
- data/app/assets/stylesheets/kkt_shoppe/application.scss +12 -1
- data/app/controllers/kkt_shoppe/attachments_controller.rb +1 -1
- data/app/controllers/kkt_shoppe/products_controller.rb +3 -2
- data/app/helpers/kkt_shoppe/application_helper.rb +4 -4
- data/app/models/kkt_shoppe/product.rb +23 -3
- data/app/models/kkt_shoppe/product_category.rb +9 -2
- data/app/models/shoppe/attachment.rb +48 -0
- data/app/uploaders/shoppe/attachment_uploader.rb +29 -0
- data/app/views/kkt_shoppe/products/_form.html.haml +24 -4
- data/config/locales/de.yml +3 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/pl.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/db/migrate/20150315223628_create_kkt_shoppe_attachments.rb +16 -0
- data/db/schema.rb +56 -42
- data/lib/kkt_shoppe/engine.rb +15 -11
- data/lib/kkt_shoppe/model_extension.rb +44 -0
- data/lib/kkt_shoppe/version.rb +1 -1
- data/lib/kkt_shoppe.rb +1 -1
- data/lib/shoppe/model_extension.rb +44 -0
- metadata +45 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb53752d16704023abdca027c6e387744b60e4c9
|
4
|
+
data.tar.gz: 58f330c325c07e7e3e06d6cc4a3252a07889034d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98dd5d416ce71c145558bb2188a9898cc97f513d232a9b75d9ed8edf9bb9c69733ec85f3df2e69e3f503db3f8b824421c6c301e816bf6e4f212190bb5666d8ff
|
7
|
+
data.tar.gz: b1d45698bf1f00c6b78eb29342751cb5d821d63f328995d0fb731737297c97b7646b90c1723d8df9a980ed527ee8c4a37d2236429bb3b628019af3f46b031597
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# KktShoppe
|
2
2
|
|
3
3
|
KktShoppe is an Rails-based e-commerce platform which allows you to easily introduce a
|
4
|
-
catalogue-based store into your Rails 4 applications.
|
4
|
+
catalogue-based store into your Rails 4 applications.
|
5
5
|
|
6
6
|
![GemVersion](https://badge.fury.io/rb/kkt_shoppe.png)
|
7
7
|
[![Code Climate](https://codeclimate.com/github/trykkt_shoppe/core/badges/gpa.svg)](https://codeclimate.com/github/trykkt_shoppe/core)
|
@@ -39,7 +39,6 @@ instructions below and you'll be up and running in minutes.
|
|
39
39
|
echo "gem 'kkt_shoppe', '~> 1.0'" >> Gemfile
|
40
40
|
bundle
|
41
41
|
rails generate kkt_shoppe:setup
|
42
|
-
rails generate nifty:attachments:migration
|
43
42
|
rails generate nifty:key_value_store:migration
|
44
43
|
rake db:migrate kkt_shoppe:setup
|
45
44
|
rails server
|
@@ -42,6 +42,11 @@ $ ->
|
|
42
42
|
helper.children().each (index)->
|
43
43
|
$(this).width(originals.eq(index).width())
|
44
44
|
helper
|
45
|
+
|
46
|
+
$('a[data-behavior=addAttachmentToExtraAttachments]').on 'click', (event) ->
|
47
|
+
event.preventDefault();
|
48
|
+
$('div.extraAttachments').show();
|
49
|
+
$(this).hide();
|
45
50
|
|
46
51
|
# Chosen
|
47
52
|
$('select.chosen').chosen()
|
@@ -183,7 +183,7 @@ header.main {
|
|
183
183
|
width:49%;
|
184
184
|
margin:0;
|
185
185
|
float:left;
|
186
|
-
&:
|
186
|
+
&:nth-child(2) { float:right;}
|
187
187
|
}
|
188
188
|
|
189
189
|
&.third {
|
@@ -299,6 +299,17 @@ header.main {
|
|
299
299
|
}
|
300
300
|
}
|
301
301
|
|
302
|
+
div.extraAttachments{
|
303
|
+
display: none;
|
304
|
+
|
305
|
+
dl.half { margin-top: 15px; }
|
306
|
+
}
|
307
|
+
|
308
|
+
p.addAttachments {
|
309
|
+
float: right;
|
310
|
+
margin: 15px 25px 0 0;
|
311
|
+
}
|
312
|
+
|
302
313
|
//
|
303
314
|
// attachment preview
|
304
315
|
//
|
@@ -2,7 +2,7 @@ module KktShoppe
|
|
2
2
|
class AttachmentsController < KktShoppe::ApplicationController
|
3
3
|
|
4
4
|
def destroy
|
5
|
-
@attachment =
|
5
|
+
@attachment = Shoppe::Attachment.find_by!(token: params[:id])
|
6
6
|
@attachment.destroy
|
7
7
|
respond_to do |wants|
|
8
8
|
wants.html { redirect_to request.referer, :notice => t('kkt_shoppe.attachments.remove_notice')}
|
@@ -5,7 +5,7 @@ module KktShoppe
|
|
5
5
|
before_filter { params[:id] && @product = KktShoppe::Product.root.find(params[:id]) }
|
6
6
|
|
7
7
|
def index
|
8
|
-
@products = KktShoppe::Product.root.includes(:translations, :stock_level_adjustments, :
|
8
|
+
@products = KktShoppe::Product.root.includes(:translations, :stock_level_adjustments, :product_categories, :variants).order(:name).group_by(&:product_category).sort_by { |cat,pro| cat.name }
|
9
9
|
end
|
10
10
|
|
11
11
|
def new
|
@@ -51,7 +51,8 @@ module KktShoppe
|
|
51
51
|
private
|
52
52
|
|
53
53
|
def safe_params
|
54
|
-
|
54
|
+
file_params = [:file, :parent_id, :role, :parent_type, :file => []]
|
55
|
+
params[:product].permit(:name, :sku, :permalink, :description, :short_description, :weight, :price, :cost_price, :tax_rate_id, :stock_control, :active, :featured, :in_the_box, :attachments => [:default_image => file_params, :data_sheet => file_params, :extra => file_params], :product_attributes_array => [:key, :value, :searchable, :public], :product_category_ids => [])
|
55
56
|
end
|
56
57
|
|
57
58
|
end
|
@@ -10,19 +10,19 @@ module KktShoppe
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def attachment_preview(attachment, options = {})
|
13
|
-
if attachment
|
13
|
+
if attachment.present? and attachment.token.present?
|
14
14
|
String.new.tap do |s|
|
15
15
|
if attachment.image?
|
16
|
-
style = "style='background-image:url(#{attachment.
|
16
|
+
style = "style='background-image:url(#{attachment.file.thumb.url})'"
|
17
17
|
else
|
18
18
|
style = ''
|
19
19
|
end
|
20
20
|
s << "<div class='attachmentPreview #{attachment.image? ? 'image' : 'doc'}'>"
|
21
21
|
s << "<div class='imgContainer'><div class='img' #{style}></div></div>"
|
22
22
|
s << "<div class='desc'>"
|
23
|
-
s << "<span class='filename'><a href='#{
|
23
|
+
s << "<span class='filename'><a href='#{attachment.file.url}'>#{attachment.file_name}</a></span>"
|
24
24
|
s << "<span class='delete'>"
|
25
|
-
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?")})
|
25
|
+
s << link_to(t('helpers.attachment_preview.delete', :default => 'Delete this file?'), attachment_path(attachment.token), :method => :delete, :data => {:confirm => t('helpers.attachment_preview.delete_confirm', :default => "Are you sure you wish to remove this attachment?")})
|
26
26
|
s << "</span>"
|
27
27
|
s << "</div>"
|
28
28
|
s << "</div>"
|
@@ -10,9 +10,8 @@ module KktShoppe
|
|
10
10
|
require_dependency 'kkt_shoppe/product/product_attributes'
|
11
11
|
require_dependency 'kkt_shoppe/product/variants'
|
12
12
|
|
13
|
-
#
|
14
|
-
|
15
|
-
attachment :data_sheet
|
13
|
+
# Attachments for this product
|
14
|
+
has_many :attachments, :as => :parent, :dependent => :destroy, :autosave => true, :class_name => "Shoppe::Attachment"
|
16
15
|
|
17
16
|
# The product's categorizations
|
18
17
|
#
|
@@ -63,6 +62,13 @@ module KktShoppe
|
|
63
62
|
translates :name, :permalink, :description, :short_description
|
64
63
|
scope :ordered, -> { includes(:translations).order(:name) }
|
65
64
|
|
65
|
+
def attachments=(attrs)
|
66
|
+
if attrs["default_image"]["file"].present? then self.attachments.build(attrs["default_image"]) end
|
67
|
+
if attrs["data_sheet"]["file"].present? then self.attachments.build(attrs["data_sheet"]) end
|
68
|
+
|
69
|
+
if attrs["extra"]["file"].present? then attrs["extra"]["file"].each { |attr| self.attachments.build(file: attr, parent_id: attrs["extra"]["parent_id"], parent_type: attrs["extra"]["parent_type"]) } end
|
70
|
+
end
|
71
|
+
|
66
72
|
# Return the name of the product
|
67
73
|
#
|
68
74
|
# @return [String]
|
@@ -108,6 +114,20 @@ module KktShoppe
|
|
108
114
|
self.product_categories.first rescue nil
|
109
115
|
end
|
110
116
|
|
117
|
+
# Return attachment for the default_image role
|
118
|
+
#
|
119
|
+
# @return [String]
|
120
|
+
def default_image
|
121
|
+
self.attachments.for("default_image")
|
122
|
+
end
|
123
|
+
|
124
|
+
# Return attachment for the data_sheet role
|
125
|
+
#
|
126
|
+
# @return [String]
|
127
|
+
def data_sheet
|
128
|
+
self.attachments.for("data_sheet")
|
129
|
+
end
|
130
|
+
|
111
131
|
# Search for products which include the given attributes and return an active record
|
112
132
|
# scope of these products. Chainable with other scopes and with_attributes methods.
|
113
133
|
# For example:
|
@@ -12,8 +12,8 @@ module KktShoppe
|
|
12
12
|
|
13
13
|
self.table_name = 'kkt_shoppe_product_categories'
|
14
14
|
|
15
|
-
#
|
16
|
-
|
15
|
+
# Attachments for this product category
|
16
|
+
has_many :attachments, :as => :parent, :dependent => :destroy, :class_name => "Shoppe::Attachment"
|
17
17
|
|
18
18
|
# All products within this category
|
19
19
|
has_many :product_categorizations, dependent: :restrict_with_exception, class_name: 'KktShoppe::ProductCategorization', inverse_of: :product_category
|
@@ -51,6 +51,13 @@ module KktShoppe
|
|
51
51
|
parent.hierarchy_array.concat [self]
|
52
52
|
end
|
53
53
|
|
54
|
+
# Attachment with the role image
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
def image
|
58
|
+
self.attachments.for("image")
|
59
|
+
end
|
60
|
+
|
54
61
|
private
|
55
62
|
|
56
63
|
def set_permalink
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Shoppe
|
2
|
+
class Attachment < ActiveRecord::Base
|
3
|
+
|
4
|
+
# Set the table name
|
5
|
+
self.table_name = "shoppe_attachments"
|
6
|
+
|
7
|
+
# Mount the Carrierwave uploader
|
8
|
+
mount_uploader :file, AttachmentUploader
|
9
|
+
|
10
|
+
# Relationships
|
11
|
+
belongs_to :parent, :polymorphic => true
|
12
|
+
|
13
|
+
# Validations
|
14
|
+
validates :file_name, :presence => true
|
15
|
+
validates :file_type, :presence => true
|
16
|
+
validates :file_size, :presence => true
|
17
|
+
validates :file, :presence => true
|
18
|
+
validates :token, :presence => true, :uniqueness => true
|
19
|
+
|
20
|
+
# All attachments should have a token assigned to this
|
21
|
+
before_validation { self.token = SecureRandom.uuid if self.token.blank? }
|
22
|
+
|
23
|
+
# Set the appropriate values in the model
|
24
|
+
before_validation do
|
25
|
+
if self.file
|
26
|
+
self.file_name = self.file.filename if self.file_name.blank?
|
27
|
+
self.file_type = self.file.content_type if self.file_type.blank?
|
28
|
+
self.file_size = self.file.size if self.file_size.blank?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Return the attachment for a given role
|
33
|
+
def self.for(role)
|
34
|
+
self.where(:role => role).first
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return the path to the attachment
|
38
|
+
def path
|
39
|
+
file.url
|
40
|
+
end
|
41
|
+
|
42
|
+
# Is the attachment an image?
|
43
|
+
def image?
|
44
|
+
file_type.match(/\Aimage\//).present?
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Shoppe::AttachmentUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :file
|
8
|
+
|
9
|
+
# Where should files be stored?
|
10
|
+
def store_dir
|
11
|
+
"attachment/#{model.id}"
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns true if the file is an image
|
15
|
+
def image?(new_file)
|
16
|
+
self.file.content_type.include? 'image'
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns true if the file is not an image
|
20
|
+
def not_image?(new_file)
|
21
|
+
!self.file.content_type.include? 'image'
|
22
|
+
end
|
23
|
+
|
24
|
+
# Create different versions of your uploaded files:
|
25
|
+
version :thumb, :if => :image? do
|
26
|
+
process :resize_and_pad => [200, 200]
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -57,15 +57,35 @@
|
|
57
57
|
= field_set_tag t('kkt_shoppe.products.attachments') do
|
58
58
|
.splitContainer
|
59
59
|
%dl.half
|
60
|
-
%dt= f.label
|
60
|
+
%dt= f.label "attachments[default_image][file]", t('kkt_shoppe.products.default_image')
|
61
61
|
%dd
|
62
62
|
= attachment_preview @product.default_image
|
63
|
-
%p= f.file_field
|
63
|
+
%p= f.file_field "attachments[default_image][file]"
|
64
|
+
= f.hidden_field "attachments[default_image][role]", value: "default_image"
|
65
|
+
= f.hidden_field "attachments[default_image][parent_id]", value: @product.id
|
64
66
|
%dl.half
|
65
|
-
%dt= f.label
|
67
|
+
%dt= f.label "attachments[data_sheet][file]", t('kkt_shoppe.products.datasheet')
|
66
68
|
%dd
|
67
69
|
= attachment_preview @product.data_sheet
|
68
|
-
%p= f.file_field
|
70
|
+
%p= f.file_field "attachments[data_sheet][file]"
|
71
|
+
= f.hidden_field "attachments[data_sheet][role]", value: "data_sheet"
|
72
|
+
= f.hidden_field "attachments[data_sheet][parent_id]", value: @product.id
|
73
|
+
|
74
|
+
.splitContainer.extraAttachments
|
75
|
+
%dl.half
|
76
|
+
%dd
|
77
|
+
= attachment_preview nil, hide_if_blank: false
|
78
|
+
%p= f.file_field "attachments[extra][file]", :multiple => true
|
79
|
+
= f.hidden_field "attachments[extra][parent_type]", value: "KktShoppe::Product"
|
80
|
+
= f.hidden_field "attachments[extra][parent_id]", value: @product.id
|
81
|
+
|
82
|
+
- @product.attachments.each do |attachment|
|
83
|
+
- unless ["default_image", "data_sheet"].include?(attachment.role)
|
84
|
+
%dl.half
|
85
|
+
%dd
|
86
|
+
= attachment_preview attachment
|
87
|
+
|
88
|
+
%p.addAttachments= link_to t('kkt_shoppe.products.add_attachments') , '#', :data => {:behavior => 'addAttachmentToExtraAttachments'}, :class => 'button button-mini green'
|
69
89
|
|
70
90
|
- unless @product.has_variants?
|
71
91
|
= field_set_tag t('kkt_shoppe.products.pricing') do
|
data/config/locales/de.yml
CHANGED
@@ -387,6 +387,7 @@ de:
|
|
387
387
|
attachments: Anhänge
|
388
388
|
back_to_categories: Zurück zu den Kategorien
|
389
389
|
category_details: Kategoriedetails
|
390
|
+
choose_product_category: Produktkategorie auswählen
|
390
391
|
create_notice: Kategorie wurde erfolgreich erstellt
|
391
392
|
delete_confirmation: Möchten Sie diese Kategorie wirklich löschen?
|
392
393
|
description: Beschreibung
|
@@ -400,6 +401,7 @@ de:
|
|
400
401
|
update_notice: Kategorie wurde erfolgreich aktualisiert
|
401
402
|
|
402
403
|
products:
|
404
|
+
add_attachments: Anhänge betrachten/hinzufügen
|
403
405
|
add_attribute: Attribut hinzufügen
|
404
406
|
attachments: Anhänge
|
405
407
|
attributes: Attribute
|
@@ -601,6 +603,7 @@ de:
|
|
601
603
|
users: Benutzer
|
602
604
|
countries: Länder
|
603
605
|
settings: Einstellungen
|
606
|
+
customers: Kunden
|
604
607
|
|
605
608
|
settings:
|
606
609
|
|
data/config/locales/en.yml
CHANGED
data/config/locales/es.yml
CHANGED
data/config/locales/pl.yml
CHANGED
data/config/locales/pt-BR.yml
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateKktShoppeAttachments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :kkt_shoppe_attachments do |t|
|
4
|
+
t.integer :parent_id, null: false
|
5
|
+
t.string :parent_type, null: false
|
6
|
+
t.string :token, unique: true
|
7
|
+
t.string :file, null: false
|
8
|
+
t.string :file_name
|
9
|
+
t.integer :file_size
|
10
|
+
t.string :file_type
|
11
|
+
t.string :role
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/db/schema.rb
CHANGED
@@ -11,20 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
15
|
-
|
16
|
-
create_table "nifty_attachments", force: true do |t|
|
17
|
-
t.integer "parent_id"
|
18
|
-
t.string "parent_type"
|
19
|
-
t.string "token"
|
20
|
-
t.string "digest"
|
21
|
-
t.string "role"
|
22
|
-
t.string "file_name"
|
23
|
-
t.string "file_type"
|
24
|
-
t.binary "data", limit: 16777215
|
25
|
-
t.datetime "created_at"
|
26
|
-
t.datetime "updated_at"
|
27
|
-
end
|
14
|
+
ActiveRecord::Schema.define(version: 20150519173350) do
|
28
15
|
|
29
16
|
create_table "nifty_key_value_store", force: true do |t|
|
30
17
|
t.integer "parent_id"
|
@@ -48,7 +35,7 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
48
35
|
t.datetime "updated_at"
|
49
36
|
end
|
50
37
|
|
51
|
-
add_index "kkt_shoppe_addresses", ["customer_id"], name: "index_kkt_shoppe_addresses_on_customer_id"
|
38
|
+
add_index "kkt_shoppe_addresses", ["customer_id"], name: "index_kkt_shoppe_addresses_on_customer_id"
|
52
39
|
|
53
40
|
create_table "kkt_shoppe_attachments", force: true do |t|
|
54
41
|
t.integer "parent_id", null: false
|
@@ -97,10 +84,10 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
97
84
|
t.text "country_ids"
|
98
85
|
end
|
99
86
|
|
100
|
-
add_index "kkt_shoppe_delivery_service_prices", ["delivery_service_id"], name: "index_kkt_shoppe_delivery_service_prices_on_delivery_service_id"
|
101
|
-
add_index "kkt_shoppe_delivery_service_prices", ["max_weight"], name: "index_kkt_shoppe_delivery_service_prices_on_max_weight"
|
102
|
-
add_index "kkt_shoppe_delivery_service_prices", ["min_weight"], name: "index_kkt_shoppe_delivery_service_prices_on_min_weight"
|
103
|
-
add_index "kkt_shoppe_delivery_service_prices", ["price"], name: "index_kkt_shoppe_delivery_service_prices_on_price"
|
87
|
+
add_index "kkt_shoppe_delivery_service_prices", ["delivery_service_id"], name: "index_kkt_shoppe_delivery_service_prices_on_delivery_service_id"
|
88
|
+
add_index "kkt_shoppe_delivery_service_prices", ["max_weight"], name: "index_kkt_shoppe_delivery_service_prices_on_max_weight"
|
89
|
+
add_index "kkt_shoppe_delivery_service_prices", ["min_weight"], name: "index_kkt_shoppe_delivery_service_prices_on_min_weight"
|
90
|
+
add_index "kkt_shoppe_delivery_service_prices", ["price"], name: "index_kkt_shoppe_delivery_service_prices_on_price"
|
104
91
|
|
105
92
|
create_table "kkt_shoppe_delivery_services", force: true do |t|
|
106
93
|
t.string "name"
|
@@ -113,7 +100,7 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
113
100
|
t.string "tracking_url"
|
114
101
|
end
|
115
102
|
|
116
|
-
add_index "kkt_shoppe_delivery_services", ["active"], name: "index_kkt_shoppe_delivery_services_on_active"
|
103
|
+
add_index "kkt_shoppe_delivery_services", ["active"], name: "index_kkt_shoppe_delivery_services_on_active"
|
117
104
|
|
118
105
|
create_table "kkt_shoppe_order_items", force: true do |t|
|
119
106
|
t.integer "order_id"
|
@@ -129,8 +116,8 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
129
116
|
t.datetime "updated_at"
|
130
117
|
end
|
131
118
|
|
132
|
-
add_index "kkt_shoppe_order_items", ["order_id"], name: "index_kkt_shoppe_order_items_on_order_id"
|
133
|
-
add_index "kkt_shoppe_order_items", ["ordered_item_id", "ordered_item_type"], name: "index_kkt_shoppe_order_items_ordered_item"
|
119
|
+
add_index "kkt_shoppe_order_items", ["order_id"], name: "index_kkt_shoppe_order_items_on_order_id"
|
120
|
+
add_index "kkt_shoppe_order_items", ["ordered_item_id", "ordered_item_type"], name: "index_kkt_shoppe_order_items_ordered_item"
|
134
121
|
|
135
122
|
create_table "kkt_shoppe_orders", force: true do |t|
|
136
123
|
t.string "token"
|
@@ -177,9 +164,9 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
177
164
|
t.integer "customer_id"
|
178
165
|
end
|
179
166
|
|
180
|
-
add_index "kkt_shoppe_orders", ["delivery_service_id"], name: "index_kkt_shoppe_orders_on_delivery_service_id"
|
181
|
-
add_index "kkt_shoppe_orders", ["received_at"], name: "index_kkt_shoppe_orders_on_received_at"
|
182
|
-
add_index "kkt_shoppe_orders", ["token"], name: "index_kkt_shoppe_orders_on_token"
|
167
|
+
add_index "kkt_shoppe_orders", ["delivery_service_id"], name: "index_kkt_shoppe_orders_on_delivery_service_id"
|
168
|
+
add_index "kkt_shoppe_orders", ["received_at"], name: "index_kkt_shoppe_orders_on_received_at"
|
169
|
+
add_index "kkt_shoppe_orders", ["token"], name: "index_kkt_shoppe_orders_on_token"
|
183
170
|
|
184
171
|
create_table "kkt_shoppe_payments", force: true do |t|
|
185
172
|
t.integer "order_id"
|
@@ -195,8 +182,8 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
195
182
|
t.datetime "updated_at"
|
196
183
|
end
|
197
184
|
|
198
|
-
add_index "kkt_shoppe_payments", ["order_id"], name: "index_kkt_shoppe_payments_on_order_id"
|
199
|
-
add_index "kkt_shoppe_payments", ["parent_payment_id"], name: "index_kkt_shoppe_payments_on_parent_payment_id"
|
185
|
+
add_index "kkt_shoppe_payments", ["order_id"], name: "index_kkt_shoppe_payments_on_order_id"
|
186
|
+
add_index "kkt_shoppe_payments", ["parent_payment_id"], name: "index_kkt_shoppe_payments_on_parent_payment_id"
|
200
187
|
|
201
188
|
create_table "kkt_shoppe_product_attributes", force: true do |t|
|
202
189
|
t.integer "product_id"
|
@@ -209,9 +196,9 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
209
196
|
t.boolean "public", default: true
|
210
197
|
end
|
211
198
|
|
212
|
-
add_index "kkt_shoppe_product_attributes", ["key"], name: "index_kkt_shoppe_product_attributes_on_key"
|
213
|
-
add_index "kkt_shoppe_product_attributes", ["position"], name: "index_kkt_shoppe_product_attributes_on_position"
|
214
|
-
add_index "kkt_shoppe_product_attributes", ["product_id"], name: "index_kkt_shoppe_product_attributes_on_product_id"
|
199
|
+
add_index "kkt_shoppe_product_attributes", ["key"], name: "index_kkt_shoppe_product_attributes_on_key"
|
200
|
+
add_index "kkt_shoppe_product_attributes", ["position"], name: "index_kkt_shoppe_product_attributes_on_position"
|
201
|
+
add_index "kkt_shoppe_product_attributes", ["product_id"], name: "index_kkt_shoppe_product_attributes_on_product_id"
|
215
202
|
|
216
203
|
create_table "kkt_shoppe_product_categories", force: true do |t|
|
217
204
|
t.string "name"
|
@@ -227,17 +214,44 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
227
214
|
t.boolean "permalink_includes_ancestors", default: false
|
228
215
|
end
|
229
216
|
|
230
|
-
add_index "kkt_shoppe_product_categories", ["lft"], name: "index_kkt_shoppe_product_categories_on_lft"
|
231
|
-
add_index "kkt_shoppe_product_categories", ["permalink"], name: "index_kkt_shoppe_product_categories_on_permalink"
|
232
|
-
add_index "kkt_shoppe_product_categories", ["rgt"], name: "index_kkt_shoppe_product_categories_on_rgt"
|
217
|
+
add_index "kkt_shoppe_product_categories", ["lft"], name: "index_kkt_shoppe_product_categories_on_lft"
|
218
|
+
add_index "kkt_shoppe_product_categories", ["permalink"], name: "index_kkt_shoppe_product_categories_on_permalink"
|
219
|
+
add_index "kkt_shoppe_product_categories", ["rgt"], name: "index_kkt_shoppe_product_categories_on_rgt"
|
233
220
|
|
234
221
|
create_table "kkt_shoppe_product_categorizations", force: true do |t|
|
235
222
|
t.integer "product_id", null: false
|
236
223
|
t.integer "product_category_id", null: false
|
237
224
|
end
|
238
225
|
|
239
|
-
add_index "kkt_shoppe_product_categorizations", ["product_category_id"], name: "categorization_by_product_category_id"
|
240
|
-
add_index "kkt_shoppe_product_categorizations", ["product_id"], name: "categorization_by_product_id"
|
226
|
+
add_index "kkt_shoppe_product_categorizations", ["product_category_id"], name: "categorization_by_product_category_id"
|
227
|
+
add_index "kkt_shoppe_product_categorizations", ["product_id"], name: "categorization_by_product_id"
|
228
|
+
|
229
|
+
create_table "kkt_shoppe_product_category_translations", force: true do |t|
|
230
|
+
t.integer "kkt_shoppe_product_category_id", null: false
|
231
|
+
t.string "locale", null: false
|
232
|
+
t.datetime "created_at"
|
233
|
+
t.datetime "updated_at"
|
234
|
+
t.string "name"
|
235
|
+
t.string "permalink"
|
236
|
+
t.text "description"
|
237
|
+
end
|
238
|
+
|
239
|
+
add_index "kkt_shoppe_product_category_translations", ["locale"], name: "index_kkt_shoppe_product_category_translations_on_locale"
|
240
|
+
add_index "kkt_shoppe_product_category_translations", ["kkt_shoppe_product_category_id"], name: "index_75826cc72f93d014e54dc08b8202892841c670b4"
|
241
|
+
|
242
|
+
create_table "kkt_shoppe_product_translations", force: true do |t|
|
243
|
+
t.integer "kkt_shoppe_product_id", null: false
|
244
|
+
t.string "locale", null: false
|
245
|
+
t.datetime "created_at"
|
246
|
+
t.datetime "updated_at"
|
247
|
+
t.string "name"
|
248
|
+
t.string "permalink"
|
249
|
+
t.text "description"
|
250
|
+
t.text "short_description"
|
251
|
+
end
|
252
|
+
|
253
|
+
add_index "kkt_shoppe_product_translations", ["locale"], name: "index_kkt_shoppe_product_translations_on_locale"
|
254
|
+
add_index "kkt_shoppe_product_translations", ["kkt_shoppe_product_id"], name: "index_kkt_shoppe_product_translations_on_kkt_shoppe_product_id"
|
241
255
|
|
242
256
|
create_table "kkt_shoppe_products", force: true do |t|
|
243
257
|
t.integer "parent_id"
|
@@ -259,9 +273,9 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
259
273
|
t.boolean "default", default: false
|
260
274
|
end
|
261
275
|
|
262
|
-
add_index "kkt_shoppe_products", ["parent_id"], name: "index_kkt_shoppe_products_on_parent_id"
|
263
|
-
add_index "kkt_shoppe_products", ["permalink"], name: "index_kkt_shoppe_products_on_permalink"
|
264
|
-
add_index "kkt_shoppe_products", ["sku"], name: "index_kkt_shoppe_products_on_sku"
|
276
|
+
add_index "kkt_shoppe_products", ["parent_id"], name: "index_kkt_shoppe_products_on_parent_id"
|
277
|
+
add_index "kkt_shoppe_products", ["permalink"], name: "index_kkt_shoppe_products_on_permalink"
|
278
|
+
add_index "kkt_shoppe_products", ["sku"], name: "index_kkt_shoppe_products_on_sku"
|
265
279
|
|
266
280
|
create_table "kkt_shoppe_settings", force: true do |t|
|
267
281
|
t.string "key"
|
@@ -269,7 +283,7 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
269
283
|
t.string "value_type"
|
270
284
|
end
|
271
285
|
|
272
|
-
add_index "kkt_shoppe_settings", ["key"], name: "index_kkt_shoppe_settings_on_key"
|
286
|
+
add_index "kkt_shoppe_settings", ["key"], name: "index_kkt_shoppe_settings_on_key"
|
273
287
|
|
274
288
|
create_table "kkt_shoppe_stock_level_adjustments", force: true do |t|
|
275
289
|
t.integer "item_id"
|
@@ -282,8 +296,8 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
282
296
|
t.datetime "updated_at"
|
283
297
|
end
|
284
298
|
|
285
|
-
add_index "kkt_shoppe_stock_level_adjustments", ["item_id", "item_type"], name: "index_kkt_shoppe_stock_level_adjustments_items"
|
286
|
-
add_index "kkt_shoppe_stock_level_adjustments", ["parent_id", "parent_type"], name: "index_kkt_shoppe_stock_level_adjustments_parent"
|
299
|
+
add_index "kkt_shoppe_stock_level_adjustments", ["item_id", "item_type"], name: "index_kkt_shoppe_stock_level_adjustments_items"
|
300
|
+
add_index "kkt_shoppe_stock_level_adjustments", ["parent_id", "parent_type"], name: "index_kkt_shoppe_stock_level_adjustments_parent"
|
287
301
|
|
288
302
|
create_table "kkt_shoppe_tax_rates", force: true do |t|
|
289
303
|
t.string "name"
|
@@ -303,6 +317,6 @@ ActiveRecord::Schema.define(version: 20150315223628) do
|
|
303
317
|
t.datetime "updated_at"
|
304
318
|
end
|
305
319
|
|
306
|
-
add_index "kkt_shoppe_users", ["email_address"], name: "index_kkt_shoppe_users_on_email_address"
|
320
|
+
add_index "kkt_shoppe_users", ["email_address"], name: "index_kkt_shoppe_users_on_email_address"
|
307
321
|
|
308
322
|
end
|
data/lib/kkt_shoppe/engine.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module KktShoppe
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace KktShoppe
|
4
|
-
|
4
|
+
|
5
5
|
if KktShoppe.respond_to?(:root)
|
6
6
|
config.autoload_paths << File.join(KktShoppe.root, 'lib')
|
7
7
|
config.assets.precompile += ['kkt_shoppe/sub.css', 'kkt_shoppe/printable.css']
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
# We don't want any automatic generators in the engine.
|
11
11
|
config.generators do |g|
|
12
12
|
g.orm :active_record
|
@@ -21,35 +21,39 @@ module KktShoppe
|
|
21
21
|
require_dependency(c)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
initializer 'kkt_shoppe.initialize' do |app|
|
26
26
|
# Add the default settings
|
27
27
|
KktShoppe.add_settings_group :system_settings, [:store_name, :email_address, :currency_unit, :tax_name, :demo_mode]
|
28
|
-
|
28
|
+
|
29
29
|
# Add middleware
|
30
30
|
app.config.middleware.use KktShoppe::SettingsLoader
|
31
|
-
|
31
|
+
|
32
32
|
# Load our migrations into the application's db/migrate path
|
33
33
|
unless app.root.to_s.match root.to_s
|
34
34
|
config.paths["db/migrate"].expanded.each do |expanded_path|
|
35
35
|
app.config.paths["db/migrate"] << expanded_path
|
36
36
|
end
|
37
|
-
end
|
38
|
-
|
37
|
+
end
|
38
|
+
|
39
39
|
# Load view helpers for the base application
|
40
40
|
ActiveSupport.on_load(:action_view) do
|
41
41
|
require 'kkt_shoppe/view_helpers'
|
42
42
|
ActionView::Base.send :include, KktShoppe::ViewHelpers
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
|
+
ActiveSupport.on_load(:active_record) do
|
46
|
+
require 'kkt_shoppe/model_extension'
|
47
|
+
ActiveRecord::Base.send :include, KktShoppe::ModelExtension
|
48
|
+
end
|
49
|
+
|
45
50
|
# Load default navigation
|
46
51
|
require 'kkt_shoppe/default_navigation'
|
47
52
|
end
|
48
|
-
|
53
|
+
|
49
54
|
generators do
|
50
55
|
require 'kkt_shoppe/setup_generator'
|
51
56
|
end
|
52
|
-
|
57
|
+
|
53
58
|
end
|
54
59
|
end
|
55
|
-
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module KktShoppe
|
2
|
+
module ModelExtension
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
base.after_save do
|
7
|
+
if @pending_attachments
|
8
|
+
@pending_attachments.each do |pa|
|
9
|
+
old_attachments = self.attachments.where(:role => pa[:role]).pluck(:id)
|
10
|
+
self.attachments.create(:file => pa[:file], :role => pa[:role])
|
11
|
+
self.attachments.where(:id => old_attachments).destroy_all
|
12
|
+
end
|
13
|
+
@pending_attachments = nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
|
20
|
+
def attachment(name)
|
21
|
+
unless self.reflect_on_all_associations(:has_many).map(&:name).include?(:attachments)
|
22
|
+
has_many :attachments, :as => :parent, :dependent => :destroy, :class_name => 'KktShoppe::Attachment'
|
23
|
+
end
|
24
|
+
|
25
|
+
has_one name, -> { select(:id, :token, :parent_id, :parent_type, :file_name, :file_type, :file_size).where(:role => name) }, :class_name => 'KktShoppe::Attachment', :as => :parent
|
26
|
+
|
27
|
+
define_method "#{name}_file" do
|
28
|
+
instance_variable_get("@#{name}_file")
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method "#{name}_file=" do |file|
|
32
|
+
instance_variable_set("@#{name}_file", file)
|
33
|
+
if file.is_a?(ActionDispatch::Http::UploadedFile)
|
34
|
+
@pending_attachments ||= []
|
35
|
+
@pending_attachments << {:role => name, :file => file}
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
data/lib/kkt_shoppe/version.rb
CHANGED
data/lib/kkt_shoppe.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Shoppe
|
2
|
+
module ModelExtension
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
base.after_save do
|
7
|
+
if @pending_attachments
|
8
|
+
@pending_attachments.each do |pa|
|
9
|
+
old_attachments = self.attachments.where(:role => pa[:role]).pluck(:id)
|
10
|
+
self.attachments.create(:file => pa[:file], :role => pa[:role])
|
11
|
+
self.attachments.where(:id => old_attachments).destroy_all
|
12
|
+
end
|
13
|
+
@pending_attachments = nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
|
20
|
+
def attachment(name)
|
21
|
+
unless self.reflect_on_all_associations(:has_many).map(&:name).include?(:attachments)
|
22
|
+
has_many :attachments, :as => :parent, :dependent => :destroy, :class_name => 'Shoppe::Attachment'
|
23
|
+
end
|
24
|
+
|
25
|
+
has_one name, -> { select(:id, :token, :parent_id, :parent_type, :file_name, :file_type, :file_size).where(:role => name) }, :class_name => 'Shoppe::Attachment', :as => :parent
|
26
|
+
|
27
|
+
define_method "#{name}_file" do
|
28
|
+
instance_variable_get("@#{name}_file")
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method "#{name}_file=" do |file|
|
32
|
+
instance_variable_set("@#{name}_file", file)
|
33
|
+
if file.is_a?(ActionDispatch::Http::UploadedFile)
|
34
|
+
@pending_attachments ||= []
|
35
|
+
@pending_attachments << {:role => name, :file => file}
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kkt_shoppe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Thompson, Adam Cooke
|
@@ -176,14 +176,14 @@ dependencies:
|
|
176
176
|
requirements:
|
177
177
|
- - "~>"
|
178
178
|
- !ruby/object:Gem::Version
|
179
|
-
version: 3.0.
|
179
|
+
version: 3.0.2
|
180
180
|
type: :runtime
|
181
181
|
prerelease: false
|
182
182
|
version_requirements: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
184
|
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version: 3.0.
|
186
|
+
version: 3.0.2
|
187
187
|
- !ruby/object:Gem::Dependency
|
188
188
|
name: globalize
|
189
189
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,45 +239,67 @@ dependencies:
|
|
239
239
|
- !ruby/object:Gem::Version
|
240
240
|
version: '1.1'
|
241
241
|
- !ruby/object:Gem::Dependency
|
242
|
-
name: nifty-
|
242
|
+
name: nifty-dialog
|
243
243
|
requirement: !ruby/object:Gem::Requirement
|
244
244
|
requirements:
|
245
245
|
- - ">="
|
246
246
|
- !ruby/object:Gem::Version
|
247
|
-
version: 1.0.
|
247
|
+
version: 1.0.7
|
248
248
|
- - "<"
|
249
249
|
- !ruby/object:Gem::Version
|
250
|
-
version:
|
250
|
+
version: '1.1'
|
251
251
|
type: :runtime
|
252
252
|
prerelease: false
|
253
253
|
version_requirements: !ruby/object:Gem::Requirement
|
254
254
|
requirements:
|
255
255
|
- - ">="
|
256
256
|
- !ruby/object:Gem::Version
|
257
|
-
version: 1.0.
|
257
|
+
version: 1.0.7
|
258
258
|
- - "<"
|
259
259
|
- !ruby/object:Gem::Version
|
260
|
-
version:
|
260
|
+
version: '1.1'
|
261
261
|
- !ruby/object:Gem::Dependency
|
262
|
-
name:
|
262
|
+
name: carrierwave
|
263
263
|
requirement: !ruby/object:Gem::Requirement
|
264
264
|
requirements:
|
265
|
-
- - "
|
265
|
+
- - "~>"
|
266
266
|
- !ruby/object:Gem::Version
|
267
|
-
version:
|
268
|
-
|
267
|
+
version: 0.10.0
|
268
|
+
type: :runtime
|
269
|
+
prerelease: false
|
270
|
+
version_requirements: !ruby/object:Gem::Requirement
|
271
|
+
requirements:
|
272
|
+
- - "~>"
|
269
273
|
- !ruby/object:Gem::Version
|
270
|
-
version:
|
274
|
+
version: 0.10.0
|
275
|
+
- !ruby/object:Gem::Dependency
|
276
|
+
name: fog
|
277
|
+
requirement: !ruby/object:Gem::Requirement
|
278
|
+
requirements:
|
279
|
+
- - "~>"
|
280
|
+
- !ruby/object:Gem::Version
|
281
|
+
version: 1.31.0
|
271
282
|
type: :runtime
|
272
283
|
prerelease: false
|
273
284
|
version_requirements: !ruby/object:Gem::Requirement
|
274
285
|
requirements:
|
275
|
-
- - "
|
286
|
+
- - "~>"
|
276
287
|
- !ruby/object:Gem::Version
|
277
|
-
version: 1.0
|
278
|
-
|
288
|
+
version: 1.31.0
|
289
|
+
- !ruby/object:Gem::Dependency
|
290
|
+
name: mini_magick
|
291
|
+
requirement: !ruby/object:Gem::Requirement
|
292
|
+
requirements:
|
293
|
+
- - "~>"
|
279
294
|
- !ruby/object:Gem::Version
|
280
|
-
version:
|
295
|
+
version: 4.2.7
|
296
|
+
type: :runtime
|
297
|
+
prerelease: false
|
298
|
+
version_requirements: !ruby/object:Gem::Requirement
|
299
|
+
requirements:
|
300
|
+
- - "~>"
|
301
|
+
- !ruby/object:Gem::Version
|
302
|
+
version: 4.2.7
|
281
303
|
- !ruby/object:Gem::Dependency
|
282
304
|
name: coffee-rails
|
283
305
|
requirement: !ruby/object:Gem::Requirement
|
@@ -499,6 +521,8 @@ files:
|
|
499
521
|
- app/models/kkt_shoppe/stock_level_adjustment.rb
|
500
522
|
- app/models/kkt_shoppe/tax_rate.rb
|
501
523
|
- app/models/kkt_shoppe/user.rb
|
524
|
+
- app/models/shoppe/attachment.rb
|
525
|
+
- app/uploaders/shoppe/attachment_uploader.rb
|
502
526
|
- app/validators/permalink_validator.rb
|
503
527
|
- app/views/kkt_shoppe/addresses/_form.html.haml
|
504
528
|
- app/views/kkt_shoppe/addresses/edit.html.haml
|
@@ -597,6 +621,7 @@ files:
|
|
597
621
|
- db/migrate/20141026181718_add_nested_to_product_categories.rb
|
598
622
|
- db/migrate/20141027215005_create_kkt_shoppe_addresses.rb
|
599
623
|
- db/migrate/20150315215633_add_customer_to_kkt_shoppe_orders.rb
|
624
|
+
- db/migrate/20150315223628_create_kkt_shoppe_attachments.rb
|
600
625
|
- db/migrate/20150513171350_create_kkt_shoppe_product_category_translation_table.rb
|
601
626
|
- db/migrate/20150519173350_create_kkt_shoppe_product_translation_table.rb
|
602
627
|
- db/schema.rb
|
@@ -627,6 +652,7 @@ files:
|
|
627
652
|
- lib/kkt_shoppe/errors/payment_declined.rb
|
628
653
|
- lib/kkt_shoppe/errors/refund_failed.rb
|
629
654
|
- lib/kkt_shoppe/errors/unorderable_item.rb
|
655
|
+
- lib/kkt_shoppe/model_extension.rb
|
630
656
|
- lib/kkt_shoppe/navigation_manager.rb
|
631
657
|
- lib/kkt_shoppe/orderable_item.rb
|
632
658
|
- lib/kkt_shoppe/settings.rb
|
@@ -634,6 +660,7 @@ files:
|
|
634
660
|
- lib/kkt_shoppe/setup_generator.rb
|
635
661
|
- lib/kkt_shoppe/version.rb
|
636
662
|
- lib/kkt_shoppe/view_helpers.rb
|
663
|
+
- lib/shoppe/model_extension.rb
|
637
664
|
- lib/tasks/kylekthompson_shoppe.rake
|
638
665
|
homepage: http://tryshoppe.com
|
639
666
|
licenses:
|
@@ -660,3 +687,4 @@ signing_key:
|
|
660
687
|
specification_version: 4
|
661
688
|
summary: Just an *edited* e-commerce platform.
|
662
689
|
test_files: []
|
690
|
+
has_rdoc:
|