WIP facebook friends widget
[shapado:cantonics-shapado.git] / app / models / widgets / widget.rb
1 class Widget
2   include Mongoid::Document
3
4   identity :type => String
5   field :name, :type => String
6   field :settings, :type => Hash
7
8 #   validate :set_name, :on => :create
9   validates_presence_of :name
10
11   embedded_in :group_questions, :inverse_of => :question_widgets
12   embedded_in :group_welcome, :inverse_of => :welcome_widgets
13   embedded_in :group_external, :inverse_of => :external_widgets
14   embedded_in :group_mainlist, :inverse_of => :mainlist_widgets
15
16   def group
17     self.group_questions ||
18     self.group_welcome ||
19     self.group_external ||
20     self.group_mainlist
21   end
22
23   def initialize(*args)
24     super(*args)
25
26     self[:name] ||= self.class.to_s.sub("Widget", "").underscore
27   end
28
29   def self.types(tab="")
30     types = %w[UsersWidget BadgesWidget TopUsersWidget TagCloudWidget PagesWidget SharingButtonsWidget CurrentTagsWidget FacebookFriendsWidget]
31     if tab == 'question'
32       types += %w[ModInfoWidget QuestionTagsWidget QuestionBadgesWidget QuestionStatsWidget RelatedQuestionsWidget TagListWidget]
33     end
34     if tab == 'external'
35       types += ["AskQuestionWidget"]
36     end
37     if AppConfig.enable_groups
38       types += %w[GroupsWidget TopGroupsWidget]
39     end
40
41     types
42   end
43
44   def question_only?
45     false
46   end
47
48   def partial_name
49     "widgets/#{self.name}"
50   end
51
52   def up
53     self.move_to("up")
54   end
55
56   def down
57     self.move_to("down")
58   end
59
60   def move_to(pos, widgets, context)
61     pos ||= "up"
62     current_pos = widgets.index(self)
63
64     if pos == "up"
65       pos = current_pos-1
66     elsif pos == "down"
67       pos = current_pos+1
68     end
69
70     if pos >= widgets.count
71       pos = 0
72     elsif pos < 0
73       pos = widgets.count-1
74     end
75
76     widgets[current_pos], widgets[pos] = widgets[pos], widgets[current_pos]
77     self.group.send(:"#{context}_widgets=", widgets)
78     self.group.raw_save(:force => true)
79   end
80
81   def update_settings(params)
82     ##TODO: check what's going in
83     self.settings = params[:settings]
84   end
85
86   def description
87     @description ||= I18n.t("widgets.#{self.name}.description") if self.name
88   end
89
90   protected
91   def set_name
92     self[:name] ||= self.class.to_s.sub("Widget", "").underscore
93   end
94 end
95