Rev 3350 | Rev 5291 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 31-Aug-2011@author: Varun Gupta'''import tornado.httpserverimport tornado.ioloopimport tornado.webimport json, os, ConfigParser, sysfrom PyLucene.Retriever import Retrieverfrom Utils import getItemsWithTopScore, isPriceSame, getProductClusters, getFilteredClustersWithTopScores, \getDisplayInfo, getSynonymscmd_folder = os.path.dirname(os.path.abspath(os.environ["HOME"] + "/code/trunk/PyProj/src/shop2020/"))if cmd_folder not in sys.path:sys.path.insert(0, cmd_folder)from shop2020.clients.CatalogClient import CatalogClientfrom shop2020.thriftpy.model.v1.catalog.ttypes import statusclass BaseHandler(tornado.web.RequestHandler):def get_current_user(self):return self.get_secure_cookie('userauth')class LoginHandler(BaseHandler):def get(self):self.loader = tornado.template.Loader('HTMLTemplates')self.write(self.loader.load('LoginForm.html').generate())def post(self):config = ConfigParser.SafeConfigParser()config.read('app.cfg')username = self.get_argument('username')password = self.get_argument('password')if username == config.get('auth', 'username') and password == config.get('auth', 'password'):print 'Password Matched'self.set_secure_cookie("userauth", username + '_' + password)self.redirect('/')else:self.redirect('/login')class FeedbackHandler(BaseHandler):def save(self, entity, source, feedback_type, selected_item = None):self.feedback_file = '/tmp/feedback.json'file_to_read = open(self.feedback_file, 'r')feedbacks_json = file_to_read.read()file_to_read.close()feedbacks = json.loads(feedbacks_json) if len(feedbacks_json) > 1 else {}if entity not in feedbacks: feedbacks[entity] = {}feedbacks[entity][source] = {'type': feedback_type}if selected_item is not None: feedbacks[entity][source]['selected_item'] = selected_itemfile_to_write = open(self.feedback_file, 'w')file_to_write.write(json.dumps(feedbacks))file_to_write.close()def post(self):feedback_type = self.get_argument('type')entity_id = self.get_argument('entityId')price_data_source = self.get_argument('source')print feedback_type, entity_id, price_data_sourceif feedback_type == 'select':selected_item = self.get_argument('selected')print selected_itemself.save(entity_id, price_data_source, feedback_type, selected_item)else:self.save(entity_id, price_data_source, feedback_type)def get(self):print 'GET: Feedback data'self.feedback_file = '/tmp/feedback.json'file_to_read = open(self.feedback_file, 'r')feedbacks_json = file_to_read.read()file_to_read.close()self.write(feedbacks_json)class MainHandler(BaseHandler):@tornado.web.authenticateddef get(self):self.loader = tornado.template.Loader('HTMLTemplates')catalog_client = CatalogClient().get_client()items = catalog_client.getAllItemsByStatus(status.ACTIVE)items.extend(catalog_client.getAllItemsByStatus(status.PAUSED))items.extend(catalog_client.getAllItemsByStatus(status.PAUSED_BY_RISK))synonyms = getSynonyms()print synonymsretriever = Retriever()products = {}for item in items:if item.category in (10002, 10003, 10004, 10005, 10010): products[item.catalogItemId] = itemcomparative_prices = []for item in sorted(products.itervalues(), key = lambda item: item.brand):try:model_name = item.modelName.strip() if len(item.modelName.strip()) > 0 else Nonemodel_number = item.modelNumber.strip() if len(item.modelNumber.strip()) > 0 else Nonesynonyms_for_this_model = synonyms[item.catalogItemId] if item.catalogItemId in synonyms else Nonesearch_results = retriever.retrieve(model_number = model_number, model_name = model_name, brand = item.brand, synonyms = synonyms_for_this_model)clusters = getProductClusters(search_results)filtered_clusters = getFilteredClustersWithTopScores(clusters)display_info = getDisplayInfo(filtered_clusters)product_name = "%s " % item.brandproduct_name += "%s " % model_name if model_name is not None else ''product_name += model_number if model_number is not None else ''display_info['entity_id'] = item.catalogItemIddisplay_info['product_name'] = product_namedisplay_info['saholic'] = {'price': item.sellingPrice}comparative_prices.append(display_info)except Exception as e:print eself.write(self.loader.load('PriceChart.html').generate(data = comparative_prices))settings = {'static_path': os.path.join(os.path.dirname(__file__), 'static'),'login_url': '/login','cookie_secret' :"61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo="}application = tornado.web.Application([(r"/", MainHandler),(r"/login", LoginHandler),(r"/feedback", FeedbackHandler),(r"/(jquery-1.6.2.min\.js)", tornado.web.StaticFileHandler, dict(path=settings['static_path']))], **settings)if __name__ == '__main__':http_server = tornado.httpserver.HTTPServer(application)http_server.listen(8889)tornado.ioloop.IOLoop.instance().start()