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.
- {trex-model-1.0.4/trex_model.egg-info → trex-model-1.0.7}/PKG-INFO +1 -1
- {trex-model-1.0.4 → trex-model-1.0.7}/setup.py +1 -1
- {trex-model-1.0.4 → trex-model-1.0.7/trex_model.egg-info}/PKG-INFO +1 -1
- {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/SOURCES.txt +1 -0
- trex-model-1.0.7/trexmodel/models/datastore/app_models.py +71 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/customer_model_helpers.py +10 -5
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/customer_models.py +91 -2
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/fb_subsriber_models.py +0 -1
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/loyalty_models.py +2 -1
- trex-model-1.0.7/trexmodel/models/datastore/lucky_draw_models.py +869 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/membership_models.py +0 -3
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/merchant_models.py +142 -6
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/pos_models.py +3 -2
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/program_models.py +7 -7
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/reward_models.py +21 -7
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/transaction_models.py +65 -11
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/user_models.py +21 -8
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/merchant_helpers.py +59 -1
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/program_conf.py +53 -11
- trex-model-1.0.4/trexmodel/models/datastore/lucky_draw_models.py +0 -84
- {trex-model-1.0.4 → trex-model-1.0.7}/LICENSE +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/MANIFEST.in +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/README.md +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/setup.cfg +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/dependency_links.txt +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/requires.txt +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trex_model.egg-info/top_level.txt +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/__init__.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/conf.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/__init__.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/__init__.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/admin_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/analytic_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/coporate_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/inventory_model.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/model_decorators.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/ndb_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/prepaid_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/product_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/redeem_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/spending_base_program_model.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/system_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/task_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/test_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/datastore/voucher_models.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/model_decorator.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/models/prepaid_helpers.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/pos_conf.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/__init__.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/gcloud/__init__.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/gcloud/datastore_util.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/model/__init__.py +0 -0
- {trex-model-1.0.4 → trex-model-1.0.7}/trexmodel/utils/model/model_util.py +0 -0
|
@@ -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
|
-
|
|
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 =
|
|
213
|
-
redeem_code_of_reverting_voucher =
|
|
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
|
|
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',
|
|
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):
|