Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ gem "aws-sdk-s3"
gem "dalli"
gem "dotenv-rails", "~> 2.7"
gem "letter_opener_web", "~> 2.0"
gem "multipart-post"
gem "spring"

group :development, :test do
Expand Down
24 changes: 2 additions & 22 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -301,14 +301,6 @@ GEM
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
carrierwave (2.2.6)
activemodel (>= 5.0.0)
activesupport (>= 5.0.0)
addressable (~> 2.6)
image_processing (~> 1.1)
marcel (~> 1.0.0)
mini_mime (>= 0.1.3)
ssrf_filter (~> 1.0)
cells (4.1.8)
declarative-builder (~> 0.2.0)
declarative-option (< 0.2.0)
Expand Down Expand Up @@ -409,23 +401,13 @@ GEM
activemodel (>= 3.2)
mime-types (>= 1.0)
flamegraph (0.9.5)
fog-aws (3.21.0)
fog-core (~> 2.1)
fog-json (~> 1.1)
fog-xml (~> 0.1)
fog-core (2.6.0)
builder
excon (~> 1.0)
formatador (>= 0.2, < 2.0)
mime-types
fog-json (1.2.0)
fog-core
multi_json (~> 1.10)
fog-local (0.8.0)
fog-core (>= 1.27, < 3.0)
fog-xml (0.1.4)
fog-core
nokogiri (>= 1.5.11, < 2.0.0)
formatador (1.1.0)
foundation_rails_helper (4.0.1)
actionpack (>= 4.1, < 7.1)
Expand Down Expand Up @@ -532,9 +514,9 @@ GEM
mini_mime (1.1.5)
minitest (5.25.1)
msgpack (1.7.5)
multi_json (1.15.0)
multi_xml (0.7.1)
bigdecimal (~> 3.1)
multipart-post (2.4.1)
net-http (0.5.0)
uri
net-imap (0.5.1)
Expand Down Expand Up @@ -813,7 +795,6 @@ GEM
spring-watcher-listen (2.1.0)
listen (>= 2.7, < 4.0)
spring (>= 4)
ssrf_filter (1.1.2)
stackprof (0.2.26)
stringio (3.1.2)
temple (0.10.3)
Expand Down Expand Up @@ -892,7 +873,6 @@ DEPENDENCIES
brakeman (~> 6.1)
bullet
byebug (~> 11.0)
carrierwave
dalli
decidim-accountability!
decidim-admin!
Expand All @@ -914,10 +894,10 @@ DEPENDENCIES
decidim-verifications!
dotenv-rails (~> 2.7)
flamegraph
fog-aws
letter_opener_web (~> 2.0)
listen (~> 3.1)
memory_profiler
multipart-post
parallel_tests (~> 4.2)
puma (>= 6.3.1)
rack-mini-profiler
Expand Down
18 changes: 18 additions & 0 deletions app/views/layouts/decidim/admin/assemblies.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<% content_for :breadcrumb_context_menu do %>
<div class="process-title-content-breadcrumb-container-right">
<% if allowed_to? :create, :assembly, assembly: (parent_assembly if defined?(parent_assembly) && parent_assembly.present?) %>
<% link = defined?(parent_assembly) ? new_assembly_path(parent_id: parent_assembly&.id) : new_assembly_path %>
<%= link_to link, class: "button button__sm button__transparent process-title-content-breadcrumb-container-right-link" do %>
<%= icon "add-line", class: "w-4 h-4" %>
<span>
<%= t("actions.new_assembly", scope: "decidim.admin") %>
</span>
<% end %>
<% end %>
<%= render partial: "layouts/decidim/admin/manage_assemblies" %>
</div>
<% end %>

<%= render "layouts/decidim/admin/application" do %>
<%= yield %>
<% end %>
61 changes: 61 additions & 0 deletions lib/decidim_app/k8s/commands/admin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# frozen_string_literal: true

require "decidim_app/k8s/manager"
require "decidim/core"

module DecidimApp
module K8s
module Commands
class Admin
def self.run(configuration, organization)
new(configuration, organization).run
end

def initialize(configuration, organization)
@configuration = configuration
@organization = organization
end

def run
mapped_attributes = Decidim::AccountForm.from_model(existing_admin)
.attributes_with_values
.except(:avatar)
form = Decidim::AccountForm.from_params(mapped_attributes.merge(admin_params))
.with_context(current_user: existing_admin,
current_organization: @organization)

Decidim::UpdateAccount.call(existing_admin, form) do
on(:ok) do
K8s::Manager.logger.info("Admin user #{form.nickname} updated")
end

on(:invalid) do
K8s::Manager.logger.info("Admin user #{form.nickname} could not be updated")
form.tap(&:valid?).errors.messages.each do |error|
K8s::Manager.logger.info(error)
end

raise "Admin user #{form.nickname} could not be updated"
end
end

existing_admin.reload
end

def existing_admin
@existing_admin ||= Decidim::User.find_by(email: @configuration[:email], organization: @organization).tap(&:skip_confirmation!)
end

def admin_params
@admin_params ||= {
password_confirmation: @configuration[:password],
tos_agreement: "1",
newsletter_notifications_at: existing_admin.confirmed_at || Time.zone.now,
admin_terms_accepted_at: existing_admin.confirmed_at || Time.zone.now,
confirmed_at: existing_admin.confirmed_at || Time.zone.now
}.merge(@configuration)
end
end
end
end
end
109 changes: 109 additions & 0 deletions lib/decidim_app/k8s/commands/organization.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# frozen_string_literal: true

require "decidim_app/k8s/manager"

module DecidimApp
module K8s
module Commands
class Organization
def self.run(configuration, default_admin_configuration)
new(configuration, default_admin_configuration).run
end

def initialize(configuration, default_admin_configuration)
@configuration = configuration
@default_admin_name = default_admin_configuration[:name]
@default_admin_email = default_admin_configuration[:email]
end

def run
if existing_organization
K8s::Manager.logger.info("Organization #{@configuration[:name]} already exist")

update
else
K8s::Manager.logger.info("Installing organization : '#{@configuration[:name]}'")

install
end
end

def install
form = Decidim::System::RegisterOrganizationForm.from_params(
@configuration.merge(
organization_admin_email: @default_admin_email,
organization_admin_name: @default_admin_name
)
)

Decidim::System::RegisterOrganization.call(form) do
on(:ok) do
K8s::Manager.logger.info("Organization #{form.name} created")
update
end

on(:invalid) do
K8s::Manager.logger.info("Organization #{form.name} could not be created")
form.tap(&:valid?).errors.messages.each do |error|
K8s::Manager.logger.info(error)
end

raise "Organization #{form.name} could not be created"
end
end

existing_organization
end

def update
form = Decidim::System::UpdateOrganizationForm.from_params(update_params)

Decidim::System::UpdateOrganization.call(existing_organization.id, form) do
on(:ok) do
K8s::Manager.logger.info("Organization #{form.name} updated")
end

on(:invalid) do
K8s::Manager.logger.info("Organization #{form.name} could not be updated")
form.tap(&:valid?).errors.messages.each do |error|
K8s::Manager.logger.info(error)
end

raise "Organization #{form.name} could not be updated"
end
end

existing_organization.reload
end

def existing_organization
Decidim::Organization.find_by(name: @configuration[:name]) || Decidim::Organization.find_by(host: @configuration[:host])
end

def existing_organization_attributes
Decidim::System::UpdateOrganizationForm.from_model(existing_organization).attributes_with_values.deep_symbolize_keys
end

def update_params
params = existing_organization_attributes.deep_merge(
@configuration.except(:smtp_settings, :omniauth_settings)
).merge(id: existing_organization.id)

@configuration.fetch(:smtp_settings, {}).each do |key, value|
params.merge!(key => value)
end

@configuration.fetch(:omniauth_settings, {}).each do |provider, config|
config.each do |key, value|
params.merge!("omniauth_settings_#{provider}_#{key}" => value)
end
end

params[:encrypted_password] = nil if @configuration.dig(:smtp_settings, :password).present?

params
end
end
end
end
end
36 changes: 36 additions & 0 deletions lib/decidim_app/k8s/commands/system_admin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# frozen_string_literal: true

require "decidim_app/k8s/manager"

module DecidimApp
module K8s
module Commands
class SystemAdmin
def self.run(configuration)
new(configuration).run
end

def initialize(configuration)
@configuration = configuration
end

def run
system_admin = Decidim::System::Admin.find_or_initialize_by(email: @configuration[:email])

if system_admin.update(@configuration)
K8s::Manager.logger.info("System admin user #{system_admin.email} updated")
else
K8s::Manager.logger.info("System admin user #{system_admin.email} could not be updated")
system_admin.tap(&:valid?).errors.messages.each do |error|
K8s::Manager.logger.info(error)
end

raise "System admin user #{system_admin.email} could not be updated"
end

system_admin.reload
end
end
end
end
end
75 changes: 75 additions & 0 deletions lib/decidim_app/k8s/configuration.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# frozen_string_literal: true

module DecidimApp
module K8s
class Configuration
attr_reader :organizations, :system_admin, :default_admin

TRANSFORMS_METHODS = {
to_string_separated_by_new_line: ->(value) { value.join("\n") },
to_string_separated_by_comma: ->(value) { value.join(",") }
}.freeze

TRANSFORMS = {
secondary_hosts: :to_string_separated_by_new_line,
file_upload_settings_allowed_file_extensions_admin: :to_string_separated_by_comma,
file_upload_settings_allowed_file_extensions_image: :to_string_separated_by_comma,
file_upload_settings_allowed_file_extensions_default: :to_string_separated_by_comma,
file_upload_settings_allowed_content_types_admin: :to_string_separated_by_comma,
file_upload_settings_allowed_content_types_default: :to_string_separated_by_comma
}.freeze

def initialize(path)
@parsed_configuration = YAML.load_file(path).deep_symbolize_keys
@organizations = set_organizations
@system_admin = @parsed_configuration[:system_admin]
@default_admin = @parsed_configuration[:default_admin]
end

def valid?
instance_variables.none? do |variable|
instance_variable_get(variable).nil?
end
end

def errors
return [] if valid?

instance_variables.select { |variable| instance_variable_get(variable).nil? }
.map { |variable| "#{variable.to_s.gsub("@", "")} is required" }
.join(", ")
end

private

def set_organizations
organizations = @parsed_configuration[:organizations].is_a?(Hash) ? [@parsed_configuration[:organizations]] : @parsed_configuration[:organizations]

organizations&.map { |organization| deep_transform(organization) } || []
end

# Transforms the keys based on the TRANSFORMS present
# Return a new hash with the transformed keys
# Example:
# To match against { file_upload_settings: { allowed_file_extensions: { admin } } }
# file_upload_settings_allowed_file_extensions_admin: ->(value) { value.join(",") }
def deep_transform(hash, prefix = "")
hash.each_with_object({}) do |(key, value), new_hash|
match_key = prefix.present? ? "#{prefix}_#{key}".to_sym : key

new_hash[key] = if value.is_a?(Hash)
deep_transform(value, match_key)
else
transform(match_key, value)
end
end
end

def transform(match_key, value)
return value unless TRANSFORMS[match_key]

TRANSFORMS_METHODS[TRANSFORMS[match_key]].call(value)
end
end
end
end
Loading