def GET(self): result = {} service_parameter = web.input(service = None)['service'] question_id_parameter = web.input(question_id = None)['question_id'] sort_parameter = web.input(sort = 'week')['sort'] pagesize_parameter = web.input(pagesize = 30)['pagesize'] try: if service_parameter: se_downloader = StackExchangeDownloader(service_parameter) if question_id_parameter: se_downloader.get_post(question_id_parameter, False) else: questions = se_downloader.get_questions_by_hotness(pagesize = pagesize_parameter, sort = sort_parameter) for question in questions: question_id = int(question['question_id']) score = int(question['score']) if score > VOTES_ENTRY_LEVEL: taskqueue.add(url='/admin/topquestionsretriever?service=%s&question_id=%s&sort=%s' % \ (service_parameter, question_id, sort_parameter) , method = 'GET', queue_name = 'retriever') else: supported_services = StackAuthDownloader.get_supported_services() for service in supported_services.keys: if not service.startswith('meta.'): taskqueue.add(url='/admin/topquestionsretriever?service=%s&sort=%s' % \ (service, sort_parameter), method = 'GET', queue_name = 'retriever') except Exception: logging.exception("Exception handling TopQuestionRetriever") result['result'] = True return render.admin(result)
def GET(self): try: #return render.oops("..OFFLINE FOR MAINTENANCE..") question_id = web.input(question=None)['question'] service = web.input(service=None)['service'] pretty_links = web.input(prettylinks='true')['prettylinks'] printer = web.input(printer='true')['printer'] link_to_home = web.input(linktohome='true')['linktohome'] pretty_print = web.input(prettyprint='true')['prettyprint'] comments = web.input(comments='true')['comments'] format = web.input( format='HTML')['format'] #For future implementations answer_id = web.input(answer=None)['answer'] hide_question = web.input(hidequestion='true' if ( answer_id is not None) else 'false')['hidequestion'] #Check for malformed request if not service or not question_id or not question_id.isdigit() or ( answer_id and not answer_id.isdigit()): return Index().GET() #Meta normalization service = utils.normalize_meta(service) #Check for static questions if "%s_%s" % (service, question_id) in urls.static_questions: deferred.defer(worker.deferred_static_counters, question_id, service) return web.redirect( urls.static_questions["%s_%s" % (service, question_id)]) se_downloader = StackExchangeDownloader(service) #Everything that comes outside the stackprinter homepage, stackoverflow and stackexchange is now heavily cached bypass_cache = False referrer = os.environ.get("HTTP_REFERER") if referrer: try: referrer_key = re.match('^(http|https)://(.*).com', referrer).group(2) if referrer_key in StackAuthDownloader.get_supported_services( ).keys or referrer in ('http://www.stackprinter.com/', 'http://stackprinter.appspot.com/'): bypass_cache = True except: pass post = se_downloader.get_post(question_id, bypass_cache) if post is None: return render.oops(NOT_FOUND_ERROR) return render.export(service, post, pretty_links == 'true', printer == 'true', link_to_home == 'true', pretty_print == 'true', comments == 'true', answer_id, hide_question == 'true') except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
def GET(self): try: #return render.oops("..OFFLINE FOR MAINTENANCE..") question_id = web.input(question = None)['question'] service = web.input(service = None)['service'] pretty_links = web.input(prettylinks = 'true')['prettylinks'] printer = web.input(printer = 'true')['printer'] link_to_home = web.input(linktohome = 'true')['linktohome'] pretty_print = web.input(prettyprint = 'true')['prettyprint'] comments = web.input(comments = 'true')['comments'] format = web.input(format = 'HTML')['format'] #For future implementations answer_id = web.input(answer = None)['answer'] font_family = web.input(font_family = DEFAULT_FONT_FAMILY)['font_family'] hide_question = web.input(hidequestion = 'true' if (answer_id is not None) else 'false' )['hidequestion'] #Check for malformed request if not service or not question_id or not question_id.isdigit() or (answer_id and not answer_id.isdigit()): return Index().GET() #Normalize font-family if not font_family.replace(" ","").isalpha(): font_family = DEFAULT_FONT_FAMILY #Meta normalization service = utils.normalize_meta(service) #Check for static questions if "%s_%s" % (service,question_id) in urls.static_questions: deferred.defer(worker.deferred_static_counters, question_id, service) return web.redirect(urls.static_questions["%s_%s" % (service,question_id)]) se_downloader = StackExchangeDownloader(service) #Everything that comes outside the stackprinter homepage, stackoverflow and stackexchange is now heavily cached bypass_cache = False referrer = os.environ.get("HTTP_REFERER") if referrer: try: referrer_key = re.match('^(http|https)://(.*).com',referrer).group(2) if referrer_key in StackAuthDownloader.get_supported_services().keys or referrer in ('http://www.stackprinter.com/','http://stackprinter.appspot.com/'): bypass_cache = True except: pass post = se_downloader.get_post(question_id, bypass_cache) if post is None: return render.oops(NOT_FOUND_ERROR) return render.export(service, post, pretty_links == 'true', printer == 'true', link_to_home == 'true', pretty_print == 'true', comments == 'true', answer_id, hide_question == 'true', font_family ) except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
def GET(self): web.header('Content-type', 'application/json') try: question_id = web.input()['question'] service = web.input()['service'] title = memcache.get("%s%s" % (str(question_id), service)) if title is None: se_downloader = StackExchangeDownloader(service) title = se_downloader.get_question_title(question_id) memcache.add("%s%s" % (str(question_id), service), title, 7200) return '{"title":"%s"}' % title.replace('"','\\"').replace('\\','\\\\') except Exception : return '{"title":"%s"}' % NOT_FOUND_ERROR
def GET(self): web.header('Content-type', 'text/plain') try: tag_filter = web.input()['q'] service = web.input()['service'] tags = memcache.get("%s|%s" % (tag_filter, service)) if tags is None: se_downloader = StackExchangeDownloader(service) tags = se_downloader.get_tags(tag_filter) memcache.add("%s|%s" % (tag_filter, service), tags) return tags except Exception, exception: return ""
def GET(self): web.header('Content-type', 'application/json') try: question_id = web.input()['question'] service = web.input()['service'] title = memcache.get("%s%s" % (str(question_id), service)) if title is None: se_downloader = StackExchangeDownloader(service) title = se_downloader.get_question_title(question_id) memcache.add("%s%s" % (str(question_id), service), title, 7200) return '{"title":"%s"}' % title.replace('"', '\\"').replace( '\\', '\\\\') except Exception: return '{"title":"%s"}' % NOT_FOUND_ERROR
def GET(self): try: service = web.input(service=None)['service'] username = web.input(username=None)['username'] page = web.input(page=1)['page'] user_id = web.input(userid=None)['userid'] if not service: return render.favorites() if service in StackAuthDownloader.get_supported_services().keys: if username: match = re.search('.+\|(\d+)', username) if match: user_id = match.group(1) se_downloader = StackExchangeDownloader(service) if user_id: users = se_downloader.get_users_by_id(user_id) else: users = se_downloader.get_users(username) if len(users) > 1: return render.favorites_user_selection(users, service) elif len(users) == 1: user_id = users[0]['user_id'] result, pagination = se_downloader.get_favorites_questions( user_id, page) return render.favorites_stackexchange( users[0]['display_name'], user_id, result, service, pagination) else: return render.favorites(message=NOT_FOUND_ERROR) elif service == "delicious": try: delicious_downloader = DeliciousDownloader() result = delicious_downloader.get_favorites_questions( username) return render.favorites_delicious(username, result) except: return render.favorites(message=NOT_FOUND_ERROR) else: raise UnsupportedServiceError(service, UNSUPPORTED_SERVICE_ERROR) except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
def GET(self): page = web.input(page=1)['page'] service = web.input(service=None)['service'] category = web.input(category=None)['category'] logout = web.input(logout='false')['logout'] user_info = None associated_sites = None associated_sites_keys = None user = web.ctx.env.get('webob.adhoc_attrs').get('user') if user and user.auth_ids: profile_keys = [ndb.Key('UserProfile', p) for p in user.auth_ids] profiles = ndb.get_multi(profile_keys) user_info = profiles[0].user_info['extra']['raw_info'] associated_sites = profiles[0].user_info['extra'][ 'associated_sites'] associated_sites_keys = profiles[0].user_info['extra'][ 'associated_sites_keys'] if category in ('favorites', 'asked', 'answered') and user_info: se_downloader = StackExchangeDownloader(service) if category == 'favorites': result, pagination = se_downloader.get_favorites_questions( associated_sites[service]['user_id'], page) if category == 'asked': result, pagination = se_downloader.get_asked_questions( associated_sites[service]['user_id'], page) if category == 'answered': result, pagination = se_downloader.get_answered_questions( associated_sites[service]['user_id'], page) return render.myse_questions(user_info['display_name'], associated_sites[service]['user_id'], result, service, pagination, category) if logout == 'true' and user_info: StackAuthDownloader.invalidate_auth_token( (profiles[0].credentials).access_token) web.ctx.env.get('webob.adhoc_attrs').get('session').key.delete() user.key.delete() profiles[0].key.delete() web.redirect('/myse') return render.myse(user_info, associated_sites, associated_sites_keys)
def GET(self): try: service = web.input(service = None)['service'] username = web.input(username = None)['username'] page = web.input(page = 1)['page'] user_id = web.input(userid = None)['userid'] if not service: return render.favorites() if service in StackAuthDownloader.get_supported_services().keys: if username: match = re.search('.+\|(\d+)', username) if match: user_id = match.group(1) se_downloader = StackExchangeDownloader(service) if user_id: users = se_downloader.get_users_by_id(user_id) else: users = se_downloader.get_users(username) if len(users) > 1: return render.favorites_user_selection(users, service) elif len(users) == 1: user_id = users[0]['user_id'] result, pagination = se_downloader.get_favorites_questions(user_id, page) return render.favorites_stackexchange(users[0]['display_name'], user_id, result, service, pagination) else: return render.favorites(message = NOT_FOUND_ERROR) elif service == "delicious": try: delicious_downloader = DeliciousDownloader() result = delicious_downloader.get_favorites_questions(username) return render.favorites_delicious(username, result) except: return render.favorites(message = NOT_FOUND_ERROR) else: raise UnsupportedServiceError( service, UNSUPPORTED_SERVICE_ERROR) except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
def GET(self): try: render = web.render question_id = web.input()['question'] service = web.input()['service'] se_downloader = StackExchangeDownloader(service) question = se_downloader.get_question_quicklook(question_id) if not question: return render.oops(NOT_FOUND_ERROR) if question.has_key('accepted_answer_id'): accepted_answer = se_downloader.get_answer_quicklook(question['accepted_answer_id']) else: accepted_answer = None return render.quicklook(service, question, accepted_answer) except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
def GET(self): try: result = [] service = web.input(service = None)['service'] tagged = web.input(tagged = None)['tagged'] page = web.input(page = 1)['page'] if not service: return render.topvoted() se_downloader = StackExchangeDownloader(service) if tagged: result, pagination = se_downloader.get_questions_by_tags(tagged, page) else: result, pagination = se_downloader.get_questions_by_votes(page) return render.topvoted_tagged(tagged.strip(), result, service, pagination) except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
def GET(self): try: render = web.render question_id = web.input()['question'] service = web.input()['service'] se_downloader = StackExchangeDownloader(service) question = se_downloader.get_question_quicklook(question_id) if not question: return render.oops(NOT_FOUND_ERROR) if question.has_key('accepted_answer_id'): accepted_answer = se_downloader.get_answer_quicklook( question['accepted_answer_id']) else: accepted_answer = None return render.quicklook(service, question, accepted_answer) except (sepy.ApiRequestError, UnsupportedServiceError), exception: logging.error(exception) return render.oops(exception.message)
class WorkerTestCase(unittest.TestCase): def setUp(self): self.spdownloader = StackExchangeDownloader('stackoverflow') def test_answers_save_and_get_from_datastore(self): answers = ['dict1', 'dict2', 'dict3', 'dict4'] question_id = 1 service = 'foo' deferred_store_answers_to_cache(question_id, service, answers) answers_from_cache = dbquestion.get_answers(question_id, service) self.assertEquals(answers, answers_from_cache) #636 answers answers = self.spdownloader.get_answers(58640) deferred_store_answers_to_cache(58640, 'stackoverflow', answers) answers_from_cache = dbquestion.get_answers(58640, 'stackoverflow') self.assertEquals(answers, answers_from_cache) #148 answers answers = self.spdownloader.get_answers(101268) deferred_store_answers_to_cache(101268, 'stackoverflow', answers) answers_from_cache = dbquestion.get_answers(101268, 'stackoverflow') self.assertEquals(answers, answers_from_cache) #0 answers answers = self.spdownloader.get_answers(3940165) deferred_store_answers_to_cache(3940165, 'stackoverflow', answers) answers_from_cache = dbquestion.get_answers(3940165, 'stackoverflow') self.assertEquals(answers, answers_from_cache) def test_question_save_and_get_from_datastore(self): question = ['dict1'] question_id = 1 service = 'foo' deferred_store_question_to_cache(question_id, service, question) question_from_cache = dbquestion.get_question(question_id, service) self.assertEquals(question, question_from_cache) question = self.spdownloader.get_question(3940165) deferred_store_question_to_cache(3940165, 'stackoverflow', question) question_from_cache = dbquestion.get_question(3940165, 'stackoverflow') self.assertEquals(question, question_from_cache)
def GET(self): page = web.input(page = 1)['page'] service = web.input(service = None)['service'] category = web.input(category = None)['category'] logout = web.input(logout = 'false')['logout'] user_info = None associated_sites = None associated_sites_keys = None user = web.ctx.env.get('webob.adhoc_attrs').get('user') if user and user.auth_ids: profile_keys = [ndb.Key('UserProfile', p) for p in user.auth_ids] profiles = ndb.get_multi(profile_keys) user_info = profiles[0].user_info['extra']['raw_info'] associated_sites = profiles[0].user_info['extra']['associated_sites'] associated_sites_keys = profiles[0].user_info['extra']['associated_sites_keys'] if category in ('favorites','asked','answered') and user_info: se_downloader = StackExchangeDownloader(service) if category == 'favorites': result, pagination = se_downloader.get_favorites_questions(associated_sites[service]['user_id'], page) if category == 'asked': result, pagination = se_downloader.get_asked_questions(associated_sites[service]['user_id'], page) if category == 'answered': result, pagination = se_downloader.get_answered_questions(associated_sites[service]['user_id'], page) return render.myse_questions(user_info['display_name'], associated_sites[service]['user_id'], result, service, pagination, category) if logout == 'true' and user_info: StackAuthDownloader.invalidate_auth_token((profiles[0].credentials).access_token) web.ctx.env.get('webob.adhoc_attrs').get('session').key.delete() user.key.delete() profiles[0].key.delete() web.redirect('/myse') return render.myse(user_info, associated_sites, associated_sites_keys)
def setUp(self): self.spdownloader = StackExchangeDownloader('stackoverflow')
class StackprinterDownloaderTestCase(unittest.TestCase): def setUp(self): self.spdownloader = StackExchangeDownloader('stackoverflow') #self.spdownloader.retriever = MockRetriever() #Comment to test ONLINE def test_get_question(self): assert self.spdownloader.get_question(9) is not None assert self.spdownloader.get_question(0) is None assert self.spdownloader.get_question(9)['creation_date'] == 1217547659 assert self.spdownloader.get_question(9)['title'] == "How do I calculate someone's age in C#?" def test_get_question_title(self): assert self.spdownloader.get_question_title(9)== "How do I calculate someone's age in C#?" assert self.spdownloader.get_question_title(0) is None def test_get_answer_quicklook(self): assert self.spdownloader.get_answer_quicklook(22) is not None assert self.spdownloader.get_answer_quicklook(22)['title'] != '' assert self.spdownloader.get_answer_quicklook(0) is None def test_get_questions_by_tags(self): assert len(self.spdownloader.get_questions_by_tags('python', 1)[0]) > 0 assert self.spdownloader.get_questions_by_tags('python', 1)[1].total > 0 assert len(self.spdownloader.get_questions_by_tags('atagthedoesnotexist', 1)[0]) == 0 assert self.spdownloader.get_questions_by_tags('atagthedoesnotexist', 1)[1].total == 0 assert self.spdownloader.get_questions_by_tags('python', 1)[0][0].question_id > 0 assert self.spdownloader.get_questions_by_tags('python', 1)[0][0].url.startswith('http') assert self.spdownloader.get_questions_by_tags('python', 1)[0][0].service != '' def test_get_questions_by_votes(self): assert len(self.spdownloader.get_questions_by_votes(page = 1)[0]) > 0 assert self.spdownloader.get_questions_by_votes(page = 1)[1].total > 0 assert self.spdownloader.get_questions_by_votes(page = 1)[0][0].question_id > 0 assert self.spdownloader.get_questions_by_votes(page = 1)[0][0].url.startswith('http') assert self.spdownloader.get_questions_by_votes(page = 1)[0][0].service != '' def test_get_answers(self): assert len(self.spdownloader.get_answers(656155)) == 3 assert self.spdownloader.get_answers(656155)[0]['title'] != '' assert len(self.spdownloader.get_answers(9033)) == 303 assert len(self.spdownloader.get_answers(656155)) == 3 assert len(self.spdownloader.get_answers(37671)) == 51 assert len(self.spdownloader.get_answers(209015)) == 49 assert len(self.spdownloader.get_answers(347584)) == 50 def test_get_users_by_id(self): assert len(self.spdownloader.get_users_by_id(130929)) == 1 assert self.spdownloader.get_users_by_id(130929)[0]['display_name'] == 'systempuntoout' def test_get_users(self): assert len(self.spdownloader.get_users('systempuntoout')) == 1 def test_get_favorites_questions(self): assert len(self.spdownloader.get_favorites_questions(130929, 1)[0]) > 0 assert self.spdownloader.get_favorites_questions(130929, 1)[0][0].title !='' assert self.spdownloader.get_favorites_questions(130929, 1)[1].total > 0 assert self.spdownloader.get_favorites_questions(130929, 1)[0][0].question_id > 0 assert self.spdownloader.get_favorites_questions(130929, 1)[0][0].url.startswith('http') assert self.spdownloader.get_favorites_questions(130929, 1)[0][0].service != '' def test_get_tags(self): assert len(self.spdownloader.get_tags('python')) > 0
class StackprinterDownloaderTestCase(unittest.TestCase): def setUp(self): self.spdownloader = StackExchangeDownloader('stackoverflow') #self.spdownloader.retriever = MockRetriever() #Comment to test ONLINE def test_get_question(self): assert self.spdownloader.get_question(9) is not None assert self.spdownloader.get_question(0) is None assert self.spdownloader.get_question(9)['creation_date'] == 1217547659 assert self.spdownloader.get_question( 9)['title'] == "How do I calculate someone's age in C#?" def test_get_question_title(self): assert self.spdownloader.get_question_title( 9) == "How do I calculate someone's age in C#?" assert self.spdownloader.get_question_title(0) is None def test_get_answer_quicklook(self): assert self.spdownloader.get_answer_quicklook(22) is not None assert self.spdownloader.get_answer_quicklook(22)['title'] != '' assert self.spdownloader.get_answer_quicklook(0) is None def test_get_questions_by_tags(self): assert len(self.spdownloader.get_questions_by_tags('python', 1)[0]) > 0 assert self.spdownloader.get_questions_by_tags('python', 1)[1].total > 0 assert len( self.spdownloader.get_questions_by_tags('atagthedoesnotexist', 1)[0]) == 0 assert self.spdownloader.get_questions_by_tags('atagthedoesnotexist', 1)[1].total == 0 assert self.spdownloader.get_questions_by_tags('python', 1)[0][0].question_id > 0 assert self.spdownloader.get_questions_by_tags( 'python', 1)[0][0].url.startswith('http') assert self.spdownloader.get_questions_by_tags('python', 1)[0][0].service != '' def test_get_questions_by_votes(self): assert len(self.spdownloader.get_questions_by_votes(page=1)[0]) > 0 assert self.spdownloader.get_questions_by_votes(page=1)[1].total > 0 assert self.spdownloader.get_questions_by_votes( page=1)[0][0].question_id > 0 assert self.spdownloader.get_questions_by_votes( page=1)[0][0].url.startswith('http') assert self.spdownloader.get_questions_by_votes( page=1)[0][0].service != '' def test_get_answers(self): assert len(self.spdownloader.get_answers(656155)) == 3 assert self.spdownloader.get_answers(656155)[0]['title'] != '' assert len(self.spdownloader.get_answers(9033)) == 303 assert len(self.spdownloader.get_answers(656155)) == 3 assert len(self.spdownloader.get_answers(37671)) == 51 assert len(self.spdownloader.get_answers(209015)) == 49 assert len(self.spdownloader.get_answers(347584)) == 50 def test_get_users_by_id(self): assert len(self.spdownloader.get_users_by_id(130929)) == 1 assert self.spdownloader.get_users_by_id( 130929)[0]['display_name'] == 'systempuntoout' def test_get_users(self): assert len(self.spdownloader.get_users('systempuntoout')) == 1 def test_get_favorites_questions(self): assert len(self.spdownloader.get_favorites_questions(130929, 1)[0]) > 0 assert self.spdownloader.get_favorites_questions(130929, 1)[0][0].title != '' assert self.spdownloader.get_favorites_questions(130929, 1)[1].total > 0 assert self.spdownloader.get_favorites_questions( 130929, 1)[0][0].question_id > 0 assert self.spdownloader.get_favorites_questions( 130929, 1)[0][0].url.startswith('http') assert self.spdownloader.get_favorites_questions(130929, 1)[0][0].service != '' def test_get_tags(self): assert len(self.spdownloader.get_tags('python')) > 0