Subversion Repositories SmartDukaan

Rev

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