Skip to content

Commit 87a2218

Browse files
committed
[WIP] feat(reversibility): add meetings to component bundle
1 parent d8654cc commit 87a2218

9 files changed

Lines changed: 413 additions & 14 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
module Decidim
4+
module Content
5+
class MeetingInviteSerializer < Decidim::Exporters::Serializer
6+
include Decidim::Content::SerializerTools
7+
8+
def serialize
9+
{
10+
uid: uid(resource),
11+
user: uid(Decidim::User.new(id: resource.try(:decidim_user_id))),
12+
meeting: uid(Decidim::Meetings::Meeting.new(id: resource.try(:decidim_meeting_id))),
13+
sent_at: resource.sent_at,
14+
accepted_at: resource.accepted_at,
15+
rejected_at: resource.rejected_at
16+
}
17+
end
18+
end
19+
end
20+
end
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# frozen_string_literal: true
2+
3+
module Decidim
4+
module Content
5+
class MeetingPollAnswersSerializer < Decidim::Exporters::Serializer
6+
include Decidim::Content::SerializerTools
7+
8+
def initialize(answers)
9+
@answers = answers
10+
end
11+
12+
attr_reader :answers
13+
alias resource answers
14+
15+
def serialize
16+
{
17+
**user_data,
18+
questionnaire_id: answers&.first&.decidim_questionnaire_id,
19+
created_at: answers&.first&.created_at,
20+
**questions_hash
21+
}
22+
end
23+
24+
def user_data
25+
if answers&.first&.decidim_user_id.present?
26+
{
27+
author: uid(Decidim::User.new(id: answers&.first&.decidim_user_id)),
28+
author_status: "registered"
29+
}
30+
else
31+
{
32+
author: nil,
33+
author_status: "unregistered"
34+
}
35+
end
36+
end
37+
38+
def questions_hash
39+
questionnaire_id = answers&.first&.decidim_questionnaire_id
40+
return {} unless questionnaire_id
41+
42+
questions = Decidim::Meetings::Question.where(decidim_questionnaire_id: questionnaire_id).order(:position)
43+
return {} if questions.none?
44+
45+
answers_hash = answers.each.inject({}) do |result, answer|
46+
result.update(
47+
answer.question.id => answer
48+
)
49+
end
50+
51+
questions.each.inject({}) do |serialized, question|
52+
serialized.update(
53+
uid(question) => normalize_body(answers_hash[question.id])
54+
)
55+
end
56+
end
57+
58+
def normalize_body(answer)
59+
normalize_choices(answer&.choices)
60+
end
61+
62+
def normalize_choices(choices)
63+
choices&.order(:position)&.map { |choice| normalize_single_choice(choice) }
64+
end
65+
66+
def normalize_single_choice(choice)
67+
{
68+
answer_option: uid(Decidim::Meetings::AnswerOption.new(id: choice.decidim_answer_option_id)),
69+
position: choice.try(:position),
70+
body: choice.try(:body),
71+
custom_body: choice.try(:custom_body)
72+
}
73+
end
74+
end
75+
end
76+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
module Decidim
4+
module Content
5+
class MeetingRegistrationSerializer < Decidim::Exporters::Serializer
6+
include Decidim::Content::SerializerTools
7+
8+
def serialize
9+
{
10+
uid: uid(resource),
11+
user: uid(Decidim::User.new(id: resource.try(:decidim_user_id))),
12+
user_group: uid(Decidim::UserGroup.new(id: resource.try(:decidim_user_group_id))),
13+
meeting: uid(Decidim::Meetings::Meeting.new(id: resource.try(:decidim_meeting_id))),
14+
code: resource.try(:code),
15+
validated_at: resource.try(:validated_at),
16+
public_participation: resource.try(:public_participation),
17+
created_at: resource.try(:created_at),
18+
updated_at: resource.try(:updated_at)
19+
}
20+
end
21+
end
22+
end
23+
end
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# frozen_string_literal: true
2+
3+
module Decidim
4+
module Content
5+
class MeetingSerializer < Decidim::Exporters::Serializer
6+
include Decidim::Content::SerializerTools
7+
8+
def serialize
9+
{
10+
uid: uid(resource),
11+
author: uid(identity(resource)),
12+
category: uid(resource.try(:category)),
13+
scope: uid(resource.try(:scope)),
14+
title: normalize_translated_attribute(resource.try(:title)),
15+
description: normalize_translated_attribute(resource.try(:description)),
16+
start_time: resource.try(:start_time),
17+
end_time: resource.try(:end_time),
18+
type_of_meeting: resource.try(:type_of_meeting),
19+
online_meeting_url: resource.try(:online_meeting_url),
20+
video_url: resource.try(:video_url),
21+
audio_url: resource.try(:audio_url),
22+
address: resource.try(:address),
23+
latitude: resource.try(:latitude),
24+
longitude: resource.try(:longitude),
25+
location: resource.try(:location),
26+
location_hints: resource.try(:location_hints),
27+
private_meeting: resource.try(:private_meeting),
28+
transparent: resource.try(:transparent),
29+
agenda: serialize_agenda,
30+
services: serialize_services,
31+
created_at: resource.try(:created_at),
32+
updated_at: resource.try(:updated_at),
33+
published_at: resource.try(:published_at),
34+
withdrawn: resource.withdrawn?,
35+
withdrawn_at: resource.try(:withdrawn_at),
36+
registrations_enabled: resource.try(:registrations_enabled),
37+
available_slots: resource.try(:available_slots),
38+
reserved_slots: resource.try(:reserved_slots),
39+
registration_terms: normalize_translated_attribute(resource.try(:registration_terms)),
40+
registration_type: resource.try(:registration_type),
41+
# enable_registration_confirmation: resource.try(:enable_registration_confirmation),
42+
# enable_cancellation: resource.try(:enable_cancellation),
43+
# disable_account_confirmation: resource.try(:disable_account_confirmation),
44+
customize_registration_email: resource.try(:customize_registration_email),
45+
registration_email_custom_content: normalize_translated_attribute(resource.try(:registration_email_custom_content)),
46+
salt: resource.try(:salt),
47+
registration_url: resource.try(:registration_url),
48+
registration_form_enabled: resource.try(:registration_form_enabled),
49+
registration_form: convert_questionnaire_json_to_uid(serialize_questionnaire(resource.try(:questionnaire))),
50+
attendees_count: resource.try(:attendees_count),
51+
contributions_count: resource.try(:contributions_count),
52+
attending_organizations: resource.try(:attending_organizations),
53+
poll: convert_questionnaire_json_to_uid(serialize_questionnaire(resource.try(:poll)&.questionnaire), module_prefix: "Decidim::Meetings"),
54+
comments_enabled: resource.try(:comments_enabled),
55+
comments_count: resource.try(:comments_count),
56+
comments_start_time: resource.try(:comments_start_time),
57+
comments_end_time: resource.try(:comments_end_time),
58+
followers_count: resource.try(:follows).try(:size),
59+
related_proposals: resource.linked_resources(:proposals, "proposals_from_meeting").map { |proposal| uid(proposal) },
60+
related_results: resource.linked_resources(:results, "meetings_through_proposals").map { |result| uid(result) },
61+
closing_visible: resource.try(:closing_visible),
62+
closing_report: normalize_translated_attribute(resource.try(:closing_report)),
63+
component: uid(resource.try(:component)),
64+
url: Decidim::ResourceLocatorPresenter.new(resource).url
65+
}
66+
end
67+
68+
def serialize_agenda
69+
return if (agenda = resource.try(:agenda)).blank?
70+
71+
{
72+
uid: uid(agenda),
73+
title: normalize_translated_attribute(agenda.try(:title)),
74+
description: normalize_translated_attribute(agenda.try(:description)),
75+
duration: agenda.try(:duration),
76+
items: agenda.agenda_items.first_class.map do |item|
77+
{
78+
uid: uid(item),
79+
title: normalize_translated_attribute(item.try(:title)),
80+
description: normalize_translated_attribute(item.try(:description)),
81+
duration: item.try(:duration),
82+
items: item.agenda_item_children.map do |child_item|
83+
{
84+
uid: uid(child_item),
85+
title: normalize_translated_attribute(child_item.try(:title)),
86+
description: normalize_translated_attribute(child_item.try(:description)),
87+
duration: child_item.try(:duration)
88+
}
89+
end
90+
}
91+
end
92+
}
93+
end
94+
95+
def serialize_services
96+
return if (services = resource.try(:services)).blank?
97+
98+
services.map do |service|
99+
{
100+
uid: uid(service),
101+
title: normalize_translated_attribute(service.try(:title)),
102+
description: normalize_translated_attribute(service.try(:description))
103+
}
104+
end
105+
end
106+
end
107+
end
108+
end

app/serializers/decidim/content/survey_answer_serializer.rb renamed to app/serializers/decidim/content/questionnaire_answers_serializer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Decidim
44
module Content
5-
class SurveyAnswerSerializer < Decidim::Exporters::Serializer
5+
class QuestionnaireAnswersSerializer < Decidim::Exporters::Serializer
66
include Decidim::Content::SerializerTools
77

88
EXCLUDED_QUESTION_TYPES = [
@@ -68,7 +68,7 @@ def normalize_body(question, answer)
6868
when "files"
6969
answer&.attachments&.map(&:url)
7070
else
71-
answer&.body
71+
answer&.try(:body)
7272
end
7373
end
7474

0 commit comments

Comments
 (0)