Subversion Repositories SmartDukaan

Rev

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