def post(self): broadcaster = BroadcastMessage() userUtil = UserUtils() title = self.request.get('title', None) link = self.request.get('link', None) domain = self.request.get('domain', None) user_id = self.request.get('user_id', None) updated = self.request.get('updated', None) embeded = self.request.get('e', None) link_category = self.request.get('link_category', None) subscribers = simplejson.loads(self.request.get('subscribers', None)) message = Message( title = title, link = link , domain = domain) user = SessionModel.gql('WHERE __key__ = :1', db.Key(user_id)).get() if user is None: logging.info('can\'t determine user by id: %s' % user_id) return logging.info('user %s' % user.instaright_account) avatar = userUtil.getAvatar(user.instaright_account) logging.info('avatar %s' %avatar) messageAsJSON = [{'u':{'id':user_id, 't':title,'ol':link, 'l':LinkUtils.generate_instaright_link(user.url_encode26, LinkUtils.make_title(title)),'d':domain,'dd': LinkUtils.generate_domain_link(domain), 'a':avatar, 'u':updated, 'source': user.client, 'lc':link_category, 'html_lc':LinkUtils.getLinkCategoryHTML(user), 'e': embeded, 'n': int(time.mktime(datetime.datetime.now().timetuple()))}}] logging.info('sending message %s ' %messageAsJSON) broadcaster.send_message(messageAsJSON) xmpp_handler.send_message(subscribers, message)
def get(self, url_hash, title): try: self.redirect_perm() self.get_user() url_hash = urllib.unquote(url_hash) logging.info('url hash: %s' % url_hash) logging.info('category screen_name %s' %self.screen_name) category=None if self.avatar is None: self.avatar='/static/images/noavatar.png' sessionModel = SessionModel.gql('where url_encode26 = :1', url_hash).get() if sessionModel is None: logging.info('not article with hash %s ... redirecting' % url_hash) self.redirect('/') return generated_title = LinkUtils.make_title(sessionModel.title) if title != generated_title: self.redirect('/article/'+url_hash+'/'+generated_title) return instaright_link = LinkUtils.generate_instaright_link(url_hash, generated_title) links = Links.gql('where url_hash = :1', url_hash).get() userUtil = UserUtils() if links is not None: category = links.categories sessionTitle = LinkUtils.generateUrlTitle(sessionModel.title) template_variables = {'page_footer': PageUtils.get_footer(), 'user':self.screen_name, 'logout_url':'/account/logout', 'avatar':self.avatar,'story_avatar': userUtil.getAvatar(sessionModel.instaright_account), 'story_user': sessionModel.instaright_account, 'domain': sessionModel.domain, 'title':sessionModel.title, 'link': sessionModel.url, 'updated':sessionModel.date, 'id': str(sessionModel.key()), 'instaright_link': instaright_link, 'category': LinkUtils.getLinkCategoryHTML(sessionModel), 'dd': LinkUtils.generate_domain_link(sessionModel.domain)} path = os.path.join(os.path.dirname(__file__), 'templates/article.html') self.response.headers["Content-Type"] = "text/html; charset=utf-8" self.response.out.write(template.render(path, template_variables)) except: e,e0 = sys.exc_info()[0], sys.exc_info()[1] logging.error('handled error : %s, %s ' %( e, e0 )) self.redirect('/')
def get(self): memcache_key='feed_json_cache' cached_feed= memcache.get(memcache_key) format = self.request.get('format', None); cache_exp = datetime.datetime.now() + datetime.timedelta(minutes=5) cache_exp_ts = time.mktime(cache_exp.timetuple()) userUtil = UserUtils() if format == 'json' and cached_feed: logging.info('getting json from cache') self.response.headers['Content-Type'] = "application/json" self.response.out.write(simplejson.dumps(cached_feed, default=lambda o: {'u':{'id':str(o.key()), 't':unicode(o.title), 'dd': LinkUtils.generate_domain_link(o.domain), 'd':o.domain, 'user': urllib.unquote(o.instaright_account), 'source': o.client, 'u': int(time.mktime(o.date.timetuple())), 'l':LinkUtils.generate_instaright_link(o.url_encode26,LinkUtils.make_title(o.title)),'a':userUtil.getAvatar(o.instaright_account),'ol':o.url, 'lc':LinkUtils.getLinkCategory(o), 'html_lc':LinkUtils.getLinkCategoryHTML(o), 'e': o.embeded, 'n': int(time.mktime(datetime.datetime.now().timetuple()))}})) return entries = SessionModel.gql('ORDER by date DESC').fetch(10) memcache.set(memcache_key, entries, time = cache_exp_ts) if not entries: self.response.out.write('Nothing here') #now = datetime.datetime.now().strftime("%Y-%m-%dT%H\:%i\:%sZ") if format is None or format == 'xml' or format == 'valid_xml': updated_entries = [ (str(o.key()), unicode(o.title), LinkUtils.generate_domain_link(o.domain), LinkUtils.generate_instaright_link(o.url_encode26,LinkUtils.make_title(o.title)),userUtil.getAvatar(o.instaright_account), o.date, LinkUtils.generate_instaright_link(o.url_encode26,LinkUtils.make_title(o.title)) ) for o in entries ] template_variables = { 'entries' : updated_entries, 'dateupdated' : datetime.datetime.today()} if format == 'valid_xml': path= os.path.join(os.path.dirname(__file__), 'templates/feed_valid.html') else: path= os.path.join(os.path.dirname(__file__), 'templates/feed.html') self.response.headers['Content-Type'] = "application/atom+xml" self.response.out.write(template.render(path,template_variables)) return if format == 'json': self.response.headers['Content-Type'] = "application/json" self.response.out.write(simplejson.dumps(entries, default=lambda o: {'u':{'id':str(o.key()), 't':unicode(o.title), 'dd': LinkUtils.generate_domain_link(o.domain), 'd':o.domain, 'user': o.instaright_account, 'u': int(time.mktime(o.date.timetuple())), 'l':LinkUtils.generate_instaright_link(o.url_encode26,LinkUtils.make_title(o.title)), 'a':userUtil.getAvatar(o.instaright_account),'ol':o.url, 'source': o.client, 'e': o.embeded, 'lc':LinkUtils.getLinkCategory(o), 'html_lc':LinkUtils.getLinkCategoryHTML(o), 'n': int(time.mktime(datetime.datetime.now().timetuple()))}})) return
def _testKloutScore(self): user = "******" config = ConfigParser.ConfigParser() config.read(os.path.split(os.path.realpath(__file__))[0] + "/../properties/general.ini") klout_api_key = config.get("social", "klout_api_key") score = UserUtils.getKloutScore(user, klout_api_key) logging.info("got score %s for %s " % (score, user)) self.assertTrue(score > 0)
def post(self, user): logging.info('fetching info for user %s' % user) user_decoded = urllib.unquote(user) user_decoded = user_decoded.strip() logging.info('fetching info for user %s' % user_decoded) userDetail = UserUtils.gather_info(user_decoded) if userDetail.name: userDetail.put() logging.info('done fetching info for user %s' % user_decoded) logging.info('fetching info for user %s' % user)
def get(self): uu = UserUtils() logout_cookie = self.request.cookies.get('user_logged_out') user_details = uu.getUserDetails(self) screen_name = user_details["screen_name"] google_login_url = users.create_login_url('/') if screen_name is None or logout_cookie is not None: template_variables = { 'google_login_url': google_login_url } path = os.path.join(os.path.dirname(__file__), 'templates/register.html') self.response.headers["Contant-Type"]= "text/html; charset=utf-8" self.response.out.write(template.render(path,template_variables)) else: template_variables = {} path = os.path.join(os.path.dirname(__file__), 'templates/index.html') self.response.headers["Contant-Type"]= "text/html; charset=utf-8" self.response.out.write(template.render(path,template_variables))
def get(self, domain): format=self.request.get('format',None) if domain is None or len(domain) == 0: logging.info('not category in request. return empty') return if format == 'json': logging.info('domain %s json feed' % domain) userUtil = UserUtils() entries = SessionModel.gql('WHERE domain = :1 order by date desc', domain).fetch(10) self.response.headers['Content-Type'] = "application/json" #TODO insert categories for domain's view self.response.out.write(simplejson.dumps(entries, default=lambda o: {'u':{'id':str(o.key()), 't':unicode(o.title), 'l': LinkUtils.generate_instaright_link(o.url_encode26, LinkUtils.make_title(o.title), o.url), 'user': urllib.unquote(o.instaright_account), 'source': o.client, 'html_lc':LinkUtils.getLinkCategoryHTML(o), 'd': o.domain, 'lc': LinkUtils.getLinkCategory(o), 'dd':LinkUtils.generate_domain_link(o.domain), 'u': o.date.strftime("%Y-%m-%dT%I:%M:%SZ"), 'a':userUtil.getAvatar(o.instaright_account),'ol':o.url}})) return self.response.headers['Content-Type'] = "application/json" self.response.out.write("[{}]")
def get(self): cookie=self.request.get('cookie', None); instapaper_username = self.request.get('instapaper_username', None) if instapaper_username is None: logging.error('update user info based on bad instapaper account.hack') self.response.out.write('Done') return ud = UserUtils.getUserDetailsFromCookie(cookie) if ud is None: logging.error('update user info based on bad cookie. hack') self.response.out.write('Done') return ud.instapaper_account=instapaper_username ud.instaright_account=instapaper_username ud.put() self.response.out.write('Done')
def get(self, category): format=self.request.get('format',None) if category is None or category == 0: logging.info('not category in request. return empty') return if format == 'json': logging.info('catefory %s json feed' % category) userUtil = UserUtils() allentries = LinkCategory.gql('WHERE category = :1 order by updated desc', category).fetch(50) entries= [ e for e in allentries if hasattr(e,'model_details') and e.model_details is not None ] entries = entries[:10] self.response.headers['Content-Type'] = "application/json" self.response.out.write(simplejson.dumps(entries, default=lambda o: {'u':{'id':str(o.model_details.key()), 't':unicode(o.model_details.title), 'dd': LinkUtils.generate_domain_link(o.model_details.domain),'l':LinkUtils.generate_instaright_link(o.model_details.url_encode26, LinkUtils.make_title(o.model_details.title), o.model_details.url), 'd':o.model_details.domain, 'user': urllib.unquote(o.model_details.instaright_account), 'source': o.model_details.client, 'html_lc':LinkUtils.getLinkCategoryHTML(o), 'u': o.updated.strftime("%Y-%m-%dT%I:%M:%SZ"), 'a':userUtil.getAvatar(o.model_details.instaright_account),'ol':o.url,'c':category, 'lc':LinkUtils.getLinkCategory(o.model_details)}})) return self.response.headers['Content-Type'] = "application/json" self.response.out.write("[{}]")
def get(self, service): cookie=self.request.get('cookie', None) ud = UserUtils.getUserDetailsFromCookie(cookie) if ud is None: logging.error('remove user info based on bad cookie. hack') self.response.out.write('Done') return ut=UserTokens.gql('WHERE user_details = :1', ud.key()).get() if ut is None: logging.error('user defined by cookie %s has no tokens' % cookie) self.response.out.write('Done') return logging.info('fetched user %s' % ud.instaright_account) if getattr(ut, "%s_token" % service) is None: logging.error('remove unexisting service %s for cookie %s' % (service, cookie)) self.response.out.write('Done') return service_token_name="%s_token" %service ut.service_token_name=None ut.put() #TODO remove cookie self.response.out.write('Done')
def get(self): logging.info('fetching more user links ...') cookie = self.request.get('cookie', None) offset = Cast.toInt(self.request.get('offset', None), 0) logging.info('row offset %s' % offset) offset = offset * self.link_batch ud = UserUtils.getUserDetailsFromCookie(cookie) sessions = SessionModel.gql('WHERE instaright_account = :1 ORDER by date desc ', ud.instaright_account ).fetch(self.link_batch,offset) if sessions is None or len(sessions) == 0: logging.info('returned no sessions for offset %s' %offset) self.response.headers["Content-type"] = "application/json" self.response.out.write('{}') return logging.info('fetched %s sessions for user %s' %(len(sessions), ud.instaright_account)) d = {} for d_te, j in itertools.groupby(sessions, key= lambda s: s.date.date()): ss = [ {'t':ss.title,'l':ss.url,'d':ss.domain,'h':ss.url_hash} for ss in list(j) ] d[str(d_te)] = ss import operator #order by dates desc dates_sorted=sorted(d.iteritems(), key=operator.itemgetter(0), reverse=True) self.response.headers["Content-type"] = "application/json" self.response.out.write(simplejson.dumps(dates_sorted))
def post(self): category=self.request.get('category', None) url_hash=self.request.get('url', None) userUtil=UserUtils() if category is None or len(category) == 0: logging.info('no category in request. skipping ...') return if url_hash is None: logging.info('no url in request. skipping ...') return model = SessionModel.gql('WHERE url_hash = :1 order by date desc', url_hash).get() if model is None: logging.error('no session model for url hash %s ' %url_hash) return category_path='/category/%s' %category broadcaster = BroadcastMessage() date_published='' if model.date is not None: date_published=model.date.strftime("%Y-%m-%dT%I:%M:%SZ") messageAsJSON = [{'u':{'id':str(model.key()), 't':unicode(model.title),'l':model.url,'d':model.domain,'u': date_published, 'a':userUtil.getAvatar(model.instaright_account),'ol':model.url,'c':category, 'lc':category}}] logging.info('sending category message %s for users on path %s' % (messageAsJSON, category_path)) broadcaster.send_message(messageAsJSON,category_path)
def get_user(self): uu = UserUtils() userSession = None self.screen_name=None self.auth_service=None self.avatar=None self.user_uuid=None self.instaright_account=None self.user_detail_key=None self.facebook_profile = None self.facebook_oauth_token = None self.twitter_profile = None self.twitter_oauth_token = None self.google_profile = None self.google_oauth_token = None self.evernote_name = None self.evernote_oauth_token = None self.flickr_name = None self.flickr_oauth_token = None self.picplz_name = None self.picplz_oauth_token = None self.ud=None ud_modified=None new_session=False uuid_cookie = self.request.cookies.get('user_uuid') evernote_cookie = self.request.cookies.get('oauth.evernote') twitter_cookie = self.request.cookies.get('oauth.twitter') flickr_cookie = self.request.cookies.get('oauth.flickr') picplz_cookie = self.request.cookies.get('oauth.picplz') logout_cookie = self.request.cookies.get('user_logged_out') user_details=None # try to get user name by cookie or from login if uuid_cookie: #Connect uuid with registered user logging.info('reusing uuid: %s' % uuid_cookie) self.user_uuid = uuid_cookie userSession = UserSessionFE.gql('WHERE user_uuid = :1 order by last_updatetime desc' , self.user_uuid).get() if userSession is not None and userSession.user_details is not None: self.ud = UserDetails.gql('WHERE __key__ = :1', userSession.user_details).get() #fix instaright_account TODO possibly deprecated if self.ud is not None and self.ud.instapaper_account is not None: self.ud.instaright_account=self.ud.instapaper_account ud_modified=True if self.ud is None: logging.error('missing proper db entry for cookie %s' % uuid_cookie) else: user_data = self.ud.getUserInfo() self.facebook_profile = self.ud.facebook_profile self.twitter_profile = self.ud.twitter self.google_profile = self.ud.google_profile self.evernote_name = self.ud.evernote_profile self.flickr_name = self.ud.flickr_profile self.screen_name = user_data["screen_name"] self.avatar = user_data["avatar"] self.instaright_account=self.ud.instaright_account self.user_detail_key=str(self.ud.key()) logging.info('using screen name %s from session %s' %(self.screen_name, self.user_uuid)) if userSession is not None and userSession.user_details is None: logging.info('user details not defined for session ... need to fix this with oauth') # sanity check if userSession is None: logging.info('smth wicked ') userSession = UserSessionFE() if userSession and userSession.user_uuid is None: userSession.user_uuid = str(self.user_uuid) else: new_session=True self.user_uuid = uuid.uuid4() logging.info('generated new uuid: %s' % self.user_uuid) expires = datetime.datetime.now() + datetime.timedelta(minutes=60) exp_format = datetime.datetime.strftime(expires, '%a, %d-%b-%Y %H:%M:%S GMT') logging.info('expr date %s' %exp_format) self.response.headers.add_header('Set-Cookie', 'user_uuid=%s; expires=%s; path=/' %( self.user_uuid, exp_format)) userSession = UserSessionFE() userSession.user_uuuid = str(self.user_uuid) # not pretty but working if logout_cookie: logging.info('found logout cookie. reseting screen_name') self.screen_name = None self.instaright_account=None else: user_details = uu.getUserDetails(self) if user_details["screen_name"] is not None: self.screen_name = user_details["screen_name"] if user_details["avatar"] is not None: self.avatar = user_details["avatar"] if user_details["auth_service"] is not None: self.auth_service = user_details["auth_service"] if user_details["user_details_key"] is not None: #NOTE: it is very important to set user details key!!!! user_details_key = user_details["user_details_key"] userSession.user_details = user_details_key self.user_detail_key=str(user_details["user_details_key"]) #if ud changed? what then? if self.ud is None: ud = UserDetails.gql('WHERE __key__ = :1' , db.Key(self.user_detail_key)).get() self.ud = ud if user_details["instaright_account"] is not None: self.instaright_account=user_details["instaright_account"] if user_details["evernote_name"] is not None: self.evernote_name = user_details["evernote_name"] if user_details["flickr_name"] is not None: self.flickr_name = user_details["flickr_name"] userSession.active=True userSession.screen_name = self.screen_name userSession.auth_service = self.auth_service #determine path url=self.request.url scheme, netloc, path, query, fragment = urlparse.urlsplit(url) existingUserPathSession=UserSessionFE.gql('WHERE user_uuid = :1 and path = :2 and screen_name = :3' , userSession.user_uuid, path, userSession.screen_name).get() if existingUserPathSession is None: logging.info('new path %s -> %s' %(userSession.path, path)) newPathUserSession=UserSessionFE() newPathUserSession.active=userSession.active newPathUserSession.auth_service=userSession.auth_service newPathUserSession.screen_name=userSession.screen_name newPathUserSession.user=userSession.user newPathUserSession.user_details=userSession.user_details newPathUserSession.user_uuid=userSession.user_uuid newPathUserSession.path=path newPathUserSession.put() #userSession.put() user_token=None if self.ud is not None: user_token=UserTokens.gql('WHERE user_details = :1', self.ud.key()).get() if user_token is None: user_token=UserTokens() #token=UserTokens() #token.user_details = userSession.user_details #token.picplz_token= '1|oauth_secret=UxY3gF4CXmRt3tYqgYg4Ed49YbZLGuDx&oauth_token=dNyt8uanrG9sRXBse6P7uaPyZSDpwK26' #token.google_token= 'google|oauth_secret=UxY3gF4CXmRt3tYqgYg4Ed49YbZLGuDx&oauth_token=dNyt8uanrG9sRXBse6P7uaPyZSDpwK26' #token.put() user_token_modified=False evernote_oauth = None #NOTE: ud can be null on visits that include no auth if evernote_cookie is not None: evernote_oauth = OAuthAccessToken.get_by_key_name(evernote_cookie) if evernote_oauth is not None and self.ud is not None: evernote_token = evernote_oauth.oauth_token logging.info('User Details modified ... updating evetnote token') user_token.evernote_token=evernote_token user_token.evernote_additional_info=evernote_oauth.additional_info user_token_modified=True #TODO remove cookie -> after write not needed any more twitter_oauth = None if twitter_cookie is not None: logging.info('twitter cookie defined %s' % twitter_cookie) twitter_oauth = OAuthAccessToken.get_by_key_name(twitter_cookie) if twitter_oauth is not None and self.ud is not None: twitter_token = twitter_oauth.oauth_token twitter_secret= twitter_oauth.oauth_token_secret logging.info('User Details modified ... updating twitter token') user_token.twitter_token=twitter_token user_token.twitter_secret=twitter_secret user_token_modified=True logging.info('twitter promo sent? %s' % self.ud.twitter_promo_sent) if self.ud.twitter_promo_sent == False: taskqueue.add(url='/service/submit/twitter/promo', params={'user_token': twitter_token, 'user_secret': twitter_secret, 'user_details_key': str(self.ud.key())}) self.ud.twitter_promo_sent=True ud_modified=True picplz_oauth = None if picplz_cookie is not None: picplz_oauth = OAuthAccessToken.get_by_key_name(picplz_cookie) logging.info('picplz cookie defined %s' % picplz_cookie) if picplz_oauth is not None: picplz_token = picplz_oauth.oauth_token user_token.picplz_token = picplz_token user_token_modified=True #TODO remove cookie -> after write not needed any more flickr_oauth = None if flickr_cookie is not None: flickr_oauth = OAuthAccessToken.get_by_key_name(flickr_cookie) logging.info('flickr cookie defined %s' % flickr_cookie) if flickr_oauth is not None and self.ud is not None: flickr_token = flickr_oauth.oauth_token logging.info('User Details modified ... updating flickr token %s' % flickr_token) user_token.flickr_token=flickr_token user_token_modified=True if user_details is not None and user_details["facebook_access_token"] is not None: user_token.facebook_token=user_details["facebook_access_token"] user_token_modified=True if self.ud.facebook_promo_sent == False: taskqueue.add(url='/service/submit/facebook/promo', params={'user_token': user_token.facebook_token, 'user_details_key': str(self.ud.key())}) self.ud.facebook_promo_sent=True ud_modified=True if user_token_modified: if user_token.user_details is None and self.ud is not None: logging.info('user details for token not defined: ud = %s' %str(self.ud.key())) user_token.user_details=self.ud if user_token.user_details is not None: logging.info('user_token modified ... updating:for user details %s' % str(user_token.user_details.key())) user_token.put() else: logging.info('user_token user details not defined ....' ) if ud_modified: logging.info('user details modified updating ...' ) self.ud.put() self.google_oauth_token, self.twitter_oauth_token, self.facebook_oauth_token, self.evernote_oauth_token, self.picplz_oauth_token= user_token.google_token, user_token.twitter_token, user_token.facebook_token, user_token.evernote_token, user_token.picplz_token
def post(self): url = self.request.get("url", None) url_hash = LinkUtils.getUrlHash(url) user = self.request.get("user", None) title = self.request.get("title", None) if url is None: logging.info("no url detected. skipping...") return count = 1 url = urllib2.unquote(url) domain = RequestUtils.getDomain(url) if not domain or len(domain) == 0: self.response.out.write("not url: %s skipping!\n" % url) return if domain in self.skip_domains: logging.info("filering out %s" % url) return lu = LinkUtils() link = lu.getAllData(url, count) logging.info("link overall score: %s" % link.overall_score) existingLink = None try: existingLink = Links.gql("WHERE url_hash = :1", url_hash).get() if existingLink is None: existingLink = Links.gql("WHERE url = :1", url).get() except BadValueError: logging.info("bad value url %s" % url) klout_score = UserUtils.getKloutScore(user, self.klout_api_key) share_margin = self.tw_margin if klout_score is not None: link.overall_score = link.overall_score * int(klout_score) logging.info("adjusted overall score %s" % link.overall_score) share_margin = share_margin * self.klout_correction logging.info("adjusting twit margin: %s" % share_margin) logging.info("link score %s tweet margin %s ( existing %s )" % (link.overall_score, share_margin, existingLink)) if link.overall_score > share_margin and (existingLink is None or not existingLink.shared): t = Twit() t.generate_content(link, title, "") # skip tweets is text emtpy and for root domains if t.text is None or LinkUtils.isRootDomain(link.url): logging.info("twit with no body. aborting") return execute_time = TaskUtil.execution_time() logging.info("scheduling tweet for %s" % str(execute_time)) mail.send_mail( sender="*****@*****.**", to="*****@*****.**", subject="Twit to queue!", html="Twitt: %s <br> score: %s" % (t.text, link.overall_score), body="Twitt: %s <br> score: %s" % (t.text[:500], link.overall_score), ) # taskqueue.add(url='/util/twitter/twit/task', eta=execute_time, queue_name='twit-queue', params={'twit':t.text}) taskqueue.add(url="/util/twitter/twit/task", queue_name="twit-queue", params={"twit": t.text}) # update article shared status if existingLink is not None: existingLink.shared = True existingLink.put() logging.info("updated link share status") else: logging.info("not scheduled for tweeting") lh = LinkHandler() lh.update_link(url, link)