Browse Source

Add updating of achievements

master
Chris Smith 14 years ago
parent
commit
3a50ae667e
2 changed files with 57 additions and 8 deletions
  1. 7
    5
      src/Scraper.py
  2. 50
    3
      src/helloworld.py

+ 7
- 5
src/Scraper.py View File

@@ -1,4 +1,5 @@
1 1
 from BeautifulSoup import BeautifulSoup
2
+from datetime import datetime
2 3
 import urllib2
3 4
 
4 5
 class scraper:
@@ -6,17 +7,18 @@ class scraper:
6 7
     def scrape_spore(self, credentials):
7 8
         results = []
8 9
         url = "http://www.spore.com/view/achievements/%s" % credentials
10
+        fmt = "%a %B %d, %Y"
11
+
9 12
         try:
10 13
           result = urllib2.urlopen(url).read()
11 14
           soup = BeautifulSoup(result)
12 15
           achdiv = soup.find('h2', 'achievementsH2').findNextSibling('div', 'fields')
13 16
 
14 17
           for ach in achdiv.findAll('table'):
15
-              img = "http://www.spore.com%s" % ach.find('img')['src']
16
-              title = ach.find('b').string.strip()
17
-              desc = ach.find('div', 'achievementDesc').contents[0].strip()
18
-              date = ach.find('span').string.strip()
19
-              results.append({'img': img, 'title': title, 'desc': desc, 'date': date})
18
+              results.append({'img': "http://www.spore.com%s" % ach.find('img')['src'],
19
+                              'title': ach.find('b').string.strip(),
20
+                              'desc': ach.find('div', 'achievementDesc').contents[0].strip(),
21
+                              'date': datetime.strptime(ach.find('span').string.strip(), fmt)})
20 22
         except urllib2.URLError, e:
21 23
           handleError(e)
22 24
 

+ 50
- 3
src/helloworld.py View File

@@ -46,8 +46,6 @@ class MainPage(webapp.RequestHandler):
46 46
 
47 47
         self.show_footer()
48 48
 
49
-        self.response.out.write(scraper().scrape_spore("csmith87"))
50
-
51 49
     def show_header(self):
52 50
         self.response.out.write("""
53 51
           <html>
@@ -94,7 +92,15 @@ class MainPage(webapp.RequestHandler):
94 92
             self.response.out.write(cgi.escape(account.source.name))
95 93
             self.response.out.write("</td><td>")
96 94
             self.response.out.write(cgi.escape(account.credentials))
97
-            self.response.out.write("</td></tr>")
95
+            self.response.out.write("""
96
+               </td><td>
97
+                 <form action="/worker/update" method="post">
98
+                 <input type="hidden" name="key" value=""")
99
+            self.response.out.write('"' + cgi.escape(str(account.key())) + '"')
100
+            self.response.out.write(""">
101
+                 <input type="submit" value="Update now">
102
+               </td></tr>
103
+               """)
98 104
 
99 105
         self.response.out.write("</table>")
100 106
         self.response.out.write("""<h2>Add Account</h2>
@@ -144,8 +150,49 @@ class AddAccountPage(webapp.RequestHandler):
144 150
 
145 151
 
146 152
 class UpdatePage(webapp.RequestHandler):
153
+
147 154
     def post(self):
148 155
         account = db.get(db.Key(self.request.get('key')))
156
+        res = []
157
+
158
+        if account.source.name == 'Spore':
159
+            res = scraper().scrape_spore(account.credentials)
160
+
161
+        UpdatePage.merge_achievements(account, res)
162
+
163
+    @staticmethod
164
+    def merge_achievements(account, achievements):
165
+        source = account.source
166
+        user = account.user
167
+
168
+        for awarded in achievements:
169
+            achievement = UpdatePage.get_achievement(source, awarded)
170
+
171
+            res = AwardedAchievement.gql("WHERE achievement = :ac AND user = :user",
172
+                                         ac=achievement,
173
+                                         user=account.user)
174
+
175
+            if res.count(1) == 0:
176
+                AwardedAchievement(achievement=achievement,
177
+                                   user=account.user,
178
+                                   awarded=awarded['date']).put()
179
+
180
+    @staticmethod
181
+    def get_achievement(source, achievement):
182
+        res = Achievement.gql("WHERE name = :name AND source = :source",
183
+                              name=achievement['title'],
184
+                              source=source)
185
+
186
+        if res.count(1) == 0:
187
+            res = Achievement(name=achievement['title'],
188
+                              image=achievement['img'],
189
+                              description=achievement['desc'],
190
+                              source=source)
191
+            res.put()
192
+        else:
193
+            res = res.get()
194
+
195
+        return res
149 196
 
150 197
 application = webapp.WSGIApplication([('/', MainPage),
151 198
                                       ('/admin/addsource', AddSourcePage),

Loading…
Cancel
Save