rshop 0.1.0

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.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +1 -0
  8. data/app/controllers/ajax/rshop/products_controller.rb +12 -0
  9. data/app/controllers/rshop/.keep +0 -0
  10. data/app/controllers/rshop/auto_products_controller.rb +38 -0
  11. data/app/controllers/rshop/brands_controller.rb +9 -0
  12. data/app/controllers/rshop/cart_controller.rb +61 -0
  13. data/app/controllers/rshop/checkout_controller.rb +69 -0
  14. data/app/controllers/rshop/products_controller.rb +13 -0
  15. data/app/controllers/rshop/stock_requests_controller.rb +17 -0
  16. data/app/mailers/order_mailer.rb +13 -0
  17. data/app/views/order_mailer/feedback.html.slim +3 -0
  18. data/app/views/order_mailer/new_order.html.slim +33 -0
  19. data/app/views/rshop/address/_address_form.html.slim +27 -0
  20. data/app/views/rshop/admin/order/_address.html.slim +13 -0
  21. data/app/views/rshop/admin/order/_order_items.html.slim +7 -0
  22. data/app/views/rshop/brands/index.html.slim +6 -0
  23. data/app/views/rshop/brands/show.html.slim +4 -0
  24. data/app/views/rshop/cart/show.html.slim +74 -0
  25. data/app/views/rshop/checkout/form.html.slim +65 -0
  26. data/app/views/rshop/checkout/ty.html.slim +22 -0
  27. data/app/views/rshop/products/_list.html.slim +27 -0
  28. data/app/views/rshop/products/all.html.slim +1 -0
  29. data/app/views/rshop/products/index.html.slim +0 -0
  30. data/app/views/rshop/products/show.html.slim +67 -0
  31. data/bin/console +14 -0
  32. data/bin/setup +7 -0
  33. data/config/locales/rshop.ru.yml +141 -0
  34. data/config/locales/rshop_autozap.ru.yml +88 -0
  35. data/config/routes.rb +2 -0
  36. data/lib/generators/rshop_autozap_generator.rb +30 -0
  37. data/lib/generators/rshop_generator.rb +38 -0
  38. data/lib/generators/rshop_price_log_generator.rb +30 -0
  39. data/lib/generators/rshop_views_generator.rb +17 -0
  40. data/lib/generators/templates/app/admin/dashboard.rb +37 -0
  41. data/lib/generators/templates/app/admin/rshop/brand.rb +24 -0
  42. data/lib/generators/templates/app/admin/rshop/delivery.rb +4 -0
  43. data/lib/generators/templates/app/admin/rshop/order.rb +55 -0
  44. data/lib/generators/templates/app/admin/rshop/payment.rb +4 -0
  45. data/lib/generators/templates/app/admin/rshop/product.rb +61 -0
  46. data/lib/generators/templates/app/controllers/rshop/.keep +0 -0
  47. data/lib/generators/templates/app/models/rshop/address.rb +11 -0
  48. data/lib/generators/templates/app/models/rshop/album.rb +11 -0
  49. data/lib/generators/templates/app/models/rshop/album_image.rb +7 -0
  50. data/lib/generators/templates/app/models/rshop/brand.rb +24 -0
  51. data/lib/generators/templates/app/models/rshop/delivery.rb +3 -0
  52. data/lib/generators/templates/app/models/rshop/order.rb +65 -0
  53. data/lib/generators/templates/app/models/rshop/order_item.rb +9 -0
  54. data/lib/generators/templates/app/models/rshop/payment.rb +3 -0
  55. data/lib/generators/templates/app/models/rshop/product.rb +88 -0
  56. data/lib/generators/templates/app/uploaders/rshop_album_image_uploader.rb +49 -0
  57. data/lib/generators/templates/app/uploaders/rshop_base_image_uploader.rb +63 -0
  58. data/lib/generators/templates/app/uploaders/rshop_brand_uploader.rb +7 -0
  59. data/lib/generators/templates/migration.rb +95 -0
  60. data/lib/generators/templates_autozap/app/admin/rshop/auto_category.rb +16 -0
  61. data/lib/generators/templates_autozap/app/admin/rshop/auto_mark.rb +15 -0
  62. data/lib/generators/templates_autozap/app/admin/rshop/auto_model.rb +16 -0
  63. data/lib/generators/templates_autozap/app/admin/rshop/auto_subcategory.rb +14 -0
  64. data/lib/generators/templates_autozap/app/admin/rshop/product.rb +66 -0
  65. data/lib/generators/templates_autozap/app/controllers/rshop/.keep +0 -0
  66. data/lib/generators/templates_autozap/app/models/rshop/auto_category.rb +15 -0
  67. data/lib/generators/templates_autozap/app/models/rshop/auto_mark.rb +11 -0
  68. data/lib/generators/templates_autozap/app/models/rshop/auto_model.rb +13 -0
  69. data/lib/generators/templates_autozap/app/models/rshop/auto_subcategory.rb +12 -0
  70. data/lib/generators/templates_autozap/app/models/rshop/product.rb +94 -0
  71. data/lib/generators/templates_autozap/app/views/rshop/auto/_filters.html.slim +18 -0
  72. data/lib/generators/templates_autozap/migration.rb +51 -0
  73. data/lib/generators/templates_price_log/app/models/rshop/price_log.rb +5 -0
  74. data/lib/generators/templates_price_log/migration.rb +11 -0
  75. data/lib/rshop.rb +47 -0
  76. data/lib/rshop/application_controller.rb +51 -0
  77. data/lib/rshop/auto_application_controller.rb +43 -0
  78. data/lib/rshop/price_adjustable_product.rb +30 -0
  79. data/lib/rshop/price_loggable_product.rb +19 -0
  80. data/lib/rshop/version.rb +3 -0
  81. data/rshop.gemspec +32 -0
  82. metadata +156 -0
@@ -0,0 +1,9 @@
1
+ class Rshop::OrderItem < ActiveRecord::Base
2
+ self.table_name = 'rshop_order_items'
3
+ belongs_to :product, touch: true, class_name: Rshop::Product, foreign_key: :rshop_product_id
4
+ belongs_to :order, touch: true, class_name: Rshop::Order, foreign_key: :rshop_order_id
5
+
6
+ def cost
7
+ self.product.price * self.qty
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class Rshop::Payment < ActiveRecord::Base
2
+ self.table_name = 'rshop_payments'
3
+ end
@@ -0,0 +1,88 @@
1
+ class Rshop::Product < ActiveRecord::Base
2
+ self.table_name = 'rshop_products'
3
+ # ctb - cart to buy
4
+ # ctc - click to cart
5
+ extend FriendlyId
6
+ friendly_id :name, use: [:slugged, :finders]
7
+
8
+ has_one :album, as: :albumizable, dependent: :destroy, class_name: Rshop::Album
9
+ belongs_to :brand, touch: true, class_name: Rshop::Brand, foreign_key: :rshop_brand_id
10
+
11
+ accepts_nested_attributes_for :album, allow_destroy: true
12
+ after_initialize :init
13
+ before_save :calc_ctb, :calc_ctc
14
+
15
+ validates :name, :price, presence: true
16
+
17
+ default_scope -> { where(is_published: true).order("cart_count desc").order('is_promotion desc') }
18
+
19
+ scope :order_by_smth, -> order_by do
20
+ order(order_by)
21
+ end
22
+
23
+ def get_name_font
24
+ case name.length
25
+ when 0..24
26
+ 'name-xs'
27
+ when 25..45
28
+ 'name-sm'
29
+ when 46..60
30
+ 'name-md'
31
+ else
32
+ 'name-lg'
33
+ end
34
+ end
35
+
36
+ def image_url variant = nil
37
+ image = self.album.images.first
38
+ path = image.try(:url, variant)
39
+ path ? path : Rshop::AlbumImage.new.url(variant)
40
+ end
41
+
42
+ protected
43
+
44
+ def calc_ctb
45
+ if cart_count + sold_count <= 0
46
+ self.ctb = 0
47
+ return
48
+ end
49
+
50
+ if sold_count == 0
51
+ self.sold_count = 1
52
+ end
53
+ self.ctb = sold_count / cart_count
54
+
55
+ rescue StandardError => e
56
+ p e.to_s
57
+ end
58
+
59
+ def calc_ctc
60
+ if views_count + cart_count <= 0
61
+ self.ctc = 0
62
+ return
63
+ end
64
+
65
+ if views_count == 0
66
+ self.views_count = 1
67
+ end
68
+ self.ctc = cart_count / views_count
69
+
70
+ rescue StandardError => e
71
+ p e.to_s
72
+ end
73
+
74
+ def remove_from_category category
75
+ category.products.delete self
76
+ end
77
+
78
+ def should_generate_new_friendly_id?
79
+ !slug.present?
80
+ end
81
+
82
+ def init
83
+ unless self.persisted?
84
+ self.in_stock = true
85
+ self.album = Rshop::Album.new if self.album.nil?
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ class ::RshopAlbumImageUploader < RshopBaseImageUploader
4
+ version :list do
5
+ process :resize_to_fill => [345, 345]
6
+ process :watermark_bottom
7
+ end
8
+ version :show do
9
+ process :resize_to_limit => [345, 700]
10
+ process :watermark_bottom
11
+ end
12
+ version :gallery do
13
+ process :resize_to_fill => [78, 78]
14
+ end
15
+
16
+ version :origin do
17
+ process :resize_to_limit => [2000, 1000]
18
+ process :watermark_bottom
19
+ end
20
+
21
+ def watermark_text
22
+ # pr = model.album ? model.album.albumizable : nil
23
+ # pr.respond_to?(:name2) ? "#{pr.name}\nwww.korma.in.ua " : 'www.korma.in.ua'
24
+ end
25
+
26
+ def watermark_center
27
+ end
28
+
29
+ def watermark_bottom
30
+ return unless watermark_text
31
+ manipulate! do |img|
32
+ # logo = Magick::Image.read("#{Rails.root}/app/assets/images/logo.png").first
33
+ # img = img.composite(logo, Magick::SouthEastGravity, Magick::OverCompositeOp)
34
+
35
+ mark = Magick::Image.new(img.rows, img.columns) {self.background_color = "none"}
36
+
37
+ draw = Magick::Draw.new
38
+ draw.font = 'Helvetica'
39
+ draw.pointsize = 32
40
+ draw.font_weight = Magick::BoldWeight
41
+ draw.fill = '#CCCCCC'
42
+ draw.gravity = Magick::SouthGravity
43
+ draw.annotate(mark, 0, 0, 0, 15, self.watermark_text)
44
+
45
+ img = img.dissolve(mark, 0.15, 0.2, Magick::CenterGravity)
46
+ img
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+
3
+ class RshopBaseImageUploader < CarrierWave::Uploader::Base
4
+
5
+ # Include RMagick or MiniMagick support:
6
+ include CarrierWave::RMagick
7
+ # include CarrierWave::MiniMagick
8
+
9
+ # Choose what kind of storage to use for this uploader:
10
+ storage :file
11
+ # storage :fog
12
+
13
+ # Override the directory where uploaded files will be stored.
14
+ # This is a sensible default for uploaders that are meant to be mounted:
15
+ def store_dir
16
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
17
+ end
18
+
19
+ # Provide a default URL as a default if there hasn't been a file uploaded:
20
+ def default_url
21
+ # For Rails 3.1+ asset pipeline compatibility:
22
+ # ActionController::Base.helpers.asset_path("images/#{fallback_dir}/" + [version_name, "default.png"].compact.join('_'))
23
+ ActionController::Base.helpers.asset_path("default.jpg")
24
+ end
25
+
26
+ def set_filename(name)
27
+ @filename = name
28
+ end
29
+
30
+ # Process files as they are uploaded:
31
+ # process :scale => [200, 300]
32
+ #
33
+ # def scale(width, height)
34
+ # # do something
35
+ # end
36
+
37
+ # Create different versions of your uploaded files:
38
+ # version :thumb do
39
+ # process :resize_to_fill => [150, 150]
40
+ # end
41
+
42
+ # Add a white list of extensions which are allowed to be uploaded.
43
+ # For images you might use something like this:
44
+ def extension_white_list
45
+ %w(jpg jpeg png bmp)
46
+ end
47
+
48
+ # Override the filename of the uploaded files:
49
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
50
+ # def filename
51
+ # "something.jpg" if original_filename
52
+ # end
53
+
54
+ def default?
55
+ url == default_url
56
+ end
57
+
58
+ protected
59
+
60
+ def fallback_dir
61
+ model.class.to_s.underscore
62
+ end
63
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+
3
+ class RshopBrandUploader < RshopBaseImageUploader
4
+ version :list do
5
+ process :resize_to_limit => [345, 345]
6
+ end
7
+ end
@@ -0,0 +1,95 @@
1
+ class CreateRshopTables < ActiveRecord::Migration
2
+ def change
3
+ create_table :rshop_products do |t|
4
+ t.belongs_to :rshop_album, index: true
5
+ t.belongs_to :rshop_brand, index: true
6
+
7
+ t.string :name
8
+ t.string :admin_comment
9
+ t.string :xls_code
10
+ t.string :slug, index: true
11
+ t.string :code
12
+ t.decimal :price, :precision => 6, :scale => 2
13
+
14
+ t.text :description
15
+ t.text :description_short
16
+
17
+ t.boolean :is_promotion
18
+ t.boolean :is_published
19
+ t.boolean :in_stock
20
+
21
+ t.integer :views_count, default: 0
22
+ t.integer :sold_count, default: 0
23
+ t.integer :cart_count, default: 0
24
+ t.decimal :ctb, :precision => 6, :scale => 2, default: 0
25
+ t.decimal :ctc, :precision => 6, :scale => 2, default: 0
26
+
27
+ t.timestamps
28
+ end
29
+
30
+ create_table :rshop_brands do |t|
31
+ t.string :name
32
+ t.string :slug
33
+ t.string :image
34
+ t.text :description
35
+ t.decimal :n, :precision => 6, :scale => 2
36
+
37
+ t.timestamps
38
+ end
39
+
40
+ create_table :rshop_albums do |t|
41
+ t.string :name
42
+ t.references :albumizable, polymorphic: true
43
+
44
+ t.timestamps
45
+ end
46
+
47
+ create_table :rshop_album_images do |t|
48
+ t.string :name
49
+ t.string :image
50
+ t.belongs_to :rshop_album, index: true
51
+
52
+ t.timestamps
53
+ end
54
+
55
+ create_table :rshop_orders do |t|
56
+ t.belongs_to :user, index: true
57
+ t.belongs_to :rshop_payment, index: true
58
+ t.belongs_to :rshop_delivery, index: true
59
+ t.integer :status
60
+ t.text :comments
61
+
62
+ t.timestamps
63
+ end
64
+
65
+ create_table :rshop_order_items do |t|
66
+ t.belongs_to :rshop_product, index: true
67
+ t.belongs_to :rshop_order, index: true
68
+ t.integer :qty
69
+
70
+ t.timestamps
71
+ end
72
+
73
+ create_table :rshop_addresses do |t|
74
+ t.string :phone
75
+ t.string :address
76
+ t.string :username
77
+ t.string :email
78
+ t.references :addressable, polymorphic: true
79
+
80
+ t.timestamps
81
+ end
82
+
83
+ create_table :rshop_payments do |t|
84
+ t.string :name
85
+
86
+ t.timestamps
87
+ end
88
+
89
+ create_table :rshop_deliveries do |t|
90
+ t.string :name
91
+
92
+ t.timestamps
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,16 @@
1
+ ActiveAdmin.register Rshop::AutoCategory do
2
+ permit_params :name, :slug, :image, :image_cache, :remote_image_url, :remove_image,
3
+ subcategory_ids: [], model_ids: []
4
+
5
+ form do |f|
6
+ f.inputs do
7
+ f.input :name
8
+ f.input :slug
9
+ f.input :models, hint: 'одна марка может иметь много моделей'
10
+ f.input :subcategories, hint: 'много категорий могут относится ко многим подкатегориям'
11
+
12
+ end
13
+ f.actions
14
+ end
15
+ end
16
+
@@ -0,0 +1,15 @@
1
+ ActiveAdmin.register Rshop::AutoMark do
2
+ permit_params :name, :slug, :image, :image_cache, :remote_image_url, :remove_image,
3
+ model_ids: []
4
+
5
+ form do |f|
6
+ f.inputs do
7
+ f.input :name
8
+ f.input :slug
9
+ f.input :models, hint: 'одна марка может иметь много моделей'
10
+
11
+ end
12
+ f.actions
13
+ end
14
+ end
15
+
@@ -0,0 +1,16 @@
1
+ ActiveAdmin.register Rshop::AutoModel do
2
+ permit_params :name, :slug, :rshop_auto_mark_id,
3
+ :image, :image_cache, :remote_image_url, :remove_image,
4
+ category_ids: []
5
+
6
+ form do |f|
7
+ f.inputs do
8
+ f.input :name
9
+ f.input :mark, hint: 'одна модель относится к одной марке'
10
+ f.input :slug
11
+ f.input :categories, hint: 'много моделей относятся ко многим категориям'
12
+ end
13
+ f.actions
14
+ end
15
+ end
16
+
@@ -0,0 +1,14 @@
1
+ ActiveAdmin.register Rshop::AutoSubcategory do
2
+ permit_params :name, :slug, :image, :image_cache, :remote_image_url, :remove_image,
3
+ category_ids: []
4
+
5
+ form do |f|
6
+ f.inputs do
7
+ f.input :name
8
+ f.input :slug
9
+ f.input :categories, hint: 'много подкатегорий относятся ко многим категориям'
10
+ end
11
+ f.actions
12
+ end
13
+ end
14
+
@@ -0,0 +1,66 @@
1
+ ActiveAdmin.register Rshop::Product do
2
+ permit_params :name, :price, :description, :code, :is_promotion, :slug, :is_published, :in_stock,
3
+ :rshop_auro_mark_id, :rshop_auto_model_id, :rshop_auto_category_id, :rshop_auto_subcategory_id,
4
+ :category_id, :rshop_brand_id, :description_short,
5
+ album_attributes: [:id, :name, images_attributes: [:id, :image, :image_cache, :_destroy]],
6
+ category_ids: [], tag_ids: []
7
+
8
+ filter :brand
9
+ # filter :categories
10
+ filter :name
11
+ filter :code
12
+ filter :product
13
+
14
+ form do |f|
15
+ f.inputs do
16
+ f.input :name
17
+ f.input :price, as: :string, hint: I18n.t("activerecord.attributes.rshop/product.price_hint")
18
+ f.input :code
19
+ f.input :slug
20
+ f.input :is_promotion
21
+ f.input :is_published
22
+ f.input :in_stock
23
+
24
+ f.inputs I18n.t("activerecord.attributes.rshop/product.categories") do
25
+ # f.input :category, collection: Category.for_products.map{|u| [u.to_s_admin_selection, u.id]}, :prompt => false
26
+ f.input :brand
27
+ f.input :mark
28
+ f.input :model
29
+ f.input :category
30
+ f.input :subcategory
31
+ # f.input :categories, as: :select, multiple: true, collection: Category.for_products.map{|u| [u.to_s_admin_selection, u.id]}
32
+ # f.input :tags, as: :select, multiple: true
33
+ end
34
+
35
+ f.inputs I18n.t("activerecord.attributes.rshop/product.description") do
36
+ f.cktext_area :description, :ckeditor => {:language => 'ru'}
37
+ end
38
+ f.input :description_short, input_html: {rows: 3}
39
+
40
+ f.inputs I18n.t("activerecord.attributes.rshop/product.album"), :for => [:album, f.object.album ], label: false do |af|
41
+ af.has_many :images, allow_destroy: true, label: false, new_record: true do |imgf|
42
+ imgf.input :image, as: :file, label: false, :hint => imgf.object.image.default? ? '' : imgf.template.image_tag(imgf.object.image.url(:list))
43
+ imgf.input :image_cache, as: :hidden
44
+ end
45
+ end
46
+ end
47
+ f.actions
48
+ end
49
+
50
+ index do
51
+ selectable_column
52
+ column :name, sortable: :name do |o|
53
+ "#{o.name}"
54
+ end
55
+ # column :ctb
56
+ column :code
57
+ column :price
58
+ column :is_promotion
59
+ column :is_published
60
+ column :created_at
61
+ column :updated_at
62
+
63
+ actions
64
+ end
65
+
66
+ end