trex-model 1.5.16__tar.gz → 1.5.19__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of trex-model might be problematic. Click here for more details.
- {trex-model-1.5.16 → trex-model-1.5.19}/PKG-INFO +1 -1
- {trex-model-1.5.16 → trex-model-1.5.19}/setup.py +1 -1
- {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/PKG-INFO +1 -1
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/customer_models.py +2 -2
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/reward_transaction_helper.py +10 -10
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/lucky_draw_models.py +3 -3
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/marketing_models.py +1 -1
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/merchant_models.py +13 -3
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/pos_models.py +51 -9
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/prepaid_models.py +30 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/rating_models.py +63 -2
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/redeem_models.py +45 -15
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/reward_models.py +35 -4
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/transaction_models.py +11 -7
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/merchant_helpers.py +1 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/LICENSE +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/MANIFEST.in +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/README.md +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/setup.cfg +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/SOURCES.txt +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/dependency_links.txt +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/requires.txt +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/top_level.txt +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/conf.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/admin_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/analytic_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/app_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/coporate_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/customer_model_helpers.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/fb_subsriber_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/reward_model_helpers.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/import_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/inventory_model.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/loyalty_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/membership_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/message_model_helper.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/message_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/model_decorators.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/ndb_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/product_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/program_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/recruit_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/redemption_catalogue_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/referral_program_model.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/spending_base_program_model.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/system_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/task_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/test_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/user_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/voucher_models.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/model_decorator.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/prepaid_helpers.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/pos_conf.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/program_conf.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/gcloud/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/gcloud/datastore_util.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/model/__init__.py +0 -0
- {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/model/model_util.py +0 -0
|
@@ -768,7 +768,7 @@ class CustomerMembership(BaseNModel, DictModel):
|
|
|
768
768
|
renewed_outlet = ndb.KeyProperty(name="renewed_outlet", kind=Outlet)
|
|
769
769
|
|
|
770
770
|
dict_properties =[
|
|
771
|
-
'customer', 'merchant_membership_entity', 'entitled_date', 'expiry_date'
|
|
771
|
+
'customer', 'merchant_membership_entity', 'entitled_date', 'expiry_date', 'merchant_membership_key'
|
|
772
772
|
]
|
|
773
773
|
|
|
774
774
|
@property
|
|
@@ -1001,7 +1001,7 @@ class CustomerTierMembership(BaseNModel, DictModel):
|
|
|
1001
1001
|
valid = ndb.BooleanProperty(required=True, default=True)
|
|
1002
1002
|
|
|
1003
1003
|
dict_properties =[
|
|
1004
|
-
'customer', 'merchant_tier_membership_entity', 'entitled_date', 'expiry_date', 'valid'
|
|
1004
|
+
'customer', 'merchant_tier_membership_entity', 'entitled_date', 'expiry_date', 'valid', 'merchant_tier_membership_key',
|
|
1005
1005
|
]
|
|
1006
1006
|
|
|
1007
1007
|
|
|
@@ -194,21 +194,21 @@ def create_reward_transaction(customer, transact_outlet=None, sales_amount=.0, t
|
|
|
194
194
|
|
|
195
195
|
return __start_transaction_for_customer_transaction()
|
|
196
196
|
|
|
197
|
-
def give_reward_from_sales_transaction(customer, sales_transaction):
|
|
197
|
+
def give_reward_from_sales_transaction(customer, sales_transaction, for_testing=False):
|
|
198
198
|
|
|
199
199
|
logger.debug('---give_reward_from_sales_transaction---')
|
|
200
200
|
|
|
201
201
|
@model_transactional(desc='give_reward_from_sales_transaction')
|
|
202
202
|
def __start_transaction(customer, sales_transaction):
|
|
203
|
-
customer_transaction = CustomerTransaction.create_from_sales_transaction(customer, sales_transaction)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
203
|
+
customer_transaction = CustomerTransaction.create_from_sales_transaction(customer, sales_transaction, for_testing=for_testing)
|
|
204
|
+
if for_testing==False:
|
|
205
|
+
trigger_check_reward_success = trigger_spending_reward_for_transaction(customer_transaction)
|
|
206
|
+
|
|
207
|
+
logger.debug('trigger_check_reward_success=%s', trigger_check_reward_success)
|
|
208
|
+
|
|
209
|
+
if trigger_check_reward_success:
|
|
210
|
+
create_transaction_message(customer_transaction)
|
|
211
|
+
create_merchant_customer_transaction_upstream_for_merchant(customer_transaction, streamed_datetime=sales_transaction.transact_datetime)
|
|
212
212
|
|
|
213
213
|
return customer_transaction
|
|
214
214
|
|
|
@@ -569,11 +569,11 @@ class LuckyDrawTicket(BaseNModel, DictModel):
|
|
|
569
569
|
return LuckyDrawTicket.query(ndb.AND(LuckyDrawTicket.merchant_acct==merchant_acct.create_ndb_key())).count(limit=model_conf.MAX_FETCH_RECORD)
|
|
570
570
|
|
|
571
571
|
@staticmethod
|
|
572
|
-
def
|
|
572
|
+
def list_by_merchant_acct(merchant_acct, offset=0, limit=50, start_cursor=None, return_with_cursor=True):
|
|
573
573
|
query = LuckyDrawTicket.query(ndb.AND(LuckyDrawTicket.merchant_acct==merchant_acct.create_ndb_key(),))
|
|
574
|
-
|
|
574
|
+
return LuckyDrawTicket.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=return_with_cursor, offset=offset, limit=limit)
|
|
575
|
+
|
|
575
576
|
|
|
576
|
-
return (result, next_cursor)
|
|
577
577
|
|
|
578
578
|
@staticmethod
|
|
579
579
|
def create_for_customer_from_sales_amount(customer_acct, sales_amount=None, merchant_acct=None, transact_outlet=None):
|
|
@@ -390,7 +390,7 @@ class MerchantNewsFile(BaseNModel, DictModel):
|
|
|
390
390
|
merchant_news.start_date = start_date
|
|
391
391
|
merchant_news.end_date = end_date
|
|
392
392
|
merchant_news.completed_status = program_conf.MERCHANT_NEWS_STATUS_BASE
|
|
393
|
-
merchant_news.modified_by = modified_by
|
|
393
|
+
merchant_news.modified_by = modified_by.create_ndb_key()
|
|
394
394
|
merchant_news.modified_by_username = modified_by_username
|
|
395
395
|
merchant_news.modified_datetime = datetime.utcnow()
|
|
396
396
|
|
|
@@ -300,6 +300,10 @@ class MerchantAcct(MerchantMin):
|
|
|
300
300
|
return self.program_settings.get('referral_program').get('referee_promote_image')
|
|
301
301
|
|
|
302
302
|
|
|
303
|
+
@property
|
|
304
|
+
def is_rating_review_enabled(self):
|
|
305
|
+
return self.program_settings.get('rating_review', False)
|
|
306
|
+
|
|
303
307
|
@staticmethod
|
|
304
308
|
def default_program_settings():
|
|
305
309
|
return {
|
|
@@ -307,7 +311,7 @@ class MerchantAcct(MerchantMin):
|
|
|
307
311
|
'days_of_repeat_purchase_measurement' : 7,
|
|
308
312
|
'membership_renew_advance_day' : 7,
|
|
309
313
|
'membership_renew_late_day' : 30,
|
|
310
|
-
|
|
314
|
+
'rating_review' : False,
|
|
311
315
|
}
|
|
312
316
|
|
|
313
317
|
def update_referrer_program_promote_text(self,
|
|
@@ -1328,8 +1332,14 @@ class MerchantAcct(MerchantMin):
|
|
|
1328
1332
|
|
|
1329
1333
|
|
|
1330
1334
|
@staticmethod
|
|
1331
|
-
def list(offset=
|
|
1332
|
-
|
|
1335
|
+
def list(offset=None, start_cursor=None, return_with_cursor=False, limit = model_conf.MAX_FETCH_RECORD):
|
|
1336
|
+
if return_with_cursor:
|
|
1337
|
+
query = MerchantAcct.query()
|
|
1338
|
+
(result, next_cursor) = MerchantAcct.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=True, limit=limit)
|
|
1339
|
+
|
|
1340
|
+
return (result, next_cursor)
|
|
1341
|
+
else:
|
|
1342
|
+
return MerchantAcct.query().order(-MerchantAcct.registered_datetime).fetch(offset=offset, limit=limit)
|
|
1333
1343
|
|
|
1334
1344
|
def delete_and_related(self):
|
|
1335
1345
|
|
|
@@ -17,18 +17,34 @@ class POSSetting(BaseNModel,DictModel):
|
|
|
17
17
|
'''
|
|
18
18
|
merchant_acct as ancestor
|
|
19
19
|
'''
|
|
20
|
-
device_name
|
|
21
|
-
activation_code
|
|
22
|
-
device_id
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
device_name = ndb.StringProperty(required=True)
|
|
21
|
+
activation_code = ndb.StringProperty(required=True)
|
|
22
|
+
device_id = ndb.StringProperty(required=False)
|
|
23
|
+
enable_lock_screen = ndb.BooleanProperty(required=True, default=False)
|
|
24
|
+
lock_screen_code = ndb.StringProperty(required=False, default='')
|
|
25
|
+
lock_screen_length_in_second = ndb.IntegerProperty(required=False, default=30)
|
|
26
|
+
activated = ndb.BooleanProperty(required=True, default=False)
|
|
27
|
+
assigned_outlet = ndb.KeyProperty(name="assigned_outlet", kind=Outlet)
|
|
25
28
|
#assigned_catalogue = ndb.KeyProperty(name="assigned_outlet", kind=ProductCatalogue)
|
|
26
|
-
created_datetime
|
|
27
|
-
activated_datetime
|
|
28
|
-
testing
|
|
29
|
+
created_datetime = ndb.DateTimeProperty(required=True, auto_now_add=True)
|
|
30
|
+
activated_datetime = ndb.DateTimeProperty(required=False)
|
|
31
|
+
testing = ndb.BooleanProperty(required=False, default=False)
|
|
32
|
+
device_details = ndb.JsonProperty()
|
|
29
33
|
|
|
30
34
|
dict_properties = ['device_name', 'activation_code', 'device_id', 'activated', 'assigned_outlet_key',
|
|
31
|
-
'
|
|
35
|
+
'enable_lock_screen', 'lock_screen_code', 'lock_screen_length_in_second',
|
|
36
|
+
'device_details', 'activated_datetime', 'created_datetime']
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def device_tokens_list(self):
|
|
40
|
+
_tokens_list = []
|
|
41
|
+
|
|
42
|
+
if self.device_details:
|
|
43
|
+
|
|
44
|
+
for k,v in self.device_details.items():
|
|
45
|
+
for dd in v:
|
|
46
|
+
_tokens_list.append(dd.get('device_token'))
|
|
47
|
+
return _tokens_list
|
|
32
48
|
|
|
33
49
|
@property
|
|
34
50
|
def is_test_setting(self):
|
|
@@ -83,6 +99,32 @@ class POSSetting(BaseNModel,DictModel):
|
|
|
83
99
|
|
|
84
100
|
return pos_setting
|
|
85
101
|
|
|
102
|
+
def update_device_details(self, platform, device_token):
|
|
103
|
+
if self.device_details:
|
|
104
|
+
found_device_details_list_by_platform = self.device_details.get(platform)
|
|
105
|
+
if found_device_details_list_by_platform:
|
|
106
|
+
self.device_details[platform] = {
|
|
107
|
+
'device_token' : device_token,
|
|
108
|
+
'last_updated_datetime' : datetime.utcnow().strftime("%d-%m-%Y %H:%M:%S"),
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
else:
|
|
114
|
+
self.device_details[platform] = {
|
|
115
|
+
'device_token' : device_token,
|
|
116
|
+
'last_updated_datetime' : datetime.utcnow().strftime("%d-%m-%Y %H:%M:%S"),
|
|
117
|
+
}
|
|
118
|
+
else:
|
|
119
|
+
self.device_details = {
|
|
120
|
+
platform : {
|
|
121
|
+
'device_token' : device_token,
|
|
122
|
+
'last_updated_datetime' : datetime.utcnow().strftime("%d-%m-%Y %H:%M:%S"),
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
self.put()
|
|
127
|
+
|
|
86
128
|
@staticmethod
|
|
87
129
|
def get_by_activation_code(activation_code):
|
|
88
130
|
pos_setting = POSSetting.query(POSSetting.activation_code ==activation_code).get()
|
|
@@ -640,4 +640,34 @@ class CustomerPrepaidReward(BaseNModel,DictModel):
|
|
|
640
640
|
def delete_all_by_customer(customer):
|
|
641
641
|
query = CustomerPrepaidReward.query(ancestor=customer.create_ndb_key())
|
|
642
642
|
CustomerPrepaidReward.delete_multiples(query)
|
|
643
|
+
|
|
644
|
+
@staticmethod
|
|
645
|
+
def list_by_merchant_acct(merchant_acct, datetime_range_start=None, datetime_range_end=None, offset=0, limit=50, start_cursor=None, return_with_cursor=True):
|
|
646
|
+
if is_not_empty(datetime_range_start) and is_not_empty(datetime_range_end):
|
|
647
|
+
query = CustomerPrepaidReward.query(ndb.AND(
|
|
648
|
+
CustomerPrepaidReward.merchant_acct==merchant_acct.create_ndb_key(),
|
|
649
|
+
CustomerPrepaidReward.topup_datetime>=datetime_range_start,
|
|
650
|
+
CustomerPrepaidReward.topup_datetime<datetime_range_end,
|
|
651
|
+
))
|
|
652
|
+
else:
|
|
653
|
+
query = CustomerPrepaidReward.query(ndb.AND(
|
|
654
|
+
CustomerPrepaidReward.merchant_acct==merchant_acct.create_ndb_key(),
|
|
655
|
+
))
|
|
656
|
+
|
|
657
|
+
return CustomerPrepaidReward.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=return_with_cursor, offset=offset, limit=limit)
|
|
658
|
+
|
|
659
|
+
@staticmethod
|
|
660
|
+
def count_by_merchant_acct(merchant_acct, datetime_range_start=None, datetime_range_end=None, limit=conf.MAX_FETCH_RECORD,):
|
|
661
|
+
if is_not_empty(datetime_range_start) and is_not_empty(datetime_range_end):
|
|
662
|
+
query = CustomerPrepaidReward.query(ndb.AND(
|
|
663
|
+
CustomerPrepaidReward.merchant_acct==merchant_acct.create_ndb_key(),
|
|
664
|
+
CustomerPrepaidReward.topup_datetime>=datetime_range_start,
|
|
665
|
+
CustomerPrepaidReward.topup_datetime<datetime_range_end,
|
|
666
|
+
))
|
|
667
|
+
else:
|
|
668
|
+
query = CustomerPrepaidReward.query(ndb.AND(
|
|
669
|
+
CustomerPrepaidReward.merchant_acct==merchant_acct.create_ndb_key(),
|
|
670
|
+
))
|
|
671
|
+
|
|
672
|
+
return CustomerPrepaidReward.count_with_condition_query(query, limit)
|
|
643
673
|
|
|
@@ -10,6 +10,7 @@ from trexmodel.models.datastore.user_models import User
|
|
|
10
10
|
from trexconf import conf
|
|
11
11
|
from datetime import datetime, timedelta
|
|
12
12
|
import logging
|
|
13
|
+
from trexmodel.models.datastore.transaction_models import SalesTransaction
|
|
13
14
|
|
|
14
15
|
logger = logging.getLogger('model')
|
|
15
16
|
|
|
@@ -65,10 +66,11 @@ class OutletRating(RatingBase):
|
|
|
65
66
|
return OutletRating.query(ndb.AND(OutletRating.merchant_acct==merchant_acct.create_ndb_key(), OutletRating.updated==True, OutletRating.modified_datetime>checking_datetime_from)).fetch(limit=conf.MAX_FETCH_RECORD)
|
|
66
67
|
|
|
67
68
|
@staticmethod
|
|
68
|
-
def create(user_acct, outlet, service_rating=.5, ambience_rating=.5, food_rating=.5, value_rating=.5):
|
|
69
|
+
def create(user_acct, outlet, merchant_acct=None, service_rating=.5, ambience_rating=.5, food_rating=.5, value_rating=.5):
|
|
69
70
|
outlet_rating = OutletRating.get_user_rating_by_outlet(user_acct, outlet)
|
|
70
71
|
if outlet_rating is None:
|
|
71
|
-
merchant_acct
|
|
72
|
+
if merchant_acct is None:
|
|
73
|
+
merchant_acct = outlet.merchant_acct_entity
|
|
72
74
|
outlet_rating = OutletRating(
|
|
73
75
|
user_acct = user_acct.create_ndb_key(),
|
|
74
76
|
merchant_acct = merchant_acct.create_ndb_key(),
|
|
@@ -133,6 +135,65 @@ class OutletRating(RatingBase):
|
|
|
133
135
|
|
|
134
136
|
return OutletRating.__calculate_rating(merchant_rating_list)
|
|
135
137
|
|
|
138
|
+
class TransactionRating(RatingBase):
|
|
139
|
+
outlet = ndb.KeyProperty(name="outlet", kind=Outlet)
|
|
140
|
+
merchant_acct = ndb.KeyProperty(name="merchant_acct", kind=MerchantAcct)
|
|
141
|
+
transaction_id = ndb.StringProperty(required=True)
|
|
142
|
+
service_rating = ndb.FloatProperty(required=True, default=.0)
|
|
143
|
+
ambience_rating = ndb.FloatProperty(required=True, default=.0)
|
|
144
|
+
food_rating = ndb.FloatProperty(required=True, default=.0)
|
|
145
|
+
value_rating = ndb.FloatProperty(required=True, default=.0)
|
|
146
|
+
created_datetime = ndb.DateTimeProperty(required=True, auto_now_add=True)
|
|
147
|
+
|
|
148
|
+
dict_properties = ['transaction_id','service_rating', 'ambience_rating', 'food_rating','value_rating',
|
|
149
|
+
]
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def create(user_acct, transaction_id, service_rating=.5, ambience_rating=.5, food_rating=.5, value_rating=.5, for_testing=False):
|
|
153
|
+
sales_transaction = SalesTransaction.get_by_transaction_id(transaction_id)
|
|
154
|
+
if sales_transaction is not None:
|
|
155
|
+
outlet = sales_transaction.transact_outlet_entity
|
|
156
|
+
merchant_acct = sales_transaction.transact_merchant_acct
|
|
157
|
+
|
|
158
|
+
transaction_rating = TransactionRating.get_by_transaction_id(transaction_id)
|
|
159
|
+
if transaction_rating is None:
|
|
160
|
+
transaction_rating = TransactionRating(
|
|
161
|
+
user_acct = user_acct.create_ndb_key(),
|
|
162
|
+
merchant_acct = merchant_acct.create_ndb_key(),
|
|
163
|
+
outlet = outlet.create_ndb_key(),
|
|
164
|
+
transaction_id = transaction_id,
|
|
165
|
+
|
|
166
|
+
service_rating = service_rating,
|
|
167
|
+
ambience_rating = ambience_rating,
|
|
168
|
+
food_rating = food_rating,
|
|
169
|
+
value_rating = value_rating,
|
|
170
|
+
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
else:
|
|
174
|
+
transaction_rating.service_rating = service_rating
|
|
175
|
+
transaction_rating.ambience_rating = ambience_rating
|
|
176
|
+
transaction_rating.food_rating = food_rating
|
|
177
|
+
transaction_rating.value_rating = value_rating
|
|
178
|
+
|
|
179
|
+
if for_testing==False:
|
|
180
|
+
transaction_rating.put()
|
|
181
|
+
|
|
182
|
+
OutletRating.create(user_acct, outlet,
|
|
183
|
+
merchant_acct = merchant_acct,
|
|
184
|
+
service_rating = service_rating,
|
|
185
|
+
ambience_rating = ambience_rating,
|
|
186
|
+
food_rating = food_rating,
|
|
187
|
+
value_rating = value_rating,
|
|
188
|
+
)
|
|
189
|
+
MerchantRatingResult.update(merchant_acct)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@staticmethod
|
|
193
|
+
def get_by_transaction_id(transaction_id):
|
|
194
|
+
return TransactionRating.query(ndb.AND(TransactionRating.transaction_id==transaction_id)).get()
|
|
195
|
+
|
|
196
|
+
|
|
136
197
|
class RatingResult(BaseNModel, DictModel):
|
|
137
198
|
total_rating_count = ndb.IntegerProperty(required=True, default=0)
|
|
138
199
|
rating_result = ndb.JsonProperty()
|
|
@@ -20,6 +20,7 @@ from trexmodel.models.datastore.transaction_models import CustomerTransaction
|
|
|
20
20
|
from trexmodel.models.datastore.prepaid_models import CustomerPrepaidReward
|
|
21
21
|
from trexmodel.models.datastore.redemption_catalogue_models import RedemptionCatalogue
|
|
22
22
|
from trexmodel.models.datastore import user_models
|
|
23
|
+
from _ast import Is
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
logger = logging.getLogger('debug')
|
|
@@ -188,18 +189,47 @@ class CustomerRedemption(BaseNModel, DictModel):
|
|
|
188
189
|
|
|
189
190
|
def to_voucher_upstream_info_list(self):
|
|
190
191
|
upstream_info_list = []
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
192
|
+
try:
|
|
193
|
+
if self.redeemed_summary.get(program_conf.REWARD_FORMAT_VOUCHER) is not None:
|
|
194
|
+
|
|
195
|
+
for merchant_voucher_key, voucher_redeemed_details in self.redeemed_summary.get(program_conf.REWARD_FORMAT_VOUCHER).get('vouchers').items():
|
|
196
|
+
amount = 1
|
|
197
|
+
if isinstance(voucher_redeemed_details, int):
|
|
198
|
+
amount = voucher_redeemed_details
|
|
199
|
+
elif isinstance(voucher_redeemed_details, dict):
|
|
200
|
+
amount = voucher_redeemed_details.get('amount')
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
upstream_info_list.append(CustomerRedeemedItemUpstream(
|
|
204
|
+
customer_key = self.redeemed_customer_key,
|
|
205
|
+
merchant_key = self.redeemed_merchant_acct_key,
|
|
206
|
+
redeemed_outlet_key = self.redeemed_outlet_key,
|
|
207
|
+
transaction_id = self.transaction_id,
|
|
208
|
+
reward_format = self.reward_format,
|
|
209
|
+
redeemed_datetime = self.redeemed_datetime,
|
|
210
|
+
redeemed_amount = amount,
|
|
211
|
+
voucher_key = merchant_voucher_key,
|
|
212
|
+
))
|
|
213
|
+
else:
|
|
214
|
+
for merchant_voucher_key, amount in self.redeemed_summary.get('vouchers').items():
|
|
215
|
+
upstream_info_list.append(CustomerRedeemedItemUpstream(
|
|
216
|
+
customer_key = self.redeemed_customer_key,
|
|
217
|
+
merchant_key = self.redeemed_merchant_acct_key,
|
|
218
|
+
redeemed_outlet_key = self.redeemed_outlet_key,
|
|
219
|
+
transaction_id = self.transaction_id,
|
|
220
|
+
reward_format = self.reward_format,
|
|
221
|
+
redeemed_datetime = self.redeemed_datetime,
|
|
222
|
+
redeemed_amount = amount,
|
|
223
|
+
voucher_key = merchant_voucher_key,
|
|
224
|
+
))
|
|
225
|
+
|
|
226
|
+
return upstream_info_list
|
|
227
|
+
|
|
228
|
+
except:
|
|
229
|
+
logger.error('failed to process redeem summary where self.redeemed_summary=%s', self.redeemed_summary)
|
|
230
|
+
raise
|
|
231
|
+
|
|
232
|
+
|
|
203
233
|
|
|
204
234
|
def revert(self, reverted_by, reverted_datetime=None):
|
|
205
235
|
self.status = program_conf.REWARD_STATUS_REVERTED
|
|
@@ -244,7 +274,7 @@ class CustomerRedemption(BaseNModel, DictModel):
|
|
|
244
274
|
return result
|
|
245
275
|
|
|
246
276
|
@staticmethod
|
|
247
|
-
def
|
|
277
|
+
def list_by_merchant_acct(merchant_acct, datetime_ranage_start=None, datetime_range_end=None, offset=0, limit=50, start_cursor=None, return_with_cursor=True):
|
|
248
278
|
if is_not_empty(datetime_ranage_start) and is_not_empty(datetime_range_end):
|
|
249
279
|
query = CustomerRedemption.query(ndb.AND(
|
|
250
280
|
CustomerRedemption.merchant_acct==merchant_acct.create_ndb_key(),
|
|
@@ -255,9 +285,9 @@ class CustomerRedemption(BaseNModel, DictModel):
|
|
|
255
285
|
query = CustomerRedemption.query(ndb.AND(
|
|
256
286
|
CustomerRedemption.merchant_acct==merchant_acct.create_ndb_key(),
|
|
257
287
|
))
|
|
258
|
-
|
|
288
|
+
return CustomerRedemption.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=return_with_cursor, offset=offset, limit=limit)
|
|
259
289
|
|
|
260
|
-
return (result, next_cursor)
|
|
290
|
+
#return (result, next_cursor)
|
|
261
291
|
|
|
262
292
|
@staticmethod
|
|
263
293
|
def list_merchant_transaction(merchant_acct, offset=0, limit=conf.PAGINATION_SIZE, start_cursor=None, return_with_cursor=False, reverse_order=True):
|
|
@@ -151,6 +151,37 @@ class CustomerEntitledReward(RewardEntitlement):
|
|
|
151
151
|
def delete_all_by_customer(cls, customer):
|
|
152
152
|
query = cls.query(ancestor=customer.create_ndb_key())
|
|
153
153
|
cls.delete_multiples(query)
|
|
154
|
+
|
|
155
|
+
@staticmethod
|
|
156
|
+
def count_by_merchant_acct(cls, merchant_acct, datetime_ranage_start=None, datetime_range_end=None):
|
|
157
|
+
if datetime_ranage_start and datetime_range_end:
|
|
158
|
+
result = cls.query(ndb.AND(
|
|
159
|
+
cls.merchant_acct==merchant_acct.create_ndb_key(),
|
|
160
|
+
cls.rewarded_datetime>=datetime_ranage_start,
|
|
161
|
+
cls.rewarded_datetime<datetime_range_end,
|
|
162
|
+
)).count(limit=conf.MAX_FETCH_RECORD)
|
|
163
|
+
else:
|
|
164
|
+
result = cls.query(ndb.AND(
|
|
165
|
+
cls.merchant_acct==merchant_acct.create_ndb_key(),
|
|
166
|
+
)).count(limit=conf.MAX_FETCH_RECORD)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
return result
|
|
170
|
+
|
|
171
|
+
@classmethod
|
|
172
|
+
def list_by_merchant_acct(cls, merchant_acct, datetime_range_start=None, datetime_range_end=None, offset=0, limit=50, start_cursor=None, return_with_cursor=True):
|
|
173
|
+
if is_not_empty(datetime_range_start) and is_not_empty(datetime_range_end):
|
|
174
|
+
query = cls.query(ndb.AND(
|
|
175
|
+
cls.merchant_acct==merchant_acct.create_ndb_key(),
|
|
176
|
+
cls.rewarded_datetime>=datetime_range_start,
|
|
177
|
+
cls.rewarded_datetime<datetime_range_end,
|
|
178
|
+
))
|
|
179
|
+
else:
|
|
180
|
+
query = cls.query(ndb.AND(
|
|
181
|
+
cls.merchant_acct==merchant_acct.create_ndb_key(),
|
|
182
|
+
))
|
|
183
|
+
return cls.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=return_with_cursor, offset=offset, limit=limit)
|
|
184
|
+
|
|
154
185
|
|
|
155
186
|
class CustomerCountableReward(CustomerEntitledReward):
|
|
156
187
|
reward_amount = ndb.FloatProperty(required=True, default=0)
|
|
@@ -400,7 +431,7 @@ class CustomerEntitledVoucher(CustomerEntitledReward):
|
|
|
400
431
|
|
|
401
432
|
|
|
402
433
|
return result
|
|
403
|
-
|
|
434
|
+
'''
|
|
404
435
|
@staticmethod
|
|
405
436
|
def list_by_merchant_acct(merchant_acct, datetime_range_start=None, datetime_range_end=None, offset=0, limit=50,):
|
|
406
437
|
if is_not_empty(datetime_range_start) and is_not_empty(datetime_range_end):
|
|
@@ -417,7 +448,7 @@ class CustomerEntitledVoucher(CustomerEntitledReward):
|
|
|
417
448
|
|
|
418
449
|
|
|
419
450
|
@staticmethod
|
|
420
|
-
def list_by_merchant_acct_with_cursor(merchant_acct, datetime_range_start=None, datetime_range_end=None, offset=0, limit=50, start_cursor=None):
|
|
451
|
+
def list_by_merchant_acct_with_cursor(merchant_acct, datetime_range_start=None, datetime_range_end=None, offset=0, limit=50, start_cursor=None, return_with_cursor=True):
|
|
421
452
|
if is_not_empty(datetime_range_start) and is_not_empty(datetime_range_end):
|
|
422
453
|
query = CustomerEntitledVoucher.query(ndb.AND(
|
|
423
454
|
CustomerEntitledVoucher.merchant_acct==merchant_acct.create_ndb_key(),
|
|
@@ -428,10 +459,10 @@ class CustomerEntitledVoucher(CustomerEntitledReward):
|
|
|
428
459
|
query = CustomerEntitledVoucher.query(ndb.AND(
|
|
429
460
|
CustomerEntitledVoucher.merchant_acct==merchant_acct.create_ndb_key(),
|
|
430
461
|
))
|
|
431
|
-
(result, next_cursor) = CustomerEntitledVoucher.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=
|
|
462
|
+
(result, next_cursor) = CustomerEntitledVoucher.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=return_with_cursor, offset=offset, limit=limit)
|
|
432
463
|
|
|
433
464
|
return (result, next_cursor)
|
|
434
|
-
|
|
465
|
+
'''
|
|
435
466
|
@staticmethod
|
|
436
467
|
def count_redeemed_by_merchant_voucher_and_passed_redeemed_datetime(customer, merchant_voucher, passed_redeemed_datetime):
|
|
437
468
|
|
|
@@ -185,7 +185,7 @@ class CustomerTransaction(SalesTransaction):
|
|
|
185
185
|
|
|
186
186
|
is_from_instant_transaction = ndb.BooleanProperty(required=False, default=False)
|
|
187
187
|
is_reward_redeemed = ndb.BooleanProperty(required=False, default=False)
|
|
188
|
-
|
|
188
|
+
is_rating_review_enabled = ndb.BooleanProperty(required=False, default=False)
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
is_membership_purchase = ndb.BooleanProperty(required=False, default=False)
|
|
@@ -204,6 +204,7 @@ class CustomerTransaction(SalesTransaction):
|
|
|
204
204
|
'transact_datetime', 'created_datetime', 'transact_outlet_key', 'is_revert', 'reverted_datetime', 'reverted_by_username',
|
|
205
205
|
'transact_by', 'transact_by_username', 'is_reward_redeemed', 'is_sales_transaction', 'allow_to_revert',
|
|
206
206
|
'is_membership_purchase', 'purchased_merchant_membership_key', 'is_tier_membership_upgraded', 'upgraded_merchant_tier_membership_key',
|
|
207
|
+
'is_rating_review_enabled',
|
|
207
208
|
]
|
|
208
209
|
|
|
209
210
|
def to_transaction_details_json(self):
|
|
@@ -337,12 +338,14 @@ class CustomerTransaction(SalesTransaction):
|
|
|
337
338
|
)
|
|
338
339
|
|
|
339
340
|
@staticmethod
|
|
340
|
-
def create_from_sales_transaction(customer, sales_transaction):
|
|
341
|
+
def create_from_sales_transaction(customer, sales_transaction, for_testing=False):
|
|
341
342
|
if sales_transaction:
|
|
343
|
+
merchant_acct = customer.registered_merchant_acct
|
|
344
|
+
is_rating_review_enabled = merchant_acct.is_rating_review_enabled
|
|
342
345
|
customer_transaction = CustomerTransaction(
|
|
343
346
|
parent = customer.create_ndb_key(),
|
|
344
347
|
|
|
345
|
-
transact_merchant =
|
|
348
|
+
transact_merchant = merchant_acct.create_ndb_key(),
|
|
346
349
|
transact_outlet = sales_transaction.transact_outlet,
|
|
347
350
|
|
|
348
351
|
tax_amount = sales_transaction.tax_amount,
|
|
@@ -358,7 +361,7 @@ class CustomerTransaction(SalesTransaction):
|
|
|
358
361
|
|
|
359
362
|
transact_datetime = sales_transaction.transact_datetime,
|
|
360
363
|
is_from_instant_transaction = True,
|
|
361
|
-
|
|
364
|
+
is_rating_review_enabled = is_rating_review_enabled
|
|
362
365
|
#is_sales_transaction = True,
|
|
363
366
|
#allow_to_revert = True,
|
|
364
367
|
#is_membership_purchase = False,
|
|
@@ -368,9 +371,10 @@ class CustomerTransaction(SalesTransaction):
|
|
|
368
371
|
)
|
|
369
372
|
|
|
370
373
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
+
if for_testing==False:
|
|
375
|
+
customer_transaction.put()
|
|
376
|
+
sales_transaction.used = True
|
|
377
|
+
sales_transaction.put()
|
|
374
378
|
return customer_transaction
|
|
375
379
|
|
|
376
380
|
@staticmethod
|
|
@@ -246,6 +246,7 @@ def construct_setting_by_outlet(outlet, device_setting=None, is_pos_device=False
|
|
|
246
246
|
'outlet_details' : outlet_details,
|
|
247
247
|
'program_configurations' : program_configurations,
|
|
248
248
|
'membership_configurations' : merchant_acct.membership_configuration,
|
|
249
|
+
'rating_review' : merchant_acct.program_settings.get('rating_review', False),
|
|
249
250
|
}
|
|
250
251
|
if device_setting:
|
|
251
252
|
setting['activation_code'] = device_setting.activation_code
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/customer_model_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/reward_model_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/redemption_catalogue_models.py
RENAMED
|
File without changes
|
{trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/referral_program_model.py
RENAMED
|
File without changes
|
{trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/spending_base_program_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|