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.

Files changed (63) hide show
  1. {trex-model-1.5.16 → trex-model-1.5.19}/PKG-INFO +1 -1
  2. {trex-model-1.5.16 → trex-model-1.5.19}/setup.py +1 -1
  3. {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/PKG-INFO +1 -1
  4. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/customer_models.py +2 -2
  5. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/reward_transaction_helper.py +10 -10
  6. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/lucky_draw_models.py +3 -3
  7. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/marketing_models.py +1 -1
  8. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/merchant_models.py +13 -3
  9. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/pos_models.py +51 -9
  10. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/prepaid_models.py +30 -0
  11. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/rating_models.py +63 -2
  12. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/redeem_models.py +45 -15
  13. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/reward_models.py +35 -4
  14. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/transaction_models.py +11 -7
  15. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/merchant_helpers.py +1 -0
  16. {trex-model-1.5.16 → trex-model-1.5.19}/LICENSE +0 -0
  17. {trex-model-1.5.16 → trex-model-1.5.19}/MANIFEST.in +0 -0
  18. {trex-model-1.5.16 → trex-model-1.5.19}/README.md +0 -0
  19. {trex-model-1.5.16 → trex-model-1.5.19}/setup.cfg +0 -0
  20. {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/SOURCES.txt +0 -0
  21. {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/dependency_links.txt +0 -0
  22. {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/requires.txt +0 -0
  23. {trex-model-1.5.16 → trex-model-1.5.19}/trex_model.egg-info/top_level.txt +0 -0
  24. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/__init__.py +0 -0
  25. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/conf.py +0 -0
  26. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/__init__.py +0 -0
  27. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/__init__.py +0 -0
  28. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/admin_models.py +0 -0
  29. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/analytic_models.py +0 -0
  30. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/app_models.py +0 -0
  31. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/coporate_models.py +0 -0
  32. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/customer_model_helpers.py +0 -0
  33. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/fb_subsriber_models.py +0 -0
  34. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/__init__.py +0 -0
  35. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/helper/reward_model_helpers.py +0 -0
  36. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/import_models.py +0 -0
  37. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/inventory_model.py +0 -0
  38. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/loyalty_models.py +0 -0
  39. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/membership_models.py +0 -0
  40. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/message_model_helper.py +0 -0
  41. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/message_models.py +0 -0
  42. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/model_decorators.py +0 -0
  43. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/ndb_models.py +0 -0
  44. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/product_models.py +0 -0
  45. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/program_models.py +0 -0
  46. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/recruit_models.py +0 -0
  47. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/redemption_catalogue_models.py +0 -0
  48. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/referral_program_model.py +0 -0
  49. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/spending_base_program_model.py +0 -0
  50. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/system_models.py +0 -0
  51. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/task_models.py +0 -0
  52. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/test_models.py +0 -0
  53. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/user_models.py +0 -0
  54. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/datastore/voucher_models.py +0 -0
  55. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/model_decorator.py +0 -0
  56. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/models/prepaid_helpers.py +0 -0
  57. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/pos_conf.py +0 -0
  58. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/program_conf.py +0 -0
  59. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/__init__.py +0 -0
  60. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/gcloud/__init__.py +0 -0
  61. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/gcloud/datastore_util.py +0 -0
  62. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/model/__init__.py +0 -0
  63. {trex-model-1.5.16 → trex-model-1.5.19}/trexmodel/utils/model/model_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trex-model
3
- Version: 1.5.16
3
+ Version: 1.5.19
4
4
  Summary: TRex database module package
5
5
  Home-page: https://bitbucket.org/lokjac/trex-model
6
6
  Author: Jack Lok
@@ -3,7 +3,7 @@ with open("README.md", "r") as fh:
3
3
  long_description = fh.read()
4
4
  setuptools.setup(
5
5
  name='trex-model',
6
- version='1.5.16',
6
+ version='1.5.19',
7
7
  author="Jack Lok",
8
8
  author_email="sglok77@gmail.com",
9
9
  description="TRex database module package",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trex-model
3
- Version: 1.5.16
3
+ Version: 1.5.19
4
4
  Summary: TRex database module package
5
5
  Home-page: https://bitbucket.org/lokjac/trex-model
6
6
  Author: Jack Lok
@@ -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
- 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)
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 list_by_merchant_acct_with_cursor(merchant_acct, offset=0, limit=50, start_cursor=None):
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
- (result, next_cursor) = LuckyDrawTicket.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=True, offset=offset, limit=limit)
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=0, limit=10):
1332
- return MerchantAcct.query().order(-MerchantAcct.registered_datetime).fetch(offset=offset, limit=limit)
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 = ndb.StringProperty(required=True)
21
- activation_code = ndb.StringProperty(required=True)
22
- device_id = ndb.StringProperty(required=False)
23
- activated = ndb.BooleanProperty(required=True, default=False)
24
- assigned_outlet = ndb.KeyProperty(name="assigned_outlet", kind=Outlet)
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 = ndb.DateTimeProperty(required=True, auto_now_add=True)
27
- activated_datetime = ndb.DateTimeProperty(required=False)
28
- testing = ndb.BooleanProperty(required=False, default=False)
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
- 'activated_datetime', 'created_datetime']
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 = outlet.merchant_acct_entity
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
- for merchant_voucher_key, voucher_redeemed_details in self.redeemed_summary.get(program_conf.REWARD_FORMAT_VOUCHER).get('vouchers').items():
192
- upstream_info_list.append(CustomerRedeemedItemUpstream(
193
- customer_key = self.redeemed_customer_key,
194
- merchant_key = self.redeemed_merchant_acct_key,
195
- redeemed_outlet_key = self.redeemed_outlet_key,
196
- transaction_id = self.transaction_id,
197
- reward_format = self.reward_format,
198
- redeemed_datetime = self.redeemed_datetime,
199
- redeemed_amount = voucher_redeemed_details.get('amount'),
200
- voucher_key = merchant_voucher_key,
201
- ))
202
- return upstream_info_list
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 list_by_merchant_acct_with_cursor(merchant_acct, datetime_ranage_start=None, datetime_range_end=None, offset=0, limit=50, start_cursor=None):
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
- (result, next_cursor) = CustomerRedemption.list_all_with_condition_query(query, start_cursor=start_cursor, return_with_cursor=True, offset=offset, limit=limit)
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=True, offset=offset, limit=limit)
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 = customer.registered_merchant_acct.create_ndb_key(),
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
- customer_transaction.put()
372
- sales_transaction.used = True
373
- sales_transaction.put()
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