OSDN Git Service

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