Subversion Repositories SmartDukaan

Rev

Rev 15564 | Rev 15574 | 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
 
555
    def getNewRetailer(self,failback=True):
556
        retry = True
557
        retailer = None 
558
        try:
559
            while(retry):
15168 amit.gupta 560
                lgr.info( "Calltype " + self.callType)
15081 amit.gupta 561
                status=self.callType
15545 amit.gupta 562
                query = session.query(Retailers).filter(Retailers.status==status).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None))
15081 amit.gupta 563
                if status=='fresh':
15546 amit.gupta 564
                    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 565
                elif status=='followup':
15546 amit.gupta 566
                    query = query.filter(Retailers.next_call_time<=datetime.now()).order_by(Retailers.agent_id.desc(),Retailers.next_call_time)
15162 amit.gupta 567
                else:
15546 amit.gupta 568
                    query = query.filter(Retailers.modified<=datetime.now()).order_by(Retailers.agent_id.desc(), Retailers.modified)
15358 amit.gupta 569
 
15081 amit.gupta 570
                retailer = query.with_lockmode("update").first()
571
                if retailer is not None:
15168 amit.gupta 572
                    lgr.info( "retailer " +str(retailer.id))
15081 amit.gupta 573
                    if status=="fresh":
574
                        userquery = session.query(Users)
575
                        if retailer.contact2 is not None:
576
                            userquery = userquery.filter(Users.mobile_number.in_([retailer.contact1,retailer.contact2]))
577
                        else:
578
                            userquery = userquery.filter_by(mobile_number=retailer.contact1)
579
                        user = userquery.first()
580
                        if user is not None:
581
                            retailer.status = 'alreadyuser'
15168 amit.gupta 582
                            lgr.info( "retailer.status " + retailer.status)
15081 amit.gupta 583
                            session.commit()
584
                            continue
585
                        retailer.status = 'assigned'
15358 amit.gupta 586
                    elif status=='followup':
15276 amit.gupta 587
                        if isActivated(retailer.id):
588
                            print "Retailer Already %d activated and marked onboarded"%(retailer.id)
589
                            continue
15081 amit.gupta 590
                        retailer.status = 'fassigned'
15358 amit.gupta 591
                    else:
592
                        retailer.status = 'oassigned'
15081 amit.gupta 593
                    retailer.retry_count = 0
15123 amit.gupta 594
                    retailer.invalid_retry_count = 0
15168 amit.gupta 595
                    lgr.info( "Found Retailer " +  str(retailer.id) + " with status " + status + " assigned to " + str(self.agentId))
15081 amit.gupta 596
 
597
                else:
15168 amit.gupta 598
                    lgr.info( "No fresh/followup retailers found")
15081 amit.gupta 599
                    if failback:
600
                        retailer = self.getRetryRetailer(False)
15104 amit.gupta 601
                        return retailer
15148 amit.gupta 602
                retry=False
15081 amit.gupta 603
        except:
604
            print traceback.print_exc()
605
        return retailer
606
 
15132 amit.gupta 607
    def on_get(self, req, resp, agentId, callType=None, retailerId=None):
15081 amit.gupta 608
        global RETAILER_DETAIL_CALL_COUNTER
609
        RETAILER_DETAIL_CALL_COUNTER += 1
15168 amit.gupta 610
        lgr.info( "RETAILER_DETAIL_CALL_COUNTER " +  str(RETAILER_DETAIL_CALL_COUNTER))
15081 amit.gupta 611
        self.agentId = int(agentId)
612
        self.callType = callType
15139 amit.gupta 613
        if retailerId is not None:
614
            self.retailerId = int(retailerId)
15208 amit.gupta 615
            retailerLink = session.query(RetailerLinks).filter_by(retailer_id=self.retailerId).first()
15132 amit.gupta 616
            if retailerLink is not None:
617
                code = retailerLink.code
618
            else: 
619
                code = self.getCode()
620
                retailerLink = RetailerLinks()
621
                retailerLink.code = code
15139 amit.gupta 622
                retailerLink.agent_id = self.agentId
623
                retailerLink.retailer_id = self.retailerId
15135 amit.gupta 624
 
625
                activationCode=Activation_Codes()
626
                activationCode.code = code
15132 amit.gupta 627
                session.commit()
628
            session.close()
15142 amit.gupta 629
            resp.body =  json.dumps({"result":{"code":code,"link":make_tiny(code)}}, encoding='utf-8')
15132 amit.gupta 630
            return 
15081 amit.gupta 631
        retryFlag = False 
632
        if RETAILER_DETAIL_CALL_COUNTER % DEALER_RETRY_FACTOR ==0:
633
            retryFlag=True
15239 amit.gupta 634
        try:
635
            if retryFlag:
636
                retailer = self.getRetryRetailer()
637
            else:
638
                retailer = self.getNewRetailer()
15343 amit.gupta 639
            if retailer is None:
640
                resp.body = "{}"
641
                return
15239 amit.gupta 642
            fetchInfo = FetchDataHistory()
643
            fetchInfo.agent_id = self.agentId
644
            fetchInfo.call_type = self.callType
15240 amit.gupta 645
            agent = session.query(Agents).filter_by(id=self.agentId).first()
15239 amit.gupta 646
            last_disposition = session.query(CallHistory).filter_by(agent_id=self.agentId).order_by(CallHistory.id.desc()).first()
647
            if last_disposition is None or last_disposition.created < agent.last_login:
648
                fetchInfo.last_action = 'login'
649
                fetchInfo.last_action_time = agent.last_login 
650
            else:
651
                fetchInfo.last_action = 'disposition'
652
                fetchInfo.last_action_time = last_disposition.created
653
            fetchInfo.retailer_id = retailer.id
654
            session.commit()
15241 amit.gupta 655
 
15358 amit.gupta 656
            otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
657
            resp.body = json.dumps(todict(getRetailerObj(retailer, otherContacts, self.callType)), encoding='utf-8')
15241 amit.gupta 658
 
659
            return
660
 
15239 amit.gupta 661
        finally:
662
            session.close()
15241 amit.gupta 663
 
15081 amit.gupta 664
        if retailer is None:
15157 amit.gupta 665
            resp.body = "{}"
15081 amit.gupta 666
        else:
15358 amit.gupta 667
            print "It should never come here"
15081 amit.gupta 668
            resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
669
 
15241 amit.gupta 670
 
15081 amit.gupta 671
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 672
        returned = False
15081 amit.gupta 673
        self.agentId = int(agentId)
674
        self.callType = callType
675
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15169 amit.gupta 676
        lgr.info( "Request ----\n"  + str(jsonReq))
15091 amit.gupta 677
        self.jsonReq = jsonReq
678
        invalidNumber = self.invalidNumber
679
        callLater = self.callLater
15096 amit.gupta 680
        alreadyUser = self.alReadyUser
15091 amit.gupta 681
        verifiedLinkSent = self.verifiedLinkSent
15368 amit.gupta 682
        onboarded = self.onboarded
15278 amit.gupta 683
        self.address = jsonReq.get('address')
15096 amit.gupta 684
        self.retailerId = int(jsonReq.get('retailerid'))
15254 amit.gupta 685
        self.smsNumber = jsonReq.get('smsnumber') 
15112 amit.gupta 686
        try:
687
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
15281 amit.gupta 688
            if self.address:
15278 amit.gupta 689
                self.retailer.address_new = self.address
15112 amit.gupta 690
            self.callDisposition = jsonReq.get('calldispositiontype')
691
            self.callHistory = CallHistory()
692
            self.callHistory.agent_id=self.agentId
693
            self.callHistory.call_disposition = self.callDisposition
694
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 695
            self.callHistory.call_type=self.callType
15112 amit.gupta 696
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
697
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
15200 manas 698
            self.callHistory.disposition_comments = jsonReq.get('calldispositioncomments')
699
            lgr.info(self.callHistory.disposition_comments)
15112 amit.gupta 700
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
701
            self.callHistory.mobile_number = jsonReq.get('number')
15145 amit.gupta 702
            self.callHistory.sms_verified = int(jsonReq.get("verified"))
15234 amit.gupta 703
            lastFetchData = session.query(FetchDataHistory).filter_by(agent_id=self.agentId).order_by(FetchDataHistory.id.desc()).first()
15368 amit.gupta 704
            if self.callDisposition == 'onboarded':
705
                self.checkList = jsonReq.get('checklist')
706
 
15234 amit.gupta 707
            if lastFetchData is None:
708
                raise
709
            self.callHistory.last_fetch_time= lastFetchData.created  
15112 amit.gupta 710
 
711
            dispositionMap = {  'call_later':callLater,
712
                        'ringing_no_answer':callLater,
713
                        'not_reachable':callLater,
714
                        'switch_off':callLater,
15202 manas 715
                        'not_retailer':invalidNumber,
15112 amit.gupta 716
                        'invalid_no':invalidNumber,
717
                        'wrong_no':invalidNumber,
718
                        'hang_up':invalidNumber,
719
                        'retailer_not_interested':invalidNumber,
15200 manas 720
                        'recharge_retailer':invalidNumber,
721
                        'accessory_retailer':invalidNumber,
722
                        'service_center_retailer':invalidNumber,
15112 amit.gupta 723
                        'alreadyuser':alreadyUser,
15368 amit.gupta 724
                        'verified_link_sent':verifiedLinkSent,
725
                        'onboarded':onboarded
15112 amit.gupta 726
                      }
727
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
728
        finally:
729
            session.close()
15096 amit.gupta 730
 
15112 amit.gupta 731
        if returned:
732
            resp.body = "{\"result\":\"success\"}"
733
        else:
734
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 735
 
15091 amit.gupta 736
    def invalidNumber(self,):
15108 manas 737
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
738
        if self.callDisposition == 'invalid_no':
739
            self.retailer.status='failed'
740
            self.callHistory.disposition_description = 'Invalid Number'
741
        elif self.callDisposition == 'wrong_no':
15111 manas 742
            self.retailer.status='failed'
743
            self.callHistory.disposition_description = 'Wrong Number'
744
        elif self.callDisposition == 'hang_up':
745
            self.retailer.status='failed'
746
            self.callHistory.disposition_description = 'Hang Up'
747
        elif self.callDisposition == 'retailer_not_interested':
748
            self.retailer.status='failed'
749
            if self.callHistory.disposition_description is None:
750
                self.callHistory.disposition_description = 'NA'
15200 manas 751
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description
752
        elif self.callDisposition == 'recharge_retailer':
753
            self.retailer.status='failed'
754
            self.callHistory.disposition_description = 'Recharge related. Not a retailer '
755
        elif self.callDisposition == 'accessory_retailer':
756
            self.retailer.status='failed'
757
            self.callHistory.disposition_description = 'Accessory related. Not a retailer'
758
        elif self.callDisposition == 'service_center_retailer':
759
            self.retailer.status='failed'
760
            self.callHistory.disposition_description = 'Service Center related. Not a retailer'
15202 manas 761
        elif self.callDisposition == 'not_retailer':
762
            self.retailer.status='failed'
763
            self.callHistory.disposition_description = 'Not a retailer'    
15108 manas 764
        session.commit()
765
        return True   
766
 
15132 amit.gupta 767
    def getCode(self,):
15207 amit.gupta 768
        newCode = None
769
        lastLink = session.query(RetailerLinks).order_by(RetailerLinks.id.desc()).with_lockmode("update").first()
770
        if lastLink is not None:
771
            if len(lastLink.code)==len(codesys):
772
                newCode=lastLink.code
773
        return getNextCode(codesys, newCode)
15108 manas 774
 
15254 amit.gupta 775
 
15091 amit.gupta 776
    def callLater(self,):
15368 amit.gupta 777
        self.retailer.status = RETRY_MAP.get(self.callType)
15100 amit.gupta 778
        self.retailer.call_priority = None
15096 amit.gupta 779
        if self.callDisposition == 'call_later':
15100 amit.gupta 780
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 781
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 782
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
783
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
784
            else:
15102 amit.gupta 785
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 786
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 787
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
788
        else: 
789
            if self.callDisposition == 'ringing_no_answer':
790
                if self.retailer.disposition == 'ringing_no_answer':
791
                    self.retailer.retry_count += 1
792
                else:
793
                    self.retailer.disposition = 'ringing_no_answer'
794
                    self.retailer.retry_count = 1
795
            else:
796
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 797
                    pass
15112 amit.gupta 798
                else:
15119 amit.gupta 799
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 800
                self.retailer.retry_count += 1
801
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 802
 
15122 amit.gupta 803
            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 804
            if retryConfig is not None:
805
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 806
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 807
            else:
808
                self.retailer.status = 'failed'
809
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 810
 
15101 amit.gupta 811
        session.commit()
812
        return True
15096 amit.gupta 813
 
15100 amit.gupta 814
 
15091 amit.gupta 815
    def alReadyUser(self,):
15112 amit.gupta 816
        self.retailer.status = self.callDisposition
15117 amit.gupta 817
        if self.callHistory.disposition_description is None:
818
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 819
        session.commit()
820
        return True
15091 amit.gupta 821
    def verifiedLinkSent(self,):
15147 amit.gupta 822
        if self.callType == 'fresh':
823
            self.retailer.status = 'followup'
15548 amit.gupta 824
            self.retailer.agent_id = None
15147 amit.gupta 825
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
826
            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') 
827
        else:
15224 amit.gupta 828
            self.retailer.status = 'followup'
15548 amit.gupta 829
            self.retailer.agent_id = None
15147 amit.gupta 830
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=7)
15254 amit.gupta 831
            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 832
        addContactToRetailer(self.agentId, self.retailerId, self.smsNumber, self.callType, 'sms')     
15146 amit.gupta 833
        session.commit()
834
        return True
15368 amit.gupta 835
    def onboarded(self,):
836
        self.retailer.status = self.callDisposition
837
        checkList = OnboardedRetailerChecklists()
838
        checkList.contact_us = self.checkList.get('contactus')
15390 amit.gupta 839
        checkList.doa_return_policy = self.checkList.get('doareturnpolicy')
15368 amit.gupta 840
        checkList.number_verification = self.checkList.get('numberverification')
841
        checkList.payment_option = self.checkList.get('paymentoption')
842
        checkList.preferences = self.checkList.get('preferences')
843
        checkList.product_info = self.checkList.get('productinfo')
15372 amit.gupta 844
        checkList.redeem = self.checkList.get('redeem')
15368 amit.gupta 845
        checkList.retailer_id = self.retailerId
846
        session.commit()
847
        return True
848
 
849
 
15254 amit.gupta 850
def isActivated(retailerId):
15276 amit.gupta 851
    retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailerId).first()
15448 amit.gupta 852
    user = session.query(Users).filter(or_(func.lower(Users.referrer)==retailerLink.code.lower(), Users.utm_campaign==retailerLink.code)).first()
15276 amit.gupta 853
    if user is None:
854
        mobileNumbers = list(session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailerId).all())
855
        user = session.query(Users).filter(Users.mobile_number.in_(mobileNumbers)).first()
15254 amit.gupta 856
        if user is None:
15332 amit.gupta 857
            if retailerLink.created < datetime(2015,5,26):
15333 amit.gupta 858
                historyNumbers = [number for number, in session.query(CallHistory.mobile_number).filter_by(retailer_id = retailerId).all()]
15476 amit.gupta 859
                user = session.query(Users).filter(Users.mobile_number.in_(historyNumbers)).first()
15332 amit.gupta 860
                if user is None:
861
                    return False
15334 amit.gupta 862
                else:
863
                    mapped_with = 'contact'
15332 amit.gupta 864
            else:
865
                return False
15276 amit.gupta 866
        else:
867
            mapped_with = 'contact'
868
    else:
869
        mapped_with = 'code'
870
    retailerLink.mapped_with = mapped_with
15388 amit.gupta 871
    if user.activation_time is not None:
15448 amit.gupta 872
        retailerLink.activated = user.activation_time
873
    retailerLink.activated = user.created
15276 amit.gupta 874
    retailerLink.user_id = user.id
15291 amit.gupta 875
    retailer = session.query(Retailers).filter_by(id=retailerId).first()
15538 amit.gupta 876
    if retailer.status == 'followup':
15389 amit.gupta 877
        retailer.status = 'onboarding'
15548 amit.gupta 878
        retailer.agent_id = None
15391 amit.gupta 879
        retailer.call_priority = None
880
        retailer.next_call_time = None
881
        retailer.retry_count = 0
882
        retailer.invalid_retry_count = 0
15276 amit.gupta 883
    session.commit()
15287 amit.gupta 884
    print "retailerLink.retailer_id", retailerLink.retailer_id
15276 amit.gupta 885
    session.close()
886
    return True
15254 amit.gupta 887
 
888
class AddContactToRetailer():
889
    def on_post(self,req,resp, agentId):
890
        agentId = int(agentId)
891
        try:
892
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
893
            retailerId = int(jsonReq.get("retailerid"))
894
            mobile = jsonReq.get("mobile")
895
            callType = jsonReq.get("calltype")
896
            contactType = jsonReq.get("contacttype")
897
            addContactToRetailer(agentId, retailerId, mobile, callType, contactType)
898
            session.commit()
899
        finally:
900
            session.close()
901
 
902
def addContactToRetailer(agentId, retailerId, mobile, callType, contactType):
15312 amit.gupta 903
    retailerContact = session.query(RetailerContacts).filter_by(retailer_id=retailerId).filter_by(mobile_number=mobile).first()
904
    if retailerContact is None:
15254 amit.gupta 905
        retailerContact = RetailerContacts()
15256 amit.gupta 906
        retailerContact.retailer_id = retailerId
15254 amit.gupta 907
        retailerContact.agent_id = agentId
908
        retailerContact.call_type = callType
909
        retailerContact.contact_type = contactType
910
        retailerContact.mobile_number = mobile
15312 amit.gupta 911
    else:
15327 amit.gupta 912
        if CONTACT_PRIORITY.index(retailerContact.contact_type) > CONTACT_PRIORITY.index(contactType):
15358 amit.gupta 913
            retailerContact.contact_type = contactType
15312 amit.gupta 914
 
15254 amit.gupta 915
 
15312 amit.gupta 916
 
15189 manas 917
class Login():
918
 
919
    def on_get(self, req, resp, agentId, role):
920
        try:
15198 manas 921
            self.agentId = int(agentId)
922
            self.role = role
923
            print str(self.agentId) + self.role;
15199 manas 924
            agents=AgentLoginTimings()
925
            lastLoginTime = session.query(Agents).filter(Agents.id==self.agentId).first()
926
            print 'lastLogintime' + str(lastLoginTime)
927
            agents.loginTime=lastLoginTime.last_login
928
            agents.logoutTime=datetime.now()
929
            agents.role =self.role
15282 amit.gupta 930
            agents.agent_id = self.agentId
15199 manas 931
            session.add(agents)    
932
            session.commit()
933
            resp.body =  json.dumps({"result":{"success":"true","message":"Success"}}, encoding='utf-8')
15189 manas 934
        finally:
935
            session.close()        
15112 amit.gupta 936
 
15189 manas 937
    def on_post(self,req,resp):
938
        try:
939
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
940
            lgr.info( "Request ----\n"  + str(jsonReq))
941
            email=jsonReq.get('email')
942
            password = jsonReq.get('password')
943
            role=jsonReq.get('role')    
15531 amit.gupta 944
            agent = session.query(Agents).filter(and_(Agents.email==email,Agents.password==password)).first()
945
            if agent is None:
15189 manas 946
                resp.body =  json.dumps({"result":{"success":"false","message":"Invalid User"}}, encoding='utf-8')
947
            else:
15531 amit.gupta 948
                print agent.id
949
                checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==agent.id,Agent_Roles.role==role)).first()
15189 manas 950
                if checkRole is None:
951
                    resp.body =  json.dumps({"result":{"success":"false","message":"Invalid Role"}}, encoding='utf-8')
952
                else:
15531 amit.gupta 953
                    agent.last_login = datetime.now()
954
                    agent.login_type = role
955
                    resp.body =  json.dumps({"result":{"success":"true","message":"Valid User","id":agent.id}}, encoding='utf-8')
956
                    session.commit()
15195 manas 957
                    #session.query(Agents).filter_by(id = checkUser[0]).    
15189 manas 958
        finally:
959
            session.close()    
960
 
15195 manas 961
    def test(self,email,password,role):
15189 manas 962
        checkUser = session.query(Agents.id).filter(and_(Agents.email==email,Agents.password==password)).first()
963
        if checkUser is None:
964
            print checkUser
15195 manas 965
 
15189 manas 966
        else:
967
            print checkUser[0]
968
            checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==checkUser[0],Agent_Roles.role==role)).first()
969
            if checkRole is None:
15195 manas 970
                pass
15189 manas 971
            else:
15195 manas 972
                agents=AgentLoginTimings()
973
                agents.loginTime=datetime.now()
974
                agents.logoutTime=datetime.now()
975
                agents.role =role
976
                agents.agent_id = 2
977
                #session.query(AgentLoginTimings).filter_by(id = checkUser[0]).update({"last_login":datetime.now()}, synchronize_session=False)
978
                session.add(agents)    
979
                session.commit()
980
                session.close()
981
 
982
                #session.query(Agents).filter(Agents.id==checkUser[0]).update({"last_login":Agents.last_login})
15275 amit.gupta 983
 
984
class RetailerActivation():
985
    def on_get(self, req, resp, userId):
15351 amit.gupta 986
        res =  markDealerActivation(int(userId))
987
        if res:
988
            resp.body = "{\"activated\":true}"
989
        else:
990
            resp.body = "{\"activated\":false}"
991
 
15275 amit.gupta 992
 
993
def markDealerActivation(userId):
994
    try:
15343 amit.gupta 995
        user = session.query(Users).filter_by(id=userId).first()
15275 amit.gupta 996
        result = False                
997
        mappedWith = 'contact'
15534 amit.gupta 998
        retailer = None
15275 amit.gupta 999
        if user is not None:
15454 amit.gupta 1000
            referrer = None if user.referrer is None else user.referrer.upper()
1001
            retailerLink = session.query(RetailerLinks).filter(or_(RetailerLinks.code==referrer, RetailerLinks.code==user.utm_campaign)).first()
15275 amit.gupta 1002
            if retailerLink is None:
15501 amit.gupta 1003
                if user.mobile_number is not None:
1004
                    retailerContact = session.query(RetailerContacts).filter_by(mobile_number=user.mobile_number).first()
1005
                    if retailerContact is None:
1006
                        retailer = session.query(Retailers).filter(Retailers.status.in_(['followup', 'fretry'])).filter(or_(Retailers.contact1==user.mobile_number,Retailers.contact2==user.mobile_number)).first()
1007
                    else:
1008
                        retailer = session.query(Retailers).filter_by(id = retailerContact.retailer_id).first()
15275 amit.gupta 1009
            else:
1010
                retailer = session.query(Retailers).filter_by(id = retailerLink.retailer_id).first()
1011
                mappedWith='code'
1012
            if retailer is not None:
1013
                retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailer.id).first()
1014
                if retailerLink is not None:
1015
                    retailerLink.user_id = user.id
1016
                    retailerLink.mapped_with=mappedWith
15358 amit.gupta 1017
                    retailer.status = 'onboarding'
15275 amit.gupta 1018
                    result = True
1019
                    session.commit()
1020
            return result
1021
    finally:
1022
        session.close()
1023
 
15189 manas 1024
 
15081 amit.gupta 1025
def todict(obj, classkey=None):
1026
    if isinstance(obj, dict):
1027
        data = {}
1028
        for (k, v) in obj.items():
1029
            data[k] = todict(v, classkey)
1030
        return data
1031
    elif hasattr(obj, "_ast"):
1032
        return todict(obj._ast())
1033
    elif hasattr(obj, "__iter__"):
1034
        return [todict(v, classkey) for v in obj]
1035
    elif hasattr(obj, "__dict__"):
1036
        data = dict([(key, todict(value, classkey)) 
1037
            for key, value in obj.__dict__.iteritems() 
1038
            if not callable(value) and not key.startswith('_')])
1039
        if classkey is not None and hasattr(obj, "__class__"):
1040
            data[classkey] = obj.__class__.__name__
1041
        return data
1042
    else:
1043
        return obj
1044
 
15358 amit.gupta 1045
def getRetailerObj(retailer, otherContacts1=None, callType=None):
15324 amit.gupta 1046
    print "before otherContacts1",otherContacts1
1047
    otherContacts = [] if otherContacts1 is None else otherContacts1
15315 amit.gupta 1048
    print "afotherContacts1",otherContacts
15081 amit.gupta 1049
    obj = Mock()
1050
    obj.title = retailer.title
15280 amit.gupta 1051
    obj.id = retailer.id
15314 amit.gupta 1052
    if retailer.contact1 is not None and retailer.contact1 not in otherContacts:
15315 amit.gupta 1053
        otherContacts.append(retailer.contact1)
15314 amit.gupta 1054
    if retailer.contact2 is not None and retailer.contact2 not in otherContacts:
15315 amit.gupta 1055
        otherContacts.append(retailer.contact2)
15276 amit.gupta 1056
    obj.address = retailer.address_new if retailer.address_new is not None else retailer.address
15323 amit.gupta 1057
    obj.contact1 = None if len(otherContacts)==0 else otherContacts[0]
15325 amit.gupta 1058
    if obj.contact1 is not None:
1059
        obj.contact2 = None if len(otherContacts)==1 else otherContacts[1]
15096 amit.gupta 1060
    obj.scheduled = (retailer.call_priority is not None)
15312 amit.gupta 1061
    obj.status = retailer.status
15358 amit.gupta 1062
    if callType == 'onboarding':
1063
        try:
15364 amit.gupta 1064
            userId, activatedTime = session.query(RetailerLinks.user_id, RetailerLinks.activated).filter(RetailerLinks.retailer_id==retailer.id).first()
15366 amit.gupta 1065
            activated, = session.query(Users.activation_time).filter(Users.id==userId).first()
15364 amit.gupta 1066
            if activated is not None:
15366 amit.gupta 1067
                activatedTime = activated
15362 amit.gupta 1068
            obj.user_id = userId
15364 amit.gupta 1069
            obj.created = datetime.strftime(activatedTime, '%d/%m/%Y %H:%M:%S')
15358 amit.gupta 1070
            result = fetchResult("select * from useractive where user_id=%d"%(userId))
1071
            if result == ():
1072
                obj.last_active = None
1073
            else:
15360 amit.gupta 1074
                obj.last_active =datetime.strftime(result[0][1], '%d/%m/%Y %H:%M:%S')
15361 amit.gupta 1075
            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 1076
            obj.orders = ordersCount
1077
        finally:
1078
            session.close()
15081 amit.gupta 1079
    return obj
15091 amit.gupta 1080
 
15132 amit.gupta 1081
def make_tiny(code):
1082
    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 1083
    #request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
1084
    #filehandle = urllib2.Request(request_url)
1085
    #x= urllib2.urlopen(filehandle)
15546 amit.gupta 1086
    try:
1087
        shortener = Shortener('TinyurlShortener')
1088
        returnUrl =  shortener.short(url)
1089
    except:
1090
        shortener = Shortener('SentalaShortener')
1091
        returnlUrl =  shortener.short(url)
1092
    return returnUrl
15171 amit.gupta 1093
 
15285 manas 1094
class SearchUser():
1095
 
1096
    def on_post(self, req, resp, agentId, searchType):
15314 amit.gupta 1097
        retailersJsonArray = []
15285 manas 1098
        try:
1099
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1100
            lgr.info( "Request in Search----\n"  + str(jsonReq))
15302 amit.gupta 1101
            contact=jsonReq.get('searchTerm')
15285 manas 1102
            if(searchType=="number"):
15312 amit.gupta 1103
                retailer_ids = session.query(RetailerContacts.retailer_id).filter_by(mobile_number=contact).all()
1104
                retailer_ids = [r for r, in retailer_ids]    
1105
                anotherCondition = or_(Retailers.contact1==contact,Retailers.contact2==contact, Retailers.id.in_(retailer_ids))
1106
            else:
1107
                m = re.match("(.*?)(\d{6})(.*?)", contact)
1108
                if m is not None:
1109
                    pin = m.group(2)
1110
                    contact = m.group(1) if m.group(1) != '' else m.group(3)
15313 amit.gupta 1111
                    anotherCondition = and_(Retailers.title.ilike('%%%s%%'%(contact)), Retailers.pin==pin)
15312 amit.gupta 1112
                else:
1113
                    anotherCondition = Retailers.title.ilike('%%%s%%'%(contact))
15297 amit.gupta 1114
 
15326 amit.gupta 1115
            retailers = session.query(Retailers).filter(anotherCondition).limit(20).all()
15312 amit.gupta 1116
            if retailers is None:
15285 manas 1117
                resp.body = json.dumps("{}")
15312 amit.gupta 1118
            else:
1119
                for retailer in retailers:
15326 amit.gupta 1120
                    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 1121
                    retailersJsonArray.append(todict(getRetailerObj(retailer, otherContacts)))    
1122
            resp.body = json.dumps({"Retailers":retailersJsonArray}, encoding='utf-8')
15312 amit.gupta 1123
            return
15285 manas 1124
        finally:
1125
            session.close()
15171 amit.gupta 1126
 
15081 amit.gupta 1127
 
1128
class Mock(object):
1129
    pass
15189 manas 1130
 
15312 amit.gupta 1131
def tagActivatedReatilers():
15573 amit.gupta 1132
    retailerIds = [r for  r, in session.query(RetailerLinks.retailer_id).all()]
15312 amit.gupta 1133
    session.close()
15288 amit.gupta 1134
    for retailerId in retailerIds:
1135
        isActivated(retailerId)
15312 amit.gupta 1136
    session.close()
15374 kshitij.so 1137
 
1138
class StaticDeals():
1139
 
1140
    def on_get(self, req, resp):
1141
 
1142
        offset = req.get_param_as_int("offset")
1143
        limit = req.get_param_as_int("limit")
1144
        categoryId = req.get_param_as_int("categoryId")
15458 kshitij.so 1145
        direction = req.get_param_as_int("direction")
15374 kshitij.so 1146
 
15458 kshitij.so 1147
        result = Mongo.getStaticDeals(offset, limit, categoryId, direction)
15374 kshitij.so 1148
        resp.body = dumps(result)
1149
 
1150
 
1151
 
15312 amit.gupta 1152
def main():
1153
    tagActivatedReatilers()
15465 amit.gupta 1154
    #print make_tiny("AA")
15195 manas 1155
 
15081 amit.gupta 1156
if __name__ == '__main__':
15207 amit.gupta 1157
    main()
15091 amit.gupta 1158