Subversion Repositories SmartDukaan

Rev

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