Subversion Repositories SmartDukaan

Rev

Rev 10714 | Rev 11679 | 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
    address.enabled = False
10714 amit.gupta 190
    user = User.get_by(id=user_id)
191
    if user.default_address_id == address_id:
192
        firstValidAddress = Address.query.filter_by(user_id = user_id, enabled=True).first()
193
        if firstValidAddress is None:
194
            user.default_address_id = None
195
        else:
196
            user.default_address_id = firstValidAddress.id
130 ashish 197
    session.commit()
198
    return True
199
 
200
def set_user_as_logged_in(user_id, time_stamp):
5326 rajveer 201
    user = User.get_by(id=user_id)
130 ashish 202
 
5326 rajveer 203
    if not user:
557 chandransh 204
        raise_user_exception(user_id)
130 ashish 205
 
206
    if not time_stamp:
5326 rajveer 207
        user.last_login = datetime.datetime.now()
557 chandransh 208
    else:
5326 rajveer 209
        user.last_login = to_py_date(time_stamp)
130 ashish 210
    session.commit()
211
    return True
212
 
557 chandransh 213
def set_user_as_logged_out(user_id, time_stamp):
5326 rajveer 214
    user = User.get_by(id=user_id)
130 ashish 215
 
5326 rajveer 216
    if not user:
130 ashish 217
        raise_user_exception(user_id)
218
 
219
    if not time_stamp:
5326 rajveer 220
        user.last_logout = datetime.datetime.now()
557 chandransh 221
    else:
5326 rajveer 222
        user.last_logout = to_py_date(time_stamp)
130 ashish 223
    session.commit()
224
    return True
225
 
557 chandransh 226
def set_default_address(user_id, address_id):
227
    user = get_user_by_id(user_id)
228
    address = Address.get_by(id=address_id)
229
    if not user:
230
        raise_user_exception(user_id)
231
    if not address:
232
        raise UserContextException(103, "Address not found")
233
    if address.user.id != user.id:
234
        raise UserContextException(104, "This address belongs to some other user")
235
 
236
    user.default_address_id = address_id 
237
    session.commit()
238
 
594 rajveer 239
def update_password(user_id, old_password, new_password):
557 chandransh 240
    user = get_user_by_id(user_id)
130 ashish 241
 
242
    if not user:
243
        raise_user_exception(user_id)
244
 
594 rajveer 245
    if user.password != old_password:
246
        return False
247
 
248
    if check_for_valid_password(new_password):
249
        user.password = get_db_password(new_password)
130 ashish 250
        session.commit()
251
        return True
252
    else:
253
        return False
1273 varun.gupt 254
 
255
 
256
def create_user_communication(user_id, email, communication_type, order_id, awb, product, subject, message):
257
 
258
    user_communication = UserCommunication()
259
    user_communication.user_id = user_id
260
    user_communication.communication_type = communication_type
1743 varun.gupt 261
 
262
    if order_id > 0:
263
        user_communication.order_id = order_id
1273 varun.gupt 264
    user_communication.airwaybill_no = awb
265
    user_communication.reply_to = email
266
    user_communication.product_name = product
267
    user_communication.subject = subject
268
    user_communication.message = message
1301 varun.gupt 269
    user_communication.communication_timestamp = datetime.datetime.now()
1273 varun.gupt 270
    session.commit()
3206 mandeep.dh 271
    return True
272
 
1583 varun.gupt 273
def get_user_communication_by_id(user_communication_id):
274
    return UserCommunication.get_by(id = user_communication_id)
275
 
276
def get_user_communication_by_user(user_communication_user_id):
1607 vikas 277
    return UserCommunication.query.filter_by(user_id = user_communication_user_id).order_by(-UserCommunication.id).all()
1583 varun.gupt 278
 
279
def get_all_user_communications():
1863 vikas 280
    return UserCommunication.query.order_by(-UserCommunication.id).all()
1583 varun.gupt 281
 
5407 amar.kumar 282
def remove_user_communication(commId):
283
    UserCommunication.query.filter_by(id=commId).delete()
284
    session.commit()
285
 
1859 vikas 286
def create_master_affiliate(name, added_on):
1845 vikas 287
    master_affiliate = MasterAffiliate()
288
    master_affiliate.name = name
1859 vikas 289
    master_affiliate.added_on = to_py_date(added_on)
1845 vikas 290
    session.commit()
291
    return master_affiliate
292
 
1899 vikas 293
def get_all_master_affiliates():
294
    return MasterAffiliate.query.all()
295
 
1845 vikas 296
def get_master_affiliate_by_id(id):
297
    return MasterAffiliate.get_by(id = id)
298
 
299
def get_master_affiliate_by_name(name):
300
    return MasterAffiliate.get_by(name = name)
301
 
1859 vikas 302
def create_affiliate(name, url, master_affiliate_id, added_on):
1845 vikas 303
    affiliate = Affiliate()
304
    affiliate.name = name
305
    if url is not None:
306
        affiliate.url = url
307
    affiliate.master_affiliate_id = master_affiliate_id
1859 vikas 308
    affiliate.added_on = to_py_date(added_on)
1845 vikas 309
    session.commit()
310
    return affiliate
311
 
312
def get_affiliate_by_id(id):
313
    return Affiliate.get_by(id = id)
314
 
315
def get_affiliate_by_name(name):
316
    return Affiliate.get_by(name = name)
317
 
318
def get_affiliates_by_master_affiliate(master_affiliate_id):
319
    return MasterAffiliate.get_by(id =  master_affiliate_id).affiliates
320
 
321
def get_tracker_by_id(id):
322
    return Tracker.get_by(id = id)
323
 
1996 vikas 324
def add_track_log(affiliate_id, user_id, event, url, data, added_on):
1845 vikas 325
    track_log = TrackLog()
1996 vikas 326
    track_log.affiliate_id = affiliate_id
1845 vikas 327
    if user_id:
328
        track_log.user_id = user_id
3378 vikas 329
    track_log.event_id = event
1845 vikas 330
    if url:
331
        track_log.url = url
332
    if data:
1859 vikas 333
        track_log.data = data
334
    track_log.added_on = to_py_date(added_on)
1845 vikas 335
    session.commit()
336
    return track_log.id
337
 
338
def get_track_log_by_id(id):
339
    return TrackLog.get_by(id = id)
340
 
3293 vikas 341
def get_track_logs_by_affiliate(affiliate_id, start_date, end_date):
342
    query = TrackLog.query
343
 
344
    if affiliate_id:
345
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
346
    if start_date:
347
        query = query.filter(TrackLog.added_on >= to_py_date(start_date))
348
    if end_date:
349
        query = query.filter(TrackLog.added_on <= to_py_date(end_date))
350
    return query.all()
1845 vikas 351
 
352
def get_track_logs_by_user(user_id):
353
    return TrackLog.query.filter(TrackLog.user_id == user_id).all()
354
 
1996 vikas 355
def get_track_logs(affiliate_id, user_id, event, url):
1845 vikas 356
    query = TrackLog.query
357
 
1996 vikas 358
    if affiliate_id:
359
        query = query.filter(TrackLog.affiliate_id == affiliate_id)
360
    if user_id:
361
        query = query.filter(TrackLog.user_id == user_id)
1845 vikas 362
    if event:
363
        query = query.filter(TrackLog.event == event)
364
    if url:
365
        query = query.filter(TrackLog.url == url)
366
    return query.all()
367
 
368
 
557 chandransh 369
def get_address(address_id):
370
    address = Address.get_by(id=address_id)
371
    return address
372
 
884 rajveer 373
def forgot_password(email, password):
374
    try:
375
        user = User.get_by(email=email)
376
        if user:
377
            user.password = password
900 rajveer 378
            session.commit()
884 rajveer 379
            return True
380
        else:
381
            return False
382
    except:
383
        return False
384
 
594 rajveer 385
def get_all_addresses_for_user(userId):
2895 chandransh 386
    return Address.query.filter_by(user_id = userId, enabled=True).all()
581 rajveer 387
 
785 rajveer 388
def get_default_address_id(userId):
594 rajveer 389
    user = get_user_by_id(userId);
840 chandransh 390
    if user.default_address_id is None:
391
        return 0
594 rajveer 392
    return user.default_address_id
581 rajveer 393
 
785 rajveer 394
def get_default_pincode(user_id):
395
    user = get_user_by_id(user_id)
396
    if not user:
397
        raise_user_exception(user_id)
398
    default_address_id = user.default_address_id
399
    if default_address_id:
400
        address = Address.get_by(id=default_address_id)
401
        default_pincode = address.pin 
402
    else:
403
        default_pincode = '110001' 
404
    return default_pincode     
1596 ankur.sing 405
 
406
def get_user_count(user_type):
407
    if user_type is None:
408
        return User.query.count()
409
    else:
410
        return User.query.filter_by(is_anonymous = user_type).count()
785 rajveer 411
 
1891 ankur.sing 412
def get_users(user_type, start_date, end_date):
5326 rajveer 413
    query = session.query(User)
1891 ankur.sing 414
    if start_date != -1:
5326 rajveer 415
        query = query.filter(User.active_since >= to_py_date(start_date))
1891 ankur.sing 416
    if end_date != -1:
5326 rajveer 417
        query = query.filter(User.active_since <= to_py_date(end_date))
1891 ankur.sing 418
    if user_type is not None:
419
        query = query.filter(User.is_anonymous == user_type)
420
    return query.all()
1673 ankur.sing 421
 
130 ashish 422
#=============================================================================
423
# Helper functions 
424
#=============================================================================
425
 
426
'''
427
This function returns the password as stored in the db
428
'''    
429
def get_db_password(password):
430
    return password
431
 
432
def check_for_valid_password(password):
433
    if not password:
434
        raise UserContextException(105,"password cannot be null")
435
    return True
436
#------------------------------------------------------------------------------ 
437
 
438
#===============================================================================
439
# raises the UserContextException
440
#===============================================================================
441
def raise_user_exception(user_id):
766 rajveer 442
    raise UserContextException(101, "no such user in system %d" %(user_id))
443
 
2981 rajveer 444
def get_my_research_items(userId):
445
    query = UserWidgetItem.query.filter_by(userId=userId)
446
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
447
    query = query.order_by(desc(UserWidgetItem.addedOn))
448
    widgetItems = query.all()
449
    return [widgetItem.itemId for widgetItem in widgetItems]
450
 
451
def get_browse_history_items(userId):
452
    query = UserWidgetItem.query.filter_by(userId=userId)
453
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
454
    query = query.order_by(desc(UserWidgetItem.addedOn)).limit(10)
455
    widgetItems = query.all()
456
    return [widgetItem.itemId for widgetItem in widgetItems]
457
 
458
def update_my_research(userId, itemId):
459
    isNew = False
460
    query = UserWidgetItem.query.filter_by(userId=userId)
461
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
462
    query = query.filter_by(itemId=itemId)
463
    widgetItem = query.first()
464
    if not widgetItem:
465
        isNew = True
466
        widgetItem = UserWidgetItem()
467
        widgetItem.userId = userId
468
        widgetItem.widgetId = WType.MY_RESEARCH
469
        widgetItem.itemId = itemId  
470
    widgetItem.addedOn = datetime.datetime.now()
471
    session.commit()
472
    return isNew
473
 
474
def update_browse_history(userId, itemId):
475
    query = UserWidgetItem.query.filter_by(userId=userId)
476
    query = query.filter_by(widgetId=WType.BROWSE_HISTORY)
477
    query = query.filter_by(itemId=itemId)
478
    widgetItem = query.first()
479
    if not widgetItem:
480
        widgetItem = UserWidgetItem()
481
        widgetItem.userId = userId
482
        widgetItem.widgetId = WType.BROWSE_HISTORY
483
        widgetItem.itemId = itemId
484
    widgetItem.addedOn = datetime.datetime.now()
485
    session.commit()
486
 
487
def delete_item_from_my_research(userId, itemId):
488
    query = UserWidgetItem.query.filter_by(userId=userId)
489
    query = query.filter_by(widgetId=WType.MY_RESEARCH)
490
    query = query.filter_by(itemId=itemId)
491
    widgetItem = query.first()
492
    if widgetItem:
493
        widgetItem.delete()
494
        session.commit()
495
    else:
11499 amit.gupta 496
        print "Not item in my research to delete with itemId " + str(itemId)
2981 rajveer 497
 
3499 mandeep.dh 498
def increase_trust_level(userId, trustLevelDelta):
499
    user = User.query.filter_by(id = userId).with_lockmode('update').first()
500
    user.trust_level += trustLevelDelta
501
    session.commit()
502
 
5407 amar.kumar 503
def get_trust_level(userId):
504
    user = User.query.filter_by(id = userId).first()
505
    return user.trust_level
5623 anupam.sin 506
 
507
def get_user_emails(start_date, end_date):
508
    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()
509
    email_addresses = []
5407 amar.kumar 510
 
5623 anupam.sin 511
    for email in emails:
512
        email_addresses.append(str(email[0]))
513
 
514
    return email_addresses
7825 amar.kumar 515
 
766 rajveer 516
def close_session():
517
    if session.is_active:
518
        print "session is active. closing it."
3376 rajveer 519
        session.close()
520
 
521
def is_alive():
522
    try:
523
        session.query(User.id).limit(1).one()
524
        return True
525
    except:
526
        return False