ecm_products 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +17 -0
  3. data/Rakefile +27 -0
  4. data/app/controllers/ecm/products/product_categories_controller.rb +9 -0
  5. data/app/controllers/ecm/products/products_controller.rb +9 -0
  6. data/app/models/ecm/products/product.rb +97 -0
  7. data/app/models/ecm/products/product_category.rb +71 -0
  8. data/app/models/ecm/products/product_link.rb +23 -0
  9. data/app/models/ecm/products.rb +5 -0
  10. data/app/views/ecm/products/product_categories/_product_category.html.erb +23 -0
  11. data/app/views/ecm/products/product_categories/index.html.erb +6 -0
  12. data/app/views/ecm/products/product_categories/show.html.erb +18 -0
  13. data/app/views/ecm/products/product_links/_product_link.html.erb +12 -0
  14. data/app/views/ecm/products/products/_product.html.erb +29 -0
  15. data/app/views/ecm/products/products/_product_details.html.erb +40 -0
  16. data/app/views/ecm/products/products/_product_preview.html.erb +18 -0
  17. data/app/views/ecm/products/products/index.html.erb +3 -0
  18. data/app/views/ecm/products/products/show.html.erb +1 -0
  19. data/config/locales/ecm.products.de.yml +20 -0
  20. data/config/locales/ecm.products.en.yml +20 -0
  21. data/config/locales/ecm.products.product.de.yml +38 -0
  22. data/config/locales/ecm.products.product.en.yml +38 -0
  23. data/config/locales/ecm.products.product_category.de.yml +35 -0
  24. data/config/locales/ecm.products.product_category.en.yml +35 -0
  25. data/config/locales/ecm.products.product_link.de.yml +17 -0
  26. data/config/locales/ecm.products.product_link.en.yml +17 -0
  27. data/config/locales/ecm.products.routes.de.yml +5 -0
  28. data/config/locales/ecm.products.routes.en.yml +5 -0
  29. data/db/migrate/001_create_ecm_products_product_categories.rb +40 -0
  30. data/db/migrate/002_create_ecm_products_products.rb +46 -0
  31. data/db/migrate/003_create_ecm_products_product_links.rb +18 -0
  32. data/lib/ecm/products/active_admin/ecm_products_product_categories.rb +75 -0
  33. data/lib/ecm/products/active_admin/ecm_products_product_links.rb +39 -0
  34. data/lib/ecm/products/active_admin/ecm_products_products.rb +74 -0
  35. data/lib/ecm/products/engine.rb +12 -0
  36. data/lib/ecm/products/routing.rb +22 -0
  37. data/lib/ecm/products/version.rb +5 -0
  38. data/lib/ecm_products.rb +13 -0
  39. data/lib/tasks/ecm_products_tasks.rake +77 -0
  40. metadata +440 -0
@@ -0,0 +1,17 @@
1
+ ---
2
+ en:
3
+ activerecord:
4
+ models:
5
+ ecm/products/product_link:
6
+ one: product link
7
+ other: product links
8
+ attributes:
9
+ ecm/products/product_link:
10
+ name: name
11
+ position: position
12
+ created_at: created at
13
+ updated_at: updated at
14
+ ecm_products_product: product
15
+ ecm_products_product_id: product
16
+ url: url
17
+ description: description
@@ -0,0 +1,5 @@
1
+ de:
2
+ resources:
3
+ ecm_products_products: produkte
4
+ ecm_products_product_categories: produkt-kategorien
5
+ ecm_products_product_links: produkt-links
@@ -0,0 +1,5 @@
1
+ en:
2
+ resources:
3
+ ecm_products_products: products
4
+ ecm_products_product_categories: product-categories
5
+ ecm_products_product_links: product-links
@@ -0,0 +1,40 @@
1
+ class CreateEcmProductsProductCategories < ActiveRecord::Migration
2
+ def change
3
+ create_table :ecm_products_product_categories do |t|
4
+ t.string :locale
5
+ t.string :name
6
+ t.text :short_description
7
+ t.text :long_description
8
+
9
+ # associations
10
+ t.integer :ecm_products_products_count, :default => 0, :null => false
11
+
12
+ # awesome nested set
13
+ t.integer :lft
14
+ t.integer :rgt
15
+ t.integer :parent_id
16
+ t.integer :depth
17
+
18
+ # friendly id
19
+ t.string :slug
20
+
21
+ # paperclip
22
+ # t.attachment :preview_image
23
+ t.string :preview_image_file_name
24
+ t.integer :preview_image_file_size
25
+ t.string :preview_image_content_type
26
+ t.timestamp :preview_image_updated_at
27
+ t.string :preview_image_fingerprint
28
+
29
+ # paperclip
30
+ # t.attachment :main_image
31
+ t.string :main_image_file_name
32
+ t.integer :main_image_file_size
33
+ t.string :main_image_content_type
34
+ t.timestamp :main_image_updated_at
35
+ t.string :main_image_fingerprint
36
+
37
+ t.timestamps
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ class CreateEcmProductsProducts < ActiveRecord::Migration
2
+ def change
3
+ create_table :ecm_products_products do |t|
4
+ t.string :locale
5
+ t.string :name
6
+ t.text :short_description
7
+ t.text :long_description
8
+ t.boolean :price_on_application
9
+
10
+ # associations
11
+ t.integer :ecm_products_product_links_count, :default => 0, :null => false
12
+ t.references :ecm_products_product_category
13
+
14
+ # acts as list
15
+ t.integer :position
16
+
17
+ # acts as published
18
+ t.timestamp :published_at
19
+
20
+ # friendly id
21
+ t.string :slug
22
+
23
+ # money
24
+ t.integer :price_cents
25
+ t.string :price_currency
26
+
27
+ # paperclip
28
+ # t.attachment :preview_image
29
+ t.string :preview_image_file_name
30
+ t.integer :preview_image_file_size
31
+ t.string :preview_image_content_type
32
+ t.timestamp :preview_image_updated_at
33
+ t.string :preview_image_fingerprint
34
+
35
+ # paperclip
36
+ # t.attachment :main_image
37
+ t.string :main_image_file_name
38
+ t.integer :main_image_file_size
39
+ t.string :main_image_content_type
40
+ t.timestamp :main_image_updated_at
41
+ t.string :main_image_fingerprint
42
+
43
+ t.timestamps
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ class CreateEcmProductsProductLinks < ActiveRecord::Migration
2
+ def change
3
+ create_table :ecm_products_product_links do |t|
4
+ t.string :name
5
+ t.string :url
6
+ t.text :description
7
+
8
+ # associations
9
+ t.references :ecm_products_product
10
+
11
+ # acts as list
12
+ t.integer :position
13
+
14
+ t.timestamps
15
+ end
16
+ add_index :ecm_products_product_links, :ecm_products_product_id
17
+ end
18
+ end
@@ -0,0 +1,75 @@
1
+ ::ActiveAdmin.register Ecm::Products::ProductCategory do
2
+ # menu entry settings
3
+ menu :parent => Proc.new { I18n.t('ecm.products.active_admin.menu') }.call
4
+
5
+ form :html => { :enctype => "multipart/form-data" } do |f|
6
+ f.inputs do
7
+ f.input :parent, :as => :select, :collection => nested_set_options(Ecm::Products::ProductCategory, f.object) { |pc| "#{'&#160;&#160;&#160;&#160;' * pc.level} |-- #{pc.tree_name}".html_safe }
8
+ f.input :locale, :as => :select, :collection => I18n.available_locales.map(&:to_s)
9
+ f.input :name
10
+ f.input :short_description
11
+ f.input :long_description
12
+ f.input :preview_image, :as => :file, :hint => f.template.image_tag(f.object.preview_image.url(:medium_thumb))
13
+ f.input :main_image, :as => :file, :hint => f.template.image_tag(f.object.main_image.url(:medium_thumb))
14
+ end
15
+ f.actions
16
+ end
17
+
18
+ index :as => :nested_set do
19
+ selectable_column
20
+ column :preview_image do |pc|
21
+ link_to(image_tag(pc.preview_image.url(:small_thumb)), [:admin, pc], :style => "margin-left: #{50 * pc.level}px")
22
+ end
23
+ column :locale
24
+ column :name
25
+ column :short_description
26
+ column :ecm_products_products_count
27
+ column :created_at
28
+ column :updated_at
29
+ default_actions
30
+ end
31
+
32
+ show do
33
+ panel Ecm::Products::ProductCategory.human_attribute_name(:preview_image) do
34
+ div { image_tag(ecm_products_product_category.preview_image.url) }
35
+ end
36
+
37
+ attributes_table do
38
+ row :parent
39
+ row :name
40
+ row :ecm_products_products_count
41
+ row :created_at
42
+ row :updated_at
43
+ end
44
+
45
+ panel Ecm::Products::ProductCategory.human_attribute_name(:ecm_products_products) do
46
+ table_for ecm_products_product_category.ecm_products_products, :i18n => Ecm::Products::Product do
47
+ column :preview_image do |p|
48
+ link_to(image_tag(p.preview_image.url(:medium_thumb)), [:admin, p])
49
+ end
50
+ column :ecm_products_product_category
51
+ column :locale
52
+ column :name
53
+ column :short_description
54
+ column :created_at
55
+ column :updated_at
56
+ column do |p|
57
+ link_to(I18n.t('active_admin.view'), admin_ecm_products_product_path(p), :class => "member_link view_link") +
58
+ link_to(I18n.t('active_admin.edit'), edit_admin_ecm_products_product_path(p), :class => "member_link edit_link")
59
+ end
60
+ end
61
+ end
62
+
63
+ panel Ecm::Products::ProductCategory.human_attribute_name(:main_image) do
64
+ div { image_tag(ecm_products_product_category.main_image.url) }
65
+ end
66
+
67
+ panel Ecm::Products::ProductCategory.human_attribute_name(:short_description) do
68
+ div { ecm_products_product_category.short_description }
69
+ end
70
+
71
+ panel Ecm::Products::ProductCategory.human_attribute_name(:long_description) do
72
+ div { ecm_products_product_category.long_description }
73
+ end
74
+ end
75
+ end if defined?(::ActiveAdmin)
@@ -0,0 +1,39 @@
1
+ ::ActiveAdmin.register Ecm::Products::ProductLink do
2
+ # menu entry settings
3
+ menu :parent => Proc.new { I18n.t('ecm.products.active_admin.menu') }.call
4
+
5
+ form do |f|
6
+ f.inputs do
7
+ f.input :ecm_products_product
8
+ f.input :name
9
+ f.input :url
10
+ f.input :description
11
+ end
12
+ f.actions
13
+ end
14
+
15
+ index do
16
+ selectable_column
17
+ column :ecm_products_product
18
+ column :name
19
+ column :description
20
+ column :url
21
+ default_actions
22
+ end
23
+
24
+ show do
25
+ attributes_table do
26
+ row :ecm_products_product
27
+ row :name
28
+ row :url do |pl|
29
+ link_to(pl.url, pl.url)
30
+ end
31
+ row :created_at
32
+ row :updated_at
33
+ end
34
+
35
+ panel Ecm::Products::ProductLink.human_attribute_name(:description) do
36
+ div { ecm_products_product_link.description }
37
+ end
38
+ end
39
+ end if defined?(::ActiveAdmin)
@@ -0,0 +1,74 @@
1
+ ::ActiveAdmin.register Ecm::Products::Product do
2
+ # menu entry settings
3
+ menu :parent => Proc.new { I18n.t('ecm.products.active_admin.menu') }.call
4
+
5
+ form :html => { :enctype => "multipart/form-data" } do |f|
6
+ f.inputs do
7
+ f.input :ecm_products_product_category
8
+ f.input :locale, :as => :select, :collection => I18n.available_locales.map(&:to_s)
9
+ f.input :name
10
+ f.input :short_description
11
+ f.input :long_description
12
+ f.input :price
13
+ f.input :price_on_application
14
+ f.input :published_at
15
+ f.input :preview_image, :as => :file
16
+ f.input :main_image, :as => :file
17
+ end
18
+ f.actions
19
+ end
20
+
21
+ index do
22
+ selectable_column
23
+ column :preview_image do |p|
24
+ link_to(image_tag(p.preview_image.url(:medium_thumb)), [:admin, p])
25
+ end
26
+ column :ecm_products_product_category
27
+ column :locale
28
+ column :name
29
+ column :short_description
30
+ column :created_at
31
+ column :updated_at
32
+ default_actions
33
+ end
34
+
35
+ show do
36
+ panel Ecm::Products::Product.human_attribute_name(:preview_image) do
37
+ div { image_tag(ecm_products_product.preview_image.url) }
38
+ end
39
+
40
+ attributes_table do
41
+ row :ecm_products_product_category
42
+ row :name
43
+ row :price
44
+ row :price_on_application
45
+ row :published_at
46
+ row :created_at
47
+ row :updated_at
48
+ end
49
+
50
+ panel Ecm::Products::ProductLink.human_attribute_name(:ecm_products_product_links) do
51
+ table_for ecm_products_product.ecm_products_product_links, :i18n => Ecm::Products::ProductLink do
52
+ column :name
53
+ column :description
54
+ column :url
55
+ column do |pl|
56
+ link_to(I18n.t('active_admin.view'), admin_ecm_products_product_link_path(pl), :class => "member_link view_link") +
57
+ link_to(I18n.t('active_admin.edit'), edit_admin_ecm_products_product_link_path(pl), :class => "member_link edit_link")
58
+ end
59
+ end
60
+ end
61
+
62
+ panel Ecm::Products::Product.human_attribute_name(:main_image) do
63
+ div { image_tag(ecm_products_product.main_image.url) }
64
+ end
65
+
66
+ panel Ecm::Products::Product.human_attribute_name(:short_description) do
67
+ div { ecm_products_product.short_description }
68
+ end
69
+
70
+ panel Ecm::Products::Product.human_attribute_name(:long_description) do
71
+ div { ecm_products_product.long_description }
72
+ end
73
+ end
74
+ end if defined?(::ActiveAdmin)
@@ -0,0 +1,12 @@
1
+ module ECM
2
+ module Products
3
+ class Engine < ::Rails::Engine
4
+ # active admin
5
+ initializer :ecm_products_engine do
6
+ ::ActiveAdmin.setup do |active_admin_config|
7
+ active_admin_config.load_paths += Dir[File.dirname(__FILE__) + '/active_admin']
8
+ end
9
+ end if defined?(::ActiveAdmin)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ module Ecm
2
+ module Products
3
+ class Routing
4
+ # Creates the routes for products and categories. You can pass options to
5
+ # specify the actions for both products and/or categories.
6
+ #
7
+ # Ecm::Products::Routing.routes(self, { :product_category_actions => [ :show ]})
8
+ #
9
+ # This will only create the show action for product categories, but omit the index action.
10
+ def self.routes(router, options = {})
11
+ options.reverse_merge!(
12
+ { :product_category_actions => [:index, :show],
13
+ :product_actions => [:index, :show]
14
+ }
15
+ )
16
+
17
+ router.resources :ecm_products_product_categories, :only => options[:product_category_actions], :controller => 'ecm/products/product_categories'
18
+ router.resources :ecm_products_products,:only => options[:product_actions], :controller => 'ecm/products/products'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module ECM
2
+ module Products
3
+ VERSION = "0.0.1.pre"
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ require 'active_admin-awesome_nested_set'
2
+ require 'acts_as_list'
3
+ # require 'acts_as_published'
4
+ require 'awesome_nested_set'
5
+ require 'awesome_nested_set-tools'
6
+ require 'friendly_id'
7
+ require 'money-rails'
8
+ require 'paperclip'
9
+ require 'rails_tools-absence_validator'
10
+
11
+ require 'ecm/products/engine'
12
+ require 'ecm/products/routing'
13
+
@@ -0,0 +1,77 @@
1
+ namespace :ecm_products do
2
+ namespace :db do
3
+ desc "Purges and creates example data"
4
+ task :populate!, [] => [:environment] do |t, args|
5
+
6
+ Rake::Task["ecm_products:db:clear!"].execute
7
+ Rake::Task["ecm_products:db:populate"].execute
8
+ end
9
+
10
+ desc "Clears all data!"
11
+ task :clear!, [] => [:environment] do |t, args|
12
+ Ecm::Products::ProductCategory.delete_all
13
+ Ecm::Products::Product.delete_all
14
+ Ecm::Products::ProductLink.delete_all
15
+ end
16
+
17
+ desc "Creates example_data"
18
+ task :populate, [] => [:environment] do |t, args|
19
+ require "ffaker"
20
+ require "forgery"
21
+
22
+ # Create example product category roots
23
+ 10.times do
24
+ Ecm::Products::ProductCategory.create! do |pc|
25
+ pc.locale = I18n.available_locales.choice.to_s
26
+ pc.name = Faker::Product.brand
27
+ pc.short_description = Faker::Lorem.paragraph(2)
28
+ pc.long_description = Faker::Lorem.paragraph(10)
29
+ pc.preview_image = File.open(ECM::Products::Engine.root + "spec/fixtures/product/preview_image.gif")
30
+ pc.main_image = File.open(ECM::Products::Engine.root + "spec/fixtures/product/main_image.gif")
31
+ end
32
+ end
33
+
34
+ # Create example product categories
35
+ # roots = Ecm::Products::ProductCategory.roots.all
36
+ 10.times do
37
+ Ecm::Products::ProductCategory.create! do |pc|
38
+ pc.parent = Ecm::Products::ProductCategory.all.choice
39
+ pc.name = Faker::Product.brand
40
+ pc.short_description = Faker::Lorem.paragraph(2)
41
+ pc.long_description = Faker::Lorem.paragraph(10)
42
+ pc.preview_image = File.open(ECM::Products::Engine.root + "spec/fixtures/product_category/preview_image.gif")
43
+ pc.main_image = File.open(ECM::Products::Engine.root + "spec/fixtures/product_category/main_image.gif")
44
+ end
45
+ end
46
+
47
+ # Create example products
48
+ product_categories = Ecm::Products::ProductCategory.all
49
+ 100.times do
50
+ Ecm::Products::Product.create! do |p|
51
+ p.locale = I18n.available_locales.choice.to_s
52
+ p.name = Faker::Product.product_name
53
+ p.short_description = Faker::Lorem.paragraph(rand(2))
54
+ p.long_description = Faker::Lorem.paragraph(rand(10))
55
+ p.price_on_application = [true, false].choice
56
+ p.preview_image = File.open(ECM::Products::Engine.root + "spec/fixtures/product_category/preview_image.gif")
57
+ p.main_image = File.open(ECM::Products::Engine.root + "spec/fixtures/product_category/main_image.gif")
58
+
59
+ p.ecm_products_product_category = product_categories.choice
60
+
61
+ p.price Money.new(rand(1000000 / 100), "EUR")
62
+ end
63
+ end
64
+
65
+ # Create example links
66
+ Ecm::Products::Product.all.each do |p|
67
+ rand(10).times do
68
+ p.ecm_products_product_links.create do |pl|
69
+ pl.name = Faker::Product.product_name
70
+ pl.url = Faker::Internet.http_url
71
+ pl.description = Faker::Lorem.paragraph(rand(3))
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end