Subversion Repositories SmartDukaan

Rev

Rev 15157 | Rev 15162 | 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, \
15135 amit.gupta 8
    RetailerLinks, Activation_Codes
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)
15161 kshitij.so 484
 
485
class DealRank():
14998 kshitij.so 486
 
15161 kshitij.so 487
    def on_get(self, req, resp):
488
        identifier = req.get_param("identifier")
489
        source_id = req.get_param_as_int("source_id")
490
        user_id = req.get_param_as_int("user_id")
491
        result = Mongo.getDealRank(identifier, source_id, user_id)
492
        json_docs = json.dumps(result, default=json_util.default)
493
        resp.body = json_docs
494
 
495
 
15081 amit.gupta 496
 
497
class RetailerDetail():
498
    global RETAILER_DETAIL_CALL_COUNTER
15105 amit.gupta 499
    def getRetryRetailer(self,failback=True):
15081 amit.gupta 500
        retailer = None
501
        status = 'fretry' if self.callType == 'followup' else 'retry'
502
        try:
503
            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()
504
            if retailer is not None:
505
                print "getRetryRetailer", retailer.id
506
            else:
507
                if failback:
508
                    retailer = self.getNewRetailer(False)
15104 amit.gupta 509
                    return retailer
15103 amit.gupta 510
            if status=='retry':
15081 amit.gupta 511
                retailer.status = 'assigned'
512
            else:
513
                retailer.status = 'fassigned'
514
            session.commit()
15107 amit.gupta 515
            print "getRetryRetailer", retailer.id
15081 amit.gupta 516
        finally:
517
            session.close()
518
        return retailer
519
 
520
    def getNewRetailer(self,failback=True):
521
        retry = True
522
        retailer = None 
523
        try:
524
            while(retry):
525
                print "Calltype", self.callType
526
                status=self.callType
527
                query = session.query(Retailers).filter(Retailers.status==status)
528
                if status=='fresh':
529
                    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)
530
                retailer = query.with_lockmode("update").first()
531
                if retailer is not None:
532
                    print "retailer", retailer.id
533
                    if status=="fresh":
534
                        userquery = session.query(Users)
535
                        if retailer.contact2 is not None:
536
                            userquery = userquery.filter(Users.mobile_number.in_([retailer.contact1,retailer.contact2]))
537
                        else:
538
                            userquery = userquery.filter_by(mobile_number=retailer.contact1)
539
                        user = userquery.first()
540
                        if user is not None:
541
                            retailer.status = 'alreadyuser'
542
                            print "retailer.status", retailer.status
543
                            session.commit()
544
                            continue
545
                        retailer.status = 'assigned'
546
                    else:
547
                        retailer.status = 'fassigned'
548
                    print "Found Retailer", retailer.id, "with status", status,"assigned to", self.agentId
549
                    retailer.retry_count = 0
15123 amit.gupta 550
                    retailer.invalid_retry_count = 0
15081 amit.gupta 551
                    session.commit()
552
                    print "-"*50
553
                    print "Found Retailer", retailer.id, "with status", status,"assigned to", self.agentId
554
 
555
                else:
556
                    print "No fresh/followup retailers found"
557
                    if failback:
558
                        retailer = self.getRetryRetailer(False)
15104 amit.gupta 559
                        return retailer
15148 amit.gupta 560
                retry=False
15081 amit.gupta 561
        except:
562
            print traceback.print_exc()
563
        finally:
564
            session.close()
565
        return retailer
566
 
15132 amit.gupta 567
    def on_get(self, req, resp, agentId, callType=None, retailerId=None):
15081 amit.gupta 568
        global RETAILER_DETAIL_CALL_COUNTER
569
        RETAILER_DETAIL_CALL_COUNTER += 1
570
        print "RETAILER_DETAIL_CALL_COUNTER", RETAILER_DETAIL_CALL_COUNTER
571
        print "I am here"
572
        self.agentId = int(agentId)
573
        self.callType = callType
15139 amit.gupta 574
        if retailerId is not None:
575
            self.retailerId = int(retailerId)
15141 amit.gupta 576
            retailerLink = session.query(RetailerLinks).filter_by(id=self.retailerId).first()
15132 amit.gupta 577
            if retailerLink is not None:
578
                code = retailerLink.code
579
            else: 
580
                code = self.getCode()
581
                retailerLink = RetailerLinks()
582
                retailerLink.code = code
583
                retailerLink.is_activated = False
15139 amit.gupta 584
                retailerLink.agent_id = self.agentId
585
                retailerLink.retailer_id = self.retailerId
15135 amit.gupta 586
 
587
                activationCode=Activation_Codes()
588
                activationCode.code = code
15132 amit.gupta 589
                session.commit()
590
            session.close()
15142 amit.gupta 591
            resp.body =  json.dumps({"result":{"code":code,"link":make_tiny(code)}}, encoding='utf-8')
15132 amit.gupta 592
            return 
15081 amit.gupta 593
        retryFlag = False 
594
        agentId = int(agentId)
595
        if RETAILER_DETAIL_CALL_COUNTER % DEALER_RETRY_FACTOR ==0:
596
            retryFlag=True
597
 
598
        if retryFlag:
599
            retailer = self.getRetryRetailer()
600
        else:
601
            retailer = self.getNewRetailer()
602
 
603
        if retailer is None:
15157 amit.gupta 604
            resp.body = "{}"
15081 amit.gupta 605
        else:
606
            resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
607
 
608
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 609
        returned = False
15081 amit.gupta 610
        self.agentId = int(agentId)
611
        self.callType = callType
612
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15099 amit.gupta 613
        print jsonReq
15091 amit.gupta 614
        self.jsonReq = jsonReq
615
        invalidNumber = self.invalidNumber
616
        callLater = self.callLater
15096 amit.gupta 617
        alreadyUser = self.alReadyUser
15091 amit.gupta 618
        verifiedLinkSent = self.verifiedLinkSent
15109 amit.gupta 619
 
15096 amit.gupta 620
        self.retailerId = int(jsonReq.get('retailerid'))
15112 amit.gupta 621
        try:
622
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
623
            self.callDisposition = jsonReq.get('calldispositiontype')
624
            self.callHistory = CallHistory()
625
            self.callHistory.agent_id=self.agentId
626
            self.callHistory.call_disposition = self.callDisposition
627
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 628
            self.callHistory.call_type=self.callType
15112 amit.gupta 629
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
630
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
631
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
632
            self.callHistory.mobile_number = jsonReq.get('number')
15145 amit.gupta 633
            self.callHistory.sms_verified = int(jsonReq.get("verified"))
15112 amit.gupta 634
 
635
            dispositionMap = {  'call_later':callLater,
636
                        'ringing_no_answer':callLater,
637
                        'not_reachable':callLater,
638
                        'switch_off':callLater,
639
                        'invalid_no':invalidNumber,
640
                        'wrong_no':invalidNumber,
641
                        'hang_up':invalidNumber,
642
                        'retailer_not_interested':invalidNumber,
643
                        'alreadyuser':alreadyUser,
644
                        'verified_link_sent':verifiedLinkSent
645
                      }
646
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
647
        finally:
648
            session.close()
15096 amit.gupta 649
 
15112 amit.gupta 650
        if returned:
651
            resp.body = "{\"result\":\"success\"}"
652
        else:
653
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 654
 
15091 amit.gupta 655
    def invalidNumber(self,):
15108 manas 656
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
657
        if self.callDisposition == 'invalid_no':
658
            self.retailer.status='failed'
659
            self.callHistory.disposition_description = 'Invalid Number'
660
        elif self.callDisposition == 'wrong_no':
15111 manas 661
            self.retailer.status='failed'
662
            self.callHistory.disposition_description = 'Wrong Number'
663
        elif self.callDisposition == 'hang_up':
664
            self.retailer.status='failed'
665
            self.callHistory.disposition_description = 'Hang Up'
666
        elif self.callDisposition == 'retailer_not_interested':
667
            self.retailer.status='failed'
668
            if self.callHistory.disposition_description is None:
669
                self.callHistory.disposition_description = 'NA'
670
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description        
15108 manas 671
        session.commit()
672
        return True   
673
 
15132 amit.gupta 674
    def getCode(self,):
675
        prefix = None
676
        notFound = True
677
        while notFound:
678
            code = uuid.uuid4().hex[:10] if prefix is None else prefix + uuid.uuid4().hex[:6]
679
            notFound = '0' in code and session.query(RetailerLinks).filter_by(code=code).first() is not None
680
        return code
15108 manas 681
 
15091 amit.gupta 682
    def callLater(self,):
15100 amit.gupta 683
        self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
684
        self.retailer.call_priority = None
15096 amit.gupta 685
        if self.callDisposition == 'call_later':
15100 amit.gupta 686
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 687
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 688
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
689
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
690
            else:
15102 amit.gupta 691
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 692
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 693
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
694
        else: 
695
            if self.callDisposition == 'ringing_no_answer':
696
                if self.retailer.disposition == 'ringing_no_answer':
697
                    self.retailer.retry_count += 1
698
                else:
699
                    self.retailer.disposition = 'ringing_no_answer'
700
                    self.retailer.retry_count = 1
701
            else:
702
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 703
                    pass
15112 amit.gupta 704
                else:
15119 amit.gupta 705
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 706
                self.retailer.retry_count += 1
707
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 708
 
15122 amit.gupta 709
            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 710
            if retryConfig is not None:
711
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 712
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 713
            else:
714
                self.retailer.status = 'failed'
715
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 716
 
15101 amit.gupta 717
        session.commit()
718
        return True
15096 amit.gupta 719
 
15100 amit.gupta 720
 
15091 amit.gupta 721
    def alReadyUser(self,):
15112 amit.gupta 722
        self.retailer.status = self.callDisposition
15117 amit.gupta 723
        if self.callHistory.disposition_description is None:
724
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 725
        session.commit()
726
        return True
15091 amit.gupta 727
    def verifiedLinkSent(self,):
15147 amit.gupta 728
        if self.callType == 'fresh':
729
            self.retailer.status = 'followup'
730
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
731
            self.callHistory.disposition_description = 'App link sent via ' + self.callHistory.disposition_description+ '. followup on' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S') 
732
        else:
733
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=7)
734
            self.callHistory.disposition_description = 'App link sent via' + self.callHistory.disposition_description + '. Followup again on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S') 
15146 amit.gupta 735
        session.commit()
736
        return True
15112 amit.gupta 737
 
15081 amit.gupta 738
 
739
def todict(obj, classkey=None):
740
    if isinstance(obj, dict):
741
        data = {}
742
        for (k, v) in obj.items():
743
            data[k] = todict(v, classkey)
744
        return data
745
    elif hasattr(obj, "_ast"):
746
        return todict(obj._ast())
747
    elif hasattr(obj, "__iter__"):
748
        return [todict(v, classkey) for v in obj]
749
    elif hasattr(obj, "__dict__"):
750
        data = dict([(key, todict(value, classkey)) 
751
            for key, value in obj.__dict__.iteritems() 
752
            if not callable(value) and not key.startswith('_')])
753
        if classkey is not None and hasattr(obj, "__class__"):
754
            data[classkey] = obj.__class__.__name__
755
        return data
756
    else:
757
        return obj
758
 
759
def getRetailerObj(retailer):
760
    obj = Mock()
761
    obj.title = retailer.title
762
    obj.contact1 = retailer.contact1
763
    obj.contact2 = retailer.contact2
764
    obj.address = retailer.address
765
    obj.id = retailer.id
15096 amit.gupta 766
    obj.scheduled = (retailer.call_priority is not None)
15081 amit.gupta 767
    return obj
15091 amit.gupta 768
 
15132 amit.gupta 769
def make_tiny(code):
770
    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
771
    request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
772
    filehandle = urllib2.Request(request_url)
773
    x= urllib2.urlopen(filehandle)
774
    return str(x.read())
15081 amit.gupta 775
 
15132 amit.gupta 776
 
15081 amit.gupta 777
class Mock(object):
778
    pass
779
 
780
def main():
15132 amit.gupta 781
    print make_tiny("http://www.google.com")
15081 amit.gupta 782
 
783
if __name__ == '__main__':
15091 amit.gupta 784
        main()
785