Subversion Repositories SmartDukaan

Rev

Rev 3187 | Rev 3293 | 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
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()
3206 mandeep.dh 271
    return True
272
 
1583 varun.gupt 273
def get_user_communication_by_id(user_communication_id):
274
    return UserCommunication.get_by(id = user_communication_id)
275
 
276
def get_user_communication_by_user(user_communication_user_id):
1607 vikas 277
    return UserCommunication.query.filter_by(user_id = user_communication_user_id).order_by(-UserCommunication.id).all()
1583 varun.gupt 278
 
279
def get_all_user_communications():
1863 vikas 280
    return UserCommunication.query.order_by(-UserCommunication.id).all()
1583 varun.gupt 281
 
1859 vikas 282
def create_master_affiliate(name, added_on):
1845 vikas 283
    master_affiliate = MasterAffiliate()
284
    master_affiliate.name = name
1859 vikas 285
    master_affiliate.added_on = to_py_date(added_on)
1845 vikas 286
    session.commit()
287
    return master_affiliate
288
 
1899 vikas 289
def get_all_master_affiliates():
290
    return MasterAffiliate.query.all()
291
 
1845 vikas 292
def get_master_affiliate_by_id(id):
293
    return MasterAffiliate.get_by(id = id)
294
 
295
def get_master_affiliate_by_name(name):
296
    return MasterAffiliate.get_by(name = name)
297
 
1859 vikas 298
def create_affiliate(name, url, master_affiliate_id, added_on):
1845 vikas 299
    affiliate = Affiliate()
300
    affiliate.name = name
301
    if url is not None:
302
        affiliate.url = url
303
    affiliate.master_affiliate_id = master_affiliate_id
1859 vikas 304
    affiliate.added_on = to_py_date(added_on)
1845 vikas 305
    session.commit()
306
    return affiliate
307
 
308
def get_affiliate_by_id(id):
309
    return Affiliate.get_by(id = id)
310
 
311
def get_affiliate_by_name(name):
312
    return Affiliate.get_by(name = name)
313
 
314
def get_affiliates_by_master_affiliate(master_affiliate_id):
315
    return MasterAffiliate.get_by(id =  master_affiliate_id).affiliates
316
 
317
def get_tracker_by_id(id):
318
    return Tracker.get_by(id = id)
319
 
1996 vikas 320
def add_track_log(affiliate_id, user_id, event, url, data, added_on):
1845 vikas 321
    track_log = TrackLog()
1996 vikas 322
    track_log.affiliate_id = affiliate_id
1845 vikas 323
    if user_id:
324
        track_log.user_id = user_id
325
    track_log.event = event
326
    if url:
327
        track_log.url = url
328
    if data:
1859 vikas 329
        track_log.data = data
330
    track_log.added_on = to_py_date(added_on)
1845 vikas 331
    session.commit()
332
    return track_log.id
333
 
334
def get_track_log_by_id(id):
335
    return TrackLog.get_by(id = id)
336
 
1996 vikas 337
def get_track_logs_by_affiliate(affiliate_id):
338
    return Affiliate.get_by(id = affiliate_id).tracklogs
1845 vikas 339
 
340
def get_track_logs_by_user(user_id):
341
    return TrackLog.query.filter(TrackLog.user_id == user_id).all()
342
 
1996 vikas 343
def get_track_logs(affiliate_id, user_id, event, url):
1845 vikas 344
    query = TrackLog.query
345
 
1996 vikas 346
    if affiliate_id:
347
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
348
    if user_id:
349
        query = query.filter(TrackLog.user_id == user_id)
1845 vikas 350
    if event:
351
        query = query.filter(TrackLog.event == event)
352
    if url:
353
        query = query.filter(TrackLog.url == url)
354
    return query.all()
355
 
356
 
557 chandransh 357
def get_address(address_id):
358
    address = Address.get_by(id=address_id)
359
    return address
360
 
361
def get_social_service(service_id):
362
    service = SocialService.get_by(service_id)
363
    return service
364
 
365
def add_ip_address_for_user(ip_address, time_stamp, user_id):
366
    user = get_user_by_id(user_id)
130 ashish 367
    if not user:
368
        raise_user_exception(user_id)
557 chandransh 369
    #user exists create an IP address object
370
    ip_address = IPMap()
371
    ip_address.ip = ip_address
372
    ip_address.timestamp = to_py_date(time_stamp)
373
    ip_address.user_state = user.state
130 ashish 374
    session.commit()
375
    return True
376
 
377
def get_social_service_by_name(service_name):
378
    service = SocialService.get_by(name=service_name)
379
 
380
    if not service:
381
        raise UserContextException(106, "No such social service exists")
382
    return service
383
 
384
def add_social_handle(user_id, social_service, handle):
557 chandransh 385
    user = get_user_by_id(user_id)
130 ashish 386
 
387
    if not user:
388
        raise_user_exception(user_id)
389
 
390
    service = get_social_service_by_name(social_service)
391
 
392
    #get if use already has this service.
557 chandransh 393
    social_handle = SocialHandle.filter(service=service).filter(user=user).one()
130 ashish 394
    if not social_handle:
395
        #create a new handle
396
        social_handle = SocialHandle()
397
        social_handle.service = service
557 chandransh 398
        social_handle.user = user
130 ashish 399
        social_handle.handle = handle
400
    else:
401
        social_handle.handle = handle
557 chandransh 402
    session.commit()
130 ashish 403
    return True
557 chandransh 404
 
884 rajveer 405
 
406
def forgot_password(email, password):
407
    try:
408
        user = User.get_by(email=email)
409
        if user:
410
            user.password = password
900 rajveer 411
            session.commit()
884 rajveer 412
            return True
413
        else:
414
            return False
415
    except:
416
        return False
417
 
418
 
419
'''
581 rajveer 420
def forgot_password(email):
421
    try:
422
        user = User.get_by(email=email)
423
        if user:
873 rajveer 424
            new_password = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8))
581 rajveer 425
            mail = Mail()
426
            mail.to = []
427
            mail.to.append(email)
428
            mail.sender = ""
429
            mail.password = ""
430
            mail.data = "Your new password is " + user.password
431
            helper_client = HelperClient()
432
            helper_client.__start__()
433
            client = helper_client.get_client()
434
            client.sendMail(mail);
873 rajveer 435
 
581 rajveer 436
            return True
437
        else:
438
            return False
439
    except:
440
        return False
884 rajveer 441
'''    
581 rajveer 442
 
594 rajveer 443
def get_all_addresses_for_user(userId):
2895 chandransh 444
    return Address.query.filter_by(user_id = userId, enabled=True).all()
581 rajveer 445
 
785 rajveer 446
def get_default_address_id(userId):
594 rajveer 447
    user = get_user_by_id(userId);
840 chandransh 448
    if user.default_address_id is None:
449
        return 0
594 rajveer 450
    return user.default_address_id
581 rajveer 451
 
785 rajveer 452
def get_default_pincode(user_id):
453
    user = get_user_by_id(user_id)
454
    if not user:
455
        raise_user_exception(user_id)
456
    default_address_id = user.default_address_id
457
    if default_address_id:
458
        address = Address.get_by(id=default_address_id)
459
        default_pincode = address.pin 
460
    else:
461
        default_pincode = '110001' 
462
    return default_pincode     
1596 ankur.sing 463
 
464
def get_user_count(user_type):
465
    if user_type is None:
466
        return User.query.count()
467
    else:
468
        return User.query.filter_by(is_anonymous = user_type).count()
785 rajveer 469
 
1891 ankur.sing 470
def get_users(user_type, start_date, end_date):
471
    query = session.query(User).join(UserState)
472
    if start_date != -1:
473
        query = query.filter(UserState.active_since >= to_py_date(start_date))
474
    if end_date != -1:
475
        query = query.filter(UserState.active_since <= to_py_date(end_date))
476
    if user_type is not None:
477
        query = query.filter(User.is_anonymous == user_type)
478
    return query.all()
1673 ankur.sing 479
 
130 ashish 480
#=============================================================================
481
# Helper functions 
482
#=============================================================================
483
 
484
'''
485
This function returns the password as stored in the db
486
'''    
487
def get_db_password(password):
488
    return password
489
 
490
def check_for_valid_password(password):
491
    if not password:
492
        raise UserContextException(105,"password cannot be null")
493
    return True
494
#------------------------------------------------------------------------------ 
495
 
496
#===============================================================================
497
# raises the UserContextException
498
#===============================================================================
499
def raise_user_exception(user_id):
766 rajveer 500
    raise UserContextException(101, "no such user in system %d" %(user_id))
501
 
2641 varun.gupt 502
'''
503
My Notes methods
504
'''
505
def get_user_notes(user_id, entity_id):
506
    return UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).all()
507
 
2717 varun.gupt 508
def put_user_note(user_id, entity_id, slide, note):
509
    user_notes = UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).filter_by(slide = slide).all()
2641 varun.gupt 510
 
511
    if user_notes is None or len(user_notes) == 0:
512
        user_note = UserNote()
513
        user_note.user_id = user_id
514
        user_note.entity_id = entity_id
2717 varun.gupt 515
        user_note.slide = slide
2641 varun.gupt 516
        user_note.note = note
517
    else:
518
        user_note = user_notes.pop()
519
        user_note.note = note
520
 
521
    session.commit()
522
 
2981 rajveer 523
 
524
def get_my_research_items(userId):
525
    query = UserWidgetItem.query.filter_by(userId=userId)
526
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
527
    query = query.order_by(desc(UserWidgetItem.addedOn))
528
    widgetItems = query.all()
529
    return [widgetItem.itemId for widgetItem in widgetItems]
530
 
531
def get_browse_history_items(userId):
532
    query = UserWidgetItem.query.filter_by(userId=userId)
533
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
534
    query = query.order_by(desc(UserWidgetItem.addedOn)).limit(10)
535
    widgetItems = query.all()
536
    return [widgetItem.itemId for widgetItem in widgetItems]
537
 
538
def update_my_research(userId, itemId):
539
    isNew = False
540
    query = UserWidgetItem.query.filter_by(userId=userId)
541
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
542
    query = query.filter_by(itemId=itemId)
543
    widgetItem = query.first()
544
    if not widgetItem:
545
        isNew = True
546
        widgetItem = UserWidgetItem()
547
        widgetItem.userId = userId
548
        widgetItem.widgetId = WType.MY_RESEARCH
549
        widgetItem.itemId = itemId  
550
    widgetItem.addedOn = datetime.datetime.now()
551
    session.commit()
552
    return isNew
553
 
554
def update_browse_history(userId, itemId):
555
    query = UserWidgetItem.query.filter_by(userId=userId)
556
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
557
    query = query.filter_by(itemId=itemId)
558
    widgetItem = query.first()
559
    if not widgetItem:
560
        widgetItem = UserWidgetItem()
561
        widgetItem.userId = userId
562
        widgetItem.widgetId = WType.BROWSE_HISTORY
563
        widgetItem.itemId = itemId
564
    widgetItem.addedOn = datetime.datetime.now()
565
    session.commit()
566
 
567
def delete_item_from_my_research(userId, itemId):
568
    query = UserWidgetItem.query.filter_by(userId=userId)
569
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
570
    query = query.filter_by(itemId=itemId)
571
    widgetItem = query.first()
572
    if widgetItem:
573
        widgetItem.delete()
574
        session.commit()
575
    else:
576
        print "Not item in my research to delete with itemId" + itemId
577
 
766 rajveer 578
def close_session():
579
    if session.is_active:
580
        print "session is active. closing it."
581
        session.close()