OSDN Git Service

v07
[pettanr/pettanr.git] / app / models / sheet_panel.rb
1 class SheetPanel < Peta::Element
2   load_manifest
3   belongs_to :panel
4   belongs_to :sheet
5   accepts_nested_attributes_for :panel, :allow_destroy => true
6   #alias_attribute :attr_y, :y
7   
8   validates :sheet_id, :numericality => {:allow_blank => true}
9   validates :panel_id, :numericality => {:allow_blank => true}
10   validates :x, :presence => true, :numericality => true
11   validates :y, :presence => true, :numericality => true
12   validates :z, :presence => true, :numericality => {:greater_than => 0}
13   validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
14   
15   scope :with_sheet, -> do
16     includes(:sheet)
17   end
18   
19   scope :find_index, -> do
20     with_sheet.where(Sheet.arel_table[:visible].gt 0).references(:sheet)
21   end
22   
23   scope :find_private, -> (operators) do 
24     with_sheet.where(Sheet.arel_table[:author_id].eq operators.author.id).references(:sheet)
25   end
26   
27   scope :by_sheet, -> (sheet_id) do 
28     where(sheet_id: sheet_id)
29   end
30   
31   scope :find_by_sheet, -> (sheet_id) do 
32     find_index.by_sheet(sheet_id).references(:sheet)
33   end
34   
35   scope :find_by_panel, -> (panel_id) do 
36     find_index.where(panel_id: panel_id).references(:sheet)
37   end
38   
39   scope :find_by_author, -> (author_id) do 
40     find_index.where(Sheet.arel_table[:author_id].eq author_id).references(:sheet)
41   end
42   
43   scope :find_play, -> (sheet_id) do 
44     find_by_sheet(sheet_id)
45   end
46   
47   scope :find_private_play, -> (sheet_id, operators) do 
48     find_private(operators).by_sheet(sheet_id)
49   end
50   
51   def y
52     self.attributes['y']
53   end
54   
55   def supply_default
56     self.x = 15
57     self.y = 15
58     if self.sheet
59       self.t = self.sheet.new_t 
60       self.z = self.sheet.new_z 
61     else
62       self.sheet_id = nil
63       self.panel_id = nil
64       self.z = 1
65       self.t = nil
66     end
67   end
68   
69   def overwrite
70   end
71   
72   def self.by_author_list_includes
73     {
74       :sheet => {
75         :author => {}
76       }
77     }
78   end
79   
80   def self.show_opt
81     {:include => {
82       :sheet => {
83         :author => {}
84       }, 
85       :panel => {
86         :author => {}, 
87         :panel_pictures => {:picture => {:artist => {}, :license => {}}}, 
88         :speech_balloons =>{:balloon => {}, :speech => {}}
89       }
90     }}
91   end
92   
93   def elements
94     self.panel.elements
95   end
96   
97   def sheet_panel_as_json au
98     panel_include = if self.panel and self.panel.visible?(au)
99       {:include => {}, :methods => :elements}
100     else
101       {:include => {}}
102     end
103     self.to_json({:include => {:sheet => {:include => {:author => {}}}, :panel => panel_include}})
104   end
105   
106   def self.list_as_json_text ary, au
107     '[' + ary.map {|i| i.sheet_panel_as_json(au) }.join(',') + ']'
108   end
109   
110   def licensed_pictures
111     if self.panel
112       self.panel.licensed_pictures
113     else
114       {}
115     end
116   end
117   
118   def copyable?
119     if self.panel and self.panel.publish?
120       true
121     else
122       false
123     end
124   end
125   
126   def allow? operators
127     return nil if self.sheet_id == nil or self.panel_id == nil
128     self.sheet.own?(operators) and self.panel.usable?(operators)
129   end
130   
131   def store operators, old_t = nil
132     res = false
133     self.class.transaction do
134       case self.allow? operators
135       when true
136         self.rotate old_t
137       when false
138         raise ActiveRecord::Forbidden
139       else
140       end
141       res = self.save
142       raise ActiveRecord::Rollback unless res
143       res = self.class.validate_t(self.sheet_id) 
144       unless res
145         self.errors.add :t, 'unserialized'
146         raise ActiveRecord::Rollback 
147       end
148     end
149     res
150   end
151   
152 end