Subversion Repositories SmartDukaan

Rev

Rev 21268 | Rev 21331 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13569 amit.gupta 1
'''
2
Created on Jan 15, 2015
3
 
4
@author: amit
5
'''
14618 amit.gupta 6
from datetime import datetime, timedelta
15078 amit.gupta 7
from dtr.config import PythonPropertyReader
19577 manas 8
from dtr.storage.Mongo import getDealRank, userLookUpForSaholicId
14618 amit.gupta 9
from dtr.storage.Mysql import getOrdersAfterDate1, getOrdersAfterDate
13868 amit.gupta 10
from pprint import pprint
13569 amit.gupta 11
from pymongo.mongo_client import MongoClient
14413 amit.gupta 12
import base64
13569 amit.gupta 13
import importlib
13662 amit.gupta 14
import json
15
import math
13569 amit.gupta 16
import mechanize
14413 amit.gupta 17
import time
13631 amit.gupta 18
import traceback
13662 amit.gupta 19
import urllib
20
import urllib2
16736 amit.gupta 21
from dtr.utils import utils 
17013 manish.sha 22
sourceMap = {1:"amazon", 2:"flipkart", 3:"snapdeal", 4:"spice", 5:"shopclues", 6:"paytm", 7:"homeshop18"}
13662 amit.gupta 23
headers = { 
24
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
25
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
26
            'Accept-Language' : 'en-US,en;q=0.8',                     
27
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
28
        }
14145 amit.gupta 29
CASHBACK_URL = PythonPropertyReader.getConfig('CASHBACK_URL')
30
USER_LOOKUP_URL = PythonPropertyReader.getConfig('USER_LOOKUP_URL')
31
WALLET_CREDIT_URL = PythonPropertyReader.getConfig('WALLET_CREDIT_URL')
13569 amit.gupta 32
 
33
def getStore(source_id):
34
    #module = sourceMap[source_id]
35
    store = Store(source_id)
13631 amit.gupta 36
    try:
37
        module = importlib.import_module("dtr.sources." + sourceMap[source_id])
38
        store = getattr(module, "Store")(source_id)
39
        return store
40
    except:
13781 amit.gupta 41
        traceback.print_exc()
13631 amit.gupta 42
        return None
13569 amit.gupta 43
 
44
class ScrapeException(Exception):
45
    """Exception raised for errors in the input.
46
 
47
    Attributes:
48
        expr -- input expression in which the error occurred
49
        msg  -- explanation of the error
50
    """
51
 
52
    def __init__(self, expr, msg):
53
        self.expr = expr
54
        self.msg = msg
55
 
56
class ParseException(Exception):
57
    """Exception raised for errors in the input.
58
 
59
    Attributes:
60
        expr -- input expression in which the error occurred
61
        msg  -- explanation of the error
62
    """
63
 
64
    def __init__(self, expr, msg):
65
        self.expr = expr
66
        self.msg = msg
67
 
13677 amit.gupta 68
client = MongoClient('mongodb://localhost:27017/') 
69
 
13569 amit.gupta 70
class Store(object):
71
 
72
    ORDER_PLACED = 'Order Placed'
73
    ORDER_DELIVERED = 'Delivered'
74
    ORDER_SHIPPED = 'Shipped' #Lets see if we can make use of it
75
    ORDER_CANCELLED = 'Cancelled'
76
 
13662 amit.gupta 77
    CB_INIT = 'Waiting Confirmation'
13610 amit.gupta 78
    CB_PENDING = 'Pending'
13955 amit.gupta 79
    CB_CREDIT_IN_PROCESS = 'Credit in process'
13610 amit.gupta 80
    CB_CREDITED = 'Credited to wallet'
81
    CB_NA = 'Not Applicable'
82
    CB_APPROVED = 'Approved'
14618 amit.gupta 83
    CB_REJECTED = 'Rejected'
84
    CB_ONHOLD = 'On hold'
13610 amit.gupta 85
    CB_CANCELLED = 'Cancelled'
13569 amit.gupta 86
 
13662 amit.gupta 87
    CONF_CB_SELLING_PRICE = 0
88
    CONF_CB_DISCOUNTED_PRICE = 1
13610 amit.gupta 89
 
13569 amit.gupta 90
    def __init__(self, store_id):
13662 amit.gupta 91
        self.db = client.Dtr
18156 amit.gupta 92
        self.catalogdb = client.Catalog
13569 amit.gupta 93
        self.store_id = store_id
13576 amit.gupta 94
        self.store_name = sourceMap[store_id]
13569 amit.gupta 95
 
13662 amit.gupta 96
    '''
97
    To Settle payback for respective stores.
98
    Also ensures that settlement happens only for approved orders
99
    '''
13569 amit.gupta 100
 
101
    def getName(self):
102
        raise NotImplementedError
103
 
104
    def scrapeAffiliate(self, startDate=None, endDate=None):
105
        raise NotImplementedError
106
 
16390 amit.gupta 107
    def getTrackingUrls(self, userId):
108
        raise NotImplementedError
109
 
110
 
13569 amit.gupta 111
    def saveToAffiliate(self, offers):
112
        raise NotImplementedError
113
 
16371 amit.gupta 114
    def getUpdateMap(self, subOrder, cashBackStatus):
14624 amit.gupta 115
        updateMap = {}
116
        closed = False
117
        for (key,value) in subOrder.iteritems():
118
            if key=="status":
119
                if value==Store.ORDER_CANCELLED:
120
                    closed = True
121
                    updateMap['subOrders.$.closed'] = True
16371 amit.gupta 122
                    if cashBackStatus == Store.CB_PENDING:
14624 amit.gupta 123
                        updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
124
                if value==Store.ORDER_DELIVERED:
125
                    closed = True
126
                    updateMap['subOrders.$.closed'] = True
16371 amit.gupta 127
                    if cashBackStatus == Store.CB_PENDING:
14624 amit.gupta 128
                        updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
129
            updateMap['subOrders.$.' + key] = value
130
        subOrder['closed'] = closed
131
        return updateMap
132
 
14618 amit.gupta 133
    def saveOrder(self, merchantOrder):
134
        #merchantOrder = Order()
135
        #merchantOrder.status
136
        #mercha
137
        pass
138
 
139
 
13569 amit.gupta 140
    def scrapeStoreOrders(self,):
141
        raise NotImplementedError
13610 amit.gupta 142
 
14618 amit.gupta 143
    def updateSubOrder(self, subOrder):
144
        pass
145
        #if subOrder.get
146
 
13690 amit.gupta 147
    def _saveToOrder(self, order):
148
        collection = self.db.merchantOrder
149
        try:
17388 amit.gupta 150
            print "************************************************************************"
151
            print "order"
152
            print order
153
            print "************************************************************************"
13690 amit.gupta 154
            order = collection.insert(order)
14273 amit.gupta 155
            return True 
13690 amit.gupta 156
        except Exception as e:
14273 amit.gupta 157
            return False
14081 amit.gupta 158
 
159
    def _updateToOrder(self, order):
160
        collection = self.db.merchantOrder
161
        try:
14959 amit.gupta 162
            print "************************************************************************"
163
            print "order"
164
            print order
165
            print "************************************************************************"
14081 amit.gupta 166
            collection.update({"orderId":order['orderId']},{"$set":order}, upsert = True)
167
            #merchantOder 
168
        except Exception as e:
169
            traceback.print_exc()
13662 amit.gupta 170
 
171
    def getCashbackAmount(self, productCode, amount):
13995 amit.gupta 172
        alagvar = CASHBACK_URL % (productCode,self.store_id)
13662 amit.gupta 173
        filehandle = urllib2.Request(alagvar,headers=headers)
174
        x= urllib2.urlopen(filehandle)
17179 amit.gupta 175
        cashBack = json.loads(str(x.read()))
176
        if len(cashBack)==0:
13721 amit.gupta 177
            return (0,0)
13662 amit.gupta 178
        else:
17179 amit.gupta 179
            maxCashBack = cashBack.get('maxCashBack') 
180
            if maxCashBack:
181
                if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*amount)/100 > maxCashBack:
182
                    cashBack['cash_back'] = cashBack['maxCashBack']
183
                    return (cashBack['cash_back'], 0)
184
                elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
185
                    cashBack['cash_back'] = cashBack['maxCashBack']
186
                    return (cashBack['cash_back'], 0)
187
                else:
188
                    pass
19525 amit.gupta 189
            if cashBack['cash_back_type'] == 1:
17179 amit.gupta 190
                return (math.floor((amount * cashBack['cash_back'])/100), cashBack['cash_back'])
13662 amit.gupta 191
            else:
17179 amit.gupta 192
                return (cashBack['cash_back'], 0)
13721 amit.gupta 193
 
13662 amit.gupta 194
 
13569 amit.gupta 195
    '''
196
    Parses the order for specific store
197
 
198
    order id, total amount, created on(now() if could not parse
199
    suborder id, title, quantity, unit price, expected delivery date,
200
    status (default would be Order placed)
201
 
202
    once products are identified, each suborder can then be updated
203
    with respective cashback.
204
 
205
    Possible fields to display for Not yet delivered orders are 
206
    Product/Quantity/Amount/Store/CashbackAmount/OrderDate/ExpectedDelivery/OrderStaus/DetailedStatus/CashbackStatus
207
    No need to show cancelled orders.
13610 amit.gupta 208
    CashbackStatus - NotApplicable/Pending/Approved/Cancelled/CreditedToWallet
13569 amit.gupta 209
    OrderStatus - Placed/Cancelled/Delivered
210
    '''
13576 amit.gupta 211
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
13569 amit.gupta 212
 
213
        pass
214
 
13721 amit.gupta 215
    def _updateOrdersPayBackStatus(self, searchMap, updateMap):
13781 amit.gupta 216
        searchMap['subOrders.missingAff'] = False
217
        updateMap['subOrders.$.missingAff'] = True
13927 amit.gupta 218
        self.db.merchantOrder.update(searchMap, { '$set': updateMap }, multi=True)
13721 amit.gupta 219
 
13781 amit.gupta 220
    def _getActiveOrders(self, searchMap={}, collectionMap={}):
13721 amit.gupta 221
        collection = self.db.merchantOrder
17234 amit.gupta 222
        searchMap = dict(searchMap.items()+ {"subOrders.closed": False, "storeId" : self.store_id}.items()) 
17395 amit.gupta 223
        #collectionMap =  dict(collectionMap.items() + {"orderSuccessUrl":1, "orderId":1,"subOrders":1, "placedOn":1, "orderTracking"}.items())
224
        stores = collection.find(searchMap)
13721 amit.gupta 225
        return [store for store in stores]
226
 
14081 amit.gupta 227
    def _getMissingOrders(self,searchMap={}):
228
        collection = self.db.merchantOrder
14948 amit.gupta 229
        searchMap = dict(searchMap.items()+ {"requireDetail":True, "storeId":self.store_id}.items()) 
14081 amit.gupta 230
        orders = collection.find(searchMap)
231
        return list(orders)
232
 
233
 
13721 amit.gupta 234
    def _isSubOrderActive(self,order, merchantSubOrderId):
235
        subOrders = order.get("subOrders")
14867 amit.gupta 236
        if subOrders is None:
237
            return None
13721 amit.gupta 238
        for subOrder in subOrders:
239
            if merchantSubOrderId == subOrder.get("merchantSubOrderId"):
240
                return subOrder
241
        return None
14663 amit.gupta 242
 
17395 amit.gupta 243
    def populateDerivedFields(self, order, update=False):
16371 amit.gupta 244
        closed=True
245
        for subOrder in order.subOrders:
246
            if subOrder.closed:
247
                continue
21321 amit.gupta 248
            self._getStatusFromDetailedStatus(subOrder.detailedStatus)
17395 amit.gupta 249
            if not update:
250
                amount = subOrder.amount if hasattr(subOrder, 'amount') else subOrder.amountPaid
18156 amit.gupta 251
                cashbackAmount, cashbackPercent = self.getCashbackAmount(subOrder.productCode, amount/subOrder.quantity)
17395 amit.gupta 252
                cashbackStatus = Store.CB_PENDING
253
                if cashbackAmount <= 0:
254
                    cashbackStatus = Store.CB_NA
18156 amit.gupta 255
                subOrder.cashBackAmount = cashbackAmount*subOrder.quantity
17395 amit.gupta 256
                subOrder.cashBackPercentage = cashbackPercent
257
                subOrder.cashBackStatus = cashbackStatus      
258
                dealRank = getDealRank(subOrder.productCode, self.store_id, order.userId)
259
                subOrder.dealRank = dealRank.get('rank')
260
                subOrder.rankDesc = dealRank.get('description')
261
                subOrder.maxNlc = dealRank.get('maxNlc')
262
                subOrder.minNlc = dealRank.get('minNlc')
263
                subOrder.db = dealRank.get('dp')
264
                subOrder.itemStatus = dealRank.get('status')
265
            subOrder.closed = subOrder.status in [Store.ORDER_CANCELLED, Store.ORDER_DELIVERED]
16371 amit.gupta 266
            closed = closed and subOrder.closed
17395 amit.gupta 267
            if subOrder.cashBackStatus!=Store.CB_NA:
268
                subOrder.cashBackStatus = Store.CB_PENDING
269
                if subOrder.status == self.ORDER_CANCELLED:
270
                    subOrder.cashBackStatus = Store.CB_CANCELLED 
271
                elif subOrder.status == self.ORDER_DELIVERED:
272
                    subOrder.cashBackStatus = Store.CB_APPROVED
16371 amit.gupta 273
        order.closed = closed
274
 
14618 amit.gupta 275
def settlePayBack(runtype='dry'):
14663 amit.gupta 276
    userAmountMap = {}
277
    searchMapList = []
14666 amit.gupta 278
    for mo in client.Dtr.merchantOrder.find({"subOrders.cashBackStatus":Store.CB_APPROVED}):
14663 amit.gupta 279
        userId = mo.get("userId")
14664 amit.gupta 280
        if   mo.get('subOrders') is not None:
14663 amit.gupta 281
            for so in mo['subOrders']:
14666 amit.gupta 282
                if so.get('cashBackStatus') == Store.CB_APPROVED:
14663 amit.gupta 283
                    searchMapList.append({"orderId":mo.get("orderId"), "subOrders.merchantSubOrderId":so.get("merchantSubOrderId")})
284
                    if not userAmountMap.has_key(userId):
285
                        userAmountMap[userId] = so.get('cashBackAmount')
286
                    else:
287
                        userAmountMap[userId] += so.get('cashBackAmount')
288
                    print "%s\t%s\t%s\t%s\t%s\t%s\t%s"%(userId, mo.get("orderId"), so.get("merchantSubOrderId"),so.get("productTitle") ,so.get("cashBackStatus"), so.get("cashBackAmount"), so.get("batchId"))
289
                else:  
290
                    print "%s\t%s\t%s\t%s\t%s\t%s\t%s"%(userId, mo.get("orderId"), so.get("merchantSubOrderId"),so.get("productTitle") ,so.get("cashBackStatus"), so.get("cashBackAmount"), so.get("batchId"))
291
    for searchMap in searchMapList:
292
        print "%s\t%s"%(searchMap.get('orderId'),searchMap.get('subOrders.merchantSubOrderId'))
14664 amit.gupta 293
    for key,val in userAmountMap.iteritems():
294
        print "%s\t%s"%(key,val)
14663 amit.gupta 295
    if (runtype=='live'):
14666 amit.gupta 296
        bulk = client.Dtr.merchantOrder.initialize_ordered_bulk_op()
14663 amit.gupta 297
        if len(searchMapList) == 0:
14618 amit.gupta 298
            return
14666 amit.gupta 299
        for searchMap in searchMapList:
300
            bulk.find(searchMap).update({'$set' : {'subOrders.$.cashBackStatus':Store.CB_CREDIT_IN_PROCESS}})
301
        bulk.execute()
14663 amit.gupta 302
 
13927 amit.gupta 303
        datetimeNow = datetime.now() 
304
        batchId = int(time.mktime(datetimeNow.timetuple()))
305
        if refundToWallet(batchId, userAmountMap):
14666 amit.gupta 306
            bulk = client.Dtr.merchantOrder.initialize_ordered_bulk_op()
307
            for searchMap in searchMapList:
308
                bulk.find(searchMap).update({'$set' : {'subOrders.$.cashBackStatus':Store.CB_CREDITED, "subOrders.$.batchId":batchId}})
309
            print bulk.execute()
17234 amit.gupta 310
            sum=0
311
            creditedSubOrders=0
312
            message = []
14666 amit.gupta 313
            for key, value in userAmountMap.iteritems():
17234 amit.gupta 314
                sum += value
315
                creditedSubOrders += 1
16736 amit.gupta 316
                client.Dtr.refund.insert({"userId": key, "batch":batchId, "userAmount":value, "timestamp":datetime.strftime(datetimeNow,"%Y-%m-%d %H:%M:%S"), "type":utils.CREDIT_TYPE_ORDER})
317
                client.Dtr.user.update({"userId":key}, {"$inc": { "credited": value, utils.CREDIT_TYPE_ORDER:value}}, upsert=True)
17234 amit.gupta 318
            message.append("<b>Batch Id - %d</b><br><b>Total Amount Credited - %d</b><br><b>Total SubOrders Credited- %d</b>"%(batchId,sum, creditedSubOrders))
20172 aman.kumar 319
            utils.sendmail(['amit.gupta@shop2020.in', 'rajneesh.arora@saholic.com','khushal.bhatia@saholic.com'], "".join(message), 'Cashback for Order Credited Successfully')
13952 amit.gupta 320
            tprint("PayBack Settled")
14666 amit.gupta 321
        else:
322
            tprint("Error Occurred while running batch. Rolling Back")
323
            bulk = client.Dtr.merchantOrder.initialize_ordered_bulk_op()
324
            for searchMap in searchMapList:
325
                bulk.find(searchMap).update({'$set' : {'subOrders.$.cashBackStatus':Store.CB_APPROVED}})
326
            bulk.execute()
14663 amit.gupta 327
 
328
 
329
def settlePayBack1(runtype='dry'):
330
        approvedUserMap = {}
331
        pendingUserMap = {}
332
        creditedToWalletUserMap = {}
333
        #client.Dtr.merchantOrder.update({'subOrders.cashBackStatus':Store.CB_APPROVED},{'$set':{'subOrders.$.cashBackStatus':Store.CB_CREDIT_IN_PROCESS}}, multi=True)    
334
        for mo in client.Dtr.merchantOrder.find({"subOrders.cashBackStatus":Store.CB_CREDITED}):
335
            userId = mo.get("userId")
336
            for so in mo['subOrders']:
337
                print "%s\t%s\t%s\t%s\t%s\t%s\t%s"%(userId, mo.get("orderId"), so.get("merchantSubOrderId"),so.get("productTitle") ,so.get("cashBackStatus"), so.get("cashBackAmount"), so.get("batchId"))
338
 
339
        for refund in client.Dtr.refund.find():
340
            print "%s\t%s\t%s\t%s"%(refund.get("userId") ,refund.get("timestamp") ,refund.get("userAmount"), refund.get("batch"))
341
 
342
 
13927 amit.gupta 343
def refundToWallet(batchId, userAmountMap):
19568 manas 344
    #base64string = base64.encodestring('%s:%s' % ("dtr", "dtr18Feb2015")).replace('\n', '')
13927 amit.gupta 345
    batchUpdateMap = {}
346
    try :
347
        saholicUserAmountMap = {}
348
        for key, value in userAmountMap.iteritems():
19568 manas 349
            #userLookupRequest = urllib2.Request(USER_LOOKUP_URL %(key), headers=headers)
350
            #userLookupRequest.add_header("Authorization", "Basic %s" % base64string)
13927 amit.gupta 351
            try:
19568 manas 352
                #response = urllib2.urlopen(userLookupRequest).read()
353
                #saholicUserId = json.loads(response)['account_key']
354
                saholicUserId = userLookUpForSaholicId(key)
355
                if saholicUserId is not 'User Not present in profitmandi':
356
                    saholicUserAmountMap[saholicUserId] = value
357
                else:
358
                    raise Exception('User Not present in dtr')
13927 amit.gupta 359
            except:
19553 manas 360
                traceback.print_exc()
13934 amit.gupta 361
                tprint("Could not fetch saholic id for user : " + str(key))
13927 amit.gupta 362
                continue
13939 amit.gupta 363
        if len(saholicUserAmountMap) > 0:
364
            batchUpdateMap['userAmount'] = json.dumps(saholicUserAmountMap)
365
            batchUpdateMap['batchId'] = batchId
366
            request = urllib2.Request(WALLET_CREDIT_URL, headers=headers)
367
            data = urllib.urlencode(batchUpdateMap)
368
            response = urllib2.urlopen(request, data)
369
            return json.loads(response.read())['response']['credited']
370
        else:
371
            tprint("Nothing to Refund")
372
            return False
13927 amit.gupta 373
    except:
374
        traceback.print_exc()
375
        tprint("Could not batch refund")
376
        return False
13868 amit.gupta 377
 
13662 amit.gupta 378
def main():
14618 amit.gupta 379
#    client = MongoClient('mongodb://root:ecip$dtrMay2014@dtr:27017/')
380
#    s = Store(1)
381
#    orders = s.db.Dtr.find({"subOrders.imgUrl":{"$exists":1}}, {"merchantOrderId":1, "subOrders.productCode":1,"subOrders.imgUrl":1,"_id": 0})
382
#    db = client.Dtr
383
#    for order in orders:
384
#        for subOrder in order.get("subOrders"):
385
#            #db.merchantOrder.update({"merchantOrderId":order.getMerchantOrderId,"subOrders.imgUrl":{"$exists":0}, "subOrders.productCode":subOrder.get("productCode")}, {"$set":{"subOrders.$.imgUrl":subOrder.get("imgUrl")}})
386
#            db.merchantOrder.findOne()
14663 amit.gupta 387
    settlePayBack('dry')        
13569 amit.gupta 388
 
389
 
13868 amit.gupta 390
###
391
#Settlement process is suposed to be a batch and run weekly
392
#It is should be running on first hour of mondays. As cron should
393
# Maintain a batch id.
394
 
21268 amit.gupta 395
agentDefault = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'
396
def getBrowserObject(agent = agentDefault):
13569 amit.gupta 397
    import cookielib
398
    br = mechanize.Browser(factory=mechanize.RobustFactory())
399
    cj = cookielib.LWPCookieJar()
400
    br.set_cookiejar(cj)
401
    br.set_handle_equiv(True)
402
    br.set_handle_redirect(True)
403
    br.set_handle_referer(True)
404
    br.set_handle_robots(False)
405
    br.set_debug_http(False)
406
    br.set_debug_redirects(False)
407
    br.set_debug_responses(False)
408
 
409
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
410
 
21268 amit.gupta 411
    br.addheaders = [('User-Agent', agent),
13569 amit.gupta 412
                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
413
                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
414
                     ('Accept-Language', 'en-US,en;q=0.8'),                     
415
                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
13677 amit.gupta 416
    return br
16371 amit.gupta 417
def todict(obj, classkey=None):
418
    if isinstance(obj, dict):
419
        data = {}
420
        for (k, v) in obj.items():
421
            data[k] = todict(v, classkey)
422
        return data
423
    elif hasattr(obj, "_ast"):
424
        return todict(obj._ast())
425
    elif hasattr(obj, "__iter__"):
426
        return [todict(v, classkey) for v in obj]
427
    elif hasattr(obj, "__dict__"):
428
        data = dict([(key, todict(value, classkey)) 
429
            for key, value in obj.__dict__.iteritems() 
430
            if not callable(value) and not key.startswith('_')])
431
        if classkey is not None and hasattr(obj, "__class__"):
432
            data[classkey] = obj.__class__.__name__
433
        return data
434
    else:
435
        return obj
20615 amit.gupta 436
 
437
def manualCredit(runtype='dry'):
438
    #userAmountMap = {19964:8,7144:9,20274:12,25978:24,29914:24,28026:48,6409:48,2482:49,21852:52,2261:56,8109:57,23372:57,5772:82,29467:82,19612:82,7447:125,15898:126,11701:136,29483:138,20001:162,7070:164,11628:166,5222:250,14074:363,17378:369,7764:684,30153:996}
439
    userAmountMap={}
440
    for key,val in userAmountMap.iteritems():
441
        print "%s\t%s"%(key,val)
442
    if (runtype=='live'):
443
        datetimeNow = datetime.now() 
444
        batchId = int(time.mktime(datetimeNow.timetuple()))
445
        if refundToWallet(batchId, userAmountMap):
446
            sum=0
447
            creditedSubOrders=0
448
            message = []
449
            for key, value in userAmountMap.iteritems():
450
                sum += value
451
                creditedSubOrders += 1
452
                client.Dtr.refund.insert({"userId": key, "batch":batchId, "userAmount":value, "timestamp":datetime.strftime(datetimeNow,"%Y-%m-%d %H:%M:%S"), "type":utils.CREDIT_TYPE_ORDER})
453
                client.Dtr.user.update({"userId":key}, {"$inc": { "credited": value, utils.CREDIT_TYPE_ORDER:value}}, upsert=True)
454
            message.append("<b>Batch Id - %d</b><br><b>Total Amount Credited - %d</b><br><b>Total SubOrders Credited- %d</b>"%(batchId,sum, creditedSubOrders))
455
            utils.sendmail(['amit.gupta@shop2020.in', 'rajneesh.arora@saholic.com','khushal.bhatia@saholic.com'], "".join(message), 'Cashback for Order Credited Successfully')
456
            tprint("PayBack Settled")
457
        else:
458
            tprint("Error Occurred while running batch. Rolling Back")
13677 amit.gupta 459
 
13690 amit.gupta 460
def ungzipResponse(r):
461
    headers = r.info()
17388 amit.gupta 462
    if headers.get('Content-Encoding')=='gzip':
13690 amit.gupta 463
        import gzip
464
        gz = gzip.GzipFile(fileobj=r, mode='rb')
465
        html = gz.read()
466
        gz.close()
17388 amit.gupta 467
    else:
468
        html = r.read() 
469
 
470
    return html
13724 amit.gupta 471
 
472
def tprint(*msg):
13927 amit.gupta 473
    print datetime.now(), "-", msg
13939 amit.gupta 474
 
475
if __name__ == '__main__':
14848 amit.gupta 476
    main()
477