Subversion Repositories SmartDukaan

Rev

Rev 15368 | Rev 15372 | 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, \
15254 amit.gupta 8
    RetailerLinks, Activation_Codes, Agents, Agent_Roles, AgentLoginTimings, \
15368 amit.gupta 9
    FetchDataHistory, RetailerContacts, Orders, OnboardedRetailerChecklists
15358 amit.gupta 10
from dtr.storage.Mongo import get_mongo_connection
11
from dtr.storage.Mysql import fetchResult
15081 amit.gupta 12
from dtr.utils import FetchLivePrices, DealSheet as X_DealSheet, \
13
    UserSpecificDeals
15168 amit.gupta 14
from dtr.utils.utils import getLogger
15081 amit.gupta 15
from elixir import *
15254 amit.gupta 16
from operator import and_
15303 amit.gupta 17
from sqlalchemy.sql.expression import func, func, or_
15132 amit.gupta 18
from urllib import urlencode
19
import contextlib
13827 kshitij.so 20
import falcon
15081 amit.gupta 21
import json
15358 amit.gupta 22
import re
15254 amit.gupta 23
import string
15081 amit.gupta 24
import traceback
15132 amit.gupta 25
import urllib
26
import urllib2
27
import uuid
15207 amit.gupta 28
alphalist = list(string.uppercase)
29
alphalist.remove('O')
30
numList = ['1','2','3','4','5','6','7','8','9']
31
codesys = [alphalist, alphalist, numList, numList, numList]
15312 amit.gupta 32
CONTACT_PRIORITY = ['sms', 'called', 'ringing']
15368 amit.gupta 33
RETRY_MAP = {'fresh':'retry', 'followup':'fretry', 'onboarding':'oretry'}
15358 amit.gupta 34
ASSIGN_MAP = {'retry':'assigned', 'fretry':'fassigned', 'oretry':'oassigned'}
15207 amit.gupta 35
 
36
def getNextCode(codesys, code=None):
37
    if code is None:
38
        code = []
39
        for charcode in codesys:
40
            code.append(charcode[0])
41
        return string.join(code, '')
42
    carry = True
43
    code = list(code)
44
    lastindex = len(codesys) - 1
45
    while carry:
46
        listChar = codesys[lastindex]
47
        newIndex = (listChar.index(code[lastindex])+1)%len(listChar)
48
        print newIndex
49
        code[lastindex] = listChar[newIndex]
50
        if newIndex != 0:
51
            carry = False
52
        lastindex -= 1
53
        if lastindex ==-1:
54
            raise BaseException("All codes are exhausted")
55
 
56
    return string.join(code, '')
57
 
58
 
59
 
60
 
15081 amit.gupta 61
global RETAILER_DETAIL_CALL_COUNTER
62
RETAILER_DETAIL_CALL_COUNTER = 0
13572 kshitij.so 63
 
15168 amit.gupta 64
lgr = getLogger('/var/log/retailer-acquisition-api.log')
15081 amit.gupta 65
DEALER_RETRY_FACTOR = int(PythonPropertyReader.getConfig('DEALER_RETRY_FACTOR'))
13572 kshitij.so 66
class CategoryDiscountInfo(object):
67
 
68
    def on_get(self, req, resp):
69
 
13629 kshitij.so 70
        result = Mongo.getAllCategoryDiscount()
71
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
72
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 73
 
74
    def on_post(self, req, resp):
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
 
83
        result = Mongo.addCategoryDiscount(result_json)
84
        resp.body = json.dumps(result, encoding='utf-8')
13969 kshitij.so 85
 
86
    def on_put(self, req, resp, _id):
13970 kshitij.so 87
        try:
88
            result_json = json.loads(req.stream.read(), encoding='utf-8')
89
        except ValueError:
90
            raise falcon.HTTPError(falcon.HTTP_400,
91
                'Malformed JSON',
92
                'Could not decode the request body. The '
93
                'JSON was incorrect.')
94
 
95
        result = Mongo.updateCategoryDiscount(result_json, _id)
96
        resp.body = json.dumps(result, encoding='utf-8')
97
 
13966 kshitij.so 98
 
13969 kshitij.so 99
 
13572 kshitij.so 100
class SkuSchemeDetails(object):
101
 
102
    def on_get(self, req, resp):
13629 kshitij.so 103
 
14070 kshitij.so 104
        offset = req.get_param_as_int("offset")
105
        limit = req.get_param_as_int("limit")
106
 
107
        result = Mongo.getAllSkuWiseSchemeDetails(offset, limit)
13629 kshitij.so 108
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
109
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 110
 
111
 
112
    def on_post(self, req, resp):
113
 
14552 kshitij.so 114
        multi = req.get_param_as_int("multi")
115
 
13572 kshitij.so 116
        try:
117
            result_json = json.loads(req.stream.read(), encoding='utf-8')
118
        except ValueError:
119
            raise falcon.HTTPError(falcon.HTTP_400,
120
                'Malformed JSON',
121
                'Could not decode the request body. The '
122
                'JSON was incorrect.')
123
 
14552 kshitij.so 124
        result = Mongo.addSchemeDetailsForSku(result_json, multi)
13572 kshitij.so 125
        resp.body = json.dumps(result, encoding='utf-8')
126
 
127
class SkuDiscountInfo():
128
 
129
    def on_get(self, req, resp):
13629 kshitij.so 130
 
13970 kshitij.so 131
        offset = req.get_param_as_int("offset")
132
        limit = req.get_param_as_int("limit")
133
        result = Mongo.getallSkuDiscountInfo(offset,limit)
13629 kshitij.so 134
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
135
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 136
 
137
 
138
    def on_post(self, req, resp):
139
 
14552 kshitij.so 140
        multi = req.get_param_as_int("multi")
141
 
13572 kshitij.so 142
        try:
143
            result_json = json.loads(req.stream.read(), encoding='utf-8')
144
        except ValueError:
145
            raise falcon.HTTPError(falcon.HTTP_400,
146
                'Malformed JSON',
147
                'Could not decode the request body. The '
148
                'JSON was incorrect.')
149
 
14552 kshitij.so 150
        result = Mongo.addSkuDiscountInfo(result_json, multi)
13572 kshitij.so 151
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 152
 
153
    def on_put(self, req, resp, _id):
154
        try:
155
            result_json = json.loads(req.stream.read(), encoding='utf-8')
156
        except ValueError:
157
            raise falcon.HTTPError(falcon.HTTP_400,
158
                'Malformed JSON',
159
                'Could not decode the request body. The '
160
                'JSON was incorrect.')
161
 
162
        result = Mongo.updateSkuDiscount(result_json, _id)
163
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 164
 
165
class ExceptionalNlc():
166
 
167
    def on_get(self, req, resp):
13629 kshitij.so 168
 
13970 kshitij.so 169
        offset = req.get_param_as_int("offset")
170
        limit = req.get_param_as_int("limit")
171
 
172
        result = Mongo.getAllExceptionlNlcItems(offset, limit)
13629 kshitij.so 173
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
174
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 175
 
176
    def on_post(self, req, resp):
177
 
14552 kshitij.so 178
        multi = req.get_param_as_int("multi")
179
 
13572 kshitij.so 180
        try:
181
            result_json = json.loads(req.stream.read(), encoding='utf-8')
182
        except ValueError:
183
            raise falcon.HTTPError(falcon.HTTP_400,
184
                'Malformed JSON',
185
                'Could not decode the request body. The '
186
                'JSON was incorrect.')
187
 
14552 kshitij.so 188
        result = Mongo.addExceptionalNlc(result_json, multi)
13572 kshitij.so 189
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 190
 
191
    def on_put(self, req, resp, _id):
192
        try:
193
            result_json = json.loads(req.stream.read(), encoding='utf-8')
194
        except ValueError:
195
            raise falcon.HTTPError(falcon.HTTP_400,
196
                'Malformed JSON',
197
                'Could not decode the request body. The '
198
                'JSON was incorrect.')
199
 
200
        result = Mongo.updateExceptionalNlc(result_json, _id)
201
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 202
 
13772 kshitij.so 203
class Deals():
13779 kshitij.so 204
    def on_get(self,req, resp, userId):
205
        categoryId = req.get_param_as_int("categoryId")
206
        offset = req.get_param_as_int("offset")
207
        limit = req.get_param_as_int("limit")
13798 kshitij.so 208
        sort = req.get_param("sort")
13802 kshitij.so 209
        direction = req.get_param_as_int("direction")
14853 kshitij.so 210
        filterData = req.get_param('filterData')
211
        result = Mongo.getNewDeals(int(userId), categoryId, offset, limit, sort, direction, filterData)
13772 kshitij.so 212
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 213
        resp.body = json.dumps(json_docs, encoding='utf-8')
13790 kshitij.so 214
 
215
class MasterData():
216
    def on_get(self,req, resp, skuId):
217
        result = Mongo.getItem(skuId)
13798 kshitij.so 218
        try:
219
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 220
            resp.body = json.dumps(json_docs, encoding='utf-8')
13798 kshitij.so 221
        except:
222
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 223
            resp.body = json.dumps(json_docs, encoding='utf-8')
13790 kshitij.so 224
 
14586 kshitij.so 225
    def on_post(self,req, resp):
226
 
227
        addNew = req.get_param_as_int("addNew")
228
        update = req.get_param_as_int("update")
229
        addToExisting = req.get_param_as_int("addToExisting")
230
        multi = req.get_param_as_int("multi")
231
 
14589 kshitij.so 232
        try:
14592 kshitij.so 233
            result_json = json.loads(req.stream.read(), encoding='utf-8')
234
        except ValueError:
235
            raise falcon.HTTPError(falcon.HTTP_400,
236
                'Malformed JSON',
237
                'Could not decode the request body. The '
238
                'JSON was incorrect.')
239
 
240
        if addNew == 1:
241
            result = Mongo.addNewItem(result_json)
242
        elif update == 1:
243
            result = Mongo.updateMaster(result_json, multi)
244
        elif addToExisting == 1:
245
            result = Mongo.addItemToExistingBundle(result_json)
246
        else:
247
            raise
248
        resp.body = dumps(result)
14586 kshitij.so 249
 
13827 kshitij.so 250
class LiveData():
251
    def on_get(self,req, resp):
13865 kshitij.so 252
        if req.get_param_as_int("id") is not None:
253
            print "****getting only for id"
254
            id = req.get_param_as_int("id")
255
            try:
256
                result = FetchLivePrices.getLatestPriceById(id)
13867 kshitij.so 257
                json_docs = json.dumps(result, default=json_util.default)
13966 kshitij.so 258
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 259
            except:
260
                json_docs = json.dumps({}, default=json_util.default)
13966 kshitij.so 261
                resp.body = json.dumps(json_docs, encoding='utf-8')
13834 kshitij.so 262
 
13865 kshitij.so 263
        else:
264
            print "****getting only for skuId"
265
            skuBundleId = req.get_param_as_int("skuBundleId")
266
            source_id = req.get_param_as_int("source_id")
267
            try:
268
                result = FetchLivePrices.getLatestPrice(skuBundleId, source_id)
269
                json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 270
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 271
            except:
272
                json_docs = [json.dumps(doc, default=json_util.default) for doc in [{}]]
13966 kshitij.so 273
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 274
 
13834 kshitij.so 275
class CashBack():
276
    def on_get(self,req, resp):
277
        identifier = req.get_param("identifier")
278
        source_id = req.get_param_as_int("source_id")
279
        try:
13838 kshitij.so 280
            result = Mongo.getCashBackDetails(identifier, source_id)
13837 kshitij.so 281
            json_docs = json.dumps(result, default=json_util.default)
13964 kshitij.so 282
            resp.body = json_docs
13834 kshitij.so 283
        except:
13837 kshitij.so 284
            json_docs = json.dumps({}, default=json_util.default)
13963 kshitij.so 285
            resp.body = json_docs
13892 kshitij.so 286
 
14398 amit.gupta 287
class ImgSrc():
288
    def on_get(self,req, resp):
289
        identifier = req.get_param("identifier")
290
        source_id = req.get_param_as_int("source_id")
291
        try:
292
            result = Mongo.getImgSrc(identifier, source_id)
293
            json_docs = json.dumps(result, default=json_util.default)
294
            resp.body = json_docs
295
        except:
296
            json_docs = json.dumps({}, default=json_util.default)
297
            resp.body = json_docs
298
 
13892 kshitij.so 299
class DealSheet():
300
    def on_get(self,req, resp):
13895 kshitij.so 301
        X_DealSheet.sendMail()
13897 kshitij.so 302
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
13966 kshitij.so 303
        resp.body = json.dumps(json_docs, encoding='utf-8')
13892 kshitij.so 304
 
13970 kshitij.so 305
class DealerPrice():
306
 
307
    def on_get(self, req, resp):
308
 
309
        offset = req.get_param_as_int("offset")
310
        limit = req.get_param_as_int("limit")
311
        result = Mongo.getAllDealerPrices(offset,limit)
312
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
313
        resp.body = json.dumps(json_docs, encoding='utf-8')
314
 
315
    def on_post(self, req, resp):
316
 
14552 kshitij.so 317
        multi = req.get_param_as_int("multi")
318
 
13970 kshitij.so 319
        try:
320
            result_json = json.loads(req.stream.read(), encoding='utf-8')
321
        except ValueError:
322
            raise falcon.HTTPError(falcon.HTTP_400,
323
                'Malformed JSON',
324
                'Could not decode the request body. The '
325
                'JSON was incorrect.')
326
 
14552 kshitij.so 327
        result = Mongo.addSkuDealerPrice(result_json, multi)
13970 kshitij.so 328
        resp.body = json.dumps(result, encoding='utf-8')
329
 
330
    def on_put(self, req, resp, _id):
331
        try:
332
            result_json = json.loads(req.stream.read(), encoding='utf-8')
333
        except ValueError:
334
            raise falcon.HTTPError(falcon.HTTP_400,
335
                'Malformed JSON',
336
                'Could not decode the request body. The '
337
                'JSON was incorrect.')
338
 
339
        result = Mongo.updateSkuDealerPrice(result_json, _id)
340
        resp.body = json.dumps(result, encoding='utf-8')
341
 
342
 
14041 kshitij.so 343
class ResetCache():
344
 
345
    def on_get(self,req, resp, userId):
14044 kshitij.so 346
        result = Mongo.resetCache(userId)
14046 kshitij.so 347
        resp.body = json.dumps(result, encoding='utf-8')
348
 
349
class UserDeals():
350
    def on_get(self,req,resp,userId):
351
        UserSpecificDeals.generateSheet(userId)
352
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
353
        resp.body = json.dumps(json_docs, encoding='utf-8')
14075 kshitij.so 354
 
355
class CommonUpdate():
356
 
357
    def on_post(self,req,resp):
14575 kshitij.so 358
 
359
        multi = req.get_param_as_int("multi")
360
 
14075 kshitij.so 361
        try:
362
            result_json = json.loads(req.stream.read(), encoding='utf-8')
363
        except ValueError:
364
            raise falcon.HTTPError(falcon.HTTP_400,
365
                'Malformed JSON',
366
                'Could not decode the request body. The '
367
                'JSON was incorrect.')
368
 
14575 kshitij.so 369
        result = Mongo.updateCollection(result_json, multi)
14075 kshitij.so 370
        resp.body = json.dumps(result, encoding='utf-8')
14106 kshitij.so 371
        resp.content_type = "application/json; charset=utf-8"
14481 kshitij.so 372
 
373
class NegativeDeals():
374
 
375
    def on_get(self, req, resp):
376
 
377
        offset = req.get_param_as_int("offset")
378
        limit = req.get_param_as_int("limit")
379
 
380
        result = Mongo.getAllNegativeDeals(offset, limit)
14483 kshitij.so 381
        resp.body = dumps(result) 
14481 kshitij.so 382
 
383
 
384
    def on_post(self, req, resp):
385
 
14552 kshitij.so 386
        multi = req.get_param_as_int("multi")
387
 
14481 kshitij.so 388
        try:
389
            result_json = json.loads(req.stream.read(), encoding='utf-8')
390
        except ValueError:
391
            raise falcon.HTTPError(falcon.HTTP_400,
392
                'Malformed JSON',
393
                'Could not decode the request body. The '
394
                'JSON was incorrect.')
395
 
14552 kshitij.so 396
        result = Mongo.addNegativeDeals(result_json, multi)
14481 kshitij.so 397
        resp.body = json.dumps(result, encoding='utf-8')
398
 
399
class ManualDeals():
400
 
401
    def on_get(self, req, resp):
402
 
403
        offset = req.get_param_as_int("offset")
404
        limit = req.get_param_as_int("limit")
405
 
406
        result = Mongo.getAllManualDeals(offset, limit)
14483 kshitij.so 407
        resp.body = dumps(result)
14481 kshitij.so 408
 
409
 
410
    def on_post(self, req, resp):
411
 
14552 kshitij.so 412
        multi = req.get_param_as_int("multi")
413
 
14481 kshitij.so 414
        try:
415
            result_json = json.loads(req.stream.read(), encoding='utf-8')
416
        except ValueError:
417
            raise falcon.HTTPError(falcon.HTTP_400,
418
                'Malformed JSON',
419
                'Could not decode the request body. The '
420
                'JSON was incorrect.')
421
 
14552 kshitij.so 422
        result = Mongo.addManualDeal(result_json, multi)
14481 kshitij.so 423
        resp.body = json.dumps(result, encoding='utf-8')
424
 
425
class CommonDelete():
14482 kshitij.so 426
 
14481 kshitij.so 427
    def on_post(self,req,resp):
428
        try:
429
            result_json = json.loads(req.stream.read(), encoding='utf-8')
430
        except ValueError:
431
            raise falcon.HTTPError(falcon.HTTP_400,
432
                'Malformed JSON',
433
                'Could not decode the request body. The '
434
                'JSON was incorrect.')
435
 
436
        result = Mongo.deleteDocument(result_json)
437
        resp.body = json.dumps(result, encoding='utf-8')
438
        resp.content_type = "application/json; charset=utf-8"
14482 kshitij.so 439
 
440
class SearchProduct():
441
 
442
    def on_get(self,req,resp):
443
        offset = req.get_param_as_int("offset")
444
        limit = req.get_param_as_int("limit")
445
        search_term = req.get_param("search")
446
 
447
        result = Mongo.searchMaster(offset, limit, search_term)
14483 kshitij.so 448
        resp.body = dumps(result) 
14482 kshitij.so 449
 
450
 
14495 kshitij.so 451
class FeaturedDeals():
14482 kshitij.so 452
 
14495 kshitij.so 453
    def on_get(self, req, resp):
454
 
455
        offset = req.get_param_as_int("offset")
456
        limit = req.get_param_as_int("limit")
457
 
458
        result = Mongo.getAllFeaturedDeals(offset, limit)
459
        resp.body = dumps(result)
460
 
461
 
462
    def on_post(self, req, resp):
463
 
14552 kshitij.so 464
        multi = req.get_param_as_int("multi")
465
 
14495 kshitij.so 466
        try:
467
            result_json = json.loads(req.stream.read(), encoding='utf-8')
468
        except ValueError:
469
            raise falcon.HTTPError(falcon.HTTP_400,
470
                'Malformed JSON',
471
                'Could not decode the request body. The '
472
                'JSON was incorrect.')
473
 
14552 kshitij.so 474
        result = Mongo.addFeaturedDeal(result_json, multi)
14495 kshitij.so 475
        resp.body = json.dumps(result, encoding='utf-8')
476
 
14497 kshitij.so 477
 
478
class CommonSearch():
14495 kshitij.so 479
 
14497 kshitij.so 480
    def on_get(self,req,resp):
481
        class_name = req.get_param("class")
482
        sku = req.get_param_as_int("sku")
483
        skuBundleId = req.get_param_as_int("skuBundleId")
14499 kshitij.so 484
 
485
        result = Mongo.searchCollection(class_name, sku, skuBundleId)
14497 kshitij.so 486
        resp.body = dumps(result)
14619 kshitij.so 487
 
488
class CricScore():
489
 
490
    def on_get(self,req,resp):
491
 
492
        result = Mongo.getLiveCricScore()
14853 kshitij.so 493
        resp.body = dumps(result)
494
 
495
class Notification():
496
 
497
    def on_post(self, req, resp):
498
 
499
        try:
500
            result_json = json.loads(req.stream.read(), encoding='utf-8')
501
        except ValueError:
502
            raise falcon.HTTPError(falcon.HTTP_400,
503
                'Malformed JSON',
504
                'Could not decode the request body. The '
505
                'JSON was incorrect.')
506
 
507
        result = Mongo.addBundleToNotification(result_json)
508
        resp.body = json.dumps(result, encoding='utf-8')
509
 
510
    def on_get(self, req, resp):
511
 
512
        offset = req.get_param_as_int("offset")
513
        limit = req.get_param_as_int("limit")
514
 
515
        result = Mongo.getAllNotifications(offset, limit)
516
        resp.body = dumps(result)
517
 
14998 kshitij.so 518
class DealBrands():
14853 kshitij.so 519
 
14998 kshitij.so 520
    def on_get(self, req, resp):
521
 
522
        category_id = req.get_param_as_int("category_id")
523
        result = Mongo.getBrandsForFilter(category_id)
14999 kshitij.so 524
        resp.body = dumps(result)
15161 kshitij.so 525
 
526
class DealRank():
14998 kshitij.so 527
 
15161 kshitij.so 528
    def on_get(self, req, resp):
529
        identifier = req.get_param("identifier")
530
        source_id = req.get_param_as_int("source_id")
531
        user_id = req.get_param_as_int("user_id")
532
        result = Mongo.getDealRank(identifier, source_id, user_id)
533
        json_docs = json.dumps(result, default=json_util.default)
534
        resp.body = json_docs
535
 
536
 
15081 amit.gupta 537
 
538
class RetailerDetail():
539
    global RETAILER_DETAIL_CALL_COUNTER
15105 amit.gupta 540
    def getRetryRetailer(self,failback=True):
15358 amit.gupta 541
        status = RETRY_MAP.get(self.callType)
15239 amit.gupta 542
        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()
543
        if retailer is not None:
544
            lgr.info( "getRetryRetailer " + str(retailer.id))
545
        else:
546
            if failback:
547
                retailer = self.getNewRetailer(False)
548
                return retailer
15358 amit.gupta 549
        retailer.status = ASSIGN_MAP.get(status)
15239 amit.gupta 550
        lgr.info( "getRetryRetailer " + str(retailer.id))
15081 amit.gupta 551
        return retailer
552
 
553
    def getNewRetailer(self,failback=True):
554
        retry = True
555
        retailer = None 
556
        try:
557
            while(retry):
15168 amit.gupta 558
                lgr.info( "Calltype " + self.callType)
15081 amit.gupta 559
                status=self.callType
560
                query = session.query(Retailers).filter(Retailers.status==status)
561
                if status=='fresh':
15172 amit.gupta 562
                    query = query.filter_by(is_or=False, is_std=False).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None)).order_by(Retailers.is_elavated.desc(), -Retailers.agent_id)
15358 amit.gupta 563
                elif status=='followup':
564
                    query = query.filter(Retailers.next_call_time<=datetime.now()).order_by(Retailers.next_call_time)
15162 amit.gupta 565
                else:
15358 amit.gupta 566
                    query = query.filter(Retailers.modified<=datetime.now()).order_by(Retailers.modified)
567
 
15081 amit.gupta 568
                retailer = query.with_lockmode("update").first()
569
                if retailer is not None:
15168 amit.gupta 570
                    lgr.info( "retailer " +str(retailer.id))
15081 amit.gupta 571
                    if status=="fresh":
572
                        userquery = session.query(Users)
573
                        if retailer.contact2 is not None:
574
                            userquery = userquery.filter(Users.mobile_number.in_([retailer.contact1,retailer.contact2]))
575
                        else:
576
                            userquery = userquery.filter_by(mobile_number=retailer.contact1)
577
                        user = userquery.first()
578
                        if user is not None:
579
                            retailer.status = 'alreadyuser'
15168 amit.gupta 580
                            lgr.info( "retailer.status " + retailer.status)
15081 amit.gupta 581
                            session.commit()
582
                            continue
583
                        retailer.status = 'assigned'
15358 amit.gupta 584
                    elif status=='followup':
15276 amit.gupta 585
                        if isActivated(retailer.id):
586
                            print "Retailer Already %d activated and marked onboarded"%(retailer.id)
587
                            continue
15081 amit.gupta 588
                        retailer.status = 'fassigned'
15358 amit.gupta 589
                    else:
590
                        retailer.status = 'oassigned'
15081 amit.gupta 591
                    retailer.retry_count = 0
15123 amit.gupta 592
                    retailer.invalid_retry_count = 0
15168 amit.gupta 593
                    lgr.info( "Found Retailer " +  str(retailer.id) + " with status " + status + " assigned to " + str(self.agentId))
15081 amit.gupta 594
 
595
                else:
15168 amit.gupta 596
                    lgr.info( "No fresh/followup retailers found")
15081 amit.gupta 597
                    if failback:
598
                        retailer = self.getRetryRetailer(False)
15104 amit.gupta 599
                        return retailer
15148 amit.gupta 600
                retry=False
15081 amit.gupta 601
        except:
602
            print traceback.print_exc()
603
        return retailer
604
 
15132 amit.gupta 605
    def on_get(self, req, resp, agentId, callType=None, retailerId=None):
15081 amit.gupta 606
        global RETAILER_DETAIL_CALL_COUNTER
607
        RETAILER_DETAIL_CALL_COUNTER += 1
15168 amit.gupta 608
        lgr.info( "RETAILER_DETAIL_CALL_COUNTER " +  str(RETAILER_DETAIL_CALL_COUNTER))
15081 amit.gupta 609
        self.agentId = int(agentId)
610
        self.callType = callType
15139 amit.gupta 611
        if retailerId is not None:
612
            self.retailerId = int(retailerId)
15208 amit.gupta 613
            retailerLink = session.query(RetailerLinks).filter_by(retailer_id=self.retailerId).first()
15132 amit.gupta 614
            if retailerLink is not None:
615
                code = retailerLink.code
616
            else: 
617
                code = self.getCode()
618
                retailerLink = RetailerLinks()
619
                retailerLink.code = code
15139 amit.gupta 620
                retailerLink.agent_id = self.agentId
621
                retailerLink.retailer_id = self.retailerId
15135 amit.gupta 622
 
623
                activationCode=Activation_Codes()
624
                activationCode.code = code
15132 amit.gupta 625
                session.commit()
626
            session.close()
15142 amit.gupta 627
            resp.body =  json.dumps({"result":{"code":code,"link":make_tiny(code)}}, encoding='utf-8')
15132 amit.gupta 628
            return 
15081 amit.gupta 629
        retryFlag = False 
630
        if RETAILER_DETAIL_CALL_COUNTER % DEALER_RETRY_FACTOR ==0:
631
            retryFlag=True
15239 amit.gupta 632
        try:
633
            if retryFlag:
634
                retailer = self.getRetryRetailer()
635
            else:
636
                retailer = self.getNewRetailer()
15343 amit.gupta 637
            if retailer is None:
638
                resp.body = "{}"
639
                return
15239 amit.gupta 640
            fetchInfo = FetchDataHistory()
641
            fetchInfo.agent_id = self.agentId
642
            fetchInfo.call_type = self.callType
15240 amit.gupta 643
            agent = session.query(Agents).filter_by(id=self.agentId).first()
15239 amit.gupta 644
            last_disposition = session.query(CallHistory).filter_by(agent_id=self.agentId).order_by(CallHistory.id.desc()).first()
645
            if last_disposition is None or last_disposition.created < agent.last_login:
646
                fetchInfo.last_action = 'login'
647
                fetchInfo.last_action_time = agent.last_login 
648
            else:
649
                fetchInfo.last_action = 'disposition'
650
                fetchInfo.last_action_time = last_disposition.created
651
            fetchInfo.retailer_id = retailer.id
652
            session.commit()
15241 amit.gupta 653
 
15358 amit.gupta 654
            otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
655
            resp.body = json.dumps(todict(getRetailerObj(retailer, otherContacts, self.callType)), encoding='utf-8')
15241 amit.gupta 656
 
657
            return
658
 
15239 amit.gupta 659
        finally:
660
            session.close()
15241 amit.gupta 661
 
15081 amit.gupta 662
        if retailer is None:
15157 amit.gupta 663
            resp.body = "{}"
15081 amit.gupta 664
        else:
15358 amit.gupta 665
            print "It should never come here"
15081 amit.gupta 666
            resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
667
 
15241 amit.gupta 668
 
15081 amit.gupta 669
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 670
        returned = False
15081 amit.gupta 671
        self.agentId = int(agentId)
672
        self.callType = callType
673
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15169 amit.gupta 674
        lgr.info( "Request ----\n"  + str(jsonReq))
15091 amit.gupta 675
        self.jsonReq = jsonReq
676
        invalidNumber = self.invalidNumber
677
        callLater = self.callLater
15096 amit.gupta 678
        alreadyUser = self.alReadyUser
15091 amit.gupta 679
        verifiedLinkSent = self.verifiedLinkSent
15368 amit.gupta 680
        onboarded = self.onboarded
15278 amit.gupta 681
        self.address = jsonReq.get('address')
15096 amit.gupta 682
        self.retailerId = int(jsonReq.get('retailerid'))
15254 amit.gupta 683
        self.smsNumber = jsonReq.get('smsnumber') 
15112 amit.gupta 684
        try:
685
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
15281 amit.gupta 686
            if self.address:
15278 amit.gupta 687
                self.retailer.address_new = self.address
15112 amit.gupta 688
            self.callDisposition = jsonReq.get('calldispositiontype')
689
            self.callHistory = CallHistory()
690
            self.callHistory.agent_id=self.agentId
691
            self.callHistory.call_disposition = self.callDisposition
692
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 693
            self.callHistory.call_type=self.callType
15112 amit.gupta 694
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
695
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
15200 manas 696
            self.callHistory.disposition_comments = jsonReq.get('calldispositioncomments')
697
            lgr.info(self.callHistory.disposition_comments)
15112 amit.gupta 698
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
699
            self.callHistory.mobile_number = jsonReq.get('number')
15145 amit.gupta 700
            self.callHistory.sms_verified = int(jsonReq.get("verified"))
15234 amit.gupta 701
            lastFetchData = session.query(FetchDataHistory).filter_by(agent_id=self.agentId).order_by(FetchDataHistory.id.desc()).first()
15368 amit.gupta 702
            if self.callDisposition == 'onboarded':
703
                self.checkList = jsonReq.get('checklist')
704
 
15234 amit.gupta 705
            if lastFetchData is None:
706
                raise
707
            self.callHistory.last_fetch_time= lastFetchData.created  
15112 amit.gupta 708
 
709
            dispositionMap = {  'call_later':callLater,
710
                        'ringing_no_answer':callLater,
711
                        'not_reachable':callLater,
712
                        'switch_off':callLater,
15202 manas 713
                        'not_retailer':invalidNumber,
15112 amit.gupta 714
                        'invalid_no':invalidNumber,
715
                        'wrong_no':invalidNumber,
716
                        'hang_up':invalidNumber,
717
                        'retailer_not_interested':invalidNumber,
15200 manas 718
                        'recharge_retailer':invalidNumber,
719
                        'accessory_retailer':invalidNumber,
720
                        'service_center_retailer':invalidNumber,
15112 amit.gupta 721
                        'alreadyuser':alreadyUser,
15368 amit.gupta 722
                        'verified_link_sent':verifiedLinkSent,
723
                        'onboarded':onboarded
15112 amit.gupta 724
                      }
725
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
726
        finally:
727
            session.close()
15096 amit.gupta 728
 
15112 amit.gupta 729
        if returned:
730
            resp.body = "{\"result\":\"success\"}"
731
        else:
732
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 733
 
15091 amit.gupta 734
    def invalidNumber(self,):
15108 manas 735
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
736
        if self.callDisposition == 'invalid_no':
737
            self.retailer.status='failed'
738
            self.callHistory.disposition_description = 'Invalid Number'
739
        elif self.callDisposition == 'wrong_no':
15111 manas 740
            self.retailer.status='failed'
741
            self.callHistory.disposition_description = 'Wrong Number'
742
        elif self.callDisposition == 'hang_up':
743
            self.retailer.status='failed'
744
            self.callHistory.disposition_description = 'Hang Up'
745
        elif self.callDisposition == 'retailer_not_interested':
746
            self.retailer.status='failed'
747
            if self.callHistory.disposition_description is None:
748
                self.callHistory.disposition_description = 'NA'
15200 manas 749
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description
750
        elif self.callDisposition == 'recharge_retailer':
751
            self.retailer.status='failed'
752
            self.callHistory.disposition_description = 'Recharge related. Not a retailer '
753
        elif self.callDisposition == 'accessory_retailer':
754
            self.retailer.status='failed'
755
            self.callHistory.disposition_description = 'Accessory related. Not a retailer'
756
        elif self.callDisposition == 'service_center_retailer':
757
            self.retailer.status='failed'
758
            self.callHistory.disposition_description = 'Service Center related. Not a retailer'
15202 manas 759
        elif self.callDisposition == 'not_retailer':
760
            self.retailer.status='failed'
761
            self.callHistory.disposition_description = 'Not a retailer'    
15108 manas 762
        session.commit()
763
        return True   
764
 
15132 amit.gupta 765
    def getCode(self,):
15207 amit.gupta 766
        newCode = None
767
        lastLink = session.query(RetailerLinks).order_by(RetailerLinks.id.desc()).with_lockmode("update").first()
768
        if lastLink is not None:
769
            if len(lastLink.code)==len(codesys):
770
                newCode=lastLink.code
771
        return getNextCode(codesys, newCode)
15108 manas 772
 
15254 amit.gupta 773
 
15091 amit.gupta 774
    def callLater(self,):
15368 amit.gupta 775
        self.retailer.status = RETRY_MAP.get(self.callType)
15100 amit.gupta 776
        self.retailer.call_priority = None
15096 amit.gupta 777
        if self.callDisposition == 'call_later':
15100 amit.gupta 778
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 779
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 780
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
781
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
782
            else:
15102 amit.gupta 783
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 784
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 785
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
786
        else: 
787
            if self.callDisposition == 'ringing_no_answer':
788
                if self.retailer.disposition == 'ringing_no_answer':
789
                    self.retailer.retry_count += 1
790
                else:
791
                    self.retailer.disposition = 'ringing_no_answer'
792
                    self.retailer.retry_count = 1
793
            else:
794
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 795
                    pass
15112 amit.gupta 796
                else:
15119 amit.gupta 797
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 798
                self.retailer.retry_count += 1
799
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 800
 
15122 amit.gupta 801
            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 802
            if retryConfig is not None:
803
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 804
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 805
            else:
806
                self.retailer.status = 'failed'
807
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 808
 
15101 amit.gupta 809
        session.commit()
810
        return True
15096 amit.gupta 811
 
15100 amit.gupta 812
 
15091 amit.gupta 813
    def alReadyUser(self,):
15112 amit.gupta 814
        self.retailer.status = self.callDisposition
15117 amit.gupta 815
        if self.callHistory.disposition_description is None:
816
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 817
        session.commit()
818
        return True
15091 amit.gupta 819
    def verifiedLinkSent(self,):
15147 amit.gupta 820
        if self.callType == 'fresh':
821
            self.retailer.status = 'followup'
822
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
823
            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') 
824
        else:
15224 amit.gupta 825
            self.retailer.status = 'followup'
15147 amit.gupta 826
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=7)
15254 amit.gupta 827
            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')
15328 amit.gupta 828
        addContactToRetailer(self.agentId, self.retailerId, self.smsNumber, self.callType, 'sms')     
15146 amit.gupta 829
        session.commit()
830
        return True
15368 amit.gupta 831
    def onboarded(self,):
832
        self.retailer.status = self.callDisposition
833
        checkList = OnboardedRetailerChecklists()
834
        checkList.contact_us = self.checkList.get('contactus')
835
        checkList.doa_return_policy = self.checkList.get('daoreturnpolicy')
836
        checkList.number_verification = self.checkList.get('numberverification')
837
        checkList.payment_option = self.checkList.get('paymentoption')
838
        checkList.preferences = self.checkList.get('preferences')
839
        checkList.product_info = self.checkList.get('productinfo')
840
        checkList.retailer_id = self.retailerId
841
        session.commit()
842
        return True
843
 
844
 
15254 amit.gupta 845
def isActivated(retailerId):
15276 amit.gupta 846
    retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailerId).first()
847
    user = session.query(Users).filter_by(referrer=retailerLink.code).first()
848
    if user is None:
849
        mobileNumbers = list(session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailerId).all())
850
        user = session.query(Users).filter(Users.mobile_number.in_(mobileNumbers)).first()
15254 amit.gupta 851
        if user is None:
15332 amit.gupta 852
            if retailerLink.created < datetime(2015,5,26):
15333 amit.gupta 853
                historyNumbers = [number for number, in session.query(CallHistory.mobile_number).filter_by(retailer_id = retailerId).all()]
15332 amit.gupta 854
                user = session.query(Users).filter(Users.mobile_number.in_(historyNumbers)).first()
855
                if user is None:
856
                    return False
15334 amit.gupta 857
                else:
858
                    mapped_with = 'contact'
15332 amit.gupta 859
            else:
860
                return False
15276 amit.gupta 861
        else:
862
            mapped_with = 'contact'
863
    else:
864
        mapped_with = 'code'
865
    retailerLink.mapped_with = mapped_with
866
    retailerLink.user_id = user.id
15291 amit.gupta 867
    retailer = session.query(Retailers).filter_by(id=retailerId).first()
15358 amit.gupta 868
    retailer.status = 'onboarding'
15276 amit.gupta 869
    session.commit()
15287 amit.gupta 870
    print "retailerLink.retailer_id", retailerLink.retailer_id
15276 amit.gupta 871
    session.close()
872
    return True
15254 amit.gupta 873
 
874
class AddContactToRetailer():
875
    def on_post(self,req,resp, agentId):
876
        agentId = int(agentId)
877
        try:
878
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
879
            retailerId = int(jsonReq.get("retailerid"))
880
            mobile = jsonReq.get("mobile")
881
            callType = jsonReq.get("calltype")
882
            contactType = jsonReq.get("contacttype")
883
            addContactToRetailer(agentId, retailerId, mobile, callType, contactType)
884
            session.commit()
885
        finally:
886
            session.close()
887
 
888
def addContactToRetailer(agentId, retailerId, mobile, callType, contactType):
15312 amit.gupta 889
    retailerContact = session.query(RetailerContacts).filter_by(retailer_id=retailerId).filter_by(mobile_number=mobile).first()
890
    if retailerContact is None:
15254 amit.gupta 891
        retailerContact = RetailerContacts()
15256 amit.gupta 892
        retailerContact.retailer_id = retailerId
15254 amit.gupta 893
        retailerContact.agent_id = agentId
894
        retailerContact.call_type = callType
895
        retailerContact.contact_type = contactType
896
        retailerContact.mobile_number = mobile
15312 amit.gupta 897
    else:
15327 amit.gupta 898
        if CONTACT_PRIORITY.index(retailerContact.contact_type) > CONTACT_PRIORITY.index(contactType):
15358 amit.gupta 899
            retailerContact.contact_type = contactType
15312 amit.gupta 900
 
15254 amit.gupta 901
 
15312 amit.gupta 902
 
15189 manas 903
class Login():
904
 
905
    def on_get(self, req, resp, agentId, role):
906
        try:
15198 manas 907
            self.agentId = int(agentId)
908
            self.role = role
909
            print str(self.agentId) + self.role;
15199 manas 910
            agents=AgentLoginTimings()
911
            lastLoginTime = session.query(Agents).filter(Agents.id==self.agentId).first()
912
            print 'lastLogintime' + str(lastLoginTime)
913
            agents.loginTime=lastLoginTime.last_login
914
            agents.logoutTime=datetime.now()
915
            agents.role =self.role
15282 amit.gupta 916
            agents.agent_id = self.agentId
15199 manas 917
            session.add(agents)    
918
            session.commit()
919
            resp.body =  json.dumps({"result":{"success":"true","message":"Success"}}, encoding='utf-8')
15189 manas 920
        finally:
921
            session.close()        
15112 amit.gupta 922
 
15189 manas 923
    def on_post(self,req,resp):
924
        try:
925
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
926
            lgr.info( "Request ----\n"  + str(jsonReq))
927
            email=jsonReq.get('email')
928
            password = jsonReq.get('password')
929
            role=jsonReq.get('role')    
930
            checkUser = session.query(Agents.id).filter(and_(Agents.email==email,Agents.password==password)).first()
931
            if checkUser is None:
932
                print checkUser
933
                resp.body =  json.dumps({"result":{"success":"false","message":"Invalid User"}}, encoding='utf-8')
934
            else:
935
                print checkUser[0]
936
                checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==checkUser[0],Agent_Roles.role==role)).first()
937
                if checkRole is None:
938
                    resp.body =  json.dumps({"result":{"success":"false","message":"Invalid Role"}}, encoding='utf-8')
939
                else:
15196 manas 940
                    session.query(Agents).filter_by(id = checkUser[0]).update({"last_login":datetime.now()})
15195 manas 941
                    resp.body =  json.dumps({"result":{"success":"true","message":"Valid User","id":checkUser[0]}}, encoding='utf-8')
942
                    #session.query(Agents).filter_by(id = checkUser[0]).    
15189 manas 943
                    session.commit()
944
        finally:
945
            session.close()    
946
 
15195 manas 947
    def test(self,email,password,role):
15189 manas 948
        checkUser = session.query(Agents.id).filter(and_(Agents.email==email,Agents.password==password)).first()
949
        if checkUser is None:
950
            print checkUser
15195 manas 951
 
15189 manas 952
        else:
953
            print checkUser[0]
954
            checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==checkUser[0],Agent_Roles.role==role)).first()
955
            if checkRole is None:
15195 manas 956
                pass
15189 manas 957
            else:
15195 manas 958
                agents=AgentLoginTimings()
959
                agents.loginTime=datetime.now()
960
                agents.logoutTime=datetime.now()
961
                agents.role =role
962
                agents.agent_id = 2
963
                #session.query(AgentLoginTimings).filter_by(id = checkUser[0]).update({"last_login":datetime.now()}, synchronize_session=False)
964
                session.add(agents)    
965
                session.commit()
966
                session.close()
967
 
968
                #session.query(Agents).filter(Agents.id==checkUser[0]).update({"last_login":Agents.last_login})
15275 amit.gupta 969
 
970
class RetailerActivation():
971
    def on_get(self, req, resp, userId):
15351 amit.gupta 972
        res =  markDealerActivation(int(userId))
973
        if res:
974
            resp.body = "{\"activated\":true}"
975
        else:
976
            resp.body = "{\"activated\":false}"
977
 
15275 amit.gupta 978
 
979
def markDealerActivation(userId):
980
    try:
15343 amit.gupta 981
        user = session.query(Users).filter_by(id=userId).first()
15275 amit.gupta 982
        result = False                
983
        mappedWith = 'contact'
984
        if user is not None:
985
            retailerLink = session.query(RetailerLinks).filter_by(code=user.referrer).first()
986
            if retailerLink is None:
987
                retailerContact = session.query(RetailerContacts).filter_by(mobile_number=user.mobile_number).first()
988
                if retailerContact is None:
989
                    retailer = session.query(Retailers).filter(Retailers.status.in_(['followup', 'fretry'])).filter(or_(Retailers.contact1==user.mobile_number,Retailers.contact2==user.mobile_number)).first()
990
                else:
991
                    retailer = session.query(Retailers).filter_by(id = retailerContact.retailer_id).first()
992
            else:
993
                retailer = session.query(Retailers).filter_by(id = retailerLink.retailer_id).first()
994
                mappedWith='code'
995
            if retailer is not None:
996
                retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailer.id).first()
997
                if retailerLink is not None:
998
                    retailerLink.user_id = user.id
999
                    retailerLink.mapped_with=mappedWith
15358 amit.gupta 1000
                    retailer.status = 'onboarding'
15275 amit.gupta 1001
                    result = True
1002
                    session.commit()
1003
            return result
1004
    finally:
1005
        session.close()
1006
 
15189 manas 1007
 
15081 amit.gupta 1008
def todict(obj, classkey=None):
1009
    if isinstance(obj, dict):
1010
        data = {}
1011
        for (k, v) in obj.items():
1012
            data[k] = todict(v, classkey)
1013
        return data
1014
    elif hasattr(obj, "_ast"):
1015
        return todict(obj._ast())
1016
    elif hasattr(obj, "__iter__"):
1017
        return [todict(v, classkey) for v in obj]
1018
    elif hasattr(obj, "__dict__"):
1019
        data = dict([(key, todict(value, classkey)) 
1020
            for key, value in obj.__dict__.iteritems() 
1021
            if not callable(value) and not key.startswith('_')])
1022
        if classkey is not None and hasattr(obj, "__class__"):
1023
            data[classkey] = obj.__class__.__name__
1024
        return data
1025
    else:
1026
        return obj
1027
 
15358 amit.gupta 1028
def getRetailerObj(retailer, otherContacts1=None, callType=None):
15324 amit.gupta 1029
    print "before otherContacts1",otherContacts1
1030
    otherContacts = [] if otherContacts1 is None else otherContacts1
15315 amit.gupta 1031
    print "afotherContacts1",otherContacts
15081 amit.gupta 1032
    obj = Mock()
1033
    obj.title = retailer.title
15280 amit.gupta 1034
    obj.id = retailer.id
15314 amit.gupta 1035
    if retailer.contact1 is not None and retailer.contact1 not in otherContacts:
15315 amit.gupta 1036
        otherContacts.append(retailer.contact1)
15314 amit.gupta 1037
    if retailer.contact2 is not None and retailer.contact2 not in otherContacts:
15315 amit.gupta 1038
        otherContacts.append(retailer.contact2)
15276 amit.gupta 1039
    obj.address = retailer.address_new if retailer.address_new is not None else retailer.address
15323 amit.gupta 1040
    obj.contact1 = None if len(otherContacts)==0 else otherContacts[0]
15325 amit.gupta 1041
    if obj.contact1 is not None:
1042
        obj.contact2 = None if len(otherContacts)==1 else otherContacts[1]
15096 amit.gupta 1043
    obj.scheduled = (retailer.call_priority is not None)
15312 amit.gupta 1044
    obj.status = retailer.status
15358 amit.gupta 1045
    if callType == 'onboarding':
1046
        try:
15364 amit.gupta 1047
            userId, activatedTime = session.query(RetailerLinks.user_id, RetailerLinks.activated).filter(RetailerLinks.retailer_id==retailer.id).first()
15366 amit.gupta 1048
            activated, = session.query(Users.activation_time).filter(Users.id==userId).first()
15364 amit.gupta 1049
            if activated is not None:
15366 amit.gupta 1050
                activatedTime = activated
15362 amit.gupta 1051
            obj.user_id = userId
15364 amit.gupta 1052
            obj.created = datetime.strftime(activatedTime, '%d/%m/%Y %H:%M:%S')
15358 amit.gupta 1053
            result = fetchResult("select * from useractive where user_id=%d"%(userId))
1054
            if result == ():
1055
                obj.last_active = None
1056
            else:
15360 amit.gupta 1057
                obj.last_active =datetime.strftime(result[0][1], '%d/%m/%Y %H:%M:%S')
15361 amit.gupta 1058
            ordersCount = session.query(Orders).filter_by(user_id = userId).filter(~Orders.status.in_(['ORDER_NOT_CREATED_KNOWN', 'ORDER_ALREADY_CREATED_IGNORED'])).count()
15358 amit.gupta 1059
            obj.orders = ordersCount
1060
        finally:
1061
            session.close()
15081 amit.gupta 1062
    return obj
15091 amit.gupta 1063
 
15132 amit.gupta 1064
def make_tiny(code):
1065
    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
1066
    request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
1067
    filehandle = urllib2.Request(request_url)
1068
    x= urllib2.urlopen(filehandle)
1069
    return str(x.read())
15171 amit.gupta 1070
 
15285 manas 1071
class SearchUser():
1072
 
1073
    def on_post(self, req, resp, agentId, searchType):
15314 amit.gupta 1074
        retailersJsonArray = []
15285 manas 1075
        try:
1076
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1077
            lgr.info( "Request in Search----\n"  + str(jsonReq))
15302 amit.gupta 1078
            contact=jsonReq.get('searchTerm')
15285 manas 1079
            if(searchType=="number"):
15312 amit.gupta 1080
                retailer_ids = session.query(RetailerContacts.retailer_id).filter_by(mobile_number=contact).all()
1081
                retailer_ids = [r for r, in retailer_ids]    
1082
                anotherCondition = or_(Retailers.contact1==contact,Retailers.contact2==contact, Retailers.id.in_(retailer_ids))
1083
            else:
1084
                m = re.match("(.*?)(\d{6})(.*?)", contact)
1085
                if m is not None:
1086
                    pin = m.group(2)
1087
                    contact = m.group(1) if m.group(1) != '' else m.group(3)
15313 amit.gupta 1088
                    anotherCondition = and_(Retailers.title.ilike('%%%s%%'%(contact)), Retailers.pin==pin)
15312 amit.gupta 1089
                else:
1090
                    anotherCondition = Retailers.title.ilike('%%%s%%'%(contact))
15297 amit.gupta 1091
 
15326 amit.gupta 1092
            retailers = session.query(Retailers).filter(anotherCondition).limit(20).all()
15312 amit.gupta 1093
            if retailers is None:
15285 manas 1094
                resp.body = json.dumps("{}")
15312 amit.gupta 1095
            else:
1096
                for retailer in retailers:
15326 amit.gupta 1097
                    otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
15314 amit.gupta 1098
                    retailersJsonArray.append(todict(getRetailerObj(retailer, otherContacts)))    
1099
            resp.body = json.dumps({"Retailers":retailersJsonArray}, encoding='utf-8')
15312 amit.gupta 1100
            return
15285 manas 1101
        finally:
1102
            session.close()
15171 amit.gupta 1103
 
15081 amit.gupta 1104
 
1105
class Mock(object):
1106
    pass
15189 manas 1107
 
15312 amit.gupta 1108
def tagActivatedReatilers():
1109
    retailerIds = [r for  r, in session.query(RetailerLinks.retailer_id).all()]
1110
    session.close()
15288 amit.gupta 1111
    for retailerId in retailerIds:
1112
        isActivated(retailerId)
15312 amit.gupta 1113
    session.close()
1114
def main():
1115
    tagActivatedReatilers()
15195 manas 1116
 
15081 amit.gupta 1117
if __name__ == '__main__':
15207 amit.gupta 1118
    main()
15091 amit.gupta 1119