Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
130 ashish 1
'''
2
Created on 28-Apr-2010
3
 
4
@author: ashish
5
'''
6
from shop2020.model.v1.user.impl import Dataservice
2981 rajveer 7
from shop2020.utils.Utils import log_entry, to_py_date
8
from shop2020.thriftpy.model.v1.user.ttypes import WidgetType as WType
1273 varun.gupt 9
from shop2020.model.v1.user.impl.Dataservice import User, UserCommunication, IPMap,\
1845 vikas 10
    Address, SocialHandle, UserState, InternalInfo, SocialService, Affiliate, Tracker, TrackLog,\
2981 rajveer 11
    MasterAffiliate, UserNote, UserWidgetItem
130 ashish 12
from shop2020.thriftpy.model.v1.user.ttypes import UserContextException,\
557 chandransh 13
    AuthenticationException, AccountStatus, Sex
130 ashish 14
from elixir import session
2981 rajveer 15
import datetime
16
from sqlalchemy import desc
130 ashish 17
 
2981 rajveer 18
 
1249 chandransh 19
def initialize(dbname='user'):
130 ashish 20
    log_entry("initialize@DataAccessor", "Initializing data service")
1249 chandransh 21
    Dataservice.initialize(dbname)
557 chandransh 22
 
23
def create_anonymous_user(jsession_id, cart):
576 chandransh 24
    user=User.get_by(jsession_id=jsession_id)
25
    if not user is None:
26
        return user
557 chandransh 27
    user = User()
28
    anonymous_str = "anonymous"
576 chandransh 29
    user.email = jsession_id + "@anonymous.com"
557 chandransh 30
    user.password = anonymous_str
31
    user.name = anonymous_str
32
    user.communication_email = jsession_id + "@anonymous.com"
33
    user.jsession_id = jsession_id
34
    user.is_anonymous = True
35
    user.sex = Sex.WONT_SAY
36
    user.active_cart_id = cart.id
37
    #initialize userState
38
    user_state = UserState()
39
    user_state.is_email_verified = False
40
    user_state.is_sms_verified = False
41
    user_state.account_status = AccountStatus.ACTIVE
42
    user_state.ip_list = []
2045 chandransh 43
    user_state.active_since = datetime.datetime.now()
557 chandransh 44
    user_state.user = user
2747 chandransh 45
    session.commit()
557 chandransh 46
 
47
    cart.user_id = user.id    
48
    session.commit()
130 ashish 49
 
557 chandransh 50
    return user
51
 
52
def get_user_by_id(user_id):
53
    return User.get_by(id=user_id)
54
 
3032 mandeep.dh 55
def get_user_by_mobile_number(mobile_number):
56
    return User.get_by(mobile_number=mobile_number)
57
 
1491 vikas 58
def get_user_by_email(email):
59
    return User.get_by(email=email)
60
 
557 chandransh 61
def create_user(user_to_add, cart):
62
    if user_to_add.userId:
130 ashish 63
        raise UserContextException(109, "id is set, user cannot be created")
557 chandransh 64
    user = User()
65
    user.email = user_to_add.email
66
    user.password = user_to_add.password
67
    user.name = user_to_add.name
68
    user.communication_email = user_to_add.communicationEmail
69
    user.jsession_id = user_to_add.jsessionId
70
    user.is_anonymous = False
71
    user.sex = user_to_add.sex
567 rajveer 72
    user.date_of_birth = user_to_add.dateOfBirth
557 chandransh 73
    user.active_cart_id = cart.id
567 rajveer 74
    user.mobile_number = user_to_add.mobileNumber
2020 vikas 75
    user.source = user_to_add.source
2815 vikas 76
    user.source_start_time = to_py_date(user_to_add.sourceStartTime)
513 rajveer 77
 
130 ashish 78
    #initialize userState
557 chandransh 79
    user_state = UserState()
130 ashish 80
    user_state.is_email_verified = False
81
    user_state.is_sms_verified = False
82
    user_state.account_status = AccountStatus.ACTIVE
132 ashish 83
    user_state.ip_list = []
130 ashish 84
    user_state.active_since = datetime.datetime.now()
557 chandransh 85
    user_state.user = user
1607 vikas 86
    session.commit();
130 ashish 87
 
557 chandransh 88
    #Now create the user phones. Mostly, this should only be a mobile number
89
 
90
    cart.user_id = user.id    
130 ashish 91
    session.commit()
404 rajveer 92
 
557 chandransh 93
    return user
130 ashish 94
 
95
#===============================================================================
96
# Need to provide the update apis here for relevant fields in PrimaryInfo.
97
#===============================================================================
557 chandransh 98
def update_user(user_to_update):
594 rajveer 99
    if not user_to_update.userId:
415 ashish 100
        raise UserContextException(110, "user does not exist")
594 rajveer 101
    user = get_user_by_id(user_to_update.userId)
102
    user.email = user_to_update.email
103
    user.password = user_to_update.password
104
    user.name = user_to_update.name
105
    user.communication_email = user_to_update.communicationEmail
106
    user.jsession_id = user_to_update.jsessionId
107
    user.is_anonymous = user_to_update.isAnonymous
108
    user.sex = user_to_update.sex
109
    user.date_of_birth = user_to_update.dateOfBirth
110
    user.active_cart_id = user_to_update.activeCartId
111
    user.mobile_number = user_to_update.mobileNumber
415 ashish 112
    session.commit()
594 rajveer 113
    return user
415 ashish 114
 
557 chandransh 115
def delete_user(user_id):
116
    user = get_user_by_id(user_id)
130 ashish 117
 
118
    if not user:
119
        raise_user_exception(user_id)
557 chandransh 120
 
121
    user.state.account_status = AccountStatus.DELETED
122
    session.commit()
123
    return True
130 ashish 124
 
557 chandransh 125
def get_user_state(user_id):
766 rajveer 126
    userstate = UserState.get_by(user_id=user_id)
127
    return userstate
130 ashish 128
 
557 chandransh 129
def get_internal_info(user_id):
766 rajveer 130
    info = InternalInfo.get_by(user_id=user_id)
131
    return info
130 ashish 132
 
557 chandransh 133
def authenticate_user(user_handle, password):
134
    user = User.get_by(email=user_handle)
130 ashish 135
    if not user:
557 chandransh 136
        raise AuthenticationException("This email address is not registered.", 102)
130 ashish 137
 
557 chandransh 138
    if user.password == get_db_password(password):
139
        return user
130 ashish 140
    else:
141
        raise AuthenticationException("Wrong username or password", 102)
142
 
143
def user_exists(email):
413 rajveer 144
    try:
557 chandransh 145
        user = User.get_by(email=email)
146
        if user:
147
            return True
148
        else:
149
            return False
413 rajveer 150
    except:
130 ashish 151
        return False
152
 
567 rajveer 153
def add_address_for_user(address, user_id, set_default):
557 chandransh 154
    user = get_user_by_id(user_id)
766 rajveer 155
 
130 ashish 156
    if not user:
157
        raise_user_exception(user_id)
158
    if not address:
159
        raise UserContextException(103,"Address cannot be null")
160
 
161
    address_to_add = Address()
162
    address_to_add.line_1 = address.line1
163
    address_to_add.line_2 = address.line2
164
    address_to_add.landmark = address.landmark
165
    address_to_add.city = address.city
166
    address_to_add.country = address.country
167
    address_to_add.state = address.state
168
    address_to_add.pin = address.pin
169
    address_to_add.type = address.type
414 ashish 170
    address_to_add.name = address.name
171
    address_to_add.phone = address.phone
130 ashish 172
    address_to_add.added_on = to_py_date(address.addedOn)
173
    address_to_add.enabled = True
557 chandransh 174
    address_to_add.user = user
130 ashish 175
    session.commit()
509 rajveer 176
 
557 chandransh 177
    if set_default is True:
178
        user.default_address_id = address_to_add.id
567 rajveer 179
    #set default address if nothing is default    
180
    if user.default_address_id is None:
181
        user.default_address_id = address_to_add.id
182
 
557 chandransh 183
    session.commit()
513 rajveer 184
 
567 rajveer 185
    return address_to_add.id
513 rajveer 186
 
130 ashish 187
def remove_address_for_user(user_id, address_id):
188
    address = get_address(address_id) 
189
 
190
    if not address:
557 chandransh 191
        raise UserContextException(103, "Address not found")
192
    if address.user.id != user_id:
193
        raise UserContextException(104, "This address belongs to some other user")
130 ashish 194
 
195
    address.enabled = False
196
    session.commit()
197
    return True
198
 
199
def set_user_as_logged_in(user_id, time_stamp):
557 chandransh 200
    user_state = UserState.get_by(user_id=user_id)
201
    #user = get_user_by_id(user_id)
130 ashish 202
 
557 chandransh 203
    if not user_state:
204
        raise_user_exception(user_id)
130 ashish 205
 
206
    if not time_stamp:
557 chandransh 207
        user_state.last_login = datetime.datetime.now()
208
    else:
209
        user_state.last_login = to_py_date(time_stamp)
130 ashish 210
    session.commit()
211
    return True
212
 
557 chandransh 213
def set_user_as_logged_out(user_id, time_stamp):
214
    user_state = UserState.get_by(user_id=user_id)
130 ashish 215
 
557 chandransh 216
    if not user_state:
130 ashish 217
        raise_user_exception(user_id)
218
 
219
    if not time_stamp:
557 chandransh 220
        user_state.last_logout = datetime.datetime.now()
221
    else:
222
        user_state.last_logout = to_py_date(time_stamp)
130 ashish 223
    session.commit()
224
    return True
225
 
557 chandransh 226
def set_default_address(user_id, address_id):
227
    user = get_user_by_id(user_id)
228
    address = Address.get_by(id=address_id)
229
    if not user:
230
        raise_user_exception(user_id)
231
    if not address:
232
        raise UserContextException(103, "Address not found")
233
    if address.user.id != user.id:
234
        raise UserContextException(104, "This address belongs to some other user")
235
 
236
    user.default_address_id = address_id 
237
    session.commit()
238
 
594 rajveer 239
def update_password(user_id, old_password, new_password):
557 chandransh 240
    user = get_user_by_id(user_id)
130 ashish 241
 
242
    if not user:
243
        raise_user_exception(user_id)
244
 
594 rajveer 245
    if user.password != old_password:
246
        return False
247
 
248
    if check_for_valid_password(new_password):
249
        user.password = get_db_password(new_password)
130 ashish 250
        session.commit()
251
        return True
252
    else:
253
        return False
1273 varun.gupt 254
 
255
 
256
def create_user_communication(user_id, email, communication_type, order_id, awb, product, subject, message):
257
 
258
    user_communication = UserCommunication()
259
    user_communication.user_id = user_id
260
    user_communication.communication_type = communication_type
1743 varun.gupt 261
 
262
    if order_id > 0:
263
        user_communication.order_id = order_id
1273 varun.gupt 264
    user_communication.airwaybill_no = awb
265
    user_communication.reply_to = email
266
    user_communication.product_name = product
267
    user_communication.subject = subject
268
    user_communication.message = message
1301 varun.gupt 269
    user_communication.communication_timestamp = datetime.datetime.now()
1273 varun.gupt 270
    session.commit()
130 ashish 271
 
1583 varun.gupt 272
def get_user_communication_by_id(user_communication_id):
273
    return UserCommunication.get_by(id = user_communication_id)
274
 
275
def get_user_communication_by_user(user_communication_user_id):
1607 vikas 276
    return UserCommunication.query.filter_by(user_id = user_communication_user_id).order_by(-UserCommunication.id).all()
1583 varun.gupt 277
 
278
def get_all_user_communications():
1863 vikas 279
    return UserCommunication.query.order_by(-UserCommunication.id).all()
1583 varun.gupt 280
 
1859 vikas 281
def create_master_affiliate(name, added_on):
1845 vikas 282
    master_affiliate = MasterAffiliate()
283
    master_affiliate.name = name
1859 vikas 284
    master_affiliate.added_on = to_py_date(added_on)
1845 vikas 285
    session.commit()
286
    return master_affiliate
287
 
1899 vikas 288
def get_all_master_affiliates():
289
    return MasterAffiliate.query.all()
290
 
1845 vikas 291
def get_master_affiliate_by_id(id):
292
    return MasterAffiliate.get_by(id = id)
293
 
294
def get_master_affiliate_by_name(name):
295
    return MasterAffiliate.get_by(name = name)
296
 
1859 vikas 297
def create_affiliate(name, url, master_affiliate_id, added_on):
1845 vikas 298
    affiliate = Affiliate()
299
    affiliate.name = name
300
    if url is not None:
301
        affiliate.url = url
302
    affiliate.master_affiliate_id = master_affiliate_id
1859 vikas 303
    affiliate.added_on = to_py_date(added_on)
1845 vikas 304
    session.commit()
305
    return affiliate
306
 
307
def get_affiliate_by_id(id):
308
    return Affiliate.get_by(id = id)
309
 
310
def get_affiliate_by_name(name):
311
    return Affiliate.get_by(name = name)
312
 
313
def get_affiliates_by_master_affiliate(master_affiliate_id):
314
    return MasterAffiliate.get_by(id =  master_affiliate_id).affiliates
315
 
316
def get_tracker_by_id(id):
317
    return Tracker.get_by(id = id)
318
 
1996 vikas 319
def add_track_log(affiliate_id, user_id, event, url, data, added_on):
1845 vikas 320
    track_log = TrackLog()
1996 vikas 321
    track_log.affiliate_id = affiliate_id
1845 vikas 322
    if user_id:
323
        track_log.user_id = user_id
324
    track_log.event = event
325
    if url:
326
        track_log.url = url
327
    if data:
1859 vikas 328
        track_log.data = data
329
    track_log.added_on = to_py_date(added_on)
1845 vikas 330
    session.commit()
331
    return track_log.id
332
 
333
def get_track_log_by_id(id):
334
    return TrackLog.get_by(id = id)
335
 
1996 vikas 336
def get_track_logs_by_affiliate(affiliate_id):
337
    return Affiliate.get_by(id = affiliate_id).tracklogs
1845 vikas 338
 
339
def get_track_logs_by_user(user_id):
340
    return TrackLog.query.filter(TrackLog.user_id == user_id).all()
341
 
1996 vikas 342
def get_track_logs(affiliate_id, user_id, event, url):
1845 vikas 343
    query = TrackLog.query
344
 
1996 vikas 345
    if affiliate_id:
346
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
347
    if user_id:
348
        query = query.filter(TrackLog.user_id == user_id)
1845 vikas 349
    if event:
350
        query = query.filter(TrackLog.event == event)
351
    if url:
352
        query = query.filter(TrackLog.url == url)
353
    return query.all()
354
 
355
 
557 chandransh 356
def get_address(address_id):
357
    address = Address.get_by(id=address_id)
358
    return address
359
 
360
def get_social_service(service_id):
361
    service = SocialService.get_by(service_id)
362
    return service
363
 
364
def add_ip_address_for_user(ip_address, time_stamp, user_id):
365
    user = get_user_by_id(user_id)
130 ashish 366
    if not user:
367
        raise_user_exception(user_id)
557 chandransh 368
    #user exists create an IP address object
369
    ip_address = IPMap()
370
    ip_address.ip = ip_address
371
    ip_address.timestamp = to_py_date(time_stamp)
372
    ip_address.user_state = user.state
130 ashish 373
    session.commit()
374
    return True
375
 
376
def get_social_service_by_name(service_name):
377
    service = SocialService.get_by(name=service_name)
378
 
379
    if not service:
380
        raise UserContextException(106, "No such social service exists")
381
    return service
382
 
383
def add_social_handle(user_id, social_service, handle):
557 chandransh 384
    user = get_user_by_id(user_id)
130 ashish 385
 
386
    if not user:
387
        raise_user_exception(user_id)
388
 
389
    service = get_social_service_by_name(social_service)
390
 
391
    #get if use already has this service.
557 chandransh 392
    social_handle = SocialHandle.filter(service=service).filter(user=user).one()
130 ashish 393
    if not social_handle:
394
        #create a new handle
395
        social_handle = SocialHandle()
396
        social_handle.service = service
557 chandransh 397
        social_handle.user = user
130 ashish 398
        social_handle.handle = handle
399
    else:
400
        social_handle.handle = handle
557 chandransh 401
    session.commit()
130 ashish 402
    return True
557 chandransh 403
 
884 rajveer 404
 
405
def forgot_password(email, password):
406
    try:
407
        user = User.get_by(email=email)
408
        if user:
409
            user.password = password
900 rajveer 410
            session.commit()
884 rajveer 411
            return True
412
        else:
413
            return False
414
    except:
415
        return False
416
 
417
 
418
'''
581 rajveer 419
def forgot_password(email):
420
    try:
421
        user = User.get_by(email=email)
422
        if user:
873 rajveer 423
            new_password = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8))
581 rajveer 424
            mail = Mail()
425
            mail.to = []
426
            mail.to.append(email)
427
            mail.sender = ""
428
            mail.password = ""
429
            mail.data = "Your new password is " + user.password
430
            helper_client = HelperClient()
431
            helper_client.__start__()
432
            client = helper_client.get_client()
433
            client.sendMail(mail);
873 rajveer 434
 
581 rajveer 435
            return True
436
        else:
437
            return False
438
    except:
439
        return False
884 rajveer 440
'''    
581 rajveer 441
 
594 rajveer 442
def get_all_addresses_for_user(userId):
2895 chandransh 443
    return Address.query.filter_by(user_id = userId, enabled=True).all()
581 rajveer 444
 
785 rajveer 445
def get_default_address_id(userId):
594 rajveer 446
    user = get_user_by_id(userId);
840 chandransh 447
    if user.default_address_id is None:
448
        return 0
594 rajveer 449
    return user.default_address_id
581 rajveer 450
 
785 rajveer 451
def get_default_pincode(user_id):
452
    user = get_user_by_id(user_id)
453
    if not user:
454
        raise_user_exception(user_id)
455
    default_address_id = user.default_address_id
456
    if default_address_id:
457
        address = Address.get_by(id=default_address_id)
458
        default_pincode = address.pin 
459
    else:
460
        default_pincode = '110001' 
461
    return default_pincode     
1596 ankur.sing 462
 
463
def get_user_count(user_type):
464
    if user_type is None:
465
        return User.query.count()
466
    else:
467
        return User.query.filter_by(is_anonymous = user_type).count()
785 rajveer 468
 
1891 ankur.sing 469
def get_users(user_type, start_date, end_date):
470
    query = session.query(User).join(UserState)
471
    if start_date != -1:
472
        query = query.filter(UserState.active_since >= to_py_date(start_date))
473
    if end_date != -1:
474
        query = query.filter(UserState.active_since <= to_py_date(end_date))
475
    if user_type is not None:
476
        query = query.filter(User.is_anonymous == user_type)
477
    return query.all()
1673 ankur.sing 478
 
130 ashish 479
#=============================================================================
480
# Helper functions 
481
#=============================================================================
482
 
483
'''
484
This function returns the password as stored in the db
485
'''    
486
def get_db_password(password):
487
    return password
488
 
489
def check_for_valid_password(password):
490
    if not password:
491
        raise UserContextException(105,"password cannot be null")
492
    return True
493
#------------------------------------------------------------------------------ 
494
 
495
#===============================================================================
496
# raises the UserContextException
497
#===============================================================================
498
def raise_user_exception(user_id):
766 rajveer 499
    raise UserContextException(101, "no such user in system %d" %(user_id))
500
 
2641 varun.gupt 501
'''
502
My Notes methods
503
'''
504
def get_user_notes(user_id, entity_id):
505
    return UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).all()
506
 
2717 varun.gupt 507
def put_user_note(user_id, entity_id, slide, note):
508
    user_notes = UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).filter_by(slide = slide).all()
2641 varun.gupt 509
 
510
    if user_notes is None or len(user_notes) == 0:
511
        user_note = UserNote()
512
        user_note.user_id = user_id
513
        user_note.entity_id = entity_id
2717 varun.gupt 514
        user_note.slide = slide
2641 varun.gupt 515
        user_note.note = note
516
    else:
517
        user_note = user_notes.pop()
518
        user_note.note = note
519
 
520
    session.commit()
521
 
2981 rajveer 522
 
523
def get_my_research_items(userId):
524
    query = UserWidgetItem.query.filter_by(userId=userId)
525
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
526
    query = query.order_by(desc(UserWidgetItem.addedOn))
527
    widgetItems = query.all()
528
    return [widgetItem.itemId for widgetItem in widgetItems]
529
 
530
def get_browse_history_items(userId):
531
    query = UserWidgetItem.query.filter_by(userId=userId)
532
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
533
    query = query.order_by(desc(UserWidgetItem.addedOn)).limit(10)
534
    widgetItems = query.all()
535
    return [widgetItem.itemId for widgetItem in widgetItems]
536
 
537
def update_my_research(userId, itemId):
538
    isNew = False
539
    query = UserWidgetItem.query.filter_by(userId=userId)
540
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
541
    query = query.filter_by(itemId=itemId)
542
    widgetItem = query.first()
543
    if not widgetItem:
544
        isNew = True
545
        widgetItem = UserWidgetItem()
546
        widgetItem.userId = userId
547
        widgetItem.widgetId = WType.MY_RESEARCH
548
        widgetItem.itemId = itemId  
549
    widgetItem.addedOn = datetime.datetime.now()
550
    session.commit()
551
    return isNew
552
 
553
def update_browse_history(userId, itemId):
554
    query = UserWidgetItem.query.filter_by(userId=userId)
555
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
556
    query = query.filter_by(itemId=itemId)
557
    widgetItem = query.first()
558
    if not widgetItem:
559
        widgetItem = UserWidgetItem()
560
        widgetItem.userId = userId
561
        widgetItem.widgetId = WType.BROWSE_HISTORY
562
        widgetItem.itemId = itemId
563
    widgetItem.addedOn = datetime.datetime.now()
564
    session.commit()
565
 
566
def delete_item_from_my_research(userId, itemId):
567
    query = UserWidgetItem.query.filter_by(userId=userId)
568
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
569
    query = query.filter_by(itemId=itemId)
570
    widgetItem = query.first()
571
    if widgetItem:
572
        widgetItem.delete()
573
        session.commit()
574
    else:
575
        print "Not item in my research to delete with itemId" + itemId
576
 
766 rajveer 577
def close_session():
578
    if session.is_active:
579
        print "session is active. closing it."
580
        session.close()