Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
15081 amit.gupta 1
from bson import json_util
2
from bson.json_util import dumps
15096 amit.gupta 3
from datetime import datetime, timedelta
13582 amit.gupta 4
from dtr import main
15081 amit.gupta 5
from dtr.config import PythonPropertyReader
13629 kshitij.so 6
from dtr.storage import Mongo
15132 amit.gupta 7
from dtr.storage.DataService import Retailers, Users, CallHistory, RetryConfig, \
8
    RetailerLinks
15081 amit.gupta 9
from dtr.utils import FetchLivePrices, DealSheet as X_DealSheet, \
10
    UserSpecificDeals
11
from elixir import *
12
from sqlalchemy.sql.expression import or_
15132 amit.gupta 13
from urllib import urlencode
14
import contextlib
13827 kshitij.so 15
import falcon
15081 amit.gupta 16
import json
17
import traceback
15132 amit.gupta 18
import urllib
19
import urllib2
20
import uuid
15081 amit.gupta 21
global RETAILER_DETAIL_CALL_COUNTER
22
RETAILER_DETAIL_CALL_COUNTER = 0
13572 kshitij.so 23
 
15081 amit.gupta 24
DEALER_RETRY_FACTOR = int(PythonPropertyReader.getConfig('DEALER_RETRY_FACTOR'))
13572 kshitij.so 25
class CategoryDiscountInfo(object):
26
 
27
    def on_get(self, req, resp):
28
 
13629 kshitij.so 29
        result = Mongo.getAllCategoryDiscount()
30
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
31
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 32
 
33
    def on_post(self, req, resp):
34
        try:
35
            result_json = json.loads(req.stream.read(), encoding='utf-8')
36
        except ValueError:
37
            raise falcon.HTTPError(falcon.HTTP_400,
38
                'Malformed JSON',
39
                'Could not decode the request body. The '
40
                'JSON was incorrect.')
41
 
42
        result = Mongo.addCategoryDiscount(result_json)
43
        resp.body = json.dumps(result, encoding='utf-8')
13969 kshitij.so 44
 
45
    def on_put(self, req, resp, _id):
13970 kshitij.so 46
        try:
47
            result_json = json.loads(req.stream.read(), encoding='utf-8')
48
        except ValueError:
49
            raise falcon.HTTPError(falcon.HTTP_400,
50
                'Malformed JSON',
51
                'Could not decode the request body. The '
52
                'JSON was incorrect.')
53
 
54
        result = Mongo.updateCategoryDiscount(result_json, _id)
55
        resp.body = json.dumps(result, encoding='utf-8')
56
 
13966 kshitij.so 57
 
13969 kshitij.so 58
 
13572 kshitij.so 59
class SkuSchemeDetails(object):
60
 
61
    def on_get(self, req, resp):
13629 kshitij.so 62
 
14070 kshitij.so 63
        offset = req.get_param_as_int("offset")
64
        limit = req.get_param_as_int("limit")
65
 
66
        result = Mongo.getAllSkuWiseSchemeDetails(offset, limit)
13629 kshitij.so 67
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
68
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 69
 
70
 
71
    def on_post(self, req, resp):
72
 
14552 kshitij.so 73
        multi = req.get_param_as_int("multi")
74
 
13572 kshitij.so 75
        try:
76
            result_json = json.loads(req.stream.read(), encoding='utf-8')
77
        except ValueError:
78
            raise falcon.HTTPError(falcon.HTTP_400,
79
                'Malformed JSON',
80
                'Could not decode the request body. The '
81
                'JSON was incorrect.')
82
 
14552 kshitij.so 83
        result = Mongo.addSchemeDetailsForSku(result_json, multi)
13572 kshitij.so 84
        resp.body = json.dumps(result, encoding='utf-8')
85
 
86
class SkuDiscountInfo():
87
 
88
    def on_get(self, req, resp):
13629 kshitij.so 89
 
13970 kshitij.so 90
        offset = req.get_param_as_int("offset")
91
        limit = req.get_param_as_int("limit")
92
        result = Mongo.getallSkuDiscountInfo(offset,limit)
13629 kshitij.so 93
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
94
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 95
 
96
 
97
    def on_post(self, req, resp):
98
 
14552 kshitij.so 99
        multi = req.get_param_as_int("multi")
100
 
13572 kshitij.so 101
        try:
102
            result_json = json.loads(req.stream.read(), encoding='utf-8')
103
        except ValueError:
104
            raise falcon.HTTPError(falcon.HTTP_400,
105
                'Malformed JSON',
106
                'Could not decode the request body. The '
107
                'JSON was incorrect.')
108
 
14552 kshitij.so 109
        result = Mongo.addSkuDiscountInfo(result_json, multi)
13572 kshitij.so 110
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 111
 
112
    def on_put(self, req, resp, _id):
113
        try:
114
            result_json = json.loads(req.stream.read(), encoding='utf-8')
115
        except ValueError:
116
            raise falcon.HTTPError(falcon.HTTP_400,
117
                'Malformed JSON',
118
                'Could not decode the request body. The '
119
                'JSON was incorrect.')
120
 
121
        result = Mongo.updateSkuDiscount(result_json, _id)
122
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 123
 
124
class ExceptionalNlc():
125
 
126
    def on_get(self, req, resp):
13629 kshitij.so 127
 
13970 kshitij.so 128
        offset = req.get_param_as_int("offset")
129
        limit = req.get_param_as_int("limit")
130
 
131
        result = Mongo.getAllExceptionlNlcItems(offset, limit)
13629 kshitij.so 132
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
133
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 134
 
135
    def on_post(self, req, resp):
136
 
14552 kshitij.so 137
        multi = req.get_param_as_int("multi")
138
 
13572 kshitij.so 139
        try:
140
            result_json = json.loads(req.stream.read(), encoding='utf-8')
141
        except ValueError:
142
            raise falcon.HTTPError(falcon.HTTP_400,
143
                'Malformed JSON',
144
                'Could not decode the request body. The '
145
                'JSON was incorrect.')
146
 
14552 kshitij.so 147
        result = Mongo.addExceptionalNlc(result_json, multi)
13572 kshitij.so 148
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 149
 
150
    def on_put(self, req, resp, _id):
151
        try:
152
            result_json = json.loads(req.stream.read(), encoding='utf-8')
153
        except ValueError:
154
            raise falcon.HTTPError(falcon.HTTP_400,
155
                'Malformed JSON',
156
                'Could not decode the request body. The '
157
                'JSON was incorrect.')
158
 
159
        result = Mongo.updateExceptionalNlc(result_json, _id)
160
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 161
 
13772 kshitij.so 162
class Deals():
13779 kshitij.so 163
    def on_get(self,req, resp, userId):
164
        categoryId = req.get_param_as_int("categoryId")
165
        offset = req.get_param_as_int("offset")
166
        limit = req.get_param_as_int("limit")
13798 kshitij.so 167
        sort = req.get_param("sort")
13802 kshitij.so 168
        direction = req.get_param_as_int("direction")
14853 kshitij.so 169
        filterData = req.get_param('filterData')
170
        result = Mongo.getNewDeals(int(userId), categoryId, offset, limit, sort, direction, filterData)
13772 kshitij.so 171
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 172
        resp.body = json.dumps(json_docs, encoding='utf-8')
13790 kshitij.so 173
 
174
class MasterData():
175
    def on_get(self,req, resp, skuId):
176
        result = Mongo.getItem(skuId)
13798 kshitij.so 177
        try:
178
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 179
            resp.body = json.dumps(json_docs, encoding='utf-8')
13798 kshitij.so 180
        except:
181
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 182
            resp.body = json.dumps(json_docs, encoding='utf-8')
13790 kshitij.so 183
 
14586 kshitij.so 184
    def on_post(self,req, resp):
185
 
186
        addNew = req.get_param_as_int("addNew")
187
        update = req.get_param_as_int("update")
188
        addToExisting = req.get_param_as_int("addToExisting")
189
        multi = req.get_param_as_int("multi")
190
 
14589 kshitij.so 191
        try:
14592 kshitij.so 192
            result_json = json.loads(req.stream.read(), encoding='utf-8')
193
        except ValueError:
194
            raise falcon.HTTPError(falcon.HTTP_400,
195
                'Malformed JSON',
196
                'Could not decode the request body. The '
197
                'JSON was incorrect.')
198
 
199
        if addNew == 1:
200
            result = Mongo.addNewItem(result_json)
201
        elif update == 1:
202
            result = Mongo.updateMaster(result_json, multi)
203
        elif addToExisting == 1:
204
            result = Mongo.addItemToExistingBundle(result_json)
205
        else:
206
            raise
207
        resp.body = dumps(result)
14586 kshitij.so 208
 
13827 kshitij.so 209
class LiveData():
210
    def on_get(self,req, resp):
13865 kshitij.so 211
        if req.get_param_as_int("id") is not None:
212
            print "****getting only for id"
213
            id = req.get_param_as_int("id")
214
            try:
215
                result = FetchLivePrices.getLatestPriceById(id)
13867 kshitij.so 216
                json_docs = json.dumps(result, default=json_util.default)
13966 kshitij.so 217
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 218
            except:
219
                json_docs = json.dumps({}, default=json_util.default)
13966 kshitij.so 220
                resp.body = json.dumps(json_docs, encoding='utf-8')
13834 kshitij.so 221
 
13865 kshitij.so 222
        else:
223
            print "****getting only for skuId"
224
            skuBundleId = req.get_param_as_int("skuBundleId")
225
            source_id = req.get_param_as_int("source_id")
226
            try:
227
                result = FetchLivePrices.getLatestPrice(skuBundleId, source_id)
228
                json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 229
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 230
            except:
231
                json_docs = [json.dumps(doc, default=json_util.default) for doc in [{}]]
13966 kshitij.so 232
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 233
 
13834 kshitij.so 234
class CashBack():
235
    def on_get(self,req, resp):
236
        identifier = req.get_param("identifier")
237
        source_id = req.get_param_as_int("source_id")
238
        try:
13838 kshitij.so 239
            result = Mongo.getCashBackDetails(identifier, source_id)
13837 kshitij.so 240
            json_docs = json.dumps(result, default=json_util.default)
13964 kshitij.so 241
            resp.body = json_docs
13834 kshitij.so 242
        except:
13837 kshitij.so 243
            json_docs = json.dumps({}, default=json_util.default)
13963 kshitij.so 244
            resp.body = json_docs
13892 kshitij.so 245
 
14398 amit.gupta 246
class ImgSrc():
247
    def on_get(self,req, resp):
248
        identifier = req.get_param("identifier")
249
        source_id = req.get_param_as_int("source_id")
250
        try:
251
            result = Mongo.getImgSrc(identifier, source_id)
252
            json_docs = json.dumps(result, default=json_util.default)
253
            resp.body = json_docs
254
        except:
255
            json_docs = json.dumps({}, default=json_util.default)
256
            resp.body = json_docs
257
 
13892 kshitij.so 258
class DealSheet():
259
    def on_get(self,req, resp):
13895 kshitij.so 260
        X_DealSheet.sendMail()
13897 kshitij.so 261
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
13966 kshitij.so 262
        resp.body = json.dumps(json_docs, encoding='utf-8')
13892 kshitij.so 263
 
13970 kshitij.so 264
class DealerPrice():
265
 
266
    def on_get(self, req, resp):
267
 
268
        offset = req.get_param_as_int("offset")
269
        limit = req.get_param_as_int("limit")
270
        result = Mongo.getAllDealerPrices(offset,limit)
271
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
272
        resp.body = json.dumps(json_docs, encoding='utf-8')
273
 
274
    def on_post(self, req, resp):
275
 
14552 kshitij.so 276
        multi = req.get_param_as_int("multi")
277
 
13970 kshitij.so 278
        try:
279
            result_json = json.loads(req.stream.read(), encoding='utf-8')
280
        except ValueError:
281
            raise falcon.HTTPError(falcon.HTTP_400,
282
                'Malformed JSON',
283
                'Could not decode the request body. The '
284
                'JSON was incorrect.')
285
 
14552 kshitij.so 286
        result = Mongo.addSkuDealerPrice(result_json, multi)
13970 kshitij.so 287
        resp.body = json.dumps(result, encoding='utf-8')
288
 
289
    def on_put(self, req, resp, _id):
290
        try:
291
            result_json = json.loads(req.stream.read(), encoding='utf-8')
292
        except ValueError:
293
            raise falcon.HTTPError(falcon.HTTP_400,
294
                'Malformed JSON',
295
                'Could not decode the request body. The '
296
                'JSON was incorrect.')
297
 
298
        result = Mongo.updateSkuDealerPrice(result_json, _id)
299
        resp.body = json.dumps(result, encoding='utf-8')
300
 
301
 
14041 kshitij.so 302
class ResetCache():
303
 
304
    def on_get(self,req, resp, userId):
14044 kshitij.so 305
        result = Mongo.resetCache(userId)
14046 kshitij.so 306
        resp.body = json.dumps(result, encoding='utf-8')
307
 
308
class UserDeals():
309
    def on_get(self,req,resp,userId):
310
        UserSpecificDeals.generateSheet(userId)
311
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
312
        resp.body = json.dumps(json_docs, encoding='utf-8')
14075 kshitij.so 313
 
314
class CommonUpdate():
315
 
316
    def on_post(self,req,resp):
14575 kshitij.so 317
 
318
        multi = req.get_param_as_int("multi")
319
 
14075 kshitij.so 320
        try:
321
            result_json = json.loads(req.stream.read(), encoding='utf-8')
322
        except ValueError:
323
            raise falcon.HTTPError(falcon.HTTP_400,
324
                'Malformed JSON',
325
                'Could not decode the request body. The '
326
                'JSON was incorrect.')
327
 
14575 kshitij.so 328
        result = Mongo.updateCollection(result_json, multi)
14075 kshitij.so 329
        resp.body = json.dumps(result, encoding='utf-8')
14106 kshitij.so 330
        resp.content_type = "application/json; charset=utf-8"
14481 kshitij.so 331
 
332
class NegativeDeals():
333
 
334
    def on_get(self, req, resp):
335
 
336
        offset = req.get_param_as_int("offset")
337
        limit = req.get_param_as_int("limit")
338
 
339
        result = Mongo.getAllNegativeDeals(offset, limit)
14483 kshitij.so 340
        resp.body = dumps(result) 
14481 kshitij.so 341
 
342
 
343
    def on_post(self, req, resp):
344
 
14552 kshitij.so 345
        multi = req.get_param_as_int("multi")
346
 
14481 kshitij.so 347
        try:
348
            result_json = json.loads(req.stream.read(), encoding='utf-8')
349
        except ValueError:
350
            raise falcon.HTTPError(falcon.HTTP_400,
351
                'Malformed JSON',
352
                'Could not decode the request body. The '
353
                'JSON was incorrect.')
354
 
14552 kshitij.so 355
        result = Mongo.addNegativeDeals(result_json, multi)
14481 kshitij.so 356
        resp.body = json.dumps(result, encoding='utf-8')
357
 
358
class ManualDeals():
359
 
360
    def on_get(self, req, resp):
361
 
362
        offset = req.get_param_as_int("offset")
363
        limit = req.get_param_as_int("limit")
364
 
365
        result = Mongo.getAllManualDeals(offset, limit)
14483 kshitij.so 366
        resp.body = dumps(result)
14481 kshitij.so 367
 
368
 
369
    def on_post(self, req, resp):
370
 
14552 kshitij.so 371
        multi = req.get_param_as_int("multi")
372
 
14481 kshitij.so 373
        try:
374
            result_json = json.loads(req.stream.read(), encoding='utf-8')
375
        except ValueError:
376
            raise falcon.HTTPError(falcon.HTTP_400,
377
                'Malformed JSON',
378
                'Could not decode the request body. The '
379
                'JSON was incorrect.')
380
 
14552 kshitij.so 381
        result = Mongo.addManualDeal(result_json, multi)
14481 kshitij.so 382
        resp.body = json.dumps(result, encoding='utf-8')
383
 
384
class CommonDelete():
14482 kshitij.so 385
 
14481 kshitij.so 386
    def on_post(self,req,resp):
387
        try:
388
            result_json = json.loads(req.stream.read(), encoding='utf-8')
389
        except ValueError:
390
            raise falcon.HTTPError(falcon.HTTP_400,
391
                'Malformed JSON',
392
                'Could not decode the request body. The '
393
                'JSON was incorrect.')
394
 
395
        result = Mongo.deleteDocument(result_json)
396
        resp.body = json.dumps(result, encoding='utf-8')
397
        resp.content_type = "application/json; charset=utf-8"
14482 kshitij.so 398
 
399
class SearchProduct():
400
 
401
    def on_get(self,req,resp):
402
        offset = req.get_param_as_int("offset")
403
        limit = req.get_param_as_int("limit")
404
        search_term = req.get_param("search")
405
 
406
        result = Mongo.searchMaster(offset, limit, search_term)
14483 kshitij.so 407
        resp.body = dumps(result) 
14482 kshitij.so 408
 
409
 
14495 kshitij.so 410
class FeaturedDeals():
14482 kshitij.so 411
 
14495 kshitij.so 412
    def on_get(self, req, resp):
413
 
414
        offset = req.get_param_as_int("offset")
415
        limit = req.get_param_as_int("limit")
416
 
417
        result = Mongo.getAllFeaturedDeals(offset, limit)
418
        resp.body = dumps(result)
419
 
420
 
421
    def on_post(self, req, resp):
422
 
14552 kshitij.so 423
        multi = req.get_param_as_int("multi")
424
 
14495 kshitij.so 425
        try:
426
            result_json = json.loads(req.stream.read(), encoding='utf-8')
427
        except ValueError:
428
            raise falcon.HTTPError(falcon.HTTP_400,
429
                'Malformed JSON',
430
                'Could not decode the request body. The '
431
                'JSON was incorrect.')
432
 
14552 kshitij.so 433
        result = Mongo.addFeaturedDeal(result_json, multi)
14495 kshitij.so 434
        resp.body = json.dumps(result, encoding='utf-8')
435
 
14497 kshitij.so 436
 
437
class CommonSearch():
14495 kshitij.so 438
 
14497 kshitij.so 439
    def on_get(self,req,resp):
440
        class_name = req.get_param("class")
441
        sku = req.get_param_as_int("sku")
442
        skuBundleId = req.get_param_as_int("skuBundleId")
14499 kshitij.so 443
 
444
        result = Mongo.searchCollection(class_name, sku, skuBundleId)
14497 kshitij.so 445
        resp.body = dumps(result)
14619 kshitij.so 446
 
447
class CricScore():
448
 
449
    def on_get(self,req,resp):
450
 
451
        result = Mongo.getLiveCricScore()
14853 kshitij.so 452
        resp.body = dumps(result)
453
 
454
class Notification():
455
 
456
    def on_post(self, req, resp):
457
 
458
        try:
459
            result_json = json.loads(req.stream.read(), encoding='utf-8')
460
        except ValueError:
461
            raise falcon.HTTPError(falcon.HTTP_400,
462
                'Malformed JSON',
463
                'Could not decode the request body. The '
464
                'JSON was incorrect.')
465
 
466
        result = Mongo.addBundleToNotification(result_json)
467
        resp.body = json.dumps(result, encoding='utf-8')
468
 
469
    def on_get(self, req, resp):
470
 
471
        offset = req.get_param_as_int("offset")
472
        limit = req.get_param_as_int("limit")
473
 
474
        result = Mongo.getAllNotifications(offset, limit)
475
        resp.body = dumps(result)
476
 
14998 kshitij.so 477
class DealBrands():
14853 kshitij.so 478
 
14998 kshitij.so 479
    def on_get(self, req, resp):
480
 
481
        category_id = req.get_param_as_int("category_id")
482
        result = Mongo.getBrandsForFilter(category_id)
14999 kshitij.so 483
        resp.body = dumps(result)
14998 kshitij.so 484
 
15081 amit.gupta 485
 
486
class RetailerDetail():
487
    global RETAILER_DETAIL_CALL_COUNTER
15105 amit.gupta 488
    def getRetryRetailer(self,failback=True):
15081 amit.gupta 489
        retailer = None
490
        status = 'fretry' if self.callType == 'followup' else 'retry'
491
        try:
492
            retailer = session.query(Retailers).filter_by(status=status).filter(Retailers.next_call_time<=datetime.now()).order_by(Retailers.call_priority).order_by(Retailers.next_call_time).with_lockmode("update").first()
493
            if retailer is not None:
494
                print "getRetryRetailer", retailer.id
495
            else:
496
                if failback:
497
                    retailer = self.getNewRetailer(False)
15104 amit.gupta 498
                    return retailer
15103 amit.gupta 499
            if status=='retry':
15081 amit.gupta 500
                retailer.status = 'assigned'
501
            else:
502
                retailer.status = 'fassigned'
503
            session.commit()
15107 amit.gupta 504
            print "getRetryRetailer", retailer.id
15081 amit.gupta 505
        finally:
506
            session.close()
507
        return retailer
508
 
509
    def getNewRetailer(self,failback=True):
510
        retry = True
511
        retailer = None 
512
        try:
513
            while(retry):
514
                print "Calltype", self.callType
515
                status=self.callType
516
                query = session.query(Retailers).filter(Retailers.status==status)
517
                if status=='fresh':
518
                    query = query.filter_by(is_or=False, is_std=False).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None)).order_by(-Retailers.agent_id)
519
                retailer = query.with_lockmode("update").first()
520
                if retailer is not None:
521
                    print "retailer", retailer.id
522
                    if status=="fresh":
523
                        userquery = session.query(Users)
524
                        if retailer.contact2 is not None:
525
                            userquery = userquery.filter(Users.mobile_number.in_([retailer.contact1,retailer.contact2]))
526
                        else:
527
                            userquery = userquery.filter_by(mobile_number=retailer.contact1)
528
                        user = userquery.first()
529
                        if user is not None:
530
                            retailer.status = 'alreadyuser'
531
                            print "retailer.status", retailer.status
532
                            session.commit()
533
                            continue
534
                        retailer.status = 'assigned'
535
                    else:
536
                        retailer.status = 'fassigned'
537
                    print "Found Retailer", retailer.id, "with status", status,"assigned to", self.agentId
538
                    retailer.retry_count = 0
15123 amit.gupta 539
                    retailer.invalid_retry_count = 0
15081 amit.gupta 540
                    session.commit()
541
                    print "-"*50
542
                    print "Found Retailer", retailer.id, "with status", status,"assigned to", self.agentId
543
                    retry=False
544
 
545
                else:
546
                    print "No fresh/followup retailers found"
547
                    if failback:
548
                        retailer = self.getRetryRetailer(False)
15104 amit.gupta 549
                        return retailer
15081 amit.gupta 550
        except:
551
            print traceback.print_exc()
552
        finally:
553
            session.close()
554
        return retailer
555
 
15132 amit.gupta 556
    def on_get(self, req, resp, agentId, callType=None, retailerId=None):
15081 amit.gupta 557
        global RETAILER_DETAIL_CALL_COUNTER
558
        RETAILER_DETAIL_CALL_COUNTER += 1
559
        print "RETAILER_DETAIL_CALL_COUNTER", RETAILER_DETAIL_CALL_COUNTER
560
        print "I am here"
561
        self.agentId = int(agentId)
562
        self.callType = callType
15132 amit.gupta 563
        if callType is None:
564
            retailerLink = session.query(RetailerLinks).filter_by(id=retailerId)
565
            if retailerLink is not None:
566
                code = retailerLink.code
567
            else: 
568
                code = self.getCode()
569
                retailerLink = RetailerLinks()
570
                retailerLink.code = code
571
                retailerLink.is_activated = False
572
                retailerLink.retailer_id = retailerId
573
                session.commit()
574
            session.close()
575
            resp.body =  json.dumps({"result":{"code":code}}, encoding='utf-8')
576
            return 
15081 amit.gupta 577
        retryFlag = False 
578
        agentId = int(agentId)
579
        if RETAILER_DETAIL_CALL_COUNTER % DEALER_RETRY_FACTOR ==0:
580
            retryFlag=True
581
 
582
        if retryFlag:
583
            retailer = self.getRetryRetailer()
584
        else:
585
            retailer = self.getNewRetailer()
586
 
587
        if retailer is None:
15132 amit.gupta 588
            resp.body = "{\"result\":{}}"
15081 amit.gupta 589
        else:
590
            resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
591
 
592
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 593
        returned = False
15081 amit.gupta 594
        self.agentId = int(agentId)
595
        self.callType = callType
596
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15099 amit.gupta 597
        print jsonReq
15091 amit.gupta 598
        self.jsonReq = jsonReq
599
        invalidNumber = self.invalidNumber
600
        callLater = self.callLater
15096 amit.gupta 601
        alreadyUser = self.alReadyUser
15091 amit.gupta 602
        verifiedLinkSent = self.verifiedLinkSent
15109 amit.gupta 603
 
15096 amit.gupta 604
        self.retailerId = int(jsonReq.get('retailerid'))
15112 amit.gupta 605
        try:
606
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
607
            self.callDisposition = jsonReq.get('calldispositiontype')
608
            self.callHistory = CallHistory()
609
            self.callHistory.agent_id=self.agentId
610
            self.callHistory.call_disposition = self.callDisposition
611
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 612
            self.callHistory.call_type=self.callType
15112 amit.gupta 613
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
614
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
615
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
616
            self.callHistory.mobile_number = jsonReq.get('number')
617
            self.callHistory.sms_verified = 0
618
 
619
            dispositionMap = {  'call_later':callLater,
620
                        'ringing_no_answer':callLater,
621
                        'not_reachable':callLater,
622
                        'switch_off':callLater,
623
                        'invalid_no':invalidNumber,
624
                        'wrong_no':invalidNumber,
625
                        'hang_up':invalidNumber,
626
                        'retailer_not_interested':invalidNumber,
627
                        'alreadyuser':alreadyUser,
628
                        'verified_link_sent':verifiedLinkSent
629
                      }
630
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
631
        finally:
632
            session.close()
15096 amit.gupta 633
 
15112 amit.gupta 634
        if returned:
635
            resp.body = "{\"result\":\"success\"}"
636
        else:
637
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 638
 
15091 amit.gupta 639
    def invalidNumber(self,):
15108 manas 640
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
641
        if self.callDisposition == 'invalid_no':
642
            self.retailer.status='failed'
643
            self.callHistory.disposition_description = 'Invalid Number'
644
        elif self.callDisposition == 'wrong_no':
15111 manas 645
            self.retailer.status='failed'
646
            self.callHistory.disposition_description = 'Wrong Number'
647
        elif self.callDisposition == 'hang_up':
648
            self.retailer.status='failed'
649
            self.callHistory.disposition_description = 'Hang Up'
650
        elif self.callDisposition == 'retailer_not_interested':
651
            self.retailer.status='failed'
652
            if self.callHistory.disposition_description is None:
653
                self.callHistory.disposition_description = 'NA'
654
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description        
15108 manas 655
        session.commit()
656
        return True   
657
 
15132 amit.gupta 658
    def getCode(self,):
659
        prefix = None
660
        notFound = True
661
        while notFound:
662
            code = uuid.uuid4().hex[:10] if prefix is None else prefix + uuid.uuid4().hex[:6]
663
            notFound = '0' in code and session.query(RetailerLinks).filter_by(code=code).first() is not None
664
        return code
15108 manas 665
 
15091 amit.gupta 666
    def callLater(self,):
15100 amit.gupta 667
        self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
668
        self.retailer.call_priority = None
15096 amit.gupta 669
        if self.callDisposition == 'call_later':
15100 amit.gupta 670
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 671
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 672
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
673
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
674
            else:
15102 amit.gupta 675
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 676
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 677
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
678
        else: 
679
            if self.callDisposition == 'ringing_no_answer':
680
                if self.retailer.disposition == 'ringing_no_answer':
681
                    self.retailer.retry_count += 1
682
                else:
683
                    self.retailer.disposition = 'ringing_no_answer'
684
                    self.retailer.retry_count = 1
685
            else:
686
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 687
                    pass
15112 amit.gupta 688
                else:
15119 amit.gupta 689
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 690
                self.retailer.retry_count += 1
691
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 692
 
15122 amit.gupta 693
            retryConfig = session.query(RetryConfig).filter_by(call_type=self.callType, disposition_type=self.retailer.disposition, retry_count=self.retailer.retry_count).first()
15112 amit.gupta 694
            if retryConfig is not None:
695
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 696
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 697
            else:
698
                self.retailer.status = 'failed'
699
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 700
 
15101 amit.gupta 701
        session.commit()
702
        return True
15096 amit.gupta 703
 
15100 amit.gupta 704
 
15091 amit.gupta 705
    def alReadyUser(self,):
15112 amit.gupta 706
        self.retailer.status = self.callDisposition
15117 amit.gupta 707
        if self.callHistory.disposition_description is None:
708
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 709
        session.commit()
710
        return True
15091 amit.gupta 711
    def verifiedLinkSent(self,):
15112 amit.gupta 712
        self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
713
 
15081 amit.gupta 714
 
715
def todict(obj, classkey=None):
716
    if isinstance(obj, dict):
717
        data = {}
718
        for (k, v) in obj.items():
719
            data[k] = todict(v, classkey)
720
        return data
721
    elif hasattr(obj, "_ast"):
722
        return todict(obj._ast())
723
    elif hasattr(obj, "__iter__"):
724
        return [todict(v, classkey) for v in obj]
725
    elif hasattr(obj, "__dict__"):
726
        data = dict([(key, todict(value, classkey)) 
727
            for key, value in obj.__dict__.iteritems() 
728
            if not callable(value) and not key.startswith('_')])
729
        if classkey is not None and hasattr(obj, "__class__"):
730
            data[classkey] = obj.__class__.__name__
731
        return data
732
    else:
733
        return obj
734
 
735
def getRetailerObj(retailer):
736
    obj = Mock()
737
    obj.title = retailer.title
738
    obj.contact1 = retailer.contact1
739
    obj.contact2 = retailer.contact2
740
    obj.address = retailer.address
741
    obj.id = retailer.id
15096 amit.gupta 742
    obj.scheduled = (retailer.call_priority is not None)
15081 amit.gupta 743
    return obj
15091 amit.gupta 744
 
15132 amit.gupta 745
def make_tiny(code):
746
    url = 'https://play.google.com/store/apps/details?id=com.saholic.profittill&referrer=utm_source%3D0%26utm_medium%3DCRM%26utm_term%3D001%26utm_campaign%3D' + code
747
    request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
748
    filehandle = urllib2.Request(request_url)
749
    x= urllib2.urlopen(filehandle)
750
    return str(x.read())
15081 amit.gupta 751
 
15132 amit.gupta 752
 
15081 amit.gupta 753
class Mock(object):
754
    pass
755
 
756
def main():
15132 amit.gupta 757
    print make_tiny("http://www.google.com")
15081 amit.gupta 758
 
759
if __name__ == '__main__':
15091 amit.gupta 760
        main()
761