Subversion Repositories SmartDukaan

Rev

Rev 19440 | Rev 19444 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
18272 kshitij.so 1
from bson import json_util
15081 amit.gupta 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, \
15676 amit.gupta 10
    FetchDataHistory, RetailerContacts, Orders, OnboardedRetailerChecklists,\
17467 manas 11
    RetailerAddresses, Pincodeavailability, app_offers, appmasters, user_app_cashbacks, user_app_installs,\
18350 manas 12
    Postoffices, UserCrmCallingData, CallHistoryCrm, ProductPricingInputs
15358 amit.gupta 13
from dtr.storage.Mongo import get_mongo_connection
14
from dtr.storage.Mysql import fetchResult
15081 amit.gupta 15
from dtr.utils import FetchLivePrices, DealSheet as X_DealSheet, \
18629 manas 16
    UserSpecificDeals, utils
18256 manas 17
from dtr.utils.utils import getLogger,encryptMessage,decryptMessage,\
18
    get_mongo_connection_dtr_data, to_java_date
15081 amit.gupta 19
from elixir import *
15254 amit.gupta 20
from operator import and_
16714 manish.sha 21
from sqlalchemy.sql.expression import func, func, or_, desc, asc, case
15132 amit.gupta 22
from urllib import urlencode
23
import contextlib
13827 kshitij.so 24
import falcon
15081 amit.gupta 25
import json
15358 amit.gupta 26
import re
15254 amit.gupta 27
import string
15081 amit.gupta 28
import traceback
15132 amit.gupta 29
import urllib
30
import urllib2
31
import uuid
15465 amit.gupta 32
import gdshortener
16727 manish.sha 33
from dtr.dao import AppOfferObj, UserAppBatchDrillDown, UserAppBatchDateDrillDown
18097 manas 34
import base64
18272 kshitij.so 35
from falcon.util.uri import decode
18266 manas 36
import MySQLdb
18792 manas 37
from shop2020.clients.CatalogClient import CatalogClient  
18896 amit.gupta 38
from pyquery import PyQuery as pq
39
 
15207 amit.gupta 40
alphalist = list(string.uppercase)
41
alphalist.remove('O')
42
numList = ['1','2','3','4','5','6','7','8','9']
43
codesys = [alphalist, alphalist, numList, numList, numList]
15312 amit.gupta 44
CONTACT_PRIORITY = ['sms', 'called', 'ringing']
15368 amit.gupta 45
RETRY_MAP = {'fresh':'retry', 'followup':'fretry', 'onboarding':'oretry'}
15358 amit.gupta 46
ASSIGN_MAP = {'retry':'assigned', 'fretry':'fassigned', 'oretry':'oassigned'}
15207 amit.gupta 47
 
16882 amit.gupta 48
sticky_agents = [17]
49
 
15207 amit.gupta 50
def getNextCode(codesys, code=None):
51
    if code is None:
52
        code = []
53
        for charcode in codesys:
54
            code.append(charcode[0])
55
        return string.join(code, '')
56
    carry = True
57
    code = list(code)
58
    lastindex = len(codesys) - 1
59
    while carry:
60
        listChar = codesys[lastindex]
61
        newIndex = (listChar.index(code[lastindex])+1)%len(listChar)
62
        print newIndex
63
        code[lastindex] = listChar[newIndex]
64
        if newIndex != 0:
65
            carry = False
66
        lastindex -= 1
67
        if lastindex ==-1:
68
            raise BaseException("All codes are exhausted")
69
 
70
    return string.join(code, '')
71
 
18397 manas 72
 
15081 amit.gupta 73
global RETAILER_DETAIL_CALL_COUNTER
74
RETAILER_DETAIL_CALL_COUNTER = 0
18329 manas 75
global USER_DETAIL_MAP
18332 manas 76
USER_DETAIL_MAP={} 
18329 manas 77
USER_DETAIL_MAP['accs_cart']=0
78
USER_DETAIL_MAP['accs_active']=0
79
USER_DETAIL_MAP['accs_order']=0
19442 manas 80
USER_DETAIL_MAP['accs_cashback_scheme']=0
15168 amit.gupta 81
lgr = getLogger('/var/log/retailer-acquisition-api.log')
15081 amit.gupta 82
DEALER_RETRY_FACTOR = int(PythonPropertyReader.getConfig('DEALER_RETRY_FACTOR'))
16886 amit.gupta 83
DEALER_FRESH_FACTOR = int(PythonPropertyReader.getConfig('DEALER_FRESH_FACTOR'))
18329 manas 84
USER_CRM_DEFAULT_RETRY_FACTOR = int(PythonPropertyReader.getConfig('USER_CRM_DEFAULT_RETRY_FACTOR'))
85
USER_CRM_DEFAULT_FRESH_FACTOR = int(PythonPropertyReader.getConfig('USER_CRM_DEFAULT_FRESH_FACTOR'))
86
TOTAL = DEALER_RETRY_FACTOR + DEALER_FRESH_FACTOR
87
TOTAL_USER = USER_CRM_DEFAULT_FRESH_FACTOR + USER_CRM_DEFAULT_RETRY_FACTOR  
13572 kshitij.so 88
class CategoryDiscountInfo(object):
89
 
90
    def on_get(self, req, resp):
91
 
13629 kshitij.so 92
        result = Mongo.getAllCategoryDiscount()
93
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
94
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 95
 
96
    def on_post(self, req, resp):
97
        try:
98
            result_json = json.loads(req.stream.read(), encoding='utf-8')
99
        except ValueError:
100
            raise falcon.HTTPError(falcon.HTTP_400,
101
                'Malformed JSON',
102
                'Could not decode the request body. The '
103
                'JSON was incorrect.')
104
 
105
        result = Mongo.addCategoryDiscount(result_json)
106
        resp.body = json.dumps(result, encoding='utf-8')
13969 kshitij.so 107
 
108
    def on_put(self, req, resp, _id):
13970 kshitij.so 109
        try:
110
            result_json = json.loads(req.stream.read(), encoding='utf-8')
111
        except ValueError:
112
            raise falcon.HTTPError(falcon.HTTP_400,
113
                'Malformed JSON',
114
                'Could not decode the request body. The '
115
                'JSON was incorrect.')
116
 
117
        result = Mongo.updateCategoryDiscount(result_json, _id)
118
        resp.body = json.dumps(result, encoding='utf-8')
119
 
13966 kshitij.so 120
 
13969 kshitij.so 121
 
13572 kshitij.so 122
class SkuSchemeDetails(object):
123
 
124
    def on_get(self, req, resp):
13629 kshitij.so 125
 
14070 kshitij.so 126
        offset = req.get_param_as_int("offset")
127
        limit = req.get_param_as_int("limit")
128
 
129
        result = Mongo.getAllSkuWiseSchemeDetails(offset, limit)
13629 kshitij.so 130
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
131
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 132
 
133
 
134
    def on_post(self, req, resp):
135
 
14552 kshitij.so 136
        multi = req.get_param_as_int("multi")
137
 
13572 kshitij.so 138
        try:
139
            result_json = json.loads(req.stream.read(), encoding='utf-8')
140
        except ValueError:
141
            raise falcon.HTTPError(falcon.HTTP_400,
142
                'Malformed JSON',
143
                'Could not decode the request body. The '
144
                'JSON was incorrect.')
145
 
15852 kshitij.so 146
        result = Mongo.addSchemeDetailsForSku(result_json)
13572 kshitij.so 147
        resp.body = json.dumps(result, encoding='utf-8')
148
 
149
class SkuDiscountInfo():
150
 
151
    def on_get(self, req, resp):
13629 kshitij.so 152
 
13970 kshitij.so 153
        offset = req.get_param_as_int("offset")
154
        limit = req.get_param_as_int("limit")
155
        result = Mongo.getallSkuDiscountInfo(offset,limit)
13629 kshitij.so 156
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
157
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 158
 
159
 
160
    def on_post(self, req, resp):
161
 
14552 kshitij.so 162
        multi = req.get_param_as_int("multi")
163
 
13572 kshitij.so 164
        try:
165
            result_json = json.loads(req.stream.read(), encoding='utf-8')
166
        except ValueError:
167
            raise falcon.HTTPError(falcon.HTTP_400,
168
                'Malformed JSON',
169
                'Could not decode the request body. The '
170
                'JSON was incorrect.')
171
 
15852 kshitij.so 172
        result = Mongo.addSkuDiscountInfo(result_json)
13572 kshitij.so 173
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 174
 
175
    def on_put(self, req, resp, _id):
176
        try:
177
            result_json = json.loads(req.stream.read(), encoding='utf-8')
178
        except ValueError:
179
            raise falcon.HTTPError(falcon.HTTP_400,
180
                'Malformed JSON',
181
                'Could not decode the request body. The '
182
                'JSON was incorrect.')
183
 
184
        result = Mongo.updateSkuDiscount(result_json, _id)
185
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 186
 
187
class ExceptionalNlc():
188
 
189
    def on_get(self, req, resp):
13629 kshitij.so 190
 
13970 kshitij.so 191
        offset = req.get_param_as_int("offset")
192
        limit = req.get_param_as_int("limit")
193
 
194
        result = Mongo.getAllExceptionlNlcItems(offset, limit)
13629 kshitij.so 195
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
196
        resp.body = json.dumps(json_docs, encoding='utf-8')
13572 kshitij.so 197
 
198
    def on_post(self, req, resp):
199
 
14552 kshitij.so 200
        multi = req.get_param_as_int("multi")
201
 
13572 kshitij.so 202
        try:
203
            result_json = json.loads(req.stream.read(), encoding='utf-8')
204
        except ValueError:
205
            raise falcon.HTTPError(falcon.HTTP_400,
206
                'Malformed JSON',
207
                'Could not decode the request body. The '
208
                'JSON was incorrect.')
209
 
15852 kshitij.so 210
        result = Mongo.addExceptionalNlc(result_json)
13572 kshitij.so 211
        resp.body = json.dumps(result, encoding='utf-8')
13970 kshitij.so 212
 
213
    def on_put(self, req, resp, _id):
214
        try:
215
            result_json = json.loads(req.stream.read(), encoding='utf-8')
216
        except ValueError:
217
            raise falcon.HTTPError(falcon.HTTP_400,
218
                'Malformed JSON',
219
                'Could not decode the request body. The '
220
                'JSON was incorrect.')
221
 
222
        result = Mongo.updateExceptionalNlc(result_json, _id)
223
        resp.body = json.dumps(result, encoding='utf-8')
13572 kshitij.so 224
 
13772 kshitij.so 225
class Deals():
13779 kshitij.so 226
    def on_get(self,req, resp, userId):
227
        categoryId = req.get_param_as_int("categoryId")
228
        offset = req.get_param_as_int("offset")
229
        limit = req.get_param_as_int("limit")
13798 kshitij.so 230
        sort = req.get_param("sort")
13802 kshitij.so 231
        direction = req.get_param_as_int("direction")
14853 kshitij.so 232
        filterData = req.get_param('filterData')
19440 kshitij.so 233
        if categoryId!=6:
234
            result = Mongo.getNewDeals(int(userId), categoryId, offset, limit, sort, direction, filterData)
235
        else:
236
            result = Mongo.getAccesoryDeals(int(userId), categoryId, offset, limit, sort, direction, filterData)
16078 kshitij.so 237
        resp.body = dumps(result) 
19440 kshitij.so 238
 
13790 kshitij.so 239
class MasterData():
240
    def on_get(self,req, resp, skuId):
16223 kshitij.so 241
        showDp = req.get_param_as_int("showDp")
16221 kshitij.so 242
        result = Mongo.getItem(skuId, showDp)
13798 kshitij.so 243
        try:
244
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 245
            resp.body = json.dumps(json_docs, encoding='utf-8')
13798 kshitij.so 246
        except:
247
            json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 248
            resp.body = json.dumps(json_docs, encoding='utf-8')
13790 kshitij.so 249
 
14586 kshitij.so 250
    def on_post(self,req, resp):
251
 
252
        addNew = req.get_param_as_int("addNew")
253
        update = req.get_param_as_int("update")
254
        addToExisting = req.get_param_as_int("addToExisting")
255
        multi = req.get_param_as_int("multi")
256
 
14589 kshitij.so 257
        try:
14592 kshitij.so 258
            result_json = json.loads(req.stream.read(), encoding='utf-8')
259
        except ValueError:
260
            raise falcon.HTTPError(falcon.HTTP_400,
261
                'Malformed JSON',
262
                'Could not decode the request body. The '
263
                'JSON was incorrect.')
264
 
265
        if addNew == 1:
266
            result = Mongo.addNewItem(result_json)
267
        elif update == 1:
268
            result = Mongo.updateMaster(result_json, multi)
269
        elif addToExisting == 1:
270
            result = Mongo.addItemToExistingBundle(result_json)
271
        else:
272
            raise
273
        resp.body = dumps(result)
14586 kshitij.so 274
 
13827 kshitij.so 275
class LiveData():
276
    def on_get(self,req, resp):
13865 kshitij.so 277
        if req.get_param_as_int("id") is not None:
278
            print "****getting only for id"
279
            id = req.get_param_as_int("id")
280
            try:
281
                result = FetchLivePrices.getLatestPriceById(id)
13867 kshitij.so 282
                json_docs = json.dumps(result, default=json_util.default)
13966 kshitij.so 283
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 284
            except:
285
                json_docs = json.dumps({}, default=json_util.default)
13966 kshitij.so 286
                resp.body = json.dumps(json_docs, encoding='utf-8')
13834 kshitij.so 287
 
13865 kshitij.so 288
        else:
289
            print "****getting only for skuId"
290
            skuBundleId = req.get_param_as_int("skuBundleId")
291
            source_id = req.get_param_as_int("source_id")
292
            try:
293
                result = FetchLivePrices.getLatestPrice(skuBundleId, source_id)
294
                json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
13966 kshitij.so 295
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 296
            except:
297
                json_docs = [json.dumps(doc, default=json_util.default) for doc in [{}]]
13966 kshitij.so 298
                resp.body = json.dumps(json_docs, encoding='utf-8')
13865 kshitij.so 299
 
13834 kshitij.so 300
class CashBack():
301
    def on_get(self,req, resp):
302
        identifier = req.get_param("identifier")
303
        source_id = req.get_param_as_int("source_id")
304
        try:
13838 kshitij.so 305
            result = Mongo.getCashBackDetails(identifier, source_id)
13837 kshitij.so 306
            json_docs = json.dumps(result, default=json_util.default)
13964 kshitij.so 307
            resp.body = json_docs
13834 kshitij.so 308
        except:
13837 kshitij.so 309
            json_docs = json.dumps({}, default=json_util.default)
13963 kshitij.so 310
            resp.body = json_docs
13892 kshitij.so 311
 
14398 amit.gupta 312
class ImgSrc():
313
    def on_get(self,req, resp):
314
        identifier = req.get_param("identifier")
315
        source_id = req.get_param_as_int("source_id")
316
        try:
317
            result = Mongo.getImgSrc(identifier, source_id)
318
            json_docs = json.dumps(result, default=json_util.default)
319
            resp.body = json_docs
320
        except:
321
            json_docs = json.dumps({}, default=json_util.default)
322
            resp.body = json_docs
323
 
13892 kshitij.so 324
class DealSheet():
325
    def on_get(self,req, resp):
13895 kshitij.so 326
        X_DealSheet.sendMail()
13897 kshitij.so 327
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
13966 kshitij.so 328
        resp.body = json.dumps(json_docs, encoding='utf-8')
13892 kshitij.so 329
 
13970 kshitij.so 330
class DealerPrice():
331
 
332
    def on_get(self, req, resp):
333
 
334
        offset = req.get_param_as_int("offset")
335
        limit = req.get_param_as_int("limit")
336
        result = Mongo.getAllDealerPrices(offset,limit)
337
        json_docs = [json.dumps(doc, default=json_util.default) for doc in result]
338
        resp.body = json.dumps(json_docs, encoding='utf-8')
339
 
340
    def on_post(self, req, resp):
341
 
14552 kshitij.so 342
        multi = req.get_param_as_int("multi")
343
 
13970 kshitij.so 344
        try:
345
            result_json = json.loads(req.stream.read(), encoding='utf-8')
346
        except ValueError:
347
            raise falcon.HTTPError(falcon.HTTP_400,
348
                'Malformed JSON',
349
                'Could not decode the request body. The '
350
                'JSON was incorrect.')
351
 
15852 kshitij.so 352
        result = Mongo.addSkuDealerPrice(result_json)
13970 kshitij.so 353
        resp.body = json.dumps(result, encoding='utf-8')
354
 
355
    def on_put(self, req, resp, _id):
356
        try:
357
            result_json = json.loads(req.stream.read(), encoding='utf-8')
358
        except ValueError:
359
            raise falcon.HTTPError(falcon.HTTP_400,
360
                'Malformed JSON',
361
                'Could not decode the request body. The '
362
                'JSON was incorrect.')
363
 
364
        result = Mongo.updateSkuDealerPrice(result_json, _id)
365
        resp.body = json.dumps(result, encoding='utf-8')
366
 
367
 
14041 kshitij.so 368
class ResetCache():
369
 
370
    def on_get(self,req, resp, userId):
14044 kshitij.so 371
        result = Mongo.resetCache(userId)
14046 kshitij.so 372
        resp.body = json.dumps(result, encoding='utf-8')
373
 
374
class UserDeals():
375
    def on_get(self,req,resp,userId):
376
        UserSpecificDeals.generateSheet(userId)
377
        json_docs = json.dumps({'True':'Sheet generated, mail sent.'}, default=json_util.default)
378
        resp.body = json.dumps(json_docs, encoding='utf-8')
14075 kshitij.so 379
 
380
class CommonUpdate():
381
 
382
    def on_post(self,req,resp):
14575 kshitij.so 383
 
384
        multi = req.get_param_as_int("multi")
385
 
14075 kshitij.so 386
        try:
387
            result_json = json.loads(req.stream.read(), encoding='utf-8')
388
        except ValueError:
389
            raise falcon.HTTPError(falcon.HTTP_400,
390
                'Malformed JSON',
391
                'Could not decode the request body. The '
392
                'JSON was incorrect.')
393
 
15852 kshitij.so 394
        result = Mongo.updateCollection(result_json)
14075 kshitij.so 395
        resp.body = json.dumps(result, encoding='utf-8')
14106 kshitij.so 396
        resp.content_type = "application/json; charset=utf-8"
14481 kshitij.so 397
 
398
class NegativeDeals():
399
 
400
    def on_get(self, req, resp):
401
 
402
        offset = req.get_param_as_int("offset")
403
        limit = req.get_param_as_int("limit")
404
 
405
        result = Mongo.getAllNegativeDeals(offset, limit)
14483 kshitij.so 406
        resp.body = dumps(result) 
14481 kshitij.so 407
 
408
 
409
    def on_post(self, req, resp):
410
 
14552 kshitij.so 411
        multi = req.get_param_as_int("multi")
412
 
14481 kshitij.so 413
        try:
414
            result_json = json.loads(req.stream.read(), encoding='utf-8')
415
        except ValueError:
416
            raise falcon.HTTPError(falcon.HTTP_400,
417
                'Malformed JSON',
418
                'Could not decode the request body. The '
419
                'JSON was incorrect.')
420
 
14552 kshitij.so 421
        result = Mongo.addNegativeDeals(result_json, multi)
14481 kshitij.so 422
        resp.body = json.dumps(result, encoding='utf-8')
423
 
424
class ManualDeals():
425
 
426
    def on_get(self, req, resp):
427
 
428
        offset = req.get_param_as_int("offset")
429
        limit = req.get_param_as_int("limit")
430
 
431
        result = Mongo.getAllManualDeals(offset, limit)
14483 kshitij.so 432
        resp.body = dumps(result)
14481 kshitij.so 433
 
434
 
435
    def on_post(self, req, resp):
436
 
14552 kshitij.so 437
        multi = req.get_param_as_int("multi")
438
 
14481 kshitij.so 439
        try:
440
            result_json = json.loads(req.stream.read(), encoding='utf-8')
441
        except ValueError:
442
            raise falcon.HTTPError(falcon.HTTP_400,
443
                'Malformed JSON',
444
                'Could not decode the request body. The '
445
                'JSON was incorrect.')
446
 
14552 kshitij.so 447
        result = Mongo.addManualDeal(result_json, multi)
14481 kshitij.so 448
        resp.body = json.dumps(result, encoding='utf-8')
449
 
450
class CommonDelete():
14482 kshitij.so 451
 
14481 kshitij.so 452
    def on_post(self,req,resp):
453
        try:
454
            result_json = json.loads(req.stream.read(), encoding='utf-8')
455
        except ValueError:
456
            raise falcon.HTTPError(falcon.HTTP_400,
457
                'Malformed JSON',
458
                'Could not decode the request body. The '
459
                'JSON was incorrect.')
460
 
461
        result = Mongo.deleteDocument(result_json)
462
        resp.body = json.dumps(result, encoding='utf-8')
463
        resp.content_type = "application/json; charset=utf-8"
14482 kshitij.so 464
 
465
class SearchProduct():
466
 
467
    def on_get(self,req,resp):
468
        offset = req.get_param_as_int("offset")
469
        limit = req.get_param_as_int("limit")
470
        search_term = req.get_param("search")
471
 
472
        result = Mongo.searchMaster(offset, limit, search_term)
14483 kshitij.so 473
        resp.body = dumps(result) 
14482 kshitij.so 474
 
475
 
14495 kshitij.so 476
class FeaturedDeals():
14482 kshitij.so 477
 
14495 kshitij.so 478
    def on_get(self, req, resp):
479
 
480
        offset = req.get_param_as_int("offset")
481
        limit = req.get_param_as_int("limit")
482
 
483
        result = Mongo.getAllFeaturedDeals(offset, limit)
484
        resp.body = dumps(result)
485
 
486
 
487
    def on_post(self, req, resp):
488
 
14552 kshitij.so 489
        multi = req.get_param_as_int("multi")
490
 
14495 kshitij.so 491
        try:
492
            result_json = json.loads(req.stream.read(), encoding='utf-8')
493
        except ValueError:
494
            raise falcon.HTTPError(falcon.HTTP_400,
495
                'Malformed JSON',
496
                'Could not decode the request body. The '
497
                'JSON was incorrect.')
498
 
14552 kshitij.so 499
        result = Mongo.addFeaturedDeal(result_json, multi)
14495 kshitij.so 500
        resp.body = json.dumps(result, encoding='utf-8')
501
 
14497 kshitij.so 502
 
503
class CommonSearch():
14495 kshitij.so 504
 
14497 kshitij.so 505
    def on_get(self,req,resp):
506
        class_name = req.get_param("class")
507
        sku = req.get_param_as_int("sku")
508
        skuBundleId = req.get_param_as_int("skuBundleId")
14499 kshitij.so 509
 
510
        result = Mongo.searchCollection(class_name, sku, skuBundleId)
14497 kshitij.so 511
        resp.body = dumps(result)
14619 kshitij.so 512
 
513
class CricScore():
514
 
515
    def on_get(self,req,resp):
516
 
517
        result = Mongo.getLiveCricScore()
14853 kshitij.so 518
        resp.body = dumps(result)
519
 
520
class Notification():
521
 
522
    def on_post(self, req, resp):
523
 
524
        try:
525
            result_json = json.loads(req.stream.read(), encoding='utf-8')
526
        except ValueError:
527
            raise falcon.HTTPError(falcon.HTTP_400,
528
                'Malformed JSON',
529
                'Could not decode the request body. The '
530
                'JSON was incorrect.')
531
 
532
        result = Mongo.addBundleToNotification(result_json)
533
        resp.body = json.dumps(result, encoding='utf-8')
534
 
535
    def on_get(self, req, resp):
536
 
537
        offset = req.get_param_as_int("offset")
538
        limit = req.get_param_as_int("limit")
539
 
540
        result = Mongo.getAllNotifications(offset, limit)
541
        resp.body = dumps(result)
542
 
14998 kshitij.so 543
class DealBrands():
14853 kshitij.so 544
 
14998 kshitij.so 545
    def on_get(self, req, resp):
546
 
547
        category_id = req.get_param_as_int("category_id")
548
        result = Mongo.getBrandsForFilter(category_id)
14999 kshitij.so 549
        resp.body = dumps(result)
15161 kshitij.so 550
 
551
class DealRank():
14998 kshitij.so 552
 
15161 kshitij.so 553
    def on_get(self, req, resp):
554
        identifier = req.get_param("identifier")
555
        source_id = req.get_param_as_int("source_id")
556
        user_id = req.get_param_as_int("user_id")
557
        result = Mongo.getDealRank(identifier, source_id, user_id)
558
        json_docs = json.dumps(result, default=json_util.default)
559
        resp.body = json_docs
560
 
561
 
16560 amit.gupta 562
class OrderedOffers():
563
    def on_get(self, req, resp, storeId, storeSku):
564
        storeId = int(storeId)
16563 amit.gupta 565
        result = Mongo.getBundleBySourceSku(storeId, storeSku)
566
        json_docs = json.dumps(result, default=json_util.default)
567
        resp.body = json_docs
568
 
15081 amit.gupta 569
class RetailerDetail():
570
    global RETAILER_DETAIL_CALL_COUNTER
15105 amit.gupta 571
    def getRetryRetailer(self,failback=True):
15358 amit.gupta 572
        status = RETRY_MAP.get(self.callType)
17089 amit.gupta 573
        retailer = session.query(Retailers).filter_by(status=status).filter(Retailers.next_call_time<=datetime.now()).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None)).order_by(Retailers.agent_id.desc(),Retailers.call_priority).order_by(Retailers.next_call_time).with_lockmode("update").first()
17029 amit.gupta 574
 
15239 amit.gupta 575
        if retailer is not None:
576
            lgr.info( "getRetryRetailer " + str(retailer.id))
577
        else:
578
            if failback:
579
                retailer = self.getNewRetailer(False)
580
                return retailer
16371 amit.gupta 581
            else:
582
                #No further calls for now
583
                return None
15358 amit.gupta 584
        retailer.status = ASSIGN_MAP.get(status)
16371 amit.gupta 585
        retailer.next_call_time = None
15239 amit.gupta 586
        lgr.info( "getRetryRetailer " + str(retailer.id))
15081 amit.gupta 587
        return retailer
588
 
15662 amit.gupta 589
    def getNotActiveRetailer(self):
590
        try:
15716 amit.gupta 591
            user = session.query(Users).filter_by(activated=0).filter_by(status=1).filter(Users.mobile_number != None).filter(~Users.mobile_number.like("0%")).filter(Users.created>datetime(2015,06,29)).order_by(Users.created.desc()).with_lockmode("update").first()
15662 amit.gupta 592
            if user is None: 
593
                return None
594
            else:
595
                retailerContact = session.query(RetailerContacts).filter_by(mobile_number=user.mobile_number).first()
596
                if retailerContact is not None:
597
                    retailer = session.query(Retailers).filter_by(id=retailerContact.retailer_id).first()
598
                else:
599
                    retailer = session.query(Retailers).filter_by(contact1=user.mobile_number).first()
600
                    if retailer is None:
601
                        retailer = session.query(Retailers).filter_by(contact2=user.mobile_number).first()
602
                        if retailer is None:
603
                            retailer = Retailers()
604
                            retailer.contact1 = user.mobile_number
605
                            retailer.status = 'assigned'
15672 amit.gupta 606
                            retailer.retry_count = 0
15673 amit.gupta 607
                            retailer.invalid_retry_count = 0
15699 amit.gupta 608
                            retailer.is_elavated=1
15662 amit.gupta 609
                user.status = 2
610
                session.commit()
611
                print "retailer id", retailer.id
612
                retailer.contact = user.mobile_number
613
                return retailer
614
        finally:
615
            session.close()
616
 
15081 amit.gupta 617
    def getNewRetailer(self,failback=True):
15663 amit.gupta 618
        if self.callType == 'fresh':
619
            retailer = self.getNotActiveRetailer()
620
            if retailer is not None:
621
                return retailer
15081 amit.gupta 622
        retry = True
623
        retailer = None 
624
        try:
625
            while(retry):
15168 amit.gupta 626
                lgr.info( "Calltype " + self.callType)
15081 amit.gupta 627
                status=self.callType
15545 amit.gupta 628
                query = session.query(Retailers).filter(Retailers.status==status).filter(or_(Retailers.agent_id==self.agentId, Retailers.agent_id==None))
15081 amit.gupta 629
                if status=='fresh':
17030 amit.gupta 630
                    query = query.filter_by(is_or=False, is_std=False).filter(Retailers.pin==Pincodeavailability.code).filter(Pincodeavailability.amount > 19999).order_by(Retailers.is_elavated.desc(), Retailers.agent_id.desc())
15358 amit.gupta 631
                elif status=='followup':
15546 amit.gupta 632
                    query = query.filter(Retailers.next_call_time<=datetime.now()).order_by(Retailers.agent_id.desc(),Retailers.next_call_time)
15162 amit.gupta 633
                else:
15546 amit.gupta 634
                    query = query.filter(Retailers.modified<=datetime.now()).order_by(Retailers.agent_id.desc(), Retailers.modified)
15358 amit.gupta 635
 
15081 amit.gupta 636
                retailer = query.with_lockmode("update").first()
637
                if retailer is not None:
15168 amit.gupta 638
                    lgr.info( "retailer " +str(retailer.id))
15081 amit.gupta 639
                    if status=="fresh":
640
                        userquery = session.query(Users)
641
                        if retailer.contact2 is not None:
642
                            userquery = userquery.filter(Users.mobile_number.in_([retailer.contact1,retailer.contact2]))
643
                        else:
644
                            userquery = userquery.filter_by(mobile_number=retailer.contact1)
645
                        user = userquery.first()
646
                        if user is not None:
647
                            retailer.status = 'alreadyuser'
15168 amit.gupta 648
                            lgr.info( "retailer.status " + retailer.status)
15081 amit.gupta 649
                            session.commit()
650
                            continue
651
                        retailer.status = 'assigned'
15358 amit.gupta 652
                    elif status=='followup':
15276 amit.gupta 653
                        if isActivated(retailer.id):
654
                            print "Retailer Already %d activated and marked onboarded"%(retailer.id)
655
                            continue
15081 amit.gupta 656
                        retailer.status = 'fassigned'
15358 amit.gupta 657
                    else:
658
                        retailer.status = 'oassigned'
15081 amit.gupta 659
                    retailer.retry_count = 0
15123 amit.gupta 660
                    retailer.invalid_retry_count = 0
15168 amit.gupta 661
                    lgr.info( "Found Retailer " +  str(retailer.id) + " with status " + status + " assigned to " + str(self.agentId))
15081 amit.gupta 662
 
663
                else:
15168 amit.gupta 664
                    lgr.info( "No fresh/followup retailers found")
15081 amit.gupta 665
                    if failback:
666
                        retailer = self.getRetryRetailer(False)
15104 amit.gupta 667
                        return retailer
15148 amit.gupta 668
                retry=False
15081 amit.gupta 669
        except:
670
            print traceback.print_exc()
671
        return retailer
672
 
15132 amit.gupta 673
    def on_get(self, req, resp, agentId, callType=None, retailerId=None):
16927 amit.gupta 674
        try:
675
            global RETAILER_DETAIL_CALL_COUNTER
676
            RETAILER_DETAIL_CALL_COUNTER += 1
677
            lgr.info( "RETAILER_DETAIL_CALL_COUNTER " +  str(RETAILER_DETAIL_CALL_COUNTER))
678
            self.agentId = int(agentId)
679
            self.callType = callType
680
            if retailerId is not None:
681
                self.retailerId = int(retailerId)
682
                retailerLink = session.query(RetailerLinks).filter_by(retailer_id=self.retailerId).first()
683
                if retailerLink is not None:
684
                    code = retailerLink.code
685
                else: 
686
                    code = self.getCode()
687
                    retailerLink = RetailerLinks()
688
                    retailerLink.code = code
689
                    retailerLink.agent_id = self.agentId
690
                    retailerLink.retailer_id = self.retailerId
691
 
692
                    activationCode=Activation_Codes()
693
                    activationCode.code = code
694
                    session.commit()
695
                session.close()
696
                resp.body =  json.dumps({"result":{"code":code,"link":make_tiny(code)}}, encoding='utf-8')
697
                return 
698
            retryFlag = False 
699
            if RETAILER_DETAIL_CALL_COUNTER % TOTAL >= DEALER_FRESH_FACTOR:
700
                retryFlag=True
701
            try:
702
                if retryFlag:
703
                    retailer = self.getRetryRetailer()
704
                else:
705
                    retailer = self.getNewRetailer()
706
                if retailer is None:
707
                    resp.body = "{}"
708
                    return
709
                fetchInfo = FetchDataHistory()
710
                fetchInfo.agent_id = self.agentId
711
                fetchInfo.call_type = self.callType
712
                agent = session.query(Agents).filter_by(id=self.agentId).first()
713
                last_disposition = session.query(CallHistory).filter_by(agent_id=self.agentId).order_by(CallHistory.id.desc()).first()
714
                if last_disposition is None or last_disposition.created < agent.last_login:
715
                    fetchInfo.last_action = 'login'
716
                    fetchInfo.last_action_time = agent.last_login 
717
                else:
718
                    fetchInfo.last_action = 'disposition'
719
                    fetchInfo.last_action_time = last_disposition.created
720
                fetchInfo.retailer_id = retailer.id
721
                session.commit()
15135 amit.gupta 722
 
16927 amit.gupta 723
                otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
724
                resp.body = json.dumps(todict(getRetailerObj(retailer, otherContacts, self.callType)), encoding='utf-8')
725
 
726
                return
727
 
728
            finally:
729
                session.close()
730
 
15343 amit.gupta 731
            if retailer is None:
732
                resp.body = "{}"
15239 amit.gupta 733
            else:
16927 amit.gupta 734
                print "It should never come here"
735
                resp.body = json.dumps(todict(getRetailerObj(retailer)), encoding='utf-8')
15239 amit.gupta 736
        finally:
737
            session.close()
15081 amit.gupta 738
 
739
    def on_post(self, req, resp, agentId, callType):
15112 amit.gupta 740
        returned = False
15081 amit.gupta 741
        self.agentId = int(agentId)
742
        self.callType = callType
743
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
15169 amit.gupta 744
        lgr.info( "Request ----\n"  + str(jsonReq))
15091 amit.gupta 745
        self.jsonReq = jsonReq
746
        invalidNumber = self.invalidNumber
747
        callLater = self.callLater
15096 amit.gupta 748
        alreadyUser = self.alReadyUser
15091 amit.gupta 749
        verifiedLinkSent = self.verifiedLinkSent
15368 amit.gupta 750
        onboarded = self.onboarded
15278 amit.gupta 751
        self.address = jsonReq.get('address')
15096 amit.gupta 752
        self.retailerId = int(jsonReq.get('retailerid'))
15671 amit.gupta 753
        self.smsNumber = jsonReq.get('smsnumber')
754
        if self.smsNumber is not None:
755
            self.smsNumber = self.smsNumber.strip().lstrip("0") 
15112 amit.gupta 756
        try:
757
            self.retailer = session.query(Retailers).filter_by(id=self.retailerId).first()
15281 amit.gupta 758
            if self.address:
15278 amit.gupta 759
                self.retailer.address_new = self.address
15112 amit.gupta 760
            self.callDisposition = jsonReq.get('calldispositiontype')
761
            self.callHistory = CallHistory()
762
            self.callHistory.agent_id=self.agentId
763
            self.callHistory.call_disposition = self.callDisposition
764
            self.callHistory.retailer_id=self.retailerId
15115 amit.gupta 765
            self.callHistory.call_type=self.callType
15112 amit.gupta 766
            self.callHistory.duration_sec = int(jsonReq.get("callduration"))
767
            self.callHistory.disposition_description = jsonReq.get('calldispositiondescritption')
15200 manas 768
            self.callHistory.disposition_comments = jsonReq.get('calldispositioncomments')
769
            lgr.info(self.callHistory.disposition_comments)
15112 amit.gupta 770
            self.callHistory.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
771
            self.callHistory.mobile_number = jsonReq.get('number')
15145 amit.gupta 772
            self.callHistory.sms_verified = int(jsonReq.get("verified"))
15234 amit.gupta 773
            lastFetchData = session.query(FetchDataHistory).filter_by(agent_id=self.agentId).order_by(FetchDataHistory.id.desc()).first()
15368 amit.gupta 774
            if self.callDisposition == 'onboarded':
775
                self.checkList = jsonReq.get('checklist')
776
 
15234 amit.gupta 777
            if lastFetchData is None:
778
                raise
779
            self.callHistory.last_fetch_time= lastFetchData.created  
15112 amit.gupta 780
 
781
            dispositionMap = {  'call_later':callLater,
782
                        'ringing_no_answer':callLater,
783
                        'not_reachable':callLater,
784
                        'switch_off':callLater,
15202 manas 785
                        'not_retailer':invalidNumber,
15112 amit.gupta 786
                        'invalid_no':invalidNumber,
787
                        'wrong_no':invalidNumber,
788
                        'hang_up':invalidNumber,
789
                        'retailer_not_interested':invalidNumber,
15200 manas 790
                        'recharge_retailer':invalidNumber,
791
                        'accessory_retailer':invalidNumber,
792
                        'service_center_retailer':invalidNumber,
15112 amit.gupta 793
                        'alreadyuser':alreadyUser,
15368 amit.gupta 794
                        'verified_link_sent':verifiedLinkSent,
795
                        'onboarded':onboarded
15112 amit.gupta 796
                      }
797
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
798
        finally:
799
            session.close()
15096 amit.gupta 800
 
15112 amit.gupta 801
        if returned:
802
            resp.body = "{\"result\":\"success\"}"
803
        else:
804
            resp.body = "{\"result\":\"failed\"}"
15081 amit.gupta 805
 
15091 amit.gupta 806
    def invalidNumber(self,):
15108 manas 807
        #self.retailer.status = 'retry' if self.callType == 'fresh' else 'fretry'
808
        if self.callDisposition == 'invalid_no':
809
            self.retailer.status='failed'
810
            self.callHistory.disposition_description = 'Invalid Number'
811
        elif self.callDisposition == 'wrong_no':
15111 manas 812
            self.retailer.status='failed'
813
            self.callHistory.disposition_description = 'Wrong Number'
814
        elif self.callDisposition == 'hang_up':
815
            self.retailer.status='failed'
816
            self.callHistory.disposition_description = 'Hang Up'
817
        elif self.callDisposition == 'retailer_not_interested':
818
            self.retailer.status='failed'
819
            if self.callHistory.disposition_description is None:
820
                self.callHistory.disposition_description = 'NA'
15200 manas 821
            self.callHistory.disposition_description = 'Reason Retailer Not Interested ' + self.callHistory.disposition_description
822
        elif self.callDisposition == 'recharge_retailer':
823
            self.retailer.status='failed'
824
            self.callHistory.disposition_description = 'Recharge related. Not a retailer '
825
        elif self.callDisposition == 'accessory_retailer':
826
            self.retailer.status='failed'
827
            self.callHistory.disposition_description = 'Accessory related. Not a retailer'
828
        elif self.callDisposition == 'service_center_retailer':
829
            self.retailer.status='failed'
830
            self.callHistory.disposition_description = 'Service Center related. Not a retailer'
15202 manas 831
        elif self.callDisposition == 'not_retailer':
832
            self.retailer.status='failed'
833
            self.callHistory.disposition_description = 'Not a retailer'    
15108 manas 834
        session.commit()
835
        return True   
836
 
15132 amit.gupta 837
    def getCode(self,):
15207 amit.gupta 838
        newCode = None
839
        lastLink = session.query(RetailerLinks).order_by(RetailerLinks.id.desc()).with_lockmode("update").first()
840
        if lastLink is not None:
841
            if len(lastLink.code)==len(codesys):
842
                newCode=lastLink.code
843
        return getNextCode(codesys, newCode)
15108 manas 844
 
15254 amit.gupta 845
 
15091 amit.gupta 846
    def callLater(self,):
15368 amit.gupta 847
        self.retailer.status = RETRY_MAP.get(self.callType)
15100 amit.gupta 848
        self.retailer.call_priority = None
15096 amit.gupta 849
        if self.callDisposition == 'call_later':
15100 amit.gupta 850
            if self.callHistory.disposition_description is not None:
15102 amit.gupta 851
                self.retailer.call_priority = 'user_initiated'
15096 amit.gupta 852
                self.retailer.next_call_time = datetime.strptime(self.callHistory.disposition_description, '%d/%m/%Y %H:%M:%S')
853
                self.callHistory.disposition_description = 'User requested to call on ' + self.callHistory.disposition_description
854
            else:
15102 amit.gupta 855
                self.retailer.call_priority = 'system_initiated'
15096 amit.gupta 856
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
15112 amit.gupta 857
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
858
        else: 
859
            if self.callDisposition == 'ringing_no_answer':
860
                if self.retailer.disposition == 'ringing_no_answer':
861
                    self.retailer.retry_count += 1
862
                else:
863
                    self.retailer.disposition = 'ringing_no_answer'
864
                    self.retailer.retry_count = 1
865
            else:
866
                if self.retailer.disposition == 'ringing_no_answer':
15122 amit.gupta 867
                    pass
15112 amit.gupta 868
                else:
15119 amit.gupta 869
                    self.retailer.disposition = 'not_reachable'
15122 amit.gupta 870
                self.retailer.retry_count += 1
871
                self.retailer.invalid_retry_count += 1
15119 amit.gupta 872
 
15122 amit.gupta 873
            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 874
            if retryConfig is not None:
875
                self.retailer.next_call_time = self.callHistory.call_time + timedelta(minutes = retryConfig.minutes_ahead)
15119 amit.gupta 876
                self.callHistory.disposition_description = 'Call scheduled on ' + datetime.strftime(self.retailer.next_call_time, '%d/%m/%Y %H:%M:%S')
15112 amit.gupta 877
            else:
878
                self.retailer.status = 'failed'
879
                self.callHistory.disposition_description = 'Call failed as all attempts exhausted'
15119 amit.gupta 880
 
15101 amit.gupta 881
        session.commit()
882
        return True
15096 amit.gupta 883
 
15100 amit.gupta 884
 
15091 amit.gupta 885
    def alReadyUser(self,):
15112 amit.gupta 886
        self.retailer.status = self.callDisposition
15117 amit.gupta 887
        if self.callHistory.disposition_description is None:
888
            self.callHistory.disposition_description = 'Retailer already user' 
15112 amit.gupta 889
        session.commit()
890
        return True
15091 amit.gupta 891
    def verifiedLinkSent(self,):
15147 amit.gupta 892
        if self.callType == 'fresh':
893
            self.retailer.status = 'followup'
16882 amit.gupta 894
            if self.retailer.agent_id not in sticky_agents:
895
                self.retailer.agent_id = None
15147 amit.gupta 896
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=1)
897
            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') 
898
        else:
15224 amit.gupta 899
            self.retailer.status = 'followup'
16882 amit.gupta 900
            if self.retailer.agent_id not in sticky_agents:
901
                self.retailer.agent_id = None
15147 amit.gupta 902
            self.retailer.next_call_time = self.callHistory.call_time + timedelta(days=7)
15254 amit.gupta 903
            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 904
        addContactToRetailer(self.agentId, self.retailerId, self.smsNumber, self.callType, 'sms')     
15146 amit.gupta 905
        session.commit()
906
        return True
15368 amit.gupta 907
    def onboarded(self,):
908
        self.retailer.status = self.callDisposition
909
        checkList = OnboardedRetailerChecklists()
910
        checkList.contact_us = self.checkList.get('contactus')
15390 amit.gupta 911
        checkList.doa_return_policy = self.checkList.get('doareturnpolicy')
15368 amit.gupta 912
        checkList.number_verification = self.checkList.get('numberverification')
913
        checkList.payment_option = self.checkList.get('paymentoption')
914
        checkList.preferences = self.checkList.get('preferences')
915
        checkList.product_info = self.checkList.get('productinfo')
15372 amit.gupta 916
        checkList.redeem = self.checkList.get('redeem')
15368 amit.gupta 917
        checkList.retailer_id = self.retailerId
918
        session.commit()
919
        return True
920
 
921
 
15254 amit.gupta 922
def isActivated(retailerId):
15276 amit.gupta 923
    retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailerId).first()
15448 amit.gupta 924
    user = session.query(Users).filter(or_(func.lower(Users.referrer)==retailerLink.code.lower(), Users.utm_campaign==retailerLink.code)).first()
15276 amit.gupta 925
    if user is None:
926
        mobileNumbers = list(session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailerId).all())
927
        user = session.query(Users).filter(Users.mobile_number.in_(mobileNumbers)).first()
15254 amit.gupta 928
        if user is None:
15332 amit.gupta 929
            if retailerLink.created < datetime(2015,5,26):
15333 amit.gupta 930
                historyNumbers = [number for number, in session.query(CallHistory.mobile_number).filter_by(retailer_id = retailerId).all()]
15476 amit.gupta 931
                user = session.query(Users).filter(Users.mobile_number.in_(historyNumbers)).first()
15332 amit.gupta 932
                if user is None:
933
                    return False
15334 amit.gupta 934
                else:
935
                    mapped_with = 'contact'
15332 amit.gupta 936
            else:
937
                return False
15276 amit.gupta 938
        else:
939
            mapped_with = 'contact'
940
    else:
941
        mapped_with = 'code'
942
    retailerLink.mapped_with = mapped_with
15388 amit.gupta 943
    if user.activation_time is not None:
15448 amit.gupta 944
        retailerLink.activated = user.activation_time
945
    retailerLink.activated = user.created
15276 amit.gupta 946
    retailerLink.user_id = user.id
15291 amit.gupta 947
    retailer = session.query(Retailers).filter_by(id=retailerId).first()
15574 amit.gupta 948
    if retailer.status == 'followup' or retailer.status == 'fretry':
15389 amit.gupta 949
        retailer.status = 'onboarding'
16882 amit.gupta 950
        if retailer.agent_id not in sticky_agents:
951
                retailer.agent_id = None
15391 amit.gupta 952
        retailer.call_priority = None
953
        retailer.next_call_time = None
954
        retailer.retry_count = 0
955
        retailer.invalid_retry_count = 0
15276 amit.gupta 956
    session.commit()
15287 amit.gupta 957
    print "retailerLink.retailer_id", retailerLink.retailer_id
15700 amit.gupta 958
    print "retailer", retailer.id
15276 amit.gupta 959
    session.close()
960
    return True
15254 amit.gupta 961
 
962
class AddContactToRetailer():
963
    def on_post(self,req,resp, agentId):
964
        agentId = int(agentId)
965
        try:
966
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
967
            retailerId = int(jsonReq.get("retailerid"))
968
            mobile = jsonReq.get("mobile")
969
            callType = jsonReq.get("calltype")
970
            contactType = jsonReq.get("contacttype")
971
            addContactToRetailer(agentId, retailerId, mobile, callType, contactType)
972
            session.commit()
973
        finally:
974
            session.close()
15676 amit.gupta 975
 
15677 amit.gupta 976
class AddAddressToRetailer():
15676 amit.gupta 977
    def on_post(self,req,resp, agentId):
978
        agentId = int(agentId)
15678 amit.gupta 979
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
980
        retailerId = int(jsonReq.get("retailerid"))
15684 amit.gupta 981
        address = str(jsonReq.get("address"))
982
        storeName = str(jsonReq.get("storename"))
983
        pin = str(jsonReq.get("pin"))
984
        city = str(jsonReq.get("city"))
985
        state = str(jsonReq.get("state"))
986
        updateType = str(jsonReq.get("updatetype"))
15678 amit.gupta 987
        addAddressToRetailer(agentId, retailerId, address, storeName, pin, city,state, updateType)
15254 amit.gupta 988
 
989
def addContactToRetailer(agentId, retailerId, mobile, callType, contactType):
15312 amit.gupta 990
    retailerContact = session.query(RetailerContacts).filter_by(retailer_id=retailerId).filter_by(mobile_number=mobile).first()
991
    if retailerContact is None:
15254 amit.gupta 992
        retailerContact = RetailerContacts()
15256 amit.gupta 993
        retailerContact.retailer_id = retailerId
15254 amit.gupta 994
        retailerContact.agent_id = agentId
995
        retailerContact.call_type = callType
996
        retailerContact.contact_type = contactType
997
        retailerContact.mobile_number = mobile
15312 amit.gupta 998
    else:
15327 amit.gupta 999
        if CONTACT_PRIORITY.index(retailerContact.contact_type) > CONTACT_PRIORITY.index(contactType):
15358 amit.gupta 1000
            retailerContact.contact_type = contactType
15676 amit.gupta 1001
 
1002
def addAddressToRetailer(agentId, retailerId, address, storeName, pin, city,state, updateType):
15679 amit.gupta 1003
    print "I am in addAddress"
15682 amit.gupta 1004
    print agentId, retailerId, address, storeName, pin, city, state, updateType
15679 amit.gupta 1005
    try:
1006
        if updateType=='new':
15685 amit.gupta 1007
            retailer = session.query(Retailers).filter_by(id=retailerId).first()
15679 amit.gupta 1008
            retailer.address = address
1009
            retailer.title = storeName
1010
            retailer.city = city
1011
            retailer.state = state
1012
            retailer.pin = pin
1013
        raddress = RetailerAddresses()
1014
        raddress.address = address
15682 amit.gupta 1015
        raddress.title = storeName
15679 amit.gupta 1016
        raddress.agent_id = agentId
1017
        raddress.city = city
1018
        raddress.pin = pin
1019
        raddress.retailer_id = retailerId
1020
        raddress.state = state
1021
        session.commit()
1022
    finally:
1023
        session.close() 
15254 amit.gupta 1024
 
15312 amit.gupta 1025
 
15189 manas 1026
class Login():
1027
 
1028
    def on_get(self, req, resp, agentId, role):
1029
        try:
15198 manas 1030
            self.agentId = int(agentId)
1031
            self.role = role
1032
            print str(self.agentId) + self.role;
15199 manas 1033
            agents=AgentLoginTimings()
1034
            lastLoginTime = session.query(Agents).filter(Agents.id==self.agentId).first()
1035
            print 'lastLogintime' + str(lastLoginTime)
1036
            agents.loginTime=lastLoginTime.last_login
1037
            agents.logoutTime=datetime.now()
1038
            agents.role =self.role
15282 amit.gupta 1039
            agents.agent_id = self.agentId
15199 manas 1040
            session.add(agents)    
1041
            session.commit()
1042
            resp.body =  json.dumps({"result":{"success":"true","message":"Success"}}, encoding='utf-8')
15189 manas 1043
        finally:
1044
            session.close()        
15112 amit.gupta 1045
 
15189 manas 1046
    def on_post(self,req,resp):
1047
        try:
1048
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1049
            lgr.info( "Request ----\n"  + str(jsonReq))
1050
            email=jsonReq.get('email')
1051
            password = jsonReq.get('password')
1052
            role=jsonReq.get('role')    
15531 amit.gupta 1053
            agent = session.query(Agents).filter(and_(Agents.email==email,Agents.password==password)).first()
1054
            if agent is None:
15189 manas 1055
                resp.body =  json.dumps({"result":{"success":"false","message":"Invalid User"}}, encoding='utf-8')
1056
            else:
15531 amit.gupta 1057
                print agent.id
1058
                checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==agent.id,Agent_Roles.role==role)).first()
15189 manas 1059
                if checkRole is None:
1060
                    resp.body =  json.dumps({"result":{"success":"false","message":"Invalid Role"}}, encoding='utf-8')
1061
                else:
15531 amit.gupta 1062
                    agent.last_login = datetime.now()
1063
                    agent.login_type = role
1064
                    resp.body =  json.dumps({"result":{"success":"true","message":"Valid User","id":agent.id}}, encoding='utf-8')
1065
                    session.commit()
15195 manas 1066
                    #session.query(Agents).filter_by(id = checkUser[0]).    
15189 manas 1067
        finally:
1068
            session.close()    
1069
 
15195 manas 1070
    def test(self,email,password,role):
15189 manas 1071
        checkUser = session.query(Agents.id).filter(and_(Agents.email==email,Agents.password==password)).first()
1072
        if checkUser is None:
1073
            print checkUser
15195 manas 1074
 
15189 manas 1075
        else:
1076
            print checkUser[0]
1077
            checkRole = session.query(Agent_Roles.id).filter(and_(Agent_Roles.agent_id==checkUser[0],Agent_Roles.role==role)).first()
1078
            if checkRole is None:
15195 manas 1079
                pass
15189 manas 1080
            else:
15195 manas 1081
                agents=AgentLoginTimings()
1082
                agents.loginTime=datetime.now()
1083
                agents.logoutTime=datetime.now()
1084
                agents.role =role
1085
                agents.agent_id = 2
1086
                #session.query(AgentLoginTimings).filter_by(id = checkUser[0]).update({"last_login":datetime.now()}, synchronize_session=False)
1087
                session.add(agents)    
1088
                session.commit()
1089
                session.close()
1090
 
1091
                #session.query(Agents).filter(Agents.id==checkUser[0]).update({"last_login":Agents.last_login})
15275 amit.gupta 1092
 
1093
class RetailerActivation():
1094
    def on_get(self, req, resp, userId):
15351 amit.gupta 1095
        res =  markDealerActivation(int(userId))
1096
        if res:
1097
            resp.body = "{\"activated\":true}"
1098
        else:
1099
            resp.body = "{\"activated\":false}"
1100
 
15275 amit.gupta 1101
 
1102
def markDealerActivation(userId):
1103
    try:
15343 amit.gupta 1104
        user = session.query(Users).filter_by(id=userId).first()
15275 amit.gupta 1105
        result = False                
1106
        mappedWith = 'contact'
15534 amit.gupta 1107
        retailer = None
15275 amit.gupta 1108
        if user is not None:
15454 amit.gupta 1109
            referrer = None if user.referrer is None else user.referrer.upper()
1110
            retailerLink = session.query(RetailerLinks).filter(or_(RetailerLinks.code==referrer, RetailerLinks.code==user.utm_campaign)).first()
15275 amit.gupta 1111
            if retailerLink is None:
15501 amit.gupta 1112
                if user.mobile_number is not None:
1113
                    retailerContact = session.query(RetailerContacts).filter_by(mobile_number=user.mobile_number).first()
1114
                    if retailerContact is None:
15613 amit.gupta 1115
                        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 1116
                    else:
1117
                        retailer = session.query(Retailers).filter_by(id = retailerContact.retailer_id).first()
15275 amit.gupta 1118
            else:
1119
                retailer = session.query(Retailers).filter_by(id = retailerLink.retailer_id).first()
1120
                mappedWith='code'
1121
            if retailer is not None:
1122
                retailerLink = session.query(RetailerLinks).filter_by(retailer_id=retailer.id).first()
1123
                if retailerLink is not None:
1124
                    retailerLink.user_id = user.id
1125
                    retailerLink.mapped_with=mappedWith
15358 amit.gupta 1126
                    retailer.status = 'onboarding'
15275 amit.gupta 1127
                    result = True
1128
                    session.commit()
15574 amit.gupta 1129
        return result
15275 amit.gupta 1130
    finally:
1131
        session.close()
1132
 
15189 manas 1133
 
15081 amit.gupta 1134
def todict(obj, classkey=None):
1135
    if isinstance(obj, dict):
1136
        data = {}
1137
        for (k, v) in obj.items():
1138
            data[k] = todict(v, classkey)
1139
        return data
1140
    elif hasattr(obj, "_ast"):
1141
        return todict(obj._ast())
1142
    elif hasattr(obj, "__iter__"):
1143
        return [todict(v, classkey) for v in obj]
1144
    elif hasattr(obj, "__dict__"):
1145
        data = dict([(key, todict(value, classkey)) 
1146
            for key, value in obj.__dict__.iteritems() 
1147
            if not callable(value) and not key.startswith('_')])
1148
        if classkey is not None and hasattr(obj, "__class__"):
1149
            data[classkey] = obj.__class__.__name__
1150
        return data
1151
    else:
1152
        return obj
18256 manas 1153
 
15358 amit.gupta 1154
def getRetailerObj(retailer, otherContacts1=None, callType=None):
15324 amit.gupta 1155
    print "before otherContacts1",otherContacts1
1156
    otherContacts = [] if otherContacts1 is None else otherContacts1
15662 amit.gupta 1157
    print "after otherContacts1",otherContacts
15081 amit.gupta 1158
    obj = Mock()
15280 amit.gupta 1159
    obj.id = retailer.id
15686 amit.gupta 1160
 
1161
 
15314 amit.gupta 1162
    if retailer.contact1 is not None and retailer.contact1 not in otherContacts:
15315 amit.gupta 1163
        otherContacts.append(retailer.contact1)
15314 amit.gupta 1164
    if retailer.contact2 is not None and retailer.contact2 not in otherContacts:
15315 amit.gupta 1165
        otherContacts.append(retailer.contact2)
15323 amit.gupta 1166
    obj.contact1 = None if len(otherContacts)==0 else otherContacts[0]
15325 amit.gupta 1167
    if obj.contact1 is not None:
1168
        obj.contact2 = None if len(otherContacts)==1 else otherContacts[1]
15096 amit.gupta 1169
    obj.scheduled = (retailer.call_priority is not None)
15686 amit.gupta 1170
    address = None
1171
    try:
1172
        address = session.query(RetailerAddresses).filter_by(retailer_id=retailer.id).order_by(RetailerAddresses.created.desc()).first()
1173
    finally:
1174
        session.close()
1175
    if address is not None:
1176
        obj.address = address.address
1177
        obj.title = address.title
1178
        obj.city = address.city
1179
        obj.state = address.state
1180
        obj.pin = address.pin 
1181
    else:
1182
        obj.address = retailer.address_new if retailer.address_new is not None else retailer.address
1183
        obj.title = retailer.title
1184
        obj.city = retailer.city
1185
        obj.state = retailer.state
1186
        obj.pin = retailer.pin 
15699 amit.gupta 1187
    obj.status = retailer.status
15686 amit.gupta 1188
 
15662 amit.gupta 1189
    if hasattr(retailer, 'contact'):
1190
        obj.contact = retailer.contact
15358 amit.gupta 1191
    if callType == 'onboarding':
1192
        try:
15364 amit.gupta 1193
            userId, activatedTime = session.query(RetailerLinks.user_id, RetailerLinks.activated).filter(RetailerLinks.retailer_id==retailer.id).first()
15366 amit.gupta 1194
            activated, = session.query(Users.activation_time).filter(Users.id==userId).first()
15364 amit.gupta 1195
            if activated is not None:
15366 amit.gupta 1196
                activatedTime = activated
15362 amit.gupta 1197
            obj.user_id = userId
15364 amit.gupta 1198
            obj.created = datetime.strftime(activatedTime, '%d/%m/%Y %H:%M:%S')
15358 amit.gupta 1199
            result = fetchResult("select * from useractive where user_id=%d"%(userId))
1200
            if result == ():
1201
                obj.last_active = None
1202
            else:
15360 amit.gupta 1203
                obj.last_active =datetime.strftime(result[0][1], '%d/%m/%Y %H:%M:%S')
15361 amit.gupta 1204
            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 1205
            obj.orders = ordersCount
1206
        finally:
1207
            session.close()
15081 amit.gupta 1208
    return obj
15091 amit.gupta 1209
 
15132 amit.gupta 1210
def make_tiny(code):
16939 manish.sha 1211
    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
16881 manas 1212
    #url='https://play.google.com/store/apps/details?id=com.saholic.profittill&referrer=utm_source=0&utm_medium=CRM&utm_term=001&utm_campaign='+code
16939 manish.sha 1213
    #marketUrl='market://details?id=com.saholic.profittill&referrer=utm_source=0&utm_medium=CRM&utm_term=001&utm_campaign='+code
1214
    #url = urllib.quote(marketUrl)
15465 amit.gupta 1215
    #request_url = ('http://tinyurl.com/api-create.php?' + urlencode({'url':url}))
1216
    #filehandle = urllib2.Request(request_url)
1217
    #x= urllib2.urlopen(filehandle)
15546 amit.gupta 1218
    try:
1219
        shortener = Shortener('TinyurlShortener')
1220
        returnUrl =  shortener.short(url)
1221
    except:
1222
        shortener = Shortener('SentalaShortener')
1223
        returnlUrl =  shortener.short(url)
1224
    return returnUrl
15171 amit.gupta 1225
 
15285 manas 1226
class SearchUser():
1227
 
1228
    def on_post(self, req, resp, agentId, searchType):
15314 amit.gupta 1229
        retailersJsonArray = []
15285 manas 1230
        try:
1231
            jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1232
            lgr.info( "Request in Search----\n"  + str(jsonReq))
15302 amit.gupta 1233
            contact=jsonReq.get('searchTerm')
15285 manas 1234
            if(searchType=="number"):
15312 amit.gupta 1235
                retailer_ids = session.query(RetailerContacts.retailer_id).filter_by(mobile_number=contact).all()
1236
                retailer_ids = [r for r, in retailer_ids]    
1237
                anotherCondition = or_(Retailers.contact1==contact,Retailers.contact2==contact, Retailers.id.in_(retailer_ids))
1238
            else:
1239
                m = re.match("(.*?)(\d{6})(.*?)", contact)
1240
                if m is not None:
1241
                    pin = m.group(2)
1242
                    contact = m.group(1) if m.group(1) != '' else m.group(3)
15313 amit.gupta 1243
                    anotherCondition = and_(Retailers.title.ilike('%%%s%%'%(contact)), Retailers.pin==pin)
15312 amit.gupta 1244
                else:
1245
                    anotherCondition = Retailers.title.ilike('%%%s%%'%(contact))
15297 amit.gupta 1246
 
15326 amit.gupta 1247
            retailers = session.query(Retailers).filter(anotherCondition).limit(20).all()
15312 amit.gupta 1248
            if retailers is None:
15285 manas 1249
                resp.body = json.dumps("{}")
15312 amit.gupta 1250
            else:
1251
                for retailer in retailers:
15326 amit.gupta 1252
                    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 1253
                    retailersJsonArray.append(todict(getRetailerObj(retailer, otherContacts)))    
1254
            resp.body = json.dumps({"Retailers":retailersJsonArray}, encoding='utf-8')
15312 amit.gupta 1255
            return
15285 manas 1256
        finally:
1257
            session.close()
15171 amit.gupta 1258
 
15081 amit.gupta 1259
 
1260
class Mock(object):
1261
    pass
15189 manas 1262
 
15312 amit.gupta 1263
def tagActivatedReatilers():
15613 amit.gupta 1264
    retailerIds = [r for  r, in session.query(RetailerLinks.retailer_id).filter_by(user_id = None).all()]
15312 amit.gupta 1265
    session.close()
15288 amit.gupta 1266
    for retailerId in retailerIds:
1267
        isActivated(retailerId)
15312 amit.gupta 1268
    session.close()
15374 kshitij.so 1269
 
1270
class StaticDeals():
1271
 
1272
    def on_get(self, req, resp):
1273
 
1274
        offset = req.get_param_as_int("offset")
1275
        limit = req.get_param_as_int("limit")
1276
        categoryId = req.get_param_as_int("categoryId")
15458 kshitij.so 1277
        direction = req.get_param_as_int("direction")
15374 kshitij.so 1278
 
15458 kshitij.so 1279
        result = Mongo.getStaticDeals(offset, limit, categoryId, direction)
15374 kshitij.so 1280
        resp.body = dumps(result)
1281
 
16366 kshitij.so 1282
class DealNotification():
1283
 
1284
    def on_get(self,req,resp,skuBundleIds):
1285
        result = Mongo.getDealsForNotification(skuBundleIds)
1286
        resp.body = dumps(result)
16487 kshitij.so 1287
 
1288
class DealPoints():
1289
 
1290
    def on_get(self, req, resp):
16366 kshitij.so 1291
 
16487 kshitij.so 1292
        offset = req.get_param_as_int("offset")
1293
        limit = req.get_param_as_int("limit")
1294
 
1295
        result = Mongo.getAllBundlesWithDealPoints(offset, limit)
1296
        resp.body = dumps(result)
15374 kshitij.so 1297
 
16487 kshitij.so 1298
 
1299
    def on_post(self, req, resp):
1300
 
1301
 
1302
        try:
1303
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1304
        except ValueError:
1305
            raise falcon.HTTPError(falcon.HTTP_400,
1306
                'Malformed JSON',
1307
                'Could not decode the request body. The '
1308
                'JSON was incorrect.')
1309
 
1310
        result = Mongo.addDealPoints(result_json)
1311
        resp.body = json.dumps(result, encoding='utf-8')
15374 kshitij.so 1312
 
16545 kshitij.so 1313
class AppAffiliates():
1314
 
1315
    def on_get(self, req, resp, retailerId, appId):
1316
        retailerId = int(retailerId)
1317
        appId = int(appId)
16554 kshitij.so 1318
        call_back = req.get_param("callback")
16545 kshitij.so 1319
        result = Mongo.generateRedirectUrl(retailerId, appId)
16555 kshitij.so 1320
        resp.body = call_back+'('+str(result)+')'
16557 kshitij.so 1321
 
1322
class AffiliatePayout():
1323
    def on_get(self, req, resp):
1324
        payout = req.get_param("payout")
1325
        transaction_id = req.get_param("transaction_id")
1326
        result = Mongo.addPayout(payout, transaction_id)
1327
        resp.body = str(result)
1328
 
16581 manish.sha 1329
class AppOffers():
1330
    def on_get(self, req, resp, retailerId):
16895 manish.sha 1331
        try:            
1332
            result = Mongo.getAppOffers(retailerId)
1333
            offerids = result.values()
1334
            if offerids is None or len(offerids)==0:
16887 kshitij.so 1335
                resp.body = json.dumps("{}")
1336
            else:
16941 manish.sha 1337
                appOffers = session.query(app_offers.id,app_offers.appmaster_id, app_offers.app_name, app_offers.affiliate_offer_id, app_offers.image_url, app_offers.downloads, app_offers.link, app_offers.offer_price, app_offers.offerCategory, app_offers.package_name, app_offers.promoImage, app_offers.ratings, case([(app_offers.override_payout == True, app_offers.overriden_payout)], else_=app_offers.user_payout).label('user_payout'), case([(appmasters.shortDescription != None, appmasters.shortDescription)], else_=None).label('shortDescription'), case([(appmasters.longDescription != None, appmasters.longDescription)], else_=None).label('longDescription'), appmasters.customerOneLiner, appmasters.retailerOneLiner,appmasters.rank, app_offers.offerCondition, app_offers.location).join((appmasters,appmasters.id==app_offers.appmaster_id)).filter(app_offers.id.in_(tuple(offerids))).all()
16895 manish.sha 1338
                appOffersMap = {}
1339
                jsonOffersArray=[]
1340
                for offer in appOffers:
1341
                    appOffersMap[long(offer[0])]= AppOfferObj(offer[0], offer[1], offer[2], offer[3], offer[4], offer[5], offer[6], offer[7], offer[8], offer[9], offer[10], offer[11], offer[12], offer[13], offer[14], offer[15], offer[16], offer[17], offer[18], offer[19]).__dict__
1342
                for rank in sorted(result):
1343
                    print 'Rank', rank, 'Data', appOffersMap[result[rank]]
1344
                    jsonOffersArray.append(appOffersMap[result[rank]])
1345
 
1346
            resp.body = json.dumps({"AppOffers":jsonOffersArray}, encoding='latin1')
16887 kshitij.so 1347
        finally:
1348
            session.close()
1349
 
16727 manish.sha 1350
 
1351
class AppUserBatchRefund():
1352
    def on_get(self, req, resp, batchId, userId):
16887 kshitij.so 1353
        try:
1354
            batchId = long(batchId)
1355
            userId = long(userId)
1356
            userBatchCashback = user_app_cashbacks.get_by(user_id=userId, batchCreditId=batchId)
1357
            if userBatchCashback is None:
1358
                resp.body = json.dumps("{}")
1359
            else:
16905 manish.sha 1360
                if userBatchCashback.creditedDate is not None:
1361
                    userBatchCashback.creditedDate = str(userBatchCashback.creditedDate)
16887 kshitij.so 1362
                resp.body = json.dumps(todict(userBatchCashback), encoding='utf-8')
1363
        finally:
1364
            session.close()
16727 manish.sha 1365
 
1366
class AppUserBatchDrillDown():
16777 manish.sha 1367
    def on_get(self, req, resp, fortNightOfYear, userId, yearVal):
16887 kshitij.so 1368
        try:
1369
            fortNightOfYear = long(fortNightOfYear)
1370
            userId = long(userId)
1371
            yearVal = long(yearVal)
1372
            appUserBatchDrillDown = session.query(user_app_installs.transaction_date, func.sum(user_app_installs.installCount).label('downloads'), func.sum(user_app_installs.payoutAmount).label('amount')).join((user_app_cashbacks,user_app_cashbacks.user_id==user_app_installs.user_id)).filter(user_app_cashbacks.fortnightOfYear==user_app_installs.fortnightOfYear).filter(user_app_cashbacks.user_id==userId).filter(user_app_cashbacks.yearVal==yearVal).filter(user_app_cashbacks.fortnightOfYear==fortNightOfYear).group_by(user_app_installs.transaction_date).all()
1373
            cashbackArray = []
1374
            if appUserBatchDrillDown is None or len(appUserBatchDrillDown)==0:
1375
                resp.body = json.dumps("{}")
1376
            else:
1377
                for appcashBack in appUserBatchDrillDown:
1378
                    userAppBatchDrillDown = UserAppBatchDrillDown(str(appcashBack[0]),long(appcashBack[1]), long(appcashBack[2]))
1379
                    cashbackArray.append(todict(userAppBatchDrillDown))
1380
                resp.body = json.dumps({"UserAppCashBackInBatch":cashbackArray}, encoding='utf-8')
1381
        finally:
1382
            session.close()
16727 manish.sha 1383
 
1384
class AppUserBatchDateDrillDown():
1385
    def on_get(self, req, resp, userId, date):
16887 kshitij.so 1386
        try:
1387
            userId = long(userId)
1388
            date = str(date)
1389
            date = datetime.strptime(date, '%Y-%m-%d')
1390
            appUserBatchDateDrillDown = session.query(user_app_installs.app_name, func.sum(user_app_installs.installCount).label('downloads'), func.sum(user_app_installs.payoutAmount).label('amount')).filter(user_app_installs.user_id==userId).filter(user_app_installs.transaction_date==date).group_by(user_app_installs.app_name).all()
1391
            cashbackArray = []
1392
            if appUserBatchDateDrillDown is None or len(appUserBatchDateDrillDown)==0:
1393
                resp.body = json.dumps("{}")
1394
            else:
1395
                for appcashBack in appUserBatchDateDrillDown:
1396
                    userAppBatchDateDrillDown = UserAppBatchDateDrillDown(str(appcashBack[0]),long(appcashBack[1]),long(appcashBack[2]))
1397
                    cashbackArray.append(todict(userAppBatchDateDrillDown))
1398
                resp.body = json.dumps({"UserAppCashBackDateWise":cashbackArray}, encoding='utf-8')
1399
        finally:
1400
            session.close()
16739 manish.sha 1401
 
16748 manish.sha 1402
class AppUserCashBack():
1403
    def on_get(self, req, resp, userId, status):
16887 kshitij.so 1404
        try:
1405
            userId = long(userId)
1406
            status = str(status)
1407
            appUserApprovedCashBacks = user_app_cashbacks.query.filter(user_app_cashbacks.user_id==userId).filter(user_app_cashbacks.status==status).all()
1408
            cashbackArray = []
1409
            if appUserApprovedCashBacks is None or len(appUserApprovedCashBacks)==0:
1410
                resp.body = json.dumps("{}")
1411
            else:
1412
                totalAmount = 0                
1413
                for appUserApprovedCashBack in appUserApprovedCashBacks:
1414
                    totalAmount = totalAmount + appUserApprovedCashBack.amount
16895 manish.sha 1415
                    if appUserApprovedCashBack.creditedDate is not None:
1416
                        appUserApprovedCashBack.creditedDate = str(appUserApprovedCashBack.creditedDate)  
16905 manish.sha 1417
                    cashbackArray.append(todict(appUserApprovedCashBack)) 
1418
 
16887 kshitij.so 1419
                resp.body = json.dumps({"UserAppCashBack":cashbackArray,"TotalAmount":totalAmount}, encoding='utf-8')
1420
        finally:
1421
            session.close()
17278 naman 1422
 
1423
class GetSaleDetail():
1424
    def on_get(self,req,res,date_val):
1425
        try:
1426
                db = get_mongo_connection()
1427
                sum=0
1428
                count=0
1429
                #print date_val, type(date_val)
1430
                #cursor = db.Dtr.merchantOrder.find({'createdOnInt':{'$lt':long(date_val)},'subOrders':{'$exists':True}})
17315 naman 1431
                cursor = db.Dtr.merchantOrder.find({"$and": [ { "createdOnInt":{"$gt":long(date_val)} }, {"createdOnInt":{"$lt":long(date_val)+86401} } ],"subOrders":{"$exists":True}})
17278 naman 1432
 
1433
                for document in cursor:
1434
                    for doc in document['subOrders']:
1435
                        sum = sum + float(doc['amountPaid'])
1436
                        count = count + int(doc['quantity'])
1437
 
1438
                data = {"amount":sum , "quantity":count}
1439
 
1440
                res.body= json.dumps(data,encoding='utf-8')
1441
        finally:
1442
                session.close()
1443
 
17301 kshitij.so 1444
class DummyDeals():
17304 kshitij.so 1445
    def on_get(self,req, resp):
17301 kshitij.so 1446
        categoryId = req.get_param_as_int("categoryId")
1447
        offset = req.get_param_as_int("offset")
1448
        limit = req.get_param_as_int("limit")
1449
        result = Mongo.getDummyDeals(categoryId, offset, limit)
17556 kshitij.so 1450
        resp.body = dumps(result)
17301 kshitij.so 1451
 
17467 manas 1452
class PincodeValidation():
17498 amit.gupta 1453
    def on_get(self,req,resp,pincode):
17467 manas 1454
        json_data={}
1455
        cities=[]
1456
        print pincode
1457
        if len(str(pincode)) ==6:
19391 amit.gupta 1458
            listCities = list(session.query(Postoffices.taluk,Postoffices.state).distinct().filter(Postoffices.pincode==pincode).all())
17467 manas 1459
            if len(listCities)>0:
1460
                for j in listCities:
19391 amit.gupta 1461
                    if j.taluk != 'NA':
1462
                        cities.append(j.taluk)
17467 manas 1463
                json_data['cities'] = cities
1464
                json_data['state'] = listCities[0][1]
1465
                resp.body =  json.dumps(json_data)
1466
            else:
1467
                resp.body = json.dumps("{}")       
1468
        else:
1469
            resp.body = json.dumps("{}")
1470
        session.close()
17301 kshitij.so 1471
 
17556 kshitij.so 1472
class SearchDummyDeals():
1473
    def on_get(self,req,resp):
1474
        offset = req.get_param_as_int("offset")
1475
        limit = req.get_param_as_int("limit")
1476
        searchTerm = req.get_param("searchTerm")
1477
        result = Mongo.searchDummyDeals(searchTerm, limit, offset)
1478
        resp.body = dumps(result)
1479
 
1480
class DummyPricing:
17560 kshitij.so 1481
    def on_get(self, req, resp):
17556 kshitij.so 1482
        skuBundleId = req.get_param_as_int("skuBundleId")
1483
        result = Mongo.getDummyPricing(skuBundleId)
1484
        resp.body = dumps(result)
1485
 
1486
class DealObject:
17560 kshitij.so 1487
    def on_post(self, req, resp):
17569 kshitij.so 1488
        update = req.get_param_as_int("update")
17556 kshitij.so 1489
        try:
1490
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1491
        except ValueError:
1492
            raise falcon.HTTPError(falcon.HTTP_400,
1493
                'Malformed JSON',
1494
                'Could not decode the request body. The '
1495
                'JSON was incorrect.')
17569 kshitij.so 1496
        if update is None:    
1497
            result = Mongo.addDealObject(result_json)
1498
        else:
1499
            result = Mongo.updateDealObject(result_json)
1500
 
17556 kshitij.so 1501
        resp.body = dumps(result)
17569 kshitij.so 1502
 
17556 kshitij.so 1503
 
17560 kshitij.so 1504
    def on_get(self, req, resp):
17567 kshitij.so 1505
        edit = req.get_param_as_int("edit")
1506
        if edit is None:
1507
            offset = req.get_param_as_int("offset")
1508
            limit = req.get_param_as_int("limit")
17560 kshitij.so 1509
 
17567 kshitij.so 1510
            result = Mongo.getAllDealObjects(offset, limit)
1511
            resp.body = dumps(result)
1512
        else:
1513
            id = req.get_param_as_int("id")
1514
            result = Mongo.getDealObjectById(id)
1515
            resp.body = dumps(result)
17560 kshitij.so 1516
 
17563 kshitij.so 1517
class DeleteDealObject:
1518
    def on_get(self, req, resp, id):
1519
        result = Mongo.deleteDealObject(int(id))
1520
        resp.body = dumps(result)
1521
 
17611 kshitij.so 1522
class FeaturedDealObject:
1523
    def on_get(self, req, resp):
1524
 
1525
        offset = req.get_param_as_int("offset")
1526
        limit = req.get_param_as_int("limit")
1527
 
1528
        result = Mongo.getAllFeaturedDealsForDealObject(offset, limit)
1529
        resp.body = dumps(result)
1530
 
17556 kshitij.so 1531
 
17611 kshitij.so 1532
    def on_post(self, req, resp):
1533
 
1534
 
1535
        try:
1536
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1537
        except ValueError:
1538
            raise falcon.HTTPError(falcon.HTTP_400,
1539
                'Malformed JSON',
1540
                'Could not decode the request body. The '
1541
                'JSON was incorrect.')
1542
 
17613 kshitij.so 1543
        result = Mongo.addFeaturedDealForDealObject(result_json)
17611 kshitij.so 1544
        resp.body = json.dumps(result, encoding='utf-8')
1545
 
17615 kshitij.so 1546
class DeleteFeaturedDealObject:
1547
    def on_get(self, req, resp, id):
1548
        result = Mongo.deleteFeaturedDealObject(int(id))
1549
        resp.body = dumps(result)
17611 kshitij.so 1550
 
17653 kshitij.so 1551
class SubCategoryFilter:
1552
    def on_get(self, req, resp):
1553
        category_id = req.get_param_as_int("category_id")
1554
        result = Mongo.getSubCategoryForFilter(category_id)
1555
        resp.body = dumps(result)
1556
 
17726 kshitij.so 1557
class DummyLogin:
1558
    def on_post(self,req,resp):
1559
        try:
1560
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1561
        except ValueError:
1562
            raise falcon.HTTPError(falcon.HTTP_400,
1563
                'Malformed JSON',
1564
                'Could not decode the request body. The '
1565
                'JSON was incorrect.')
1566
 
1567
        result = Mongo.dummyLogin(result_json)
1568
        resp.body = json.dumps(result, encoding='utf-8')
17653 kshitij.so 1569
 
17726 kshitij.so 1570
class DummyRegister:
1571
    def on_post(self,req,resp):
1572
        try:
1573
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1574
        except ValueError:
1575
            raise falcon.HTTPError(falcon.HTTP_400,
1576
                'Malformed JSON',
1577
                'Could not decode the request body. The '
1578
                'JSON was incorrect.')
1579
 
1580
        result = Mongo.dummyRegister(result_json)
1581
        resp.body = json.dumps(result, encoding='utf-8')
1582
 
18896 amit.gupta 1583
class TinSearch:
1584
    def on_get(self,req,resp):
1585
        tin = req.get_param("tin")
1586
        result = getTinInfo(tin)
1587
        resp.body = json.dumps(result, encoding='utf-8')
1588
 
1589
 
1590
def getTinInfo(tin):
18905 amit.gupta 1591
    tinInfo = {"isError":False}
18896 amit.gupta 1592
    try:
18902 amit.gupta 1593
        params = ['tin','cst','counter_name','counter_address','state','pan','registered_on','cst_status','valid_since']
18896 amit.gupta 1594
        url  = "http://www.tinxsys.com/TinxsysInternetWeb/dealerControllerServlet?tinNumber=" + tin + "&searchBy=TIN"
1595
        req = urllib2.Request(url)
18995 amit.gupta 1596
        try:
1597
            connection = urllib2.urlopen(req, timeout=10)
1598
        except:
1599
            tinInfo = {"isError":True,
1600
                    "errorMsg": "Some problem occurred. Try again after some time"
1601
            }
18996 amit.gupta 1602
            return tinInfo
18896 amit.gupta 1603
        pageHtml = connection.read()
1604
        connection.close()        
1605
        doc = pq(pageHtml)
1606
        index=-1
1607
        for ele in pq(doc.find('table')[2])('tr td:nth-child(2)'):
1608
            index += 1
1609
            text = pq(ele).text().strip()
1610
            if not text:
1611
                text = pq(ele)('div').text().strip()
1612
            tinInfo[params[index]] = text
18901 amit.gupta 1613
        print index, "index"
1614
        if index != 8:
18896 amit.gupta 1615
            raise
19000 amit.gupta 1616
        if not get_mongo_connection().Dtr.tin.find({"tin":tinInfo['tin']}):
1617
            get_mongo_connection().Dtr.tin.insert(tinInfo)
18932 amit.gupta 1618
        address = tinInfo['counter_address']
1619
        m = re.match(".*?(\d{6}).*?", address)
1620
        if m:
1621
            tinInfo['pin'] = m.group(1)
18936 amit.gupta 1622
            tinInfo['pin_required'] = False
18932 amit.gupta 1623
        else:
18936 amit.gupta 1624
            tinInfo['pin_required'] = True
18932 amit.gupta 1625
 
18896 amit.gupta 1626
        print "TinNumber: Successfully fetched details", tin
1627
    except:
18901 amit.gupta 1628
        traceback.print_exc()
18896 amit.gupta 1629
        tinInfo = {"isError":True,
1630
                    "errorMsg": "Could not find tin"
1631
        }
1632
        print "TinNumber: Problem fetching details", tin
1633
    return tinInfo
1634
 
1635
 
17730 kshitij.so 1636
class UpdateUser:
1637
    def on_post(self,req,resp):
1638
        try:
1639
            result_json = json.loads(req.stream.read(), encoding='utf-8')
1640
        except ValueError:
1641
            raise falcon.HTTPError(falcon.HTTP_400,
1642
                'Malformed JSON',
1643
                'Could not decode the request body. The '
1644
                'JSON was incorrect.')
1645
 
1646
        result = Mongo.updateDummyUser(result_json)
1647
        resp.body = json.dumps(result, encoding='utf-8')
1648
 
1649
class FetchUser:
1650
    def on_get(self,req,resp):
1651
        user_id = req.get_param_as_int("user_id")
1652
        result = Mongo.getDummyUser(user_id)
1653
        resp.body = json.dumps(result, encoding='utf-8')
17928 kshitij.so 1654
 
1655
class SearchSubCategory:
1656
    def on_get(self,req, resp):
18088 kshitij.so 1657
        subCategoryIds = req.get_param("subCategoryId")
17928 kshitij.so 1658
        searchTerm = req.get_param("searchTerm")
1659
        offset = req.get_param_as_int("offset")
1660
        limit = req.get_param_as_int("limit")
17730 kshitij.so 1661
 
18088 kshitij.so 1662
        result = Mongo.getDealsForSearchText(subCategoryIds, searchTerm,offset, limit)
17928 kshitij.so 1663
        resp.body = json.dumps(result, encoding='utf-8')
1664
 
1665
class SearchSubCategoryCount:
1666
    def on_get(self,req, resp):
18088 kshitij.so 1667
        subCategoryIds = req.get_param("subCategoryId")
17928 kshitij.so 1668
        searchTerm = req.get_param("searchTerm")
18088 kshitij.so 1669
        result = Mongo.getCountForSearchText(subCategoryIds, searchTerm)
17928 kshitij.so 1670
        resp.body = json.dumps(result, encoding='utf-8')
18090 manas 1671
 
1672
class MessageEncryption:
1673
 
1674
    def on_get(self,req,resp):
1675
        message_type = req.get_param("type")
18093 manas 1676
        if message_type == 'encrypt':
18090 manas 1677
            encryption_data = req.get_param("data")
18101 manas 1678
            encrypted_data = encryptMessage(base64.decodestring(encryption_data))
18090 manas 1679
            resp.body =  json.dumps({"result":{"value":encrypted_data}}, encoding='utf-8')
1680
 
18093 manas 1681
        elif message_type == 'decrypt':
18090 manas 1682
            decryption_data = req.get_param("data")
1683
            decrypted_data = decryptMessage(decryption_data)
1684
            resp.body =  json.dumps({"result":{"value":decrypted_data}}, encoding='utf-8')
1685
 
1686
        else:
1687
            resp.body = json.dumps({}, encoding='utf-8')
18256 manas 1688
 
1689
class GetUserCrmApplication:
19442 manas 1690
 
18256 manas 1691
    def on_get(self,req,resp):
18329 manas 1692
        global USER_DETAIL_MAP
18256 manas 1693
        project_name = req.get_param("project_name")
18329 manas 1694
        USER_DETAIL_MAP[project_name]+=1
18386 manas 1695
        lgr.info( "USER_DETAIL_CALL_COUNTER " +  str(USER_DETAIL_MAP[project_name]))
18329 manas 1696
        retryFlag=False
1697
        if USER_DETAIL_MAP[project_name] % TOTAL_USER >= USER_CRM_DEFAULT_FRESH_FACTOR:
1698
                retryFlag=True
1699
        if project_name == 'accs_cart':
18792 manas 1700
            project_id=1
1701
        elif project_name == 'accs_active':
1702
            project_id=2
1703
        elif project_name == 'accs_order':
1704
            project_id=3
19442 manas 1705
        elif project_name == 'accs_cashback_scheme':
1706
            project_id=4
18792 manas 1707
        if retryFlag:
1708
            user = self.getRetryUser(project_id)
1709
        else:
1710
            user = self.getNewUser(project_id)
1711
 
1712
        if user is None:
1713
            resp.body ={}
1714
        else:        
1715
            user.status =  'assigned'
1716
            user.agent_id = req.get_param("agent_id")
1717
            user.counter=1
1718
            user.modified = datetime.now()
1719
            session.commit()
1720
            resp.body = json.dumps(todict(getUserObject(user)), encoding='utf-8')
1721
            session.close()
18620 manas 1722
 
18329 manas 1723
    def getRetryUser(self,projectId,failback=True):
1724
        status = "retry"
18367 manas 1725
        user = session.query(UserCrmCallingData).filter_by(status=status,project_id=projectId).filter(UserCrmCallingData.next_call_time<=datetime.now()).filter(~(UserCrmCallingData.contact1).like('')).order_by(UserCrmCallingData.next_call_time).with_lockmode("update").first()
18329 manas 1726
 
1727
        if user is not None:
18334 manas 1728
            lgr.info( "getRetryUser " + str(user.id))
18329 manas 1729
        else:
1730
            if failback:
18334 manas 1731
                user = self.getNewUser(projectId,False)
18329 manas 1732
                return user
1733
            else:
1734
                return None
1735
        return user
18291 manas 1736
 
18329 manas 1737
 
18331 manas 1738
    def getNewUser(self,projectId,failback=True):
18329 manas 1739
            user = None 
1740
            try:
18416 manas 1741
                user = session.query(UserCrmCallingData).filter_by(project_id=projectId).filter(UserCrmCallingData.status=='new').filter(UserCrmCallingData.pincode_servicable==True).filter(UserCrmCallingData.user_available==0).filter(UserCrmCallingData.contact1!=None).filter(~(UserCrmCallingData.contact1).like('')).order_by(UserCrmCallingData.next_call_time).order_by(UserCrmCallingData.id).with_lockmode("update").first()
18334 manas 1742
                if user is None:
1743
                    insertUserCrmData(projectId)
18416 manas 1744
                    user = session.query(UserCrmCallingData).filter_by(project_id=projectId).filter(UserCrmCallingData.status=='new').filter(UserCrmCallingData.pincode_servicable==True).filter(~(UserCrmCallingData.contact1).like('')).filter(UserCrmCallingData.user_available==0).filter(UserCrmCallingData.contact1!=None).order_by(UserCrmCallingData.next_call_time).order_by(UserCrmCallingData.id).with_lockmode("update").first()
18334 manas 1745
                    if user is not None:
1746
                        lgr.info( "getNewUser " + str(user.id))
1747
                    else:
1748
                        if failback:
1749
                            user = self.getRetryUser(projectId,False)
1750
                            return user
1751
                        else:
1752
                            return None
18329 manas 1753
            except:
1754
                print traceback.print_exc()
1755
            return user    
18386 manas 1756
 
18291 manas 1757
    def on_post(self, req, resp):
1758
        returned = False
1759
        self.agentId = req.get_param("agent_id")
1760
        project_name = req.get_param("project_name")
18637 manas 1761
 
18329 manas 1762
        if project_name == 'accs_cart':
18637 manas 1763
            project_id=1
1764
        elif project_name == 'accs_active':
1765
            project_id=2            
1766
        elif project_name == 'accs_order':
1767
            project_id=3            
19442 manas 1768
        elif project_name == 'accs_cashback_scheme':
1769
            project_id=4
1770
 
18637 manas 1771
        jsonReq = json.loads(req.stream.read(), encoding='utf-8')
1772
        lgr.info( "Request ----\n"  + str(jsonReq))
1773
        self.jsonReq = jsonReq
1774
        self.callType="default"
1775
        callLaterAccs = self.callLaterAccs
1776
        accsDisposition = self.accsDisposition
1777
        accsOrderDisposition=self.accsOrderDisposition
1778
        self.userId = int(jsonReq.get('user_id'))
1779
        try:
1780
            self.user = session.query(UserCrmCallingData).filter_by(user_id=self.userId).filter(UserCrmCallingData.project_id==project_id).first()
1781
            self.callDisposition = jsonReq.get('calldispositiontype')
1782
            self.callHistoryCrm = CallHistoryCrm()
1783
            self.callHistoryCrm.agent_id=self.agentId
1784
            self.callHistoryCrm.project_id = project_id
1785
            self.callHistoryCrm.call_disposition = self.callDisposition
1786
            self.callHistoryCrm.user_id=self.userId
1787
            self.callHistoryCrm.duration_sec = int(jsonReq.get("callduration"))
1788
            self.callHistoryCrm.disposition_comments = jsonReq.get('calldispositioncomments')
1789
            self.callHistoryCrm.call_time = datetime.strptime(jsonReq.get("calltime"), '%d/%m/%Y %H:%M:%S')
1790
            self.callHistoryCrm.mobile_number = jsonReq.get('number')
1791
            self.inputs = jsonReq.get("inputs")
1792
            dispositionMap = {  'call_later':callLaterAccs,
1793
                        'ringing_no_answer':callLaterAccs,
1794
                        'not_reachable':callLaterAccs,
1795
                        'switch_off':callLaterAccs,
1796
                        'technical_issue':accsDisposition,
1797
                        'pricing_issue':accsDisposition,
1798
                        'shipping_issue':accsDisposition,
1799
                        'internet_issue':accsDisposition,
1800
                        'checking_price':accsDisposition,
1801
                        'order_process':accsDisposition,
1802
                        'placed_order':accsDisposition,
1803
                        'place_order':accsDisposition,
1804
                        'product_availability':accsOrderDisposition,
1805
                        'return_replacement':accsOrderDisposition,
1806
                        'already_purchased':accsOrderDisposition,
1807
                        'product_quality_issue':accsOrderDisposition,
1808
                        'delayed_delivery':accsOrderDisposition,
18671 manas 1809
                        'other_complaint':accsOrderDisposition,
19442 manas 1810
                        'scheme_not_clear':accsOrderDisposition,
18671 manas 1811
                        'not_dealing_accessories':accsOrderDisposition
18637 manas 1812
                      }
1813
            returned = dispositionMap[jsonReq.get('calldispositiontype')]()
1814
        finally:
1815
            session.close()
1816
 
1817
        if returned:
1818
            resp.body = "{\"result\":\"success\"}"
1819
        else:
1820
            resp.body = "{\"result\":\"failed\"}"
1821
 
18628 manas 1822
    def accsOrderDisposition(self):
1823
        self.user.status='done'
1824
        self.user.user_available = 1
1825
        self.user.disposition=self.callDisposition
1826
        self.user.modified = datetime.now()
18712 manas 1827
        a = CrmTicketDtr()
18628 manas 1828
        if self.callDisposition == 'product_availability':
1829
            self.callHistoryCrm.disposition_description='Product Not available'
1830
        elif self.callDisposition == 'return_replacement':
1831
            self.callHistoryCrm.disposition_description='Return or replacement pending'
18923 manas 1832
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1833
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)
18628 manas 1834
        elif self.callDisposition == 'already_purchased':
1835
            self.callHistoryCrm.disposition_description='Already purchased required stock'
19442 manas 1836
        elif self.callDisposition == 'scheme_not_clear':
1837
            self.callHistoryCrm.disposition_description='Scheme Not Clear to the User'
18628 manas 1838
        elif self.callDisposition == 'product_quality_issue':
1839
            self.callHistoryCrm.disposition_description='Product Quality issue'
18923 manas 1840
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1841
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)            
18628 manas 1842
        elif self.callDisposition == 'delayed_delivery':
18637 manas 1843
            self.callHistoryCrm.disposition_description='Delayed Delivery' 
18923 manas 1844
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1845
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)   
18628 manas 1846
        elif self.callDisposition == 'other_complaint':
18637 manas 1847
            self.callHistoryCrm.disposition_description='Other complaint with profitmandi'
18923 manas 1848
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18713 manas 1849
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)
18671 manas 1850
        elif self.callDisposition == 'not_dealing_accessories':
1851
            self.callHistoryCrm.disposition_description='Not Dealing in Accessories/Not Interested'        
18628 manas 1852
        session.commit()
1853
        jdata = self.inputs
1854
        jdata = json.loads(jdata)
1855
        if jdata:
1856
            for d in jdata:
1857
                for key, value in d.iteritems():
1858
                    productpricingInputs = ProductPricingInputs()
1859
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1860
                    productpricingInputs.agent_id = self.callHistoryCrm.agent_id
1861
                    productpricingInputs.disposition_id = self.callHistoryCrm.id
1862
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1863
                    productpricingInputs.call_disposition = self.callHistoryCrm.call_disposition
1864
                    productpricingInputs.project_id = self.callHistoryCrm.project_id
1865
                    productpricingInputs.product_input = key
1866
                    productpricingInputs.pricing_input = value
1867
            session.commit()        
1868
        return True
1869
 
18291 manas 1870
    def accsDisposition(self):
1871
        self.user.status='done'
1872
        self.user.user_available = 1
1873
        self.user.disposition=self.callDisposition
1874
        self.user.modified = datetime.now()
1875
        if self.callDisposition == 'technical_issue':
1876
            self.callHistoryCrm.disposition_description='Technical issue at Profitmandi'
18923 manas 1877
            #utils.sendCrmProjectMail(self.userId,self.callHistoryCrm.disposition_description,self.callHistoryCrm.disposition_comments)
18716 manas 1878
            a = CrmTicketDtr()
1879
            a.addTicket(self.userId, self.callHistoryCrm.disposition_description, self.callHistoryCrm.disposition_comments)
18291 manas 1880
        elif self.callDisposition == 'pricing_issue':
1881
            self.callHistoryCrm.disposition_description='Pricing Issue(High)'
1882
        elif self.callDisposition == 'shipping_issue':
1883
            self.callHistoryCrm.disposition_description='Shipping charges related issue'
1884
        elif self.callDisposition == 'internet_issue':
1885
            self.callHistoryCrm.disposition_description='Internet issue at user end'
1886
        elif self.callDisposition == 'checking_price':
1887
            self.callHistoryCrm.disposition_description='Checking price'    
1888
        elif self.callDisposition == 'order_process':
1889
            self.callHistoryCrm.disposition_description='Order Process inquery'    
1890
        elif self.callDisposition == 'placed_order':
1891
            self.callHistoryCrm.disposition_description='Placed Order from Different Account'    
1892
        elif self.callDisposition == 'place_order':
1893
            self.callHistoryCrm.disposition_description='Will Place Order'            
1894
        session.commit()
18360 manas 1895
        jdata = self.inputs
18361 manas 1896
        jdata = json.loads(jdata)
18350 manas 1897
        if jdata:
1898
            for d in jdata:
18360 manas 1899
                for key, value in d.iteritems():
18350 manas 1900
                    productpricingInputs = ProductPricingInputs()
1901
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1902
                    productpricingInputs.agent_id = self.callHistoryCrm.agent_id
1903
                    productpricingInputs.disposition_id = self.callHistoryCrm.id
1904
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1905
                    productpricingInputs.call_disposition = self.callHistoryCrm.call_disposition
1906
                    productpricingInputs.project_id = self.callHistoryCrm.project_id
1907
                    productpricingInputs.product_input = key
1908
                    productpricingInputs.pricing_input = value
1909
            session.commit()        
18291 manas 1910
        return True
1911
 
1912
    def callLaterAccs(self):
18329 manas 1913
        self.user.status='retry'
1914
        self.user.modified = datetime.now()
18291 manas 1915
        if self.callDisposition == 'call_later':
18310 manas 1916
            if self.callHistoryCrm.disposition_comments is not None:
18321 manas 1917
                self.user.next_call_time = datetime.strptime(self.callHistoryCrm.disposition_comments, '%d/%m/%Y %H:%M:%S')
18310 manas 1918
                self.callHistoryCrm.disposition_description = 'User requested to call'
1919
                self.callHistoryCrm.disposition_comments = self.callHistoryCrm.disposition_comments
18291 manas 1920
            else:
1921
                self.user.next_call_time = self.callHistoryCrm.call_time + timedelta(days=1)
18310 manas 1922
                self.callHistoryCrm.disposition_description = 'Call Scheduled'
1923
                self.callHistoryCrm.disposition_comments = datetime.strftime(self.user.next_call_time, '%d/%m/%Y %H:%M:%S')
18291 manas 1924
        else: 
18310 manas 1925
            self.callHistoryCrm.disposition_description = 'User was not contactable'
18291 manas 1926
            if self.callDisposition == 'ringing_no_answer':
1927
                if self.user.disposition == 'ringing_no_answer':
1928
                    self.user.retry_count += 1
1929
                else:
1930
                    self.user.disposition = 'ringing_no_answer'
1931
                    self.user.retry_count = 1
1932
            else:
1933
                if self.user.disposition == 'ringing_no_answer':
1934
                    pass
1935
                else:
1936
                    self.user.disposition = 'not_reachable'
1937
                self.user.retry_count += 1
1938
                self.user.invalid_retry_count += 1
1939
 
18306 manas 1940
            retryConfig = session.query(RetryConfig).filter_by(call_type=self.callType, disposition_type=self.user.disposition, retry_count=self.user.retry_count).first()
1941
            if retryConfig is not None:
1942
                self.user.next_call_time = self.callHistoryCrm.call_time + timedelta(minutes = retryConfig.minutes_ahead)
1943
                self.callHistoryCrm.disposition_description = 'Call scheduled on ' + datetime.strftime(self.user.next_call_time, '%d/%m/%Y %H:%M:%S')
1944
            else:
1945
                self.user.status = 'failed'
18335 manas 1946
                self.user.user_available=1
18306 manas 1947
                self.callHistoryCrm.disposition_description = 'Call failed as all attempts exhausted'
18329 manas 1948
        self.user.disposition=self.callDisposition        
18291 manas 1949
        session.commit()
18347 manas 1950
        jdata =self.inputs
18361 manas 1951
        jdata = json.loads(jdata)
18350 manas 1952
        if jdata: 
1953
            for d in jdata:
18360 manas 1954
                for key, value in d.iteritems():
18350 manas 1955
                    productpricingInputs = ProductPricingInputs()
1956
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1957
                    productpricingInputs.agent_id = self.callHistoryCrm.agent_id
1958
                    productpricingInputs.disposition_id = self.callHistoryCrm.id
1959
                    productpricingInputs.user_id = self.callHistoryCrm.user_id
1960
                    productpricingInputs.call_disposition = self.callHistoryCrm.call_disposition
1961
                    productpricingInputs.project_id = self.callHistoryCrm.project_id
1962
                    productpricingInputs.product_input = key
1963
                    productpricingInputs.pricing_input = value
1964
            session.commit()        
18291 manas 1965
        return True
1966
 
18266 manas 1967
def insertUserCrmData(project_id):
1968
    if project_id==1:  
1969
        getCartDetailsUser()
18386 manas 1970
    if project_id==2:  
1971
        getCartTabsUser()
18620 manas 1972
    if project_id==3:
1973
        getAccsRepeatUsers(project_id)
19442 manas 1974
    if project_id==4:
1975
        getAccsSchemeCashback(project_id)
1976
 
1977
def getAccsSchemeCashback(project_id):
1978
    userMasterMap={}
1979
    skipUserList=[]
1980
    query = "select id from users where lower(referrer) in ('emp01','fos01','emp99','emp88')"
1981
    skipUsersresult = fetchResult(query)
1982
    for skipUser in skipUsersresult:
1983
        skipUserList.append(skipUser[0])
1984
    queryFilter = {"user_id":{"$nin":skipUserList}}
1985
    result = get_mongo_connection().Catalog.PromoOffer.find(queryFilter)
1986
    userMasterList =[]
1987
    for r in result:
1988
        userMasterList.append(r.get('user_id'))
1989
    queryfilter ={"url":{"$regex" : "http://api.profittill.com/categories/target"}}
1990
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilter).distinct('user_id')
1991
    userSeenList=[]
1992
    for r in result:
1993
        userSeenList.append(r)
1994
    finalUserList  = list(set(userMasterList) - set(userSeenList))
1995
    queryFilter = {"user_id":{"$in":finalUserList}}
1996
    result = get_mongo_connection().Catalog.PromoOffer.find(queryFilter)
1997
    for r in result:
1998
        userMasterMap[r.get('user_id')] = r.get('target2')
1999
    d_sorted = sorted(zip(userMasterMap.values(), userMasterMap.keys()),reverse=True)
2000
    counter=0
2001
    for i in d_sorted:
2002
        try:
2003
            userId=i[1]
2004
            if counter==20:
2005
                break
2006
            userPresent = session.query(UserCrmCallingData).filter_by(user_id=userId).order_by(desc(UserCrmCallingData.modified)).first()
2007
            if userPresent is not None:
2008
                if userPresent.user_available==1:
2009
                    if userPresent.project_id==project_id:
2010
                        continue                        
2011
                    elif userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
2012
                        continue
2013
                else:
2014
                    continue               
2015
            counter=counter+1
2016
            userMasterData = UserCrmCallingData()
2017
            userMasterData.user_id = userId 
2018
            userMasterData.name =getUsername(userId) 
2019
            userMasterData.project_id = project_id
2020
            userMasterData.user_available=0
2021
            userMasterData.contact1 = getUserContactDetails(userId)
2022
            userMasterData.counter = 0
2023
            userMasterData.retry_count=0
2024
            userMasterData.invalid_retry_count=0
2025
            userMasterData.created = datetime.now()
2026
            userMasterData.modified = datetime.now()
2027
            userMasterData.status = 'new'
2028
            userMasterData.pincode_servicable = checkPincodeServicable(userId)
2029
            session.commit()
2030
        except:
2031
            print traceback.print_exc()
2032
        finally:
2033
            session.close()
2034
 
18620 manas 2035
def getAccsRepeatUsers(project_id):
2036
 
2037
    usersMasterList=[]
2038
    ACCS_ALL_ORDERS = "select distinct user_id from allorder where category in ('Accs','Accessories') and store_id='spice';"
2039
    result = fetchResult(ACCS_ALL_ORDERS)
2040
    for r in result:
2041
        usersMasterList.append(r[0])
2042
 
2043
    ACCS_LAST_FIFTEEN_DAYS = "select distinct user_id from allorder where category in ('Accs','Accessories') and store_id='spice' and (date(created_on) between date(curdate() - interval 15 day) and date(curdate())) order by user_id;"
2044
    result = fetchResult(ACCS_LAST_FIFTEEN_DAYS)
2045
    for r in result:
2046
        if r[0] in usersMasterList:
2047
            usersMasterList.remove(r[0])        
2048
 
2049
    PRIOPRITIZING_USER_QUERY = "select user_id from allorder where category in ('Accs','Accessories')and store_id ='spice' and user_id in (%s)" % ",".join(map(str,usersMasterList)) + "group by user_id order by sum(amount_paid) desc;"
2050
    userFinalList=[]
2051
    result = fetchResult(PRIOPRITIZING_USER_QUERY)
2052
    for r in result:
2053
        userFinalList.append(r[0])
2054
 
2055
    counter=0
2056
    for i in userFinalList:
2057
        try:
2058
            userId=i
18628 manas 2059
            if counter==20:
18620 manas 2060
                break
2061
            userPresent = session.query(UserCrmCallingData).filter_by(user_id=userId).order_by(desc(UserCrmCallingData.modified)).first()
2062
            if userPresent is not None:
2063
                if userPresent.user_available==1:
2064
                    if userPresent.project_id==project_id:
2065
                        if userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
2066
                            continue
2067
                        else:
2068
                            pass    
18792 manas 2069
                    elif userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
18620 manas 2070
                        continue
2071
                else:
2072
                    continue     
2073
            counter=counter+1
2074
            userMasterData = UserCrmCallingData()
2075
            userMasterData.user_id = userId 
2076
            userMasterData.name =getUsername(userId) 
2077
            userMasterData.project_id = project_id
2078
            userMasterData.user_available=0
2079
            userMasterData.contact1 = getUserContactDetails(userId)
2080
            userMasterData.counter = 0
2081
            userMasterData.retry_count=0
2082
            userMasterData.invalid_retry_count=0
2083
            userMasterData.created = datetime.now()
2084
            userMasterData.modified = datetime.now()
2085
            userMasterData.status = 'new'
2086
            userMasterData.pincode_servicable = checkPincodeServicable(userId)
2087
            session.commit()
2088
        except:
2089
            print traceback.print_exc()
2090
        finally:
2091
            session.close()
2092
 
18256 manas 2093
def getCartDetailsUser():
2094
    userList=[]
2095
    orderUserList=[]
18818 manas 2096
    #userMasterMap={}
18256 manas 2097
    queryfilter = {"$and":
2098
                   [
18792 manas 2099
                    {'created':{"$gte":(to_java_date(datetime.now())-3*86400000)}},
18256 manas 2100
                    {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2101
                    {"url":{"$regex" : "http://api.profittill.com/cartdetails"}}
2102
                    ]
2103
                   }
2104
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilter).distinct('user_id')
2105
 
2106
    for r in result:
2107
        userList.append(r)
2108
 
18301 manas 2109
    myquery = "select a.user_id from allorder a join users u on a.user_id=u.id where a.store_id='spice' and (a.category='Accs' or a.category='Accessories') and u.referrer not like 'emp%%' and u.mobile_number IS NOT NULL and a.user_id in (%s)" % ",".join(map(str,userList)) + " UNION select id from users where lower(referrer) like 'emp%'"
2110
 
18256 manas 2111
    result = fetchResult(myquery)
2112
    for r in result:
18301 manas 2113
        orderUserList.append(r[0])
18256 manas 2114
    finalUserList  = list(set(userList) - set(orderUserList))
2115
 
18792 manas 2116
    userCartIdMap={}
2117
    fetchCartId = "select user_id,account_key from user_accounts where account_type='cartId' and user_id in (%s)" % ",".join(map(str,finalUserList))
2118
    result = fetchResult(fetchCartId)
2119
    for r in result:
18818 manas 2120
        userCartIdMap[long(r[1])] = long(r[0])
18843 manas 2121
    client = CatalogClient("catalog_service_server_host_prod","catalog_service_server_port").get_client()
18792 manas 2122
    userMapReturned = client.getCartByValue(userCartIdMap.keys())
18818 manas 2123
    userFinalList=[]
2124
    for i in userMapReturned:
2125
        userFinalList.append(userCartIdMap.get(i))
18792 manas 2126
#     queryfilternew = {"$and":
2127
#                    [
2128
#                     {'user_id':{"$in":finalUserList}},
2129
#                     {'created':{"$gte":(to_java_date(datetime.now())-2*86400000)}},
2130
#                     {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2131
#                     {"url":{"$regex" : "http://api.profittill.com/cartdetails"}}
2132
#                     ]
2133
#                    }
2134
#     itemIds = list(get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilternew))
2135
#      
2136
#     for i in itemIds:
2137
#         if(userMasterMap.has_key(i.get('user_id'))):
2138
#             if userMasterMap.get(i.get('user_id')) > i.get('created'):
2139
#                 userMasterMap[i.get('user_id')]=i.get('created')
2140
#         else:
2141
#             userMasterMap[i.get('user_id')]=i.get('created')
2142
#             
2143
#     d_sorted = sorted(zip(userMasterMap.values(), userMasterMap.keys()))
18818 manas 2144
    addUserToTable(userFinalList,1)
18256 manas 2145
 
18301 manas 2146
def addUserToTable(userList,projectId):
18266 manas 2147
    counter=0
18301 manas 2148
    for i in userList:
2149
        try:
18792 manas 2150
            userId=i
18412 manas 2151
            if counter==20:
18301 manas 2152
                break
2153
            userPresent = session.query(UserCrmCallingData).filter_by(user_id=userId).order_by(desc(UserCrmCallingData.modified)).first()
2154
            if userPresent is not None:
2155
                if userPresent.user_available==1:
2156
                    if userPresent.project_id==projectId:
2157
                        continue
18792 manas 2158
                    elif userPresent.modified.date()>=(datetime.now().date()-timedelta(days=30)):
18301 manas 2159
                        continue
18306 manas 2160
                else:
2161
                    continue     
18266 manas 2162
            counter=counter+1
2163
            userMasterData = UserCrmCallingData()
2164
            userMasterData.user_id = userId 
2165
            userMasterData.name =getUsername(userId) 
18301 manas 2166
            userMasterData.project_id = projectId
18277 manas 2167
            userMasterData.user_available=0
18266 manas 2168
            userMasterData.contact1 = getUserContactDetails(userId)
2169
            userMasterData.counter = 0
18318 manas 2170
            userMasterData.retry_count=0
2171
            userMasterData.invalid_retry_count=0
18266 manas 2172
            userMasterData.created = datetime.now()
2173
            userMasterData.modified = datetime.now()
2174
            userMasterData.status = 'new'
2175
            userMasterData.pincode_servicable = checkPincodeServicable(userId)
2176
            session.commit()
18301 manas 2177
        except:
2178
            print traceback.print_exc()
2179
        finally:
2180
            session.close()    
2181
 
18256 manas 2182
def getCartTabsUser():
18346 manas 2183
    userMasterList=[]
2184
    userList = []
18256 manas 2185
    userMasterMap={}
2186
    queryfilter = {"$and":
2187
                   [
2188
                    {'created':{"$gte":(to_java_date(datetime.now())-2*86400000)}},
2189
                    {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2190
                    {"url":{"$regex" : "http://api.profittill.com/category/6"}}
2191
                    ]
2192
                   }
2193
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilter).distinct('user_id')
2194
 
2195
    for r in result:
18346 manas 2196
        userMasterList.append(r)
2197
 
2198
    queryfilterVisistedCart = {"$and":
2199
                   [
18386 manas 2200
                    {'user_id':{"$in":userMasterList}},
18346 manas 2201
                    {"url":{"$regex" : "http://api.profittill.com/cartdetails"}}
2202
                    ]
2203
                  }
18386 manas 2204
    result = get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilterVisistedCart).distinct('user_id')   
18346 manas 2205
    for r in result:
18256 manas 2206
        userList.append(r)
2207
 
18416 manas 2208
    myquery = "select user_id from allorder where store_id='spice' and (category='Accs' or category='Accessories') and user_id in (%s)" % ",".join(map(str,userMasterList)) + " UNION select id from users where lower(referrer) like 'emp%'"
18256 manas 2209
 
2210
    result = fetchResult(myquery)
2211
    for r in result:
18346 manas 2212
        if r[0] in userList:
2213
            continue
2214
        userList.append(r[0])
18386 manas 2215
 
18346 manas 2216
    finalUserList  = list(set(userMasterList) - set(userList))
18386 manas 2217
 
18256 manas 2218
    queryfilternew = {"$and":
2219
                   [
2220
                    {'user_id':{"$in":finalUserList}},
2221
                    {'created':{"$gte":(to_java_date(datetime.now())-2*86400000)}},
2222
                    {'created':{"$lte":(to_java_date(datetime.now())- 43200000)}},
2223
                    {"url":{"$regex" : "http://api.profittill.com/category/6"}}
2224
                    ]
2225
                   }
2226
    itemIds = list(get_mongo_connection_dtr_data().User.browsinghistories.find(queryfilternew))
2227
 
2228
    for i in itemIds:
2229
        if(userMasterMap.has_key(i.get('user_id'))):
2230
            if userMasterMap.get(i.get('user_id')) > i.get('created'):
2231
                userMasterMap[i.get('user_id')]=i.get('created')
2232
        else:
2233
            userMasterMap[i.get('user_id')]=i.get('created')
2234
 
2235
    d_sorted = sorted(zip(userMasterMap.values(), userMasterMap.keys()))
18792 manas 2236
    userFinalList=[]
2237
    for i in d_sorted:
2238
        userFinalList.append(i[1])
2239
    addUserToTable(userFinalList,2)
18346 manas 2240
 
18266 manas 2241
def getUserContactDetails(userId):
18792 manas 2242
    r = session.query(Users.mobile_number).filter_by(id=userId).first()
2243
    if r is None:
2244
        return None
2245
    else:
2246
        return r[0]
18712 manas 2247
 
18266 manas 2248
def getUsername(userId):
18792 manas 2249
    r = session.query(Users.first_name).filter_by(id=userId).first()
2250
    if r is None:
2251
        return None
2252
    else:
2253
        return r[0]
2254
 
18266 manas 2255
def checkPincodeServicable(userId):
2256
    checkAddressUser = "select distinct pincode from all_user_addresses where user_id= (%s)"
2257
    result = fetchResult(checkAddressUser,userId)
2258
    if len(result)==0:
2259
        return True
2260
    else:
2261
        myquery = "select count(*) from (select distinct pincode from all_user_addresses where user_id= (%s))a join pincodeavailability p on a.pincode=p.code"
2262
        result = fetchResult(myquery,userId)
2263
        if result[0][0]==0:
2264
            return False
2265
        else:
2266
            return True
2267
 
2268
def getUserObject(user):
2269
    obj = Mock()
2270
    obj.user_id = user.user_id
2271
    result = fetchResult("select * from useractive where user_id=%d"%(user.user_id))
2272
    if result == ():
2273
        obj.last_active = None
2274
    else:
2275
        obj.last_active =datetime.strftime(result[0][1], '%d/%m/%Y %H:%M:%S')
18269 manas 2276
    obj.name = user.name    
18266 manas 2277
    obj.contact = user.contact1
18275 manas 2278
    obj.lastOrderTimestamp=None
18256 manas 2279
 
18275 manas 2280
    details = session.query(Orders).filter_by(user_id = user.user_id).filter(~Orders.status.in_(['ORDER_NOT_CREATED_KNOWN','ORDER_NOT_CREATED_UNKNOWN', 'ORDER_ALREADY_CREATED_IGNORED'])).order_by(desc(Orders.created)).first()
18266 manas 2281
    if details is None:
18275 manas 2282
        obj.lastOrderTimestamp =None
18266 manas 2283
    else:
18366 manas 2284
        obj.lastOrderTimestamp =datetime.strftime(details.created, '%d/%m/%Y %H:%M:%S')
18275 manas 2285
    obj.totalOrders = session.query(Orders).filter_by(user_id = user.user_id).filter(~Orders.status.in_(['ORDER_NOT_CREATED_KNOWN','ORDER_NOT_CREATED_UNKNOWN', 'ORDER_ALREADY_CREATED_IGNORED'])).count()
18266 manas 2286
 
18275 manas 2287
    cartResult = fetchResult("select account_key from user_accounts where account_type ='cartId' and user_id=%d"%(user.user_id))
18266 manas 2288
    if cartResult == ():
18268 manas 2289
        obj.lastActiveCartTime = None
18266 manas 2290
    else:
2291
        conn = MySQLdb.connect("192.168.190.114", "root","shop2020", "user")
2292
        cursor = conn.cursor()
18275 manas 2293
        cursor.execute("select updated_on from cart where id=%s",(cartResult[0][0]))
18266 manas 2294
        result = cursor.fetchall()
2295
        if result ==():
18268 manas 2296
            obj.lastActiveCartTime = None
18266 manas 2297
        else:
2298
            print result
18275 manas 2299
            obj.lastActiveCartTime =datetime.strftime(result[0][0], '%d/%m/%Y %H:%M:%S')
18712 manas 2300
        conn.close()
2301
 
2302
    session.close()                
18266 manas 2303
    return obj
2304
 
18709 manas 2305
class CrmTicketDtr():
2306
    def on_post(self,req,resp):
18712 manas 2307
        try:
2308
            customerFeedbackBackMap = {}
2309
            customerFeedbackBackMap['user_id']=req.get_param("user_id")
2310
            user = session.query(Users).filter_by(id=customerFeedbackBackMap.get('user_id')).first()
2311
            if user is not None:
2312
                customerFeedbackBackMap['email']=user.email
2313
                customerFeedbackBackMap['mobile_number']=user.mobile_number
2314
                customerFeedbackBackMap['customer_name']=user.first_name + ' ' + user.last_name
2315
                customerFeedbackBackMap['subject'] = req.get_param("subject")
2316
                customerFeedbackBackMap['message'] = req.get_param("message")
2317
                customerFeedbackBackMap['created'] = datetime.now()
2318
                if utils.generateCrmTicket(customerFeedbackBackMap):
2319
                    resp.body={"result":"success"}
2320
                else:
2321
                    resp.body={"result":"failure"}    
18709 manas 2322
            else:
18712 manas 2323
                resp.body={"result":"failure"}
2324
        except:
2325
            print traceback.print_exc()
2326
        finally:
2327
            session.close()            
18709 manas 2328
    def addTicket(self,user_id,subject,message):
18712 manas 2329
        try:
2330
            customerFeedbackBackMap = {}
2331
            customerFeedbackBackMap['user_id']=user_id
2332
            user = session.query(Users).filter_by(id=user_id).first()
2333
            if user is not None:
2334
                customerFeedbackBackMap['email']=user.email
2335
                customerFeedbackBackMap['mobile_number']=user.mobile_number
2336
                customerFeedbackBackMap['customer_name']=user.first_name + ' ' + user.last_name
2337
                customerFeedbackBackMap['subject'] = subject
2338
                customerFeedbackBackMap['message'] = message
2339
                customerFeedbackBackMap['created'] = datetime.now()
2340
                utils.generateCrmTicket(customerFeedbackBackMap)
2341
            else:
2342
                print 'User is not present'
2343
        except:
18926 manas 2344
            print traceback.print_exc()                
2345
 
18272 kshitij.so 2346
class UnitDeal():
2347
    def on_get(self,req,resp, id):
2348
        result = Mongo.getDealById(id)
2349
        resp.body = dumps(result)
19290 kshitij.so 2350
 
2351
class SpecialOffer():
2352
    def on_get(self,req,resp):
2353
        user_id = req.get_param_as_int('user_id')
2354
        result = Mongo.getOfferForUser(user_id)
2355
        resp.body = dumps(result)
19388 kshitij.so 2356
 
2357
class BrandSubCatFilter():
2358
    def on_get(self, req, resp):
2359
        category_id = req.get_param_as_int('category_id')
2360
        id_list = req.get_param('id_list')
2361
        type = req.get_param('type')
2362
        result = Mongo.getBrandSubCategoryInfo(category_id, id_list, type)
2363
        resp.body = dumps(result)
18272 kshitij.so 2364
 
15312 amit.gupta 2365
def main():
18386 manas 2366
    a = RetailerDetail()
2367
    retailer = a.getNotActiveRetailer()
2368
    otherContacts = [r for r, in session.query(RetailerContacts.mobile_number).filter_by(retailer_id=retailer.id).order_by(RetailerContacts.contact_type).all()]
2369
    print json.dumps(todict(getRetailerObj(retailer, otherContacts, 'fresh')), encoding='utf-8')
15195 manas 2370
 
15081 amit.gupta 2371
if __name__ == '__main__':
18901 amit.gupta 2372
    #main()
19391 amit.gupta 2373
    print getTinInfo('07740388453')
15091 amit.gupta 2374