Skip to content

Commit

Permalink
Merge branch 'memoization' into bump-version
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Vergés authored and Ivan Vergés committed Dec 3, 2024
2 parents 7a755bc + f66fabc commit ce36dfe
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 32 deletions.
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ GEM
uber (0.1.0)
unicode-display_width (2.6.0)
uniform_notifier (1.16.0)
uri (0.13.1)
uri (1.0.2)
valid_email2 (4.0.6)
activemodel (>= 3.2)
mail (~> 2.5)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ module ProposalLCellOverride
alias_method :decidim_original_cache_hash, :cache_hash

def metadata_cell
awesome_voting_manifest_for(resource&.component)&.proposal_metadata_cell.presence || "decidim/proposals/proposal_metadata"
@metadata_cell ||= awesome_voting_manifest_for(resource&.component)&.proposal_metadata_cell.presence || "decidim/proposals/proposal_metadata"
end

def cache_hash
extra_hash = model.extra_fields&.reload&.vote_weight_totals
"#{decidim_original_cache_hash}#{Decidim.cache_key_separator}#{extra_hash}"
@cache_hash ||= "#{decidim_original_cache_hash}#{Decidim.cache_key_separator}#{model.extra_fields&.vote_weight_totals}"
end
end
end
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# frozen_string_literal: true

require "decidim/decidim_awesome/awesome_helpers"

module Decidim
module DecidimAwesome
module NeedsAwesomeConfig
Expand Down
14 changes: 14 additions & 0 deletions config/locales/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ fr:
%{warning}
Ce texte peut être personnalisé avec une traduction personnalisée en utilisant la clé:
%{key}
scoped_admin_styles: Soyez conscient que cacher des éléments pourrait rendre l'interface administrateur inutilisable. Agissez avec prudence.
scoped_admin_styles_variables: 'Vous pouvez utiliser les variables CSS suivantes pour les couleurs personnalisées de l''organisation :'
scoped_admins: Promouvoir les utilisateurs réguliers en administrateurs qui ne peuvent administrer que certaines parties de la plateforme (utilisez l'éditeur de restrictions pour cela). Notez que les utilisateurs qui ont déjà les permissions d'administration habituelles seront ignorés.
scoped_styles: Créer un CSS personnalisé qui s'applique uniquement à certaines parties du site web public (front-end) (utilisez l'éditeur de restrictions pour cela)
Expand Down Expand Up @@ -409,6 +410,7 @@ fr:
proposals: Hacks pour les propositions
styles: Styles personnalisés
surveys: Enquêtes et formulaires
verifications: Vérifications
menu_hacks:
create:
error: Erreur lors de la création de l'élément de menu ! %{error}
Expand Down Expand Up @@ -447,6 +449,11 @@ fr:
error: Erreur lors de la mise à jour de l'élément de menu ! %{error}
success: Élément de menu mis à jour avec succès
url_exists: La même URL est déjà configurée, veuillez la modifier au lieu de la créer à nouveau.
officializations:
authorizations: Autorisations
verification_modal:
authorizations_for: Autorisations pour %{user}
close: Fermer
proposal_custom_fields:
menu:
title: Champs publiques
Expand Down Expand Up @@ -528,6 +535,13 @@ fr:
view_meeting: Voir la rencontre
view_proposal: Voir la proposition
proposal_private_custom_fields_disclosure: Cette information ne sera pas publiée
required_authorizations:
index:
cancel: Je vais le faire ultérieurement, %{link}.
granted_title: Vérifications accordées
missing_title: Pas encore vérifié
resume_title: Vérifications en attente
title: Vérifiez votre identité
validators:
too_much_caps: Utilise trop de majuscule (plus de %{percent} du texte)
voting:
Expand Down
2 changes: 2 additions & 0 deletions lib/decidim/decidim_awesome/awesome.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ module Decidim
module DecidimAwesome
include ActiveSupport::Configurable

autoload :AwesomeHelpers, "decidim/decidim_awesome/awesome_helpers"
autoload :RequestMemoizer, "decidim/decidim_awesome/request_memoizer"
autoload :Config, "decidim/decidim_awesome/config"
autoload :SystemChecker, "decidim/decidim_awesome/system_checker"
autoload :ContextAnalyzers, "decidim/decidim_awesome/context_analyzers"
Expand Down
61 changes: 39 additions & 22 deletions lib/decidim/decidim_awesome/awesome_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,27 @@ module Decidim
# add a global helper with awesome configuration
module DecidimAwesome
module AwesomeHelpers
include RequestMemoizer

# Returns the normalized config for an Organization and the current url
def awesome_config_instance
return @awesome_config_instance if @awesome_config_instance

# if already created in the middleware, reuse it as it might have additional constraints
@awesome_config_instance = request.env["decidim_awesome.current_config"]
unless @awesome_config_instance.is_a? Config
@awesome_config_instance = Config.new request.env["decidim.current_organization"]
@awesome_config_instance.context_from_request request
memoize("current_config") do
config = Config.new(request.env["decidim.current_organization"])
config.context_from_request(request)
config
end
@awesome_config_instance
end

def awesome_config
@awesome_config ||= awesome_config_instance.config
memoize("awesome_config") do
awesome_config_instance.config
end
end

def javascript_config_vars
awesome_config.slice(:allow_images_in_proposals, :allow_images_in_editors, :allow_videos_in_editors, :auto_save_forms).to_json.html_safe
memoize("javascript_config_vars") do
awesome_config.slice(:allow_images_in_proposals, :allow_images_in_editors, :allow_videos_in_editors, :auto_save_forms).to_json.html_safe
end
end

def show_public_intergram?
Expand All @@ -35,11 +37,15 @@ def show_public_intergram?
end

def unfiltered_awesome_config
@unfiltered_awesome_config ||= awesome_config_instance.unfiltered_config
memoize("unfiltered_awesome_config") do
awesome_config_instance.unfiltered_config
end
end

def organization_awesome_config
@organization_awesome_config ||= awesome_config_instance.organization_config
memoize("organization_awesome_config") do
awesome_config_instance.organization_config
end
end

def awesome_version
Expand All @@ -48,40 +54,51 @@ def awesome_version

# Collects all CSS that is applied in the current URL context
def awesome_scoped_styles
@awesome_scoped_styles ||= awesome_config_instance.collect_sub_configs_values("scoped_style")
memoize("awesome_scoped_styles") do
awesome_config_instance.collect_sub_configs_values("scoped_style")
end
end

# Collects all CSS that is applied in the current URL context
def awesome_scoped_admin_styles
@awesome_scoped_admin_styles ||= awesome_config_instance.collect_sub_configs_values("scoped_admin_style")
memoize("awesome_scoped_admin_styles") do
awesome_config_instance.collect_sub_configs_values("scoped_admin_style")
end
end

# Collects all proposal custom fields that is applied in the current URL context
def awesome_scoped_admins
@awesome_scoped_admins ||= awesome_config_instance.collect_sub_configs_values("scoped_admin")
memoize("awesome_scoped_admins") do
awesome_config_instance.collect_sub_configs_values("scoped_admin")
end
end

# Collects all proposal custom fields that is applied in the current URL context
def awesome_proposal_custom_fields
@awesome_proposal_custom_fields ||= awesome_config_instance.collect_sub_configs_values("proposal_custom_field")
memoize("awesome_proposal_custom_fields") do
awesome_config_instance.collect_sub_configs_values("proposal_custom_field")
end
end

def awesome_proposal_private_custom_fields
@awesome_proposal_private_custom_fields ||= awesome_config_instance.collect_sub_configs_values("proposal_private_custom_field")
memoize("awesome_proposal_private_custom_fields") do
awesome_config_instance.collect_sub_configs_values("proposal_private_custom_field")
end
end

# this will check if the current component has been configured to use a custom voting manifest
def awesome_voting_manifest_for(component)
return nil unless component.settings.respond_to? :awesome_voting_manifest

DecidimAwesome.voting_registry.find(component.settings.awesome_voting_manifest)
memoize("awesome_voting_manifest_for_#{component.id}") do
DecidimAwesome.voting_registry.find(component.settings.try(:awesome_voting_manifest))
end
end

# Retrives all the "admins_available_authorizations" for the user along with other possible authorizations
# returns an instance of Decidim::DecidimAwesome::Authorizator
def awesome_authorizations_for(user)
@awesome_authorizations_for ||= {}
@awesome_authorizations_for[user.id] ||= Authorizator.new(user, awesome_config[:admins_available_authorizations])
memoize("awesome_authorizations_for_#{user.id}") do
Authorizator.new(user, awesome_config[:admins_available_authorizations])
end
end

def version_prefix
Expand Down
4 changes: 0 additions & 4 deletions lib/decidim/decidim_awesome/engine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ class Engine < ::Rails::Engine
# https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
# overrides
config.to_prepare do
# activate Decidim LayoutHelper for the overriden views
ActiveSupport.on_load :action_controller do
helper Decidim::LayoutHelper if respond_to?(:helper)
end
# Include additional helpers globally
ActiveSupport.on_load(:action_view) { include Decidim::DecidimAwesome::AwesomeHelpers }
# Also for cells
Expand Down
14 changes: 14 additions & 0 deletions lib/decidim/decidim_awesome/request_memoizer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Decidim
module DecidimAwesome
module RequestMemoizer
# memoize a piece of code in the global request instead of the helper instance (helpers are initialized for each view)
def memoize(key)
return yield unless defined?(request) && request.env["decidim.current_organization"]&.id

request.env["decidim_awesome.#{key}"] ||= yield
end
end
end
end
3 changes: 3 additions & 0 deletions spec/cells/proposal_l_cell_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ module Proposals
let!(:component) { create(:proposal_component, :with_votes_enabled, organization:, settings: { awesome_voting_manifest: manifest }) }
let!(:extra_fields) { create(:awesome_proposal_extra_fields, proposal:) }
let(:proposal) { create(:proposal, component:) }
let(:request) { double(host: "example.org", env: {}) }

before do
allow(subject).to receive(:request).and_return(request)
Decidim::DecidimAwesome.voting_registry.register(:another_voting_system) do |voting|
voting.show_vote_button_view = ""
voting.show_votes_count_view = ""
Expand Down Expand Up @@ -41,6 +43,7 @@ module Proposals
extra_fields.update_column(:vote_weight_totals, 100)
# rubocop:enable Rails/SkipsModelValidations
proposal.reload
subject.instance_variable_set(:@cache_hash, nil)
expect(cache1).not_to eq(subject.send(:cache_hash))
end
end
Expand Down

0 comments on commit ce36dfe

Please sign in to comment.