digital_heroes_startkit 0.1.1

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 (189) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +37 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/config/digital_heroes_startkit_manifest.js +0 -0
  6. data/app/assets/javascripts/authorization.coffee +79 -0
  7. data/app/assets/javascripts/avatar.coffee +16 -0
  8. data/app/assets/javascripts/datepicker.js +2 -0
  9. data/app/assets/javascripts/digital_heroes_startkit/cable.js +13 -0
  10. data/app/assets/javascripts/digital_heroes_startkit/channels/pills.coffee +23 -0
  11. data/app/assets/javascripts/digital_heroes_startkit/input.coffee +5 -0
  12. data/app/assets/javascripts/digital_heroes_startkit/pills.coffee +2 -0
  13. data/app/assets/javascripts/digital_heroes_startkit/snap.svg-min.js +21 -0
  14. data/app/assets/javascripts/digital_heroes_startkit.js +26 -0
  15. data/app/assets/javascripts/profile.coffee +53 -0
  16. data/app/assets/javascripts/profile_geodata.coffee +68 -0
  17. data/app/assets/javascripts/reg_fields_checkup.coffee +96 -0
  18. data/app/assets/javascripts/registration.coffee +35 -0
  19. data/app/assets/javascripts/resurrection.coffee +20 -0
  20. data/app/channels/application_cable/channel.rb +4 -0
  21. data/app/channels/application_cable/connection.rb +4 -0
  22. data/app/channels/pills_channel.rb +10 -0
  23. data/app/controllers/avatars_controller.rb +11 -0
  24. data/app/controllers/clients_controller.rb +62 -0
  25. data/app/controllers/email_access_cards_controller.rb +28 -0
  26. data/app/controllers/geodata_controller.rb +84 -0
  27. data/app/controllers/nickname_access_cards_controller.rb +30 -0
  28. data/app/controllers/oauth_controller.rb +178 -0
  29. data/app/controllers/openid_controller.rb +124 -0
  30. data/app/controllers/phone_access_cards_controller.rb +28 -0
  31. data/app/controllers/profile_controller.rb +114 -0
  32. data/app/controllers/response_controller.rb +17 -0
  33. data/app/controllers/start_kit_controller.rb +86 -0
  34. data/app/controllers/user_cards_controller.rb +305 -0
  35. data/app/jobs/log_analyzer_job.rb +50 -0
  36. data/app/jobs/password_resurrection_kill_job.rb +9 -0
  37. data/app/mailers/admin_mailer.rb +9 -0
  38. data/app/mailers/client_mailer.rb +3 -0
  39. data/app/mailers/kreator_mailer.rb +9 -0
  40. data/app/mailers/manager_mailer.rb +9 -0
  41. data/app/mailers/prometeus_mailer.rb +16 -0
  42. data/app/mailers/user_cards_mailer.rb +9 -0
  43. data/app/models/admin.rb +3 -0
  44. data/app/models/avatar.rb +23 -0
  45. data/app/models/city.rb +7 -0
  46. data/app/models/client.rb +31 -0
  47. data/app/models/country.rb +7 -0
  48. data/app/models/delayed_job.rb +20 -0
  49. data/app/models/email_access_card.rb +30 -0
  50. data/app/models/kreator.rb +3 -0
  51. data/app/models/log_error.rb +56 -0
  52. data/app/models/log_error_type.rb +3 -0
  53. data/app/models/manager.rb +3 -0
  54. data/app/models/nickname_access_card.rb +18 -0
  55. data/app/models/oauth_access_card.rb +38 -0
  56. data/app/models/phone_access_card.rb +19 -0
  57. data/app/models/prometeus.rb +50 -0
  58. data/app/models/user_card.rb +158 -0
  59. data/app/views/admin_mailer/greetings_email.html.erb +191 -0
  60. data/app/views/client_mailer/greetings_email.html.erb +191 -0
  61. data/app/views/kreator_mailer/greetings_email.html.erb +191 -0
  62. data/app/views/manager_mailer/greetings_email.html.erb +191 -0
  63. data/app/views/oauth/verify.slim +1 -0
  64. data/app/views/profile/_add_avatar.slim +12 -0
  65. data/app/views/profile/_user_profile.slim +95 -0
  66. data/app/views/profile/index.slim +12 -0
  67. data/app/views/user_cards/authorization.slim +72 -0
  68. data/app/views/user_cards/confirmation_but_access_code.slim +7 -0
  69. data/app/views/user_cards/confirmation_complete.slim +7 -0
  70. data/app/views/user_cards/registration.slim +86 -0
  71. data/app/views/user_cards/resurrection.slim +19 -0
  72. data/app/views/user_cards/resurrection_but_access_code.slim +7 -0
  73. data/app/views/user_cards/resurrection_no_access_code.slim +7 -0
  74. data/app/views/user_cards_mailer/email.html.erb +191 -0
  75. data/app/views/user_cards_mailer/resurrection.html.erb +191 -0
  76. data/config/initializers/session_manager.rb +2 -0
  77. data/config/routes.rb +53 -0
  78. data/lib/access_control.rb +3 -0
  79. data/lib/digital_heroes_startkit/engine.rb +25 -0
  80. data/lib/digital_heroes_startkit/version.rb +3 -0
  81. data/lib/digital_heroes_startkit.rb +5 -0
  82. data/lib/generators/digital_heroes_startkit/install_generator.rb +61 -0
  83. data/lib/generators/project/Capfile +36 -0
  84. data/lib/generators/project/Procfile +3 -0
  85. data/lib/generators/project/app/assets/stylesheets/application.scss +16 -0
  86. data/lib/generators/project/app/assets/stylesheets/base/_auth.scss +37 -0
  87. data/lib/generators/project/app/assets/stylesheets/base/_buttons.scss +62 -0
  88. data/lib/generators/project/app/assets/stylesheets/base/_checkbox.scss +71 -0
  89. data/lib/generators/project/app/assets/stylesheets/base/_datepicker.scss +620 -0
  90. data/lib/generators/project/app/assets/stylesheets/base/_form.scss +81 -0
  91. data/lib/generators/project/app/assets/stylesheets/base/_notice.scss +14 -0
  92. data/lib/generators/project/app/assets/stylesheets/base/_pills.scss +39 -0
  93. data/lib/generators/project/app/assets/stylesheets/base/_profile.scss +67 -0
  94. data/lib/generators/project/app/assets/stylesheets/base/_reset.scss +49 -0
  95. data/lib/generators/project/app/assets/stylesheets/base/_social.scss +52 -0
  96. data/lib/generators/project/app/assets/stylesheets/base/_user.scss +0 -0
  97. data/lib/generators/project/app/assets/stylesheets/base/_user_avatar.scss +18 -0
  98. data/lib/generators/project/app/assets/stylesheets/base/styles.scss.txt +35 -0
  99. data/lib/generators/project/app/assets/stylesheets/plugins/sumoselect.scss +296 -0
  100. data/lib/generators/project/app/controllers/application_controller.rb +3 -0
  101. data/lib/generators/project/app/views/layouts/_counts.html.erb +29 -0
  102. data/lib/generators/project/app/views/layouts/_footer.slim +6 -0
  103. data/lib/generators/project/app/views/layouts/_head.slim +7 -0
  104. data/lib/generators/project/app/views/layouts/_header.slim +47 -0
  105. data/lib/generators/project/app/views/layouts/_mobile_menu.slim +11 -0
  106. data/lib/generators/project/app/views/layouts/application.slim +26 -0
  107. data/lib/generators/project/app/views/layouts/mailer.html.erb +13 -0
  108. data/lib/generators/project/app/views/layouts/mailer.text.erb +1 -0
  109. data/lib/generators/project/config/application.access.yml +66 -0
  110. data/lib/generators/project/config/application.db.yml +5 -0
  111. data/lib/generators/project/config/application.google.yml +3 -0
  112. data/lib/generators/project/config/application.oauth.yml +135 -0
  113. data/lib/generators/project/config/application.robokassa.yml +10 -0
  114. data/lib/generators/project/config/application.sendgrid.yml +3 -0
  115. data/lib/generators/project/config/application.telegram.yml +22 -0
  116. data/lib/generators/project/config/application.yml +28 -0
  117. data/lib/generators/project/config/cable.yml +6 -0
  118. data/lib/generators/project/config/capistrano.yml +78 -0
  119. data/lib/generators/project/config/database.yml +52 -0
  120. data/lib/generators/project/config/deploy/application.secrets.yml +4 -0
  121. data/lib/generators/project/config/deploy/domain.crt +92 -0
  122. data/lib/generators/project/config/deploy/domain.key +51 -0
  123. data/lib/generators/project/config/deploy/nginx.conf +50 -0
  124. data/lib/generators/project/config/deploy/production.rb +67 -0
  125. data/lib/generators/project/config/deploy/secrets.yml +32 -0
  126. data/lib/generators/project/config/deploy/secrets.yml.enc +1 -0
  127. data/lib/generators/project/config/deploy/secrets.yml.key +1 -0
  128. data/lib/generators/project/config/deploy/staging.rb +61 -0
  129. data/lib/generators/project/config/deploy/virgin_conf/database.yml +42 -0
  130. data/lib/generators/project/config/deploy/virgin_conf/nginx_site.conf +47 -0
  131. data/lib/generators/project/config/deploy/virgin_conf/nginx_site_ssl.conf +57 -0
  132. data/lib/generators/project/config/deploy/virgin_conf/postfix.cf +685 -0
  133. data/lib/generators/project/config/deploy/virgin_conf/production.rb +67 -0
  134. data/lib/generators/project/config/deploy/virgin_conf/puma.rb +66 -0
  135. data/lib/generators/project/config/deploy/virgin_sh/capistrano.sh +18 -0
  136. data/lib/generators/project/config/deploy/virgin_sh/foreman.sh +19 -0
  137. data/lib/generators/project/config/deploy/virgin_sh/rvm_install.sh +10 -0
  138. data/lib/generators/project/config/deploy.rb +377 -0
  139. data/lib/generators/project/config/environments/development.rb +91 -0
  140. data/lib/generators/project/config/environments/production.rb +142 -0
  141. data/lib/generators/project/config/initializers/session_store.rb +3 -0
  142. data/lib/generators/project/config/locales/ru.yml +444 -0
  143. data/lib/generators/project/db/migrate/10_create_user_cards.rb +19 -0
  144. data/lib/generators/project/db/migrate/12_create_email_access_cards.rb +15 -0
  145. data/lib/generators/project/db/migrate/13_create_nickname_access_cards.rb +15 -0
  146. data/lib/generators/project/db/migrate/14_create_phone_access_cards.rb +16 -0
  147. data/lib/generators/project/db/migrate/15_create_oauth_access_cards.rb +19 -0
  148. data/lib/generators/project/db/migrate/1_create_kreators.rb +9 -0
  149. data/lib/generators/project/db/migrate/21_create_avatars.rb +12 -0
  150. data/lib/generators/project/db/migrate/30_create_countries.rb +12 -0
  151. data/lib/generators/project/db/migrate/32_create_cities.rb +12 -0
  152. data/lib/generators/project/db/migrate/3_create_admins.rb +9 -0
  153. data/lib/generators/project/db/migrate/44_add_sessions_table.rb +12 -0
  154. data/lib/generators/project/db/migrate/4_create_managers.rb +10 -0
  155. data/lib/generators/project/db/migrate/5_create_clients.rb +17 -0
  156. data/lib/generators/project/db/migrate/60_create_log_error_types.rb +9 -0
  157. data/lib/generators/project/db/migrate/61_create_log_errors.rb +12 -0
  158. data/lib/generators/project/db/migrate/78_create_delayed_jobs.rb +22 -0
  159. data/lib/generators/project/db/seeds.rb +27 -0
  160. data/lib/generators/project/geodata/cities.csv +25305 -0
  161. data/lib/generators/project/geodata/countries.csv +250 -0
  162. data/lib/generators/project/public/401.html +75 -0
  163. data/lib/generators/project/public/404.html +67 -0
  164. data/lib/generators/project/public/422.html +67 -0
  165. data/lib/generators/project/public/500.html +66 -0
  166. data/lib/generators/project/public/_receiver.html +10 -0
  167. data/lib/generators/project/public/apple-touch-icon-precomposed.png +0 -0
  168. data/lib/generators/project/public/apple-touch-icon.png +0 -0
  169. data/lib/generators/project/public/favicon.ico +0 -0
  170. data/lib/generators/project/public/robots.txt +1 -0
  171. data/lib/happy_birthday.rb +5 -0
  172. data/lib/link.rb +16 -0
  173. data/lib/oauth/oauth.rb +72 -0
  174. data/lib/oauth/oauth_fb.rb +48 -0
  175. data/lib/oauth/oauth_gg.rb +50 -0
  176. data/lib/oauth/oauth_im.rb +51 -0
  177. data/lib/oauth/oauth_mr.rb +53 -0
  178. data/lib/oauth/oauth_vk.rb +3 -0
  179. data/lib/oauth/oauth_yx.rb +51 -0
  180. data/lib/openid/openid.rb +46 -0
  181. data/lib/openid/openid_st.rb +2 -0
  182. data/lib/phone_cutter.rb +9 -0
  183. data/lib/response.rb +51 -0
  184. data/lib/session_manager.rb +47 -0
  185. data/lib/sms_lib.rb +30 -0
  186. data/lib/social_networks.rb +328 -0
  187. data/lib/tasks/digital_heroes_startkit_tasks.rake +83 -0
  188. data/lib/telegram.rb +33 -0
  189. metadata +497 -0
@@ -0,0 +1,38 @@
1
+ class OauthAccessCard < ApplicationRecord
2
+
3
+ belongs_to :user_card
4
+
5
+ after_create :download_avatar
6
+ after_update :check_card_avatar
7
+
8
+ def check_card_avatar
9
+ # при смене авы в соцсети
10
+ if saved_change_to_attribute?(:photourl)
11
+ download_avatar
12
+ end
13
+ # при переносе соц.скрепы на другого юзера(мутация ролей) переставление ему авы
14
+ if saved_change_to_attribute?(:user_card_id)
15
+ self.user_card.set_active_card
16
+ download_avatar
17
+ end
18
+ end
19
+
20
+ # аватару юзеру после создания соц.скрепы
21
+ def download_avatar
22
+ begin
23
+ if self.photourl.present?
24
+ image_url = self.photourl
25
+ f = open(image_url)
26
+ file = Tempfile.new [File.basename(URI.unescape image_url), '.jpg']
27
+ file.binmode
28
+ file.write f.read
29
+ file.rewind
30
+ self.user_card.userable.create_avatar(uploaded_file: file)
31
+ file.close
32
+ file.unlink
33
+ end
34
+ rescue
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,19 @@
1
+ class PhoneAccessCard < ApplicationRecord
2
+ belongs_to :user_card
3
+
4
+ # after_destroy :check_active
5
+
6
+ before_validation :phone_normalize
7
+
8
+ validates :value, presence: true, uniqueness: true, :allow_blank => false
9
+ validates :value, :length => {:minimum => 10, :message => 'шорты'}
10
+
11
+ def check_active
12
+ self.user_card.set_active_card
13
+ end
14
+
15
+ def phone_normalize
16
+ self.value = self.value.to_s.phone_cutter unless self.value.nil?
17
+ end
18
+
19
+ end
@@ -0,0 +1,50 @@
1
+ class Prometeus < ApplicationRecord
2
+
3
+ self.abstract_class = true
4
+
5
+ has_one :user_card, as: :userable, dependent: :destroy
6
+ has_one :avatar, as: :imageable, dependent: :destroy
7
+
8
+ after_create :add_user_card
9
+
10
+ validates :name, :length => {:maximum => 64, :message => 'максимальная длина имени 64 символа'}
11
+
12
+ scope :not_me, -> (user_card_id) {joins(:user_card).where.not('user_cards.id = ?', user_card_id)}
13
+
14
+ def add_user_card
15
+ self.create_user_card({password: 'mussypussy', access_level: self.class.name.underscore})
16
+ end
17
+
18
+ def my_nicknames
19
+ self.user_card.my_nicknames
20
+ end
21
+
22
+ def my_nickname
23
+ self.user_card.my_nickname
24
+ end
25
+
26
+ def my_emails
27
+ self.user_card.my_emails
28
+ end
29
+
30
+ def my_email
31
+ self.user_card.my_email
32
+ end
33
+
34
+ def my_phones
35
+ self.user_card.my_phones
36
+ end
37
+
38
+ def my_phone
39
+ self.user_card.my_phone
40
+ end
41
+
42
+ def whoami
43
+ self.class.name.underscore
44
+ end
45
+
46
+ def isi _alias
47
+ self.whoami == _alias
48
+ end
49
+
50
+ end
@@ -0,0 +1,158 @@
1
+ class UserCard < ApplicationRecord
2
+
3
+ belongs_to :userable, polymorphic: true
4
+
5
+ has_secure_password
6
+
7
+ has_many :email_access_cards, dependent: :destroy
8
+ has_many :phone_access_cards, dependent: :destroy
9
+ has_many :nickname_access_cards, dependent: :destroy
10
+ has_many :oauth_access_cards, dependent: :destroy
11
+
12
+ accepts_nested_attributes_for :nickname_access_cards, allow_destroy: true
13
+ accepts_nested_attributes_for :email_access_cards, allow_destroy: true
14
+ accepts_nested_attributes_for :phone_access_cards, allow_destroy: true
15
+ accepts_nested_attributes_for :oauth_access_cards, allow_destroy: true
16
+
17
+ after_update :online_status_broadcast
18
+
19
+ before_validation :normalize
20
+
21
+ validates :password, presence: true, format: {with: /.{8,}/i}, :allow_blank => true
22
+
23
+ scope :active, -> { where(status: 1) }
24
+ scope :passive, -> { where(status: 0) }
25
+ scope :banned, -> { where(status: 2) }
26
+
27
+ def active?
28
+ self.status == 1
29
+ end
30
+
31
+ def passive?
32
+ self.status == 0
33
+ end
34
+
35
+ def banned?
36
+ self.status == 2
37
+ end
38
+
39
+ def client?
40
+ self.access_level == 'client'
41
+ end
42
+ # подтвердить
43
+ def confirm
44
+ self.update(status: 1)
45
+ end
46
+ # приготовить код
47
+ def confirm_access_code
48
+ require 'link'
49
+ l = Link.new self.id
50
+ pepper_email = Digest::MD5.new.update("#{CONFIG[:salt]} #{l.get} и #{self.my_email} добавим #{CONFIG[:pepper]}!").to_s
51
+ "DIGITAL(.)(.)HEROES#{pepper_email}" #nice one рецепт от Николая Мартынова .)
52
+ end
53
+ # забанить
54
+ def ban!
55
+ self.update(status: 2)
56
+ end
57
+
58
+ def authorize! access_card
59
+ # пользователь онлайн
60
+ access_card.update(active: true)
61
+ # такое вот решение из-за невозможности актив рекорда за 1 раз поработать с одной моделью дважды
62
+ CONFIG[:access_cards].each do |type, max|
63
+ if "#{type}AccessCard".classify != access_card.class.name
64
+ "#{type}AccessCard".classify.constantize.where(user_card_id: self.id).update(active: false)
65
+ else
66
+ "#{type}AccessCard".classify.constantize.where(user_card_id: self.id).where.not(id: access_card.id).update(active: false)
67
+ end
68
+ end
69
+
70
+ $session_manager.authorize! self.id
71
+
72
+ self.update({online: true})
73
+ end
74
+
75
+ def normalize
76
+ self.password.strip! unless self.password.nil?
77
+ end
78
+
79
+ def my_active_card
80
+ self.email_access_cards.find_by(active: true) || self.phone_access_cards.find_by(active: true) || self.nickname_access_cards.find_by(active: true) || self.oauth_access_cards.find_by(active: true) || false
81
+ end
82
+
83
+ def access_cards
84
+ [{cards: self.email_access_cards, classname: 'EmailAccessCard'},
85
+ {cards: self.nickname_access_cards, classname: 'NicknameAccessCard'},
86
+ {cards: self.phone_access_cards, classname: 'PhoneAccessCard'},
87
+ {cards: self.oauth_access_cards, classname: 'OAuthAccessCard'},
88
+ ]
89
+ end
90
+
91
+ def access_cards_count
92
+ self.email_access_cards.count + self.phone_access_cards.count + self.nickname_access_cards.count + self.oauth_access_cards.count
93
+ end
94
+
95
+ def set_active_card
96
+ unless my_active_card
97
+ if self.nickname_access_cards.any?
98
+ self.nickname_access_cards.first.update(active: true)
99
+ elsif self.email_access_cards.any?
100
+ self.email_access_cards.first.update(active: true)
101
+ elsif self.phone_access_cards.any?
102
+ self.phone_access_cards.first.update(active: true)
103
+ elsif self.oauth_access_cards.any?
104
+ self.oauth_access_cards.first.update(active: true)
105
+ end
106
+ end
107
+ end
108
+
109
+ def online_status_broadcast
110
+ # ActionCable.server.broadcast "radioJXL", {event: 'online_status', uid: self.userable.id, online: self.online, name: self.my_name} if saved_change_to_attribute?(:online)
111
+ end
112
+
113
+ def my_name
114
+ active_card = self.my_active_card
115
+ if (/Oauth/ =~ active_card.class.name).present?
116
+ "#{active_card.firstname} #{active_card.lastname}"
117
+ else
118
+ active_card.value
119
+ end
120
+ end
121
+
122
+ def self.access_cards_placeholder
123
+ CONFIG[:access_by].map{|cardname, garbage| (I18n.t cardname, scope: 'access_cards')}.join(',')
124
+ end
125
+
126
+ def my_nicknames
127
+ self.nickname_access_cards.pluck(:value)
128
+ end
129
+
130
+ def my_nickname
131
+ my_nicknames.first
132
+ end
133
+
134
+ def my_emails
135
+ self.email_access_cards.pluck(:value)
136
+ end
137
+
138
+ def my_email
139
+ my_emails.first
140
+ end
141
+
142
+ def my_phones
143
+ self.phone_access_cards.pluck(:value)
144
+ end
145
+
146
+ def my_phone
147
+ my_phones.first
148
+ end
149
+
150
+ def whois
151
+ self.userable.whoami
152
+ end
153
+
154
+ def check_access_level _alias
155
+ CONFIG[:access_aliases][self.access_level.to_sym] >= CONFIG[:access_aliases][_alias]
156
+ end
157
+
158
+ end
@@ -0,0 +1,191 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html style="width:100%;font-family:arial, 'helvetica neue', helvetica, sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;padding:0;Margin:0;">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta content="width=device-width, initial-scale=1" name="viewport">
6
+ <meta name="x-apple-disable-message-reformatting">
7
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
8
+ <meta content="telephone=no" name="format-detection">
9
+ <title></title>
10
+ <!--[if (mso 16)]>
11
+ <style type="text/css">
12
+ a {text-decoration: none;}
13
+ </style>
14
+ <![endif]-->
15
+ <!--[if gte mso 9]><style>sup { font-size: 100% !important; }</style><![endif]-->
16
+ <style>
17
+ @media only screen and (max-width: 600px) {p, ul li, ol li, a { font-size: 16px } h1 { font-size: 30px; text-align: center } h2 { font-size: 26px; text-align: center } h3 { font-size: 20px; text-align: center } h1 a { font-size: 30px } h2 a { font-size: 26px } h3 a { font-size: 20px } .es-menu td a { font-size: 16px !important } .es-header-body p, .es-header-body ul li, .es-header-body ol li, .es-header-body a { font-size: 16px } .es-footer-body p, .es-footer-body ul li, .es-footer-body ol li, .es-footer-body a { font-size: 16 px } .es-infoblock p, .es-infoblock ul li, .es-infoblock ol li, .es-infoblock a { font-size: 12px } *[class="gmail-fix"] { display: none !important } .es-m-txt-c, .es-m-txt-c h1, .es-m-txt-c h2, .es-m-txt-c h3 { text-align: center !important } .es-m-txt-r, .es-m-txt-r h1, .es-m-txt-r h2, .es-m-txt-r h3 { text-align: right !important } .es-m-txt-l, .es-m-txt-l h1, .es-m-txt-l h2, .es-m-txt-l h3 { text-align: left !important } .es-m-txt-r a img, .es-m-txt-c a img, .es-m-txt-l a img { display: inline !important } .es-button-border { display: block !important } .es-button { font-size: 20px !important; display: block !important; border-width: 10px 0px 10px 0px !important } .es-btn-fw { border-width: 10px 0px !important; text-align: center !important } .es-adaptive table, .es-btn-fw, .es-btn-fw-brdr, .es-left, .es-right { width: 100% !important } .es-content table, .es-header table, .es-footer table, .es-content, .es-footer, .es-header { width: 100% !important; max-width: 600px !important } .es-adapt-td { display: block !important; width: 100% !important } .adapt-img { width: 100% !important; height: auto !important } .es-m-p0 { padding: 0px !important } .es-m-p0r { padding-right: 0px !important } .es-m-p0l { padding-left: 0px !important } .es-m-p0t { padding-top: 0px !important } .es-m-p0b { padding-bottom: 0 !important } .es-m-p20b { padding-bottom: 20px !important } .es-hidden { display: none !important } table.es-table-not-adapt, .esd-block-html table { width: auto !important } table.es-social { display: inline-block !important } table.es-social td { display: inline-block !important } }
18
+
19
+ </style>
20
+ <style>
21
+ #outlook a { padding: 0; } .ExternalClass { width: 100%; } .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div { line-height: 100%; } .es-button { mso-style-priority: 100 !important; text-decoration: none !important; } a[x-apple-data-detectors] { color: inherit !important; text-decoration: none !important; font-size: inherit !important; font-family: inherit !important; font-weight: inherit !important; line-height: inherit !important; } @-ms-viewport { width: device-width; }
22
+ </style>
23
+ </head>
24
+ <body style="width:100%;font-family:arial, 'helvetica neue', helvetica, sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;padding:0;Margin:0;">
25
+ <div class="es-wrapper-color" style="background-color:rgb(246, 246, 246);">
26
+ <!--[if gte mso 9]>
27
+ <v:background xmlns:v="urn:schemas-microsoft-com:vml" fill="t">
28
+ <v:fill type="tile" src="" color="#f6f6f6"></v:fill>
29
+ </v:background>
30
+ <![endif]-->
31
+ <table cellpadding="0" cellspacing="0" class="es-wrapper" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;padding:0;Margin:0;width:100%;height:100%;background-repeat:repeat;background-position:center top;">
32
+ <tbody>
33
+ <tr style="border-collapse:collapse;">
34
+ <td valign="top" style="padding:0;Margin:0;">
35
+ <table cellpadding="0" cellspacing="0" class="es-content" align="center" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;table-layout:fixed !important;width:100%;">
36
+ <tbody>
37
+ <tr style="border-collapse:collapse;">
38
+ <td align="center" style="padding:0;Margin:0;">
39
+ <table class="es-content-body" align="center" cellpadding="0" cellspacing="0" width="600" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;background-color:transparent;">
40
+ <tbody>
41
+ <tr style="border-collapse:collapse;">
42
+ <td class="es-p20t es-p20b es-p20r es-p20l" align="left" style="Margin:0;padding-top:20px;padding-bottom:20px;padding-left:20px;padding-right:20px;">
43
+ <!--[if mso]><table width="560" cellpadding="0" cellspacing="0"><tr><td width="356" valign="top"><![endif]-->
44
+ <table cellpadding="0" cellspacing="0" class="es-left" align="left" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;float:left;">
45
+ <tbody>
46
+ <tr style="border-collapse:collapse;">
47
+ <td width="356" class="es-m-p0r es-m-p20b" valign="top" align="center" style="padding:0;Margin:0;">
48
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
49
+ <tbody>
50
+ <tr style="border-collapse:collapse;">
51
+ <td align="left" class="es-infoblock es-m-txt-c" style="padding:0;Margin:0;line-height:120%;font-size:12px;color:rgb(204, 204, 204);"> <p style="Margin:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-size:24px;font-family:arial, 'helvetica neue', helvetica, sans-serif;line-height:120%;color:rgb(204, 204, 204);"> <%= @domain %> </p></td>
52
+ </tr>
53
+ </tbody>
54
+ </table> </td>
55
+ </tr>
56
+ </tbody>
57
+ </table>
58
+ <!--[if mso]></td><td width="20"></td><td width="184" valign="top"><![endif]-->
59
+ <table cellpadding="0" cellspacing="0" align="right" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
60
+ <tbody>
61
+ <tr style="border-collapse:collapse;">
62
+ <td width="184" align="left" style="padding:0;Margin:0;">
63
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
64
+ <tbody>
65
+ <tr style="border-collapse:collapse;">
66
+ <td align="center" style="padding:0;Margin:0;display:none;"></td>
67
+ </tr>
68
+ </tbody>
69
+ </table> </td>
70
+ </tr>
71
+ </tbody>
72
+ </table>
73
+ <!--[if mso]></td></tr></table><![endif]--> </td>
74
+ </tr>
75
+ </tbody>
76
+ </table> </td>
77
+ </tr>
78
+ </tbody>
79
+ </table>
80
+ <table cellpadding="0" cellspacing="0" class="es-content" align="center" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;table-layout:fixed !important;width:100%;">
81
+ <tbody>
82
+ <tr style="border-collapse:collapse;">
83
+ <td align="center" style="padding:0;Margin:0;">
84
+ <table bgcolor="#ffffff" class="es-content-body" align="center" cellpadding="0" cellspacing="0" width="600" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;background-color:rgb(255, 255, 255);">
85
+ <tbody>
86
+ <tr style="border-collapse:collapse;">
87
+ <td class="es-p40t es-p20b es-p40r es-p40l" align="left" style="Margin:0;padding-bottom:20px;padding-top:40px;padding-left:40px;padding-right:40px;">
88
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
89
+ <tbody>
90
+ <tr style="border-collapse:collapse;">
91
+ <td width="520" align="center" valign="top" style="padding:0;Margin:0;">
92
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
93
+ <tbody>
94
+ <tr style="border-collapse:collapse;">
95
+ <td align="left" class="es-p15t es-p15b" style="padding:0;Margin:0;padding-top:15px;padding-bottom:15px;"><h2 style="Margin:0;line-height:120%;mso-line-height-rule:exactly;font-family:arial, 'helvetica neue', helvetica, sans-serif;font-size:24px;font-style:normal;font-weight:normal;color:rgb(51, 51, 51);"><%= @title %></h2></td>
96
+ </tr>
97
+ <tr style="border-collapse:collapse;">
98
+ <td align="left" class="es-p20t" style="padding:0;Margin:0;padding-top:20px;"><p style="Margin:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-size:14px;font-family:arial, 'helvetica neue', helvetica, sans-serif;line-height:150%;color:rgb(51, 51, 51);"> <%= @text1 %> </p></td>
99
+ </tr>
100
+ <tr style="border-collapse:collapse;">
101
+ <td align="left" class="es-p15t" style="padding:0;Margin:0;padding-top:15px;"><p style="Margin:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-size:14px;font-family:arial, 'helvetica neue', helvetica, sans-serif;line-height:150%;color:rgb(51, 51, 51);"> <%= @text2 %> </p></td>
102
+ </tr>
103
+ <tr style="border-collapse:collapse;">
104
+ <td align="center" class="es-p30t es-p15b es-p10r es-p10l" style="Margin:0;padding-left:10px;padding-right:10px;padding-bottom:15px;padding-top:30px;"> <span class="es-button-border" style="border-style:solid;border-color:rgb(44, 181, 67);background:rgb(219, 55, 39);border-width:0px 0px 2px 0px;display:inline-block;border-radius:4px;width:auto;border-bottom-width:0px;"> <a href="<%= @link %>" class="es-button" target="_blank" style="mso-style-priority:100 !important;text-decoration:none !important;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-family:arial, 'helvetica neue', helvetica, sans-serif;font-size:14px;color:rgb(255, 255, 255);border-style:solid;border-color:rgb(219, 55, 39);border-width:15px 25px;display:inline-block;background:rgb(219, 55, 39);border-radius:4px;font-weight:normal;font-style:normal;line-height:120%;width:auto;text-align:center;"> <%= @button_text %> </a> </span> </td>
105
+ </tr>
106
+ </tbody>
107
+ </table> </td>
108
+ </tr>
109
+ </tbody>
110
+ </table> </td>
111
+ </tr>
112
+ </tbody>
113
+ </table> </td>
114
+ </tr>
115
+ </tbody>
116
+ </table>
117
+ <table cellpadding="0" cellspacing="0" class="es-footer" align="center" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;table-layout:fixed !important;width:100%;background-color:transparent;background-repeat:repeat;background-position:center top;">
118
+ <tbody>
119
+ <tr style="border-collapse:collapse;">
120
+ <td align="center" style="padding:0;Margin:0;">
121
+ <table class="es-footer-body" align="center" cellpadding="0" cellspacing="0" width="600" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;background-color:transparent;">
122
+ <tbody>
123
+ <tr style="border-collapse:collapse;">
124
+ <td class="es-p20t es-p20b es-p20r es-p20l" align="left" style="Margin:0;padding-top:20px;padding-bottom:20px;padding-left:20px;padding-right:20px;">
125
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
126
+ <tbody>
127
+ <tr style="border-collapse:collapse;">
128
+ <td width="560" align="center" valign="top" style="padding:0;Margin:0;">
129
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
130
+ <tbody>
131
+ <tr style="border-collapse:collapse;">
132
+ <td align="center" class="es-p10t es-p10b" style="padding:0;Margin:0;padding-top:10px;padding-bottom:10px;"> <p style="Margin:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-size:11px;font-family:arial, 'helvetica neue', helvetica, sans-serif;line-height:150%;color:rgb(51, 51, 51);"></p> </td>
133
+ </tr>
134
+ <tr style="border-collapse:collapse;">
135
+ <td align="center" class="es-p10t es-p10b" style="padding:0;Margin:0;padding-top:10px;padding-bottom:10px;"><p style="Margin:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-size:11px;font-family:arial, 'helvetica neue', helvetica, sans-serif;line-height:150%;color:rgb(51, 51, 51);">© 2018 <%= @domain %> </p></td>
136
+ </tr>
137
+ </tbody>
138
+ </table> </td>
139
+ </tr>
140
+ <tr style="border-collapse:collapse;">
141
+ <td width="560" align="left" style="padding:0;Margin:0;">
142
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
143
+ <tbody>
144
+ <tr style="border-collapse:collapse;">
145
+ <td align="center" class="es-infoblock es-m-txt-c es-p10t es-p10b" style="padding:0;Margin:0;padding-top:10px;padding-bottom:10px;line-height:120%;font-size:12px;color:rgb(204, 204, 204);"><p style="Margin:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-size:12px;font-family:arial, 'helvetica neue', helvetica, sans-serif;line-height:120%;color:rgb(204, 204, 204);"><a target="_blank" href="http://stripo.email" style="-webkit-text-size-adjust:none;-ms-text-size-adjust:none;mso-line-height-rule:exactly;font-family:arial, 'helvetica neue', helvetica, sans-serif;font-size:12px;text-decoration:underline;color:rgb(44, 181, 67);">Просмотреть в браузере</a></p></td>
146
+ </tr>
147
+ </tbody>
148
+ </table> </td>
149
+ </tr>
150
+ </tbody>
151
+ </table> </td>
152
+ </tr>
153
+ </tbody>
154
+ </table> </td>
155
+ </tr>
156
+ </tbody>
157
+ </table>
158
+ <table cellpadding="0" cellspacing="0" class="es-content" align="center" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;table-layout:fixed !important;width:100%;">
159
+ <tbody>
160
+ <tr style="border-collapse:collapse;">
161
+ <td align="center" style="padding:0;Margin:0;">
162
+ <table class="es-content-body" align="center" cellpadding="0" cellspacing="0" width="600" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;background-color:transparent;">
163
+ <tbody>
164
+ <tr style="border-collapse:collapse;">
165
+ <td class="es-p30b es-p20r es-p20l" align="left" style="padding:0;Margin:0;padding-left:20px;padding-right:20px;padding-bottom:30px;">
166
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
167
+ <tbody>
168
+ <tr style="border-collapse:collapse;">
169
+ <td width="560" align="center" valign="top" style="padding:0;Margin:0;">
170
+ <table cellpadding="0" cellspacing="0" width="100%" style="mso-table-lspace:0pt;mso-table-rspace:0pt;border-collapse:collapse;border-spacing:0px;">
171
+ <tbody>
172
+ <tr style="border-collapse:collapse;">
173
+ <td align="center" style="padding:0;Margin:0;display:none;"></td>
174
+ </tr>
175
+ </tbody>
176
+ </table> </td>
177
+ </tr>
178
+ </tbody>
179
+ </table> </td>
180
+ </tr>
181
+ </tbody>
182
+ </table> </td>
183
+ </tr>
184
+ </tbody>
185
+ </table> </td>
186
+ </tr>
187
+ </tbody>
188
+ </table>
189
+ </div>
190
+ </body>
191
+ </html>