Subversion Repositories SmartDukaan

Rev

Rev 19573 | Rev 20172 | 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
17395 amit.gupta 248
            if not update:
249
                amount = subOrder.amount if hasattr(subOrder, 'amount') else subOrder.amountPaid
18156 amit.gupta 250
                cashbackAmount, cashbackPercent = self.getCashbackAmount(subOrder.productCode, amount/subOrder.quantity)
17395 amit.gupta 251
                cashbackStatus = Store.CB_PENDING
252
                if cashbackAmount <= 0:
253
                    cashbackStatus = Store.CB_NA
18156 amit.gupta 254
                subOrder.cashBackAmount = cashbackAmount*subOrder.quantity
17395 amit.gupta 255
                subOrder.cashBackPercentage = cashbackPercent
256
                subOrder.cashBackStatus = cashbackStatus      
257
                dealRank = getDealRank(subOrder.productCode, self.store_id, order.userId)
258
                subOrder.dealRank = dealRank.get('rank')
259
                subOrder.rankDesc = dealRank.get('description')
260
                subOrder.maxNlc = dealRank.get('maxNlc')
261
                subOrder.minNlc = dealRank.get('minNlc')
262
                subOrder.db = dealRank.get('dp')
263
                subOrder.itemStatus = dealRank.get('status')
264
            subOrder.closed = subOrder.status in [Store.ORDER_CANCELLED, Store.ORDER_DELIVERED]
16371 amit.gupta 265
            closed = closed and subOrder.closed
17395 amit.gupta 266
            if subOrder.cashBackStatus!=Store.CB_NA:
267
                subOrder.cashBackStatus = Store.CB_PENDING
268
                if subOrder.status == self.ORDER_CANCELLED:
269
                    subOrder.cashBackStatus = Store.CB_CANCELLED 
270
                elif subOrder.status == self.ORDER_DELIVERED:
271
                    subOrder.cashBackStatus = Store.CB_APPROVED
16371 amit.gupta 272
        order.closed = closed
273
 
14618 amit.gupta 274
def settlePayBack(runtype='dry'):
14663 amit.gupta 275
    userAmountMap = {}
276
    searchMapList = []
14666 amit.gupta 277
    for mo in client.Dtr.merchantOrder.find({"subOrders.cashBackStatus":Store.CB_APPROVED}):
14663 amit.gupta 278
        userId = mo.get("userId")
14664 amit.gupta 279
        if   mo.get('subOrders') is not None:
14663 amit.gupta 280
            for so in mo['subOrders']:
14666 amit.gupta 281
                if so.get('cashBackStatus') == Store.CB_APPROVED:
14663 amit.gupta 282
                    searchMapList.append({"orderId":mo.get("orderId"), "subOrders.merchantSubOrderId":so.get("merchantSubOrderId")})
283
                    if not userAmountMap.has_key(userId):
284
                        userAmountMap[userId] = so.get('cashBackAmount')
285
                    else:
286
                        userAmountMap[userId] += so.get('cashBackAmount')
287
                    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"))
288
                else:  
289
                    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"))
290
    for searchMap in searchMapList:
291
        print "%s\t%s"%(searchMap.get('orderId'),searchMap.get('subOrders.merchantSubOrderId'))
14664 amit.gupta 292
    for key,val in userAmountMap.iteritems():
293
        print "%s\t%s"%(key,val)
14663 amit.gupta 294
    if (runtype=='live'):
14666 amit.gupta 295
        bulk = client.Dtr.merchantOrder.initialize_ordered_bulk_op()
14663 amit.gupta 296
        if len(searchMapList) == 0:
14618 amit.gupta 297
            return
14666 amit.gupta 298
        for searchMap in searchMapList:
299
            bulk.find(searchMap).update({'$set' : {'subOrders.$.cashBackStatus':Store.CB_CREDIT_IN_PROCESS}})
300
        bulk.execute()
14663 amit.gupta 301
 
13927 amit.gupta 302
        datetimeNow = datetime.now() 
303
        batchId = int(time.mktime(datetimeNow.timetuple()))
304
        if refundToWallet(batchId, userAmountMap):
14666 amit.gupta 305
            bulk = client.Dtr.merchantOrder.initialize_ordered_bulk_op()
306
            for searchMap in searchMapList:
307
                bulk.find(searchMap).update({'$set' : {'subOrders.$.cashBackStatus':Store.CB_CREDITED, "subOrders.$.batchId":batchId}})
308
            print bulk.execute()
17234 amit.gupta 309
            sum=0
310
            creditedSubOrders=0
311
            message = []
14666 amit.gupta 312
            for key, value in userAmountMap.iteritems():
17234 amit.gupta 313
                sum += value
314
                creditedSubOrders += 1
16736 amit.gupta 315
                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})
316
                client.Dtr.user.update({"userId":key}, {"$inc": { "credited": value, utils.CREDIT_TYPE_ORDER:value}}, upsert=True)
17234 amit.gupta 317
            message.append("<b>Batch Id - %d</b><br><b>Total Amount Credited - %d</b><br><b>Total SubOrders Credited- %d</b>"%(batchId,sum, creditedSubOrders))
318
            utils.sendmail(['amit.gupta@shop2020.in', 'rajneesh.arora@saholic.com'], "".join(message), 'Cashback for Order Credited Successfully')
13952 amit.gupta 319
            tprint("PayBack Settled")
14666 amit.gupta 320
        else:
321
            tprint("Error Occurred while running batch. Rolling Back")
322
            bulk = client.Dtr.merchantOrder.initialize_ordered_bulk_op()
323
            for searchMap in searchMapList:
324
                bulk.find(searchMap).update({'$set' : {'subOrders.$.cashBackStatus':Store.CB_APPROVED}})
325
            bulk.execute()
14663 amit.gupta 326
 
327
 
328
def settlePayBack1(runtype='dry'):
329
        approvedUserMap = {}
330
        pendingUserMap = {}
331
        creditedToWalletUserMap = {}
332
        #client.Dtr.merchantOrder.update({'subOrders.cashBackStatus':Store.CB_APPROVED},{'$set':{'subOrders.$.cashBackStatus':Store.CB_CREDIT_IN_PROCESS}}, multi=True)    
333
        for mo in client.Dtr.merchantOrder.find({"subOrders.cashBackStatus":Store.CB_CREDITED}):
334
            userId = mo.get("userId")
335
            for so in mo['subOrders']:
336
                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"))
337
 
338
        for refund in client.Dtr.refund.find():
339
            print "%s\t%s\t%s\t%s"%(refund.get("userId") ,refund.get("timestamp") ,refund.get("userAmount"), refund.get("batch"))
340
 
341
 
13927 amit.gupta 342
def refundToWallet(batchId, userAmountMap):
19568 manas 343
    #base64string = base64.encodestring('%s:%s' % ("dtr", "dtr18Feb2015")).replace('\n', '')
13927 amit.gupta 344
    batchUpdateMap = {}
345
    try :
346
        saholicUserAmountMap = {}
347
        for key, value in userAmountMap.iteritems():
19568 manas 348
            #userLookupRequest = urllib2.Request(USER_LOOKUP_URL %(key), headers=headers)
349
            #userLookupRequest.add_header("Authorization", "Basic %s" % base64string)
13927 amit.gupta 350
            try:
19568 manas 351
                #response = urllib2.urlopen(userLookupRequest).read()
352
                #saholicUserId = json.loads(response)['account_key']
353
                saholicUserId = userLookUpForSaholicId(key)
354
                if saholicUserId is not 'User Not present in profitmandi':
355
                    saholicUserAmountMap[saholicUserId] = value
356
                else:
357
                    raise Exception('User Not present in dtr')
13927 amit.gupta 358
            except:
19553 manas 359
                traceback.print_exc()
13934 amit.gupta 360
                tprint("Could not fetch saholic id for user : " + str(key))
13927 amit.gupta 361
                continue
13939 amit.gupta 362
        if len(saholicUserAmountMap) > 0:
363
            batchUpdateMap['userAmount'] = json.dumps(saholicUserAmountMap)
364
            batchUpdateMap['batchId'] = batchId
365
            request = urllib2.Request(WALLET_CREDIT_URL, headers=headers)
366
            data = urllib.urlencode(batchUpdateMap)
367
            response = urllib2.urlopen(request, data)
368
            return json.loads(response.read())['response']['credited']
369
        else:
370
            tprint("Nothing to Refund")
371
            return False
13927 amit.gupta 372
    except:
373
        traceback.print_exc()
374
        tprint("Could not batch refund")
375
        return False
13868 amit.gupta 376
 
13662 amit.gupta 377
def main():
14618 amit.gupta 378
#    client = MongoClient('mongodb://root:ecip$dtrMay2014@dtr:27017/')
379
#    s = Store(1)
380
#    orders = s.db.Dtr.find({"subOrders.imgUrl":{"$exists":1}}, {"merchantOrderId":1, "subOrders.productCode":1,"subOrders.imgUrl":1,"_id": 0})
381
#    db = client.Dtr
382
#    for order in orders:
383
#        for subOrder in order.get("subOrders"):
384
#            #db.merchantOrder.update({"merchantOrderId":order.getMerchantOrderId,"subOrders.imgUrl":{"$exists":0}, "subOrders.productCode":subOrder.get("productCode")}, {"$set":{"subOrders.$.imgUrl":subOrder.get("imgUrl")}})
385
#            db.merchantOrder.findOne()
14663 amit.gupta 386
    settlePayBack('dry')        
13569 amit.gupta 387
 
388
 
13868 amit.gupta 389
###
390
#Settlement process is suposed to be a batch and run weekly
391
#It is should be running on first hour of mondays. As cron should
392
# Maintain a batch id.
393
 
13677 amit.gupta 394
 
13569 amit.gupta 395
def getBrowserObject():
396
    import cookielib
397
    br = mechanize.Browser(factory=mechanize.RobustFactory())
398
    cj = cookielib.LWPCookieJar()
399
    br.set_cookiejar(cj)
400
    br.set_handle_equiv(True)
401
    br.set_handle_redirect(True)
402
    br.set_handle_referer(True)
403
    br.set_handle_robots(False)
404
    br.set_debug_http(False)
405
    br.set_debug_redirects(False)
406
    br.set_debug_responses(False)
407
 
408
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
409
 
410
    br.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
411
                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
412
                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
413
                     ('Accept-Language', 'en-US,en;q=0.8'),                     
414
                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
13677 amit.gupta 415
    return br
16371 amit.gupta 416
def todict(obj, classkey=None):
417
    if isinstance(obj, dict):
418
        data = {}
419
        for (k, v) in obj.items():
420
            data[k] = todict(v, classkey)
421
        return data
422
    elif hasattr(obj, "_ast"):
423
        return todict(obj._ast())
424
    elif hasattr(obj, "__iter__"):
425
        return [todict(v, classkey) for v in obj]
426
    elif hasattr(obj, "__dict__"):
427
        data = dict([(key, todict(value, classkey)) 
428
            for key, value in obj.__dict__.iteritems() 
429
            if not callable(value) and not key.startswith('_')])
430
        if classkey is not None and hasattr(obj, "__class__"):
431
            data[classkey] = obj.__class__.__name__
432
        return data
433
    else:
434
        return obj
13677 amit.gupta 435
 
13690 amit.gupta 436
def ungzipResponse(r):
437
    headers = r.info()
17388 amit.gupta 438
    if headers.get('Content-Encoding')=='gzip':
13690 amit.gupta 439
        import gzip
440
        gz = gzip.GzipFile(fileobj=r, mode='rb')
441
        html = gz.read()
442
        gz.close()
17388 amit.gupta 443
    else:
444
        html = r.read() 
445
 
446
    return html
13724 amit.gupta 447
 
448
def tprint(*msg):
13927 amit.gupta 449
    print datetime.now(), "-", msg
13939 amit.gupta 450
 
451
if __name__ == '__main__':
14848 amit.gupta 452
    main()
453