Subversion Repositories SmartDukaan

Rev

Rev 16807 | Blame | Compare with Previous | Last modification | View Log | RSS feed

'''
Created on 02-Sep-2015

@author: kshitij
'''
from pymongo.mongo_client import MongoClient
import pymongo
from dtr.storage import DataService
from elixir import *
from dtr.storage.DataService import app_offers,appmasters,app_transactions 
from sqlalchemy.sql.expression import func
from operator import or_
import datetime
from dtr.utils import utils
from dtr.utils.utils import to_java_date

con = None
maxDate=None
oneDay=86400000
DataService.initialize()
retailerMap={}
appIdMap={}
overallRetailerAppMap={}
class AppAnalyticsBasedOnRetailerId:
    def __init__(self,retailerId,appName,clicksCount,installCount,timestamp):
        self.retailerId=retailerId
        self.clicksCount=clicksCount
        self.appName=appName
        self.installCount=installCount
        self.timestamp=timestamp

class AppAnalyticsBasedOnAppId:
    def __init__(self,appId,appName,clicksCount,installCount,timestamp):
        self.appId=appId
        self.clicksCount=clicksCount
        self.appName=appName
        self.installCount=installCount
        self.timestamp=timestamp
        
class AppAnalyticsMaster:
    def __init__(self,retailerId,appId,appName,clicksCount,installCount,timestamp):
        self.retailerId=retailerId
        self.appId=appId
        self.clicksCount=clicksCount
        self.appName=appName
        self.installCount=installCount
        self.timestamp=timestamp


def get_mongo_connection(host='localhost', port=27017):
    global con
    if con is None:
        print "Establishing connection %s host and port %d" %(host,port)
        try:
            con = pymongo.MongoClient(host, port)
        except Exception, e:
            print e
            return None
    return con

def getAppTransactions():
    global maxDate
    global oneDay
    #maxDate=1440592469243
    maxDate=1440678869243
    #maxDate = utils.to_java_date(datetime.datetime.now())
#     retailerId=None
#     appName=None
#     clicksCount=0
#     installCount=0
    #db.AppTransaction.find({$and: [{transaction_time: {$gte: 1440678869243 } }, {transaction_time: { $lte: 1440765269243} },{app_id:33} ] } ).count();
    print (maxDate+oneDay),get_mongo_connection().AppOrder.AppTransaction.find({"$and": [ {'transaction_time': {"$gte": maxDate } }, { 'transaction_time': { "$lte": (maxDate+oneDay)} } ] } ).count();
    appTransactions = get_mongo_connection().AppOrder.AppTransaction.find({"$and": [ {'transaction_time': {"$gte": maxDate } }, { 'transaction_time': { "$lte": (maxDate+oneDay)} } ] } );
    for appTransaction in list(appTransactions):
        installed = False
        appId=appTransaction.get('app_id')
        retailerId=appTransaction.get('retailer_id')

        if appIdMap.has_key(retailerId):
            appIdClicksMap = appIdMap.get(retailerId) 
        else:
            appIdClicksMap = {}
            
        if retailerMap.has_key(appId):
            clicksMap = retailerMap.get(appId) 
        else:
            clicksMap = {}
            
        if clicksMap.has_key('clicks'):
            clicksMap['clicks'] = clicksMap.get('clicks') + 1
        else:
            clicksMap['clicks'] = 1
        
        if appIdClicksMap.has_key('clicks'):
            appIdClicksMap['clicks'] = appIdClicksMap.get('clicks') + 1
        else:
            appIdClicksMap['clicks'] = 1
            
        if appTransaction.get('payout_description')=='Approved':
            installed = True
            if clicksMap.has_key('installs'):
                clicksMap['installs'] = clicksMap.get('installs') + 1
            else:
                clicksMap['installs'] = 1
            if appIdClicksMap.has_key('installs'):
                appIdClicksMap['installs'] = appIdClicksMap.get('installs') + 1
            else:
                appIdClicksMap['installs'] = 1
                
        retailerMap[appId] = clicksMap    
        appIdMap[retailerId] = appIdClicksMap
        
        
        if not overallRetailerAppMap.has_key(retailerId):
            overallRetailerAppMap[retailerId] = {}
        appMap =  overallRetailerAppMap.get(retailerId)
        if not appMap.has_key(appId):
            appMap[appId] = {"clicked":0,"installed":0}
        countMap = appMap[appId]
        countMap['clicked'] += 1
        if installed:
            countMap['installed'] += 1
                  
        #getAppName(appTransaction.get('app_id'),appTransaction.get('retailer_id'))
        
#         if appTransaction.get('payout_description')=='Approved':
#             retailerMap = getAppName(appTransaction.get('app_id'),appTransaction.get('retailer_id'))
#             for x, y in retailerMap.iteritems():
#                 for bra,cow in y.iteritems():
#                     retailerId=x
#                     appName=bra
#                     clicksCount=cow
#                     installCount=cow     
#             appTransactions = AppOffersAnalytics(retailerId, appName,clicksCount,installCount,getTime())
#             get_mongo_connection().AppOrder.AppAnalytics.insert(appTransactions.__dict__)
#   
    for x, y in overallRetailerAppMap.iteritems():
        for bra,cow in y.iteritems():
            for s,m in cow.iteritems():
                print x,bra, s,m
                
    print 'Now retailer map'            
    for x, y in appMap.iteritems():
        for bra,cow in y.iteritems():
            retailerId = x
            if bra=='clicks':
                clicks = cow
            
            #retailerId=x
            #appName=bra
            #clicksCount=cow
    #appTransactions = AppOffersAnalytics(retailerId, appName,clicksCount,installCount,getTime())
    #get_mongo_connection().AppOrder.AppAnalytics.insert(appTransactions.__dict__)
             
def getAppName(appId):
    appDetails =app_offers.get_by(id=appId)
    return appDetails.app_name
#         if retailerMap.has_key(retailerId):
#             clicksMap = retailerMap.get(retailerId) 
#         else:
#             clicksMap = {}
#             
#         if clicksMap.has_key(appDetail.appmasters.app_name):
#             clicksMap[appDetail.appmasters.app_name] = clicksMap.get(appDetail.appmasters.app_name) + 1
#         else:
#             clicksMap[appDetail.appmasters.app_name] = 1
#         retailerMap[retailerId] = clicksMap

def dumpAppTransactionsMysql():
    newTransaction_id=''
    appTransactions = get_mongo_connection().AppOrder.AppTransaction.find();
    for appTransaction in appTransactions:
        newTransaction_id=appTransaction.get('_id')
        checkAppTransaction =  app_transactions.get_by(transaction_id=newTransaction_id)
        if checkAppTransaction is None:
            print 'Inserting new record inside table'
            insertNewAppTransaction(appTransaction)
        else:
            print 'In else',checkAppTransaction.payout_description
            if checkAppTransaction.payout_description!=appTransaction.get('payout_description'):
                print 'Need to update the record',checkAppTransaction.payout_description
                if appTransaction.get('payout_time') is None:
                    session.query(app_transactions).filter(app_transactions.transaction_id == newTransaction_id).update({'payout_description': appTransaction.get('payout_description'),'payout_amount':appTransaction.get('payout_amount'),'cash_back_description':appTransaction.get('cash_back_description'),'cashback_status':appTransaction.get('cashback_status'),'payout_status':appTransaction.get('payout_status')})
                else:    
                    session.query(app_transactions).filter(app_transactions.transaction_id == newTransaction_id).update({'payout_description': appTransaction.get('payout_description'),'payout_amount':appTransaction.get('payout_amount'),'cash_back_description':appTransaction.get('cash_back_description'),'cashback_status':appTransaction.get('cashback_status'),'payout_status':appTransaction.get('payout_status'),'payout_time':utils.to_py_date(appTransaction.get('payout_time'))})
            elif checkAppTransaction.final_user_payout is None:
                if appTransaction.get('final_user_payout') is not None:
                    checkAppTransaction.final_user_payout = appTransaction.get('final_user_payout')
                else:
                    if appTransaction.get('isCashBackOverriden'):
                        checkAppTransaction.final_user_payout = appTransaction.get('overridenCashBack')
                    else:
                        checkAppTransaction.final_user_payout = appTransaction.get('user_payout')
            else:
                print 'Record should not be updated'
    session.commit()

def insertNewAppTransaction(appTransaction):
    app_transaction = app_transactions()
    app_transaction.transaction_id=appTransaction.get('_id')
    app_transaction.retailer_id = appTransaction.get('retailer_id')
    app_transaction.app_id = appTransaction.get('app_id')
    app_transaction.app_name=getAppName(appTransaction.get('app_id'))
    app_transaction.cashback_status = appTransaction.get('cashback_status')
    app_transaction.redirect_url = appTransaction.get('redirect_url')
    app_transaction.cash_back_description = appTransaction.get('cash_back_description')
    app_transaction.payout_status = appTransaction.get('payout_status')
    app_transaction.overridenCashBack = appTransaction.get('overridenCashBack')
    app_transaction.isCashBackOverriden = appTransaction.get('isCashBackOverriden')
    app_transaction.transaction_time =utils.to_py_date(appTransaction.get('transaction_time'))
    if appTransaction.get('payout_time') is None:
        app_transaction.payout_time = None
    else:    
        app_transaction.payout_time = utils.to_py_date(appTransaction.get('payout_time'))
    app_transaction.offer_price = appTransaction.get('offer_price')
    app_transaction.payout_amount = appTransaction.get('payout_amount')
    app_transaction.user_payout = appTransaction.get('user_payout')
    app_transaction.payout_description = appTransaction.get('payout_description')
    if appTransaction.get('final_user_payout') is not None:
        app_transaction.final_user_payout = appTransaction.get('final_user_payout')
    else:
        if appTransaction.get('isCashBackOverriden'):
            app_transaction.final_user_payout = appTransaction.get('overridenCashBack')
        else:
            app_transaction.final_user_payout = appTransaction.get('user_payout')
    session.commit()
    
def deleteAppTransactions():
    try:
        session.query(app_transactions).delete()
        session.commit()
    except:
        session.rollback()
                    
def main():
    #getAppTransactions()
    #deleteAppTransactions()
    dumpAppTransactionsMysql()
    
def getTime():    
    tdate=datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m-%d')
    return tdate

if __name__ == '__main__':
    main()
    session.close()