change bug of permissions list
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
from rest_framework_simplejwt.authentication import JWTAuthentication
|
from rest_framework_simplejwt.authentication import JWTAuthentication
|
||||||
from rest_framework.permissions import AllowAny, IsAuthenticated
|
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||||||
|
from rest_framework.exceptions import APIException
|
||||||
from apps.authorization.api.v1.serializers import (
|
from apps.authorization.api.v1.serializers import (
|
||||||
RoleSerializer,
|
RoleSerializer,
|
||||||
PermissionSerializer,
|
PermissionSerializer,
|
||||||
@@ -17,6 +18,7 @@ from apps.authorization.models import (
|
|||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from rest_framework import filters
|
from rest_framework import filters
|
||||||
|
from rest_framework import status
|
||||||
|
|
||||||
|
|
||||||
class RoleViewSet(viewsets.ModelViewSet):
|
class RoleViewSet(viewsets.ModelViewSet):
|
||||||
@@ -34,6 +36,25 @@ class PageViewSet(viewsets.ModelViewSet):
|
|||||||
filter_backends = [filters.SearchFilter]
|
filter_backends = [filters.SearchFilter]
|
||||||
search_fields = ['name', 'code']
|
search_fields = ['name', 'code']
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['delete'],
|
||||||
|
detail=True,
|
||||||
|
url_name='delete',
|
||||||
|
url_path='delete',
|
||||||
|
name='delete'
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def delete(self, request, pk=None):
|
||||||
|
""" Full delete of page & permissions of page object """
|
||||||
|
try:
|
||||||
|
page = self.queryset.get(id=pk)
|
||||||
|
permissions = Permissions.objects.filter(page=page)
|
||||||
|
permissions.delete()
|
||||||
|
page.delete()
|
||||||
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
class PermissionViewSet(viewsets.ModelViewSet):
|
class PermissionViewSet(viewsets.ModelViewSet):
|
||||||
""" Crud Operations for Permissions """
|
""" Crud Operations for Permissions """
|
||||||
|
|||||||
@@ -54,8 +54,9 @@ class PermissionSerializer(serializers.ModelSerializer):
|
|||||||
return representation
|
return representation
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def permissions_structure_output(cls, permissions: list) -> typing.Any:
|
def permissions_structure_output(cls, permissions) -> typing.Any:
|
||||||
""" set a structure for permissions """
|
""" set a structure for permissions """
|
||||||
|
|
||||||
structure = []
|
structure = []
|
||||||
pages_list = []
|
pages_list = []
|
||||||
for counter, permission in enumerate(permissions):
|
for counter, permission in enumerate(permissions):
|
||||||
@@ -64,7 +65,7 @@ class PermissionSerializer(serializers.ModelSerializer):
|
|||||||
structure.append({
|
structure.append({
|
||||||
'page_name': permission.page.name,
|
'page_name': permission.page.name,
|
||||||
'page_access': itertools.chain(*list(
|
'page_access': itertools.chain(*list(
|
||||||
permission.page.permission_page.all().values_list('name')))
|
permissions.filter(page=permission.page).values_list('name')))
|
||||||
})
|
})
|
||||||
return structure
|
return structure
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Generated by Django 5.0 on 2025-06-08 07:32
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('authorization', '0016_alter_permissions_name'),
|
||||||
|
('product', '0003_saleunit'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='attribute',
|
||||||
|
name='type',
|
||||||
|
field=models.CharField(choices=[('K', 'Per Kilo'), ('', '')], default='empty', help_text='type of attribute like: calculate product by kilogram', max_length=10),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='attributevalue',
|
||||||
|
name='attribute',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='attribute_value', to='product.attribute'),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Broker',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('create_date', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('modify_date', models.DateTimeField(auto_now=True)),
|
||||||
|
('creator_info', models.CharField(max_length=100, null=True)),
|
||||||
|
('modifier_info', models.CharField(max_length=100, null=True)),
|
||||||
|
('trash', models.BooleanField(default=False)),
|
||||||
|
('calculation_strategy', models.CharField(choices=[('K', 'Per Kilo'), ('', '')], default='empty', max_length=3)),
|
||||||
|
('required', models.BooleanField(default=False)),
|
||||||
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('organization_relations', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_organization', to='authorization.userrelations')),
|
||||||
|
('reference_product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_broker', to='product.referenceproduct')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.0 on 2025-06-08 08:07
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0004_alter_attribute_type_alter_attributevalue_attribute_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='saleunit',
|
||||||
|
old_name='product',
|
||||||
|
new_name='reference_product',
|
||||||
|
),
|
||||||
|
]
|
||||||
23
apps/product/migrations/0006_alter_saleunit_unit_and_more.py
Normal file
23
apps/product/migrations/0006_alter_saleunit_unit_and_more.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.0 on 2025-06-08 08:30
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0005_rename_product_saleunit_reference_product'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='saleunit',
|
||||||
|
name='unit',
|
||||||
|
field=models.CharField(choices=[('10P', '10KG Package'), ('50P', '50KG Package'), ('', '')], max_length=10, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='saleunit',
|
||||||
|
name='variation_coefficient',
|
||||||
|
field=models.IntegerField(default=0),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from apps.core.models import BaseModel
|
from apps.core.models import BaseModel
|
||||||
|
from apps.authorization.models import UserRelations
|
||||||
|
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
@@ -56,8 +57,13 @@ class Attribute(BaseModel):
|
|||||||
null=True
|
null=True
|
||||||
)
|
)
|
||||||
name = models.CharField(max_length=100, default='empty')
|
name = models.CharField(max_length=100, default='empty')
|
||||||
|
type_choices = (
|
||||||
|
('K', 'Per Kilo'),
|
||||||
|
('', ''),
|
||||||
|
)
|
||||||
type = models.CharField(
|
type = models.CharField(
|
||||||
max_length=255,
|
max_length=10,
|
||||||
|
choices=type_choices,
|
||||||
default='empty',
|
default='empty',
|
||||||
help_text='type of attribute like: calculate product by kilogram'
|
help_text='type of attribute like: calculate product by kilogram'
|
||||||
)
|
)
|
||||||
@@ -83,7 +89,8 @@ class AttributeValue(BaseModel):
|
|||||||
attribute = models.ForeignKey(
|
attribute = models.ForeignKey(
|
||||||
Attribute,
|
Attribute,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='attribute_value'
|
related_name='attribute_value',
|
||||||
|
null=True
|
||||||
)
|
)
|
||||||
value = models.IntegerField(default=0)
|
value = models.IntegerField(default=0)
|
||||||
|
|
||||||
@@ -94,16 +101,56 @@ class AttributeValue(BaseModel):
|
|||||||
return super(AttributeValue, self).save(*args, **kwargs)
|
return super(AttributeValue, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class Broker(BaseModel):
|
||||||
|
""" Broker for product """
|
||||||
|
|
||||||
|
reference_product = models.ForeignKey(
|
||||||
|
ReferenceProduct,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
related_name='product_broker',
|
||||||
|
null=True
|
||||||
|
)
|
||||||
|
organization_relations = models.ForeignKey(
|
||||||
|
UserRelations,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
related_name='product_organization',
|
||||||
|
null=True
|
||||||
|
)
|
||||||
|
calculation_choices = (
|
||||||
|
('K', 'Per Kilo'),
|
||||||
|
('', ''),
|
||||||
|
)
|
||||||
|
calculation_strategy = models.CharField(
|
||||||
|
max_length=3,
|
||||||
|
choices=calculation_choices,
|
||||||
|
default='empty'
|
||||||
|
)
|
||||||
|
required = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'{self.organization_relations.organization.name} - {self.reference_product.name}'
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
return super(Broker, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class SaleUnit(BaseModel):
|
class SaleUnit(BaseModel):
|
||||||
product = models.ForeignKey(
|
""" Units of product for sale """
|
||||||
|
|
||||||
|
reference_product = models.ForeignKey(
|
||||||
ReferenceProduct,
|
ReferenceProduct,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='sale_unit',
|
related_name='sale_unit',
|
||||||
null=True
|
null=True
|
||||||
)
|
)
|
||||||
unit = models.CharField(max_length=255, null=True)
|
unit_choices = (
|
||||||
variation_coefficient = models.CharField(max_length=255, null=True)
|
('10P', '10KG Package'),
|
||||||
|
('50P', '50KG Package'),
|
||||||
|
('', ''),
|
||||||
|
)
|
||||||
|
unit = models.CharField(max_length=10, choices=unit_choices, null=True)
|
||||||
|
variation_coefficient = models.IntegerField(default=0)
|
||||||
required = models.BooleanField(default=False)
|
required = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.product} - {self.unit} - {self.variation_coefficient}'
|
return f'{self.reference_product} - {self.unit} - {self.variation_coefficient}'
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from rest_framework import status
|
|||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
|
||||||
|
|
||||||
def trash(queryset, pk):
|
def trash(queryset, pk): # noqa
|
||||||
""" sent object to trash """
|
""" sent object to trash """
|
||||||
obj = queryset.get(id=pk)
|
obj = queryset.get(id=pk)
|
||||||
obj.trash = True
|
obj.trash = True
|
||||||
@@ -91,3 +91,155 @@ class ReferenceProductViewSet(viewsets.ModelViewSet):
|
|||||||
return Response(status=status.HTTP_200_OK)
|
return Response(status=status.HTTP_200_OK)
|
||||||
except APIException as e:
|
except APIException as e:
|
||||||
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
|
class AttributeViewSet(viewsets.ModelViewSet):
|
||||||
|
""" attributes of reference product """
|
||||||
|
|
||||||
|
queryset = product_models.Attribute.objects.all()
|
||||||
|
serializer_class = product_serializers.AttributeSerializer
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['put'],
|
||||||
|
detail=True,
|
||||||
|
url_path='trash',
|
||||||
|
url_name='trash',
|
||||||
|
name='trash',
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def trash(self, request, pk=None):
|
||||||
|
""" Sent attribute to trash """
|
||||||
|
try:
|
||||||
|
trash(self.queryset, pk)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['post'],
|
||||||
|
detail=True,
|
||||||
|
url_name='delete',
|
||||||
|
url_path='delete',
|
||||||
|
name='delete'
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def delete(self, request, pk=None):
|
||||||
|
""" Full delete of attribute object """
|
||||||
|
try:
|
||||||
|
delete(self.queryset, pk)
|
||||||
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
|
class AttributeValueViewSet(viewsets.ModelViewSet):
|
||||||
|
""" apis for attribute values of child products """ # noqa
|
||||||
|
|
||||||
|
queryset = product_models.AttributeValue.objects.all()
|
||||||
|
serializer_class = product_serializers.AttributeValueSerializer
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['put'],
|
||||||
|
detail=True,
|
||||||
|
url_path='trash',
|
||||||
|
url_name='trash',
|
||||||
|
name='trash',
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def trash(self, request, pk=None):
|
||||||
|
""" Sent attribute value to trash """
|
||||||
|
try:
|
||||||
|
trash(self.queryset, pk)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['post'],
|
||||||
|
detail=True,
|
||||||
|
url_name='delete',
|
||||||
|
url_path='delete',
|
||||||
|
name='delete'
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def delete(self, request, pk=None):
|
||||||
|
""" Full delete of attribute value object """
|
||||||
|
try:
|
||||||
|
delete(self.queryset, pk)
|
||||||
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
|
class BrokerViewSet(viewsets.ModelViewSet):
|
||||||
|
""" apis of product brokers """ # noqa
|
||||||
|
|
||||||
|
queryset = product_models.Broker.objects.all()
|
||||||
|
serializer_class = product_serializers.BrokerSerializer
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['put'],
|
||||||
|
detail=True,
|
||||||
|
url_path='trash',
|
||||||
|
url_name='trash',
|
||||||
|
name='trash',
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def trash(self, request, pk=None):
|
||||||
|
""" Sent broker to trash """
|
||||||
|
try:
|
||||||
|
trash(self.queryset, pk)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['post'],
|
||||||
|
detail=True,
|
||||||
|
url_name='delete',
|
||||||
|
url_path='delete',
|
||||||
|
name='delete'
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def delete(self, request, pk=None):
|
||||||
|
""" Full delete of broker object """
|
||||||
|
try:
|
||||||
|
delete(self.queryset, pk)
|
||||||
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
|
class SaleUnitViewSet(viewsets.ModelViewSet):
|
||||||
|
""" apis of unit of sale for products """ # noqa
|
||||||
|
|
||||||
|
queryset = product_models.SaleUnit.objects.all()
|
||||||
|
serializer_class = product_serializers.SaleUnitSerializer
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['put'],
|
||||||
|
detail=True,
|
||||||
|
url_path='trash',
|
||||||
|
url_name='trash',
|
||||||
|
name='trash',
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def trash(self, request, pk=None):
|
||||||
|
""" Sent unit sale to trash """
|
||||||
|
try:
|
||||||
|
trash(self.queryset, pk)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
@action(
|
||||||
|
methods=['post'],
|
||||||
|
detail=True,
|
||||||
|
url_name='delete',
|
||||||
|
url_path='delete',
|
||||||
|
name='delete'
|
||||||
|
)
|
||||||
|
@transaction.atomic
|
||||||
|
def delete(self, request, pk=None):
|
||||||
|
""" Full delete of unit sale object """
|
||||||
|
try:
|
||||||
|
delete(self.queryset, pk)
|
||||||
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
except APIException as e:
|
||||||
|
return Response(e, status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from apps.product import models as product_models
|
from apps.product import models as product_models
|
||||||
|
from apps.authorization.api.v1 import serializers as authorize_serializers
|
||||||
|
|
||||||
|
|
||||||
class ReferenceProductSerializer(serializers.ModelSerializer):
|
class ReferenceProductSerializer(serializers.ModelSerializer):
|
||||||
@@ -25,3 +26,77 @@ class ProductSerializer(serializers.ModelSerializer):
|
|||||||
representation['reference'] = ReferenceProductSerializer(instance.reference).data
|
representation['reference'] = ReferenceProductSerializer(instance.reference).data
|
||||||
|
|
||||||
return representation
|
return representation
|
||||||
|
|
||||||
|
|
||||||
|
class AttributeSerializer(serializers.ModelSerializer):
|
||||||
|
""" serialize attributes of reference product """
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = product_models.Attribute
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
representation = super().to_representation(instance)
|
||||||
|
if instance.reference_product:
|
||||||
|
representation['reference_product'] = ReferenceProductSerializer(
|
||||||
|
instance.reference_product
|
||||||
|
).data
|
||||||
|
|
||||||
|
return representation
|
||||||
|
|
||||||
|
|
||||||
|
class AttributeValueSerializer(serializers.ModelSerializer):
|
||||||
|
""" serialize attribute values for child products """
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = product_models.AttributeValue
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
""" Custom output """
|
||||||
|
|
||||||
|
representation = super().to_representation(instance)
|
||||||
|
if instance.product:
|
||||||
|
representation['product'] = ProductSerializer(instance.product).data
|
||||||
|
if instance.attribute:
|
||||||
|
representation['attribute'] = AttributeSerializer(instance.attribute).data
|
||||||
|
|
||||||
|
return representation
|
||||||
|
|
||||||
|
|
||||||
|
class BrokerSerializer(serializers.ModelSerializer):
|
||||||
|
""" serialize product broker """
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = product_models.Broker
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
representation = super().to_representation(instance)
|
||||||
|
if instance.reference_product:
|
||||||
|
representation['reference_product'] = ReferenceProductSerializer(
|
||||||
|
instance.reference_product
|
||||||
|
).data
|
||||||
|
if instance.organization_relations:
|
||||||
|
representation['organization_relations'] = authorize_serializers.UserRelationSerializer(
|
||||||
|
instance.organization_relations
|
||||||
|
).data
|
||||||
|
|
||||||
|
return representation
|
||||||
|
|
||||||
|
|
||||||
|
class SaleUnitSerializer(serializers.ModelSerializer):
|
||||||
|
""" serialize unit of products for sale """
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = product_models.SaleUnit
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
representation = super().to_representation(instance)
|
||||||
|
if instance.reference_product:
|
||||||
|
representation['reference_product'] = ReferenceProductSerializer(
|
||||||
|
instance.reference_product
|
||||||
|
).data
|
||||||
|
|
||||||
|
return representation
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ from django.urls import path, include
|
|||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register(r'product', api_views.ProductViewSet, basename='product')
|
router.register(r'product', api_views.ProductViewSet, basename='product')
|
||||||
router.register(r'reference', api_views.ReferenceProductViewSet, basename='reference')
|
router.register(r'reference', api_views.ReferenceProductViewSet, basename='reference')
|
||||||
|
router.register(r'attribute', api_views.AttributeViewSet, basename='attribute')
|
||||||
|
router.register(r'attribute_value', api_views.AttributeValueViewSet, basename='attribute_value')
|
||||||
|
router.register(r'broker', api_views.BrokerViewSet, basename='broker')
|
||||||
|
router.register(r'sale_unit', api_views.SaleUnitViewSet, basename='sale_unit')
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('v1/', include(router.urls))
|
path('v1/', include(router.urls))
|
||||||
|
|||||||
Reference in New Issue
Block a user