Subversion Repositories SmartDukaan

Rev

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