wco_models 3.1.0.106 → 3.1.0.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 59dab46504678a65babb8355d6e6040d591b40e998c56998275968ef79ff6e15
4
- data.tar.gz: a708d9fffc3d45f2cc92138ea28b87c0c1679cc5e49fc9e4913f4f586d3c05a1
3
+ metadata.gz: c3ea371527036dc70b4d67a868a0d00320523c405412afb08dedc302b19d994d
4
+ data.tar.gz: df53ba3276a02c375d9e5b637d5004c1867b0d6f6e4b7348ef5f6ea25944aac5
5
5
  SHA512:
6
- metadata.gz: 32e4562420dfcbbcab209c8e951702ce892f8d8ae2dd8b9a330aeccd1010c586fbc07a0f6aef47f6b0963195a9ffd74b7778cd362e67371e4bc5166fa5335403
7
- data.tar.gz: 54d29b8bfdb253d320a6ca24c6500d627e400f5f3d1dc6b59539319078cd1a59251580bea318a8356b2b9d7c245c813d5ba5cdfbef841e949364d66f501a7c21
6
+ metadata.gz: 529093e15f230b453518b48f480a155b40d27a5f3637dfec831ad57624f11fe91f4402a357131cda21b8367f284ac90ad2e6f03e3f42a9579ada33e1bb1f4d35
7
+ data.tar.gz: 2107595669a99af9834468e5096c1456ecf5066f401d2b149c46e8fadbc26216493579873ffada5a2d0bcdfa0400189c2a80027f0f17d9ca96cec6a4dac76c6c
@@ -5,6 +5,10 @@
5
5
  *= require_tree .
6
6
  **/
7
7
 
8
+ .bold {
9
+ font-weight: bold;
10
+ }
11
+
8
12
  .select2 {
9
13
  min-width: 200px;
10
14
  }
@@ -2,11 +2,11 @@
2
2
  class Wco::PricesController < Wco::ApplicationController
3
3
 
4
4
  def create
5
- @price = Wco::Price.new params[:price].permit( :amount_cents, :interval, :product_id )
5
+ @price = Wco::Price.new params[:price].permit!
6
6
  authorize! :create, @price
7
7
 
8
8
  @price.interval = nil if !params[:price][:interval].present?
9
- @product = Wco::Product.find @price.product_id
9
+ @product = params[:price][:product_type].constantize.find @price.product_id
10
10
  stripe_product = Stripe::Product.retrieve( @product.product_id )
11
11
  price_hash = {
12
12
  product: stripe_product.id,
@@ -17,17 +17,34 @@ class Wco::PricesController < Wco::ApplicationController
17
17
  price_hash[:recurring] = { interval: @price.interval }
18
18
  end
19
19
  stripe_price = Stripe::Price.create( price_hash )
20
- # puts! stripe_price, 'stripe_price'
20
+ # flash_notice 'Created stripe price.'
21
+ flash_notice stripe_price
21
22
 
22
- flash_notice 'Created stripe price.'
23
- @price.product = @product
23
+ @price.product = @product
24
24
  @price.price_id = stripe_price[:id]
25
25
  if @price.save
26
26
  flash_notice @price
27
27
  else
28
28
  flash_alert @price
29
29
  end
30
- redirect_to controller: :products, action: :index
30
+ case @product.class.name
31
+ when 'WcoHosting::ApplianceTmpl'
32
+ redirect_to request.referrer || root_path
33
+ when 'Wco::Product'
34
+ redirect_to controller: :products, action: :index
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ @price = Wco::Price.find params[:id]
40
+ authorize! :destroy, @price
41
+ flag = @price.delete
42
+ if flag
43
+ flash_notice 'ok'
44
+ else
45
+ flash_alert @price
46
+ end
47
+ redirect_to request.referrer || root_path
31
48
  end
32
49
 
33
50
  def update
@@ -17,20 +17,26 @@ class Wco::Leadset
17
17
  index({ email: 1 }, { name: 'email' })
18
18
  validates :email, uniqueness: { allow_nil: true } # presence: true
19
19
 
20
+
21
+ has_many :appliances, class_name: '::WcoHosting::Appliance', inverse_of: :leadset
22
+ has_many :appliance_tmpl_prices, class_name: 'Wco::Price'
23
+ has_many :environments, class_name: '::WcoHosting::Environment', inverse_of: :leadset
24
+ has_many :invoices, class_name: 'Wco::Invoice'
20
25
  has_many :leads, class_name: 'Wco::Lead'
21
- has_many :profiles, class_name: 'Wco::Profile', inverse_of: :leadset
22
- has_many :appliances, class_name: 'WcoHosting::Appliance', inverse_of: :leadset
23
- has_many :subscriptions, class_name: 'Wco::Subscription', inverse_of: :leadset
26
+
27
+ has_many :profiles, class_name: 'Wco::Profile', inverse_of: :leadset
28
+ has_many :subscriptions, class_name: 'Wco::Subscription', inverse_of: :leadset
24
29
  has_and_belongs_to_many :tags, class_name: 'Wco::Tag'
25
30
 
26
- has_many :invoices, class_name: 'Wco::Invoice'
31
+
27
32
  field :next_invoice_number, type: :integer, default: 100
28
33
 
29
- has_and_belongs_to_many :serverhosts, class_name: 'WcoHosting::Serverhost' # , inverse_of: :leadset
34
+ has_and_belongs_to_many :serverhosts, class_name: '::WcoHosting::Serverhost' # , inverse_of: :leadset
30
35
  def next_serverhost
31
36
  serverhosts.first
32
37
  end
33
38
 
39
+
34
40
  ##
35
41
  ## stripe
36
42
  ##
@@ -6,13 +6,20 @@ class Wco::Log
6
6
  include Mongoid::Paranoia
7
7
  store_in collection: 'wco_logs'
8
8
 
9
- field :message
9
+ field :label, type: :string
10
+ field :message, type: :string
10
11
 
11
- field :class_name
12
- field :object_id
13
-
14
- field :raw_json, type: Object, default: '{}'
12
+ belongs_to :obj, polymorphic: true, optional: true
15
13
 
16
14
  has_and_belongs_to_many :tags
17
15
 
16
+ def self.puts! message, label, obj: nil
17
+ create( message: message, label: label, obj: obj )
18
+ puts "+++ +++ #{label}:"
19
+ puts message.inspect
20
+ end
21
+
22
+ def to_s
23
+ "#{created_at} #{message}"
24
+ end
18
25
  end
@@ -5,9 +5,10 @@ class Wco::Price
5
5
  include Mongoid::Paranoia
6
6
  store_in collection: 'wco_prices'
7
7
 
8
- # belongs_to :product, class_name: 'Wco::Product', inverse_of: :prices
9
- ## Wco::Product, WcoHosting::ApplianceTmpl:
10
- belongs_to :product, polymorphic: true # , foreign_key: :wco_price_id
8
+ ## Wco::Product, WcoHosting::ApplianceTmpl
9
+ belongs_to :product, polymorphic: true
10
+
11
+ belongs_to :appliance_tmpl_leadset, class_name: 'Wco::Leadset', optional: true
11
12
 
12
13
  has_many :subscriptions, class_name: 'Wco::Subscription', inverse_of: :price, foreign_key: :wco_price_id
13
14
 
@@ -16,8 +16,10 @@ class Wco::Profile
16
16
  has_and_belongs_to_many :shared_galleries, class_name: 'Wco::Gallery', inverse_of: :shared_profiles
17
17
 
18
18
 
19
+ def to_s
20
+ email
21
+ end
19
22
  def self.list
20
23
  all.map { |p| [ p.email, p.id ] }
21
24
  end
22
-
23
25
  end
@@ -5,6 +5,8 @@ class WcoHosting::Appliance
5
5
  include Mongoid::Paranoia
6
6
  store_in collection: 'wco_appliances'
7
7
 
8
+ has_many :logs, as: :obj, class_name: 'Wco::Log'
9
+
8
10
  belongs_to :leadset, class_name: 'Wco::Leadset', inverse_of: :appliances
9
11
  belongs_to :subscription, class_name: 'Wco::Subscription' # , inverse_of: :appliance
10
12
 
@@ -14,7 +16,7 @@ class WcoHosting::Appliance
14
16
  self[:service_name] = host.gsub(".", "_")
15
17
  end
16
18
 
17
- field :environment
19
+ belongs_to :environment, class_name: 'WcoHosting::Environment', inverse_of: :appliances
18
20
 
19
21
  field :subdomain
20
22
  field :domain
@@ -41,6 +43,9 @@ class WcoHosting::Appliance
41
43
  STATE_TERM = 'state-term'
42
44
  field :state, default: STATE_PENDING
43
45
 
46
+ def to_s
47
+ service_name
48
+ end
44
49
  end
45
50
 
46
51
 
@@ -24,18 +24,6 @@ class WcoHosting::ApplianceTmpl
24
24
  field :volume_zip
25
25
  validates :volume_zip, presence: true
26
26
 
27
- ## Only underscores! These become variable names.
28
- # KIND_CRM = 'kind_crm'
29
- # KIND_DRUPAL = 'kind_drupal'
30
- # KIND_HELLOWORLD = 'kind_helloworld'
31
- # KIND_IROWOR = 'kind_irowor'
32
- # KIND_JENKINS = 'kind_jenkins'
33
- # KIND_MATOMO = 'kind_matomo'
34
- # KIND_MOODLE = 'kind_moodle'
35
- # KIND_PRESTASHOP = 'kind_prestashop'
36
- # KIND_SMT = 'kind_smt'
37
- # KIND_WORDPRESS = 'kind_wordpress'
38
-
39
27
  ## 2023-12-08 :: These names are impossible to change already.
40
28
  KIND_CRM = 'crm'
41
29
  KIND_DRUPAL = 'drupal'
@@ -45,33 +33,84 @@ class WcoHosting::ApplianceTmpl
45
33
  KIND_MATOMO = 'matomo'
46
34
  KIND_MOODLE = 'moodle'
47
35
  KIND_PRESTASHOP = 'prestashop'
36
+ KIND_REACT = 'react'
48
37
  KIND_SMT = 'smt'
49
38
  KIND_WORDPRESS = 'wordpress'
50
39
  KIND_TRASH = 'trash'
51
40
  KIND_TMP = 'tmp'
52
41
 
53
42
  KINDS = [ nil, KIND_CRM, KIND_DRUPAL, KIND_HELLOWORLD, KIND_IROWOR,
54
- KIND_JENKINS, KIND_MATOMO, KIND_MOODLE, KIND_PRESTASHOP, KIND_SMT,
43
+ KIND_JENKINS, KIND_MATOMO, KIND_MOODLE, KIND_PRESTASHOP,
44
+ KIND_REACT,
45
+ KIND_SMT,
55
46
  KIND_WORDPRESS, KIND_TRASH, KIND_TMP ]
56
47
 
57
- def self.list
58
- # [[nil,nil]] + all.map { |t| [t.kind, t.id] }
59
- KINDS
60
- end
48
+
61
49
 
62
50
  def self.latest_of kind
63
51
  where({ kind: kind }).order_by({ version: :desc }).first
64
52
  end
65
53
 
66
54
  has_many :appliances, class_name: 'WcoHosting::Appliance'
67
-
68
55
  has_many :subscriptions, as: :product, class_name: 'Wco::Subscription'
56
+ has_many :prices, as: :product, class_name: 'Wco::Price'
57
+
58
+ # has_and_belongs_to_many :leadsets, class_name: 'Wco::Leadset'
59
+ # has_many :appliance_tmpl_leadsets, class_name: 'WcoHosting::ApplianceTmplLeadset'
69
60
 
70
61
  field :product_id # stripe
71
62
 
72
63
  # belongs_to :price, class_name: 'Wco::Price', foreign_key: :wco_price_id
73
- has_one :price, as: :product, class_name: 'Wco::Price'
64
+
74
65
  field :price_id # stripe
66
+ attr_accessor :tmp_price_cents
67
+ attr_accessor :tmp_price_interval
68
+ before_validation :set_stripe_product_price, on: :create
69
+ def set_stripe_product_price
70
+ stripe_product = Stripe::Product.create({ name: "Appliance #{self}" })
71
+ self.product_id = stripe_product.id
72
+
73
+ wco_price = Wco::Price.create!({
74
+ amount_cents: tmp_price_cents,
75
+ interval: tmp_price_interval,
76
+ product_id: stripe_product.id,
77
+ product: self,
78
+ })
79
+ self.prices.push wco_price
80
+ price_hash = {
81
+ product: stripe_product.id,
82
+ unit_amount: tmp_price_cents,
83
+ currency: 'usd',
84
+ recurring: {
85
+ interval: tmp_price_interval,
86
+ },
87
+ }
88
+ stripe_price = Stripe::Price.create( price_hash )
89
+ self.price_id = stripe_price.id
90
+ end
91
+ before_validation :update_stripe_product_price, on: :update
92
+ def update_stripe_product_price
93
+ if tmp_price_cents.present?
94
+ price_hash = {
95
+ product: product_id,
96
+ unit_amount: tmp_price_cents,
97
+ currency: 'usd',
98
+ recurring: {
99
+ interval: tmp_price_interval,
100
+ },
101
+ }
102
+ stripe_price = Stripe::Price.create( price_hash )
103
+ wco_price = Wco::Price.create!({
104
+ amount_cents: tmp_price_cents,
105
+ interval: tmp_price_interval,
106
+ price_id: stripe_price.id,
107
+ product_id: product_id,
108
+ product: self,
109
+ })
110
+ self.prices.push wco_price
111
+ end
112
+ end
113
+
75
114
 
76
115
  def to_s
77
116
  "#{kind}-#{version}"
@@ -0,0 +1,11 @@
1
+
2
+ class WcoHosting::ApplianceTmplLeadset
3
+ include Mongoid::Document
4
+ include Mongoid::Timestamps
5
+ store_in collection: 'wco_appliance_tmpl_leadsets'
6
+
7
+ belongs_to :leadset, class_name: 'Wco::Leadset'
8
+ belongs_to :appliance_tmpl, class_name: 'WcoHosting::ApplianceTmpl'
9
+
10
+ end
11
+
@@ -8,18 +8,13 @@ class WcoHosting::Domain
8
8
  field :name
9
9
  validates :name, presence: true, uniqueness: true
10
10
 
11
- ## orbital.city : Z0145070C3DD1OJWHTXJ
12
- ## oquaney-splicing.com : Z060228025Y0JHUA35GN5
13
- # field :route53_zone
14
- # validates :route53_zone, presence: true
15
-
16
- STATE_ACTIVE = 'active'
17
- STATE_INACTIVE = 'inactive'
18
- STATES = [ 'active', 'inactive' ]
19
- field :state, default: STATE_ACTIVE
11
+ STATUS_ACTIVE = 'active'
12
+ STATUS_INACTIVE = 'inactive'
13
+ STATUSES = [ 'active', 'inactive' ]
14
+ field :status
15
+ scope :active, ->{ where(status: STATUS_ACTIVE) }
20
16
 
21
17
  def self.list
22
- [[nil,nil]] + all.where({ state: STATE_ACTIVE }).map { |i| [i.name, i.name ] }
18
+ [[nil,nil]] + active.map { |i| [i.name, i.name ] }
23
19
  end
24
-
25
20
  end
@@ -0,0 +1,21 @@
1
+
2
+ class WcoHosting::Environment
3
+ include Mongoid::Document
4
+ include Mongoid::Timestamps
5
+ include Mongoid::Paranoia
6
+ store_in collection: 'wco_environments'
7
+
8
+ belongs_to :leadset, class_name: 'Wco::Leadset', inverse_of: :environments
9
+
10
+ field :name
11
+ validates :name, presence: true, uniqueness: true
12
+ index({ name: -1 }, { unique: true })
13
+
14
+ has_many :appliances, class_name: 'WcoHosting::Appliance', inverse_of: :environments
15
+
16
+ def to_s
17
+ name
18
+ end
19
+ end
20
+
21
+
@@ -42,6 +42,8 @@ class WcoHosting::Serverhost
42
42
  end
43
43
 
44
44
  def create_subdomain app
45
+ @obj = app
46
+
45
47
  client = DropletKit::Client.new(access_token: DO_TOKEN_1)
46
48
  record = DropletKit::DomainRecord.new(
47
49
  type: 'A',
@@ -49,86 +51,64 @@ class WcoHosting::Serverhost
49
51
  data: app.serverhost.public_ip,
50
52
  )
51
53
  client.domain_records.create(record, for_domain: app.domain )
52
- end
53
-
54
- ## obsolete _vp_ 2023-12-23
55
- def aws_create_subdomain app
56
- ac = ActionController::Base.new
57
- ac.instance_variable_set( :@app, app )
58
- rendered_str = ac.render_to_string("wco_hosting/scripts/create_subdomain.json")
59
- # puts '+++ create_subdomain rendered_str:'; print rendered_str
60
-
61
- file = Tempfile.new('prefix')
62
- file.write rendered_str
63
- file.close
64
54
 
65
- cmd = "aws route53 change-resource-record-sets \
66
- --hosted-zone-id #{ app.route53_zone } \
67
- --change-batch file://#{ file.path } \
68
- --profile route53 "
69
- do_exec( cmd )
55
+ Wco::Log.puts! record, 'created subdomain?', obj: @obj
70
56
  end
71
57
 
72
-
73
58
  def add_nginx_site app
59
+ @obj = app
60
+
74
61
  ac = ActionController::Base.new
75
62
  ac.instance_variable_set( :@app, app )
76
63
  rendered_str = ac.render_to_string("wco_hosting/scripts/nginx_site.conf")
77
- puts '+++ add_nginx_site rendered_str:'
78
- print rendered_str
64
+ Wco::Log.puts! rendered_str, 'add_nginx_site rendered_str', obj: @obj
79
65
 
80
66
  file = Tempfile.new('prefix')
81
67
  file.write rendered_str
82
68
  file.close
83
69
 
84
70
  cmd = "scp #{file.path} #{ssh_host}:/etc/nginx/sites-available/#{app.service_name}.conf "
85
- puts! cmd, 'cmd'
86
- `#{cmd}`
71
+ do_exec cmd
87
72
 
88
73
  cmd = "ssh #{ssh_host} 'ln -s /etc/nginx/sites-available/#{app.service_name}.conf /etc/nginx/sites-enabled/#{app.service_name}.conf ' "
89
- puts! cmd, 'cmd'
90
- `#{cmd}`
74
+ do_exec cmd
91
75
 
92
76
  cmd = "ssh #{ssh_host} 'nginx -s reload ' "
93
- puts! cmd, 'cmd'
94
- `#{cmd}`
77
+ do_exec cmd
95
78
  end
96
79
 
97
80
  def add_docker_service app
98
- puts! app, '#add_docker_service'
81
+ @obj = app
82
+ Wco::Log.puts! nil, '#add_docker_service', obj: @obj
99
83
 
100
84
  ac = ActionController::Base.new
101
85
  ac.instance_variable_set( :@app, app )
102
86
  ac.instance_variable_set( :@workdir, WORKDIR )
103
87
  rendered_str = ac.render_to_string("wco_hosting/docker-compose/dc-#{app.tmpl.kind}")
104
- puts '+++ add_docker_service rendered_str:'
105
- print rendered_str
88
+ Wco::Log.puts! rendered_str, 'add_docker_service rendered_str', obj: @obj
106
89
 
107
90
  file = Tempfile.new('prefix')
108
91
  file.write rendered_str
109
92
  file.close
110
- puts! file.path, 'file.path'
93
+ # puts! file.path, 'file.path'
111
94
 
112
95
  cmd = "scp #{file.path} #{ssh_host}:#{WORKDIR}/dc-#{app.service_name}.yml "
113
- puts! cmd, 'cmd'
114
- `#{cmd}`
96
+ do_exec cmd
115
97
 
116
98
  cmd = "ssh #{ssh_host} 'cd #{WORKDIR} ; \
117
99
  docker compose -f dc-#{app.service_name}.yml up -d #{app.service_name} ; \
118
100
  echo ok #add_docker_service ' "
119
- puts! cmd, 'cmd'
120
- `#{cmd}`
121
-
122
- puts "ok '#add_docker_service'"
101
+ do_exec cmd
123
102
  end
124
103
 
125
104
  def create_wordpress_volume app
105
+ @obj = app
106
+
126
107
  ac = ActionController::Base.new
127
108
  ac.instance_variable_set( :@app, app )
128
109
  ac.instance_variable_set( :@workdir, WORKDIR )
129
110
  rendered_str = ac.render_to_string("wco_hosting/scripts/create_volume")
130
- # puts '+++ create_volume rendered_str:'
131
- # print rendered_str
111
+ Wco::Log.puts! rendered_str, 'create_volume rendered_str', obj: @obj
132
112
 
133
113
  file = Tempfile.new('prefix')
134
114
  file.write rendered_str
@@ -136,26 +116,22 @@ class WcoHosting::Serverhost
136
116
  # puts! file.path, 'file.path'
137
117
 
138
118
  cmd = "scp #{file.path} #{ssh_host}:#{WORKDIR}/scripts/create_volume"
139
- puts! cmd, 'cmd'
140
- `#{cmd}`
119
+ do_exec cmd
141
120
 
142
121
  cmd = "ssh #{ssh_host} 'chmod a+x #{WORKDIR}/scripts/create_volume ; \
143
122
  #{WORKDIR}/wco_hosting/scripts/create_volume ' "
144
- puts! cmd, 'cmd'
145
- `#{cmd}`
146
-
147
- puts 'ok #create_volume'
123
+ do_exec cmd
148
124
  end
149
125
 
150
126
  def create_volume app
151
- # puts! app.service_name, 'Serverhost#create_volume'
127
+ @obj = app
128
+ Wco::Log.puts! app.service_name, 'Serverhost#create_volume', obj: @obj
152
129
 
153
130
  ac = ActionController::Base.new
154
131
  ac.instance_variable_set( :@app, app )
155
132
  ac.instance_variable_set( :@workdir, WORKDIR )
156
133
  rendered_str = ac.render_to_string("wco_hosting/scripts/create_volume")
157
- puts '+++ create_volume rendered_str:'
158
- print rendered_str
134
+ Wco::Log.puts! rendered_str, 'create_volume rendered_str', obj: @obj
159
135
 
160
136
  file = Tempfile.new('prefix')
161
137
  file.write rendered_str
@@ -167,40 +143,20 @@ class WcoHosting::Serverhost
167
143
 
168
144
  cmd = "ssh #{ssh_host} 'chmod a+x #{WORKDIR}/scripts/create_volume ; #{WORKDIR}/scripts/create_volume ' "
169
145
  do_exec( cmd )
170
-
171
- puts 'ok #create_volume'
172
- return done_exec
173
- end
174
-
175
- def self.list
176
- [[nil,nil]] + all.map { |s| [s.name, s.id] }
177
- # all.map { |s| [s.name, s.id] }
178
146
  end
179
147
 
180
148
  def do_exec cmd
181
- # @messages ||= []
182
- # @errors ||= []
183
- # @statuses ||= []
149
+ Wco::Log.puts! cmd, '#do_exec', obj: @obj
184
150
 
185
- puts! cmd, '#do_exec'
186
151
  stdout, stderr, status = Open3.capture3(cmd)
187
152
  status = status.to_s.split.last.to_i
188
- puts "+++ +++ stdout"
189
- puts stdout
190
- # @messages.push( stdout )
191
- puts "+++ +++ stderr"
192
- puts stderr
193
- # @errors.push( stderr )
194
- puts! status, 'status'
195
- # @statuses.push( status )
153
+ Wco::Log.puts! stdout, 'stdout', obj: @obj
154
+ Wco::Log.puts! stderr, 'stderr', obj: @obj
155
+ Wco::Log.puts! status, 'status', obj: @obj
196
156
  end
197
157
 
198
- def done_exec
199
- @messages ||= []
200
- @errors ||= []
201
- @statuses ||= []
202
- OpenStruct.new( statuses: @statuses, errors: @errors, messages: @messages )
158
+ def self.list
159
+ [[nil,nil]] + all.map { |s| [s.name, s.id] }
160
+ # all.map { |s| [s.name, s.id] }
203
161
  end
204
-
205
-
206
162
  end
@@ -13,6 +13,29 @@
13
13
 
14
14
  %hr
15
15
 
16
+ .row
17
+ .col-md-6
18
+ %h5 Prices
19
+ %ul
20
+ - @leadset.appliance_tmpl_prices.each do |price|
21
+ %li
22
+ .a= price.product
23
+ = price
24
+
25
+ .col-md-6
26
+ %h5.collapse-expand#subscriptionsList
27
+ Subscriptions (#{@subscriptions.length})
28
+ = link_to '[+wco]', new_subscription_path({ customer_id: @leadset.customer_id })
29
+ %table.bordered
30
+ %thead
31
+ %tr
32
+ %th Name
33
+ %th Price
34
+ - @subscriptions.each do |i|
35
+ %tr
36
+ %td= i.product.name
37
+ %td= i.price
38
+ %hr
16
39
  .row
17
40
  .col-md-6
18
41
  %h5.collapse-expand#invoicesList
@@ -30,22 +53,8 @@
30
53
  %label (replace ?)
31
54
  = check_box_tag 'replace'
32
55
  = submit_tag 'Go >', data: { confirm: 'Are you sure?' }
33
- %hr
56
+ %hr
34
57
 
35
- .col-md-6
36
- %h5.collapse-expand#subscriptionsList
37
- Subscriptions (#{@subscriptions.length})
38
- = link_to '[+wco]', new_subscription_path({ customer_id: @leadset.customer_id })
39
- %table.bordered
40
- %thead
41
- %tr
42
- %th Name
43
- %th Price
44
- - @subscriptions.each do |i|
45
- %tr
46
- %td= i.product.name
47
- %td= i.price
48
- %hr
49
58
  .row
50
59
  %h5.collapse-expand#leads Leads
51
60
  = render '/wco/leads/index', leads: @leads
@@ -11,9 +11,10 @@
11
11
  -# = @ctx.unsubscribe_url
12
12
 
13
13
  - if @ctx.reply_to_message
14
- %br
15
- %br
16
- %br
17
- .mini{ style: "font-size: 0.7em; color: gray; text-align: right" } Your previous message is shown below.
18
- %hr
19
- = raw @ctx.reply_to_message.part_html_sanitized
14
+ %blockquote
15
+ %br
16
+ %br
17
+ %br
18
+ .mini{ style: "font-size: 0.7em; color: gray; text-align: right" } Your previous message is shown below.
19
+ %hr
20
+ = raw @ctx.reply_to_message.part_html_sanitized
@@ -0,0 +1,16 @@
1
+ version: '3.2'
2
+
3
+ services:
4
+
5
+ <%= @app.service_name %>:
6
+ image: <%= @app.tmpl.image %>
7
+ volumes:
8
+ - type: bind
9
+ source: volumes/<%= @app.service_name %>_data
10
+ target: /var/www/html
11
+ ports:
12
+ - <%= @app.port %>:80
13
+ restart: always
14
+
15
+
16
+
@@ -10,8 +10,8 @@ rm -rf __MACOSX
10
10
  # curl <%= @app.tmpl.volume_zip %> > <%= @app.kind %>__prototype.zip
11
11
 
12
12
  ## cache/overwrite
13
- [ ! -e <%= @app.kind %>__prototype ] && rm -rf <%= @app.kind %>__prototype && unzip <%= @app.kind %>__prototype.zip
14
- # rm -rf <%= @app.kind %>__prototype && unzip <%= @app.kind %>__prototype.zip
13
+ [ ! -e <%= @app.kind %>__prototype ] && rm -rf <%= @app.kind %>__prototype && unzip -o <%= @app.kind %>__prototype.zip
14
+ # rm -rf <%= @app.kind %>__prototype && unzip -o <%= @app.kind %>__prototype.zip
15
15
 
16
16
  mv <%= @app.kind %>__prototype ./volumes/<%= @app.service_name %>_data
17
17
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wco_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0.106
4
+ version: 3.1.0.107
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Pudeyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-07 00:00:00.000000000 Z
11
+ date: 2024-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -447,7 +447,9 @@ files:
447
447
  - app/models/wco_email/unsubscribe.rb
448
448
  - app/models/wco_hosting/appliance.rb
449
449
  - app/models/wco_hosting/appliance_tmpl.rb
450
+ - app/models/wco_hosting/appliance_tmpl_leadset.rb-trash
450
451
  - app/models/wco_hosting/domain.rb
452
+ - app/models/wco_hosting/environment.rb
451
453
  - app/models/wco_hosting/serverhost.rb
452
454
  - app/views/layouts/wco/application.haml
453
455
  - app/views/wco/_alerts_notices.haml
@@ -617,6 +619,7 @@ files:
617
619
  - app/views/wco_email/email_layouts/_wasyaco_roundborders.html.erb
618
620
  - app/views/wco_hosting/docker-compose/dc-any.erb
619
621
  - app/views/wco_hosting/docker-compose/dc-helloworld.erb
622
+ - app/views/wco_hosting/docker-compose/dc-react.erb
620
623
  - app/views/wco_hosting/docker-compose/dc-wordpress.erb
621
624
  - app/views/wco_hosting/scripts/create_subdomain.json.erb-trash
622
625
  - app/views/wco_hosting/scripts/create_volume.erb