storage yaratildi
This commit is contained in:
0
core/apps/vendors/__init__.py
vendored
Normal file
0
core/apps/vendors/__init__.py
vendored
Normal file
3
core/apps/vendors/admin/__init__.py
vendored
Normal file
3
core/apps/vendors/admin/__init__.py
vendored
Normal 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
12
core/apps/vendors/admin/category.py
vendored
Normal 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
12
core/apps/vendors/admin/vendor.py
vendored
Normal 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__",
|
||||
)
|
||||
20
core/apps/vendors/admin/vendor_product.py
vendored
Normal file
20
core/apps/vendors/admin/vendor_product.py
vendored
Normal 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
6
core/apps/vendors/apps.py
vendored
Normal 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
0
core/apps/vendors/enums/__init__.py
vendored
Normal file
3
core/apps/vendors/filters/__init__.py
vendored
Normal file
3
core/apps/vendors/filters/__init__.py
vendored
Normal 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
13
core/apps/vendors/filters/category.py
vendored
Normal 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
13
core/apps/vendors/filters/vendor.py
vendored
Normal 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",
|
||||
]
|
||||
23
core/apps/vendors/filters/vendor_product.py
vendored
Normal file
23
core/apps/vendors/filters/vendor_product.py
vendored
Normal 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
3
core/apps/vendors/forms/__init__.py
vendored
Normal 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
10
core/apps/vendors/forms/category.py
vendored
Normal 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
10
core/apps/vendors/forms/vendor.py
vendored
Normal 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__"
|
||||
17
core/apps/vendors/forms/vendor_product.py
vendored
Normal file
17
core/apps/vendors/forms/vendor_product.py
vendored
Normal 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__"
|
||||
119
core/apps/vendors/migrations/0001_initial.py
vendored
Normal file
119
core/apps/vendors/migrations/0001_initial.py
vendored
Normal 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',
|
||||
},
|
||||
),
|
||||
]
|
||||
0
core/apps/vendors/migrations/__init__.py
vendored
Normal file
0
core/apps/vendors/migrations/__init__.py
vendored
Normal file
4
core/apps/vendors/models/__init__.py
vendored
Normal file
4
core/apps/vendors/models/__init__.py
vendored
Normal 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
23
core/apps/vendors/models/category.py
vendored
Normal 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
21
core/apps/vendors/models/section.py
vendored
Normal 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
28
core/apps/vendors/models/vendor.py
vendored
Normal 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")
|
||||
41
core/apps/vendors/models/vendor_product.py
vendored
Normal file
41
core/apps/vendors/models/vendor_product.py
vendored
Normal 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
6
core/apps/vendors/pagination.py
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
from rest_framework.pagination import CursorPagination
|
||||
|
||||
class VendorProductCursorPagination(CursorPagination):
|
||||
page_size = 20
|
||||
ordering = '-created_at'
|
||||
cursor_query_param = 'cursor'
|
||||
3
core/apps/vendors/permissions/__init__.py
vendored
Normal file
3
core/apps/vendors/permissions/__init__.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from .category import * # noqa
|
||||
from .vendor import * # noqa
|
||||
from .vendor_product import * # noqa
|
||||
12
core/apps/vendors/permissions/category.py
vendored
Normal file
12
core/apps/vendors/permissions/category.py
vendored
Normal 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
12
core/apps/vendors/permissions/vendor.py
vendored
Normal 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
|
||||
23
core/apps/vendors/permissions/vendor_product.py
vendored
Normal file
23
core/apps/vendors/permissions/vendor_product.py
vendored
Normal 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
|
||||
3
core/apps/vendors/serializers/__init__.py
vendored
Normal file
3
core/apps/vendors/serializers/__init__.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from .category import * # noqa
|
||||
from .vendor import * # noqa
|
||||
from .vendor_product import * # noqa
|
||||
40
core/apps/vendors/serializers/category/Category.py
vendored
Normal file
40
core/apps/vendors/serializers/category/Category.py
vendored
Normal 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",
|
||||
]
|
||||
1
core/apps/vendors/serializers/category/__init__.py
vendored
Normal file
1
core/apps/vendors/serializers/category/__init__.py
vendored
Normal file
@@ -0,0 +1 @@
|
||||
from .Category import * # noqa
|
||||
28
core/apps/vendors/serializers/section/Section.py
vendored
Normal file
28
core/apps/vendors/serializers/section/Section.py
vendored
Normal 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
|
||||
0
core/apps/vendors/serializers/section/__init__.py
vendored
Normal file
0
core/apps/vendors/serializers/section/__init__.py
vendored
Normal file
1
core/apps/vendors/serializers/vendor/__init__.py
vendored
Normal file
1
core/apps/vendors/serializers/vendor/__init__.py
vendored
Normal file
@@ -0,0 +1 @@
|
||||
from .vendor import * # noqa
|
||||
42
core/apps/vendors/serializers/vendor/vendor.py
vendored
Normal file
42
core/apps/vendors/serializers/vendor/vendor.py
vendored
Normal 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",
|
||||
]
|
||||
28
core/apps/vendors/serializers/vendor_product/ProductImage.py
vendored
Normal file
28
core/apps/vendors/serializers/vendor_product/ProductImage.py
vendored
Normal 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",
|
||||
]
|
||||
48
core/apps/vendors/serializers/vendor_product/VendorProduct.py
vendored
Normal file
48
core/apps/vendors/serializers/vendor_product/VendorProduct.py
vendored
Normal 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",
|
||||
]
|
||||
2
core/apps/vendors/serializers/vendor_product/__init__.py
vendored
Normal file
2
core/apps/vendors/serializers/vendor_product/__init__.py
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
from .ProductImage import * # noqa
|
||||
from .VendorProduct import * # noqa
|
||||
3
core/apps/vendors/signals/__init__.py
vendored
Normal file
3
core/apps/vendors/signals/__init__.py
vendored
Normal 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
8
core/apps/vendors/signals/category.py
vendored
Normal 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
8
core/apps/vendors/signals/vendor.py
vendored
Normal 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): ...
|
||||
12
core/apps/vendors/signals/vendor_product.py
vendored
Normal file
12
core/apps/vendors/signals/vendor_product.py
vendored
Normal 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
3
core/apps/vendors/tests/__init__.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from .category import * # noqa
|
||||
from .vendor import * # noqa
|
||||
from .vendor_product import * # noqa
|
||||
1
core/apps/vendors/tests/category/__init__.py
vendored
Normal file
1
core/apps/vendors/tests/category/__init__.py
vendored
Normal file
@@ -0,0 +1 @@
|
||||
from .test_Category import * # noqa
|
||||
101
core/apps/vendors/tests/category/test_Category.py
vendored
Normal file
101
core/apps/vendors/tests/category/test_Category.py
vendored
Normal 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
|
||||
1
core/apps/vendors/tests/vendor/__init__.py
vendored
Normal file
1
core/apps/vendors/tests/vendor/__init__.py
vendored
Normal file
@@ -0,0 +1 @@
|
||||
from .test_vendor import * # noqa
|
||||
101
core/apps/vendors/tests/vendor/test_vendor.py
vendored
Normal file
101
core/apps/vendors/tests/vendor/test_vendor.py
vendored
Normal 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
|
||||
2
core/apps/vendors/tests/vendor_product/__init__.py
vendored
Normal file
2
core/apps/vendors/tests/vendor_product/__init__.py
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
from .test_ProductImage import * # noqa
|
||||
from .test_VendorProduct import * # noqa
|
||||
101
core/apps/vendors/tests/vendor_product/test_ProductImage.py
vendored
Normal file
101
core/apps/vendors/tests/vendor_product/test_ProductImage.py
vendored
Normal 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
|
||||
101
core/apps/vendors/tests/vendor_product/test_VendorProduct.py
vendored
Normal file
101
core/apps/vendors/tests/vendor_product/test_VendorProduct.py
vendored
Normal 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
|
||||
3
core/apps/vendors/translation/__init__.py
vendored
Normal file
3
core/apps/vendors/translation/__init__.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from .category import * # noqa
|
||||
from .vendor import * # noqa
|
||||
from .vendor_product import * # noqa
|
||||
8
core/apps/vendors/translation/category.py
vendored
Normal file
8
core/apps/vendors/translation/category.py
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
from modeltranslation.translator import TranslationOptions, register
|
||||
|
||||
from core.apps.vendors.models import CategoryModel
|
||||
|
||||
|
||||
@register(CategoryModel)
|
||||
class CategoryTranslation(TranslationOptions):
|
||||
fields = []
|
||||
8
core/apps/vendors/translation/vendor.py
vendored
Normal file
8
core/apps/vendors/translation/vendor.py
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
from modeltranslation.translator import TranslationOptions, register
|
||||
|
||||
from core.apps.vendors.models import VendorModel
|
||||
|
||||
|
||||
@register(VendorModel)
|
||||
class VendorTranslation(TranslationOptions):
|
||||
fields = []
|
||||
13
core/apps/vendors/translation/vendor_product.py
vendored
Normal file
13
core/apps/vendors/translation/vendor_product.py
vendored
Normal 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
12
core/apps/vendors/urls.py
vendored
Normal 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))]
|
||||
3
core/apps/vendors/validators/__init__.py
vendored
Normal file
3
core/apps/vendors/validators/__init__.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
from .category import * # noqa
|
||||
from .vendor import * # noqa
|
||||
from .vendor_product import * # noqa
|
||||
8
core/apps/vendors/validators/category.py
vendored
Normal file
8
core/apps/vendors/validators/category.py
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class CategoryValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
8
core/apps/vendors/validators/vendor.py
vendored
Normal file
8
core/apps/vendors/validators/vendor.py
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class VendorValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
15
core/apps/vendors/validators/vendor_product.py
vendored
Normal file
15
core/apps/vendors/validators/vendor_product.py
vendored
Normal 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
4
core/apps/vendors/views/__init__.py
vendored
Normal 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
31
core/apps/vendors/views/category.py
vendored
Normal 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
28
core/apps/vendors/views/section.py
vendored
Normal 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
27
core/apps/vendors/views/vendor.py
vendored
Normal 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,
|
||||
}
|
||||
50
core/apps/vendors/views/vendor_product.py
vendored
Normal file
50
core/apps/vendors/views/vendor_product.py
vendored
Normal 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,
|
||||
}
|
||||
Reference in New Issue
Block a user