ish_models 0.0.33.194 → 0.0.33.196

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18d1d504900c0b683dc0d876ac2c7a00552a0baed0e364f8ca53d40a20607a9d
4
- data.tar.gz: 0dc8f5df4aba00affe8c276647c76155ab07495ad8fb25ac2524af1b4096aa13
3
+ metadata.gz: 6734c976f4a39e4643051995a75026a996a4ae8c508944a6e29ed11957071cd3
4
+ data.tar.gz: a49d33a5c8de3573b443193e6232fd154e9d53711478e6b82d73a4388daa4be4
5
5
  SHA512:
6
- metadata.gz: 0feae87ac0aeb2d409ac578e604d8b574a86b72668001bda1b7f3fa4e5f821c283e2d1a97ecdd387b4dc0099c6599c63bda6c0c5771b4dbf6a57aa4140fdb4d5
7
- data.tar.gz: b0eca2407e7950188a0b5525261f4fda5d37e3e42413781d71e4001079d996c2f89809dba4a9f3e60defdfac51ae15e92a4b4e46c8e874b6cc97e5fbb6877114
6
+ metadata.gz: e6bc3dbab0f0ea3414495717e8bd0b917f784cdba1968ea45eb4c3d762e3239c1f9295f67015c01c8f9736100c775313e46672aa0be1f361b21ae3a9b092a6c2
7
+ data.tar.gz: abc1d99ca58a33d8ea0349e2df99a946491a24fdf65b442cf5734125faf998981760aff42a651c3fe8f0a5653bafedde7954e30932205250e2b776761945f203
data/lib/gallery.rb CHANGED
@@ -45,15 +45,16 @@ class Gallery
45
45
 
46
46
  belongs_to :user_profile, :optional => true, :class_name => 'Ish::UserProfile', :inverse_of => :galleries
47
47
 
48
- has_many :newsitems # seems correct. _vp_ 2022-03-21
49
- has_many :photos
48
+ has_many :newsitems # Seems correct. _vp_ 2022-03-21
50
49
 
50
+ has_many :photos, order: { ordering: :asc }
51
51
 
52
+ ACTIONS = [ 'show_mini', 'show_long', 'show' ]
52
53
  # @deprecated, use Gallery::ACTIONS
53
54
  def self.actions
54
55
  ACTIONS
55
56
  end
56
- ACTIONS = [ 'show_mini', 'show_long', 'show' ]
57
+
57
58
 
58
59
  RENDER_TITLES = 'index_titles' # view name
59
60
  RENDER_THUMBS = 'index_thumbs' # view name
@@ -44,18 +44,18 @@ class Ish::EmailCampaign
44
44
  end
45
45
 
46
46
 
47
- ##
48
- ## For templating:
49
- ##
50
- ## commonly: name, companyName
51
- field :tmpl, type: Hash, default: {}
52
- def body_templated
53
- out = email_template.body
54
- tmpl.each do |k, v|
55
- out.gsub!("{#{k}}", v)
56
- end
57
- out
58
- end
47
+ # ##
48
+ # ## For templating:
49
+ # ##
50
+ # ## commonly: name, companyName
51
+ # field :tmpl, type: Hash, default: {}
52
+ # def body_templated
53
+ # out = email_template.body
54
+ # tmpl.each do |k, v|
55
+ # out.gsub!("{#{k}}", v)
56
+ # end
57
+ # out
58
+ # end
59
59
 
60
60
  #
61
61
  # For tracking
@@ -3,22 +3,36 @@
3
3
  # Sends a single email
4
4
  #
5
5
 
6
- class Ish::EmailContext
6
+ class ::Ish::EmailContext
7
7
  include Mongoid::Document
8
8
  include Mongoid::Timestamps
9
9
 
10
10
  ## @TODO: probably rename it to slug
11
11
  field :slug
12
12
  validates_uniqueness_of :slug, allow_nil: true
13
- def title
14
- slug
13
+
14
+ field :preview_str, type: :string
15
+ def preview_str
16
+ if self[:preview_str].presence?
17
+ return self[:preview_str]
18
+ else
19
+ return tmpl.preview_str
20
+ end
15
21
  end
16
22
 
17
23
  PAGE_PARAM_NAME = 'email_contexts_page'
18
24
 
19
- FROM_EMAILS = %w| hello@infiniteshelter.com no-reply@infiniteshelter.com
20
- piousbox@gmail.com victor@piousbox.com no-reply@piousbox.com
21
- admin@wasya.co hello@wasya.co no-reply@wasya.co victor@wasya.co |
25
+ FROM_EMAILS = [
26
+ 'Infinite Shelter <hello@infiniteshelter.com>',
27
+ 'Infinite Shelter <no-reply@infiniteshelter.com>',
28
+ 'Victor Piousbox <piousbox@gmail.com>',
29
+ 'Victor Piousbox <victor@piousbox.com>',
30
+ 'Victor Piousbox <no-reply@piousbox.com>',
31
+ 'Victor Piousbox <admin@wasya.co>',
32
+ 'WasyaCo Consulting <hello@wasya.co>',
33
+ 'WasyaCo Consulting <no-reply@wasya.co>',
34
+ 'Victor Piousbox <victor@wasya.co>',
35
+ ];
22
36
  field :from_email
23
37
  validates_presence_of :from_email
24
38
  def self.from_email_list
@@ -29,9 +43,13 @@ class Ish::EmailContext
29
43
  validates_presence_of :subject
30
44
 
31
45
  field :body
32
- # validates_presence_of :body ## With plain type, there is no body but there are variables for templating.
33
46
 
34
47
  belongs_to :email_template
48
+ def tmpl
49
+ email_template
50
+ end
51
+
52
+ belongs_to :scheduled_email_action, class_name: '::Office::ScheduledEmailAction', optional: true
35
53
 
36
54
  field :rendered_str
37
55
 
@@ -46,34 +64,38 @@ class Ish::EmailContext
46
64
  Ish::EmailContext.where( sent_at: nil )
47
65
  end
48
66
 
49
- def self.current
50
- new.current
67
+ def self.scheduled
68
+ new.scheduled
51
69
  end
52
- def current
70
+ def scheduled
53
71
  # or({ :send_at.lte => Time.now }, { :send_at => nil }) ## This won't work b/c I need draft state!
54
72
  Ish::EmailContext.where({ :send_at.lte => Time.now })
55
73
  end
56
74
 
57
75
 
58
- ##
59
- ## For templating:
60
- ##
61
- ## commonly: name, companyName
62
- field :tmpl, type: Hash, default: {}
63
- def body_templated
64
- out = email_template.body
65
- tmpl.each do |k, v|
66
- out.gsub!("{#{k}}", v)
76
+ field :lead_id
77
+ def lead
78
+ Lead.find lead_id
79
+ end
80
+ ## @deprecated: use self.lead
81
+ field :to_email
82
+ def to_email
83
+ if self[:lead_id]
84
+ return lead[:email]
85
+ else
86
+ return self[:to_email]
67
87
  end
68
- out
69
88
  end
70
89
 
71
- field :to_email
72
- validates_presence_of :to_email
73
90
 
74
- #
75
- # For tracking
76
- #
91
+ ##
92
+ ## For tracking / utm
93
+ ##
77
94
  attr_reader :tid
78
95
 
96
+ def get_binding
97
+ @lead = lead()
98
+ binding()
99
+ end
100
+
79
101
  end
@@ -4,20 +4,33 @@ class ::Ish::EmailTemplate
4
4
  include Mongoid::Timestamps
5
5
 
6
6
  field :slug
7
- validates_uniqueness_of :slug, scope: [ :version ]
7
+ validates_uniqueness_of :slug
8
8
  validates_presence_of :slug
9
9
 
10
- field :version, default: '0.0.0'
10
+ field :preview_str, type: :string
11
11
 
12
- TYPES = %w| partial plain |
13
- field :type
14
- def self.type_list
15
- [ [nil,nil] ] + TYPES.map { |i| [i, i] }
16
- end
12
+ field :layout, type: :string, default: 'plain'
13
+ LAYOUTS = %w| plain
14
+ m20221201react m20221222merryxmas
15
+ marketing_react_1
16
+ marketing_ror_1 marketing_ror_2
17
+ marketing_wordpres_1 marketing_wordpress_2
18
+ piousbox_roundborders
19
+ plain
20
+ wasyaco_roundborders |
17
21
 
18
22
  field :subject
19
23
  field :body
20
24
  field :from_email
21
25
 
26
+ ## 2023-03-04 _vp_ This works!
27
+ def get_binding
28
+ @lead = Lead.where( email: 'stub@wasya.co' ).first
29
+ binding()
30
+ end
31
+
32
+ has_many :email_actions, class_name: '::Office::EmailAction'
33
+ has_many :email_contexts, class_name: '::Ish::EmailContext'
34
+
22
35
  end
23
- EmailTemplate = ::Ish::EmailTemplate
36
+ ::Tmpl = ::Ish::EmailTemplate
data/lib/ish_models.rb CHANGED
@@ -67,8 +67,12 @@ require 'photo'
67
67
  require 'report'
68
68
  require 'video'
69
69
 
70
- require 'office/action'
70
+ require 'office/email_action'
71
+ require 'office/email_conversation'
72
+ require 'office/email_filter'
71
73
  require 'office/email_message'
74
+ require 'office/email_message_stub'
75
+ require 'office/scheduled_email_action'
72
76
 
73
77
 
74
78
 
@@ -0,0 +1,25 @@
1
+
2
+ ##
3
+ ## 2023-03-04 _vp_ When I receive one.
4
+ ## 2023-03-04 _vp_ Also when I send one, forever.
5
+ ##
6
+ class Office::EmailAction
7
+ include Mongoid::Document
8
+ include Mongoid::Timestamps
9
+
10
+ field :slug, type: :string
11
+ validates :slug, uniqueness: true, allow_nil: true
12
+
13
+ field :descr, type: :string
14
+
15
+ belongs_to :email_template, class_name: '::Ish::EmailTemplate'
16
+
17
+ field :next_in_days, type: :string
18
+ field :next_at_time, type: :string
19
+
20
+ belongs_to :prev_email_action, class_name: '::Office::EmailAction', optional: true, inverse_of: :next_email_actions
21
+ has_many :next_email_actions, class_name: '::Office::EmailAction', inverse_of: :prev_email_action
22
+
23
+ has_many :scheduled_email_actions, class_name: '::Office::ScheduledEmailAction'
24
+ end
25
+
@@ -0,0 +1,52 @@
1
+
2
+ class Office::EmailConversation
3
+ include Mongoid::Document
4
+ include Mongoid::Timestamps
5
+ include Mongoid::Paranoia
6
+
7
+ STATE_UNREAD = 'state_unread'
8
+ STATE_READ = 'state_read'
9
+ STATES = [ STATE_UNREAD, STATE_READ ]
10
+ field :state
11
+
12
+ field :subject
13
+ field :latest_at
14
+
15
+ field :lead_ids, type: :array, default: []
16
+ def leads
17
+ Lead.find( lead_ids )
18
+ end
19
+
20
+ field :term_ids, type: :array, default: []
21
+ def tags
22
+ WpTag.find( term_ids )
23
+ end
24
+
25
+ has_many :email_messages
26
+ def email_messages
27
+ Office::EmailMessage.where( email_conversation_id: self.id )
28
+ end
29
+
30
+ ## Copied from email_message
31
+ field :wp_term_ids, type: Array, default: []
32
+ ## Tested manually ok, does not pass the spec. @TODO: hire to make pass spec? _vp_ 2023-03-07
33
+ def add_tag tag
34
+ if WpTag == tag.class
35
+ self[:wp_term_ids] = self[:wp_term_ids].push(tag.id).uniq
36
+ self.save!
37
+ else
38
+ throw "#add_tag expects a WpTag as the only parameter."
39
+ end
40
+ end
41
+ def remove_tag tag
42
+ if WpTag == tag.class
43
+ self[:wp_term_ids].delete( tag.id )
44
+ self.save!
45
+ else
46
+ throw "#remove_tag expects a WpTag as the only parameter."
47
+ end
48
+ end
49
+
50
+ end
51
+ # EmailConversation = Office::EmailConversation
52
+ Conv = Office::EmailConversation
@@ -0,0 +1,24 @@
1
+
2
+ ##
3
+ ## 2023-03-04 _vp_ When I receive one.
4
+ ##
5
+ class Office::EmailFilter
6
+ include Mongoid::Document
7
+ include Mongoid::Timestamps
8
+
9
+ field :from_regex
10
+ field :body_regex
11
+
12
+ KIND_SKIP_INBOX = 'skip-inbox'
13
+ KIND_AUTORESPOND = 'autorespond'
14
+ KINDS = [ nil, KIND_SKIP_INBOX, KIND_AUTORESPOND ]
15
+ field :kind
16
+
17
+ STATE_ACTIVE = 'active'
18
+ STATE_INACTIVE = 'inactive'
19
+ STATES = [ STATE_ACTIVE, STATE_INACTIVE ]
20
+ field :state, type: :string, default: STATE_ACTIVE
21
+ scope :active, ->{ where( state: STATE_ACTIVE ) }
22
+
23
+ end
24
+
@@ -7,6 +7,13 @@ class Office::EmailMessage
7
7
  include Mongoid::Timestamps
8
8
 
9
9
  field :raw, type: :string
10
+
11
+ field :message_id, type: :string # MESSAGE-ID
12
+ validates_uniqueness_of :message_id
13
+ index({ message_id: 1 }, { unique: true, name: "message_id_idx" })
14
+
15
+ field :in_reply_to_id, type: :string
16
+
10
17
  field :object_key, type: :string ## aka 'filename', use with bucket name + prefix
11
18
  # validates_presence_of :object_key
12
19
  field :object_path, type: :string ## A routable s3 url
@@ -16,19 +23,47 @@ class Office::EmailMessage
16
23
  field :part_html
17
24
  # attachments ?
18
25
 
19
- field :from, type: Array, default: []
20
- def from_str
21
- from.join(", ")
26
+ def lead
27
+ Lead.find_by email: from
22
28
  end
23
29
 
24
- field :to, type: Array, default: []
25
- field :cc, type: Array, default: []
26
- field :bcc, type: Array, default: []
30
+ field :from, type: :string
31
+ field :froms, type: Array, default: []
32
+ field :to, type: :string
33
+ field :tos, type: Array, default: []
34
+ field :ccs, type: Array, default: []
35
+ field :bccs, type: Array, default: []
36
+
27
37
  field :date, type: DateTime
28
38
  def received_at
29
39
  date
30
40
  end
31
41
 
42
+ ## Copied to email_conversation
43
+ field :wp_term_ids, type: Array, default: []
44
+ ## Tested manually ok, does not pass the spec. @TODO: hire to make pass spec? _vp_ 2023-03-07
45
+ def add_tag tag
46
+ if WpTag == tag.class
47
+ self[:wp_term_ids] = self[:wp_term_ids].push(tag.id).uniq
48
+ self.save!
49
+ else
50
+ throw "#add_tag expects a WpTag as the only parameter."
51
+ end
52
+ end
53
+ def remove_tag tag
54
+ if WpTag == tag.class
55
+ self[:wp_term_ids].delete( tag.id )
56
+ self.save!
57
+ else
58
+ throw "#remove_tag expects a WpTag as the only parameter."
59
+ end
60
+ end
61
+
62
+ belongs_to :email_conversation
63
+ def conv
64
+ email_conversation
65
+ end
66
+
32
67
  ## @TODO: reimplement, look at footer instead.
33
68
  def name
34
69
  return 'associate'
@@ -39,39 +74,53 @@ class Office::EmailMessage
39
74
  from[0].split('@')[1]
40
75
  end
41
76
 
42
- def process
43
- Aws.config[:credentials] = Aws::Credentials.new(
44
- ::S3_CREDENTIALS[:access_key_id],
45
- ::S3_CREDENTIALS[:secret_access_key]
46
- )
47
- s3 = Aws::S3::Client.new
48
-
49
- obj = s3.get_object({
50
- bucket: 'ish-ses',
51
- key: self.object_key
52
- })
53
- obj2 = obj.body.read
54
-
55
- mail = Mail.read_from_string( obj2 )
56
- self.from = mail.from
57
- self.to = mail.to
58
- self.subject = mail.subject
59
- self.date = mail.date
60
- self.raw = obj2
61
-
62
- self.save
63
- end
64
-
65
- ## action.match_from = '@synchrony.com'
66
- def apply_actions
67
- triggers = Office::Action.active.where({ channel: 'email' })
68
- triggers.each do |trigger|
69
- if self.from_str.match(/#{trigger.match_from}/i)
70
- trigger.actions do |action|
71
- Office::Action.call( action[:method], { msg: self }.merge( action[:params] ))
72
- end
73
- end
77
+ def apply_filter filter
78
+ case filter.kind
79
+ when ::Office::EmailFilter::KIND_SKIP_INBOX
80
+ self.remove_tag( ::WpTag.email_inbox_tag )
81
+ when ::Office::EmailFilter::KIND_AUTORESPOND
82
+ Ish::EmailContext.create({
83
+ email_template: ::Tmpl.find_by_slug( filter.email_template_slug ),
84
+ lead: lead,
85
+ })
86
+ # when 'autorespond-remind'
87
+ # Office::EmailAction.create({
88
+ # tmpl_slug: 'require-sign-nda',
89
+ # next_in_days: -> { rand(1..5) },
90
+ # next_at_time: ->{ rand(8..16).hours + rand(1..59).minutes },
91
+ # next_action: 're-remind-sign-nda',
92
+ # })
93
+ # Ish::EmailContext.create({
94
+ # email_template: ::Tmpl.find_by_slug( filter.email_template_slug ),
95
+ # lead: lead,
96
+ # })
97
+ else
98
+ raise "unknown filter kind: #{filter.kind}"
74
99
  end
75
100
  end
76
101
 
77
102
  end
103
+ ::Msg = Office::EmailMessage
104
+
105
+
106
+
107
+ ## trash _vp_ 2023-03-07
108
+ # def process
109
+ # Aws.config[:credentials] = Aws::Credentials.new(
110
+ # ::S3_CREDENTIALS[:access_key_id],
111
+ # ::S3_CREDENTIALS[:secret_access_key]
112
+ # )
113
+ # s3 = Aws::S3::Client.new
114
+ # obj = s3.get_object({
115
+ # bucket: 'ish-ses',
116
+ # key: self.object_key
117
+ # })
118
+ # obj2 = obj.body.read
119
+ # mail = Mail.read_from_string( obj2 )
120
+ # self.from = mail.from
121
+ # self.to = mail.to
122
+ # self.subject = mail.subject
123
+ # self.date = mail.date
124
+ # self.raw = obj2
125
+ # self.save
126
+ # end
@@ -0,0 +1,23 @@
1
+
2
+ ##
3
+ ## Only object_key, object_path, no validations.
4
+ ##
5
+ class Office::EmailMessageStub
6
+ include Mongoid::Document
7
+ include Mongoid::Timestamps
8
+
9
+ STATE_PENDING = 'state_pending'
10
+ STATE_PROCESSED = 'state_processed'
11
+ STATES = [ STATE_PENDING, STATE_PROCESSED ]
12
+ field :state, type: :string, default: STATE_PENDING
13
+
14
+ field :object_key, type: :string ## aka 'filename', use with bucket name + prefix
15
+ validates_presence_of :object_key
16
+
17
+ field :object_path, type: :string ## A routable s3 url ## @TODO: remove this field. _vp_ 2023-03-07
18
+ # validates_presence_of :object_path ## only need object_key == message_id
19
+
20
+ field :term_ids, type: :array, default: []
21
+
22
+ end
23
+ Stub = EMS = Office::EmailMessageStub
@@ -0,0 +1,48 @@
1
+
2
+ ##
3
+ ## 2023-03-04 _vp_ An instance of an EmailAction.
4
+ ##
5
+ class Office::ScheduledEmailAction
6
+ include Mongoid::Document
7
+ include Mongoid::Timestamps
8
+ include Mongoid::Paranoia
9
+
10
+ field :lead_id, type: :integer
11
+ def lead
12
+ Lead.find( lead_id )
13
+ end
14
+
15
+ STATE_ACTIVE = 'active'
16
+ STATE_INACTIVE = 'inactive'
17
+ STATES = [ STATE_ACTIVE, STATE_INACTIVE ]
18
+ field :state, type: :string
19
+ scope :active, ->{ where( state: STATE_ACTIVE ) }
20
+
21
+ belongs_to :email_action, class_name: '::Office::EmailAction'
22
+ has_many :email_contexts, class_name: '::Ish::EmailContext'
23
+
24
+ field :perform_at, type: :timestamp
25
+
26
+ end
27
+ ::Sch = Office::ScheduledEmailAction
28
+
29
+ ## @TODO: herehere 2023-03-04 _vp_ Currently Working on this
30
+ =begin
31
+ ::Sch.active.where( :perform_at.lte => Time.now ) do |sch|
32
+ next_a = sch.next_email_action
33
+
34
+ if sch.next_actions.present?
35
+ sch.next_actions.each do |next_a|
36
+ next_sch_a = ::Office::ScheduledEmailAction.new({
37
+ email_action: next_a
38
+
39
+ next_time = Time.now + eval( sch.next_in_days )
40
+ next_time.time = eval( sch.next_at_time )
41
+ sch.update_attribute( :perform_at, next_time )
42
+ end
43
+ else
44
+ sch.update_attribute( state: STATE_INACTIVE )
45
+ end
46
+ =end
47
+
48
+
data/lib/photo.rb CHANGED
@@ -19,7 +19,17 @@ class Photo
19
19
  belongs_to :gallery, :optional => true
20
20
  belongs_to :newsitem, :optional => true
21
21
 
22
+ # photo.photo.to_s.split('/').last.split('?').first
22
23
  field :name, :type => String
24
+ def name
25
+ return self[:name] if self[:name]
26
+ update_attribute(:name, self.photo.to_s.split('/').last.split('?').first)
27
+ name
28
+ end
29
+
30
+ field :ordering, type: :integer
31
+ index({ ordering: -1 })
32
+
23
33
  field :descr, :type => String
24
34
  field :subhead
25
35
  field :weight, :type => Integer, :default => 10
data/lib/report.rb CHANGED
@@ -68,7 +68,7 @@ class Report
68
68
  [['', nil]] + out.map { |item| [ item.name, item.id ] }
69
69
  end
70
70
 
71
- PER_PAGE = 20
71
+ PER_PAGE = 10
72
72
  def self.paginates_per
73
73
  self::PER_PAGE
74
74
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ish_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.33.194
4
+ version: 0.0.33.196
5
5
  platform: ruby
6
6
  authors:
7
7
  - piousbox
@@ -122,7 +122,6 @@ files:
122
122
  - lib/gameui/map_bookmark.rb
123
123
  - lib/gameui/marker.rb
124
124
  - lib/gameui/premium_purchase.rb
125
- - lib/iro/option_price_item.rb-trash
126
125
  - lib/ish/cache_key.rb
127
126
  - lib/ish/configuration.rb
128
127
  - lib/ish/crawler.rb
@@ -138,25 +137,20 @@ files:
138
137
  - lib/ish/payment.rb
139
138
  - lib/ish/premium_item.rb
140
139
  - lib/ish/railtie.rb
141
- - lib/ish/trash/email_campaign.rb
142
- - lib/ish/trash/lead.rb
143
- - lib/ish/trash/lead.rb-bk
144
140
  - lib/ish/user_profile.rb
145
141
  - lib/ish/utils.rb
146
142
  - lib/ish_models.rb
147
143
  - lib/mongoid/votable.rb
148
144
  - lib/mongoid/voter.rb
149
145
  - lib/newsitem.rb
150
- - lib/office/action.rb
146
+ - lib/office/email_action.rb
147
+ - lib/office/email_conversation.rb
148
+ - lib/office/email_filter.rb
151
149
  - lib/office/email_message.rb
150
+ - lib/office/email_message_stub.rb
151
+ - lib/office/scheduled_email_action.rb
152
152
  - lib/photo.rb
153
153
  - lib/report.rb
154
- - lib/trash/app_model2.rb
155
- - lib/trash/city.rb-bk
156
- - lib/trash/event.rb
157
- - lib/trash/site.rb
158
- - lib/trash/tag_trash.rb
159
- - lib/trash/venue.rb
160
154
  - lib/video.rb
161
155
  homepage: https://wasya.co
162
156
  licenses:
@@ -1,8 +0,0 @@
1
-
2
- require 'active_record'
3
-
4
- class ::Iro::OptionPriceItem < ActiveRecord::Base
5
-
6
- self.table_name = 'iro_option_price_items'
7
-
8
- end
@@ -1,28 +0,0 @@
1
-
2
- class Ish::EmailCampaign
3
- include Mongoid::Document
4
- include Mongoid::Timestamps
5
-
6
- store_in :collection => 'ish_campaign'
7
-
8
- belongs_to :profile, :class_name => 'Ish::UserProfile'
9
-
10
- has_and_belongs_to_many :leads, :class_name => 'Ish::Lead'
11
- has_and_belongs_to_many :unsubscribe_leads, :class_name => 'Ish::Lead'
12
-
13
- field :subject
14
- field :body
15
-
16
- ## @TODO: tags instead?
17
- field :is_done, :type => Boolean, :default => false
18
- field :is_trash, :type => Boolean, :default => false
19
- field :tag # 'hired_com_ror', not enumerated for now _vp_ 20180103
20
-
21
- ## @TODO: sent on, scheduled_on, ...
22
- field :applied_on, :type => Time
23
-
24
- ## Need tracking!
25
-
26
- ## this looks like an email_context, copy from there.
27
-
28
- end
@@ -1,52 +0,0 @@
1
-
2
- #
3
- # Lead
4
- # _vp_ 20171204
5
- #
6
- class Ish::Lead
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- store_in :collection => 'ish_leads'
11
-
12
- belongs_to :profile, :class_name => '::Ish::UserProfile'
13
-
14
- has_and_belongs_to_many :campaigns, :class_name => '::Ish::Campaign', :inverse_of => :leads
15
- has_and_belongs_to_many :unsubscribe_campaigns, :class_name => '::Ish::Campaign', :inverse_of => :unsubscribe_leads
16
-
17
- field :email
18
- field :job_url
19
- field :company_url
20
- field :website_html
21
- field :yelp_url
22
-
23
- field :company
24
- validates_uniqueness_of :company
25
- index({ :company => -1 })
26
-
27
- field :description
28
-
29
- STATES = %w( considering applied )
30
- field :state, :type => String
31
-
32
- field :is_done, :type => Boolean, :default => false
33
- field :is_trash, :type => Boolean, :default => false
34
-
35
- field :applied_on, :type => Time
36
-
37
- field :tag, :type => String # 'hired_com_ror', not enumerated for now _vp_ 20180103
38
- field :location
39
-
40
- field :raw_phone, :type => String
41
- def phone= which
42
- write_attribute :raw_phone, which
43
- write_attribute :phone, which.gsub(/\D/, '').to_i
44
- end
45
- field :phone, :type => Integer
46
- field :address, :type => String
47
-
48
- # If I crawl on 20180724, I add "20180724" here, so I don't crawl in the same way again.
49
- field :extra, :type => Array, :default => []
50
-
51
- end
52
-
@@ -1,38 +0,0 @@
1
-
2
- #
3
- # Lead
4
- # _vp_ 20171204
5
- #
6
- class Ish::Lead
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- store_in :collection => 'ish_leads'
11
-
12
- # field :email
13
- # field :company_url
14
- # field :yelp_url
15
-
16
- # # company name
17
- # field :company
18
- # validates_uniqueness_of :company
19
- # index({ :company => -1 })
20
-
21
- # field :description # comment, actually
22
-
23
- field :is_done, :type => Boolean, :default => false
24
- field :is_trash, :type => Boolean, :default => false
25
-
26
- field :tag, :type => String # 'hired_com_ror', not enumerated for now _vp_ 20180103
27
- # field :location
28
-
29
- field :raw_phone, :type => String
30
- def phone= which
31
- write_attribute :raw_phone, which
32
- write_attribute :phone, which.gsub(/\D/, '').to_i
33
- end
34
- field :phone, :type => Integer
35
-
36
- end
37
-
38
-
data/lib/office/action.rb DELETED
@@ -1,44 +0,0 @@
1
-
2
- ##
3
- ## Such actions as auto-responder.
4
- ##
5
- class Office::Action
6
- include Mongoid::Document
7
- include Mongoid::Timestamps
8
-
9
- field :status, type: String, default: 'active'
10
- field :channel, type: String ## eg 'email'
11
- field :match_from, type: String ## eg '@synchrony.com', '*@synchrony.com$'
12
-
13
- scope :active, -> { where( status: 'active' ) }
14
-
15
- ## eg [ { 'method': 'create_lead', 'params': {} },
16
- ## { 'method': 'autorespond', 'params': {}, ... ]
17
- field :actions, type: Array, default: []
18
-
19
- def self.create_lead params
20
- msg = params[:msg]
21
- leadset = Leadset.find_or_create_by({ company_url: msg.company_url })
22
- lead = Lead.new({
23
- email: msg.from_str,
24
- name: msg.name,
25
- leadset: leadset,
26
- })
27
- lead.save
28
- end
29
-
30
- def self.autorespond params
31
- msg = params[:msg]
32
- email_template = ::Ish::EmailTemplate.find_by!({ slug: '20230207-autorespond' })
33
- email_ctx = ::Ish::EmailContext.new({
34
- to_email: '',
35
- subject: '',
36
- from_email: '',
37
- body: '',
38
- email_template_id: email_template.id.to_s,
39
- })
40
- email_ctx.save!
41
- IshManager::OfficeMailer.send_context_email( email_ctx ).deliver_later
42
- end
43
-
44
- end
@@ -1,21 +0,0 @@
1
-
2
- # @deprecated, remove
3
- class Ish::AppModel2
4
- include ::Mongoid::Document
5
- include ::Mongoid::Timestamps
6
-
7
- field :is_public, :type => Boolean, :default => false
8
- field :is_trash, :type => Boolean, :default => false
9
-
10
- default_scope ->{ where({ :is_public => true, :is_trash => false }).order_by({ :created_at => :desc }) }
11
-
12
- field :x, :type => Float
13
- field :y, :type => Float
14
-
15
- def self.list conditions = { :is_trash => false }
16
- out = self.where( conditions ).order_by( :created_at => :desc )
17
- [['', nil]] + out.map { |item| [ "#{item.created_at.strftime('%Y%m%d')} #{item.name}", item.id ] }
18
- end
19
-
20
-
21
- end
data/lib/trash/city.rb-bk DELETED
@@ -1,100 +0,0 @@
1
- class City
2
- include ::Mongoid::Document
3
- include ::Mongoid::Timestamps
4
-
5
- field :name, :type => String
6
- field :description, :type => String, :default => 'The description of this city'
7
-
8
- field :cityname, :type => String
9
- validates :cityname, :uniqueness => true, :allow_nil => false, :presence => true
10
- def slug; cityname; end
11
- def slug= s; cityname = s; end
12
-
13
- field :x, :type => Float
14
- field :y, :type => Float
15
-
16
- field :deleted_at, type: Time
17
- def self.all
18
- self.where( deleted_at: nil, is_active: true ).order_by( name: :desc )
19
- end
20
-
21
- belongs_to :country, :optional => true
22
-
23
- has_many :events
24
- has_many :galleries
25
- has_many :photos
26
- has_many :reports
27
- has_many :venues
28
- has_many :videos
29
- has_and_belongs_to_many :tags
30
-
31
- has_many :current_users, :class_name => '::Ish::UserProfile', :inverse_of => :current_city
32
- has_many :newsitems
33
-
34
- has_many :current_users, :class_name => '::Ish::UserProfile', :inverse_of => :current_city
35
- has_one :profile_photo, :class_name => 'Photo', :inverse_of => :profile_city
36
- has_one :guide, :class_name => '::Ish::UserProfile', :inverse_of => :guide_city
37
-
38
- has_many :features
39
-
40
- field :calendar_frame, :type => String
41
- field :is_active, type: Boolean, default: true
42
-
43
- default_scope ->{ order_by({ :name => :asc }) }
44
-
45
- def self.list
46
- out = self.order_by( :name => :asc )
47
- # no_city = City.where( :cityname => 'no_city' ).first || City.create( :cityname => 'no_city', :name => 'No City' )
48
- [['', nil]] + out.map { |item| [ item.name, item.id ] }
49
- end
50
-
51
- def self.list_citynames lang = 'en'
52
- out = self.order_by( :name => :asc )
53
- [['', nil]] + out.map { |item| [ item['name_'+lang], item.cityname ] }
54
- end
55
-
56
- def self.clear
57
- if Rails.env.test?
58
- City.all.each { |r| r.remove }
59
- end
60
- end
61
-
62
- def self.n_features
63
- 4
64
- end
65
- def n_features
66
- 4
67
- end
68
-
69
-
70
- def j_reports args = {}
71
- out = []
72
- self.reports.each do |r|
73
- rr = r.clone
74
- rr[:username] = r.user.username
75
- rr.created_at = r.created_at # pretty_date( r.created_at )
76
- rr[:tag_name] = r.tag.name unless r.tag.blank?
77
- rr[:tag_name] ||= ''
78
- out << rr
79
- end
80
- return out
81
- end
82
-
83
- def self.for_homepage
84
- cities = City.all.order_by( :name => :asc )
85
- cities = cities.delete_if do |c|
86
- ( false == c.is_feature ) && ( 0 == c.galleries.length ) && ( 0 == c.reports.length )
87
- end
88
- return cities
89
- end
90
-
91
- def self.method_missing name, *args, &block
92
- city = City.where( :cityname => name ).first
93
- return city if city
94
- super
95
- end
96
-
97
- end
98
-
99
-
100
-
data/lib/trash/event.rb DELETED
@@ -1,28 +0,0 @@
1
-
2
- class Event
3
-
4
- include Mongoid::Document
5
- include Mongoid::Timestamps
6
-
7
- field :name, :type => String
8
- validates :name, :presence => true, :uniqueness => true
9
-
10
- field :eventname, :type => String
11
- validates :eventname, :presence => true, :uniqueness => true
12
-
13
- field :description, :type => String
14
-
15
- field :date, :type => DateTime
16
- validates :date, :presence => true
17
-
18
- belongs_to :city
19
- validates :city, :presence => true
20
-
21
- field :x, :type => Float
22
- field :y, :type => Float
23
-
24
- has_one :profile_photo, :class_name => 'Photo', :inverse_of => :profile_event
25
- has_many :photos
26
-
27
- end
28
-
data/lib/trash/site.rb DELETED
@@ -1,99 +0,0 @@
1
- class Site
2
-
3
- include Mongoid::Document
4
- include Mongoid::Timestamps
5
-
6
- field :domain, :type => String
7
- validates_presence_of :domain
8
-
9
- field :lang, :type => String, :default => 'en'
10
- # validates :lang, { :uniqueness => :true, :scope => :domain }
11
-
12
- field :title
13
- field :subhead
14
- field :description
15
- field :home_redirect_path
16
-
17
- field :n_features, :type => Integer, :default => 4
18
- field :n_newsitems, :type => Integer, :default => 20
19
- field :newsitems_per_page, :type => Integer, :default => 10 # this is used. _vp_ 20171025
20
- field :play_videos_in_preview, :type => Boolean, :default => true
21
-
22
- # denormalized
23
- field :n_reports, :type => Integer
24
- field :n_galleries, :type => Integer
25
-
26
- field :is_video_enabled, :type => Boolean, :default => false
27
- field :is_resume_enabled, :type => Boolean, :default => false
28
- field :is_ads_enabled, :type => Boolean, :default => true
29
- field :is_trash, :type => Boolean, :default => false
30
- field :is_primary, :type => Boolean, :default => false
31
- field :is_private, :type => Boolean, :default => false
32
- field :private_user_emails, :type => Array, :default => []
33
-
34
- field :homepage_layout, :type => String, :default => 'show'
35
- field :layout, :type => String, :default => 'application'
36
-
37
- has_many :reports
38
- has_many :galleries
39
- has_many :tags
40
- has_many :videos
41
- has_many :newsitems, :order => :created_at.desc
42
- has_many :issues, :class_name => 'Ish::Issue'
43
- has_many :features, :order => :created_at.desc
44
-
45
- default_scope ->{ where({ :is_trash => false }).order_by({ :domain => :asc, :lang => :asc }) }
46
-
47
- set_callback :create, :before do |doc|
48
- if Site.where( :lang => doc.lang, :domain => doc.domain ).length > 0
49
- false
50
- end
51
- end
52
-
53
- set_callback :update, :before do |doc|
54
- possible_duplicate = Site.where( :lang => doc.lang, :domain => doc.domain ).first
55
- if possible_duplicate.blank?
56
- true
57
- elsif doc.id != possible_duplicate.id
58
- false
59
- end
60
- end
61
-
62
- LANGUAGES = [ 'en', 'ru', 'pt' ]
63
-
64
- # manager uses it.
65
- def self.list
66
- out = self.all.order_by( :domain => :asc, :lang => :asc )
67
- [['Select Site', nil]] + out.map { |item| [ "#{item.domain} #{item.lang}", item.id ] }
68
- end
69
-
70
- def self.mobi
71
- Site.where( :domain => 'travel-guide.mobi', :lang => 'en' ).first
72
- end
73
-
74
- def n_reports
75
- self.reports.unscoped.where( :is_trash => false ).length
76
- end
77
-
78
- def n_private_reports
79
- self.reports.unscoped.where( :is_public => false, :is_trash => false ).length
80
- end
81
-
82
- def its_locales
83
- Site.where( :domain => self.domain ).map { |s| s.lang.to_sym }
84
- end
85
-
86
- def self.Tgm
87
- Site.find_by( :domain => 'travel-guide.mobi', :lang => :en )
88
- end
89
- def self.sedux
90
- site = Site.where( :domain => 'sedux.local' ).first
91
- site ||= Site.where( :domain => 'sedux.net' ).first
92
- site
93
- end
94
-
95
- def name
96
- "#{domain}/#{lang}"
97
- end
98
-
99
- end
@@ -1,73 +0,0 @@
1
- class TagTrash
2
- include Mongoid::Document
3
- include Mongoid::Timestamps
4
- include Ish::Utils
5
-
6
- field :name, :type => String
7
- validates :name, uniqueness: true, presence: true, allow_nil: false # @TODO: tags should only be unique globally, and per-user.
8
-
9
- field :slug
10
- validates :slug, uniqueness: true, presence: true, allow_nil: false
11
-
12
- field :descr, :type => String, :default => ''
13
-
14
- field :is_public, :type => Boolean, :default => true
15
- field :is_trash, :type => Boolean, :default => false
16
- field :is_feature, :type => Boolean, :default => false
17
-
18
- field :weight, :type => Integer, :default => 10
19
-
20
- has_many :children_tags, :class_name => 'Tag', :inverse_of => :parent_tag
21
- belongs_to :parent_tag, :class_name => 'Tag', :inverse_of => :children_tags, :optional => true
22
-
23
- has_many :features
24
- has_many :newsitems
25
-
26
- belongs_to :site, :optional => true
27
- belongs_to :city, :optional => true
28
-
29
- has_and_belongs_to_many :venues
30
- has_and_belongs_to_many :cities
31
- has_and_belongs_to_many :galleries
32
- has_and_belongs_to_many :reports
33
- has_and_belongs_to_many :videos
34
- has_and_belongs_to_many :maps, class_name: 'Gameui::Map'
35
-
36
- before_validation :set_slug
37
-
38
- def self.clear
39
- if Rails.env.test?
40
- Tag.each { |r| r.remove }
41
- end
42
- end
43
-
44
- def self.no_parent
45
- Tag.where( :parent_tag_id => nil )
46
- end
47
-
48
- # the first blank used to be disabled, not anymore _vp_ 20180418
49
- def self.list
50
- out = Tag.unscoped.order_by( :name => :asc )
51
- return( [['', nil]] + out.map { |item| [ item.name, item.id ] } )
52
- end
53
-
54
- # @deprecated, there will be no reports or galleries in tags. There will be only features and newsitems
55
- def self.n_items
56
- 10
57
- end
58
- def self.n_reports
59
- 4
60
- end
61
- def self.n_galleries
62
- 4
63
- end
64
- def self.n_videos
65
- 4
66
- end
67
-
68
- def self.n_features
69
- 4
70
- end
71
- field :n_features, type: Integer, default: 4
72
-
73
- end
data/lib/trash/venue.rb DELETED
@@ -1,77 +0,0 @@
1
- class Venue
2
- include ::Mongoid::Document
3
- include ::Mongoid::Timestamps
4
- include Ish::Utils
5
-
6
- field :address
7
-
8
- field :name, :type => String
9
- validates :name, :uniqueness => true, :allow_nil => false
10
-
11
- field :slug
12
- validates :slug, :uniqueness => true, :allow_nil => false
13
- before_validation :set_slug
14
-
15
- field :subhead
16
- field :descr
17
-
18
- field :is_trash, :type => Boolean, :default => false
19
- scope :fresh, ->{ where({ :is_trash => false }) }
20
- scope :trash, ->{ where({ :is_trash => true }) }
21
-
22
- field :is_public, :type => Boolean, :default => true
23
- scope :public, ->{ where({ :is_public => true }) }
24
- scope :not_public, ->{ where({ :is_public => false }) }
25
-
26
- field :is_feature, :type => Boolean, :default => false
27
-
28
- field :x, :type => Float
29
- field :y, :type => Float
30
-
31
- field :lang, :type => String, :default => 'en'
32
-
33
- belongs_to :city
34
- # belongs_to :owner, :class_name => 'User', :inverse_of => :owned_venue
35
- validates :city, :allow_nil => false, :presence => true
36
-
37
- has_and_belongs_to_many :tags
38
-
39
- has_and_belongs_to_many :users
40
-
41
- has_one :profile_photo, :class_name => 'Photo', :inverse_of => :profile_venue
42
-
43
- has_many :reports
44
- has_many :galleries
45
- has_many :photos
46
- has_many :newsitems
47
- has_many :features
48
-
49
- PER_PAGE = 6
50
-
51
- def self.list conditions = { :is_trash => false }
52
- out = self.where( conditions).order_by( :name => :asc )
53
- [['', nil]] + out.map { |item| [ item.name, item.id ] }
54
- end
55
-
56
-
57
-
58
- set_callback :save, :before do |doc|
59
- if doc.city
60
- city.touch
61
- end
62
- end
63
-
64
- def self.types
65
- return []
66
- # if 'en' == @locale
67
- # [ 'Hotels', 'Restaurants', 'Bars' ]
68
- # else
69
- # [ 'Hotels', 'Restaurants', 'Bars' ]
70
- # end
71
- end
72
-
73
- def self.n_features
74
- 6
75
- end
76
-
77
- end