Subversion Repositories SmartDukaan

Rev

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