c80_estate 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +67 -0
- data/Rakefile +2 -0
- data/app/admin/c80_estate/areas.rb +56 -0
- data/app/admin/c80_estate/atypes.rb +44 -0
- data/app/admin/c80_estate/prop_names.rb +48 -0
- data/app/admin/c80_estate/properties.rb +38 -0
- data/app/admin/c80_estate/role_types.rb +40 -0
- data/app/admin/c80_estate/uoms.rb +33 -0
- data/app/assets/javascript/c80_estate/backend/admin/areas.js +423 -0
- data/app/assets/javascript/c80_estate/backend/init.js +36 -0
- data/app/assets/javascript/c80_estate/backend/init_selectpicker.js +6 -0
- data/app/assets/javascript/c80_estate/lib/jalert.js +16 -0
- data/app/assets/javascript/c80_estate_active_admin.js.coffee +4 -0
- data/app/assets/stylesheets/c80_estate/backend/admin_areas.scss +109 -0
- data/app/assets/stylesheets/c80_estate/backend/admin_users.scss +27 -0
- data/app/assets/stylesheets/c80_estate/backend/common.scss +3 -0
- data/app/assets/stylesheets/c80_estate/lib/mixins.scss +17 -0
- data/app/assets/stylesheets/c80_estate_active_admin.scss +2 -0
- data/app/controllers/c80_estate/ajax_controller.rb +17 -0
- data/app/models/c80_estate/aphoto.rb +6 -0
- data/app/models/c80_estate/area.rb +26 -0
- data/app/models/c80_estate/astatus.rb +6 -0
- data/app/models/c80_estate/atphoto.rb +6 -0
- data/app/models/c80_estate/atype.rb +132 -0
- data/app/models/c80_estate/comment.rb +7 -0
- data/app/models/c80_estate/item_prop.rb +70 -0
- data/app/models/c80_estate/owner.rb +62 -0
- data/app/models/c80_estate/pphoto.rb +5 -0
- data/app/models/c80_estate/prop_name.rb +19 -0
- data/app/models/c80_estate/property.rb +15 -0
- data/app/models/c80_estate/role.rb +6 -0
- data/app/models/c80_estate/role_type.rb +5 -0
- data/app/models/c80_estate/uom.rb +5 -0
- data/app/uploaders/c80_estate/aphoto_uploader.rb +21 -0
- data/app/uploaders/c80_estate/atphoto_uploader.rb +21 -0
- data/app/uploaders/c80_estate/pphoto_uploader.rb +21 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/c80_estate.gemspec +25 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20160629033533_create_c80_estate_areas.rb +13 -0
- data/db/migrate/20160629033535_create_c80_estate_properties.rb +15 -0
- data/db/migrate/20160629034444_create_c80_prop_names.rb +12 -0
- data/db/migrate/20160629041414_create_c80_estate_uoms.rb +10 -0
- data/db/migrate/20160629090606_create_c80_estate_aphotos.rb +9 -0
- data/db/migrate/20160629091313_create_c80_estate_astatuses.rb +9 -0
- data/db/migrate/20160629092323_create_c80_item_props.rb +14 -0
- data/db/migrate/20160629093030_create_c80_estate_comments.rb +12 -0
- data/db/migrate/20160629100505_create_c80_atypes.rb +10 -0
- data/db/migrate/20160629205151_create_c80_estate_atphotos.rb +9 -0
- data/db/migrate/20160630012727_create_c80_estate_pphotos.rb +9 -0
- data/db/migrate/20160630013636_create_join_table_areas_astatuses.rb +12 -0
- data/db/migrate/20160630013737_create_join_table_atypes_prop_names.rb +12 -0
- data/db/migrate/20160704050000_create_c80_estate_role_types.rb +9 -0
- data/db/migrate/20160704063131_create_c80_estate_roles.rb +10 -0
- data/db/seeds/50_fill_uoms.rb.example +8 -0
- data/db/seeds/55_fill_prop_names.rb.example +51 -0
- data/db/seeds/60_fill_atypes.rb.example +29 -0
- data/lib/c80_estate.rb +8 -0
- data/lib/c80_estate/engine.rb +23 -0
- data/lib/c80_estate/version.rb +3 -0
- metadata +151 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
module C80Estate
|
2
|
+
class ItemProp < ActiveRecord::Base
|
3
|
+
|
4
|
+
belongs_to :area
|
5
|
+
belongs_to :property
|
6
|
+
belongs_to :prop_name
|
7
|
+
|
8
|
+
before_save :before_save_format_value
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def self.capz
|
13
|
+
[24, 36, 46]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.uppz
|
17
|
+
[27, 37, 38]
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.siz
|
21
|
+
[23]
|
22
|
+
end
|
23
|
+
|
24
|
+
def before_save_format_value
|
25
|
+
|
26
|
+
v = self.value
|
27
|
+
uom = prop_name.uom
|
28
|
+
|
29
|
+
# удаляем пробелы в начале и в конце строки
|
30
|
+
v = v.strip! || v
|
31
|
+
|
32
|
+
# числовые значения преобразуем в числа
|
33
|
+
if uom.present? && uom.is_number
|
34
|
+
|
35
|
+
v = v.gsub(' ', '')
|
36
|
+
v = v.gsub(',', '.')
|
37
|
+
v = v[/([0-9.]+)/]
|
38
|
+
|
39
|
+
# нечисловые значения: либо capitalize, либо upcase, либо downcase
|
40
|
+
else
|
41
|
+
|
42
|
+
if prop_name_id.in?(ItemProp.capz)
|
43
|
+
v = v.mb_chars.capitalize.to_s
|
44
|
+
elsif prop_name_id.in?(ItemProp.uppz)
|
45
|
+
v = v.mb_chars.upcase.to_s
|
46
|
+
else
|
47
|
+
v = v.mb_chars.downcase.to_s
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
if prop_name_id.in?(ItemProp.siz)
|
53
|
+
v = v.gsub(',', '.')
|
54
|
+
sizes = v.scan(/([0-9,]+)/)
|
55
|
+
oum = v.scan(/[мс]*м/)
|
56
|
+
v = sizes.join(" x ")
|
57
|
+
if oum.count > 0
|
58
|
+
v += " #{oum[0]}"
|
59
|
+
else
|
60
|
+
v += ' мм'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
self.value = v
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module C80Estate
|
2
|
+
|
3
|
+
module Owner
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
# ERROR: Cannot define multiple 'included' blocks for a Concern
|
8
|
+
# included do
|
9
|
+
#
|
10
|
+
# end
|
11
|
+
|
12
|
+
def self.included(klass)
|
13
|
+
klass.extend ClassMethods
|
14
|
+
klass.send(:include, InstanceMethods)
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
|
19
|
+
def act_as_owner
|
20
|
+
class_eval do
|
21
|
+
# эти взаимосвязи можно трактовать, как "создатель объектов этих классов"
|
22
|
+
has_many :areas, :as => :owner, :class_name => 'C80Estate::Area', :dependent => :nullify
|
23
|
+
has_many :properties, :as => :owner, :class_name => 'C80Estate::Property', :dependent => :nullify
|
24
|
+
has_many :comments, :as => :owner, :class_name => 'C80Estate::Comment', :dependent => :destroy
|
25
|
+
# эта взаимосвязь трактуется, как "роль, назначенная персоне"
|
26
|
+
has_many :roles, :as => :owner, :class_name => 'C80Estate::Role', :dependent => :destroy
|
27
|
+
accepts_nested_attributes_for :roles,
|
28
|
+
:reject_if => lambda { |attributes|
|
29
|
+
!attributes.present?
|
30
|
+
},
|
31
|
+
:allow_destroy => true
|
32
|
+
|
33
|
+
after_create :create_role
|
34
|
+
|
35
|
+
def create_role
|
36
|
+
Rails.logger.debug('<Owner.create_role>')
|
37
|
+
r = C80Estate::Role.create({ role_type_id: nil })
|
38
|
+
roles << r
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module InstanceMethods
|
46
|
+
|
47
|
+
def role_type_title
|
48
|
+
res = " - "
|
49
|
+
if roles.count > 0
|
50
|
+
if roles.first.role_type_id.present?
|
51
|
+
res = roles.first.role_type.title
|
52
|
+
end
|
53
|
+
end
|
54
|
+
res
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
ActiveRecord::Base.send :include, C80Estate::Owner
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module C80Estate
|
2
|
+
class PropName < ActiveRecord::Base
|
3
|
+
|
4
|
+
# validates_with PropNameValidator
|
5
|
+
|
6
|
+
# у этой (абстрактной по сути) характеристики есть конкретные порождения - свойства.
|
7
|
+
has_many :item_props, :dependent => :destroy
|
8
|
+
has_and_belongs_to_many :atypes, :join_table => 'c80_estate_atypes_prop_names'
|
9
|
+
|
10
|
+
# каждое свойство принадлежит какой-то единице измерения
|
11
|
+
belongs_to :uom
|
12
|
+
|
13
|
+
# accepts_nested_attributes_for :uom
|
14
|
+
# has_and_belongs_to_many :main_props
|
15
|
+
# has_and_belongs_to_many :common_props
|
16
|
+
# has_and_belongs_to_many :price_props
|
17
|
+
default_scope {order(:title => :asc)}
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module C80Estate
|
2
|
+
class Property < ActiveRecord::Base
|
3
|
+
belongs_to :atype
|
4
|
+
belongs_to :owner, :polymorphic => true
|
5
|
+
has_many :item_props, :dependent => :destroy
|
6
|
+
has_many :pphotos, :dependent => :destroy # одна или несколько фоток
|
7
|
+
accepts_nested_attributes_for :pphotos,
|
8
|
+
:reject_if => lambda { |attributes|
|
9
|
+
!attributes.present?
|
10
|
+
},
|
11
|
+
:allow_destroy => true
|
12
|
+
has_many :areas, :dependent => :destroy
|
13
|
+
has_many :comments, :dependent => :destroy
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module C80Estate
|
2
|
+
class AphotoUploader < BaseFileUploader
|
3
|
+
|
4
|
+
# ограничение оригинальной картинки
|
5
|
+
process :resize_to_limit => [1024, 1024]
|
6
|
+
|
7
|
+
version :thumb512 do
|
8
|
+
process :resize_to_limit => [512, 512]
|
9
|
+
end
|
10
|
+
|
11
|
+
version :thumb256 do
|
12
|
+
process :resize_to_limit => [256, 256]
|
13
|
+
end
|
14
|
+
|
15
|
+
def store_dir
|
16
|
+
"uploads/areas/#{model.id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module C80Estate
|
2
|
+
class AtphotoUploader < BaseFileUploader
|
3
|
+
|
4
|
+
# ограничение оригинальной картинки
|
5
|
+
process :resize_to_limit => [1024, 1024]
|
6
|
+
|
7
|
+
version :thumb512 do
|
8
|
+
process :resize_to_limit => [512, 512]
|
9
|
+
end
|
10
|
+
|
11
|
+
version :thumb256 do
|
12
|
+
process :resize_to_limit => [256, 256]
|
13
|
+
end
|
14
|
+
|
15
|
+
def store_dir
|
16
|
+
"uploads/atypes/#{model.id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module C80Estate
|
2
|
+
class PphotoUploader < BaseFileUploader
|
3
|
+
|
4
|
+
# ограничение оригинальной картинки
|
5
|
+
process :resize_to_limit => [1024, 1024]
|
6
|
+
|
7
|
+
version :thumb512 do
|
8
|
+
process :resize_to_limit => [512, 512]
|
9
|
+
end
|
10
|
+
|
11
|
+
version :thumb256 do
|
12
|
+
process :resize_to_limit => [256, 256]
|
13
|
+
end
|
14
|
+
|
15
|
+
def store_dir
|
16
|
+
"uploads/properties/#{model.id}"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "c80_estate"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/c80_estate.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'c80_estate/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "c80_estate"
|
8
|
+
spec.version = C80Estate::VERSION
|
9
|
+
spec.authors = ["C80609A"]
|
10
|
+
spec.email = ["c080609a@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = 'Estate Gem'
|
13
|
+
spec.description = 'for real estate app'
|
14
|
+
spec.homepage = "http://bc-acond.ru"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_dependency 'activesupport', ['>= 3.0.0']
|
25
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateC80EstateAreas < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_estate_areas, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :title
|
5
|
+
t.text :desc
|
6
|
+
t.references :property, index: true
|
7
|
+
t.references :atype, index: true
|
8
|
+
t.string :owner_type
|
9
|
+
t.references :owner, index: true
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateC80EstateProperties < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_estate_properties, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :title
|
5
|
+
t.text :desc
|
6
|
+
t.string :address
|
7
|
+
t.string :latitude
|
8
|
+
t.string :longitude
|
9
|
+
t.string :owner_type
|
10
|
+
t.references :owner, index: true
|
11
|
+
t.references :atype, index: true
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateC80PropNames < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_estate_prop_names, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :title
|
5
|
+
t.boolean :is_normal_price
|
6
|
+
t.boolean :is_excluded_from_filtering
|
7
|
+
t.references :uom, index: true
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
# add_foreign_key :c80_sass_seo_sites, :owners
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateC80ItemProps < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_estate_item_props, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :value
|
5
|
+
t.references :area, index: true
|
6
|
+
t.references :property, index: true
|
7
|
+
t.references :prop_name, index: true
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
# add_foreign_key :c80_item_props, :areas
|
12
|
+
# add_foreign_key :c80_item_props, :prop_names
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateC80EstateComments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_estate_comments, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.text :content
|
5
|
+
t.references :area, index: true
|
6
|
+
t.references :property, index: true
|
7
|
+
t.string :owner_type
|
8
|
+
t.references :owner, index: true
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|