c80_news_tz 0.1.1.19 → 0.1.1.21
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 +4 -4
- data/app/admin/c80_news_tz/banners01.rb +50 -0
- data/app/admin/c80_news_tz/banners02.rb +50 -0
- data/app/admin/c80_news_tz/banners03.rb +50 -0
- data/app/assets/javascripts/c80_news_tz/frontend/nabbers.js +53 -0
- data/app/controllers/c80_news_tz/banners_controller.rb +48 -0
- data/app/helpers/c80_news_tz/advertisers_helper.rb +30 -0
- data/app/helpers/c80_news_tz/application_helper.rb +8 -0
- data/app/helpers/c80_news_tz/banners_helper.rb +95 -0
- data/app/helpers/c80_news_tz/blurbs_helper.rb +14 -0
- data/app/helpers/c80_news_tz/publications_helper.rb +2 -1
- data/app/models/c80_news_tz/banner01.rb +34 -0
- data/app/models/c80_news_tz/banner02.rb +34 -0
- data/app/models/c80_news_tz/banner03.rb +39 -0
- data/app/models/c80_news_tz/banner_validator.rb +16 -0
- data/app/models/c80_news_tz/fact.rb +48 -0
- data/app/models/c80_news_tz/r_advertiser.rb +34 -0
- data/app/models/c80_news_tz/r_blurb.rb +55 -6
- data/app/uploaders/c80_news_tz/bimage01_uploader.rb +44 -0
- data/app/uploaders/c80_news_tz/bimage02_uploader.rb +44 -0
- data/app/uploaders/c80_news_tz/bimage03_uploader.rb +44 -0
- data/app/uploaders/c80_news_tz/r_alogo_uploader.rb +11 -2
- data/app/views/c80_news_tz/banners/counter.html.erb +1 -0
- data/app/views/shared/_banner_01.html.erb +7 -0
- data/app/views/shared/_banner_02.html.erb +3 -0
- data/app/views/shared/_banner_03.html.erb +3 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20160309194444_create_banners01.rb +14 -0
- data/db/migrate/20160310110000_create_banners02.rb +14 -0
- data/db/migrate/20160310114242_create_banners03.rb +14 -0
- data/lib/c80_news_tz/version.rb +1 -1
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15f192a8810ee8e908dda8d442f54e4eaf7f8f15
|
4
|
+
data.tar.gz: d7aed5c07568f7a4e3c33a5c4197a54fd522faf9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7de32164e50f27bf30c091240376769e33b519905a5bc5483b37f85fbffd0e7712dc9e1818be8e81fbbe48b535913d2c10a6ade76f27f013747f66740868fda5
|
7
|
+
data.tar.gz: b207cfb134caa3fc127026c0df61b2e90531ba5351e077e8936de762cbe29d3aca72f80ffcad1c2b61944ce1fa7d392ccd3e3821545fa511d56fecafb59bf77d
|
@@ -0,0 +1,50 @@
|
|
1
|
+
ActiveAdmin.register C80NewsTz::Banner01, :as => 'Banner01' do
|
2
|
+
|
3
|
+
menu :label => "Рекламный блок №1", :parent => 'Баннеры'
|
4
|
+
|
5
|
+
permit_params :title,
|
6
|
+
:image,
|
7
|
+
:href,
|
8
|
+
:is_active
|
9
|
+
|
10
|
+
config.sort_order = 'title_asc'
|
11
|
+
|
12
|
+
filter :title
|
13
|
+
filter :href
|
14
|
+
filter :is_active
|
15
|
+
|
16
|
+
# controller do
|
17
|
+
# cache_sweeper :suit_sweeper, :only => [:update,:create,:destroy]
|
18
|
+
# end
|
19
|
+
|
20
|
+
index do
|
21
|
+
selectable_column
|
22
|
+
id_column
|
23
|
+
column :title
|
24
|
+
column :image do |a|
|
25
|
+
if a.image.present?
|
26
|
+
"#{image_tag("#{a.image.thumb_preview.url}")}".html_safe
|
27
|
+
end
|
28
|
+
end
|
29
|
+
column :href
|
30
|
+
column :is_active
|
31
|
+
column :shown
|
32
|
+
column :clicks
|
33
|
+
|
34
|
+
actions
|
35
|
+
end
|
36
|
+
|
37
|
+
form(:html => {:multipart => true}) do |f|
|
38
|
+
|
39
|
+
f.inputs "Свойства" do
|
40
|
+
|
41
|
+
f.input :title
|
42
|
+
f.input :href
|
43
|
+
f.input :image, :hint => "#{image_tag("#{f.object.image.thumb_preview.url}")}".html_safe
|
44
|
+
f.input :is_active
|
45
|
+
end
|
46
|
+
|
47
|
+
f.actions
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
ActiveAdmin.register C80NewsTz::Banner02, :as => 'Banner02' do
|
2
|
+
|
3
|
+
menu :label => "Рекламный блок №2", :parent => 'Баннеры'
|
4
|
+
|
5
|
+
permit_params :title,
|
6
|
+
:image,
|
7
|
+
:href,
|
8
|
+
:is_active
|
9
|
+
|
10
|
+
config.sort_order = 'title_asc'
|
11
|
+
|
12
|
+
filter :title
|
13
|
+
filter :href
|
14
|
+
filter :is_active
|
15
|
+
|
16
|
+
# controller do
|
17
|
+
# cache_sweeper :suit_sweeper, :only => [:update,:create,:destroy]
|
18
|
+
# end
|
19
|
+
|
20
|
+
index do
|
21
|
+
selectable_column
|
22
|
+
id_column
|
23
|
+
column :title
|
24
|
+
column :image do |a|
|
25
|
+
if a.image.present?
|
26
|
+
"#{image_tag("#{a.image.thumb_preview.url}")}".html_safe
|
27
|
+
end
|
28
|
+
end
|
29
|
+
column :href
|
30
|
+
column :is_active
|
31
|
+
column :shown
|
32
|
+
column :clicks
|
33
|
+
|
34
|
+
actions
|
35
|
+
end
|
36
|
+
|
37
|
+
form(:html => {:multipart => true}) do |f|
|
38
|
+
|
39
|
+
f.inputs "Свойства" do
|
40
|
+
|
41
|
+
f.input :title
|
42
|
+
f.input :href
|
43
|
+
f.input :image, :hint => "#{image_tag("#{f.object.image.thumb_preview.url}")}".html_safe
|
44
|
+
f.input :is_active
|
45
|
+
end
|
46
|
+
|
47
|
+
f.actions
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
ActiveAdmin.register C80NewsTz::Banner03, :as => 'Banner03' do
|
2
|
+
|
3
|
+
menu :label => "Рекламный блок №3", :parent => 'Баннеры'
|
4
|
+
|
5
|
+
permit_params :title,
|
6
|
+
:image,
|
7
|
+
:href,
|
8
|
+
:is_active
|
9
|
+
|
10
|
+
config.sort_order = 'title_asc'
|
11
|
+
|
12
|
+
filter :title
|
13
|
+
filter :href
|
14
|
+
filter :is_active
|
15
|
+
|
16
|
+
# controller do
|
17
|
+
# cache_sweeper :suit_sweeper, :only => [:update,:create,:destroy]
|
18
|
+
# end
|
19
|
+
|
20
|
+
index do
|
21
|
+
selectable_column
|
22
|
+
id_column
|
23
|
+
column :title
|
24
|
+
column :image do |a|
|
25
|
+
if a.image.present?
|
26
|
+
"#{image_tag("#{a.image.thumb_preview.url}")}".html_safe
|
27
|
+
end
|
28
|
+
end
|
29
|
+
column :href
|
30
|
+
column :is_active
|
31
|
+
column :shown
|
32
|
+
column :clicks
|
33
|
+
|
34
|
+
actions
|
35
|
+
end
|
36
|
+
|
37
|
+
form(:html => {:multipart => true}) do |f|
|
38
|
+
|
39
|
+
f.inputs "Свойства" do
|
40
|
+
|
41
|
+
f.input :title
|
42
|
+
f.input :href
|
43
|
+
f.input :image, :hint => "#{image_tag("#{f.object.image.thumb_preview.url}")}".html_safe
|
44
|
+
f.input :is_active
|
45
|
+
end
|
46
|
+
|
47
|
+
f.actions
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
/* считаем клики по wow-картинкам */
|
2
|
+
|
3
|
+
$(document).ready(function () {
|
4
|
+
|
5
|
+
var prefixes_array = ['rb01', 'rb02', 'rb03'];
|
6
|
+
var iprefix, i$rb;
|
7
|
+
for (var i = 0; i < prefixes_array.length; i++) {
|
8
|
+
|
9
|
+
// prefix является:
|
10
|
+
// - id ссылки, в которую завёрнута картинка
|
11
|
+
// - префиксом класса, в который вставлен id wow-картинки
|
12
|
+
iprefix = prefixes_array[i];
|
13
|
+
|
14
|
+
i$rb = $("#" + iprefix);
|
15
|
+
if (i$rb.length == 1) {
|
16
|
+
|
17
|
+
var bc = (function () {
|
18
|
+
|
19
|
+
var _init = function ($rb) {
|
20
|
+
|
21
|
+
$rb.click(function (event) {
|
22
|
+
event.preventDefault();
|
23
|
+
|
24
|
+
$.ajax({
|
25
|
+
url: '/rb',
|
26
|
+
type: 'POST',
|
27
|
+
data: {c: $rb.attr('class')},
|
28
|
+
dataType: 'text'
|
29
|
+
});
|
30
|
+
|
31
|
+
window.location.href = $rb.attr('href');
|
32
|
+
|
33
|
+
//var $a = $('<a href="'+$rb.attr('href')+'" target="_blank">go!</a>');
|
34
|
+
//$(document).append(a);
|
35
|
+
//$a[0].click(); // => всплывающее окно заблокировано
|
36
|
+
|
37
|
+
});
|
38
|
+
|
39
|
+
};
|
40
|
+
|
41
|
+
return {
|
42
|
+
init: _init
|
43
|
+
}
|
44
|
+
|
45
|
+
})();
|
46
|
+
|
47
|
+
bc.init(i$rb);
|
48
|
+
|
49
|
+
}
|
50
|
+
|
51
|
+
}
|
52
|
+
|
53
|
+
});
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module C80NewsTz
|
2
|
+
|
3
|
+
# считает клики по баннерам
|
4
|
+
class BannersController < ActionController::Base
|
5
|
+
|
6
|
+
# считает клики по баннерам
|
7
|
+
def counter
|
8
|
+
|
9
|
+
# TODO_MY:: реализовать защиту от накручивания, быстрых повторных кликов с того же ip, левых запросов
|
10
|
+
|
11
|
+
# params[:c] = $
|
12
|
+
# где строка вида rb{(\d\d)}_{(\d+)}:
|
13
|
+
# $1: часть имени класса баннера
|
14
|
+
# $2: id баннера в базе
|
15
|
+
|
16
|
+
s = params[:c]
|
17
|
+
rex = /(?<=rb)(\d\d)_(\d+)/
|
18
|
+
result = s[rex]
|
19
|
+
|
20
|
+
if result.present?
|
21
|
+
|
22
|
+
# извлекаем данные
|
23
|
+
class_part_name = result[$1]
|
24
|
+
banner_id = result[$2]
|
25
|
+
Rails.logger.debug("<BannersController.counter> class_part_name = #{class_part_name}, banner_id = #{banner_id}")
|
26
|
+
|
27
|
+
# фиксируем баннер
|
28
|
+
b = nil
|
29
|
+
if class_part_name == '01'
|
30
|
+
b = Banner01.find(banner_id)
|
31
|
+
elsif class_part_name == '02'
|
32
|
+
b = Banner02.find(banner_id)
|
33
|
+
elsif class_part_name == '03'
|
34
|
+
b = Banner03.find(banner_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
# увеличиваем счётчик на единицу
|
38
|
+
if b.present?
|
39
|
+
b.clicks += 1
|
40
|
+
b.save!
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module C80NewsTz
|
2
|
+
module AdvertisersHelper
|
3
|
+
|
4
|
+
# собрать информацию для отрисовки логотипа компании в блоке "публикации рекламодателя"
|
5
|
+
# отрисовка логотипа происходит с помощью метода render_image_link_lazy_holder
|
6
|
+
# если логотипа нет - вернёт nil
|
7
|
+
def arrange_logo_for_aapub(advertiser)
|
8
|
+
# :alt_image => pub.title,
|
9
|
+
# :image => photo_preview,
|
10
|
+
# :ww => ww,
|
11
|
+
# :hh => hh,
|
12
|
+
# :a_href => url_for_fact(pub)
|
13
|
+
|
14
|
+
result = nil
|
15
|
+
|
16
|
+
if advertiser.logo_for_aapub.present?
|
17
|
+
result = {
|
18
|
+
:alt_image => advertiser.title,
|
19
|
+
:image => advertiser.logo_for_aapub,
|
20
|
+
:ww => 282,
|
21
|
+
:hh => 82,
|
22
|
+
:a_href => apph_url_for_advertiser(advertiser.slug)
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -22,5 +22,13 @@ module C80NewsTz
|
|
22
22
|
"#{root_url}issues/#{issue_id}"
|
23
23
|
end
|
24
24
|
|
25
|
+
def apph_url_for_advertiser(advertiser_slug)
|
26
|
+
"#{root_url}publishers/#{advertiser_slug}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def apph_url_for_blurb(blurb)
|
30
|
+
"#{root_url}publications/#{blurb.slug}"
|
31
|
+
end
|
32
|
+
|
25
33
|
end
|
26
34
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module C80NewsTz
|
2
|
+
module BannersHelper
|
3
|
+
|
4
|
+
# рендер баннера в рекламном блоке 1
|
5
|
+
def render_banner_01
|
6
|
+
|
7
|
+
# извлечём баннер
|
8
|
+
b = Banner01.random_active
|
9
|
+
|
10
|
+
if b.present?
|
11
|
+
|
12
|
+
# увеличим счётчик показов
|
13
|
+
b.shown += 1
|
14
|
+
b.save!
|
15
|
+
|
16
|
+
# соберём информацию для рендера view
|
17
|
+
vp = {
|
18
|
+
alt_image: b.title,
|
19
|
+
image: b.image.thumb_fill,
|
20
|
+
ww: 1200, # ширина\высота совпадает с шириной\высотой, указанной в Bimage01Uploader
|
21
|
+
hh: 165,
|
22
|
+
a_href: b.href,
|
23
|
+
aid: 'rb01', # используется js для подсчёта кликов
|
24
|
+
a_class: "rb01_#{b.id}"
|
25
|
+
}
|
26
|
+
|
27
|
+
render :partial => 'shared/banner_01',
|
28
|
+
:locals => {
|
29
|
+
:vp => vp
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# рендер баннера в рекламном блоке 2
|
35
|
+
def render_banner_02
|
36
|
+
|
37
|
+
# извлечём баннер
|
38
|
+
b = Banner02.random_active
|
39
|
+
|
40
|
+
if b.present?
|
41
|
+
|
42
|
+
# увеличим счётчик показов
|
43
|
+
b.shown += 1
|
44
|
+
b.save!
|
45
|
+
|
46
|
+
# соберём информацию для рендера view
|
47
|
+
vp = {
|
48
|
+
alt_image: b.title,
|
49
|
+
image: b.image.thumb_fill,
|
50
|
+
ww: 812, # ширина\высота совпадает с шириной\высотой, указанной в Bimage02Uploader
|
51
|
+
hh: 130,
|
52
|
+
a_href: b.href,
|
53
|
+
aid: 'rb02', # используется js для подсчёта кликов
|
54
|
+
a_class: "rb02_#{b.id}"
|
55
|
+
}
|
56
|
+
|
57
|
+
render :partial => 'shared/banner_02',
|
58
|
+
:locals => {
|
59
|
+
:vp => vp
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# рендер баннера в рекламном блоке 3
|
65
|
+
def render_banner_03
|
66
|
+
|
67
|
+
# извлечём баннер
|
68
|
+
b = Banner03.random_active
|
69
|
+
|
70
|
+
if b.present?
|
71
|
+
|
72
|
+
# увеличим счётчик показов
|
73
|
+
b.shown += 1
|
74
|
+
b.save!
|
75
|
+
|
76
|
+
# соберём информацию для рендера view
|
77
|
+
vp = {
|
78
|
+
alt_image: b.title,
|
79
|
+
image: b.image.thumb_fill,
|
80
|
+
ww: 287, # ширина\высота совпадает с шириной\высотой, указанной в Bimage03Uploader
|
81
|
+
hh: 321,
|
82
|
+
a_href: b.href,
|
83
|
+
aid: 'rb03', # используется js для подсчёта кликов
|
84
|
+
a_class: "rb03_#{b.id}"
|
85
|
+
}
|
86
|
+
|
87
|
+
render :partial => 'shared/banner_03',
|
88
|
+
:locals => {
|
89
|
+
:vp => vp
|
90
|
+
}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module C80NewsTz
|
2
|
+
module BlurbsHelper
|
3
|
+
|
4
|
+
# собрать информацию для отрисовки preview блока публикации рекламодателя в блоке "публикации рекламодателя"
|
5
|
+
def arrange_blurb_preview_for_rblock(blurb)
|
6
|
+
result = {
|
7
|
+
title: blurb.title,
|
8
|
+
time: local_time(blurb[:created_at], format: '%H:%M %d.%m.%Y'),
|
9
|
+
href: apph_url_for_blurb(blurb)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -76,7 +76,8 @@ module C80NewsTz
|
|
76
76
|
title: pub.title,
|
77
77
|
rubric: pub.rubric_title,
|
78
78
|
time: local_time(pub[:created_at], format: '%H:%M %d.%m.%Y'),
|
79
|
-
comments_count: 12
|
79
|
+
comments_count: 12,
|
80
|
+
href: url_for_fact(pub) # TODO_MY:: используется в _simple_preview_list.html.erb, надо использовать везде
|
80
81
|
}
|
81
82
|
|
82
83
|
result
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# баннер в самом верху страницы
|
2
|
+
module C80NewsTz
|
3
|
+
class Banner01 < ActiveRecord::Base
|
4
|
+
mount_uploader :image, Bimage01Uploader
|
5
|
+
validates_with BannerValidator
|
6
|
+
|
7
|
+
before_save :before_save_format_href
|
8
|
+
|
9
|
+
# выдать рандомный активный баннер
|
10
|
+
# если такового нету - вернётся null
|
11
|
+
def self.random_active
|
12
|
+
result = nil
|
13
|
+
a = self.where(:is_active => true)
|
14
|
+
if a.count > 0
|
15
|
+
b = a.offset(rand(a.count)).first
|
16
|
+
if b.image.present?
|
17
|
+
result = b
|
18
|
+
end
|
19
|
+
end
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# каждая ссылка должна начинаться с http://
|
26
|
+
def before_save_format_href
|
27
|
+
str = 'http://'
|
28
|
+
if self.href[0..6] != str
|
29
|
+
self.href = "#{str}#{self.href}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# баннер в области №2, перед содержимым страницы
|
2
|
+
module C80NewsTz
|
3
|
+
class Banner02 < ActiveRecord::Base
|
4
|
+
mount_uploader :image, Bimage02Uploader
|
5
|
+
validates_with BannerValidator
|
6
|
+
|
7
|
+
before_save :before_save_format_href
|
8
|
+
|
9
|
+
# выдать рандомный активный баннер
|
10
|
+
# если такового нету - вернётся null
|
11
|
+
def self.random_active
|
12
|
+
result = nil
|
13
|
+
a = self.where(:is_active => true)
|
14
|
+
if a.count > 0
|
15
|
+
b = a.offset(rand(a.count)).first
|
16
|
+
if b.image.present?
|
17
|
+
result = b
|
18
|
+
end
|
19
|
+
end
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# каждая ссылка должна начинаться с http://
|
26
|
+
def before_save_format_href
|
27
|
+
str = 'http://'
|
28
|
+
if self.href[0..6] != str
|
29
|
+
self.href = "#{str}#{self.href}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# баннер в области №3, справа от главной публикации
|
2
|
+
module C80NewsTz
|
3
|
+
class Banner03 < ActiveRecord::Base
|
4
|
+
mount_uploader :image, Bimage03Uploader
|
5
|
+
validates_with BannerValidator
|
6
|
+
|
7
|
+
before_save :before_save_format_href
|
8
|
+
|
9
|
+
# выдать рандомный активный баннер
|
10
|
+
# если такового нету - вернётся null
|
11
|
+
def self.random_active
|
12
|
+
result = nil
|
13
|
+
a = self.where(:is_active => true)
|
14
|
+
if a.count > 0
|
15
|
+
b = a.offset(rand(a.count)).first
|
16
|
+
if b.image.present?
|
17
|
+
result = b
|
18
|
+
end
|
19
|
+
end
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
23
|
+
# выдать количество активных баннеров
|
24
|
+
def self.count_active
|
25
|
+
self.where(:is_active => true).count
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# каждая ссылка должна начинаться с http://
|
31
|
+
def before_save_format_href
|
32
|
+
str = 'http://'
|
33
|
+
if self.href[0..6] != str
|
34
|
+
self.href = "#{str}#{self.href}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module C80NewsTz
|
2
|
+
class BannerValidator < ActiveModel::Validator
|
3
|
+
def validate(record)
|
4
|
+
unless record.title.present?
|
5
|
+
record.errors[:title] = 'Укажите название'
|
6
|
+
end
|
7
|
+
unless record.href.present?
|
8
|
+
record.errors[:href] = 'Укажите ссылку'
|
9
|
+
end
|
10
|
+
unless record.image.present?
|
11
|
+
record.errors[:image] = 'Загрузите картинку'
|
12
|
+
end
|
13
|
+
puts record.errors.as_json
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -61,6 +61,36 @@ module C80NewsTz
|
|
61
61
|
result
|
62
62
|
end
|
63
63
|
|
64
|
+
# выдать id первой попавшейся рубрики
|
65
|
+
# если рубрики у публикации нету - выдать невероятное число 999999
|
66
|
+
def rubric_id
|
67
|
+
result = 999999
|
68
|
+
if rubrics.count > 0
|
69
|
+
result = rubrics.first.id
|
70
|
+
end
|
71
|
+
result
|
72
|
+
end
|
73
|
+
|
74
|
+
# выдать id первого попавшегося номера
|
75
|
+
# если номера у публикации нету - выдать невероятное число 999999
|
76
|
+
def issue_id
|
77
|
+
result = 999999
|
78
|
+
if issues.count > 0
|
79
|
+
result = issues.first.id
|
80
|
+
end
|
81
|
+
result
|
82
|
+
end
|
83
|
+
|
84
|
+
# выдать название номера, которому принадлежит новость
|
85
|
+
# если чего-то не хватает - выдаётся пустая строка
|
86
|
+
def issue_title
|
87
|
+
result = ""
|
88
|
+
if issues.count > 0
|
89
|
+
result = issues.first.number
|
90
|
+
end
|
91
|
+
result
|
92
|
+
end
|
93
|
+
|
64
94
|
# выдать логотип первой попавшейся компании
|
65
95
|
# если чего-то нету - выдаётся nil
|
66
96
|
def company_logo
|
@@ -99,5 +129,23 @@ module C80NewsTz
|
|
99
129
|
self.joins(:rubrics).where(:c80_news_tz_rubrics => {:slug => rubric_slug})
|
100
130
|
end
|
101
131
|
|
132
|
+
# выдать нужное количество публикаций из той же рубрики
|
133
|
+
def self.similar_rubric_pubs(pub, count)
|
134
|
+
r = self.joins(:rubrics)
|
135
|
+
.where(:c80_news_tz_rubrics => {:id => pub.rubric_id})
|
136
|
+
.where.not(:c80_news_tz_facts => {:id => pub.id})
|
137
|
+
.limit(count)
|
138
|
+
r
|
139
|
+
end
|
140
|
+
|
141
|
+
# выдать нужное количество публикаций из того же номера
|
142
|
+
def self.similar_issue_pubs(pub, count)
|
143
|
+
r = self.joins(:issues)
|
144
|
+
.where(:c80_news_tz_issues => {:id => pub.issue_id})
|
145
|
+
.where.not(:c80_news_tz_facts => {:id => pub.id})
|
146
|
+
.limit(count)
|
147
|
+
r
|
148
|
+
end
|
149
|
+
|
102
150
|
end
|
103
151
|
end
|
@@ -26,5 +26,39 @@ module C80NewsTz
|
|
26
26
|
# name_changed? || super
|
27
27
|
end
|
28
28
|
|
29
|
+
# выдать путь до лого для вставки в блок "публикации рекламодателя"
|
30
|
+
# иначе вернёт nil
|
31
|
+
def logo_for_aapub
|
32
|
+
result = nil
|
33
|
+
if logo.present?
|
34
|
+
result = logo.thumb_fill
|
35
|
+
end
|
36
|
+
result
|
37
|
+
end
|
38
|
+
|
39
|
+
# выдать активного рекламодателя (он может быть только один)
|
40
|
+
# если активного нету - вернётся nil
|
41
|
+
def self.active
|
42
|
+
result = nil
|
43
|
+
|
44
|
+
s = "
|
45
|
+
SELECT
|
46
|
+
`c80_news_tz_r_advertisers`.*
|
47
|
+
FROM
|
48
|
+
`c80_news_tz_r_advertisers`
|
49
|
+
INNER JOIN
|
50
|
+
`c80_news_tz_advs_lives` ON `c80_news_tz_r_advertisers`.id = `c80_news_tz_advs_lives`.r_advertiser_id;
|
51
|
+
"
|
52
|
+
|
53
|
+
array_of_advertisers = self.find_by_sql(s)
|
54
|
+
|
55
|
+
if array_of_advertisers.count == 1
|
56
|
+
result = array_of_advertisers[0]
|
57
|
+
end
|
58
|
+
|
59
|
+
result
|
60
|
+
|
61
|
+
end
|
62
|
+
|
29
63
|
end
|
30
64
|
end
|
@@ -29,12 +29,9 @@ module C80NewsTz
|
|
29
29
|
[:title] + Array.new(6) {|index| [:title, index+2]}
|
30
30
|
end
|
31
31
|
|
32
|
-
# TODO_MY:: используется ли метод short_meta_description?
|
33
32
|
def short_meta_description
|
34
33
|
|
35
|
-
if
|
36
|
-
result = description
|
37
|
-
elsif full.present? && full.length > 0
|
34
|
+
if full.present? && full.length > 0
|
38
35
|
result = strip_tags(full[0..200]+"...")
|
39
36
|
else
|
40
37
|
result = nil
|
@@ -46,8 +43,30 @@ module C80NewsTz
|
|
46
43
|
# выдать публикации, принадлежащие указанной рубрике
|
47
44
|
def self.where_rubric(rubric_slug)
|
48
45
|
self.joins(:rubrics).where(:c80_news_tz_rubrics => {:slug => rubric_slug})
|
49
|
-
end
|
50
|
-
|
46
|
+
end
|
47
|
+
|
48
|
+
# выдать массив с двумя последними публикациями указанного рекламодателя
|
49
|
+
# массив может содержать элементов: 0, 1, 2
|
50
|
+
def self.two_last_pubs_by_advr(advertiser_id)
|
51
|
+
s = "
|
52
|
+
SELECT
|
53
|
+
`c80_news_tz_r_blurbs`.*
|
54
|
+
FROM
|
55
|
+
`c80_news_tz_r_blurbs`
|
56
|
+
INNER JOIN
|
57
|
+
`c80_news_tz_advs_blurbs` ON `c80_news_tz_r_blurbs`.id = `c80_news_tz_advs_blurbs`.r_blurb_id
|
58
|
+
WHERE
|
59
|
+
`c80_news_tz_advs_blurbs`.r_advertiser_id = #{advertiser_id}
|
60
|
+
ORDER BY
|
61
|
+
`c80_news_tz_r_blurbs`.created_at DESC
|
62
|
+
LIMIT 2;
|
63
|
+
"
|
64
|
+
|
65
|
+
result = self.find_by_sql(s)
|
66
|
+
result
|
67
|
+
|
68
|
+
end
|
69
|
+
|
51
70
|
# выдать картинку, которая пойдёт в блок преьвю
|
52
71
|
def photo_preview
|
53
72
|
result = nil
|
@@ -68,6 +87,36 @@ module C80NewsTz
|
|
68
87
|
result
|
69
88
|
end
|
70
89
|
|
90
|
+
# выдать id первой попавшейся рубрики
|
91
|
+
# если рубрики у публикации нету - выдать невероятное число 999999
|
92
|
+
def rubric_id
|
93
|
+
result = 999999
|
94
|
+
if rubrics.count > 0
|
95
|
+
result = rubrics.first.id
|
96
|
+
end
|
97
|
+
result
|
98
|
+
end
|
99
|
+
|
100
|
+
# выдать id первого попавшегося номера
|
101
|
+
# если номера у публикации нету - выдать невероятное число 999999
|
102
|
+
def issue_id
|
103
|
+
result = 999999
|
104
|
+
if issues.count > 0
|
105
|
+
result = issues.first.id
|
106
|
+
end
|
107
|
+
result
|
108
|
+
end
|
109
|
+
|
110
|
+
# выдать название номера, которому принадлежит новость
|
111
|
+
# если чего-то не хватает - выдаётся пустая строка
|
112
|
+
def issue_title
|
113
|
+
result = ""
|
114
|
+
if issues.count > 0
|
115
|
+
result = issues.first.number
|
116
|
+
end
|
117
|
+
result
|
118
|
+
end
|
119
|
+
|
71
120
|
# выдать логотип первого попавшегося рекламодателя
|
72
121
|
# если чего-то нету - выдаётся nil
|
73
122
|
def company_logo
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# грузит картинку для баннера, который находится в самом верху страницы
|
2
|
+
module C80NewsTz
|
3
|
+
class Bimage01Uploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :file
|
8
|
+
|
9
|
+
process :resize_to_limit => [1200,1200]
|
10
|
+
|
11
|
+
version :thumb_preview do
|
12
|
+
process :resize_to_fill => [240,33]
|
13
|
+
end
|
14
|
+
|
15
|
+
version :thumb_fill do
|
16
|
+
process :resize_to_fill => [1200, 165]
|
17
|
+
end
|
18
|
+
|
19
|
+
version :thumb_fit do
|
20
|
+
process :resize_to_fit => [1200, 165]
|
21
|
+
end
|
22
|
+
|
23
|
+
def store_dir
|
24
|
+
"uploads/n_01/#{format("%02d", model.id)}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def extension_white_list
|
28
|
+
%w(jpg jpeg gif png)
|
29
|
+
end
|
30
|
+
|
31
|
+
def filename
|
32
|
+
if original_filename
|
33
|
+
"photo_#{secure_token(4)}.#{file.extension}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
def secure_token(length=16)
|
39
|
+
var = :"@#{mounted_as}_secure_token"
|
40
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# грузит картинку для баннера, который находится в рекламной области №2, перед содержимым страницы
|
2
|
+
module C80NewsTz
|
3
|
+
class Bimage02Uploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :file
|
8
|
+
|
9
|
+
process :resize_to_limit => [812,812]
|
10
|
+
|
11
|
+
version :thumb_preview do
|
12
|
+
process :resize_to_fill => [406,65]
|
13
|
+
end
|
14
|
+
|
15
|
+
version :thumb_fill do
|
16
|
+
process :resize_to_fill => [812, 130]
|
17
|
+
end
|
18
|
+
|
19
|
+
version :thumb_fit do
|
20
|
+
process :resize_to_fit => [812, 130]
|
21
|
+
end
|
22
|
+
|
23
|
+
def store_dir
|
24
|
+
"uploads/n_02/#{format("%02d", model.id)}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def extension_white_list
|
28
|
+
%w(jpg jpeg gif png)
|
29
|
+
end
|
30
|
+
|
31
|
+
def filename
|
32
|
+
if original_filename
|
33
|
+
"photo_#{secure_token(4)}.#{file.extension}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
def secure_token(length=16)
|
39
|
+
var = :"@#{mounted_as}_secure_token"
|
40
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# грузит картинку для баннера, что справа от главной публикации
|
2
|
+
module C80NewsTz
|
3
|
+
class Bimage03Uploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :file
|
8
|
+
|
9
|
+
process :resize_to_limit => [287,321]
|
10
|
+
|
11
|
+
version :thumb_preview do
|
12
|
+
process :resize_to_fill => [287,321]
|
13
|
+
end
|
14
|
+
|
15
|
+
version :thumb_fill do
|
16
|
+
process :resize_to_fill => [287,321]
|
17
|
+
end
|
18
|
+
|
19
|
+
version :thumb_fit do
|
20
|
+
process :resize_to_fit => [287,321]
|
21
|
+
end
|
22
|
+
|
23
|
+
def store_dir
|
24
|
+
"uploads/n_03/#{format("%02d", model.id)}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def extension_white_list
|
28
|
+
%w(jpg jpeg gif png)
|
29
|
+
end
|
30
|
+
|
31
|
+
def filename
|
32
|
+
if original_filename
|
33
|
+
"photo_#{secure_token(4)}.#{file.extension}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
def secure_token(length=16)
|
39
|
+
var = :"@#{mounted_as}_secure_token"
|
40
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -8,14 +8,20 @@ module C80NewsTz
|
|
8
8
|
|
9
9
|
process :resize_to_limit => [500,500]
|
10
10
|
|
11
|
+
|
12
|
+
|
13
|
+
# вставляются в блок "публикации рекламодателя"
|
11
14
|
version :thumb_fit do
|
12
|
-
process :resize_to_fit => [
|
15
|
+
process :resize_to_fit => [282,82]
|
13
16
|
end
|
14
17
|
|
15
18
|
version :thumb_fill do
|
16
|
-
process :resize_to_fill => [
|
19
|
+
process :resize_to_fill => [282,82]
|
17
20
|
end
|
18
21
|
|
22
|
+
|
23
|
+
|
24
|
+
# по идее, должны вставляться в preview блока новости
|
19
25
|
version :thumb_preview_small do
|
20
26
|
process :resize_to_fit => [80, 44]
|
21
27
|
end
|
@@ -29,6 +35,9 @@ module C80NewsTz
|
|
29
35
|
process :resize_to_fit => [124, 124]
|
30
36
|
end
|
31
37
|
|
38
|
+
|
39
|
+
|
40
|
+
|
32
41
|
def store_dir
|
33
42
|
"uploads/rec/avs/_logos/#{format("%02d", model.id)}"
|
34
43
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
ok
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateBanners01 < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_news_tz_banner01s, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :title
|
5
|
+
t.string :image
|
6
|
+
t.string :href
|
7
|
+
t.boolean :is_active
|
8
|
+
t.integer :shown, :default => 0
|
9
|
+
t.integer :clicks, :default => 0
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateBanners02 < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_news_tz_banner02s, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :title
|
5
|
+
t.string :image
|
6
|
+
t.string :href
|
7
|
+
t.boolean :is_active
|
8
|
+
t.integer :shown, :default => 0
|
9
|
+
t.integer :clicks, :default => 0
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateBanners03 < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_news_tz_banner03s, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.string :title
|
5
|
+
t.string :image
|
6
|
+
t.string :href
|
7
|
+
t.boolean :is_active
|
8
|
+
t.integer :shown, :default => 0
|
9
|
+
t.integer :clicks, :default => 0
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/c80_news_tz/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: c80_news_tz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.1.
|
4
|
+
version: 0.1.1.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- C80609A
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,9 @@ files:
|
|
94
94
|
- LICENSE.txt
|
95
95
|
- README.md
|
96
96
|
- Rakefile
|
97
|
+
- app/admin/c80_news_tz/banners01.rb
|
98
|
+
- app/admin/c80_news_tz/banners02.rb
|
99
|
+
- app/admin/c80_news_tz/banners03.rb
|
97
100
|
- app/admin/c80_news_tz/compaines.rb
|
98
101
|
- app/admin/c80_news_tz/facts.rb
|
99
102
|
- app/admin/c80_news_tz/issues.rb
|
@@ -114,6 +117,7 @@ files:
|
|
114
117
|
- app/assets/javascripts/c80_news_tz/backend/r_blurbs.js
|
115
118
|
- app/assets/javascripts/c80_news_tz/backend/rubrics.js
|
116
119
|
- app/assets/javascripts/c80_news_tz/frontend/facts_ajax.js
|
120
|
+
- app/assets/javascripts/c80_news_tz/frontend/nabbers.js
|
117
121
|
- app/assets/stylesheets/c80_news_tz/application.scss
|
118
122
|
- app/assets/stylesheets/c80_news_tz/backend.scss
|
119
123
|
- app/assets/stylesheets/c80_news_tz/backend/collapsed.scss
|
@@ -125,10 +129,18 @@ files:
|
|
125
129
|
- app/assets/stylesheets/c80_news_tz/backend/spots.scss
|
126
130
|
- app/assets/stylesheets/c80_news_tz/frontend/pubs_medium.scss
|
127
131
|
- app/controllers/c80_news_tz/application_controller.rb
|
132
|
+
- app/controllers/c80_news_tz/banners_controller.rb
|
133
|
+
- app/helpers/c80_news_tz/advertisers_helper.rb
|
128
134
|
- app/helpers/c80_news_tz/application_helper.rb
|
135
|
+
- app/helpers/c80_news_tz/banners_helper.rb
|
136
|
+
- app/helpers/c80_news_tz/blurbs_helper.rb
|
129
137
|
- app/helpers/c80_news_tz/publications_helper.rb
|
130
138
|
- app/helpers/c80_news_tz/subj_helper.rb
|
131
139
|
- app/models/c80_news_tz/adress.rb
|
140
|
+
- app/models/c80_news_tz/banner01.rb
|
141
|
+
- app/models/c80_news_tz/banner02.rb
|
142
|
+
- app/models/c80_news_tz/banner03.rb
|
143
|
+
- app/models/c80_news_tz/banner_validator.rb
|
132
144
|
- app/models/c80_news_tz/company.rb
|
133
145
|
- app/models/c80_news_tz/cphoto.rb
|
134
146
|
- app/models/c80_news_tz/fact.rb
|
@@ -149,6 +161,9 @@ files:
|
|
149
161
|
- app/models/c80_news_tz/rubric.rb
|
150
162
|
- app/models/c80_news_tz/rubric_validator.rb
|
151
163
|
- app/models/c80_news_tz/spot.rb
|
164
|
+
- app/uploaders/c80_news_tz/bimage01_uploader.rb
|
165
|
+
- app/uploaders/c80_news_tz/bimage02_uploader.rb
|
166
|
+
- app/uploaders/c80_news_tz/bimage03_uploader.rb
|
152
167
|
- app/uploaders/c80_news_tz/clogo_uploader.rb
|
153
168
|
- app/uploaders/c80_news_tz/cphoto_uploader.rb
|
154
169
|
- app/uploaders/c80_news_tz/fphoto_uploader.rb
|
@@ -158,7 +173,11 @@ files:
|
|
158
173
|
- app/uploaders/c80_news_tz/r_alogo_uploader.rb
|
159
174
|
- app/uploaders/c80_news_tz/r_bphoto_uploader.rb
|
160
175
|
- app/views/c80_news_tz/application/guru.js.erb
|
176
|
+
- app/views/c80_news_tz/banners/counter.html.erb
|
161
177
|
- app/views/layouts/c80_news_tz/application.html.erb
|
178
|
+
- app/views/shared/_banner_01.html.erb
|
179
|
+
- app/views/shared/_banner_02.html.erb
|
180
|
+
- app/views/shared/_banner_03.html.erb
|
162
181
|
- app/views/shared/_fact.html.erb
|
163
182
|
- app/views/shared/_news_block.html.erb
|
164
183
|
- app/views/shared/_news_list.html.erb
|
@@ -196,6 +215,9 @@ files:
|
|
196
215
|
- db/migrate/20160309151313_create_join_table_advertisers_blurbs.rb
|
197
216
|
- db/migrate/20160309154848_create_bphotos.rb
|
198
217
|
- db/migrate/20160309165151_create_join_table_blurbs_issues.rb
|
218
|
+
- db/migrate/20160309194444_create_banners01.rb
|
219
|
+
- db/migrate/20160310110000_create_banners02.rb
|
220
|
+
- db/migrate/20160310114242_create_banners03.rb
|
199
221
|
- db/seeds/19_fill_news_props.rb.example
|
200
222
|
- db/seeds/20_fill_rubrics.rb.example
|
201
223
|
- db/seeds/21_fill_facts.rb.example
|