ob-dj-store 0.0.16__py3-none-any.whl → 0.0.16.1__py3-none-any.whl

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.
@@ -180,6 +180,7 @@ class OrderSerializer(serializers.ModelSerializer):
180
180
  "total_amount",
181
181
  "preparation_time",
182
182
  "estimated_timeline",
183
+ "get_discount_amount",
183
184
  "history",
184
185
  "car_id",
185
186
  "pickup_time",
@@ -657,6 +658,8 @@ class CartSerializer(serializers.ModelSerializer):
657
658
  "total_price",
658
659
  "tax_amount",
659
660
  "total_price_with_tax",
661
+ "discount_offer_amount",
662
+ "total_price_with_discount",
660
663
  )
661
664
  read_only_fields = (
662
665
  "id",
@@ -1524,7 +1527,7 @@ class PartnerOTPRequestSerializer(serializers.ModelSerializer):
1524
1527
 
1525
1528
 
1526
1529
  class PartnerAuthInfoSerializer(serializers.ModelSerializer):
1527
- promotion_code = serializers.CharField(write_only=True, required=False)
1530
+ promotion_code = serializers.IntegerField(write_only=True, required=False)
1528
1531
  otp_code = serializers.IntegerField(write_only=True, required=False)
1529
1532
  email = serializers.EmailField(write_only=True, required=True)
1530
1533
 
@@ -1578,6 +1581,11 @@ class PartnerAuthInfoSerializer(serializers.ModelSerializer):
1578
1581
  promotion_code = attrs.get("promotion_code", None)
1579
1582
  if promotion_code == None:
1580
1583
  raise serializers.ValidationError(_("Promotion code is required"))
1584
+ elif not partner.promotion_code:
1585
+ logger.error(f"{partner.name} does not have promotion code")
1586
+ raise serializers.ValidationError(_("Promotion code is not working"))
1587
+ elif partner.promotion_code != promotion_code:
1588
+ raise serializers.ValidationError(_("Promotion code is invalid"))
1581
1589
  return attrs
1582
1590
 
1583
1591
  def validate(self, attrs):
@@ -1,4 +1,5 @@
1
1
  import typing
2
+ from typing import Any
2
3
 
3
4
  from django import forms
4
5
  from django.contrib import admin
@@ -16,6 +17,7 @@ from ob_dj_store.core.stores.admin_inlines import (
16
17
  OpeningHoursInlineAdmin,
17
18
  OrderHistoryInlineAdmin,
18
19
  OrderItemInline,
20
+ PartnerEmailDomainInlineAdmin,
19
21
  PhoneContactInlineAdmin,
20
22
  ProductAttributeInlineAdmin,
21
23
  ProductMediaInlineAdmin,
@@ -386,6 +388,11 @@ class WalletTransactionAdmin(ImportExportModelAdmin, admin.ModelAdmin):
386
388
  def user(self, obj) -> typing.Text:
387
389
  return obj.wallet.user.email
388
390
 
391
+ def save_model(self, request: Any, obj: Any, form: Any, change: Any) -> None:
392
+ if not obj.pk:
393
+ obj.is_by_admin = True
394
+ return super().save_model(request, obj, form, change)
395
+
389
396
 
390
397
  class WalletAdmin(admin.ModelAdmin):
391
398
  list_display = ("id", "user", "balance", "currency")
@@ -402,6 +409,35 @@ class AvailabilityHoursAdmin(admin.ModelAdmin):
402
409
  list_display = ("id", "store", "category", "from_hour", "to_hour")
403
410
 
404
411
 
412
+ # Partner Admins
413
+ class PartnerAdmin(admin.ModelAdmin):
414
+ list_display = ("name", "auth_method", "country", "discount", "promotion_code")
415
+ search_fields = ["name", "country", "domains__email_domain"]
416
+ list_filter = ["discount", "auth_method"]
417
+ inlines = [
418
+ PartnerEmailDomainInlineAdmin,
419
+ ]
420
+
421
+
422
+ class DiscountAdmin(admin.ModelAdmin):
423
+ list_display = ("id", "discount_rate", "is_active")
424
+
425
+
426
+ class PartnerAuthInfoAdmin(admin.ModelAdmin):
427
+ list_display = (
428
+ "id",
429
+ "user",
430
+ "email",
431
+ "partner",
432
+ "authentication_expires",
433
+ "created_at",
434
+ )
435
+ search_fields = ["email", "user__email", "partner__name"]
436
+ list_filter = [
437
+ "authentication_expires",
438
+ ]
439
+
440
+
405
441
  admin.site.register(models.Store, StoreAdmin)
406
442
  admin.site.register(models.ShippingMethod, ShippingMethodAdmin)
407
443
  admin.site.register(models.PaymentMethod, PaymentMethodAdmin)
@@ -422,3 +458,6 @@ admin.site.register(models.Wallet, WalletAdmin)
422
458
  admin.site.register(models.WalletMedia, WalletMediaAdmin)
423
459
  admin.site.register(models.AvailabilityHours, AvailabilityHoursAdmin)
424
460
  admin.site.register(models.Menu, MenuAdmin)
461
+ admin.site.register(models.Partner, PartnerAdmin)
462
+ admin.site.register(models.Discount, DiscountAdmin)
463
+ admin.site.register(models.PartnerAuthInfo, PartnerAuthInfoAdmin)
@@ -118,3 +118,8 @@ class OrderItemInline(admin.TabularInline):
118
118
  class InventoryOperationInlineAdmin(admin.TabularInline):
119
119
  model = models.InventoryOperations
120
120
  extra = 1
121
+
122
+
123
+ class PartnerEmailDomainInlineAdmin(admin.TabularInline):
124
+ model = models.PartnerEmailDomain
125
+ extra = 1
@@ -6,6 +6,7 @@ from decimal import Decimal
6
6
  from django.contrib.contenttypes.models import ContentType
7
7
  from django.core.exceptions import ObjectDoesNotExist, ValidationError
8
8
  from django.db import models
9
+ from django.utils.timezone import now
9
10
  from django.utils.translation import gettext_lazy as _
10
11
 
11
12
  from config import settings
@@ -63,7 +64,7 @@ class PaymentManager(models.Manager):
63
64
  {"order", _("You cannot perform payment without items")}
64
65
  )
65
66
  try:
66
- if orders[0].store:
67
+ if orders[0].store and orders[0].type_of_order == "PHYSICAL":
67
68
  kwargs["payment_tax"] = Tax.objects.get(
68
69
  country=orders[0].store.address.country, is_active=True
69
70
  )
@@ -150,7 +151,21 @@ class OrderManager(models.Manager):
150
151
  from ob_dj_store.apis.stores.rest.serializers.serializers import (
151
152
  OrderDataSerializer,
152
153
  )
154
+ from ob_dj_store.core.stores.models._partner import PartnerAuthInfo
153
155
 
156
+ try:
157
+ partner_auth_info = PartnerAuthInfo.objects.get(
158
+ user=kwargs["customer"],
159
+ authentication_expires__gte=now(),
160
+ partner__offer_start_time__lte=now(),
161
+ partner__offer_end_time__gt=now(),
162
+ )
163
+ except ObjectDoesNotExist:
164
+ partner_auth_info = None
165
+ if partner_auth_info:
166
+ partner = partner_auth_info.partner
167
+ if partner.stores.filter(pk=kwargs["store"].pk).exists():
168
+ kwargs["discount"] = partner.discount
154
169
  order = super().create(**kwargs)
155
170
  serializer = OrderDataSerializer(order)
156
171
  order.init_data = serializer.data
@@ -0,0 +1,30 @@
1
+ # Generated by Django 3.2.8 on 2023-10-10 14:40
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("stores", "0090_auto_20231006_1356"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="partner",
15
+ name="stores",
16
+ field=models.ManyToManyField(related_name="partners", to="stores.Store"),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name="partner",
20
+ name="promotion_code",
21
+ field=models.PositiveBigIntegerField(
22
+ blank=True, null=True, unique=True, verbose_name="Promotion code"
23
+ ),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="partneremaildomain",
27
+ name="email_domain",
28
+ field=models.CharField(max_length=255, unique=True),
29
+ ),
30
+ ]
@@ -0,0 +1,47 @@
1
+ # Generated by Django 3.2.8 on 2023-10-12 10:39
2
+
3
+ import django.db.models.deletion
4
+ import django.utils.timezone
5
+ from django.db import migrations, models
6
+
7
+ import ob_dj_store.core.stores.models._partner
8
+
9
+
10
+ class Migration(migrations.Migration):
11
+
12
+ dependencies = [
13
+ ("stores", "0091_auto_20231010_1740"),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.AddField(
18
+ model_name="order",
19
+ name="discount",
20
+ field=models.ForeignKey(
21
+ blank=True,
22
+ null=True,
23
+ on_delete=django.db.models.deletion.PROTECT,
24
+ to="stores.discount",
25
+ ),
26
+ ),
27
+ migrations.AddField(
28
+ model_name="partner",
29
+ name="offer_end_time",
30
+ field=models.DateTimeField(
31
+ default=ob_dj_store.core.stores.models._partner.default_offer_end_time,
32
+ verbose_name="Offer end date",
33
+ ),
34
+ ),
35
+ migrations.AddField(
36
+ model_name="partner",
37
+ name="offer_start_time",
38
+ field=models.DateTimeField(
39
+ default=django.utils.timezone.now, verbose_name="Offer start date"
40
+ ),
41
+ ),
42
+ migrations.AddField(
43
+ model_name="wallettransaction",
44
+ name="is_by_admin",
45
+ field=models.BooleanField(default=False),
46
+ ),
47
+ ]
@@ -3,9 +3,11 @@ from decimal import Decimal
3
3
  from django.contrib.auth import get_user_model
4
4
  from django.core.exceptions import ObjectDoesNotExist, ValidationError
5
5
  from django.db import models
6
+ from django.utils.timezone import now
6
7
  from django.utils.translation import gettext_lazy as _
7
8
 
8
9
  from ob_dj_store.core.stores.managers import CartItemManager, CartManager
10
+ from ob_dj_store.core.stores.models._partner import PartnerAuthInfo
9
11
 
10
12
 
11
13
  class Cart(models.Model):
@@ -43,6 +45,27 @@ class Cart(models.Model):
43
45
  def total_price_with_tax(self) -> Decimal:
44
46
  return self.total_price + self.tax_amount
45
47
 
48
+ @property
49
+ def get_user_partner(self):
50
+ try:
51
+ partner_auth_info = PartnerAuthInfo.objects.get(
52
+ user=self.customer,
53
+ authentication_expires__gte=now(),
54
+ partner__offer_start_time__lte=now(),
55
+ partner__offer_end_time__gt=now(),
56
+ )
57
+ return partner_auth_info.partner
58
+ except ObjectDoesNotExist:
59
+ return None
60
+
61
+ @property
62
+ def discount_offer_amount(self):
63
+ return sum(map(lambda item: item.discount_amount, self.items.all()))
64
+
65
+ @property
66
+ def total_price_with_discount(self):
67
+ return self.total_price - self.discount_offer_amount
68
+
46
69
  def __str__(self):
47
70
  return f"Cart - {self.customer.email} with total price {self.total_price}"
48
71
 
@@ -124,6 +147,14 @@ class CartItem(models.Model):
124
147
  pass
125
148
  return 0
126
149
 
150
+ @property
151
+ def discount_amount(self):
152
+ partner = self.cart.get_user_partner
153
+ if partner:
154
+ if partner.discount and partner.stores.filter(pk=self.store.pk).exists():
155
+ return partner.discount.perc_to_flat(self.total_price)
156
+ return Decimal(0)
157
+
127
158
  @property
128
159
  def attribute_choices_total_price(self) -> Decimal:
129
160
  total_price = Decimal(0)
@@ -37,6 +37,9 @@ class Order(DjangoModelCleanMixin, models.Model):
37
37
  # TODO: Probably we want to setup the on_delete to SET_NULL because orders is part of
38
38
  # sales and even if a user deleted orders cannot disappear otherwise will reflect
39
39
  # invalid sales figure; same can be applied for the store field
40
+ discount = models.ForeignKey(
41
+ "stores.Discount", on_delete=models.PROTECT, null=True, blank=True
42
+ )
40
43
  customer = models.ForeignKey(
41
44
  get_user_model(),
42
45
  related_name="orders",
@@ -126,6 +129,10 @@ class Order(DjangoModelCleanMixin, models.Model):
126
129
  self.status = Order.OrderStatus.READY
127
130
  self.save()
128
131
 
132
+ @property
133
+ def get_discount_amount(self):
134
+ return sum(map(lambda item: item.discount_offer_amount, self.items.all()))
135
+
129
136
  @property
130
137
  def total_amount(self):
131
138
  if self.type_of_order == Order.OrderType.WALLET.value:
@@ -137,6 +144,7 @@ class Order(DjangoModelCleanMixin, models.Model):
137
144
  )
138
145
  if self.shipping_method:
139
146
  amount += self.shipping_method.shipping_fee
147
+ amount -= self.get_discount_amount
140
148
  return amount
141
149
 
142
150
  @property
@@ -211,6 +219,13 @@ class OrderItem(DjangoModelCleanMixin, models.Model):
211
219
  total_price += attribute_choice.price
212
220
  return total_price
213
221
 
222
+ @property
223
+ def discount_offer_amount(self):
224
+ discount = self.order.discount
225
+ if discount:
226
+ return discount.perc_to_flat(self.total_amount)
227
+ return Decimal(0)
228
+
214
229
  @property
215
230
  def total_amount(self):
216
231
  if self.total_price > 0:
@@ -10,6 +10,7 @@ from django_countries.fields import CountryField
10
10
  from ob_dj_otp.core.otp.models import OneTruePairing
11
11
 
12
12
  from ob_dj_store.core.stores.managers import PartnerAuthInfoManager
13
+ from ob_dj_store.core.stores.models._store import Store
13
14
  from ob_dj_store.utils.model import DjangoModelCleanMixin
14
15
 
15
16
  logger = logging.getLogger(__name__)
@@ -26,20 +27,25 @@ class Discount(models.Model):
26
27
  updated_at = models.DateTimeField(auto_now=True)
27
28
 
28
29
  def __str__(self) -> str:
29
- return f"Discount(PK={self.pk})"
30
+ return f"{self.discount_rate * 100}% Discount"
30
31
 
31
32
  def perc_to_flat(self, amount):
32
33
  return amount * self.discount_rate
33
34
 
34
35
 
36
+ def default_offer_end_time():
37
+ return now() + timedelta(days=getattr(settings, "DEFAULT_PARTNER_OFFER_TIME", 60))
38
+
39
+
35
40
  class Partner(DjangoModelCleanMixin, models.Model):
36
41
  class AuthMethods(models.TextChoices):
37
42
  OTP = "OTP", _("One True Pairing")
38
43
  CODE = "CODE", _("Promotion code")
39
44
 
40
45
  name = models.CharField(_("Partner's Name"), max_length=255)
46
+ stores = models.ManyToManyField(Store, related_name="partners")
41
47
  promotion_code = models.PositiveBigIntegerField(
42
- _("Promotion code"), null=True, blank=True
48
+ _("Promotion code"), null=True, blank=True, unique=True
43
49
  )
44
50
  auth_method = models.CharField(
45
51
  _("Authentication method"), max_length=255, choices=AuthMethods.choices
@@ -48,6 +54,10 @@ class Partner(DjangoModelCleanMixin, models.Model):
48
54
  discount = models.ForeignKey(
49
55
  Discount, on_delete=models.PROTECT, related_name="partners"
50
56
  )
57
+ offer_start_time = models.DateTimeField(_("Offer start date"), default=now)
58
+ offer_end_time = models.DateTimeField(
59
+ _("Offer end date"), default=default_offer_end_time
60
+ )
51
61
 
52
62
  # Audit fields
53
63
  created_at = models.DateTimeField(auto_now_add=True)
@@ -61,7 +71,7 @@ class PartnerEmailDomain(DjangoModelCleanMixin, models.Model):
61
71
  partner = models.ForeignKey(
62
72
  Partner, on_delete=models.CASCADE, related_name="domains"
63
73
  )
64
- email_domain = models.CharField(max_length=255)
74
+ email_domain = models.CharField(max_length=255, unique=True)
65
75
 
66
76
  # Audit fields
67
77
  created_at = models.DateTimeField(auto_now_add=True)
@@ -161,6 +161,7 @@ class WalletTransaction(models.Model):
161
161
  decimal_places=settings.DEFAULT_DECIMAL_PLACES,
162
162
  )
163
163
 
164
+ is_by_admin = models.BooleanField(default=False)
164
165
  is_cashback = models.BooleanField(default=False)
165
166
  is_refund = models.BooleanField(default=False)
166
167
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-dj-store
3
- Version: 0.0.16
3
+ Version: 0.0.16.1
4
4
  Summary: OBytes django application for managing ecommerce stores.
5
5
  Home-page: https://www.obytes.com/
6
6
  Author: OBytes
@@ -3,17 +3,17 @@ ob_dj_store/apis/stores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
3
3
  ob_dj_store/apis/stores/filters.py,sha256=cWEIriaBil5iJlnTgFPMYJtyaHNcI3x3EoQ5X12lkCI,8927
4
4
  ob_dj_store/apis/stores/urls.py,sha256=xL7CUNJDqxWzb8Gt7gYH63rmQ00rfGoTr9duiu9-0v8,1778
5
5
  ob_dj_store/apis/stores/views.py,sha256=llLsupgQ-Rq9KqeE0ajNq7Lpj7bIDkvPN7cbhsd3Nn4,40134
6
- ob_dj_store/apis/stores/rest/serializers/serializers.py,sha256=hy__CfFQfVngFey8HNhL5tsZISru9jiO3tbF_wM7ASU,55454
6
+ ob_dj_store/apis/stores/rest/serializers/serializers.py,sha256=5nlrfs9l0rfb1Ai7rKcWrfpKAbiGF_xI3R8Bk2MB-Go,55919
7
7
  ob_dj_store/apis/tap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  ob_dj_store/apis/tap/serializers.py,sha256=KPrBK4h2-fWvEVf6vOj2ww5-USV9WqpyYicIqoHIiXI,1065
9
9
  ob_dj_store/apis/tap/urls.py,sha256=bnOTv6an11kxpo_FdqlhsizlGPLVpNxBjCyKcf3_C9M,367
10
10
  ob_dj_store/apis/tap/views.py,sha256=VnVquybTHlJquxsC0RNTy20dtLXalchO0SlGjSDaBng,2666
11
11
  ob_dj_store/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  ob_dj_store/core/stores/__init__.py,sha256=-izNGrxNn_nn3IQXd5pkuES9lSF-AHYb14yhNPozYCI,65
13
- ob_dj_store/core/stores/admin.py,sha256=jMYG6vQ2BZJFT_4uqPoAwAJDAonbPLurz8mbsPpF3gA,10522
14
- ob_dj_store/core/stores/admin_inlines.py,sha256=K7T5IqTqkCKzt_8vqAg3OqOuREqih_lujf1ULB1YFS8,2791
13
+ ob_dj_store/core/stores/admin.py,sha256=klnZPKa5BR0yBqTKAYlJJys5RqpG9V4bLEXNI34h8mI,11680
14
+ ob_dj_store/core/stores/admin_inlines.py,sha256=NM8Ab7htloQdihRBmew4Ie-ENsKhMlKRIsIH06xO1Mw,2903
15
15
  ob_dj_store/core/stores/apps.py,sha256=ZadmEER_dNcQTH617b3fAsYZJSyRw0g46Kjp4eOAsOU,498
16
- ob_dj_store/core/stores/managers.py,sha256=V7BIh0vNOUp6s67t5Trm5KQpTf75iqAo-JMGMpRcHQg,8833
16
+ ob_dj_store/core/stores/managers.py,sha256=DeO8wlN7YvbVZvKZWt5Z4aDgcip54vCioCZH-IRQhuY,9548
17
17
  ob_dj_store/core/stores/receivers.py,sha256=DljYC97C_e1mHduKw9Un6YQmxIdwSIter7yVVZwggFA,3768
18
18
  ob_dj_store/core/stores/settings_validation.py,sha256=eTkRaI6CG5OEJQyI5CF-cNAcvjzXf3GwX5sR97O3v98,3977
19
19
  ob_dj_store/core/stores/utils.py,sha256=70cE4mf64KiEdh5yYhUfLIqykH2MbnN9xlvNgEx5Mk0,2775
@@ -122,24 +122,26 @@ ob_dj_store/core/stores/migrations/0087_auto_20230828_2138.py,sha256=ESHEN8RnSQh
122
122
  ob_dj_store/core/stores/migrations/0088_alter_paymentmethod_payment_provider.py,sha256=SuZ2YFSPaZB2O54jP7U31NH2JD5tKmyR0kalLIuAvQ8,932
123
123
  ob_dj_store/core/stores/migrations/0089_discount_partner_partnerauthinfo_partneremaildomain_partnerotpauth.py,sha256=c8IbAcCLkxw0ttI0UQxWkY0ZyBOD_AUDRn6dSXNshLA,7374
124
124
  ob_dj_store/core/stores/migrations/0090_auto_20231006_1356.py,sha256=wJGLZDhri35X_Tr72gYrzZP6EEuz3qiKRN9BDsmLfCU,871
125
+ ob_dj_store/core/stores/migrations/0091_auto_20231010_1740.py,sha256=qUjN-qPM3k19dLpG42tEPePacFTTWvussGtsgetBNEU,862
126
+ ob_dj_store/core/stores/migrations/0092_auto_20231012_1339.py,sha256=KzINBlngxNmU-dQjV5VgZssVL6jihxY7jbMfpfDN5K4,1367
125
127
  ob_dj_store/core/stores/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
128
  ob_dj_store/core/stores/models/__init__.py,sha256=vG1vVOXne3Gg938-015MGrXQAaxqVLYF0Amd85oKrhY,1991
127
129
  ob_dj_store/core/stores/models/_address.py,sha256=qS5TQ9Z12zx_4CrrHvG8PoYVkdiOq_MtbKR14WKh3Hw,1661
128
- ob_dj_store/core/stores/models/_cart.py,sha256=SmlOczSZ2UnEIFcCR107-pcCMlkOL0oWb22h6--x_1k,4779
130
+ ob_dj_store/core/stores/models/_cart.py,sha256=9JYfu-T0_AZiZEY8vaHJ719L4zqVOgvMXj3sj-dixtE,5856
129
131
  ob_dj_store/core/stores/models/_favorite.py,sha256=ZVFCsDWB8fOcx5LkhNphTNRGuEUdsHM0ex1-OtFa4gA,3232
130
132
  ob_dj_store/core/stores/models/_feedback.py,sha256=eCUVgprNK5hSRKOS4M_pdR7QH2-rqhoYevlpykhCOLg,1472
131
133
  ob_dj_store/core/stores/models/_inventory.py,sha256=ZU8xDMQZxLnFehkBEGWr-os4AF1IlCn5XnBxvRq9IAs,4314
132
- ob_dj_store/core/stores/models/_order.py,sha256=VHBp3LMveedHNbS7vxP7PE_H_g9t8qgsi7_szQIlBB8,8650
133
- ob_dj_store/core/stores/models/_partner.py,sha256=o7bfENfXbfZAYnomy3d9aoF_PdUF-MLZvNJUM-wUI9k,3585
134
+ ob_dj_store/core/stores/models/_order.py,sha256=am-tpHs0b4mu5xdj5xaK3LQjhGs88aKNyhLFX8g8XA4,9139
135
+ ob_dj_store/core/stores/models/_partner.py,sha256=N4nc7FUWBkkkBar6__nJ2Jg1SxOBnt1YCnsLaKpa_vk,4057
134
136
  ob_dj_store/core/stores/models/_payment.py,sha256=mz54fuxmcNQ1pVBC959f7gnbIld1haxIYK0Xuv6UVoM,6320
135
137
  ob_dj_store/core/stores/models/_product.py,sha256=jWbhk-oXngLdHqBTnHNokzN_MhcBArsD1R7UjOnfAzY,15287
136
138
  ob_dj_store/core/stores/models/_store.py,sha256=NnyXG7_L_UYrNKaQYuHOBEWc6DQqAPd1OZJg0xOccKk,8005
137
- ob_dj_store/core/stores/models/_wallet.py,sha256=8wi-H0HMFOdDPc1LbKkQBMGAymiLvBWq2djnN_BicRI,5327
139
+ ob_dj_store/core/stores/models/_wallet.py,sha256=0Ap6CYGFC0IJ9nfgPU1ypDq3r9HQjI5L9J8vz6FE7Es,5380
138
140
  ob_dj_store/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
141
  ob_dj_store/utils/helpers.py,sha256=o7wgypM7mI2vZqZKkhxnTcnHJC8GMQDOuYMnRwXr6tY,2058
140
142
  ob_dj_store/utils/model.py,sha256=DV7hOhTaZL3gh9sptts2jTUFlTArKG3i7oPioq9HLFE,303
141
143
  ob_dj_store/utils/utils.py,sha256=8UVAFB56qUSjJJ5f9vnermtw638gdFy4CFRCuMbns_M,1342
142
- ob_dj_store-0.0.16.dist-info/METADATA,sha256=R5bVFGUS9kNIbUaep5V_QAp-MkF0qBgKvRCmYlmkF_0,2825
143
- ob_dj_store-0.0.16.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
144
- ob_dj_store-0.0.16.dist-info/top_level.txt,sha256=CZG3G0ptTkzGnc0dFYN-ZD7YKdJBmm47bsmGwofD_lk,12
145
- ob_dj_store-0.0.16.dist-info/RECORD,,
144
+ ob_dj_store-0.0.16.1.dist-info/METADATA,sha256=0NDzIbqnGaB5C25MeBZobX2rD72RhbgXpI_UGy6y3OI,2827
145
+ ob_dj_store-0.0.16.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
146
+ ob_dj_store-0.0.16.1.dist-info/top_level.txt,sha256=CZG3G0ptTkzGnc0dFYN-ZD7YKdJBmm47bsmGwofD_lk,12
147
+ ob_dj_store-0.0.16.1.dist-info/RECORD,,