Subversion Repositories SmartDukaan

Rev

Rev 15142 | Rev 15146 | 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)
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
15139 amit.gupta 563
        if retailerId is not None:
564
            self.retailerId = int(retailerId)
15141 amit.gupta 565
            retailerLink = session.query(RetailerLinks).filter_by(id=self.retailerId).first()
15132 amit.gupta 566
            if retailerLink is not None:
567
                code = retailerLink.code
568
            else: 
569
                code = self.getCode()
570
                retailerLink = RetailerLinks()
571
                retailerLink.code = code
572
                retailerLink.is_activated = False
15139 amit.gupta 573
                retailerLink.agent_id = self.agentId
574
                retailerLink.retailer_id = self.retailerId
15135 amit.gupta 575
 
576
                activationCode=Activation_Codes()
577
                activationCode.code = code
15132 amit.gupta 578
                session.commit()
579
            session.close()
15142 amit.gupta 580
            resp.body =  json.dumps({"result":{"code":code,"link":make_tiny(code)}}, encoding='utf-8')
15132 amit.gupta 581
            return 
15081 amit.gupta 582
        retryFlag = False 
583
        agentId = int(agentId)
584
        if RETAILER_DETAIL_CALL_COUNTER % DEALER_RETRY_FACTOR ==0:
585
            retryFlag=True
586
 
587
        if retryFlag:
588
            retailer = self.getRetryRetailer()
589
        else:
590
            retailer = self.getNewRetailer()
591
 
592
        if retailer is None:
15132 amit.gupta 593
            resp.body = "{\"result\":{}}"
15081 amit.gupta 594
        else:
595
            resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
596
 
597
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 598
        returned = False
15081 amit.gupta 599
        self.agentId = int(agentId)
600
        self.callType = callType
601
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15099 amit.gupta 602
        print jsonReq
15091 amit.gupta 603
        self.jsonReq = jsonReq
604
        invalidNumber = self.invalidNumber
605
        callLater = self.callLater
15096 amit.gupta 606
        alreadyUser = self.alReadyUser
15091 amit.gupta 607
        verifiedLinkSent = self.verifiedLinkSent
15109 amit.gupta 608
 
15096 amit.gupta 609
        self.retailerId = int(jsonReq.get('retailerid'))
15112 amit.gupta 610
        try:
611
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
612
            self.callDisposition = jsonReq.get('calldispositiontype')
613
            self.callHistory = CallHistory()
614
            self.callHistory.agent_id=self.agentId
615
            self.callHistory.call_disposition = self.callDisposition
616
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 617
            self.callHistory.call_type=self.callType
15112 amit.gupta 618
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
619
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
620
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
621
            self.callHistory.mobile_number = jsonReq.get('number')
15145 amit.gupta 622
            self.callHistory.sms_verified = int(jsonReq.get("verified"))
15112 amit.gupta 623
 
624
            dispositionMap = {  'call_later':callLater,
625
                        'ringing_no_answer':callLater,
626
                        'not_reachable':callLater,
627
                        'switch_off':callLater,
628
                        'invalid_no':invalidNumber,
629
                        'wrong_no':invalidNumber,
630
                        'hang_up':invalidNumber,
631
                        'retailer_not_interested':invalidNumber,
632
                        'alreadyuser':alreadyUser,
633
                        'verified_link_sent':verifiedLinkSent
634
                      }
635
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
636
        finally:
637
            session.close()
15096 amit.gupta 638
 
15112 amit.gupta 639
        if returned:
640
            resp.body = "{\"result\":\"success\"}"
641
        else:
642
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 643
 
15091 amit.gupta 644
    def invalidNumber(self,):
15108 manas 645
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
646
        if self.callDisposition == 'invalid_no':
647
            self.retailer.status='failed'
648
            self.callHistory.disposition_description = 'Invalid Number'
649
        elif self.callDisposition == 'wrong_no':
15111 manas 650
            self.retailer.status='failed'
651
            self.callHistory.disposition_description = 'Wrong Number'
652
        elif self.callDisposition == 'hang_up':
653
            self.retailer.status='failed'
654
            self.callHistory.disposition_description = 'Hang Up'
655
        elif self.callDisposition == 'retailer_not_interested':
656
            self.retailer.status='failed'
657
            if self.callHistory.disposition_description is None:
658
                self.callHistory.disposition_description = 'NA'
659
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description        
15108 manas 660
        session.commit()
661
        return True   
662
 
15132 amit.gupta 663
    def getCode(self,):
664
        prefix = None
665
        notFound = True
666
        while notFound:
667
            code = uuid.uuid4().hex[:10] if prefix is None else prefix + uuid.uuid4().hex[:6]
668
            notFound = '0' in code and session.query(RetailerLinks).filter_by(code=code).first() is not None
669
        return code
15108 manas 670
 
15091 amit.gupta 671
    def callLater(self,):
15100 amit.gupta 672
        self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
673
        self.retailer.call_priority = None
15096 amit.gupta 674
        if self.callDisposition == 'call_later':
15100 amit.gupta 675
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 676
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 677
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
678
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
679
            else:
15102 amit.gupta 680
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 681
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 682
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
683
        else: 
684
            if self.callDisposition == 'ringing_no_answer':
685
                if self.retailer.disposition == 'ringing_no_answer':
686
                    self.retailer.retry_count += 1
687
                else:
688
                    self.retailer.disposition = 'ringing_no_answer'
689
                    self.retailer.retry_count = 1
690
            else:
691
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 692
                    pass
15112 amit.gupta 693
                else:
15119 amit.gupta 694
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 695
                self.retailer.retry_count += 1
696
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 697
 
15122 amit.gupta 698
            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 699
            if retryConfig is not None:
700
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 701
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 702
            else:
703
                self.retailer.status = 'failed'
704
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 705
 
15101 amit.gupta 706
        session.commit()
707
        return True
15096 amit.gupta 708
 
15100 amit.gupta 709
 
15091 amit.gupta 710
    def alReadyUser(self,):
15112 amit.gupta 711
        self.retailer.status = self.callDisposition
15117 amit.gupta 712
        if self.callHistory.disposition_description is None:
713
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 714
        session.commit()
715
        return True
15091 amit.gupta 716
    def verifiedLinkSent(self,):
15145 amit.gupta 717
        self.retailer.status = self.callDisposition
718
        if self.callHistory.disposition_description is None:
719
            self.callHistory.disposition_description = 'User is verified, app link sent'
15112 amit.gupta 720
 
15081 amit.gupta 721
 
722
def todict(obj, classkey=None):
723
    if isinstance(obj, dict):
724
        data = {}
725
        for (k, v) in obj.items():
726
            data[k] = todict(v, classkey)
727
        return data
728
    elif hasattr(obj, "_ast"):
729
        return todict(obj._ast())
730
    elif hasattr(obj, "__iter__"):
731
        return [todict(v, classkey) for v in obj]
732
    elif hasattr(obj, "__dict__"):
733
        data = dict([(key, todict(value, classkey)) 
734
            for key, value in obj.__dict__.iteritems() 
735
            if not callable(value) and not key.startswith('_')])
736
        if classkey is not None and hasattr(obj, "__class__"):
737
            data[classkey] = obj.__class__.__name__
738
        return data
739
    else:
740
        return obj
741
 
742
def getRetailerObj(retailer):
743
    obj = Mock()
744
    obj.title = retailer.title
745
    obj.contact1 = retailer.contact1
746
    obj.contact2 = retailer.contact2
747
    obj.address = retailer.address
748
    obj.id = retailer.id
15096 amit.gupta 749
    obj.scheduled = (retailer.call_priority is not None)
15081 amit.gupta 750
    return obj
15091 amit.gupta 751
 
15132 amit.gupta 752
def make_tiny(code):
753
    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
754
    request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
755
    filehandle = urllib2.Request(request_url)
756
    x= urllib2.urlopen(filehandle)
757
    return str(x.read())
15081 amit.gupta 758
 
15132 amit.gupta 759
 
15081 amit.gupta 760
class Mock(object):
761
    pass
762
 
763
def main():
15132 amit.gupta 764
    print make_tiny("http://www.google.com")
15081 amit.gupta 765
 
766
if __name__ == '__main__':
15091 amit.gupta 767
        main()
768