Skip to content

Commit

Permalink
Apply Ruff fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Aug 19, 2024
1 parent 7062c72 commit 461a217
Show file tree
Hide file tree
Showing 21 changed files with 148 additions and 105 deletions.
2 changes: 1 addition & 1 deletion ecommerce/asgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ecommerce.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ecommerce.settings")

application = get_asgi_application()
2 changes: 1 addition & 1 deletion ecommerce/settings/dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,4 @@
STATIC_URL = "static/"
MEDIA_URL = "media/"
STATIC_ROOT = os.path.join("static")
MEDIA_ROOT = os.path.join("media")
MEDIA_ROOT = os.path.join("media")
3 changes: 1 addition & 2 deletions ecommerce/settings/prod.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,5 @@
"staticfiles": {
"BACKEND": "storages.backends.s3boto3.S3ManifestStaticStorage",
"LOCATION": "static",
}
},
}

6 changes: 3 additions & 3 deletions ecommerce/wsgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

#Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
# Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, ".env"))

os.environ.setdefault('DJANGO_SETTINGS_MODULE', env("WORKING_ENV"))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", env("WORKING_ENV"))

application = get_wsgi_application()
4 changes: 2 additions & 2 deletions store/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class StoreConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'store'
default_auto_field = "django.db.models.BigAutoField"
name = "store"
4 changes: 2 additions & 2 deletions store/context_processors.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
def bag_items_processor(request):
total_items = request.session.get('total_items', 0)
return {'total_items': total_items}
total_items = request.session.get("total_items", 0)
return {"total_items": total_items}
1 change: 1 addition & 0 deletions store/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class Meta:
model = Store
exclude = ["owner"]


class OrderForm(forms.ModelForm):
class Meta:
model = Order
Expand Down
18 changes: 12 additions & 6 deletions store/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ class Store(models.Model):
category = models.CharField(max_length=30)
city = models.CharField(max_length=25)
state = models.CharField(max_length=25)
image = models.ImageField(upload_to=StoreUtils.generate_store_image_path, blank=True)
image = models.ImageField(
upload_to=StoreUtils.generate_store_image_path, blank=True
)

objects = StoreManager()

Expand All @@ -39,7 +41,9 @@ def __str__(self):
class Order(models.Model):
store = models.ForeignKey(Store, on_delete=models.CASCADE)
products = models.ManyToManyField(Product, through="OrderItem")
total_cost = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(1.00)])
total_cost = models.DecimalField(
max_digits=10, decimal_places=2, validators=[MinValueValidator(1.00)]
)
paid_on = models.DateTimeField(null=True)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
Expand All @@ -59,7 +63,7 @@ def save(self, *args, **kwargs):

def __str__(self):
return f"Order #{self.id}"


class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
Expand All @@ -68,12 +72,14 @@ class OrderItem(models.Model):

def __str__(self):
return f"{self.quantity} of {self.product.name} in {self.order}"

def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)
order = self.order
total_cost = sum(order_item.quantity * order_item.product.price for order_item in order.orderitem_set.all())
total_cost = sum(
order_item.quantity * order_item.product.price
for order_item in order.orderitem_set.all()
)
order.total_cost = total_cost
order.save()

1 change: 1 addition & 0 deletions store/store_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ class StoreUtils:
"""
Misc utilities for keeping logic out of models, views, forms, etc.
"""

@staticmethod
def generate_store_image_path(instance, filename):
store_name = instance.name.replace(" ", "_").lower()
Expand Down
2 changes: 0 additions & 2 deletions store/tests/factories/order_factory.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from decimal import Decimal
import random
import factory

from store.models import Order
Expand Down
1 change: 1 addition & 0 deletions store/tests/factories/store_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
faker: Faker = Faker()
faker.add_provider(faker_commerce.Provider)


class StoreFactory(factory.django.DjangoModelFactory):
class Meta:
model = Store
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from store.tests.factories.store_factory import StoreFactory
from store.tests.factories.user_factory import UserFactory


class TestProductAdminModifyView(TestCase):
def setUp(self):
self.owner = UserFactory()
Expand All @@ -16,5 +17,7 @@ def setUp(self):
def test_customer_cannot_modify_products(self):
self.client.login(username=self.customer.username, password="")

response = self.client.get(reverse("store:product_admin_modify", kwargs={"pk": self.product.pk}))
self.assertIsInstance(response, HttpResponseForbidden)
response = self.client.get(
reverse("store:product_admin_modify", kwargs={"pk": self.product.pk})
)
self.assertIsInstance(response, HttpResponseForbidden)
2 changes: 1 addition & 1 deletion store/tests/views/product_admin/test_product_admin_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ def test_admin_loads_first_store_when_multiple_owned(self):
store = response.context["store"]
self.assertEqual(store, self.correct_store)
products = list(store.product_set.all())
self.assertEqual(products, self.products)
self.assertEqual(products, self.products)
31 changes: 21 additions & 10 deletions store/tests/views/test_add_to_bag_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,46 @@
from django.urls import reverse
from store.views import add_to_bag


class AddToBagView(TestCase):
def setUp(self):
self.client = Client()
self.factory = RequestFactory()
self.session_store = SessionStore()

def request_generator(self, product_id: int):
request: HttpRequest = self.factory.post('/add-to-bag/', {'product_id': product_id})
request: HttpRequest = self.factory.post(
"/add-to-bag/", {"product_id": product_id}
)
request.session: SessionStore = self.session_store
return request

def test_request_succeeds_when_product_quantity_is_one(self):
response = add_to_bag(self.request_generator(1))
self.assertJSONEqual(response.content, {'status': 'success', 'total_items': 1})
self.assertJSONEqual(response.content, {"status": "success", "total_items": 1})

def test_request_rejects_bad_product_id(self):
with self.assertRaises(ValueError):
add_to_bag(self.request_generator('bad id'))
add_to_bag(self.request_generator("bad id"))

def test_request_increments_product_quantity(self):
session = self.client.session
session['bag'] = [{'product_id': 1, 'quantity': 1}]
session["bag"] = [{"product_id": 1, "quantity": 1}]
session.save()

response: JsonResponse = self.client.post(reverse('store:add-to-bag'), {'product_id': 1})
response: JsonResponse = self.client.post(
reverse("store:add-to-bag"), {"product_id": 1}
)
self.assertEqual(response.status_code, 200)

bag: list = self.client.session['bag'] # Fetch the updated session data
product_in_bag: dict = next((item for item in bag if item['product_id'] == 1), None)

self.assertIsNotNone(product_in_bag, 'The product should exist in the bag')
self.assertEqual(product_in_bag['quantity'], 2, "The quantity for this product should've been incremented.")
bag: list = self.client.session["bag"] # Fetch the updated session data
product_in_bag: dict = next(
(item for item in bag if item["product_id"] == 1), None
)

self.assertIsNotNone(product_in_bag, "The product should exist in the bag")
self.assertEqual(
product_in_bag["quantity"],
2,
"The quantity for this product should've been incremented.",
)
1 change: 0 additions & 1 deletion store/tests/views/test_checkout_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from django.urls import reverse
from faker import Faker

from store.models import Order
from store.tests.factories.order_item_factory import OrderItemFactory
from store.tests.factories.product_factory import ProductFactory
from store.tests.factories.store_factory import StoreFactory
Expand Down
11 changes: 5 additions & 6 deletions store/tests/views/test_create_store_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@


class CreateStoreViewTest(TestCase):

def setUp(self):
self.owner = UserFactory()

Expand All @@ -24,10 +23,10 @@ def setUp(self):
"city": faker.city(),
"state": faker.state(),
"image": SimpleUploadedFile(
name="test_image.jpeg",
content=open("media/tests/test_file.png", "rb").read(),
content_type="image/jpeg",
)
name="test_image.jpeg",
content=open("media/tests/test_file.png", "rb").read(),
content_type="image/jpeg",
),
}

self.response = self.client.post(reverse("store:create_store"), data=self.data)
Expand All @@ -36,7 +35,7 @@ def test_create_store_success(self):
self.assertEqual(self.response.status_code, 302)
store = Store.objects.for_user_admin(self.owner)
self.assertTrue(store)

def test_redirected_when_not_logged_in(self):
self.client.logout()
response = self.client.get(reverse("store:create_store"))
Expand Down
5 changes: 2 additions & 3 deletions store/tests/views/test_store_list_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@

from store.tests.factories.store_factory import StoreFactory


class StoreListView(TestCase):
def setUp(self):
self.stores = StoreFactory.create_batch(10)
self.response = self.client.get(reverse('store:store_list'))
self.response = self.client.get(reverse("store:store_list"))

def test_stores_in_context(self):

self.assertEqual(self.response.status_code, 200)

response_queryset = self.response.context["stores"]
self.assertEqual(len(response_queryset), 10)

24 changes: 15 additions & 9 deletions store/tests/views/test_stripe_webhook_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,21 @@ def setUp(self):
"object": {
"id": "cs_test_session",
"object": "checkout.session",
"metadata": {
"session_key": self.client.session.session_key
}
"metadata": {"session_key": self.client.session.session_key},
}
}
},
}

@patch("stripe.Event.construct_from")
def test_stripe_webhook_success(self, mock_construct_event):
mock_construct_event.return_value = self.mock_event

# Make a POST request to the webhook endpoint
response = self.client.post(reverse("store:stripe_webhook"), data=json.dumps(self.mock_event), content_type="application/json")
response = self.client.post(
reverse("store:stripe_webhook"),
data=json.dumps(self.mock_event),
content_type="application/json",
)

# Verify that the webhook endpoint returns a 200 response
self.assertEqual(response.status_code, 200)
Expand All @@ -44,7 +46,11 @@ def test_stripe_webhook_failure(self, mock_construct_event):
mock_construct_event.return_value = self.mock_event

# Make a POST request to the webhook endpoint
response = self.client.post(reverse("store:stripe_webhook"), data=json.dumps(self.mock_event), content_type="application/json")

response = self.client.post(
reverse("store:stripe_webhook"),
data=json.dumps(self.mock_event),
content_type="application/json",
)

# Verify that the session isn't cleared if there's a bad session key
self.assertEqual(response.status_code, 400)
self.assertEqual(response.status_code, 400)
16 changes: 9 additions & 7 deletions store/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
path("", StoreList.as_view(), name="store_list"),
path("store/product/<int:pk>", ProductDetail.as_view(), name="product"),
path("checkout/", checkout, name="checkout"),
path("create-payment-session", create_payment_session, name="create_payment_session"),
path(
"create-payment-session", create_payment_session, name="create_payment_session"
),
path("stripe-webhook", stripe_webhook, name="stripe_webhook"),
path("add-to-bag/", add_to_bag, name="add-to-bag"),
path("user-admin/store/products", ProductAdmin.as_view(), name="product_admin"),
Expand All @@ -51,31 +53,31 @@
path(
"user-admin/reports/customers/csv",
DownloadCustomerReport.as_view(),
name="download_customer_report"
name="download_customer_report",
),
path(
"user-admin/reports/customers/pdf",
DownloadCustomerPDFReport.as_view(),
name="download_customer_pdf_report"
name="download_customer_pdf_report",
),
path(
"user-admin/reports/products",
DownloadProductReport.as_view(),
name="download_product_report"
name="download_product_report",
),
path(
"user-admin/reports/products/pdf",
DownloadProductPDFReport.as_view(),
name="download_product_pdf_report"
name="download_product_pdf_report",
),
path(
"user-admin/reports/sales",
DownloadSalesReport.as_view(),
name="download_sales_report"
name="download_sales_report",
),
path(
"user-admin/reports/sales/pdf",
DownloadSalesPDFReport.as_view(),
name="download_sales_pdf_report"
name="download_sales_pdf_report",
),
]
2 changes: 1 addition & 1 deletion store/view_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ def get_order_items_by_store(products_in_bag):

return stores


def create_orders_for_stores(stores, order_info):
orders = []

Expand All @@ -89,4 +90,3 @@ def create_orders_for_stores(stores, order_info):
)
orders.append(order)
return orders

Loading

0 comments on commit 461a217

Please sign in to comment.