Subversion Repositories SmartDukaan

Rev

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