storage yaratildi

This commit is contained in:
Husanjonazamov
2026-03-13 20:17:06 +05:00
commit 1c692b51b6
256 changed files with 8852 additions and 0 deletions

0
core/apps/vendors/__init__.py vendored Normal file
View File

3
core/apps/vendors/admin/__init__.py vendored Normal file
View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

12
core/apps/vendors/admin/category.py vendored Normal file
View File

@@ -0,0 +1,12 @@
from django.contrib import admin
from unfold.admin import ModelAdmin
from core.apps.vendors.models import CategoryModel
@admin.register(CategoryModel)
class CategoryAdmin(ModelAdmin):
list_display = (
"id",
"__str__",
)

12
core/apps/vendors/admin/vendor.py vendored Normal file
View File

@@ -0,0 +1,12 @@
from django.contrib import admin
from unfold.admin import ModelAdmin
from core.apps.vendors.models import VendorModel
@admin.register(VendorModel)
class VendorAdmin(ModelAdmin):
list_display = (
"id",
"__str__",
)

View File

@@ -0,0 +1,20 @@
from django.contrib import admin
from unfold.admin import ModelAdmin
from core.apps.vendors.models import ProductimageModel, VendorproductModel
@admin.register(VendorproductModel)
class VendorproductAdmin(ModelAdmin):
list_display = (
"id",
"__str__",
)
@admin.register(ProductimageModel)
class ProductimageAdmin(ModelAdmin):
list_display = (
"id",
"__str__",
)

6
core/apps/vendors/apps.py vendored Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ModuleConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "core.apps.vendors"

0
core/apps/vendors/enums/__init__.py vendored Normal file
View File

3
core/apps/vendors/filters/__init__.py vendored Normal file
View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

13
core/apps/vendors/filters/category.py vendored Normal file
View File

@@ -0,0 +1,13 @@
from django_filters import rest_framework as filters
from core.apps.vendors.models import CategoryModel
class CategoryFilter(filters.FilterSet):
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
class Meta:
model = CategoryModel
fields = [
"name",
]

13
core/apps/vendors/filters/vendor.py vendored Normal file
View File

@@ -0,0 +1,13 @@
from django_filters import rest_framework as filters
from core.apps.vendors.models import VendorModel
class VendorFilter(filters.FilterSet):
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
class Meta:
model = VendorModel
fields = [
"name",
]

View File

@@ -0,0 +1,23 @@
from django_filters import rest_framework as filters
from core.apps.vendors.models import ProductimageModel, VendorproductModel
class VendorproductFilter(filters.FilterSet):
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
class Meta:
model = VendorproductModel
fields = [
"name",
]
class ProductimageFilter(filters.FilterSet):
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
class Meta:
model = ProductimageModel
fields = [
"name",
]

3
core/apps/vendors/forms/__init__.py vendored Normal file
View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

10
core/apps/vendors/forms/category.py vendored Normal file
View File

@@ -0,0 +1,10 @@
from django import forms
from core.apps.vendors.models import CategoryModel
class CategoryForm(forms.ModelForm):
class Meta:
model = CategoryModel
fields = "__all__"

10
core/apps/vendors/forms/vendor.py vendored Normal file
View File

@@ -0,0 +1,10 @@
from django import forms
from core.apps.vendors.models import VendorModel
class VendorForm(forms.ModelForm):
class Meta:
model = VendorModel
fields = "__all__"

View File

@@ -0,0 +1,17 @@
from django import forms
from core.apps.vendors.models import ProductimageModel, VendorproductModel
class VendorproductForm(forms.ModelForm):
class Meta:
model = VendorproductModel
fields = "__all__"
class ProductimageForm(forms.ModelForm):
class Meta:
model = ProductimageModel
fields = "__all__"

View File

@@ -0,0 +1,119 @@
# Generated by Django 5.2.7 on 2026-03-12 10:36
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='SectionModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('firestore_id', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='firestore id')),
('name', models.CharField(max_length=255, verbose_name='name')),
('is_active', models.BooleanField(default=True, verbose_name='is active')),
('image_url', models.URLField(blank=True, max_length=1000, null=True, verbose_name='image url')),
('image', models.ImageField(blank=True, null=True, upload_to='sections/', verbose_name='image')),
('color', models.CharField(blank=True, max_length=20, null=True, verbose_name='color')),
('service_type', models.CharField(blank=True, max_length=255, null=True, verbose_name='service type')),
],
options={
'verbose_name': 'Section',
'verbose_name_plural': 'Sections',
'db_table': 'sections',
},
),
migrations.CreateModel(
name='CategoryModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('firestore_id', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='firestore id')),
('title', models.CharField(max_length=255, verbose_name='title')),
('description', models.TextField(blank=True, null=True, verbose_name='description')),
('photo_url', models.URLField(blank=True, max_length=1000, null=True, verbose_name='photo url')),
('photo', models.ImageField(blank=True, null=True, upload_to='categories/', verbose_name='photo')),
('is_publish', models.BooleanField(default=True, verbose_name='is publish')),
('order', models.IntegerField(default=0, verbose_name='order')),
('section', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='categories', to='vendors.sectionmodel', verbose_name='section')),
],
options={
'verbose_name': 'Category',
'verbose_name_plural': 'Categories',
'db_table': 'categories',
},
),
migrations.CreateModel(
name='VendorModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('firestore_id', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='firestore id')),
('title', models.CharField(max_length=255, verbose_name='title')),
('description', models.TextField(blank=True, null=True, verbose_name='description')),
('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='phone')),
('location', models.JSONField(blank=True, null=True, verbose_name='location')),
('photo_url', models.URLField(blank=True, max_length=1000, null=True, verbose_name='photo url')),
('photo', models.ImageField(blank=True, null=True, upload_to='vendors/', verbose_name='photo')),
('is_active', models.BooleanField(default=True, verbose_name='is active')),
('section', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vendors', to='vendors.sectionmodel', verbose_name='section')),
],
options={
'verbose_name': 'Vendor',
'verbose_name_plural': 'Vendors',
'db_table': 'vendors',
},
),
migrations.CreateModel(
name='VendorproductModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('firestore_id', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='firestore id')),
('name', models.CharField(max_length=255, verbose_name='name')),
('description', models.TextField(blank=True, null=True, verbose_name='description')),
('price', models.DecimalField(decimal_places=2, default=0, max_digits=12, verbose_name='price')),
('discount_price', models.DecimalField(decimal_places=2, default=0, max_digits=12, verbose_name='discount price')),
('quantity', models.IntegerField(default=-1, verbose_name='quantity')),
('is_publish', models.BooleanField(default=True, verbose_name='is publish')),
('image', models.ImageField(blank=True, null=True, upload_to='products/', verbose_name='image')),
('photos_json', models.JSONField(blank=True, null=True, verbose_name='photos url list')),
('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='products', to='vendors.categorymodel', verbose_name='category')),
('section', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='products', to='vendors.sectionmodel', verbose_name='section')),
('vendor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='products', to='vendors.vendormodel', verbose_name='vendor')),
],
options={
'verbose_name': 'Vendor Product',
'verbose_name_plural': 'Vendor Products',
'db_table': 'vendor_products',
},
),
migrations.CreateModel(
name='ProductimageModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('image', models.ImageField(upload_to='product_gallery/', verbose_name='image')),
('order', models.IntegerField(default=0, verbose_name='order')),
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='vendors.vendorproductmodel', verbose_name='product')),
],
options={
'verbose_name': 'Product Image',
'verbose_name_plural': 'Product Images',
'db_table': 'product_images',
},
),
]

View File

4
core/apps/vendors/models/__init__.py vendored Normal file
View File

@@ -0,0 +1,4 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa
from .section import * # noqa

23
core/apps/vendors/models/category.py vendored Normal file
View File

@@ -0,0 +1,23 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_core.models import AbstractBaseModel
from model_bakery import baker
class CategoryModel(AbstractBaseModel):
firestore_id = models.CharField(verbose_name=_("firestore id"), max_length=255, unique=True, null=True, blank=True)
section = models.ForeignKey("SectionModel", verbose_name=_("section"), on_delete=models.CASCADE, related_name="categories", null=True, blank=True)
title = models.CharField(verbose_name=_("title"), max_length=255)
description = models.TextField(verbose_name=_("description"), null=True, blank=True)
photo_url = models.URLField(verbose_name=_("photo url"), max_length=1000, null=True, blank=True)
photo = models.ImageField(verbose_name=_("photo"), upload_to="categories/", null=True, blank=True)
is_publish = models.BooleanField(verbose_name=_("is publish"), default=True)
order = models.IntegerField(verbose_name=_("order"), default=0)
def __str__(self):
return self.title
class Meta:
db_table = "categories"
verbose_name = _("Category")
verbose_name_plural = _("Categories")

21
core/apps/vendors/models/section.py vendored Normal file
View File

@@ -0,0 +1,21 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_core.models import AbstractBaseModel
class SectionModel(AbstractBaseModel):
firestore_id = models.CharField(verbose_name=_("firestore id"), max_length=255, unique=True, null=True, blank=True)
name = models.CharField(verbose_name=_("name"), max_length=255)
is_active = models.BooleanField(verbose_name=_("is active"), default=True)
image_url = models.URLField(verbose_name=_("image url"), max_length=1000, null=True, blank=True)
image = models.ImageField(verbose_name=_("image"), upload_to="sections/", null=True, blank=True)
color = models.CharField(verbose_name=_("color"), max_length=20, null=True, blank=True)
service_type = models.CharField(verbose_name=_("service type"), max_length=255, null=True, blank=True)
def __str__(self):
return self.name
class Meta:
db_table = "sections"
verbose_name = _("Section")
verbose_name_plural = _("Sections")

28
core/apps/vendors/models/vendor.py vendored Normal file
View File

@@ -0,0 +1,28 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_core.models import AbstractBaseModel
from model_bakery import baker
class VendorModel(AbstractBaseModel):
firestore_id = models.CharField(verbose_name=_("firestore id"), max_length=255, unique=True, null=True, blank=True)
section = models.ForeignKey("SectionModel", verbose_name=_("section"), on_delete=models.CASCADE, related_name="vendors", null=True, blank=True)
title = models.CharField(verbose_name=_("title"), max_length=255)
description = models.TextField(verbose_name=_("description"), null=True, blank=True)
phone = models.CharField(verbose_name=_("phone"), max_length=50, null=True, blank=True)
location = models.JSONField(verbose_name=_("location"), null=True, blank=True)
photo_url = models.URLField(verbose_name=_("photo url"), max_length=1000, null=True, blank=True)
photo = models.ImageField(verbose_name=_("photo"), upload_to="vendors/", null=True, blank=True)
is_active = models.BooleanField(verbose_name=_("is active"), default=True)
def __str__(self):
return self.title
@classmethod
def _baker(cls):
return baker.make(cls)
class Meta:
db_table = "vendors"
verbose_name = _("Vendor")
verbose_name_plural = _("Vendors")

View File

@@ -0,0 +1,41 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_core.models import AbstractBaseModel
from model_bakery import baker
class VendorproductModel(AbstractBaseModel):
firestore_id = models.CharField(verbose_name=_("firestore id"), max_length=255, unique=True, null=True, blank=True)
vendor = models.ForeignKey("VendorModel", verbose_name=_("vendor"), on_delete=models.CASCADE, related_name="products", null=True, blank=True)
category = models.ForeignKey("CategoryModel", verbose_name=_("category"), on_delete=models.SET_NULL, related_name="products", null=True, blank=True)
section = models.ForeignKey("SectionModel", verbose_name=_("section"), on_delete=models.SET_NULL, related_name="products", null=True, blank=True)
name = models.CharField(verbose_name=_("name"), max_length=255)
description = models.TextField(verbose_name=_("description"), null=True, blank=True)
price = models.DecimalField(verbose_name=_("price"), max_digits=12, decimal_places=2, default=0)
discount_price = models.DecimalField(verbose_name=_("discount price"), max_digits=12, decimal_places=2, default=0)
quantity = models.IntegerField(verbose_name=_("quantity"), default=-1)
is_publish = models.BooleanField(verbose_name=_("is publish"), default=True)
image = models.ImageField(verbose_name=_("image"), upload_to="products/", null=True, blank=True)
photos_json = models.JSONField(verbose_name=_("photos url list"), null=True, blank=True)
def __str__(self):
return self.name
class Meta:
db_table = "vendor_products"
verbose_name = _("Vendor Product")
verbose_name_plural = _("Vendor Products")
class ProductimageModel(AbstractBaseModel):
product = models.ForeignKey("VendorproductModel", verbose_name=_("product"), on_delete=models.CASCADE, related_name="images")
image = models.ImageField(verbose_name=_("image"), upload_to="product_gallery/")
order = models.IntegerField(verbose_name=_("order"), default=0)
def __str__(self):
return f"Image for {self.product.name}"
class Meta:
db_table = "product_images"
verbose_name = _("Product Image")
verbose_name_plural = _("Product Images")

6
core/apps/vendors/pagination.py vendored Normal file
View File

@@ -0,0 +1,6 @@
from rest_framework.pagination import CursorPagination
class VendorProductCursorPagination(CursorPagination):
page_size = 20
ordering = '-created_at'
cursor_query_param = 'cursor'

View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

View File

@@ -0,0 +1,12 @@
from rest_framework import permissions
class CategoryPermission(permissions.BasePermission):
def __init__(self) -> None: ...
def __call__(self, *args, **kwargs):
return self
def has_permission(self, request, view):
return True

12
core/apps/vendors/permissions/vendor.py vendored Normal file
View File

@@ -0,0 +1,12 @@
from rest_framework import permissions
class VendorPermission(permissions.BasePermission):
def __init__(self) -> None: ...
def __call__(self, *args, **kwargs):
return self
def has_permission(self, request, view):
return True

View File

@@ -0,0 +1,23 @@
from rest_framework import permissions
class VendorproductPermission(permissions.BasePermission):
def __init__(self) -> None: ...
def __call__(self, *args, **kwargs):
return self
def has_permission(self, request, view):
return True
class ProductimagePermission(permissions.BasePermission):
def __init__(self) -> None: ...
def __call__(self, *args, **kwargs):
return self
def has_permission(self, request, view):
return True

View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

View File

@@ -0,0 +1,40 @@
from rest_framework import serializers
from core.apps.vendors.models import CategoryModel
class BaseCategorySerializer(serializers.ModelSerializer):
class Meta:
model = CategoryModel
fields = [
"id",
"firestore_id",
"section",
"title",
"description",
"photo",
"photo_url",
"is_publish",
"order",
]
class ListCategorySerializer(BaseCategorySerializer):
class Meta(BaseCategorySerializer.Meta): ...
class RetrieveCategorySerializer(BaseCategorySerializer):
class Meta(BaseCategorySerializer.Meta): ...
class CreateCategorySerializer(BaseCategorySerializer):
class Meta(BaseCategorySerializer.Meta):
fields = [
"firestore_id",
"section",
"title",
"description",
"photo_url",
"is_publish",
"order",
]

View File

@@ -0,0 +1 @@
from .Category import * # noqa

View File

@@ -0,0 +1,28 @@
from rest_framework import serializers
from core.apps.vendors.models import SectionModel
class BaseSectionSerializer(serializers.ModelSerializer):
class Meta:
model = SectionModel
fields = [
"id",
"name",
"is_active",
"image",
"image_url",
"color",
"service_type",
]
class ListSectionSerializer(BaseSectionSerializer):
pass
class RetrieveSectionSerializer(BaseSectionSerializer):
pass
class CreateSectionSerializer(BaseSectionSerializer):
pass

View File

View File

@@ -0,0 +1 @@
from .vendor import * # noqa

View File

@@ -0,0 +1,42 @@
from rest_framework import serializers
from core.apps.vendors.models import VendorModel
class BaseVendorSerializer(serializers.ModelSerializer):
class Meta:
model = VendorModel
fields = [
"id",
"firestore_id",
"section",
"title",
"description",
"phone",
"location",
"photo",
"photo_url",
"is_active",
]
class ListVendorSerializer(BaseVendorSerializer):
class Meta(BaseVendorSerializer.Meta): ...
class RetrieveVendorSerializer(BaseVendorSerializer):
class Meta(BaseVendorSerializer.Meta): ...
class CreateVendorSerializer(BaseVendorSerializer):
class Meta(BaseVendorSerializer.Meta):
fields = [
"firestore_id",
"section",
"title",
"description",
"phone",
"location",
"photo_url",
"is_active",
]

View File

@@ -0,0 +1,28 @@
from rest_framework import serializers
from core.apps.vendors.models import ProductimageModel
class BaseProductimageSerializer(serializers.ModelSerializer):
class Meta:
model = ProductimageModel
fields = [
"id",
"name",
]
class ListProductimageSerializer(BaseProductimageSerializer):
class Meta(BaseProductimageSerializer.Meta): ...
class RetrieveProductimageSerializer(BaseProductimageSerializer):
class Meta(BaseProductimageSerializer.Meta): ...
class CreateProductimageSerializer(BaseProductimageSerializer):
class Meta(BaseProductimageSerializer.Meta):
fields = [
"id",
"name",
]

View File

@@ -0,0 +1,48 @@
from rest_framework import serializers
from core.apps.vendors.models import VendorproductModel
class BaseVendorproductSerializer(serializers.ModelSerializer):
class Meta:
model = VendorproductModel
fields = [
"id",
"firestore_id",
"vendor",
"category",
"section",
"name",
"description",
"price",
"discount_price",
"quantity",
"is_publish",
"image",
"photos_json",
]
class ListVendorproductSerializer(BaseVendorproductSerializer):
class Meta(BaseVendorproductSerializer.Meta): ...
class RetrieveVendorproductSerializer(BaseVendorproductSerializer):
class Meta(BaseVendorproductSerializer.Meta): ...
class CreateVendorproductSerializer(BaseVendorproductSerializer):
class Meta(BaseVendorproductSerializer.Meta):
fields = [
"firestore_id",
"vendor",
"category",
"section",
"name",
"description",
"price",
"discount_price",
"quantity",
"is_publish",
"photos_json",
]

View File

@@ -0,0 +1,2 @@
from .ProductImage import * # noqa
from .VendorProduct import * # noqa

3
core/apps/vendors/signals/__init__.py vendored Normal file
View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

8
core/apps/vendors/signals/category.py vendored Normal file
View File

@@ -0,0 +1,8 @@
from django.db.models.signals import post_save
from django.dispatch import receiver
from core.apps.vendors.models import CategoryModel
@receiver(post_save, sender=CategoryModel)
def CategorySignal(sender, instance, created, **kwargs): ...

8
core/apps/vendors/signals/vendor.py vendored Normal file
View File

@@ -0,0 +1,8 @@
from django.db.models.signals import post_save
from django.dispatch import receiver
from core.apps.vendors.models import VendorModel
@receiver(post_save, sender=VendorModel)
def VendorSignal(sender, instance, created, **kwargs): ...

View File

@@ -0,0 +1,12 @@
from django.db.models.signals import post_save
from django.dispatch import receiver
from core.apps.vendors.models import ProductimageModel, VendorproductModel
@receiver(post_save, sender=VendorproductModel)
def VendorproductSignal(sender, instance, created, **kwargs): ...
@receiver(post_save, sender=ProductimageModel)
def ProductimageSignal(sender, instance, created, **kwargs): ...

3
core/apps/vendors/tests/__init__.py vendored Normal file
View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

View File

@@ -0,0 +1 @@
from .test_Category import * # noqa

View File

@@ -0,0 +1,101 @@
import pytest
from django.urls import reverse
from rest_framework.test import APIClient
from core.apps.vendors.models import CategoryModel
@pytest.fixture
def instance(db):
return CategoryModel._baker()
@pytest.fixture
def api_client(instance):
client = APIClient()
##client.force_authenticate(user=instance.user)
return client, instance
@pytest.fixture
def data(api_client):
client, instance = api_client
return (
{
"list": reverse("Category-list"),
"retrieve": reverse("Category-detail", kwargs={"pk": instance.pk}),
"retrieve-not-found": reverse("Category-detail", kwargs={"pk": 1000}),
},
client,
instance,
)
@pytest.mark.django_db
def test_list(data):
urls, client, _ = data
response = client.get(urls["list"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve(data):
urls, client, _ = data
response = client.get(urls["retrieve"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve_not_found(data):
urls, client, _ = data
response = client.get(urls["retrieve-not-found"])
data_resp = response.json()
assert response.status_code == 404
assert data_resp["status"] is False
# @pytest.mark.django_db
# def test_create(data):
# urls, client, _ = data
# response = client.post(urls["list"], data={"name": "test"})
# assert response.json()["status"] is True
# assert response.status_code == 201
# @pytest.mark.django_db
# def test_update(data):
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_partial_update():
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_destroy(data):
# urls, client, _ = data
# response = client.delete(urls["retrieve"])
# assert response.status_code == 204

View File

@@ -0,0 +1 @@
from .test_vendor import * # noqa

View File

@@ -0,0 +1,101 @@
import pytest
from django.urls import reverse
from rest_framework.test import APIClient
from core.apps.vendors.models import VendorModel
@pytest.fixture
def instance(db):
return VendorModel._baker()
@pytest.fixture
def api_client(instance):
client = APIClient()
##client.force_authenticate(user=instance.user)
return client, instance
@pytest.fixture
def data(api_client):
client, instance = api_client
return (
{
"list": reverse("vendor-list"),
"retrieve": reverse("vendor-detail", kwargs={"pk": instance.pk}),
"retrieve-not-found": reverse("vendor-detail", kwargs={"pk": 1000}),
},
client,
instance,
)
@pytest.mark.django_db
def test_list(data):
urls, client, _ = data
response = client.get(urls["list"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve(data):
urls, client, _ = data
response = client.get(urls["retrieve"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve_not_found(data):
urls, client, _ = data
response = client.get(urls["retrieve-not-found"])
data_resp = response.json()
assert response.status_code == 404
assert data_resp["status"] is False
# @pytest.mark.django_db
# def test_create(data):
# urls, client, _ = data
# response = client.post(urls["list"], data={"name": "test"})
# assert response.json()["status"] is True
# assert response.status_code == 201
# @pytest.mark.django_db
# def test_update(data):
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_partial_update():
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_destroy(data):
# urls, client, _ = data
# response = client.delete(urls["retrieve"])
# assert response.status_code == 204

View File

@@ -0,0 +1,2 @@
from .test_ProductImage import * # noqa
from .test_VendorProduct import * # noqa

View File

@@ -0,0 +1,101 @@
import pytest
from django.urls import reverse
from rest_framework.test import APIClient
from core.apps.vendors.models import ProductimageModel
@pytest.fixture
def instance(db):
return ProductimageModel._baker()
@pytest.fixture
def api_client(instance):
client = APIClient()
##client.force_authenticate(user=instance.user)
return client, instance
@pytest.fixture
def data(api_client):
client, instance = api_client
return (
{
"list": reverse("ProductImage-list"),
"retrieve": reverse("ProductImage-detail", kwargs={"pk": instance.pk}),
"retrieve-not-found": reverse("ProductImage-detail", kwargs={"pk": 1000}),
},
client,
instance,
)
@pytest.mark.django_db
def test_list(data):
urls, client, _ = data
response = client.get(urls["list"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve(data):
urls, client, _ = data
response = client.get(urls["retrieve"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve_not_found(data):
urls, client, _ = data
response = client.get(urls["retrieve-not-found"])
data_resp = response.json()
assert response.status_code == 404
assert data_resp["status"] is False
# @pytest.mark.django_db
# def test_create(data):
# urls, client, _ = data
# response = client.post(urls["list"], data={"name": "test"})
# assert response.json()["status"] is True
# assert response.status_code == 201
# @pytest.mark.django_db
# def test_update(data):
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_partial_update():
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_destroy(data):
# urls, client, _ = data
# response = client.delete(urls["retrieve"])
# assert response.status_code == 204

View File

@@ -0,0 +1,101 @@
import pytest
from django.urls import reverse
from rest_framework.test import APIClient
from core.apps.vendors.models import VendorproductModel
@pytest.fixture
def instance(db):
return VendorproductModel._baker()
@pytest.fixture
def api_client(instance):
client = APIClient()
##client.force_authenticate(user=instance.user)
return client, instance
@pytest.fixture
def data(api_client):
client, instance = api_client
return (
{
"list": reverse("VendorProduct-list"),
"retrieve": reverse("VendorProduct-detail", kwargs={"pk": instance.pk}),
"retrieve-not-found": reverse("VendorProduct-detail", kwargs={"pk": 1000}),
},
client,
instance,
)
@pytest.mark.django_db
def test_list(data):
urls, client, _ = data
response = client.get(urls["list"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve(data):
urls, client, _ = data
response = client.get(urls["retrieve"])
data_resp = response.json()
assert response.status_code == 200
assert data_resp["status"] is True
@pytest.mark.django_db
def test_retrieve_not_found(data):
urls, client, _ = data
response = client.get(urls["retrieve-not-found"])
data_resp = response.json()
assert response.status_code == 404
assert data_resp["status"] is False
# @pytest.mark.django_db
# def test_create(data):
# urls, client, _ = data
# response = client.post(urls["list"], data={"name": "test"})
# assert response.json()["status"] is True
# assert response.status_code == 201
# @pytest.mark.django_db
# def test_update(data):
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_partial_update():
# urls, client, _ = data
# response = client.patch(urls["retrieve"], data={"name": "updated"})
# assert response.json()["status"] is True
# assert response.status_code == 200
#
# # verify updated value
# response = client.get(urls["retrieve"])
# assert response.json()["status"] is True
# assert response.status_code == 200
# assert response.json()["data"]["name"] == "updated"
# @pytest.mark.django_db
# def test_destroy(data):
# urls, client, _ = data
# response = client.delete(urls["retrieve"])
# assert response.status_code == 204

View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

View File

@@ -0,0 +1,8 @@
from modeltranslation.translator import TranslationOptions, register
from core.apps.vendors.models import CategoryModel
@register(CategoryModel)
class CategoryTranslation(TranslationOptions):
fields = []

View File

@@ -0,0 +1,8 @@
from modeltranslation.translator import TranslationOptions, register
from core.apps.vendors.models import VendorModel
@register(VendorModel)
class VendorTranslation(TranslationOptions):
fields = []

View File

@@ -0,0 +1,13 @@
from modeltranslation.translator import TranslationOptions, register
from core.apps.vendors.models import ProductimageModel, VendorproductModel
@register(VendorproductModel)
class VendorproductTranslation(TranslationOptions):
fields = []
@register(ProductimageModel)
class ProductimageTranslation(TranslationOptions):
fields = []

12
core/apps/vendors/urls.py vendored Normal file
View File

@@ -0,0 +1,12 @@
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import CategoryView, ProductimageView, VendorproductView, VendorView, SectionView
router = DefaultRouter()
router.register("sections", SectionView, basename="sections")
router.register("categories", CategoryView, basename="categories")
router.register("vendors", VendorView, basename="vendors")
router.register("products", VendorproductView, basename="products")
router.register("product-images", ProductimageView, basename="product-images")
urlpatterns = [path("", include(router.urls))]

View File

@@ -0,0 +1,3 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa

View File

@@ -0,0 +1,8 @@
# from django.core.exceptions import ValidationError
class CategoryValidator:
def __init__(self): ...
def __call__(self):
return True

View File

@@ -0,0 +1,8 @@
# from django.core.exceptions import ValidationError
class VendorValidator:
def __init__(self): ...
def __call__(self):
return True

View File

@@ -0,0 +1,15 @@
# from django.core.exceptions import ValidationError
class VendorproductValidator:
def __init__(self): ...
def __call__(self):
return True
class ProductimageValidator:
def __init__(self): ...
def __call__(self):
return True

4
core/apps/vendors/views/__init__.py vendored Normal file
View File

@@ -0,0 +1,4 @@
from .category import * # noqa
from .vendor import * # noqa
from .vendor_product import * # noqa
from .section import * # noqa

31
core/apps/vendors/views/category.py vendored Normal file
View File

@@ -0,0 +1,31 @@
from django_core.mixins import BaseViewSetMixin
from drf_spectacular.utils import extend_schema
from rest_framework.permissions import AllowAny
from rest_framework.viewsets import ReadOnlyModelViewSet
from core.apps.vendors.models import CategoryModel
from core.apps.vendors.serializers.category import (
CreateCategorySerializer,
ListCategorySerializer,
RetrieveCategorySerializer,
)
from rest_framework.viewsets import ModelViewSet
@extend_schema(tags=["Category"])
class CategoryView(BaseViewSetMixin, ModelViewSet):
queryset = CategoryModel.objects.all()
lookup_field = "firestore_id"
serializer_class = ListCategorySerializer
permission_classes = [AllowAny]
filterset_fields = ["section", "is_publish"]
action_permission_classes = {}
action_serializer_class = {
"list": ListCategorySerializer,
"retrieve": RetrieveCategorySerializer,
"create": CreateCategorySerializer,
"update": CreateCategorySerializer,
"partial_update": CreateCategorySerializer,
}

28
core/apps/vendors/views/section.py vendored Normal file
View File

@@ -0,0 +1,28 @@
from django_core.mixins import BaseViewSetMixin
from drf_spectacular.utils import extend_schema
from rest_framework.permissions import AllowAny
from rest_framework.viewsets import ModelViewSet
from core.apps.vendors.models import SectionModel
from core.apps.vendors.serializers.section.Section import (
CreateSectionSerializer,
ListSectionSerializer,
RetrieveSectionSerializer,
)
@extend_schema(tags=["Section"])
class SectionView(BaseViewSetMixin, ModelViewSet):
queryset = SectionModel.objects.all()
serializer_class = ListSectionSerializer
permission_classes = [AllowAny]
filterset_fields = ["is_active"]
action_permission_classes = {}
action_serializer_class = {
"list": ListSectionSerializer,
"retrieve": RetrieveSectionSerializer,
"create": CreateSectionSerializer,
"update": CreateSectionSerializer,
"partial_update": CreateSectionSerializer,
}

27
core/apps/vendors/views/vendor.py vendored Normal file
View File

@@ -0,0 +1,27 @@
from django_core.mixins import BaseViewSetMixin
from drf_spectacular.utils import extend_schema
from rest_framework.permissions import AllowAny
from rest_framework.viewsets import ReadOnlyModelViewSet
from core.apps.vendors.models import VendorModel
from core.apps.vendors.serializers.vendor import CreateVendorSerializer, ListVendorSerializer, RetrieveVendorSerializer
from rest_framework.viewsets import ModelViewSet
@extend_schema(tags=["vendor"])
class VendorView(BaseViewSetMixin, ModelViewSet):
queryset = VendorModel.objects.all()
lookup_field = "firestore_id"
serializer_class = ListVendorSerializer
permission_classes = [AllowAny]
filterset_fields = ["section", "is_active"]
action_permission_classes = {}
action_serializer_class = {
"list": ListVendorSerializer,
"retrieve": RetrieveVendorSerializer,
"create": CreateVendorSerializer,
"update": CreateVendorSerializer,
"partial_update": CreateVendorSerializer,
}

View File

@@ -0,0 +1,50 @@
from django_core.mixins import BaseViewSetMixin
from drf_spectacular.utils import extend_schema
from rest_framework.permissions import AllowAny
from rest_framework.viewsets import ReadOnlyModelViewSet
from core.apps.vendors.models import ProductimageModel, VendorproductModel
from core.apps.vendors.serializers.vendor_product import (
CreateProductimageSerializer,
CreateVendorproductSerializer,
ListProductimageSerializer,
ListVendorproductSerializer,
RetrieveProductimageSerializer,
RetrieveVendorproductSerializer,
)
from rest_framework.viewsets import ModelViewSet
from core.apps.vendors.pagination import VendorProductCursorPagination
@extend_schema(tags=["VendorProduct"])
class VendorproductView(BaseViewSetMixin, ModelViewSet):
queryset = VendorproductModel.objects.all().order_by("-created_at")
lookup_field = "firestore_id"
serializer_class = ListVendorproductSerializer
permission_classes = [AllowAny]
pagination_class = VendorProductCursorPagination
filterset_fields = ["vendor", "category", "section"]
action_permission_classes = {}
action_serializer_class = {
"list": ListVendorproductSerializer,
"retrieve": RetrieveVendorproductSerializer,
"create": CreateVendorproductSerializer,
"update": CreateVendorproductSerializer,
"partial_update": CreateVendorproductSerializer,
}
@extend_schema(tags=["ProductImage"])
class ProductimageView(BaseViewSetMixin, ReadOnlyModelViewSet):
queryset = ProductimageModel.objects.all()
serializer_class = ListProductimageSerializer
permission_classes = [AllowAny]
action_permission_classes = {}
action_serializer_class = {
"list": ListProductimageSerializer,
"retrieve": RetrieveProductimageSerializer,
"create": CreateProductimageSerializer,
}