Subversion Repositories SmartDukaan

Rev

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