def run (self) : required = ('user_id',) if not self.ensure_args(required) : return user_id = self.request.get('user_id') user = User.get_user_by_nsid(user_id) if not user : self.api_error(1, 'Not a valid user') return if user.buddyicon_url : self.api_ok({'buddyicon_url' : user.buddyicon_url}) return rsp = self.get_people_info(self, user.nsid) if not rsp : self.api_error(2, 'Failed to retrieve buddyicon') return if rsp['person']['iconfarm'] == 0 : self.api_error(3, 'User has not chosen a buddyicon') return buddyicon = "http://farm%s.static.flickr.com/%s/buddyicons/%s.jpg" % (rsp['person']['iconfarm'], rsp['person']['iconserver'], self.user.nsid) User.set_buddyicon_url(user, buddyicon) self.api_ok({'buddyicon_url' : buddyicon}) return
def get (self) : if not self.check_logged_in(self.min_perms) : self.do_flickr_auth(self.min_perms) return crumb = self.generate_crumb(self.user, 'method=unblock') self.assign('unblock_crumb', crumb) # fix me: pagination res = Blocked.blocked_by_user(self.user.nsid) blocked = res.fetch(20) users = [] for b in blocked : users.append(User.get_user_by_nsid(b.blocked_nsid)) self.assign('blocked_users', users) self.assign('count_blocked', len(users)) # self.display('blocked.html')
def get(self): if not self.check_logged_in(self.min_perms): self.do_flickr_auth(self.min_perms) return crumb = self.generate_crumb(self.user, 'method=unblock') self.assign('unblock_crumb', crumb) # fix me: pagination res = Blocked.blocked_by_user(self.user.nsid) blocked = res.fetch(20) users = [] for b in blocked: users.append(User.get_user_by_nsid(b.blocked_nsid)) self.assign('blocked_users', users) self.assign('count_blocked', len(users)) # self.display('blocked.html')
def run (self) : required = ('user_id',) if not self.ensure_args(required) : return user_id = self.request.get('user_id') user = User.get_user_by_nsid(user_id) if not user : self.api_error(1, 'Not a valid user') return if user.path_alias : self.api_ok({'buddyicon_url' : user.buddyicon_url}) return rsp = self.get_people_info(self, user.nsid) if not rsp : self.api_error(2, 'Failed to retrieve buddyicon') return url = rsp['person']['photosurl']['_content'] if url.endswith("/") : url = url[:-1] path_alias = os.path.basename(url) if path_alias == user.nsid : self.api_error(1, 'No path alias defined') User.set_path_alias(user, path_alias) self.api_ok({'path_alias' : path_alias}) return
def run (self) : required = ('crumb', 'suggestion_id', 'geo_perms', 'geo_context') if not self.ensure_args(required) : return if not self.ensure_crumb('method=approve') : return suggestion_id = self.request.get('suggestion_id') suggestion = self.fetch_pending_suggestion(suggestion_id) if not suggestion: return # Here's a potential problem: In order to do this properly # we may need to call the Flickr API (6) times and we're # doing all of them synchronously there's always the risk # that one of them will time out. Some possibilities include # doing the machinetag and comment stuff as queued tasks but # that probably puts too many eggs in the app engine basket. # Required: # flickr.photos.getInfo # flickr.photos.geo.setLocation # Possible: # flickr.photos.geo.setPerms # flickr.photos.addTags # flickr.photos.comments.addComment # # Check to see if the photo has already been geotagged # args = { 'photo_id' : suggestion.photo_id, 'auth_token' : self.user.token, 'check_response' : 1, } rsp = self.api_call('flickr.photos.getInfo', args) if not rsp : self.api_error(8, 'Unable to retrieve photo information from Flickr') return if rsp['photo'].has_key('location') : Suggestion.reject_all_pending_suggestions_for_photo(suggestion.photo_id) self.api_error(9, 'Photo has already been geotagged') return # # Also, this is all cloned in Robots/Suggestibot <-- it should probably # go in a "library" but the whole thing gets wrapped up in boring # object/globals/self nonsense and the fact that there aren't any # in Suggestion.py # # # Okay! Geotag the f*****g photo!!! # accuracy = suggestion.accuracy if accuracy > 16 : accuracy = 16 args = {'photo_id' : suggestion.photo_id, 'lat' : suggestion.latitude, 'lon' : suggestion.longitude, 'accuracy' : accuracy, 'auth_token' : self.user.token, } geo_context = self.request.get('geo_context') if geo_context and int(geo_context) != 0 : args['context'] = geo_context rsp = self.api_call('flickr.photos.geo.setLocation', args) if not rsp : self.api_error(10, 'Failed to set location: Flickr API call failed') if rsp['stat'] != 'ok' : self.api_error(10, 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code'])) return # # Geo perms (it would be better if you could assign perms in setLocation...) # geoperms = int(self.request.get('geo_perms')) default = self.default_geoperms() if geoperms != default : method = 'flickr.photos.geo.setPerms' args = { 'photo_id' : suggestion.photo_id, 'auth_token' : self.user.token, 'is_public' : 0, 'is_contact' : 0, 'is_family' : 0, 'is_friend' : 0 } if geoperms == 1 : args['is_public'] = 1 elif geoperms == 2 : args['is_contact'] = 1 elif geoperms == 3 : args['is_friend'] = 1 args['is_family'] = 1 elif geoperms == 4 : args['is_friend'] = 1 elif geoperms == 5 : args['is_family'] = 1 else : pass rsp = self.api_call('flickr.photos.geo.setPerms', args) if rsp['stat'] != 'ok' : msg = 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code']) self.log(msg, 'warning') pass # # geo:suggestedby= machine tag and comment-y reward # comment but only if the geo perms are public # if geoperms == 1 and suggestion.suggestor_nsid != self.user.nsid : suggested_by = suggestion.suggestor_nsid suggestor = User.get_user_by_nsid(suggestion.suggestor_nsid) if suggestor and suggestor.path_alias : suggested_by = suggestor.path_alias tags = "geo:suggestedby=%s" % suggested_by machinetags_args = { 'photo_id' : suggestion.photo_id, 'tags' : tags, 'auth_token' : self.user.token, 'check_response' : 1, } rsp = self.api_call('flickr.photos.addTags', machinetags_args) # sudo make me a preference # TO DO: this should not be called "rewards" but it's early # and I haven't had much coffee.... if self.user.nsid in config.rewards : suggested_date = suggestion.created.strftime("%B %d, %Y") suggestor_name = suggestor.username suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.nsid if suggestor.path_alias != '' : suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.path_alias # Note: don't lookup/display the place name for the WOE ID # until it's possible to do corrections on approval. nearby_url = "http://www.flickr.com/photos/%s/%s/nearby/?by=everyone&taken=recent&sort=distance&page=1&show=detail" % (self.user.nsid, suggestion.photo_id) comment = """On %s, <a href="%s">%s</a> suggested <a href="%s">where this photo was taken</a>, and they were right! """ % (suggested_date, suggestor_url, suggestor_name, nearby_url) method = 'flickr.photos.comments.addComment' comments_args = { 'photo_id' : suggestion.photo_id, 'comment_text' : comment, 'auth_token' : self.user.token, } rsp = self.api_call(method, comments_args) if not rsp : logging.error("Failed to post approval comment") # TODO, MAYBE: delete initial suggestion comment here? # # Update (possibly do this before setting tags?) # Suggestion.approve_suggestion(suggestion) Suggestion.reject_all_pending_suggestions_for_photo(suggestion.photo_id) # # HAPPY # photo_owner = self.user.nsid if self.user.path_alias : photo_owner = self.user.path_alias photo_url = "http://www.flickr.com/photos/%s/%s" % (photo_owner, suggestion.photo_id) # out = {'photo_url' : photo_url} return self.api_ok(out)
def post(self, uuid): is_api = True if not self.ensure_config(uuid): self.error('invalid_config', is_api) return if not self.check_logged_in(self.min_perms): self.do_flickr_auth(self.min_perms) return if not self.validate_crumb(self.user, 'method=approve', self.request.get('crumb')): self.error('invalid_perms', is_api) return False # # args/sig validation # req_args = ('photo_id', 'lat', 'lon', 'acc', 'context', '_s') sig_args = ['photo_id', 'lat', 'lon', 'acc', 'context', 'woeid'] if not self.ensure_required_args(req_args): self.error('missing_args', is_api) return if not self.ensure_valid_args(req_args): self.error('invalid_args', is_api) return if not self.ensure_robot_sig(sig_args, self.request.get('_s')): self.error('invalid_sig') return args = { 'photo_id': suggestion.photo_id, 'auth_token': self.user.token, 'check_response': 1, } rsp = self.api_call('flickr.photos.getInfo', args) if not rsp: self.error('invalid_photo') return if rsp['photo'].has_key('location'): Suggestion.reject_all_pending_suggestions_for_photo( suggestion.photo_id) self.error('already_geotagged') return mock = self.generate_mock_suggestion() if not mock: self.error('invalid suggestion') return suggestion = Suggestion.create(mock) # # this is all copy/pasted out of API/Approve <-- it should probably # go in a "library" but the whole thing gets wrapped up in boring # object/globals/self nonsense and the fact that there aren't any # in Suggestion.py # args = { 'photo_id': suggestion.photo_id, 'lat': suggestion.latitude, 'lon': suggestion.longitude, 'accuracy': suggestion.accuracy, 'auth_token': self.user.token, } geo_context = self.request.get('geo_context') if geo_context and int(geo_context) != 0: args['context'] = geo_context rsp = self.api_call('flickr.photos.geo.setLocation', args) if not rsp: self.error('Failed to set location: Flickr API call failed', is_api) return if rsp['stat'] != 'ok': self.error( 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code']), is_api) return geoperms = int(self.request.get('geo_perms')) default = self.default_geoperms() if geoperms != default: method = 'flickr.photos.geo.setPerms' args = { 'photo_id': suggestion.photo_id, 'auth_token': self.user.token, 'is_public': 0, 'is_contact': 0, 'is_family': 0, 'is_friend': 0 } if geoperms == 1: args['is_public'] = 1 elif geoperms == 2: args['is_contact'] = 1 elif geoperms == 3: args['is_friend'] = 1 args['is_family'] = 1 elif geoperms == 4: args['is_friend'] = 1 elif geoperms == 5: args['is_family'] = 1 else: pass rsp = self.api_call('flickr.photos.geo.setPerms', args) if rsp['stat'] != 'ok': msg = 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code']) self.log(msg, 'warning') pass if geoperms == 1 and suggestion.suggestor_nsid != self.user.nsid: suggested_by = suggestion.suggestor_nsid suggestor = User.get_user_by_nsid(suggestion.suggestor_nsid) if suggestor and suggestor.path_alias: suggested_by = suggestor.path_alias tags = "geo:suggestedby=%s" % suggested_by args = { 'photo_id': suggestion.photo_id, 'tags': tags, 'auth_token': self.user.token, 'check_response': 1, } rsp = self.api_call('flickr.photos.addTags', args) # sudo make me a preference if self.user.nsid == 'brooklyn museum': suggested_date = suggestion.date_create suggestor_name = suggestor.username suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.nsid if suggestor.path_alias != '': suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.path_alias # Note: don't lookup/display the place name for the WOE ID # until it's possible to do corrections on approval. comment = """On %s, <a href="%s">%s</a> suggested where this photo was taken, and they were right! """ % (suggested_date, suggestor_url, suggestor_name) method = 'flickr.photos.comments.addComment' comments_args = { 'photo_id': photo_id, 'comment_text': comment, 'auth_token': self.user.token, } rsp = self.api_call(method, args) # Suggestion.approve_suggestion(suggestion) Suggestion.reject_all_pending_suggestions_for_photo( suggestion.photo_id) # photo_owner = self.user.nsid if self.user.path_alias: photo_owner = self.user.path_alias photo_url = "http://www.flickr.com/photos/%s/%s" % ( photo_owner, suggestion.photo_id) return self.ok({'photo_url': photo_url})
def generate_mock_suggestion(self): # # Get the photo # method = 'flickr.photos.getInfo' photo_id = self.request.get('photo_id') args = { 'photo_id': photo_id, 'auth_token': self.user.token, } rsp = self.proxy_api_call(method, args) if not rsp or rsp['stat'] != 'ok': self.error('no_photoinfo') return # # Ensure the photo is owned by the logged in user # if rsp['photo']['owner']['nsid'] != self.user.nsid: self.error('invalid_owner') return # # Ensure the photo isn't already geotagged # if rsp['photo'].has_key('location'): self.error('already_geotagged') return suggestor = User.get_user_by_nsid(self.config['flickr_nsid']) # # get the WOE ID # woeid = 0 args = { 'lat': self.request.get('lat'), 'lon': self.request.get('lon'), 'accuracy': self.request.get('acc'), } ttl = 60 * 60 * 14 rsp = self.proxy_api_call('flickr.places.findByLatLon', args, ttl) if rsp and rsp.has_key(rsp['places']): woeid = rsp['places']['place'][0]['woe_id'] # # Create a mock suggestion # suggestion = { 'photo_id': int(photo_id), 'owner_id': self.user.nsid, 'suggestor_id': suggestor.nsid, 'suggestor_name': suggestor.username, 'latitude': float(self.request.get('lat')), 'longitude': float(self.request.get('lon')), 'accuracy': int(self.request.get('acc')), 'woeid': woeid, 'context': int(self.request.get('context')), # 'created' : 'datetime' # 'updated' : 'datetime' 'status': 1, 'comment_id': '', } return suggestion
def run(self): required = ('crumb', 'suggestion_id', 'geo_perms', 'geo_context') if not self.ensure_args(required): return if not self.ensure_crumb('method=approve'): return suggestion_id = self.request.get('suggestion_id') suggestion = self.fetch_pending_suggestion(suggestion_id) if not suggestion: return # Here's a potential problem: In order to do this properly # we may need to call the Flickr API (6) times and we're # doing all of them synchronously there's always the risk # that one of them will time out. Some possibilities include # doing the machinetag and comment stuff as queued tasks but # that probably puts too many eggs in the app engine basket. # Required: # flickr.photos.getInfo # flickr.photos.geo.setLocation # Possible: # flickr.photos.geo.setPerms # flickr.photos.addTags # flickr.photos.comments.addComment # # Check to see if the photo has already been geotagged # args = { 'photo_id': suggestion.photo_id, 'auth_token': self.user.token, 'check_response': 1, } rsp = self.api_call('flickr.photos.getInfo', args) if not rsp: self.api_error(8, 'Unable to retrieve photo information from Flickr') return if rsp['photo'].has_key('location'): Suggestion.reject_all_pending_suggestions_for_photo( suggestion.photo_id) self.api_error(9, 'Photo has already been geotagged') return # # Also, this is all cloned in Robots/Suggestibot <-- it should probably # go in a "library" but the whole thing gets wrapped up in boring # object/globals/self nonsense and the fact that there aren't any # in Suggestion.py # # # Okay! Geotag the f*****g photo!!! # accuracy = suggestion.accuracy if accuracy > 16: accuracy = 16 args = { 'photo_id': suggestion.photo_id, 'lat': suggestion.latitude, 'lon': suggestion.longitude, 'accuracy': accuracy, 'auth_token': self.user.token, } geo_context = self.request.get('geo_context') if geo_context and int(geo_context) != 0: args['context'] = geo_context rsp = self.api_call('flickr.photos.geo.setLocation', args) if not rsp: self.api_error(10, 'Failed to set location: Flickr API call failed') if rsp['stat'] != 'ok': self.api_error( 10, 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code'])) return # # Geo perms (it would be better if you could assign perms in setLocation...) # geoperms = int(self.request.get('geo_perms')) default = self.default_geoperms() if geoperms != default: method = 'flickr.photos.geo.setPerms' args = { 'photo_id': suggestion.photo_id, 'auth_token': self.user.token, 'is_public': 0, 'is_contact': 0, 'is_family': 0, 'is_friend': 0 } if geoperms == 1: args['is_public'] = 1 elif geoperms == 2: args['is_contact'] = 1 elif geoperms == 3: args['is_friend'] = 1 args['is_family'] = 1 elif geoperms == 4: args['is_friend'] = 1 elif geoperms == 5: args['is_family'] = 1 else: pass rsp = self.api_call('flickr.photos.geo.setPerms', args) if rsp['stat'] != 'ok': msg = 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code']) self.log(msg, 'warning') pass # # geo:suggestedby= machine tag and comment-y reward # comment but only if the geo perms are public # if geoperms == 1 and suggestion.suggestor_nsid != self.user.nsid: suggested_by = suggestion.suggestor_nsid suggestor = User.get_user_by_nsid(suggestion.suggestor_nsid) if suggestor and suggestor.path_alias: suggested_by = suggestor.path_alias tags = "geo:suggestedby=%s" % suggested_by machinetags_args = { 'photo_id': suggestion.photo_id, 'tags': tags, 'auth_token': self.user.token, 'check_response': 1, } rsp = self.api_call('flickr.photos.addTags', machinetags_args) # sudo make me a preference # TO DO: this should not be called "rewards" but it's early # and I haven't had much coffee.... if self.user.nsid in config.rewards: suggested_date = suggestion.created.strftime("%B %d, %Y") suggestor_name = suggestor.username suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.nsid if suggestor.path_alias != '': suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.path_alias # Note: don't lookup/display the place name for the WOE ID # until it's possible to do corrections on approval. nearby_url = "http://www.flickr.com/photos/%s/%s/nearby/?by=everyone&taken=recent&sort=distance&page=1&show=detail" % ( self.user.nsid, suggestion.photo_id) comment = """On %s, <a href="%s">%s</a> suggested <a href="%s">where this photo was taken</a>, and they were right! """ % (suggested_date, suggestor_url, suggestor_name, nearby_url) method = 'flickr.photos.comments.addComment' comments_args = { 'photo_id': suggestion.photo_id, 'comment_text': comment, 'auth_token': self.user.token, } rsp = self.api_call(method, comments_args) if not rsp: logging.error("Failed to post approval comment") # TODO, MAYBE: delete initial suggestion comment here? # # Update (possibly do this before setting tags?) # Suggestion.approve_suggestion(suggestion) Suggestion.reject_all_pending_suggestions_for_photo( suggestion.photo_id) # # HAPPY # photo_owner = self.user.nsid if self.user.path_alias: photo_owner = self.user.path_alias photo_url = "http://www.flickr.com/photos/%s/%s" % ( photo_owner, suggestion.photo_id) # out = {'photo_url': photo_url} return self.api_ok(out)
def get(self, context, filter): min_perms = self.min_perms if self.request.get('perms') == 'write': min_perms = 'write' if not self.check_logged_in(min_perms): self.do_flickr_auth(min_perms) return # this is who I am ... if not context and self.request.get('user'): context = 'user' filter = self.request.get('user') self.assign('context', context) # Default, choose a user if not context: self.display('chooser.html') return # ok, what are we trying to do... other_user = None other_username = None if context == 'user': other_username = filter elif context == 'photo': # magic referer glue, mostly for the Brooklyn Museum headers = self.request.headers if headers.has_key('Referer'): u = urlparse.urlparse(headers['Referer']) m = re.match(r'(?:www\.)?flickr\.com', u[1]) if not m: self.error(404) return m = re.match(r'/photos/(?:[^/]+)/(\d+)', u[2]) if m: filter = m.groups()[0] else: self.error(404) return # end of magic glue method = 'flickr.photos.getInfo' args = { 'photo_id': filter, 'auth_token': self.user.token, } ttl = 60 * 60 rsp = self.proxy_api_call(method, args, ttl) if not rsp or not rsp.has_key('photo'): self.assign('error', 'no_photo') elif rsp['photo'].has_key('location'): self.assign('error', 'already_geotagged') else: # this is kind of dumb in the end... spr = { 'id': rsp['photo']['id'], 'owner': rsp['photo']['owner']['nsid'], 'secret': rsp['photo']['secret'], 'server': rsp['photo']['server'], 'farm': rsp['photo']['farm'], 'title': rsp['photo']['title']['_content'], 'tags': '', 'datetaken': rsp['photo']['dates']['taken'], 'ownername': rsp['photo']['owner']['username'], } if rsp['photo'].has_key('tags'): tags = map(lambda t: t['_content'], rsp['photo']['tags']['tag']) spr['tags'] = ' '.join(tags) json = simplejson.dumps({'photo': [spr]}) self.assign("photo_json", json) other_username = rsp['photo']['owner']['username'] self.assign("usernsid", rsp['photo']['owner']['nsid']) elif context == 'random': noidea_crumb = self.generate_crumb(self.user, 'method=noidea') self.assign('noidea_crumb', noidea_crumb) else: self.assign('error', 'unknown_context') # do some sanity checking on the user self.assign("username", other_username) if other_username: other_user = User.get_user_by_username(other_username) if other_user: if Blocked.is_user_blocked(self.user.nsid, other_user.nsid): self.assign('blocked', 1) elif Membership.has_user_opted_out(other_user.nsid): self.assign('optedout', 1) else: pass self.assign("other_user", other_user) # # crumbs crumb = self.generate_crumb(self.user, 'method=suggest') self.assign('suggest_crumb', crumb) # go! self.display('chooser.html') return
def get (self, context, filter) : min_perms = self.min_perms if self.request.get('perms') == 'write' : min_perms = 'write' if not self.check_logged_in(min_perms) : self.do_flickr_auth(min_perms) return # this is who I am ... if not context and self.request.get('user') : context = 'user' filter = self.request.get('user') self.assign('context', context) # Default, choose a user if not context : self.display('chooser.html') return # ok, what are we trying to do... other_user = None other_username = None if context == 'user' : other_username = filter elif context == 'photo' : # magic referer glue, mostly for the Brooklyn Museum headers = self.request.headers if headers.has_key('Referer') : u = urlparse.urlparse(headers['Referer']) m = re.match(r'(?:www\.)?flickr\.com', u[1]) if not m : self.error(404) return m = re.match(r'/photos/(?:[^/]+)/(\d+)', u[2]) if m : filter = m.groups()[0] else : self.error(404) return # end of magic glue method = 'flickr.photos.getInfo' args = { 'photo_id' : filter, 'auth_token' : self.user.token, } ttl = 60 * 60 rsp = self.proxy_api_call(method, args, ttl) if not rsp or not rsp.has_key('photo') : self.assign('error', 'no_photo') elif rsp['photo'].has_key('location') : self.assign('error', 'already_geotagged') else : # this is kind of dumb in the end... spr = { 'id': rsp['photo']['id'], 'owner' : rsp['photo']['owner']['nsid'], 'secret' : rsp['photo']['secret'], 'server' : rsp['photo']['server'], 'farm' : rsp['photo']['farm'], 'title' : rsp['photo']['title']['_content'], 'tags' : '', 'datetaken' : rsp['photo']['dates']['taken'], 'ownername' : rsp['photo']['owner']['username'], } if rsp['photo'].has_key('tags') : tags = map( lambda t: t['_content'], rsp['photo']['tags']['tag']) spr['tags'] = ' '.join(tags) json = simplejson.dumps({ 'photo' : [spr] }) self.assign("photo_json", json) other_username = rsp['photo']['owner']['username'] self.assign("usernsid", rsp['photo']['owner']['nsid']) elif context == 'random' : noidea_crumb = self.generate_crumb(self.user, 'method=noidea') self.assign('noidea_crumb', noidea_crumb); else : self.assign('error', 'unknown_context') # do some sanity checking on the user self.assign("username", other_username) if other_username : other_user = User.get_user_by_username(other_username) if other_user : if Blocked.is_user_blocked(self.user.nsid, other_user.nsid) : self.assign('blocked', 1) elif Membership.has_user_opted_out(other_user.nsid) : self.assign('optedout', 1) else : pass self.assign("other_user", other_user) # # crumbs crumb = self.generate_crumb(self.user, 'method=suggest') self.assign('suggest_crumb', crumb) # go! self.display('chooser.html') return
def post (self, uuid) : is_api = True if not self.ensure_config(uuid) : self.error('invalid_config', is_api) return if not self.check_logged_in(self.min_perms) : self.do_flickr_auth(self.min_perms) return if not self.validate_crumb(self.user, 'method=approve', self.request.get('crumb')) : self.error('invalid_perms', is_api) return False # # args/sig validation # req_args = ('photo_id', 'lat', 'lon', 'acc', 'context', '_s') sig_args = ['photo_id', 'lat', 'lon', 'acc', 'context', 'woeid'] if not self.ensure_required_args(req_args) : self.error('missing_args', is_api) return if not self.ensure_valid_args(req_args) : self.error('invalid_args', is_api) return if not self.ensure_robot_sig(sig_args, self.request.get('_s')) : self.error('invalid_sig') return args = { 'photo_id' : suggestion.photo_id, 'auth_token' : self.user.token, 'check_response' : 1, } rsp = self.api_call('flickr.photos.getInfo', args) if not rsp : self.error('invalid_photo') return if rsp['photo'].has_key('location') : Suggestion.reject_all_pending_suggestions_for_photo(suggestion.photo_id) self.error('already_geotagged') return mock = self.generate_mock_suggestion() if not mock : self.error('invalid suggestion') return suggestion = Suggestion.create(mock) # # this is all copy/pasted out of API/Approve <-- it should probably # go in a "library" but the whole thing gets wrapped up in boring # object/globals/self nonsense and the fact that there aren't any # in Suggestion.py # args = {'photo_id' : suggestion.photo_id, 'lat' : suggestion.latitude, 'lon' : suggestion.longitude, 'accuracy' : suggestion.accuracy, 'auth_token' : self.user.token, } geo_context = self.request.get('geo_context') if geo_context and int(geo_context) != 0 : args['context'] = geo_context rsp = self.api_call('flickr.photos.geo.setLocation', args) if not rsp : self.error('Failed to set location: Flickr API call failed', is_api) return if rsp['stat'] != 'ok' : self.error('Failed to set location: %s (%s)' % (rsp['message'], rsp['code']), is_api) return geoperms = int(self.request.get('geo_perms')) default = self.default_geoperms() if geoperms != default : method = 'flickr.photos.geo.setPerms' args = { 'photo_id' : suggestion.photo_id, 'auth_token' : self.user.token, 'is_public' : 0, 'is_contact' : 0, 'is_family' : 0, 'is_friend' : 0 } if geoperms == 1 : args['is_public'] = 1 elif geoperms == 2 : args['is_contact'] = 1 elif geoperms == 3 : args['is_friend'] = 1 args['is_family'] = 1 elif geoperms == 4 : args['is_friend'] = 1 elif geoperms == 5 : args['is_family'] = 1 else : pass rsp = self.api_call('flickr.photos.geo.setPerms', args) if rsp['stat'] != 'ok' : msg = 'Failed to set location: %s (%s)' % (rsp['message'], rsp['code']) self.log(msg, 'warning') pass if geoperms == 1 and suggestion.suggestor_nsid != self.user.nsid : suggested_by = suggestion.suggestor_nsid suggestor = User.get_user_by_nsid(suggestion.suggestor_nsid) if suggestor and suggestor.path_alias : suggested_by = suggestor.path_alias tags = "geo:suggestedby=%s" % suggested_by args = { 'photo_id' : suggestion.photo_id, 'tags' : tags, 'auth_token' : self.user.token, 'check_response' : 1, } rsp = self.api_call('flickr.photos.addTags', args) # sudo make me a preference if self.user.nsid == 'brooklyn museum' : suggested_date = suggestion.date_create suggestor_name = suggestor.username suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.nsid if suggestor.path_alias != '' : suggestor_url = 'http://www.flickr.com/photos/%s' % suggestor.path_alias # Note: don't lookup/display the place name for the WOE ID # until it's possible to do corrections on approval. comment = """On %s, <a href="%s">%s</a> suggested where this photo was taken, and they were right! """ % (suggested_date, suggestor_url, suggestor_name) method = 'flickr.photos.comments.addComment' comments_args = { 'photo_id' : photo_id, 'comment_text' : comment, 'auth_token' : self.user.token, } rsp = self.api_call(method, args) # Suggestion.approve_suggestion(suggestion) Suggestion.reject_all_pending_suggestions_for_photo(suggestion.photo_id) # photo_owner = self.user.nsid if self.user.path_alias : photo_owner = self.user.path_alias photo_url = "http://www.flickr.com/photos/%s/%s" % (photo_owner, suggestion.photo_id) return self.ok({'photo_url' : photo_url})
def generate_mock_suggestion (self) : # # Get the photo # method = 'flickr.photos.getInfo' photo_id = self.request.get('photo_id') args = { 'photo_id' : photo_id, 'auth_token' : self.user.token, } rsp = self.proxy_api_call(method, args) if not rsp or rsp['stat'] != 'ok' : self.error('no_photoinfo') return # # Ensure the photo is owned by the logged in user # if rsp['photo']['owner']['nsid'] != self.user.nsid : self.error('invalid_owner') return # # Ensure the photo isn't already geotagged # if rsp['photo'].has_key('location') : self.error('already_geotagged') return suggestor = User.get_user_by_nsid(self.config['flickr_nsid']) # # get the WOE ID # woeid = 0 args = { 'lat' : self.request.get('lat'), 'lon' : self.request.get('lon'), 'accuracy' : self.request.get('acc'), } ttl = 60 * 60 * 14 rsp = self.proxy_api_call('flickr.places.findByLatLon', args, ttl) if rsp and rsp.has_key(rsp['places']) : woeid = rsp['places']['place'][0]['woe_id'] # # Create a mock suggestion # suggestion = { 'photo_id' : int(photo_id), 'owner_id' : self.user.nsid, 'suggestor_id' : suggestor.nsid, 'suggestor_name' : suggestor.username, 'latitude' : float(self.request.get('lat')), 'longitude' : float(self.request.get('lon')), 'accuracy' : int(self.request.get('acc')), 'woeid' : woeid, 'context' : int(self.request.get('context')), # 'created' : 'datetime' # 'updated' : 'datetime' 'status' : 1, 'comment_id' : '', } return suggestion