Subversion Repositories SmartDukaan

Rev

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