Subversion Repositories SmartDukaan

Rev

Rev 13730 | Rev 13770 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 13730 Rev 13760
Line 83... Line 83...
83
    def _getLastSaleDate(self,):
83
    def _getLastSaleDate(self,):
84
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
84
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
85
        if lastDaySaleObj is None:
85
        if lastDaySaleObj is None:
86
            return datetime.min
86
            return datetime.min
87
        
87
        
-
 
88
    def _parse(self, orderId, subTagId, userId, page, orderSuccessUrl):
88
        
89
        
-
 
90
        #page=page.decode("utf-8")
-
 
91
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
-
 
92
        #orderHead = soup.find(name, attrs, recursive, text)
-
 
93
        sections = soup.findAll("section")
-
 
94
        
-
 
95
        #print sections
-
 
96
        
-
 
97
        order = sections[1]
-
 
98
        orderTrs = order.findAll("tr")
-
 
99
        
-
 
100
        placedOn = str(orderTrs[0].findAll("td")[1].text)
-
 
101
        
-
 
102
        #Pop two section elements
-
 
103
        sections.pop(0) 
-
 
104
        sections.pop(0)
-
 
105
        subOrders = sections
-
 
106
        
-
 
107
         
-
 
108
        merchantSubOrders = []
-
 
109
 
-
 
110
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
-
 
111
        merchantOrder.merchantOderId = re.findall(r'\d+', str(soup.find("div", {"class":"deals_heading"})))[1]
-
 
112
        for orderTr in orderTrs:
-
 
113
            orderTrString = str(orderTr)
-
 
114
            if "Total Amount" in orderTrString:
-
 
115
                merchantOrder.totalAmount = re.findall(r'\d+', orderTrString)[0]
-
 
116
            elif "Delivery Charges" in orderTrString:
-
 
117
                merchantOrder.deliveryCharges = re.findall(r'\d+', orderTrString)[0]
-
 
118
            elif "Discount Applied" in orderTrString:
-
 
119
                merchantOrder.discountApplied = re.findall(r'\d+', orderTrString)[0]
-
 
120
            elif "Paid Amount" in orderTrString:
-
 
121
                merchantOrder.paidAmount = re.findall(r'\d+', orderTrString)[0]
-
 
122
 
-
 
123
        for subOrderElement in subOrders:
-
 
124
            subOrder = self.parseSubOrder(subOrderElement, placedOn)                           
-
 
125
            merchantSubOrders.append(subOrder)   
-
 
126
        
-
 
127
        merchantOrder.subOrders = merchantSubOrders
-
 
128
        return merchantOrder
-
 
129
        
-
 
130
    def parseSubOrder(self, subOrderElement, placedOn):
-
 
131
        productUrl = str(subOrderElement.find("a")['href'])
-
 
132
        subTable = subOrderElement.find("table", {"class":"lrPad"})
-
 
133
        subTrs = subTable.findAll("tr")
-
 
134
        unitPrice=None
-
 
135
        offerDiscount = None
-
 
136
        deliveryCharges = None
-
 
137
        amountPaid = None
-
 
138
        for subTr in subTrs:
-
 
139
            subTrString = str(subTr)
-
 
140
            if "Unit Price" in subTrString:
-
 
141
                unitPrice = re.findall(r'\d+', subTrString)[0]
-
 
142
            if "Quantity" in subTrString:
-
 
143
                qty = re.findall(r'\d+', subTrString)[0]
-
 
144
            elif "Offer Discount" in subTrString:
-
 
145
                offerDiscount =   re.findall(r'\d+', subTrString)[0]
-
 
146
            elif "Delivery Charges" in subTrString:
-
 
147
                deliveryCharges =   re.findall(r'\d+', subTrString)[0]
-
 
148
            elif "Subtotal" in subTrString:
-
 
149
                if int(qty) > 0:
-
 
150
                    amountPaid =   str(int(re.findall(r'\d+', subTrString)[0])/int(qty))
-
 
151
                else:
-
 
152
                    amountPaid =   "0"
-
 
153
        if self.CONF_CB_AMOUNT == MStore.CONF_CB_SELLING_PRICE or offerDiscount is None:
-
 
154
            amount = int(unitPrice)
-
 
155
        else:
-
 
156
            amount = int(unitPrice) - int(offerDiscount)
-
 
157
                
-
 
158
        divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
-
 
159
        if len(divs)<=0:
-
 
160
            raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
-
 
161
        
-
 
162
        for div in divs:
-
 
163
            productTitle = str(subOrderElement.find("a").text)
-
 
164
            productUrl = "http://m.snapdeal.com/" + productUrl 
-
 
165
            subOrder = SubOrder(productTitle, productUrl, placedOn, amountPaid)
-
 
166
 
-
 
167
            subOrder.amountPaid = amountPaid
-
 
168
            subOrder.deliveryCharges = deliveryCharges
-
 
169
            subOrder.offerDiscount = offerDiscount
-
 
170
            subOrder.unitPrice = unitPrice
-
 
171
            subOrder.productCode = re.findall(r'\d+$', productUrl)[0]
-
 
172
            (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
-
 
173
            cashbackStatus = Store.CB_INIT
-
 
174
            if cashbackAmount <= 0:
-
 
175
                cashbackStatus = Store.CB_NA
-
 
176
            subOrder.cashBackStatus = cashbackStatus
-
 
177
            subOrder.cashBackAmount = cashbackAmount
-
 
178
            if percentage > 0:
-
 
179
                subOrder.cashBackPercentage = percentage
-
 
180
            
-
 
181
            
-
 
182
            trackAnchor = div.find("a")   
-
 
183
            if trackAnchor is not None:
-
 
184
                subOrder.tracingkUrl = str(trackAnchor['href'])
-
 
185
            
-
 
186
            divStr = str(div)
-
 
187
            divStr = divStr.replace("\n","").replace("\t", "")
-
 
188
            
-
 
189
            for line in divStr.split("<br />"):
-
 
190
                if "Suborder ID" in line:
-
 
191
                    subOrder.merchantSubOrderId = re.findall(r'\d+', line)[0]   
-
 
192
                elif "Status" in line:
-
 
193
                    subOrder.detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
-
 
194
                elif "Est. Shipping Date" in line:
-
 
195
                    subOrder.estimatedShippingDate = line.split(":")[1].strip()
-
 
196
                elif "Est. Delivery Date" in line:
-
 
197
                    subOrder.estimatedDeliveryDate = line.split(":")[1].strip()
-
 
198
                elif "Courier Name" in line:
-
 
199
                    subOrder.courierName = line.split(":")[1].strip()
-
 
200
                elif "Tracking No" in line:
-
 
201
                    subOrder.trackingNumber = line.split(":")[1].strip()
-
 
202
            return subOrder
-
 
203
 
89
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
204
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
-
 
205
                    #print merchantOrder
90
        try:
206
        try:
91
            br = getBrowserObject()
207
            br = getBrowserObject()
92
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
208
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
93
            response = br.open(url)
209
            response = br.open(url)
94
            page = ungzipResponse(response)
210
            page = ungzipResponse(response)
95
            #page=page.decode("utf-8")
-
 
96
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
-
 
97
            #orderHead = soup.find(name, attrs, recursive, text)
-
 
98
            sections = soup.findAll("section")
-
 
99
            
-
 
100
            #print sections
-
 
101
            
-
 
102
            order = sections[1]
-
 
103
            orderTrs = order.findAll("tr")
-
 
104
            
-
 
105
            placedOn = str(orderTrs[0].findAll("td")[1].text)
-
 
106
            
-
 
107
            #Pop two section elements
-
 
108
            sections.pop(0) 
-
 
109
            sections.pop(0)
-
 
110
            subOrders = sections
-
 
111
            
-
 
112
             
-
 
113
            merchantSubOrders = []
-
 
114
    
-
 
115
            merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
211
            merchantOrder = self._parse(orderId, subTagId, userId, page, orderSuccessUrl)   
116
            merchantOrder.merchantOderId = re.findall(r'\d+', str(soup.find("div", {"class":"deals_heading"})))[1]
-
 
117
            for orderTr in orderTrs:
-
 
118
                orderTrString = str(orderTr)
-
 
119
                if "Total Amount" in orderTrString:
-
 
120
                    merchantOrder.totalAmount = re.findall(r'\d+', orderTrString)[0]
-
 
121
                elif "Delivery Charges" in orderTrString:
-
 
122
                    merchantOrder.deliveryCharges = re.findall(r'\d+', orderTrString)[0]
-
 
123
                elif "Discount Applied" in orderTrString:
-
 
124
                    merchantOrder.discountApplied = re.findall(r'\d+', orderTrString)[0]
-
 
125
                elif "Paid Amount" in orderTrString:
-
 
126
                    merchantOrder.paidAmount = re.findall(r'\d+', orderTrString)[0]
-
 
127
    
-
 
128
            for subOrderElement in subOrders:
-
 
129
                productUrl = str(subOrderElement.find("a")['href'])
-
 
130
                subTable = subOrderElement.find("table", {"class":"lrPad"})
-
 
131
                subTrs = subTable.findAll("tr")
-
 
132
                unitPrice=None
-
 
133
                offerDiscount = None
-
 
134
                deliveryCharges = None
-
 
135
                amountPaid = None
-
 
136
                for subTr in subTrs:
-
 
137
                    subTrString = str(subTr)
-
 
138
                    if "Unit Price" in subTrString:
-
 
139
                        unitPrice = re.findall(r'\d+', subTrString)[0]
-
 
140
                    if "Quantity" in subTrString:
-
 
141
                        qty = re.findall(r'\d+', subTrString)[0]
-
 
142
                    elif "Offer Discount" in subTrString:
-
 
143
                        offerDiscount =   re.findall(r'\d+', subTrString)[0]
-
 
144
                    elif "Delivery Charges" in subTrString:
-
 
145
                        deliveryCharges =   re.findall(r'\d+', subTrString)[0]
-
 
146
                    elif "Subtotal" in subTrString:
-
 
147
                        if int(qty) > 0:
-
 
148
                            amountPaid =   str(int(re.findall(r'\d+', subTrString)[0])/int(qty))
-
 
149
                        else:
-
 
150
                            amountPaid =   "0"
-
 
151
                if self.CONF_CB_AMOUNT == MStore.CONF_CB_SELLING_PRICE or offerDiscount is None:
-
 
152
                    amount = int(unitPrice)
-
 
153
                else:
-
 
154
                    amount = int(unitPrice) - int(offerDiscount)
-
 
155
                        
-
 
156
                divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
-
 
157
                if len(divs)<=0:
-
 
158
                    raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
-
 
159
                
-
 
160
                for div in divs:
-
 
161
                    productTitle = str(subOrderElement.find("a").text)
-
 
162
                    productUrl = "http://m.snapdeal.com/" + productUrl 
-
 
163
                    subOrder = SubOrder(productTitle, productUrl, placedOn, amountPaid)
-
 
164
    
-
 
165
                    subOrder.amountPaid = amountPaid
-
 
166
                    subOrder.deliveryCharges = deliveryCharges
-
 
167
                    subOrder.offerDiscount = offerDiscount
-
 
168
                    subOrder.unitPrice = unitPrice
-
 
169
                    subOrder.productCode = re.findall(r'\d+$', productUrl)[0]
-
 
170
                    (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
-
 
171
                    cashbackStatus = Store.CB_INIT
-
 
172
                    if cashbackAmount <= 0:
-
 
173
                        cashbackStatus = Store.CB_NA
-
 
174
                    subOrder.cashBackStatus = cashbackStatus
-
 
175
                    subOrder.cashBackAmount = cashbackAmount
-
 
176
                    if percentage > 0:
-
 
177
                        subOrder.cashBackPercentage = percentage
-
 
178
                    
-
 
179
                    
-
 
180
                    trackAnchor = div.find("a")   
-
 
181
                    if trackAnchor is not None:
-
 
182
                        subOrder.tracingkUrl = str(trackAnchor['href'])
-
 
183
                    
-
 
184
                    divStr = str(div)
-
 
185
                    divStr = divStr.replace("\n","").replace("\t", "")
-
 
186
                    
-
 
187
                    for line in divStr.split("<br />"):
-
 
188
                        if "Suborder ID" in line:
-
 
189
                            subOrder.merchantSubOrderId = re.findall(r'\d+', line)[0]   
-
 
190
                        elif "Status" in line:
-
 
191
                            subOrder.detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
-
 
192
                        elif "Est. Shipping Date" in line:
-
 
193
                            subOrder.estimatedShippingDate = line.split(":")[1].strip()
-
 
194
                        elif "Est. Delivery Date" in line:
-
 
195
                            subOrder.estimatedDeliveryDate = line.split(":")[1].strip()
-
 
196
                        elif "Courier Name" in line:
-
 
197
                            subOrder.courierName = line.split(":")[1].strip()
-
 
198
                        elif "Tracking No" in line:
-
 
199
                            subOrder.trackingNumber = line.split(":")[1].strip()
-
 
200
                               
-
 
201
                merchantSubOrders.append(subOrder)   
-
 
202
            
-
 
203
            merchantOrder.subOrders = merchantSubOrders
-
 
204
            #print merchantOrder
-
 
205
            
-
 
206
            self._saveToOrder(todict(merchantOrder))
212
            self._saveToOrder(todict(merchantOrder))
207
            return True
213
            return True
208
        except:
214
        except:
209
            print "Error occurred"
215
            print "Error occurred"
210
            traceback.print_exc()
216
            traceback.print_exc()
Line 220... Line 226...
220
            print "Detailed Status need to be mapped"
226
            print "Detailed Status need to be mapped"
221
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
227
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
222
    
228
    
223
    
229
    
224
    def scrapeStoreOrders(self,):
230
    def scrapeStoreOrders(self,):
-
 
231
        #collectionMap = {'palcedOn':1}
225
        orders = self._getActiveOrders()
232
        orders = self._getActiveOrders()
226
        print "Found orders", orders
233
        print "Found orders", orders
227
        br = getBrowserObject()
234
        br = getBrowserObject()
228
        for order in orders:
235
        for order in orders:
229
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', order['orderSuccessUrl'],re.IGNORECASE)[0]
236
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', order['orderSuccessUrl'],re.IGNORECASE)[0]
230
            response = br.open(url)
237
            response = br.open(url)
231
            page = ungzipResponse(response)
238
            page = ungzipResponse(response)
232
            #page=page.decode("utf-8")
239
            #page=page.decode("utf-8")
233
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
240
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
234
            sections = soup.findAll("section")
241
            sections = soup.findAll("section")
-
 
242
            orderEl = sections[1]
-
 
243
            orderTrs = orderEl.findAll("tr")
-
 
244
            
-
 
245
            placedOn = str(orderTrs[0].findAll("td")[1].text)
235
            sections.pop(0)
246
            sections.pop(0)
236
            sections.pop(0)
247
            sections.pop(0)
237
            
248
            
238
            subOrders = sections
249
            subOrders = sections
239
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
250
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
Line 241... Line 252...
241
                closed = True
252
                closed = True
242
                divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
253
                divs = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
243
                if len(divs)<=0:
254
                if len(divs)<=0:
244
                    raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
255
                    raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
245
                subOrder = None
256
                subOrder = None
-
 
257
                breakFlag = False
246
                for div in divs:
258
                for div in divs:
247
                    divStr = str(div)
259
                    divStr = str(div)
248
                    divStr = divStr.replace("\n","").replace("\t", "")
260
                    divStr = divStr.replace("\n","").replace("\t", "")
249
                    updateMap = {}
261
                    updateMap = {}
250
                    for line in divStr.split("<br />"):
262
                    for line in divStr.split("<br />"):
251
                        if "Suborder ID" in line:
263
                        if "Suborder ID" in line:
252
                            merchantSubOrderId = re.findall(r'\d+', line)[0]
264
                            merchantSubOrderId = re.findall(r'\d+', line)[0]
253
                            #break if suborder is inactive   
265
                            #break if suborder is inactive   
254
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": merchantSubOrderId}
-
 
255
                            subOrder =  self._isSubOrderActive(order, merchantSubOrderId)
266
                            subOrder =  self._isSubOrderActive(order, merchantSubOrderId)
256
                            if subOrder is None:
267
                            if subOrder is None:
-
 
268
                                subOrder = self.parseSubOrder(subOrderElement, placedOn)
-
 
269
                                self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":todict(subOrder)}})
-
 
270
                                print "Added new suborder with subOrder Id:", subOrder.merchantSubOrderId
-
 
271
                                closed = False
-
 
272
                                return
-
 
273
                            elif subOrder['closed']:
-
 
274
                                breakFlag = True
257
                                break
275
                                break
-
 
276
                            else: 
-
 
277
                                findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": merchantSubOrderId}
258
                        elif "Status" in line:
278
                        elif "Status" in line:
259
                            detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
279
                            detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
260
                            detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
-
 
261
                            updateMap["subOrders.$.detailedStatus"] = detailedStatus
280
                            updateMap["subOrders.$.detailedStatus"] = detailedStatus
262
                            status = self._getStatusFromDetailedStatus(detailedStatus) 
281
                            status = self._getStatusFromDetailedStatus(detailedStatus) 
263
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
282
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
-
 
283
                            updateMap["subOrders.$.status"] = status
-
 
284
                            if detailedStatus == 'Closed For Vendor Reallocation':
-
 
285
                                #if it is more than 6hours mark closed assuming it would be relocated in 6 hours.
-
 
286
                                closeAt = subOrder.get("closeAt") 
-
 
287
                                if closeAt is None:
-
 
288
                                    closeAt = datetime.now() + timedelta(hours=6)
-
 
289
                                    updateMap["subOrders.$.closeAt"] = closeAt
-
 
290
                                else:
-
 
291
                                    if datetime.now() > closeAt:
-
 
292
                                        closedStatus = True
-
 
293
                                    
-
 
294
                                    
264
                            if closedStatus:
295
                            if closedStatus:
265
                                #if status is closed then change the paybackStatus accordingly
296
                                #if status is closed then change the paybackStatus accordingly
-
 
297
                                updateMap["subOrders.$.closed"] = True
266
                                if closedStatus == Store.ORDER_DELIVERED:
298
                                if status == Store.ORDER_DELIVERED:
267
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
299
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
268
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
300
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
269
                                elif closedStatus == Store.ORDER_CANCELLED:
301
                                elif status == Store.ORDER_CANCELLED:
270
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
302
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
271
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
303
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
272
                                    
304
                                    
273
                            else:
305
                            else:
274
                                closed = False
306
                                closed = False
Line 282... Line 314...
282
                            courierName = line.split(":")[1].strip()
314
                            courierName = line.split(":")[1].strip()
283
                            updateMap["subOrders.$.courierName"] = courierName
315
                            updateMap["subOrders.$.courierName"] = courierName
284
                        elif "Tracking No" in line:
316
                        elif "Tracking No" in line:
285
                            trackingNumber = line.split(":")[1].strip()
317
                            trackingNumber = line.split(":")[1].strip()
286
                            updateMap["subOrders.$.trackingNumber"] = trackingNumber
318
                            updateMap["subOrders.$.trackingNumber"] = trackingNumber
-
 
319
 
-
 
320
                    if breakFlag:
-
 
321
                        break
287
                            
322
                            
288
                    bulk.find(findMap).update({'$set' : updateMap})
323
                    bulk.find(findMap).update({'$set' : updateMap})
289
                bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed}})
324
                bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed}})
290
            result = bulk.execute()
325
            result = bulk.execute()
291
            pprint(result)        
326
            pprint(result)        
Line 355... Line 390...
355
    return urllib.urlencode(parameters)
390
    return urllib.urlencode(parameters)
356
 
391
 
357
def main():
392
def main():
358
    
393
    
359
    store = getStore(3)
394
    store = getStore(3)
-
 
395
    store.scrapeStoreOrders()
360
    #store._isSubOrderActive(8, "5970688907")
396
    #store._isSubOrderActive(8, "5970688907")
361
    store.scrapeAffiliate()
397
    #store.scrapeAffiliate()
362
    #store.parseOrderRawHtml(12345, "subtagId", 122323,  "html", 'https://m.snapdeal.com/purchaseMobileComplete?code=1f4166d13ea799b65aa9dea68b3e9e70&order=4509499363')
398
    #store.parseOrderRawHtml(12345, "subtagId", 122323,  "html", 'https://m.snapdeal.com/purchaseMobileComplete?code=1f4166d13ea799b65aa9dea68b3e9e70&order=4509499363')
363
 
399
 
364
 
400
 
365
if __name__ == '__main__':
401
if __name__ == '__main__':
366
    main()
402
    main()