Subversion Repositories SmartDukaan

Rev

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