trex-model 1.0.4__tar.gz → 1.0.7__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 (53) hide show
  1. {trex-model-1.0.4/trex_model.egg-info → trex-model-1.0.7}/PKG-INFO +1 -1
  2. {trex-model-1.0.4 → trex-model-1.0.7}/setup.py +1 -1
  3. {trex-model-1.0.4 → trex-model-1.0.7/trex_model.egg-info}/PKG-INFO +1 -1
  4. {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/SOURCES.txt +1 -0
  5. trex-model-1.0.7/trexmodel/models/datastore/app_models.py +71 -0
  6. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/customer_model_helpers.py +10 -5
  7. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/customer_models.py +91 -2
  8. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/fb_subsriber_models.py +0 -1
  9. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/loyalty_models.py +2 -1
  10. trex-model-1.0.7/trexmodel/models/datastore/lucky_draw_models.py +869 -0
  11. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/membership_models.py +0 -3
  12. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/merchant_models.py +142 -6
  13. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/pos_models.py +3 -2
  14. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/program_models.py +7 -7
  15. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/reward_models.py +21 -7
  16. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/transaction_models.py +65 -11
  17. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/user_models.py +21 -8
  18. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/merchant_helpers.py +59 -1
  19. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/program_conf.py +53 -11
  20. trex-model-1.0.4/trexmodel/models/datastore/lucky_draw_models.py +0 -84
  21. {trex-model-1.0.4 → trex-model-1.0.7}/LICENSE +0 -0
  22. {trex-model-1.0.4 → trex-model-1.0.7}/MANIFEST.in +0 -0
  23. {trex-model-1.0.4 → trex-model-1.0.7}/README.md +0 -0
  24. {trex-model-1.0.4 → trex-model-1.0.7}/setup.cfg +0 -0
  25. {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/dependency_links.txt +0 -0
  26. {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/requires.txt +0 -0
  27. {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/top_level.txt +0 -0
  28. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/__init__.py +0 -0
  29. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/conf.py +0 -0
  30. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/__init__.py +0 -0
  31. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/__init__.py +0 -0
  32. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/admin_models.py +0 -0
  33. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/analytic_models.py +0 -0
  34. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/coporate_models.py +0 -0
  35. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/inventory_model.py +0 -0
  36. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/model_decorators.py +0 -0
  37. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/ndb_models.py +0 -0
  38. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/prepaid_models.py +0 -0
  39. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/product_models.py +0 -0
  40. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/redeem_models.py +0 -0
  41. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/spending_base_program_model.py +0 -0
  42. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/system_models.py +0 -0
  43. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/task_models.py +0 -0
  44. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/test_models.py +0 -0
  45. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/voucher_models.py +0 -0
  46. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/model_decorator.py +0 -0
  47. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/prepaid_helpers.py +0 -0
  48. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/pos_conf.py +0 -0
  49. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/__init__.py +0 -0
  50. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/gcloud/__init__.py +0 -0
  51. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/gcloud/datastore_util.py +0 -0
  52. {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/model/__init__.py +0 -0
  53. {trex-model-1.0.4 → trex-model-1.0.7}/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.0.4
3
+ Version: 1.0.7
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.0.4',
6
+ version='1.0.7',
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.0.4
3
+ Version: 1.0.7
4
4
  Summary: TRex database module package
5
5
  Home-page: https://bitbucket.org/lokjac/trex-model
6
6
  Author: Jack Lok
@@ -19,6 +19,7 @@ trexmodel/models/prepaid_helpers.py
19
19
  trexmodel/models/datastore/__init__.py
20
20
  trexmodel/models/datastore/admin_models.py
21
21
  trexmodel/models/datastore/analytic_models.py
22
+ trexmodel/models/datastore/app_models.py
22
23
  trexmodel/models/datastore/coporate_models.py
23
24
  trexmodel/models/datastore/customer_model_helpers.py
24
25
  trexmodel/models/datastore/customer_models.py
@@ -0,0 +1,71 @@
1
+ '''
2
+ Created on 23 May 2023
3
+
4
+ @author: jacklok
5
+ '''
6
+
7
+ import logging
8
+ from trexmodel.models.datastore.ndb_models import BaseNModel, DictModel
9
+ from google.cloud import ndb
10
+ from datetime import datetime
11
+ import trexmodel.conf as model_conf
12
+
13
+ logger = logging.getLogger('model')
14
+
15
+ class AppMessageBase(BaseNModel, DictModel):
16
+ title = ndb.StringProperty(required=True)
17
+ content = ndb.StringProperty(required=False)
18
+ start_date = ndb.DateProperty(required=True)
19
+ end_date = ndb.DateProperty(required=True)
20
+ archived = ndb.BooleanProperty(default=False)
21
+
22
+ created_datetime = ndb.DateTimeProperty(required=True, auto_now_add=True)
23
+ modified_datetime = ndb.DateTimeProperty(required=True, auto_now=True)
24
+ archived_datetime = ndb.DateTimeProperty(required=False)
25
+
26
+ @classmethod
27
+ def create(cls, title, content=None, start_date=None, end_date=None):
28
+ message = cls(
29
+ title = title,
30
+ content = content,
31
+ start_date = start_date,
32
+ end_date = end_date,
33
+ )
34
+ message.put()
35
+ return message
36
+
37
+ @classmethod
38
+ def update(cls, message, title=None, content=None, start_date=None, end_date=None):
39
+ message.title = title
40
+ message.content = content
41
+ message.start_date = start_date
42
+ message.end_date = end_date
43
+ message.put()
44
+
45
+ def archive(self):
46
+ self.archived = True
47
+ self.archived_datetime = datetime.now()
48
+ self.put()
49
+
50
+ @classmethod
51
+ def list(cls, is_archived=False):
52
+ return cls.query(ndb.AND(cls.archived == is_archived)).fetch(limit=model_conf.MAX_FETCH_RECORD)
53
+
54
+ @classmethod
55
+ def list_active(cls):
56
+ now = datetime.now().date()
57
+ return cls.query(ndb.AND(cls.archived == False, cls.start_date>=now, cls.end_date<now)).fetch(limit=model_conf.MAX_FETCH_RECORD)
58
+
59
+ class AppMessage(AppMessageBase):
60
+ pass
61
+
62
+
63
+ class AppPromotion(AppMessageBase):
64
+ image_file_type = ndb.StringProperty(required=False)
65
+ image_file_public_url = ndb.StringProperty(required=False)
66
+ image_file_storage_filename = ndb.StringProperty(required=False)
67
+
68
+
69
+
70
+
71
+
@@ -201,7 +201,8 @@ def update_customer_entiteld_voucher_summary_with_new_voucher_info(customer_enti
201
201
 
202
202
  return customer_entitled_voucher_summary
203
203
 
204
- def update_customer_entiteld_voucher_summary_after_reverted_voucher(customer_entitled_voucher_summary, reverted_customer_voucher):
204
+
205
+ def update_customer_entiteld_voucher_summary_after_removed_voucher(customer_entitled_voucher_summary, removed_customer_voucher):
205
206
  '''
206
207
  removed entitled voucher from customer entitled voucher summary
207
208
  '''
@@ -209,8 +210,8 @@ def update_customer_entiteld_voucher_summary_after_reverted_voucher(customer_ent
209
210
 
210
211
 
211
212
  if customer_entitled_voucher_summary:
212
- merchant_voucher_key = reverted_customer_voucher.entitled_voucher_key
213
- redeem_code_of_reverting_voucher = reverted_customer_voucher.redeem_code
213
+ merchant_voucher_key = removed_customer_voucher.entitled_voucher_key
214
+ redeem_code_of_reverting_voucher = removed_customer_voucher.redeem_code
214
215
 
215
216
  logger.debug('merchant_voucher_key=%s', merchant_voucher_key)
216
217
  logger.debug('redeem_code_of_reverting_voucher=%s', redeem_code_of_reverting_voucher)
@@ -235,9 +236,13 @@ def update_customer_entiteld_voucher_summary_after_reverted_voucher(customer_ent
235
236
 
236
237
  return customer_entitled_voucher_summary
237
238
 
238
-
239
+
240
+ def update_customer_entiteld_voucher_summary_after_reverted_voucher(entitled_voucher_summary, reverted_customer_voucher):
241
+ return update_customer_entiteld_voucher_summary_after_removed_voucher(entitled_voucher_summary, reverted_customer_voucher)
242
+
239
243
  def update_customer_entiteld_voucher_summary_after_redeemed_voucher(entitled_voucher_summary, redeemed_customer_voucher):
240
- return update_customer_entiteld_voucher_summary_after_reverted_voucher(entitled_voucher_summary, redeemed_customer_voucher)
244
+ return update_customer_entiteld_voucher_summary_after_removed_voucher(entitled_voucher_summary, redeemed_customer_voucher)
245
+
241
246
 
242
247
  ''' --------------- End: Update reward summary for voucher--------------'''
243
248
 
@@ -18,6 +18,8 @@ from six import string_types
18
18
  from datetime import datetime, timedelta
19
19
  from trexmodel.models.datastore.membership_models import MerchantTierMembership,\
20
20
  MerchantMembership
21
+ from trexmodel.models.datastore.customer_model_helpers import update_customer_entiteld_voucher_summary_after_removed_voucher,\
22
+ update_customer_entiteld_voucher_summary_with_customer_new_voucher
21
23
 
22
24
 
23
25
  logger = logging.getLogger('model')
@@ -66,6 +68,7 @@ class Customer(BaseNModel, DictModel, FullTextSearchable):
66
68
  entitled_voucher_summary = ndb.JsonProperty()
67
69
  entitled_birthday_reward_summary = ndb.JsonProperty()
68
70
  entitled_membership_reward_summary = ndb.JsonProperty()
71
+ entitled_lucky_draw_ticket_summary = ndb.JsonProperty(required=False)
69
72
 
70
73
  kpi_summary = ndb.JsonProperty()
71
74
 
@@ -73,7 +76,7 @@ class Customer(BaseNModel, DictModel, FullTextSearchable):
73
76
 
74
77
  dict_properties = ['name', 'mobile_phone', 'email', 'gender', 'birth_date', 'reference_code', 'merchant_reference_code',
75
78
  'tags_list', 'memberships_list', 'registered_merchant_acct', 'entitled_membership_reward_summary',
76
- 'reward_summary', 'entitled_voucher_summary', 'prepaid_summary', 'kpi_summary',
79
+ 'reward_summary', 'entitled_voucher_summary', 'prepaid_summary', 'kpi_summary', 'entitled_lucky_draw_ticket_summary',
77
80
  'entitled_birthday_reward_summary', 'tier_membership_key',
78
81
  'registered_outlet_key', 'registered_merchant_acct_key', 'registered_datetime', 'modified_datetime']
79
82
 
@@ -159,6 +162,82 @@ class Customer(BaseNModel, DictModel, FullTextSearchable):
159
162
  customer_acct.tier_membership = new_tier_membership.create_ndb_key()
160
163
  customer_acct.put()
161
164
 
165
+ @staticmethod
166
+ def add_new_tickets_list_into_lucky_draw_ticket_summary(customer_acct, new_entitled_draw_tickets_list):
167
+
168
+ logger.debug('new_entitled_draw_tickets_list=%s', new_entitled_draw_tickets_list)
169
+
170
+ entitled_lucky_draw_ticket_summary = {}
171
+ if customer_acct.entitled_lucky_draw_ticket_summary:
172
+ entitled_lucky_draw_ticket_summary = customer_acct.entitled_lucky_draw_ticket_summary
173
+
174
+ entitled_tickets_list = entitled_lucky_draw_ticket_summary.get('tickets') or []
175
+
176
+ tickets_to_update_list = []
177
+
178
+ #check before add
179
+ for new_ticket in new_entitled_draw_tickets_list:
180
+ check_ticket = next((obj for obj in entitled_tickets_list if obj.get('ticket_key') == new_ticket.get('ticket_key')), None)
181
+ if check_ticket is None:
182
+ logger.debug('Cannot find ticket, thus going to add ticket')
183
+ tickets_to_update_list.append(new_ticket)
184
+ else:
185
+ logger.debug('Found ticket, thus ignore to avoid duplicated ticket')
186
+ continue
187
+
188
+ entitled_tickets_list.extend(tickets_to_update_list)
189
+
190
+ entitled_lucky_draw_ticket_summary['tickets'] = entitled_tickets_list
191
+ entitled_lucky_draw_ticket_summary['count'] = len(entitled_tickets_list)
192
+
193
+ customer_acct.entitled_lucky_draw_ticket_summary = entitled_lucky_draw_ticket_summary
194
+
195
+
196
+ customer_acct.put()
197
+
198
+ @staticmethod
199
+ def update_ticket_into_lucky_draw_ticket_summary(customer_acct, updated_draw_ticket):
200
+ entitled_lucky_draw_ticket_summary = {}
201
+ if customer_acct.entitled_lucky_draw_ticket_summary:
202
+ entitled_lucky_draw_ticket_summary = customer_acct.entitled_lucky_draw_ticket_summary
203
+
204
+ draw_tickets_list = entitled_lucky_draw_ticket_summary.get('tickets') or []
205
+
206
+ new_tickets_list = []
207
+
208
+ for ticket in draw_tickets_list:
209
+ if ticket.get('ticket_key')!=updated_draw_ticket.get('ticket_key'):
210
+ new_tickets_list.append(ticket)
211
+ else:
212
+ new_tickets_list.append(updated_draw_ticket)
213
+
214
+ customer_acct.entitled_lucky_draw_ticket_summary['tickets'] = new_tickets_list
215
+ customer_acct.put()
216
+
217
+ @staticmethod
218
+ def remove_ticket_from_lucky_draw_ticket_summary(customer_acct, removed_draw_ticket):
219
+ entitled_lucky_draw_ticket_summary = {}
220
+ if customer_acct.entitled_lucky_draw_ticket_summary:
221
+ entitled_lucky_draw_ticket_summary = customer_acct.entitled_lucky_draw_ticket_summary
222
+
223
+ draw_tickets_list = entitled_lucky_draw_ticket_summary.get('tickets') or []
224
+
225
+ new_tickets_list = []
226
+
227
+ for ticket in draw_tickets_list:
228
+ if ticket.get('ticket_key')!=removed_draw_ticket.get('ticket_key'):
229
+ new_tickets_list.append(ticket)
230
+
231
+
232
+ customer_acct.entitled_lucky_draw_ticket_summary['tickets'] = new_tickets_list
233
+ customer_acct.entitled_lucky_draw_ticket_summary['count'] = len(new_tickets_list)
234
+ customer_acct.put()
235
+
236
+ @staticmethod
237
+ def update_tickets_list_into_lucky_draw_ticket_summary(customer_acct, tickets_list):
238
+ for ticket in tickets_list:
239
+ ticket.patch_prize_image_base_url()
240
+ Customer.update_ticket_into_lucky_draw_ticket_summary(customer_acct, ticket.to_configuration())
162
241
  @classmethod
163
242
  def get_by_reference_code(cls, reference_code, merchant_acct):
164
243
  return cls.query(ndb.AND(cls.reference_code==reference_code, cls.merchant_acct==merchant_acct.create_ndb_key())).get()
@@ -567,7 +646,17 @@ class Customer(BaseNModel, DictModel, FullTextSearchable):
567
646
  if is_membership_reward_has_been_given==False:
568
647
  customer_acct.entitled_membership_reward_summary = entitled_membership_reward_summary
569
648
  customer_acct.put()
570
-
649
+
650
+ def update_after_removed_voucher(self, removed_voucher):
651
+ entitled_voucher_summary = self.entitled_voucher_summary
652
+ update_customer_entiteld_voucher_summary_after_removed_voucher(entitled_voucher_summary, removed_voucher)
653
+ self.put()
654
+
655
+ def update_after_added_voucher(self, added_voucher):
656
+ entitled_voucher_summary = self.entitled_voucher_summary
657
+ update_customer_entiteld_voucher_summary_with_customer_new_voucher(entitled_voucher_summary, added_voucher)
658
+ self.put()
659
+
571
660
  class CustomerMembership(BaseNModel, DictModel):
572
661
  '''
573
662
  parent is Customer
@@ -6,7 +6,6 @@ Created on 23 Oct 2020
6
6
 
7
7
  from google.cloud import ndb
8
8
  from trexmodel.models.datastore.ndb_models import BaseNModel, DictModel
9
- from trexlib.utils.common.cache_util import cache
10
9
 
11
10
  import logging
12
11
  from trexlib.utils.security_util import generate_user_id, hash_password
@@ -31,7 +31,8 @@ class LoyaltyDeviceSetting(BaseNModel,DictModel):
31
31
  activated_datetime = ndb.DateTimeProperty(required=False)
32
32
  testing = ndb.BooleanProperty(required=False, default=False)
33
33
 
34
- dict_properties = ['device_name', 'activation_code', 'device_id', 'activated', 'assigned_outlet_key', 'activated_datetime', 'created_datetime']
34
+ dict_properties = ['device_name', 'activation_code', 'device_id', 'activated', 'assigned_outlet_key',
35
+ 'activated_datetime', 'created_datetime']
35
36
 
36
37
  @property
37
38
  def is_test_setting(self):