Subversion Repositories SmartDukaan

Rev

Rev 7883 | Rev 8201 | 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:
7884 rajveer 110
        if user.fbusers and user.fbusers[0]:
111
            fuser = user.fbusers[0]
112
        else:
113
            fuser = FacebookUser()
7883 rajveer 114
        if user_to_update.facebookAccessToken is not None:
115
            fuser.facebook_access_token = user_to_update.facebookAccessToken
116
        if user_to_update.facebookId is not None:
117
            fuser.facebook_id = user_to_update.facebookId
118
        fuser.user = user
415 ashish 119
    session.commit()
594 rajveer 120
    return user
415 ashish 121
 
557 chandransh 122
def authenticate_user(user_handle, password):
123
    user = User.get_by(email=user_handle)
130 ashish 124
    if not user:
557 chandransh 125
        raise AuthenticationException("This email address is not registered.", 102)
130 ashish 126
 
557 chandransh 127
    if user.password == get_db_password(password):
128
        return user
130 ashish 129
    else:
130
        raise AuthenticationException("Wrong username or password", 102)
131
 
132
def user_exists(email):
413 rajveer 133
    try:
557 chandransh 134
        user = User.get_by(email=email)
135
        if user:
136
            return True
137
        else:
138
            return False
413 rajveer 139
    except:
130 ashish 140
        return False
141
 
567 rajveer 142
def add_address_for_user(address, user_id, set_default):
557 chandransh 143
    user = get_user_by_id(user_id)
766 rajveer 144
 
130 ashish 145
    if not user:
146
        raise_user_exception(user_id)
147
    if not address:
148
        raise UserContextException(103,"Address cannot be null")
149
 
150
    address_to_add = Address()
151
    address_to_add.line_1 = address.line1
152
    address_to_add.line_2 = address.line2
153
    address_to_add.landmark = address.landmark
154
    address_to_add.city = address.city
155
    address_to_add.country = address.country
156
    address_to_add.state = address.state
157
    address_to_add.pin = address.pin
158
    address_to_add.type = address.type
414 ashish 159
    address_to_add.name = address.name
160
    address_to_add.phone = address.phone
130 ashish 161
    address_to_add.added_on = to_py_date(address.addedOn)
162
    address_to_add.enabled = True
557 chandransh 163
    address_to_add.user = user
130 ashish 164
    session.commit()
509 rajveer 165
 
557 chandransh 166
    if set_default is True:
167
        user.default_address_id = address_to_add.id
567 rajveer 168
    #set default address if nothing is default    
169
    if user.default_address_id is None:
170
        user.default_address_id = address_to_add.id
171
 
557 chandransh 172
    session.commit()
513 rajveer 173
 
567 rajveer 174
    return address_to_add.id
513 rajveer 175
 
130 ashish 176
def remove_address_for_user(user_id, address_id):
177
    address = get_address(address_id) 
178
 
179
    if not address:
557 chandransh 180
        raise UserContextException(103, "Address not found")
181
    if address.user.id != user_id:
182
        raise UserContextException(104, "This address belongs to some other user")
130 ashish 183
 
184
    address.enabled = False
185
    session.commit()
186
    return True
187
 
188
def set_user_as_logged_in(user_id, time_stamp):
5326 rajveer 189
    user = User.get_by(id=user_id)
130 ashish 190
 
5326 rajveer 191
    if not user:
557 chandransh 192
        raise_user_exception(user_id)
130 ashish 193
 
194
    if not time_stamp:
5326 rajveer 195
        user.last_login = datetime.datetime.now()
557 chandransh 196
    else:
5326 rajveer 197
        user.last_login = to_py_date(time_stamp)
130 ashish 198
    session.commit()
199
    return True
200
 
557 chandransh 201
def set_user_as_logged_out(user_id, time_stamp):
5326 rajveer 202
    user = User.get_by(id=user_id)
130 ashish 203
 
5326 rajveer 204
    if not user:
130 ashish 205
        raise_user_exception(user_id)
206
 
207
    if not time_stamp:
5326 rajveer 208
        user.last_logout = datetime.datetime.now()
557 chandransh 209
    else:
5326 rajveer 210
        user.last_logout = to_py_date(time_stamp)
130 ashish 211
    session.commit()
212
    return True
213
 
557 chandransh 214
def set_default_address(user_id, address_id):
215
    user = get_user_by_id(user_id)
216
    address = Address.get_by(id=address_id)
217
    if not user:
218
        raise_user_exception(user_id)
219
    if not address:
220
        raise UserContextException(103, "Address not found")
221
    if address.user.id != user.id:
222
        raise UserContextException(104, "This address belongs to some other user")
223
 
224
    user.default_address_id = address_id 
225
    session.commit()
226
 
594 rajveer 227
def update_password(user_id, old_password, new_password):
557 chandransh 228
    user = get_user_by_id(user_id)
130 ashish 229
 
230
    if not user:
231
        raise_user_exception(user_id)
232
 
594 rajveer 233
    if user.password != old_password:
234
        return False
235
 
236
    if check_for_valid_password(new_password):
237
        user.password = get_db_password(new_password)
130 ashish 238
        session.commit()
239
        return True
240
    else:
241
        return False
1273 varun.gupt 242
 
243
 
244
def create_user_communication(user_id, email, communication_type, order_id, awb, product, subject, message):
245
 
246
    user_communication = UserCommunication()
247
    user_communication.user_id = user_id
248
    user_communication.communication_type = communication_type
1743 varun.gupt 249
 
250
    if order_id > 0:
251
        user_communication.order_id = order_id
1273 varun.gupt 252
    user_communication.airwaybill_no = awb
253
    user_communication.reply_to = email
254
    user_communication.product_name = product
255
    user_communication.subject = subject
256
    user_communication.message = message
1301 varun.gupt 257
    user_communication.communication_timestamp = datetime.datetime.now()
1273 varun.gupt 258
    session.commit()
3206 mandeep.dh 259
    return True
260
 
1583 varun.gupt 261
def get_user_communication_by_id(user_communication_id):
262
    return UserCommunication.get_by(id = user_communication_id)
263
 
264
def get_user_communication_by_user(user_communication_user_id):
1607 vikas 265
    return UserCommunication.query.filter_by(user_id = user_communication_user_id).order_by(-UserCommunication.id).all()
1583 varun.gupt 266
 
267
def get_all_user_communications():
1863 vikas 268
    return UserCommunication.query.order_by(-UserCommunication.id).all()
1583 varun.gupt 269
 
5407 amar.kumar 270
def remove_user_communication(commId):
271
    UserCommunication.query.filter_by(id=commId).delete()
272
    session.commit()
273
 
1859 vikas 274
def create_master_affiliate(name, added_on):
1845 vikas 275
    master_affiliate = MasterAffiliate()
276
    master_affiliate.name = name
1859 vikas 277
    master_affiliate.added_on = to_py_date(added_on)
1845 vikas 278
    session.commit()
279
    return master_affiliate
280
 
1899 vikas 281
def get_all_master_affiliates():
282
    return MasterAffiliate.query.all()
283
 
1845 vikas 284
def get_master_affiliate_by_id(id):
285
    return MasterAffiliate.get_by(id = id)
286
 
287
def get_master_affiliate_by_name(name):
288
    return MasterAffiliate.get_by(name = name)
289
 
1859 vikas 290
def create_affiliate(name, url, master_affiliate_id, added_on):
1845 vikas 291
    affiliate = Affiliate()
292
    affiliate.name = name
293
    if url is not None:
294
        affiliate.url = url
295
    affiliate.master_affiliate_id = master_affiliate_id
1859 vikas 296
    affiliate.added_on = to_py_date(added_on)
1845 vikas 297
    session.commit()
298
    return affiliate
299
 
300
def get_affiliate_by_id(id):
301
    return Affiliate.get_by(id = id)
302
 
303
def get_affiliate_by_name(name):
304
    return Affiliate.get_by(name = name)
305
 
306
def get_affiliates_by_master_affiliate(master_affiliate_id):
307
    return MasterAffiliate.get_by(id =  master_affiliate_id).affiliates
308
 
309
def get_tracker_by_id(id):
310
    return Tracker.get_by(id = id)
311
 
1996 vikas 312
def add_track_log(affiliate_id, user_id, event, url, data, added_on):
1845 vikas 313
    track_log = TrackLog()
1996 vikas 314
    track_log.affiliate_id = affiliate_id
1845 vikas 315
    if user_id:
316
        track_log.user_id = user_id
3378 vikas 317
    track_log.event_id = event
1845 vikas 318
    if url:
319
        track_log.url = url
320
    if data:
1859 vikas 321
        track_log.data = data
322
    track_log.added_on = to_py_date(added_on)
1845 vikas 323
    session.commit()
324
    return track_log.id
325
 
326
def get_track_log_by_id(id):
327
    return TrackLog.get_by(id = id)
328
 
3293 vikas 329
def get_track_logs_by_affiliate(affiliate_id, start_date, end_date):
330
    query = TrackLog.query
331
 
332
    if affiliate_id:
333
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
334
    if start_date:
335
        query = query.filter(TrackLog.added_on >= to_py_date(start_date))
336
    if end_date:
337
        query = query.filter(TrackLog.added_on <= to_py_date(end_date))
338
    return query.all()
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
 
884 rajveer 361
def forgot_password(email, password):
362
    try:
363
        user = User.get_by(email=email)
364
        if user:
365
            user.password = password
900 rajveer 366
            session.commit()
884 rajveer 367
            return True
368
        else:
369
            return False
370
    except:
371
        return False
372
 
594 rajveer 373
def get_all_addresses_for_user(userId):
2895 chandransh 374
    return Address.query.filter_by(user_id = userId, enabled=True).all()
581 rajveer 375
 
785 rajveer 376
def get_default_address_id(userId):
594 rajveer 377
    user = get_user_by_id(userId);
840 chandransh 378
    if user.default_address_id is None:
379
        return 0
594 rajveer 380
    return user.default_address_id
581 rajveer 381
 
785 rajveer 382
def get_default_pincode(user_id):
383
    user = get_user_by_id(user_id)
384
    if not user:
385
        raise_user_exception(user_id)
386
    default_address_id = user.default_address_id
387
    if default_address_id:
388
        address = Address.get_by(id=default_address_id)
389
        default_pincode = address.pin 
390
    else:
391
        default_pincode = '110001' 
392
    return default_pincode     
1596 ankur.sing 393
 
394
def get_user_count(user_type):
395
    if user_type is None:
396
        return User.query.count()
397
    else:
398
        return User.query.filter_by(is_anonymous = user_type).count()
785 rajveer 399
 
1891 ankur.sing 400
def get_users(user_type, start_date, end_date):
5326 rajveer 401
    query = session.query(User)
1891 ankur.sing 402
    if start_date != -1:
5326 rajveer 403
        query = query.filter(User.active_since >= to_py_date(start_date))
1891 ankur.sing 404
    if end_date != -1:
5326 rajveer 405
        query = query.filter(User.active_since <= to_py_date(end_date))
1891 ankur.sing 406
    if user_type is not None:
407
        query = query.filter(User.is_anonymous == user_type)
408
    return query.all()
1673 ankur.sing 409
 
130 ashish 410
#=============================================================================
411
# Helper functions 
412
#=============================================================================
413
 
414
'''
415
This function returns the password as stored in the db
416
'''    
417
def get_db_password(password):
418
    return password
419
 
420
def check_for_valid_password(password):
421
    if not password:
422
        raise UserContextException(105,"password cannot be null")
423
    return True
424
#------------------------------------------------------------------------------ 
425
 
426
#===============================================================================
427
# raises the UserContextException
428
#===============================================================================
429
def raise_user_exception(user_id):
766 rajveer 430
    raise UserContextException(101, "no such user in system %d" %(user_id))
431
 
2981 rajveer 432
def get_my_research_items(userId):
433
    query = UserWidgetItem.query.filter_by(userId=userId)
434
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
435
    query = query.order_by(desc(UserWidgetItem.addedOn))
436
    widgetItems = query.all()
437
    return [widgetItem.itemId for widgetItem in widgetItems]
438
 
439
def get_browse_history_items(userId):
440
    query = UserWidgetItem.query.filter_by(userId=userId)
441
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
442
    query = query.order_by(desc(UserWidgetItem.addedOn)).limit(10)
443
    widgetItems = query.all()
444
    return [widgetItem.itemId for widgetItem in widgetItems]
445
 
446
def update_my_research(userId, itemId):
447
    isNew = False
448
    query = UserWidgetItem.query.filter_by(userId=userId)
449
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
450
    query = query.filter_by(itemId=itemId)
451
    widgetItem = query.first()
452
    if not widgetItem:
453
        isNew = True
454
        widgetItem = UserWidgetItem()
455
        widgetItem.userId = userId
456
        widgetItem.widgetId = WType.MY_RESEARCH
457
        widgetItem.itemId = itemId  
458
    widgetItem.addedOn = datetime.datetime.now()
459
    session.commit()
460
    return isNew
461
 
462
def update_browse_history(userId, itemId):
463
    query = UserWidgetItem.query.filter_by(userId=userId)
464
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
465
    query = query.filter_by(itemId=itemId)
466
    widgetItem = query.first()
467
    if not widgetItem:
468
        widgetItem = UserWidgetItem()
469
        widgetItem.userId = userId
470
        widgetItem.widgetId = WType.BROWSE_HISTORY
471
        widgetItem.itemId = itemId
472
    widgetItem.addedOn = datetime.datetime.now()
473
    session.commit()
474
 
475
def delete_item_from_my_research(userId, itemId):
476
    query = UserWidgetItem.query.filter_by(userId=userId)
477
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
478
    query = query.filter_by(itemId=itemId)
479
    widgetItem = query.first()
480
    if widgetItem:
481
        widgetItem.delete()
482
        session.commit()
483
    else:
484
        print "Not item in my research to delete with itemId" + itemId
485
 
3499 mandeep.dh 486
def increase_trust_level(userId, trustLevelDelta):
487
    user = User.query.filter_by(id = userId).with_lockmode('update').first()
488
    user.trust_level += trustLevelDelta
489
    session.commit()
490
 
5407 amar.kumar 491
def get_trust_level(userId):
492
    user = User.query.filter_by(id = userId).first()
493
    return user.trust_level
5623 anupam.sin 494
 
495
def get_user_emails(start_date, end_date):
496
    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()
497
    email_addresses = []
5407 amar.kumar 498
 
5623 anupam.sin 499
    for email in emails:
500
        email_addresses.append(str(email[0]))
501
 
502
    return email_addresses
7825 amar.kumar 503
 
766 rajveer 504
def close_session():
505
    if session.is_active:
506
        print "session is active. closing it."
3376 rajveer 507
        session.close()
508
 
509
def is_alive():
510
    try:
511
        session.query(User.id).limit(1).one()
512
        return True
513
    except:
514
        return False