biovision-poll 0.1.180917.0 → 0.2.200324.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.
- checksums.yaml +4 -4
- data/app/controllers/admin/poll_answers_controller.rb +6 -5
- data/app/controllers/admin/poll_questions_controller.rb +6 -5
- data/app/controllers/admin/polls_controller.rb +7 -6
- data/app/controllers/poll_answers_controller.rb +15 -9
- data/app/controllers/poll_questions_controller.rb +15 -9
- data/app/controllers/polls_controller.rb +25 -16
- data/app/helpers/polls_helper.rb +19 -29
- data/app/models/poll.rb +50 -18
- data/app/models/poll_answer.rb +29 -36
- data/app/models/poll_question.rb +33 -39
- data/app/models/poll_user.rb +10 -1
- data/app/models/poll_vote.rb +20 -5
- data/app/services/biovision/components/polls_component.rb +21 -0
- data/app/views/admin/components/links/_polls.html.erb +1 -0
- data/app/views/admin/poll_answers/entity/_data.html.erb +0 -0
- data/app/views/admin/poll_answers/entity/_in_list.html.erb +0 -3
- data/app/views/admin/poll_answers/show.html.erb +25 -35
- data/app/views/admin/poll_questions/entity/_data.html.erb +0 -0
- data/app/views/admin/poll_questions/entity/_in_list.html.erb +6 -5
- data/app/views/admin/poll_questions/show.html.erb +29 -37
- data/app/views/admin/poll_votes/entity/_data.html.erb +0 -0
- data/app/views/admin/poll_votes/entity/_in_list.html.erb +6 -5
- data/app/views/admin/polls/entity/_data.html.erb +0 -0
- data/app/views/admin/polls/entity/_in_list.html.erb +1 -3
- data/app/views/admin/polls/index.html.erb +8 -2
- data/app/views/admin/polls/show.html.erb +32 -30
- data/app/views/admin/polls/users.html.erb +2 -1
- data/app/views/poll_answers/_form.html.erb +36 -30
- data/app/views/poll_answers/_poll_answer.html.erb +22 -2
- data/app/views/poll_answers/edit.html.erb +6 -5
- data/app/views/poll_answers/new.html.erb +8 -7
- data/app/views/poll_questions/_form.html.erb +53 -43
- data/app/views/poll_questions/edit.html.erb +6 -5
- data/app/views/poll_questions/new.html.erb +7 -6
- data/app/views/polls/_form.html.erb +64 -41
- data/app/views/polls/_poll.html.erb +11 -6
- data/app/views/polls/edit.html.erb +5 -4
- data/app/views/polls/new.html.erb +3 -2
- data/app/views/polls/results.html.erb +22 -0
- data/config/locales/polls-ru.yml +28 -26
- data/config/routes.rb +19 -15
- data/db/migrate/20200323000001_create_biovision_polls.rb +121 -0
- data/lib/biovision/poll/version.rb +3 -1
- metadata +10 -12
- data/app/uploaders/poll_image_uploader.rb +0 -46
- data/app/views/admin/index/dashboard/_biovision_poll.html.erb +0 -10
- data/db/migrate/20170906000001_create_polls.rb +0 -70
- data/db/migrate/20170906000002_create_poll_questions.rb +0 -22
- data/db/migrate/20170906000003_create_poll_answers.rb +0 -20
- data/db/migrate/20170906000004_create_poll_votes.rb +0 -20
- data/db/migrate/20180412000010_create_poll_users.rb +0 -21
- data/db/migrate/20180903111111_rename_vote_footprint.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e28e8495e436c2f955aba432356fbea9112fec0496e039ec8098ac4ce892740
|
4
|
+
data.tar.gz: c3216e389c001b74779453256aaba57c0f8b9c8fa47a67af463f892fe7d2a11a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba371cfdaaacdb94fe3c5816e6cda59ce155b3ee35570d8da7b4a5163330c8a81424c5dc037c434ef7f4aa6df4b1c51ab2f7e4a1713f0c354e346d936f97422d
|
7
|
+
data.tar.gz: f1c16c57a3bc5b7ed105725125244064f13946b8622264194116d571d1912f7b972d4bb420e3d96dc9e085e76d54e810d197bb1d5019cbfb47dfd7277bdbddd7
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Administrative part of hanlding poll answers
|
1
4
|
class Admin::PollAnswersController < AdminController
|
2
5
|
include ToggleableEntity
|
3
6
|
include EntityPriority
|
@@ -11,14 +14,12 @@ class Admin::PollAnswersController < AdminController
|
|
11
14
|
|
12
15
|
private
|
13
16
|
|
14
|
-
def
|
15
|
-
|
17
|
+
def component_class
|
18
|
+
Biovision::Components::PollsComponent
|
16
19
|
end
|
17
20
|
|
18
21
|
def set_entity
|
19
22
|
@entity = PollAnswer.find_by(id: params[:id])
|
20
|
-
if @entity.nil?
|
21
|
-
handle_http_404('Cannot find poll answer')
|
22
|
-
end
|
23
|
+
handle_http_404('Cannot find poll answer') if @entity.nil?
|
23
24
|
end
|
24
25
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Administrative part for hanlding poll questions
|
1
4
|
class Admin::PollQuestionsController < AdminController
|
2
5
|
include ToggleableEntity
|
3
6
|
include EntityPriority
|
@@ -10,14 +13,12 @@ class Admin::PollQuestionsController < AdminController
|
|
10
13
|
|
11
14
|
private
|
12
15
|
|
13
|
-
def
|
14
|
-
|
16
|
+
def component_class
|
17
|
+
Biovision::Components::PollsComponent
|
15
18
|
end
|
16
19
|
|
17
20
|
def set_entity
|
18
21
|
@entity = PollQuestion.find_by(id: params[:id])
|
19
|
-
if @entity.nil?
|
20
|
-
handle_http_404('Cannot find poll question')
|
21
|
-
end
|
22
|
+
handle_http_404('Cannot find poll question') if @entity.nil?
|
22
23
|
end
|
23
24
|
end
|
@@ -1,7 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Administrative part of handling polls
|
1
4
|
class Admin::PollsController < AdminController
|
2
5
|
include ToggleableEntity
|
3
6
|
|
4
|
-
before_action :set_entity, except:
|
7
|
+
before_action :set_entity, except: :index
|
5
8
|
|
6
9
|
# get /admin/polls
|
7
10
|
def index
|
@@ -37,14 +40,12 @@ class Admin::PollsController < AdminController
|
|
37
40
|
|
38
41
|
private
|
39
42
|
|
40
|
-
def
|
41
|
-
|
43
|
+
def component_class
|
44
|
+
Biovision::Components::PollsComponent
|
42
45
|
end
|
43
46
|
|
44
47
|
def set_entity
|
45
48
|
@entity = Poll.find_by(id: params[:id])
|
46
|
-
if @entity.nil?
|
47
|
-
handle_http_404('Cannot find poll')
|
48
|
-
end
|
49
|
+
handle_http_404('Cannot find poll') if @entity.nil?
|
49
50
|
end
|
50
51
|
end
|
@@ -1,5 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Editing poll answers
|
1
4
|
class PollAnswersController < AdminController
|
2
|
-
before_action :set_entity, only: [
|
5
|
+
before_action :set_entity, only: %i[edit update destroy]
|
6
|
+
|
7
|
+
# post /poll_answers/check
|
8
|
+
def check
|
9
|
+
@entity = PollAnswer.instance_for_check(params[:entity_id], entity_parameters)
|
10
|
+
|
11
|
+
render 'shared/forms/check'
|
12
|
+
end
|
3
13
|
|
4
14
|
# post /poll_answers
|
5
15
|
def create
|
@@ -26,23 +36,19 @@ class PollAnswersController < AdminController
|
|
26
36
|
|
27
37
|
# delete /poll_answers/:id
|
28
38
|
def destroy
|
29
|
-
if @entity.destroy
|
30
|
-
flash[:notice] = t('poll_answers.destroy.success')
|
31
|
-
end
|
39
|
+
flash[:notice] = t('.success') if @entity.destroy
|
32
40
|
redirect_to(admin_poll_question_path(id: @entity.poll_question_id))
|
33
41
|
end
|
34
42
|
|
35
43
|
protected
|
36
44
|
|
37
|
-
def
|
38
|
-
|
45
|
+
def component_class
|
46
|
+
Biovision::Components::PollsComponent
|
39
47
|
end
|
40
48
|
|
41
49
|
def set_entity
|
42
50
|
@entity = PollAnswer.find_by(id: params[:id])
|
43
|
-
if @entity.nil?
|
44
|
-
handle_http_404('Cannot find poll answer')
|
45
|
-
end
|
51
|
+
handle_http_404('Cannot find poll answer') if @entity.nil?
|
46
52
|
end
|
47
53
|
|
48
54
|
def entity_parameters
|
@@ -1,5 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Managing poll questions
|
1
4
|
class PollQuestionsController < AdminController
|
2
|
-
before_action :set_entity, only: [
|
5
|
+
before_action :set_entity, only: %i[edit update destroy]
|
6
|
+
|
7
|
+
# post /poll_questions/check
|
8
|
+
def check
|
9
|
+
@entity = PollQuestion.instance_for_check(params[:entity_id], entity_parameters)
|
10
|
+
|
11
|
+
render 'shared/forms/check'
|
12
|
+
end
|
3
13
|
|
4
14
|
# post /poll_questions
|
5
15
|
def create
|
@@ -26,23 +36,19 @@ class PollQuestionsController < AdminController
|
|
26
36
|
|
27
37
|
# delete /poll_questions/:id
|
28
38
|
def destroy
|
29
|
-
if @entity.destroy
|
30
|
-
flash[:notice] = t('poll_questions.destroy.success')
|
31
|
-
end
|
39
|
+
flash[:notice] = t('.success') if @entity.destroy
|
32
40
|
redirect_to(admin_poll_path(id: @entity.poll_id))
|
33
41
|
end
|
34
42
|
|
35
43
|
protected
|
36
44
|
|
37
|
-
def
|
38
|
-
|
45
|
+
def component_class
|
46
|
+
Biovision::Components::PollsComponent
|
39
47
|
end
|
40
48
|
|
41
49
|
def set_entity
|
42
50
|
@entity = PollQuestion.find_by(id: params[:id])
|
43
|
-
if @entity.nil?
|
44
|
-
handle_http_404('Cannot find poll question')
|
45
|
-
end
|
51
|
+
handle_http_404('Cannot find poll question') if @entity.nil?
|
46
52
|
end
|
47
53
|
|
48
54
|
def entity_parameters
|
@@ -1,8 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Displaying and editing polls
|
1
4
|
class PollsController < ApplicationController
|
2
|
-
before_action :restrict_access, except: [
|
3
|
-
before_action :set_entity, except: [
|
4
|
-
|
5
|
-
layout 'admin', except: [
|
5
|
+
before_action :restrict_access, except: %i[index show results answer]
|
6
|
+
before_action :set_entity, except: %i[check index new create]
|
7
|
+
|
8
|
+
layout 'admin', except: %i[check index show results]
|
9
|
+
|
10
|
+
# post /polls/check
|
11
|
+
def check
|
12
|
+
@entity = Poll.instance_for_check(params[:entity_id], entity_parameters)
|
13
|
+
|
14
|
+
render 'shared/forms/check'
|
15
|
+
end
|
6
16
|
|
7
17
|
# get /polls
|
8
18
|
def index
|
@@ -26,9 +36,7 @@ class PollsController < ApplicationController
|
|
26
36
|
|
27
37
|
# get /polls/:id
|
28
38
|
def show
|
29
|
-
unless @entity.visible_to?(current_user)
|
30
|
-
redirect_to polls_path
|
31
|
-
end
|
39
|
+
redirect_to polls_path unless @entity.visible_to?(current_user)
|
32
40
|
end
|
33
41
|
|
34
42
|
# get /polls/:id/edit
|
@@ -46,17 +54,15 @@ class PollsController < ApplicationController
|
|
46
54
|
|
47
55
|
# delete /polls/:id
|
48
56
|
def destroy
|
49
|
-
if @entity.destroy
|
50
|
-
flash[:notice] = t('polls.destroy.success')
|
51
|
-
end
|
57
|
+
flash[:notice] = t('.success') if @entity.destroy
|
52
58
|
redirect_to(admin_polls_path)
|
53
59
|
end
|
54
60
|
|
55
61
|
# post /polls/:id/results
|
56
62
|
def answer
|
57
|
-
@entity.process_answers(current_user, params.require(:answer))
|
63
|
+
@entity.process_answers(current_user, params.require(:answer), owner_for_entity(true), visitor_slug)
|
58
64
|
|
59
|
-
redirect_to
|
65
|
+
redirect_to results_poll_path(id: @entity.id)
|
60
66
|
end
|
61
67
|
|
62
68
|
# get /polls/:id/results
|
@@ -66,15 +72,18 @@ class PollsController < ApplicationController
|
|
66
72
|
|
67
73
|
protected
|
68
74
|
|
75
|
+
def component_class
|
76
|
+
Biovision::Components::PollsComponent
|
77
|
+
end
|
78
|
+
|
69
79
|
def restrict_access
|
70
|
-
|
80
|
+
error = 'Managing polls is not allowed for current user'
|
81
|
+
handle_http_401(error) unless component_handler.allow?
|
71
82
|
end
|
72
83
|
|
73
84
|
def set_entity
|
74
85
|
@entity = Poll.find_by(id: params[:id])
|
75
|
-
if @entity.nil?
|
76
|
-
handle_http_404('Cannot find poll')
|
77
|
-
end
|
86
|
+
handle_http_404('Cannot find poll') if @entity.nil?
|
78
87
|
end
|
79
88
|
|
80
89
|
def entity_parameters
|
data/app/helpers/polls_helper.rb
CHANGED
@@ -1,42 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Helper methods for polls component
|
1
4
|
module PollsHelper
|
2
5
|
# @param [Poll] entity
|
3
|
-
|
4
|
-
|
6
|
+
# @param [String] text
|
7
|
+
# @param [Hash] options
|
8
|
+
def admin_poll_link(entity, text = entity.name, options = {})
|
9
|
+
link_to(text, admin_poll_path(id: entity.id), options)
|
5
10
|
end
|
6
11
|
|
7
12
|
# @param [PollQuestion] entity
|
8
|
-
|
9
|
-
|
13
|
+
# @param [String] text
|
14
|
+
# @param [Hash] options
|
15
|
+
def admin_poll_question_link(entity, text = entity.text, options = {})
|
16
|
+
link_to(text, admin_poll_question_path(id: entity.id), options)
|
10
17
|
end
|
11
18
|
|
12
19
|
# @param [PollAnswer] entity
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
# @param [Poll] entity
|
18
|
-
def poll_link(entity)
|
19
|
-
link_to(entity.name, poll_path(id: entity.id))
|
20
|
-
end
|
21
|
-
|
22
|
-
# @param [Poll] entity
|
23
|
-
def poll_image_medium(entity)
|
24
|
-
return '' if entity.image.blank?
|
25
|
-
versions = "#{entity.image.medium_2x.url} 2x"
|
26
|
-
image_tag(entity.image.medium.url, alt: entity.name, srcset: versions)
|
27
|
-
end
|
28
|
-
|
29
|
-
# @param [Poll] entity
|
30
|
-
def poll_image_small(entity)
|
31
|
-
return '' if entity.image.blank?
|
32
|
-
versions = "#{entity.image.medium.url} 2x"
|
33
|
-
image_tag(entity.image.small.url, alt: entity.name, srcset: versions)
|
20
|
+
# @param [String] text
|
21
|
+
# @param [Hash] options
|
22
|
+
def admin_poll_answer_link(entity, text = entity.text, options = {})
|
23
|
+
link_to(text, admin_poll_answer_path(id: entity.id), options)
|
34
24
|
end
|
35
25
|
|
36
26
|
# @param [Poll] entity
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
27
|
+
# @param [String] text
|
28
|
+
# @param [Hash] options
|
29
|
+
def poll_link(entity, text = entity.name, options = {})
|
30
|
+
link_to(text, poll_path(id: entity.id), options)
|
41
31
|
end
|
42
32
|
end
|
data/app/models/poll.rb
CHANGED
@@ -1,49 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Poll
|
4
|
+
#
|
5
|
+
# Attributes:
|
6
|
+
# active [boolean]
|
7
|
+
# agent_id [Agent], optional
|
8
|
+
# allow_comments [Boolean]
|
9
|
+
# anonymous_votes [boolean]
|
10
|
+
# comments_count [integer]
|
11
|
+
# created_at [DateTime]
|
12
|
+
# data [jsonb]
|
13
|
+
# description [string], optional
|
14
|
+
# end_date [date], optional
|
15
|
+
# exclusive [boolean]
|
16
|
+
# ip [inet]
|
17
|
+
# language_id [Language], optional
|
18
|
+
# name [string]
|
19
|
+
# open_results [boolean]
|
20
|
+
# poll_questions_count [integer]
|
21
|
+
# pollable_id [integer], optional
|
22
|
+
# pollable_type [string], optional
|
23
|
+
# show_on_homepage [boolean]
|
24
|
+
# simple_image_id [SimpleImage], optional
|
25
|
+
# updated_at [DateTime]
|
26
|
+
# user_id [User]
|
27
|
+
# uuid [uuid]
|
28
|
+
# visible [boolean]
|
1
29
|
class Poll < ApplicationRecord
|
30
|
+
include Checkable
|
2
31
|
include HasOwner
|
32
|
+
include HasSimpleImage
|
33
|
+
include HasUuid
|
3
34
|
include Toggleable
|
4
35
|
|
5
|
-
PER_PAGE = 10
|
6
36
|
NAME_LIMIT = 140
|
7
37
|
DESCRIPTION_LIMIT = 255
|
8
38
|
|
9
|
-
toggleable %i[active anonymous_votes open_results show_on_homepage visible
|
10
|
-
|
11
|
-
mount_uploader :image, PollImageUploader
|
39
|
+
toggleable %i[active anonymous_votes open_results show_on_homepage exclusive visible]
|
12
40
|
|
13
41
|
belongs_to :user
|
14
42
|
belongs_to :agent, optional: true
|
15
|
-
belongs_to :region, optional: true if Gem.loaded_specs.key?('biovision-regions')
|
16
43
|
belongs_to :pollable, polymorphic: true, optional: true
|
17
44
|
has_many :poll_questions, dependent: :delete_all
|
18
45
|
has_many :poll_users, dependent: :delete_all
|
19
46
|
|
20
47
|
validates_presence_of :name
|
21
|
-
validates_length_of :name, maximum: NAME_LIMIT
|
22
48
|
validates_length_of :description, maximum: DESCRIPTION_LIMIT
|
49
|
+
validates_length_of :name, maximum: NAME_LIMIT
|
23
50
|
|
24
51
|
scope :recent, -> { order('id desc') }
|
25
52
|
scope :visible, -> { where(visible: true) }
|
26
|
-
scope :active, -> {
|
53
|
+
scope :active, -> { where('active = true and (end_date is null or (date(end_date) >= date(now())))') }
|
54
|
+
scope :list_for_visitors, -> { active.visible.recent }
|
55
|
+
scope :list_for_administration, -> { recent }
|
27
56
|
|
28
57
|
# @param [Integer] page
|
29
58
|
def self.page_for_administration(page = 1)
|
30
|
-
|
59
|
+
list_for_administration.page(page)
|
31
60
|
end
|
32
61
|
|
33
62
|
# @param [Integer] page
|
34
63
|
def self.page_for_visitors(page = 1)
|
35
|
-
|
64
|
+
list_for_visitors.page(page)
|
36
65
|
end
|
37
66
|
|
38
67
|
def self.entity_parameters
|
39
|
-
Poll.toggleable_attributes + %i
|
68
|
+
Poll.toggleable_attributes + %i[description end_date name simple_image_id]
|
40
69
|
end
|
41
70
|
|
42
71
|
# @param [User] user
|
43
72
|
def editable_by?(user)
|
44
73
|
return false if user.nil?
|
45
|
-
|
46
|
-
owned_by?(user)
|
74
|
+
|
75
|
+
owned_by?(user)
|
47
76
|
end
|
48
77
|
|
49
78
|
# @param [User] user
|
@@ -54,6 +83,7 @@ class Poll < ApplicationRecord
|
|
54
83
|
# @param [User] user
|
55
84
|
def votable_by?(user)
|
56
85
|
return false if user.nil? || voted?(user)
|
86
|
+
|
57
87
|
if exclusive?
|
58
88
|
includes?(user)
|
59
89
|
# elsif anonymous_votes?
|
@@ -72,10 +102,6 @@ class Poll < ApplicationRecord
|
|
72
102
|
open_results? || editable_by?(user)
|
73
103
|
end
|
74
104
|
|
75
|
-
def regional?
|
76
|
-
!region_id.nil?
|
77
|
-
end
|
78
|
-
|
79
105
|
# @param [User] user
|
80
106
|
def includes?(user)
|
81
107
|
poll_users.owned_by(user).exists?
|
@@ -97,18 +123,24 @@ class Poll < ApplicationRecord
|
|
97
123
|
|
98
124
|
# @param [User] user
|
99
125
|
# @param [Hash] answers
|
100
|
-
|
126
|
+
# @param [Hash] tracking
|
127
|
+
# @param [String] slug
|
128
|
+
def process_answers(user, answers, tracking, slug)
|
101
129
|
return unless votable_by?(user)
|
130
|
+
|
102
131
|
answers.each do |question_id, answer_ids|
|
103
132
|
question = PollQuestion.find_by(id: question_id)
|
104
133
|
next if question.nil? || question.poll_id != id
|
134
|
+
|
105
135
|
if question.multiple_choice?
|
106
136
|
answers = question.poll_answers.where(id: answer_ids)
|
107
137
|
else
|
108
138
|
answers = question.poll_answers.where(id: answer_ids.first)
|
109
139
|
end
|
140
|
+
|
110
141
|
answers.each do |answer|
|
111
|
-
|
142
|
+
tracking[:slug] = slug
|
143
|
+
answer.poll_votes.create(tracking)
|
112
144
|
end
|
113
145
|
end
|
114
146
|
end
|