Subversion Repositories SmartDukaan

Rev

Rev 5036 | Rev 5341 | 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
5326 rajveer 9
from shop2020.model.v1.user.impl.Dataservice import User, UserCommunication, \
10
    Address, 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
5326 rajveer 17
from shop2020.model.v1.user.impl.CartDataAccessors import create_cart
130 ashish 18
 
2981 rajveer 19
 
3187 rajveer 20
def initialize(dbname='user', db_hostname="localhost"):
130 ashish 21
    log_entry("initialize@DataAccessor", "Initializing data service")
3187 rajveer 22
    Dataservice.initialize(dbname, db_hostname)
557 chandransh 23
 
5326 rajveer 24
def create_anonymous_user(jsession_id):
576 chandransh 25
    user=User.get_by(jsession_id=jsession_id)
5036 rajveer 26
    #user=User.query.with_lockmode("update").filter_by(jsession_id=jsession_id)
576 chandransh 27
    if not user is None:
28
        return user
5326 rajveer 29
    cart = create_cart()
557 chandransh 30
    user = User()
31
    anonymous_str = "anonymous"
576 chandransh 32
    user.email = jsession_id + "@anonymous.com"
557 chandransh 33
    user.password = anonymous_str
34
    user.name = anonymous_str
35
    user.communication_email = jsession_id + "@anonymous.com"
36
    user.jsession_id = jsession_id
37
    user.is_anonymous = True
38
    user.sex = Sex.WONT_SAY
5326 rajveer 39
    user.active_cart = cart
3499 mandeep.dh 40
    user.trust_level = 0
5326 rajveer 41
    user.active_since = datetime.datetime.now()
2747 chandransh 42
    session.commit()
557 chandransh 43
 
44
    return user
45
 
46
def get_user_by_id(user_id):
47
    return User.get_by(id=user_id)
48
 
5326 rajveer 49
def get_user_by_cart_id(cart_id):
50
    return User.get_by(active_cart_id=cart_id)
51
 
3032 mandeep.dh 52
def get_user_by_mobile_number(mobile_number):
53
    return User.get_by(mobile_number=mobile_number)
54
 
1491 vikas 55
def get_user_by_email(email):
56
    return User.get_by(email=email)
57
 
5326 rajveer 58
def create_user(user_to_add):
5036 rajveer 59
    if user_exists(user_to_add.email):
60
        raise UserContextException(109, "User already exists with this email id.")
5326 rajveer 61
 
62
    cart = create_cart()
63
 
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
5326 rajveer 73
    user.active_cart = cart
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)
3499 mandeep.dh 77
    user.trust_level = 0
5326 rajveer 78
    user.active_since = datetime.datetime.now()
130 ashish 79
    session.commit()
557 chandransh 80
    return user
130 ashish 81
 
82
#===============================================================================
83
# Need to provide the update apis here for relevant fields in PrimaryInfo.
84
#===============================================================================
557 chandransh 85
def update_user(user_to_update):
594 rajveer 86
    if not user_to_update.userId:
415 ashish 87
        raise UserContextException(110, "user does not exist")
594 rajveer 88
    user = get_user_by_id(user_to_update.userId)
89
    user.email = user_to_update.email
90
    user.password = user_to_update.password
91
    user.name = user_to_update.name
92
    user.communication_email = user_to_update.communicationEmail
93
    user.jsession_id = user_to_update.jsessionId
94
    user.is_anonymous = user_to_update.isAnonymous
95
    user.sex = user_to_update.sex
96
    user.date_of_birth = user_to_update.dateOfBirth
97
    user.mobile_number = user_to_update.mobileNumber
415 ashish 98
    session.commit()
594 rajveer 99
    return user
415 ashish 100
 
557 chandransh 101
def authenticate_user(user_handle, password):
102
    user = User.get_by(email=user_handle)
130 ashish 103
    if not user:
557 chandransh 104
        raise AuthenticationException("This email address is not registered.", 102)
130 ashish 105
 
557 chandransh 106
    if user.password == get_db_password(password):
107
        return user
130 ashish 108
    else:
109
        raise AuthenticationException("Wrong username or password", 102)
110
 
111
def user_exists(email):
413 rajveer 112
    try:
557 chandransh 113
        user = User.get_by(email=email)
114
        if user:
115
            return True
116
        else:
117
            return False
413 rajveer 118
    except:
130 ashish 119
        return False
120
 
567 rajveer 121
def add_address_for_user(address, user_id, set_default):
557 chandransh 122
    user = get_user_by_id(user_id)
766 rajveer 123
 
130 ashish 124
    if not user:
125
        raise_user_exception(user_id)
126
    if not address:
127
        raise UserContextException(103,"Address cannot be null")
128
 
129
    address_to_add = Address()
130
    address_to_add.line_1 = address.line1
131
    address_to_add.line_2 = address.line2
132
    address_to_add.landmark = address.landmark
133
    address_to_add.city = address.city
134
    address_to_add.country = address.country
135
    address_to_add.state = address.state
136
    address_to_add.pin = address.pin
137
    address_to_add.type = address.type
414 ashish 138
    address_to_add.name = address.name
139
    address_to_add.phone = address.phone
130 ashish 140
    address_to_add.added_on = to_py_date(address.addedOn)
141
    address_to_add.enabled = True
557 chandransh 142
    address_to_add.user = user
130 ashish 143
    session.commit()
509 rajveer 144
 
557 chandransh 145
    if set_default is True:
146
        user.default_address_id = address_to_add.id
567 rajveer 147
    #set default address if nothing is default    
148
    if user.default_address_id is None:
149
        user.default_address_id = address_to_add.id
150
 
557 chandransh 151
    session.commit()
513 rajveer 152
 
567 rajveer 153
    return address_to_add.id
513 rajveer 154
 
130 ashish 155
def remove_address_for_user(user_id, address_id):
156
    address = get_address(address_id) 
157
 
158
    if not address:
557 chandransh 159
        raise UserContextException(103, "Address not found")
160
    if address.user.id != user_id:
161
        raise UserContextException(104, "This address belongs to some other user")
130 ashish 162
 
163
    address.enabled = False
164
    session.commit()
165
    return True
166
 
167
def set_user_as_logged_in(user_id, time_stamp):
5326 rajveer 168
    user = User.get_by(id=user_id)
130 ashish 169
 
5326 rajveer 170
    if not user:
557 chandransh 171
        raise_user_exception(user_id)
130 ashish 172
 
173
    if not time_stamp:
5326 rajveer 174
        user.last_login = datetime.datetime.now()
557 chandransh 175
    else:
5326 rajveer 176
        user.last_login = to_py_date(time_stamp)
130 ashish 177
    session.commit()
178
    return True
179
 
557 chandransh 180
def set_user_as_logged_out(user_id, time_stamp):
5326 rajveer 181
    user = User.get_by(id=user_id)
130 ashish 182
 
5326 rajveer 183
    if not user:
130 ashish 184
        raise_user_exception(user_id)
185
 
186
    if not time_stamp:
5326 rajveer 187
        user.last_logout = datetime.datetime.now()
557 chandransh 188
    else:
5326 rajveer 189
        user.last_logout = to_py_date(time_stamp)
130 ashish 190
    session.commit()
191
    return True
192
 
557 chandransh 193
def set_default_address(user_id, address_id):
194
    user = get_user_by_id(user_id)
195
    address = Address.get_by(id=address_id)
196
    if not user:
197
        raise_user_exception(user_id)
198
    if not address:
199
        raise UserContextException(103, "Address not found")
200
    if address.user.id != user.id:
201
        raise UserContextException(104, "This address belongs to some other user")
202
 
203
    user.default_address_id = address_id 
204
    session.commit()
205
 
594 rajveer 206
def update_password(user_id, old_password, new_password):
557 chandransh 207
    user = get_user_by_id(user_id)
130 ashish 208
 
209
    if not user:
210
        raise_user_exception(user_id)
211
 
594 rajveer 212
    if user.password != old_password:
213
        return False
214
 
215
    if check_for_valid_password(new_password):
216
        user.password = get_db_password(new_password)
130 ashish 217
        session.commit()
218
        return True
219
    else:
220
        return False
1273 varun.gupt 221
 
222
 
223
def create_user_communication(user_id, email, communication_type, order_id, awb, product, subject, message):
224
 
225
    user_communication = UserCommunication()
226
    user_communication.user_id = user_id
227
    user_communication.communication_type = communication_type
1743 varun.gupt 228
 
229
    if order_id > 0:
230
        user_communication.order_id = order_id
1273 varun.gupt 231
    user_communication.airwaybill_no = awb
232
    user_communication.reply_to = email
233
    user_communication.product_name = product
234
    user_communication.subject = subject
235
    user_communication.message = message
1301 varun.gupt 236
    user_communication.communication_timestamp = datetime.datetime.now()
1273 varun.gupt 237
    session.commit()
3206 mandeep.dh 238
    return True
239
 
1583 varun.gupt 240
def get_user_communication_by_id(user_communication_id):
241
    return UserCommunication.get_by(id = user_communication_id)
242
 
243
def get_user_communication_by_user(user_communication_user_id):
1607 vikas 244
    return UserCommunication.query.filter_by(user_id = user_communication_user_id).order_by(-UserCommunication.id).all()
1583 varun.gupt 245
 
246
def get_all_user_communications():
1863 vikas 247
    return UserCommunication.query.order_by(-UserCommunication.id).all()
1583 varun.gupt 248
 
1859 vikas 249
def create_master_affiliate(name, added_on):
1845 vikas 250
    master_affiliate = MasterAffiliate()
251
    master_affiliate.name = name
1859 vikas 252
    master_affiliate.added_on = to_py_date(added_on)
1845 vikas 253
    session.commit()
254
    return master_affiliate
255
 
1899 vikas 256
def get_all_master_affiliates():
257
    return MasterAffiliate.query.all()
258
 
1845 vikas 259
def get_master_affiliate_by_id(id):
260
    return MasterAffiliate.get_by(id = id)
261
 
262
def get_master_affiliate_by_name(name):
263
    return MasterAffiliate.get_by(name = name)
264
 
1859 vikas 265
def create_affiliate(name, url, master_affiliate_id, added_on):
1845 vikas 266
    affiliate = Affiliate()
267
    affiliate.name = name
268
    if url is not None:
269
        affiliate.url = url
270
    affiliate.master_affiliate_id = master_affiliate_id
1859 vikas 271
    affiliate.added_on = to_py_date(added_on)
1845 vikas 272
    session.commit()
273
    return affiliate
274
 
275
def get_affiliate_by_id(id):
276
    return Affiliate.get_by(id = id)
277
 
278
def get_affiliate_by_name(name):
279
    return Affiliate.get_by(name = name)
280
 
281
def get_affiliates_by_master_affiliate(master_affiliate_id):
282
    return MasterAffiliate.get_by(id =  master_affiliate_id).affiliates
283
 
284
def get_tracker_by_id(id):
285
    return Tracker.get_by(id = id)
286
 
1996 vikas 287
def add_track_log(affiliate_id, user_id, event, url, data, added_on):
1845 vikas 288
    track_log = TrackLog()
1996 vikas 289
    track_log.affiliate_id = affiliate_id
1845 vikas 290
    if user_id:
291
        track_log.user_id = user_id
3378 vikas 292
    track_log.event_id = event
1845 vikas 293
    if url:
294
        track_log.url = url
295
    if data:
1859 vikas 296
        track_log.data = data
297
    track_log.added_on = to_py_date(added_on)
1845 vikas 298
    session.commit()
299
    return track_log.id
300
 
301
def get_track_log_by_id(id):
302
    return TrackLog.get_by(id = id)
303
 
3293 vikas 304
def get_track_logs_by_affiliate(affiliate_id, start_date, end_date):
305
    query = TrackLog.query
306
 
307
    if affiliate_id:
308
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
309
    if start_date:
310
        query = query.filter(TrackLog.added_on >= to_py_date(start_date))
311
    if end_date:
312
        query = query.filter(TrackLog.added_on <= to_py_date(end_date))
313
    return query.all()
1845 vikas 314
 
315
def get_track_logs_by_user(user_id):
316
    return TrackLog.query.filter(TrackLog.user_id == user_id).all()
317
 
1996 vikas 318
def get_track_logs(affiliate_id, user_id, event, url):
1845 vikas 319
    query = TrackLog.query
320
 
1996 vikas 321
    if affiliate_id:
322
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
323
    if user_id:
324
        query = query.filter(TrackLog.user_id == user_id)
1845 vikas 325
    if event:
326
        query = query.filter(TrackLog.event == event)
327
    if url:
328
        query = query.filter(TrackLog.url == url)
329
    return query.all()
330
 
331
 
557 chandransh 332
def get_address(address_id):
333
    address = Address.get_by(id=address_id)
334
    return address
335
 
884 rajveer 336
def forgot_password(email, password):
337
    try:
338
        user = User.get_by(email=email)
339
        if user:
340
            user.password = password
900 rajveer 341
            session.commit()
884 rajveer 342
            return True
343
        else:
344
            return False
345
    except:
346
        return False
347
 
594 rajveer 348
def get_all_addresses_for_user(userId):
2895 chandransh 349
    return Address.query.filter_by(user_id = userId, enabled=True).all()
581 rajveer 350
 
785 rajveer 351
def get_default_address_id(userId):
594 rajveer 352
    user = get_user_by_id(userId);
840 chandransh 353
    if user.default_address_id is None:
354
        return 0
594 rajveer 355
    return user.default_address_id
581 rajveer 356
 
785 rajveer 357
def get_default_pincode(user_id):
358
    user = get_user_by_id(user_id)
359
    if not user:
360
        raise_user_exception(user_id)
361
    default_address_id = user.default_address_id
362
    if default_address_id:
363
        address = Address.get_by(id=default_address_id)
364
        default_pincode = address.pin 
365
    else:
366
        default_pincode = '110001' 
367
    return default_pincode     
1596 ankur.sing 368
 
369
def get_user_count(user_type):
370
    if user_type is None:
371
        return User.query.count()
372
    else:
373
        return User.query.filter_by(is_anonymous = user_type).count()
785 rajveer 374
 
1891 ankur.sing 375
def get_users(user_type, start_date, end_date):
5326 rajveer 376
    query = session.query(User)
1891 ankur.sing 377
    if start_date != -1:
5326 rajveer 378
        query = query.filter(User.active_since >= to_py_date(start_date))
1891 ankur.sing 379
    if end_date != -1:
5326 rajveer 380
        query = query.filter(User.active_since <= to_py_date(end_date))
1891 ankur.sing 381
    if user_type is not None:
382
        query = query.filter(User.is_anonymous == user_type)
383
    return query.all()
1673 ankur.sing 384
 
130 ashish 385
#=============================================================================
386
# Helper functions 
387
#=============================================================================
388
 
389
'''
390
This function returns the password as stored in the db
391
'''    
392
def get_db_password(password):
393
    return password
394
 
395
def check_for_valid_password(password):
396
    if not password:
397
        raise UserContextException(105,"password cannot be null")
398
    return True
399
#------------------------------------------------------------------------------ 
400
 
401
#===============================================================================
402
# raises the UserContextException
403
#===============================================================================
404
def raise_user_exception(user_id):
766 rajveer 405
    raise UserContextException(101, "no such user in system %d" %(user_id))
406
 
2641 varun.gupt 407
'''
408
My Notes methods
409
'''
410
def get_user_notes(user_id, entity_id):
411
    return UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).all()
412
 
2717 varun.gupt 413
def put_user_note(user_id, entity_id, slide, note):
414
    user_notes = UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).filter_by(slide = slide).all()
2641 varun.gupt 415
 
416
    if user_notes is None or len(user_notes) == 0:
417
        user_note = UserNote()
418
        user_note.user_id = user_id
419
        user_note.entity_id = entity_id
2717 varun.gupt 420
        user_note.slide = slide
2641 varun.gupt 421
        user_note.note = note
422
    else:
423
        user_note = user_notes.pop()
424
        user_note.note = note
425
 
426
    session.commit()
427
 
2981 rajveer 428
 
429
def get_my_research_items(userId):
430
    query = UserWidgetItem.query.filter_by(userId=userId)
431
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
432
    query = query.order_by(desc(UserWidgetItem.addedOn))
433
    widgetItems = query.all()
434
    return [widgetItem.itemId for widgetItem in widgetItems]
435
 
436
def get_browse_history_items(userId):
437
    query = UserWidgetItem.query.filter_by(userId=userId)
438
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
439
    query = query.order_by(desc(UserWidgetItem.addedOn)).limit(10)
440
    widgetItems = query.all()
441
    return [widgetItem.itemId for widgetItem in widgetItems]
442
 
443
def update_my_research(userId, itemId):
444
    isNew = False
445
    query = UserWidgetItem.query.filter_by(userId=userId)
446
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
447
    query = query.filter_by(itemId=itemId)
448
    widgetItem = query.first()
449
    if not widgetItem:
450
        isNew = True
451
        widgetItem = UserWidgetItem()
452
        widgetItem.userId = userId
453
        widgetItem.widgetId = WType.MY_RESEARCH
454
        widgetItem.itemId = itemId  
455
    widgetItem.addedOn = datetime.datetime.now()
456
    session.commit()
457
    return isNew
458
 
459
def update_browse_history(userId, itemId):
460
    query = UserWidgetItem.query.filter_by(userId=userId)
461
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
462
    query = query.filter_by(itemId=itemId)
463
    widgetItem = query.first()
464
    if not widgetItem:
465
        widgetItem = UserWidgetItem()
466
        widgetItem.userId = userId
467
        widgetItem.widgetId = WType.BROWSE_HISTORY
468
        widgetItem.itemId = itemId
469
    widgetItem.addedOn = datetime.datetime.now()
470
    session.commit()
471
 
472
def delete_item_from_my_research(userId, itemId):
473
    query = UserWidgetItem.query.filter_by(userId=userId)
474
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
475
    query = query.filter_by(itemId=itemId)
476
    widgetItem = query.first()
477
    if widgetItem:
478
        widgetItem.delete()
479
        session.commit()
480
    else:
481
        print "Not item in my research to delete with itemId" + itemId
482
 
3499 mandeep.dh 483
def increase_trust_level(userId, trustLevelDelta):
484
    user = User.query.filter_by(id = userId).with_lockmode('update').first()
485
    user.trust_level += trustLevelDelta
486
    session.commit()
487
 
766 rajveer 488
def close_session():
489
    if session.is_active:
490
        print "session is active. closing it."
3376 rajveer 491
        session.close()
492
 
493
def is_alive():
494
    try:
495
        session.query(User.id).limit(1).one()
496
        return True
497
    except:
498
        return False