lib/spontaneous/plugins/aliases.rb in spontaneous-0.1.0.alpha1 vs lib/spontaneous/plugins/aliases.rb in spontaneous-0.2.0.alpha1

- old
+ new

@@ -1,58 +1,81 @@ # encoding: UTF-8 module Spontaneous::Plugins module Aliases + extend ActiveSupport::Concern - def self.configure(base) - base.many_to_one :target, :class => base, :reciprocal => :aliases - base.one_to_many :aliases, :class => base, :key => :target_id, :reciprocal => :target - base.add_association_dependencies :aliases => :destroy + included do + many_to_one :target, :class => self, :reciprocal => :aliases + one_to_many :aliases, :class => self, :key => :target_id, :reciprocal => :target + add_association_dependencies :aliases => :destroy end + # def self.configure(base) + # end module ClassMethods - def alias_of(*class_list) + def alias_of(*args) + options_list, class_list = args.partition { |e| e.is_a?(Hash) } + @alias_options = options_list.first || {} @alias_classes = class_list extend ClassAliasMethods include AliasMethods + include PieceAliasMethods unless page? include PageAliasMethods if page? end alias_method :aliases, :alias_of - def targets + def targets(owner = nil, box = nil) targets = [] - target_classes.each do |target_class| - targets += target_class.sti_subclasses_array + classes = [] + proc_args = [owner, box].compact + @alias_classes.each do |source| + case source + when Proc + targets.concat(source[*proc_args]) + else + classes.concat(source.to_s.constantize.sti_subclasses_array) + end end - S::Content.filter(sti_key => targets.map { |t| t.to_s }).all + query = S::Content.filter(sti_key => classes.map { |c| c.to_s }) + if container_procs = @alias_options[:container] + containers = [container_procs].flatten.map { |p| p[*proc_args] }.flatten + params = [] + containers.each do |container| + if container.is_page? + params << Sequel::SQL::BooleanExpression.new(:'=', :page_id, container.id) + else + box_params = [ + [:box_sid, container.id], + [:owner_id, container.owner.id] + ] + params << Sequel::SQL::BooleanExpression.from_value_pairs(box_params, :AND) + end + end + container_query = params[1..-1].inject(params.first) { |q, expr| q = q | expr; q } + query = query.and(container_query) + end + targets.concat(query.all) + if filter = @alias_options[:filter] and filter.is_a?(Proc) + targets.select(&filter) + else + targets + end end - def target_classes - @target_classes ||= @alias_classes.map { |c| c.to_s.constantize } + def target_class(class_definition) + end def alias? false end - end + end # ClassMethods - module InstanceMethods - def alias_title - fields[:title].to_s - end - def alias_icon_field - if field = fields.detect { |f| f.image? } - field - else - nil - end - end - end - module ClassAliasMethods def alias? true end end @@ -94,22 +117,25 @@ def styles @styles ||= Spontaneous::Collections::PrototypeSet.new(target, :styles) end - def export - super.merge(:target => target.shallow_export, :alias_title => target.alias_title, :alias_icon => target.alias_icon_field.export) + def export(user = nil) + super.merge(:target => target.shallow_export(user), :alias_title => target.alias_title, :alias_icon => target.exported_alias_icon) end + end - module PageAliasMethods + module PieceAliasMethods def path - @_path ||= [parent.path, target.slug].join(S::SLASH) + target.path end + end - def calculate_path - "" + module PageAliasMethods + def slug + target.slug end def layout # if this alias class has no layouts defined, then just use the one set on the target if self.class.layouts.empty? @@ -121,8 +147,27 @@ end def find_named_layout(layout_name) super or target.find_named_layout(layout_name) end + end + + # InstanceMethods + + def alias_title + fields[:title].to_s + end + + def alias_icon_field + if field = fields.detect { |f| f.image? } + field + else + nil + end + end + + def exported_alias_icon + return nil unless alias_icon_field + alias_icon_field.export end end end