ob-dj-store 0.0.20.2__py3-none-any.whl → 0.0.20.4__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.
Files changed (60) hide show
  1. ob_dj_store/apis/stores/filters.py +5 -19
  2. ob_dj_store/apis/stores/rest/serializers/serializers.py +20 -34
  3. ob_dj_store/apis/stores/views.py +74 -226
  4. ob_dj_store/apis/tap/views.py +2 -6
  5. ob_dj_store/core/stores/admin.py +3 -21
  6. ob_dj_store/core/stores/admin_inlines.py +2 -7
  7. ob_dj_store/core/stores/gateway/tap/admin.py +1 -3
  8. ob_dj_store/core/stores/gateway/tap/managers.py +1 -6
  9. ob_dj_store/core/stores/gateway/tap/migrations/0001_initial.py +1 -3
  10. ob_dj_store/core/stores/gateway/tap/models.py +3 -12
  11. ob_dj_store/core/stores/gateway/tap/utils.py +2 -7
  12. ob_dj_store/core/stores/managers.py +1 -3
  13. ob_dj_store/core/stores/migrations/0001_initial.py +1 -4
  14. ob_dj_store/core/stores/migrations/0005_auto_20220425_2119.py +2 -5
  15. ob_dj_store/core/stores/migrations/0005_auto_20220427_1729.py +1 -2
  16. ob_dj_store/core/stores/migrations/0006_auto_20220428_0100.py +2 -8
  17. ob_dj_store/core/stores/migrations/0007_cart_cartitem_order_orderitem.py +2 -8
  18. ob_dj_store/core/stores/migrations/0010_auto_20220509_1633.py +1 -4
  19. ob_dj_store/core/stores/migrations/0012_auto_20220514_0633.py +1 -4
  20. ob_dj_store/core/stores/migrations/0013_auto_20220518_1539.py +1 -4
  21. ob_dj_store/core/stores/migrations/0014_auto_20220519_0018.py +3 -12
  22. ob_dj_store/core/stores/migrations/0017_auto_20220524_0912.py +3 -10
  23. ob_dj_store/core/stores/migrations/0018_auto_20220524_1613.py +1 -3
  24. ob_dj_store/core/stores/migrations/0021_auto_20220531_1849.py +1 -4
  25. ob_dj_store/core/stores/migrations/0026_auto_20220630_1913.py +8 -32
  26. ob_dj_store/core/stores/migrations/0031_auto_20220811_1733.py +1 -4
  27. ob_dj_store/core/stores/migrations/0033_auto_20220815_0133.py +2 -8
  28. ob_dj_store/core/stores/migrations/0039_auto_20220831_1521.py +1 -4
  29. ob_dj_store/core/stores/migrations/0044_remove_productvariant_has_inventory.py +1 -4
  30. ob_dj_store/core/stores/migrations/0049_auto_20221029_1524.py +2 -8
  31. ob_dj_store/core/stores/migrations/0050_favoriteextra.py +1 -3
  32. ob_dj_store/core/stores/migrations/0052_auto_20221129_1732.py +2 -8
  33. ob_dj_store/core/stores/migrations/0059_auto_20230217_2006.py +2 -8
  34. ob_dj_store/core/stores/migrations/0062_auto_20230226_2005.py +2 -6
  35. ob_dj_store/core/stores/migrations/0064_auto_20230228_1814.py +1 -2
  36. ob_dj_store/core/stores/migrations/0066_auto_20230304_1532.py +2 -8
  37. ob_dj_store/core/stores/migrations/0070_auto_20230323_1628.py +1 -4
  38. ob_dj_store/core/stores/migrations/0071_auto_20230328_1825.py +2 -5
  39. ob_dj_store/core/stores/migrations/0082_auto_20230613_1424.py +1 -4
  40. ob_dj_store/core/stores/migrations/0084_payment_result.py +1 -3
  41. ob_dj_store/core/stores/migrations/0087_auto_20230828_2138.py +1 -4
  42. ob_dj_store/core/stores/migrations/0097_auto_20231108_1939.py +1 -4
  43. ob_dj_store/core/stores/migrations/0100_remove_shippingmethod_type_arabic.py +1 -4
  44. ob_dj_store/core/stores/migrations/0106_alter_paymentmethod_payment_provider.py +35 -0
  45. ob_dj_store/core/stores/migrations/0107_auto_20250425_2059.py +29 -0
  46. ob_dj_store/core/stores/models/_address.py +1 -3
  47. ob_dj_store/core/stores/models/_cart.py +1 -3
  48. ob_dj_store/core/stores/models/_feedback.py +1 -3
  49. ob_dj_store/core/stores/models/_inventory.py +1 -2
  50. ob_dj_store/core/stores/models/_order.py +7 -20
  51. ob_dj_store/core/stores/models/_payment.py +3 -12
  52. ob_dj_store/core/stores/models/_product.py +5 -17
  53. ob_dj_store/core/stores/models/_store.py +5 -13
  54. ob_dj_store/core/stores/models/_wallet.py +7 -23
  55. ob_dj_store/core/stores/receivers.py +7 -20
  56. ob_dj_store/core/stores/utils.py +1 -2
  57. {ob_dj_store-0.0.20.2.dist-info → ob_dj_store-0.0.20.4.dist-info}/METADATA +3 -2
  58. {ob_dj_store-0.0.20.2.dist-info → ob_dj_store-0.0.20.4.dist-info}/RECORD +60 -58
  59. {ob_dj_store-0.0.20.2.dist-info → ob_dj_store-0.0.20.4.dist-info}/WHEEL +1 -1
  60. {ob_dj_store-0.0.20.2.dist-info → ob_dj_store-0.0.20.4.dist-info}/top_level.txt +0 -0
@@ -10,10 +10,7 @@ class Migration(migrations.Migration):
10
10
  ]
11
11
 
12
12
  operations = [
13
- migrations.RemoveField(
14
- model_name="store",
15
- name="always_open",
16
- ),
13
+ migrations.RemoveField(model_name="store", name="always_open",),
17
14
  migrations.AddField(
18
15
  model_name="openinghours",
19
16
  name="always_open",
@@ -11,8 +11,6 @@ class Migration(migrations.Migration):
11
11
 
12
12
  operations = [
13
13
  migrations.AddField(
14
- model_name="payment",
15
- name="result",
16
- field=models.TextField(null=True),
14
+ model_name="payment", name="result", field=models.TextField(null=True),
17
15
  ),
18
16
  ]
@@ -13,10 +13,7 @@ class Migration(migrations.Migration):
13
13
  ]
14
14
 
15
15
  operations = [
16
- migrations.RemoveField(
17
- model_name="product",
18
- name="category",
19
- ),
16
+ migrations.RemoveField(model_name="product", name="category",),
20
17
  migrations.AddField(
21
18
  model_name="product",
22
19
  name="category",
@@ -26,10 +26,7 @@ class Migration(migrations.Migration):
26
26
  "verbose_name_plural": "Store Attribute Choices",
27
27
  },
28
28
  ),
29
- migrations.RemoveField(
30
- model_name="attributechoice",
31
- name="price",
32
- ),
29
+ migrations.RemoveField(model_name="attributechoice", name="price",),
33
30
  migrations.AddField(
34
31
  model_name="storeattributechoice",
35
32
  name="price",
@@ -10,8 +10,5 @@ class Migration(migrations.Migration):
10
10
  ]
11
11
 
12
12
  operations = [
13
- migrations.RemoveField(
14
- model_name="shippingmethod",
15
- name="type_arabic",
16
- ),
13
+ migrations.RemoveField(model_name="shippingmethod", name="type_arabic",),
17
14
  ]
@@ -0,0 +1,35 @@
1
+ # Generated by Django 3.2.8 on 2024-12-22 19:07
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("stores", "0105_store_is_open_after_midnight"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="paymentmethod",
15
+ name="payment_provider",
16
+ field=models.CharField(
17
+ choices=[
18
+ ("cod", "cash on delivery"),
19
+ ("src_all", "TAP all payment methods"),
20
+ ("src_card", "Tap Credit Card"),
21
+ ("src_kw.knet", "Tap knet"),
22
+ ("paypal", "Paypal"),
23
+ ("stripe", "Stripe"),
24
+ ("wallet", "Wallet"),
25
+ ("gift", "Gift"),
26
+ ("src_apple_pay", "Apple Pay"),
27
+ ("google_pay", "Google Pay"),
28
+ ("src_sa.mada", "Mada"),
29
+ ("src_bh.benefit", "Benefit"),
30
+ ],
31
+ default="cod",
32
+ max_length=20,
33
+ ),
34
+ ),
35
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 3.2.8 on 2025-04-25 17:59
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("stores", "0106_alter_paymentmethod_payment_provider"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(model_name="store", name="is_open_after_midnight",),
14
+ migrations.AddField(
15
+ model_name="openinghours",
16
+ name="is_open_after_midnight",
17
+ field=models.BooleanField(default=False),
18
+ ),
19
+ migrations.AddField(
20
+ model_name="order",
21
+ name="offer_id",
22
+ field=models.IntegerField(blank=True, default=None, null=True),
23
+ ),
24
+ migrations.AddField(
25
+ model_name="order",
26
+ name="offer_redeemed",
27
+ field=models.BooleanField(default=False),
28
+ ),
29
+ ]
@@ -10,9 +10,7 @@ class BaseAddress(models.Model):
10
10
  Base class for all address models.
11
11
  """
12
12
 
13
- address_line = models.CharField(
14
- max_length=250,
15
- )
13
+ address_line = models.CharField(max_length=250,)
16
14
  address_line_arabic = models.CharField(max_length=250, blank=True, null=True)
17
15
  postal_code = models.CharField(
18
16
  max_length=64, help_text=_("The address postal/zip code.")
@@ -63,9 +63,7 @@ class Cart(models.Model):
63
63
  return self.total_price + self.get_applied_tax_amount()
64
64
 
65
65
  @property
66
- def full_price(
67
- self,
68
- ) -> Decimal:
66
+ def full_price(self,) -> Decimal:
69
67
  return self.total_price_with_tax - self.discount_offer_amount
70
68
 
71
69
  @property
@@ -22,9 +22,7 @@ class Feedback(models.Model):
22
22
  get_user_model(), related_name="feedbacks", on_delete=models.CASCADE
23
23
  )
24
24
  order = models.ForeignKey(
25
- "stores.Order",
26
- related_name="feedbacks",
27
- on_delete=models.CASCADE,
25
+ "stores.Order", related_name="feedbacks", on_delete=models.CASCADE,
28
26
  )
29
27
  review = models.CharField(
30
28
  max_length=100, choices=Reviews.choices, default="NOT_AVAILABLE"
@@ -37,8 +37,7 @@ class Inventory(DjangoModelCleanMixin, models.Model):
37
37
  # Add is_primary for variant
38
38
  is_primary = models.BooleanField(default=True)
39
39
  preparation_time = models.DurationField(
40
- default=timedelta(minutes=0),
41
- help_text=_("Preparation time in minutes"),
40
+ default=timedelta(minutes=0), help_text=_("Preparation time in minutes"),
42
41
  )
43
42
  created_at = models.DateTimeField(auto_now_add=True)
44
43
  updated_at = models.DateTimeField(auto_now=True)
@@ -41,10 +41,7 @@ class Order(DjangoModelCleanMixin, models.Model):
41
41
  "stores.Discount", on_delete=models.PROTECT, null=True, blank=True
42
42
  )
43
43
  customer = models.ForeignKey(
44
- get_user_model(),
45
- related_name="orders",
46
- on_delete=models.SET_NULL,
47
- null=True,
44
+ get_user_model(), related_name="orders", on_delete=models.SET_NULL, null=True,
48
45
  )
49
46
  store = models.ForeignKey(
50
47
  "stores.Store",
@@ -82,9 +79,7 @@ class Order(DjangoModelCleanMixin, models.Model):
82
79
  blank=True,
83
80
  )
84
81
  status = models.CharField(
85
- max_length=32,
86
- default=OrderStatus.PENDING,
87
- choices=OrderStatus.choices,
82
+ max_length=32, default=OrderStatus.PENDING, choices=OrderStatus.choices,
88
83
  )
89
84
  # Add pickup time for an order, Pick up can be now or a later hour during the day
90
85
  pickup_time = models.DateTimeField(
@@ -93,12 +88,10 @@ class Order(DjangoModelCleanMixin, models.Model):
93
88
  # Order id of the pickup_car
94
89
  car_id = models.PositiveIntegerField(null=True, blank=True)
95
90
  # Pick up can be now or a later hour during the day. If pickup_time is not set,
96
- extra_infos = models.JSONField(
97
- null=True,
98
- blank=True,
99
- )
91
+ extra_infos = models.JSONField(null=True, blank=True,)
100
92
  init_data = models.JSONField(null=True, blank=True)
101
-
93
+ offer_redeemed = models.BooleanField(default=False)
94
+ offer_id = models.IntegerField(null=True, blank=True, default=None)
102
95
  # TODO: add pick_up_time maybe ?
103
96
  # audit fields
104
97
  created_at = models.DateTimeField(auto_now_add=True)
@@ -195,10 +188,7 @@ class OrderItem(DjangoModelCleanMixin, models.Model):
195
188
  total_price = models.DecimalField(max_digits=10, decimal_places=3, default=0)
196
189
  quantity = models.PositiveIntegerField(
197
190
  validators=[
198
- MinValueValidator(
199
- 1,
200
- message="Can you please provide a valid quantity !",
201
- )
191
+ MinValueValidator(1, message="Can you please provide a valid quantity !",)
202
192
  ],
203
193
  help_text=_("quantity of the variant"),
204
194
  )
@@ -277,10 +267,7 @@ class OrderHistory(DjangoModelCleanMixin, models.Model):
277
267
  """
278
268
 
279
269
  order = models.ForeignKey(Order, related_name="history", on_delete=models.CASCADE)
280
- status = models.CharField(
281
- max_length=32,
282
- choices=Order.OrderStatus.choices,
283
- )
270
+ status = models.CharField(max_length=32, choices=Order.OrderStatus.choices,)
284
271
  created_at = models.DateTimeField(auto_now_add=True)
285
272
 
286
273
  class Meta:
@@ -75,21 +75,12 @@ class Payment(models.Model):
75
75
  related_name="user_payments",
76
76
  )
77
77
  status = models.CharField(
78
- max_length=100,
79
- default=PaymentStatus.INIT,
80
- choices=PaymentStatus.choices,
78
+ max_length=100, default=PaymentStatus.INIT, choices=PaymentStatus.choices,
81
79
  )
82
80
  method = models.ForeignKey(
83
- "stores.PaymentMethod",
84
- on_delete=models.CASCADE,
85
- null=True,
86
- blank=True,
87
- )
88
- payment_tax = models.ForeignKey(
89
- Tax,
90
- on_delete=models.SET_NULL,
91
- null=True,
81
+ "stores.PaymentMethod", on_delete=models.CASCADE, null=True, blank=True,
92
82
  )
83
+ payment_tax = models.ForeignKey(Tax, on_delete=models.SET_NULL, null=True,)
93
84
  orders = models.ManyToManyField("stores.Order", related_name="payments")
94
85
  amount = models.DecimalField(
95
86
  max_digits=settings.DEFAULT_MAX_DIGITS,
@@ -141,7 +141,7 @@ class AvailabilityHours(DjangoModelCleanMixin, models.Model):
141
141
  def clean(self) -> None:
142
142
  super().clean()
143
143
  try:
144
- if self.store.is_open_after_midnight:
144
+ if self.store.current_opening_hours.is_open_after_midnight:
145
145
  return
146
146
  except Exception as e:
147
147
  logger.info(f"OpeningHours has no store: {e}")
@@ -204,10 +204,7 @@ class Product(DjangoModelCleanMixin, models.Model):
204
204
 
205
205
  name = models.CharField(max_length=200, help_text=_("Name"), unique=True)
206
206
  name_arabic = models.CharField(
207
- max_length=200,
208
- null=True,
209
- blank=True,
210
- help_text=_("Name in arabic"),
207
+ max_length=200, null=True, blank=True, help_text=_("Name in arabic"),
211
208
  )
212
209
  slug = models.SlugField(max_length=255, unique=True)
213
210
  label = models.CharField(
@@ -219,18 +216,11 @@ class Product(DjangoModelCleanMixin, models.Model):
219
216
  description = models.TextField(null=True, blank=True)
220
217
  description_arabic = models.TextField(null=True, blank=True)
221
218
  # TODO: A product can be assigned to multiple categories
222
- category = models.ManyToManyField(
223
- Category,
224
- related_name="products",
225
- blank=True,
226
- )
219
+ category = models.ManyToManyField(Category, related_name="products", blank=True,)
227
220
  is_active = models.BooleanField(default=False)
228
221
  is_featured = models.BooleanField(default=False)
229
222
  tags = models.ManyToManyField(ProductTag, related_name="products", blank=True)
230
- type = models.CharField(
231
- max_length=32,
232
- choices=ProductTypes.choices,
233
- )
223
+ type = models.CharField(max_length=32, choices=ProductTypes.choices,)
234
224
  plu = models.CharField(max_length=40, unique=True, null=True, blank=True)
235
225
  external_id = models.CharField(max_length=40, unique=True, null=True, blank=True)
236
226
  order_value = models.PositiveSmallIntegerField(
@@ -377,9 +367,7 @@ class ProductAttribute(DjangoModelCleanMixin, models.Model):
377
367
  AttributeChoice, related_name="product_attributes", blank=True
378
368
  )
379
369
  type = models.CharField(
380
- max_length=32,
381
- default=Type.ONE_CHOICE,
382
- choices=Type.choices,
370
+ max_length=32, default=Type.ONE_CHOICE, choices=Type.choices,
383
371
  )
384
372
  order_value = models.PositiveSmallIntegerField(
385
373
  verbose_name=_("ordering"), default=1
@@ -85,9 +85,7 @@ class PaymentMethod(models.Model):
85
85
  """
86
86
 
87
87
  payment_provider = models.CharField(
88
- max_length=20,
89
- choices=settings.PAYMENT_PROVIDER_CHOICES,
90
- default="cod",
88
+ max_length=20, choices=settings.PAYMENT_PROVIDER_CHOICES, default="cod",
91
89
  )
92
90
  is_active = models.BooleanField(default=True)
93
91
  name = models.CharField(max_length=200, help_text=_("Name"))
@@ -149,9 +147,7 @@ class Store(DjangoModelCleanMixin, models.Model):
149
147
  help_text=_("Shipping methods within the store"),
150
148
  )
151
149
  pickup_addresses = models.ManyToManyField(
152
- "stores.address",
153
- related_name="pickup_stores",
154
- blank=True,
150
+ "stores.address", related_name="pickup_stores", blank=True,
155
151
  )
156
152
  payment_methods = models.ManyToManyField(
157
153
  PaymentMethod,
@@ -179,15 +175,10 @@ class Store(DjangoModelCleanMixin, models.Model):
179
175
  )
180
176
  image = models.ImageField(upload_to=store_media_upload_to, null=True, blank=True)
181
177
  currency = models.CharField(
182
- max_length=3,
183
- default="KWD",
184
- validators=[
185
- validate_currency,
186
- ],
178
+ max_length=3, default="KWD", validators=[validate_currency,],
187
179
  )
188
180
  busy_mode = models.BooleanField(default=False)
189
181
  is_digital = models.BooleanField(default=False)
190
- is_open_after_midnight = models.BooleanField(default=False)
191
182
  created_at = models.DateTimeField(auto_now_add=True)
192
183
  updated_at = models.DateTimeField(auto_now=True)
193
184
 
@@ -246,6 +237,7 @@ class OpeningHours(DjangoModelCleanMixin, models.Model):
246
237
  created_at = models.DateTimeField(auto_now_add=True)
247
238
  updated_at = models.DateTimeField(auto_now=True)
248
239
  always_open = models.BooleanField(default=False)
240
+ is_open_after_midnight = models.BooleanField(default=False)
249
241
 
250
242
  class Meta:
251
243
  ordering = ("weekday", "from_hour")
@@ -260,7 +252,7 @@ class OpeningHours(DjangoModelCleanMixin, models.Model):
260
252
  def clean(self) -> None:
261
253
  super().clean()
262
254
  try:
263
- if self.store.is_open_after_midnight:
255
+ if self.store:
264
256
  return
265
257
  except Exception as e:
266
258
  logger.info(f"OpeningHours has no store: {e}")
@@ -47,9 +47,7 @@ class WalletMedia(DjangoModelCleanMixin, models.Model):
47
47
 
48
48
  class Wallet(models.Model):
49
49
  user = models.ForeignKey(
50
- settings.AUTH_USER_MODEL,
51
- on_delete=models.CASCADE,
52
- related_name="wallets",
50
+ settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="wallets",
53
51
  )
54
52
  name = models.CharField(max_length=200, null=True, blank=True)
55
53
  name_arabic = models.CharField(max_length=200, null=True, blank=True)
@@ -61,11 +59,7 @@ class Wallet(models.Model):
61
59
  related_name="wallets",
62
60
  )
63
61
  currency = models.CharField(
64
- max_length=3,
65
- default="KWD",
66
- validators=[
67
- validate_currency,
68
- ],
62
+ max_length=3, default="KWD", validators=[validate_currency,],
69
63
  )
70
64
  is_active = models.BooleanField(default=True)
71
65
 
@@ -82,8 +76,7 @@ class Wallet(models.Model):
82
76
  query = self.transactions.aggregate(
83
77
  balance=Coalesce(
84
78
  models.Sum(
85
- "amount",
86
- filter=models.Q(type=WalletTransaction.TYPE.CREDIT),
79
+ "amount", filter=models.Q(type=WalletTransaction.TYPE.CREDIT),
87
80
  ),
88
81
  models.Value(Decimal(0)),
89
82
  output_field=models.DecimalField(),
@@ -118,14 +111,10 @@ class Wallet(models.Model):
118
111
  )
119
112
  user = self.user
120
113
  order = Order.objects.create(
121
- customer=user,
122
- payment_method=payment_method,
123
- extra_infos=extra_infos,
114
+ customer=user, payment_method=payment_method, extra_infos=extra_infos,
124
115
  )
125
116
  payment = Payment.objects.create(
126
- orders=[
127
- order,
128
- ],
117
+ orders=[order,],
129
118
  user=user,
130
119
  currency=self.currency,
131
120
  method=payment_method,
@@ -148,14 +137,9 @@ class WalletTransaction(models.Model):
148
137
  DEBIT = "DEBIT", _("debit")
149
138
 
150
139
  wallet = models.ForeignKey(
151
- "stores.Wallet",
152
- on_delete=models.CASCADE,
153
- related_name="transactions",
154
- )
155
- type = models.CharField(
156
- max_length=100,
157
- choices=TYPE.choices,
140
+ "stores.Wallet", on_delete=models.CASCADE, related_name="transactions",
158
141
  )
142
+ type = models.CharField(max_length=100, choices=TYPE.choices,)
159
143
 
160
144
  amount = models.DecimalField(
161
145
  max_digits=settings.DEFAULT_MAX_DIGITS,
@@ -34,24 +34,19 @@ def create_customer_cart_and_wallet_handler(sender, instance, created, **kwargs)
34
34
 
35
35
 
36
36
  @receiver(
37
- post_save,
38
- sender=Order,
39
- dispatch_uid="create_order_history_handler",
37
+ post_save, sender=Order, dispatch_uid="create_order_history_handler",
40
38
  )
41
39
  def create_order_history_handler(sender, instance, created, **kwargs):
42
40
  try:
43
41
  OrderHistory.objects.create(
44
- order=instance,
45
- status=instance.status,
42
+ order=instance, status=instance.status,
46
43
  )
47
44
  except Exception:
48
45
  pass
49
46
 
50
47
 
51
48
  @receiver(
52
- pre_save,
53
- sender=Category,
54
- dispatch_uid="create_category_thumbnails",
49
+ pre_save, sender=Category, dispatch_uid="create_category_thumbnails",
55
50
  )
56
51
  def create_category_thumbnails(sender, instance, **kwargs):
57
52
  medium_dim = getattr(store_settings, "THUMBNAIL_MEDIUM_DIMENSIONS", None)
@@ -74,9 +69,7 @@ def create_category_thumbnails(sender, instance, **kwargs):
74
69
 
75
70
 
76
71
  @receiver(
77
- pre_save,
78
- sender=ProductMedia,
79
- dispatch_uid="create_product_media_thumbnails",
72
+ pre_save, sender=ProductMedia, dispatch_uid="create_product_media_thumbnails",
80
73
  )
81
74
  def create_product_media_thumbnails(sender, instance, **kwargs):
82
75
  medium_dim = getattr(store_settings, "THUMBNAIL_MEDIUM_DIMENSIONS", None)
@@ -99,17 +92,13 @@ def create_product_media_thumbnails(sender, instance, **kwargs):
99
92
 
100
93
 
101
94
  @receiver(
102
- pre_save,
103
- sender=WalletMedia,
104
- dispatch_uid="create_wallet_thumbnails",
95
+ pre_save, sender=WalletMedia, dispatch_uid="create_wallet_thumbnails",
105
96
  )
106
97
  def create_wallet_thumbnails(sender, instance, **kwargs):
107
98
  medium_dim = getattr(store_settings, "THUMBNAIL_MEDIUM_DIMENSIONS", None)
108
99
  if instance.image and medium_dim:
109
100
  instance.image_thumbnail_medium = resize_image(
110
- instance.image,
111
- dim=medium_dim,
112
- size_name="medium",
101
+ instance.image, dim=medium_dim, size_name="medium",
113
102
  )
114
103
 
115
104
 
@@ -122,7 +111,5 @@ def create_product_vraiant_image_thumbnails(sender, instance, **kwargs):
122
111
  medium_dim = getattr(store_settings, "THUMBNAIL_MEDIUM_DIMENSIONS", None)
123
112
  if instance.image and medium_dim:
124
113
  instance.image_thumbnail_medium = resize_image(
125
- instance.image,
126
- dim=medium_dim,
127
- size_name="medium",
114
+ instance.image, dim=medium_dim, size_name="medium",
128
115
  )
@@ -76,8 +76,7 @@ def get_country_by_currency(currency):
76
76
  def validate_currency(value):
77
77
  if not pycountry.currencies.get(alpha_3=value):
78
78
  raise ValidationError(
79
- _("%(value)s is not a currency"),
80
- params={"value": value},
79
+ _("%(value)s is not a currency"), params={"value": value},
81
80
  )
82
81
 
83
82
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: ob-dj-store
3
- Version: 0.0.20.2
3
+ Version: 0.0.20.4
4
4
  Summary: OBytes django application for managing ecommerce stores.
5
5
  Home-page: https://www.obytes.com/
6
6
  Author: OBytes
@@ -25,6 +25,7 @@ Requires-Dist: djangorestframework-gis
25
25
  Requires-Dist: django-filter
26
26
  Requires-Dist: django-leaflet
27
27
  Requires-Dist: django-countries
28
+ Dynamic: requires-dist
28
29
 
29
30
  ## OBytes Django Store App
30
31