17
17
#
18
18
# You should have received a copy of the GNU General Public License along with this program.
19
19
# If not, see <https://www.gnu.org/licenses/>
20
-
21
20
from RatesBot .Tools .LoggerLib import *
22
21
from RatesBot .Tools .ScreenColors import clr
23
22
from bs4 import BeautifulSoup
24
23
import urllib2
25
-
26
24
from RatesBot .DB .RatesDB import RatesDB
27
-
28
25
import RatesBot .Config as cfg
29
26
30
- Service_logger = colorlog .getLogger ('RatesBot.Service' )
31
- #Service_logger.setLevel(logging.DEBUG)
32
-
33
-
34
- class ServiceBase (object ):
27
+ class ServiceBase (Logger ):
35
28
'''Common base class for all services that provide rates'''
36
29
37
30
def __init__ (self , * args , ** kwargs ):
38
-
39
-
40
- self .url = kwargs ['url' ]
41
-
42
- self .service_name = kwargs ['service_name' ]
43
-
44
- self .total_units = kwargs ['total_units' ] if (kwargs .get ('total_units' ) is not None ) else 1
31
+ super (ServiceBase , self ).__init__ (* args , ** kwargs )
45
32
33
+ self .url = self .init_kwarg ('url' )
34
+ self .service_name = self .init_kwarg ('service_name' )
35
+ self .total_units = self .init_kwarg ('total_units' , default = 1 )
46
36
self .page = ""
47
-
48
37
self .soup = ""
49
-
50
38
self ._rate_morning = 0.00
51
-
52
39
self ._rate_evening = 0.00
53
-
54
40
self ._prices_text = ""
55
-
56
41
self .db = RatesDB (db_uname = cfg .db ['uname' ],db_pass = cfg .db ['pass' ],db_host = cfg .db ['host' ],db_name = cfg .db ['name' ])
57
-
58
42
self .user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'
59
-
60
43
self .headers = {'User-Agent' :self .user_agent ,}
61
44
62
45
@property
@@ -82,124 +65,94 @@ def current_value_morning(self):
82
65
83
66
@property
84
67
def current_value_evening (self ):
85
-
86
68
return self .total_units * self ._rate_evening
87
69
88
-
89
-
90
70
@property
91
71
def value_text_morning (self ):
92
-
93
72
return "\n \n Total Value ({} units @ {}) : {}" .format (self .total_units , self ._rate_morning , self .current_value_morning )
94
73
95
-
96
74
@property
97
75
def value_text_evening (self ):
98
-
99
76
return "\n \n Total Value ({} units @ {}) : {}" .format (self .total_units , self ._rate_evening , self .current_value_evening )
100
77
101
-
102
78
@property
103
79
def value_text (self ):
104
-
105
80
return self .value_text_morning + self .value_text_evening
106
81
107
82
@property
108
83
def prices_text (self ):
109
-
110
84
return self ._prices_text + self .value_text
111
85
112
-
113
86
def __read_url (self ):
114
87
115
- Service_logger .info ("Reading website: {}" .format (self .url ))
88
+ self . logger .info ("Reading website: {}" .format (self .url ))
116
89
req = urllib2 .Request (self .url , headers = self .headers )
117
90
self .page = urllib2 .urlopen (req )
118
91
119
92
def __parse_html (self ):
120
93
121
- Service_logger .info ("Parsing HTML: {}" .format (self .url ))
94
+ self . logger .info ("Parsing HTML: {}" .format (self .url ))
122
95
123
96
self .soup = BeautifulSoup (self .page .read (),features = "html.parser" )
124
97
125
-
126
-
127
98
def db_save (self ):
128
99
'''Save rates to the database'''
129
100
130
101
self .db .insert_rate (self )
131
-
132
102
self .db .session .close ()
133
-
134
103
self .db .session .remove ()
135
-
136
- Service_logger .info ("Rates saved to Database" )
137
-
104
+ self .logger .info ("Rates saved to Database" )
138
105
139
106
def db_last_rates (self ):
140
107
'''Get the last rates inserted in the DB for the service'''
141
-
142
- Service_logger .debug ("Getting last saved rates from the DB" )
143
108
144
109
last_rates = self .db .get_last_rates (self )
145
-
146
110
self .db .session .close ()
147
-
148
111
self .db .session .remove ()
149
-
150
- Service_logger .debug ("Last rates from DB: {}" .format (str (last_rates )))
112
+ self .logger .debug ("Last rates from DB: {}" .format (str (last_rates )))
151
113
152
114
return last_rates
153
-
154
-
155
-
115
+
156
116
def get_rates (self ):
157
117
'''
158
118
Retreive rates from a provider.
159
119
This method should be implemented for each of the derived classes that will be implemented for each of the service.
160
120
It should populate the fields - _prices_text, _rate_morning and _rate_evening after scraping the service and return prices_text
161
121
'''
162
-
163
122
self .__read_url ()
164
-
165
123
self .__parse_html ()
166
124
167
125
def rates_changed (self ):
168
126
'''Check latest rates from a service and compare to saved rates from last time the rates were checked.'''
169
127
128
+ self .logger .debug ("Current rates from {} : {}" .format (self .service_name , "[{}, {}]" .format (self .rate_morning ,self .rate_evening )))
129
+
170
130
if [self .rate_morning ,self .rate_evening ] == self .db_last_rates ():
171
131
return False
172
132
else :
173
-
174
133
self .db_save ()
175
134
176
135
return True
177
-
178
-
136
+
179
137
def format_rate (self , rate ):
180
-
181
138
return 0.00 if (rate == "" or rate == "-" ) else float (rate .split ()[0 ])
182
139
183
140
184
141
class KTRates (ServiceBase ):
185
142
'''Class derived from ServiceBase. Retrieves gold rates from www.khaleejtimes.com'''
186
-
143
+
187
144
def __init__ (self , * args , ** kwargs ):
188
145
189
146
url = "http://www.khaleejtimes.com/gold-forex/"
190
-
191
147
service_name = "Khaleej Times"
192
-
193
148
super (KTRates , self ).__init__ (url = url , service_name = service_name , * args , ** kwargs )
194
149
195
-
196
-
197
150
def get_rates (self ):
198
151
199
152
super (KTRates , self ).get_rates ()
200
153
201
154
for i in self .soup .findAll ('tr' ,{'class' :'gold_r1' }):
202
-
155
+
203
156
if "22" in i .td .text :
204
157
rates = i .text .replace (" " ,"" ).replace ("\r \n " ,"" ).strip ().split ("\n " )
205
158
break
@@ -213,7 +166,6 @@ def get_rates(self):
213
166
self ._prices_text += "\n Morning - {}\n Evening - {}\n Yesterday - {}" .format (rates [1 ], rates [2 ], rates [3 ])
214
167
215
168
self ._rate_morning = self .format_rate (rates [1 ])
216
-
217
169
self ._rate_evening = self .format_rate (rates [2 ])
218
170
219
171
return self .prices_text
@@ -224,25 +176,18 @@ class GPDRates(ServiceBase):
224
176
def __init__ (self , * args , ** kwargs ):
225
177
226
178
url = "http://www.goldpricesdubai.com/"
227
-
228
179
service_name = "Gold Prices Dubai"
229
-
230
180
super (GPDRates , self ).__init__ (url = url , service_name = service_name , * args , ** kwargs )
231
181
232
182
233
183
def get_rates (self ):
234
184
235
185
super (GPDRates , self ).get_rates ()
236
186
237
-
238
187
rates = [txt .text for txt in self .soup .findAll ('table' ,{'class' :'now' })[0 ].findChildren ('tr' )[6 ].findChildren ('td' )]
239
-
240
188
self ._prices_text += "\n {} gold prices updated\n " .format (self .service_name )
241
-
242
189
self ._prices_text += "\n Morning - {}\n Evening - {}" .format (rates [0 ],rates [1 ])
243
-
244
190
self ._rate_morning = self .format_rate (rates [0 ])
245
-
246
191
self ._rate_evening = self .format_rate (rates [1 ])
247
192
248
193
return self .prices_text
0 commit comments