OSDN Git Service

t#31076:import methods move to model
[pettanr/pettanr.git] / app / models / provider_status.rb
1 class ProviderStatus < ActiveRecord::Base
2   has_one :provider
3   
4   validates :token, :format => {:with => /^[a-zA-Z0-9]+$/, :allow_blank => true}
5   validates :receive_hour1, :numericality => {:allow_blank => true}
6   validates :receive_hour2, :numericality => {:allow_blank => true}
7 #  validates :received_at
8 #  validates :stopped_at
9   
10   before_save do |r|
11     r.token = r.token.gsub(/\s/, '') if r.token
12   end
13   
14   def supply_default
15   end
16   
17   def overwrite
18   end
19   
20   def own? ad
21     return false unless ad
22     ad.is_a?(Admin)
23   end
24   
25   def visible? ad
26     return false unless ad
27     ad.is_a?(Admin)
28   end
29   
30   def status
31     self.token.blank? ? 0 : 1
32   end
33   
34   def self.default_page_size
35     25
36   end
37   
38   def self.max_page_size
39     100
40   end
41   
42   def self.default_panel_size
43     30
44   end
45   
46   def self.max_panel_size
47     200
48   end
49   
50   def self.page prm = nil
51     page = prm.to_i
52     page = 1 if page < 1
53     page
54   end
55   
56   def self.page_size prm = self.default_page_size
57     page_size = prm.to_i
58     page_size = self.max_page_size if page_size > self.max_page_size
59     page_size = self.default_page_size if page_size < 1
60     page_size
61   end
62   
63   def self.list page = 1, page_size = self.default_page_size
64     opt = {}
65     opt.merge!(ProviderStatus.list_opt)
66     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
67     opt.merge!({:order => 'providers.name'})
68     ProviderStatus.find(:all, opt)
69   end
70   
71   def self.available_list page = 1, page_size = self.default_page_size
72     opt = {}
73     opt.merge!(ProviderStatus.list_opt)
74     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
75     opt.merge!({:conditions => ['provider_statuses.token is null'], :order => 'providers.name'})
76     ProviderStatus.find(:all, opt)
77   end
78   
79   def self.list_opt
80     {:include => {:provider => {}} }
81   end
82   
83   def self.list_json_opt
84     {:include => {:provider => {}} }
85   end
86   
87   def self.show pid, ad
88     opt = {}
89     opt.merge!(ProviderStatus.show_opt)
90     res = ProviderStatus.find(pid, opt)
91     raise ActiveRecord::Forbidden unless res.visible?(ad)
92     res
93   end
94   
95   def self.edit pid, ad
96     opt = {}
97     opt.merge!(ProviderStatus.show_opt)
98     res = ProviderStatus.find(pid, opt)
99     raise ActiveRecord::Forbidden unless res.own?(ad)
100     res
101   end
102   
103   def self.show_opt
104     {:include => {:provider => {}} }
105   end
106   
107   def self.show_json_opt
108     {:include => {:provider => {}} }
109   end
110   
111   def stop
112     self.token = nil
113     self.save
114   end
115   
116   def ymd_to_time ymd_str
117     return nil if ymd_str.blank?
118     date = nil
119     begin
120       date = Time.parse(ymd_str[0..3] + '/' + ymd_str[4..5] + '/' + ymd_str[6..7])
121     rescue
122       date = nil
123     end
124     date
125   end
126   
127   def export_url action, date
128     u = self.provider.export_url action
129     prm = '?auth_token=' + self.token
130     prm = prm + '&date=' + date.strftime("%Y%m%d") unless date.blank?
131     u = URI.join(u, prm)
132     u.to_s
133   end
134   
135   def export_from_provider url
136     res = nil
137     begin
138       json = RestClient.get url
139       res = JSON.parse json
140     rescue
141     end
142     res
143   end
144   
145   def export_by action, ymd
146     t = ymd_to_time ymd
147     url = export_url action, t
148     export_from_provider(url)
149   end
150   
151   def licenses_import date
152     licenses = self.export_by('licenses_export', date)
153     return nil unless licenses
154     ProviderLicense.import self.provider.id, licenses
155   end
156   
157   def artists_import date
158     artists = self.export_by('artists_export', date)
159     return nil unless artists
160     ProviderArtist.import self.provider.id, artists
161   end
162   
163   def original_pictures_import date
164     original_pictures = self.export_by('original_pictures_export', date)
165     return nil unless original_pictures
166     pictures = self.export_by('pictures_export', date)
167     return nil unless pictures
168     ProviderOriginalPicture.import self.provider.id, original_pictures, pictures
169   end
170   
171   def port
172     exports = export_by('export', @provider_status, params[:date])
173     return nil unless exports
174     ProviderStatus.import @provider_status.provider.id, exports
175   end
176   
177   def self.import pid, exports
178     res = {}
179     ProviderStatus.transaction do
180       res[:licenses] = ProviderLicense.import pid, exports['licenses']
181       raise ActiveRecord::Rollback if res[:licenses].any?
182       res[:artists] = ProviderArtist.import pid, exports['artists']
183       raise ActiveRecord::Rollback if res[:artists].any?
184       res[:original_pictures] = ProviderOriginalPicture.import pid, exports['original_pictures'], exports['pictures']
185       raise ActiveRecord::Rollback if res[:original_pictures][:original_pictures].any? or res[:original_pictures][:resource_pictures].any? or res[:original_pictures][:pictures].any?
186     end
187     res
188   end
189   
190 end