From 9b403c46da33170f78f969de52fbb501df286299 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Fri, 1 Aug 2025 11:07:10 +0500 Subject: [PATCH] add company app --- .dockerignore | 2 +- config/conf/drf_yasg.py | 2 +- config/settings/base.py | 1 + config/urls.py | 1 + core/apps/company/__init__.py | 0 core/apps/company/admin/__init__.py | 2 + core/apps/company/admin/branch.py | 10 +++++ core/apps/company/admin/company.py | 8 ++++ core/apps/company/apps.py | 9 ++++ core/apps/company/migrations/0001_initial.py | 44 +++++++++++++++++++ .../migrations/0002_rename_barnch_branch.py | 17 +++++++ core/apps/company/migrations/__init__.py | 0 core/apps/company/models/__init__.py | 2 + core/apps/company/models/branch.py | 18 ++++++++ core/apps/company/models/comany.py | 15 +++++++ core/apps/company/serializers/__init__.py | 0 core/apps/company/serializers/branch.py | 9 ++++ core/apps/company/serializers/company.py | 18 ++++++++ core/apps/company/urls.py | 12 +++++ core/apps/company/views/__init__.py | 0 core/apps/company/views/company.py | 22 ++++++++++ 21 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 core/apps/company/__init__.py create mode 100644 core/apps/company/admin/__init__.py create mode 100644 core/apps/company/admin/branch.py create mode 100644 core/apps/company/admin/company.py create mode 100644 core/apps/company/apps.py create mode 100644 core/apps/company/migrations/0001_initial.py create mode 100644 core/apps/company/migrations/0002_rename_barnch_branch.py create mode 100644 core/apps/company/migrations/__init__.py create mode 100644 core/apps/company/models/__init__.py create mode 100644 core/apps/company/models/branch.py create mode 100644 core/apps/company/models/comany.py create mode 100644 core/apps/company/serializers/__init__.py create mode 100644 core/apps/company/serializers/branch.py create mode 100644 core/apps/company/serializers/company.py create mode 100644 core/apps/company/urls.py create mode 100644 core/apps/company/views/__init__.py create mode 100644 core/apps/company/views/company.py diff --git a/.dockerignore b/.dockerignore index f5e96db..f7275bb 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1 @@ -venv \ No newline at end of file +venv/ diff --git a/config/conf/drf_yasg.py b/config/conf/drf_yasg.py index 232cd5e..e83e896 100644 --- a/config/conf/drf_yasg.py +++ b/config/conf/drf_yasg.py @@ -12,7 +12,7 @@ schema_view = get_schema_view( contact=openapi.Contact(email="xoliqberdiyevbehru12@gmail.com"), license=openapi.License(name="Felix IT Solutions License"), ), - public=False, + public=True, permission_classes=(permissions.IsAuthenticated,), ) diff --git a/config/settings/base.py b/config/settings/base.py index c0b8af4..729d807 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -22,6 +22,7 @@ ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') APPS = [ 'core.apps.accounts', 'core.apps.shared', + 'core.apps.company', ] PACKAGES = [ diff --git a/config/urls.py b/config/urls.py index 0ae36cd..a70a5dc 100644 --- a/config/urls.py +++ b/config/urls.py @@ -14,6 +14,7 @@ urlpatterns = [ path('api/v1/', include( [ path('accounts/', include('core.apps.accounts.urls')), + path('company/', include('core.apps.company.urls')), path('shared/', include('core.apps.shared.urls')), ] )), diff --git a/core/apps/company/__init__.py b/core/apps/company/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/apps/company/admin/__init__.py b/core/apps/company/admin/__init__.py new file mode 100644 index 0000000..3bf164e --- /dev/null +++ b/core/apps/company/admin/__init__.py @@ -0,0 +1,2 @@ +from .company import * +from .branch import * \ No newline at end of file diff --git a/core/apps/company/admin/branch.py b/core/apps/company/admin/branch.py new file mode 100644 index 0000000..94f3acb --- /dev/null +++ b/core/apps/company/admin/branch.py @@ -0,0 +1,10 @@ +from django.contrib import admin + +from core.apps.company.models import Branch + + +@admin.register(Branch) +class BranchAdmin(admin.ModelAdmin): + list_display = ['name', 'location', 'company'] + search_fields = ['name', 'location', 'company'] + list_filter = ['company'] \ No newline at end of file diff --git a/core/apps/company/admin/company.py b/core/apps/company/admin/company.py new file mode 100644 index 0000000..b27ca0c --- /dev/null +++ b/core/apps/company/admin/company.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from core.apps.company.models import Company + +@admin.register(Company) +class CompanyAdmin(admin.ModelAdmin): + list_display = ['name'] + search_fields = ['name'] \ No newline at end of file diff --git a/core/apps/company/apps.py b/core/apps/company/apps.py new file mode 100644 index 0000000..5a2d45b --- /dev/null +++ b/core/apps/company/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class CompanyConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'core.apps.company' + + def ready(self): + from . import admin \ No newline at end of file diff --git a/core/apps/company/migrations/0001_initial.py b/core/apps/company/migrations/0001_initial.py new file mode 100644 index 0000000..debbfe2 --- /dev/null +++ b/core/apps/company/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 5.2.4 on 2025-08-01 10:39 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Company', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(db_index=True, max_length=200, unique=True)), + ], + options={ + 'verbose_name': 'Kompaniya', + 'verbose_name_plural': 'Kompaniyalar', + }, + ), + migrations.CreateModel( + name='Barnch', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=200)), + ('location', models.CharField(max_length=250)), + ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='branches', to='company.company')), + ], + options={ + 'verbose_name': 'Filial', + 'verbose_name_plural': 'Filialar', + }, + ), + ] diff --git a/core/apps/company/migrations/0002_rename_barnch_branch.py b/core/apps/company/migrations/0002_rename_barnch_branch.py new file mode 100644 index 0000000..ac4ab31 --- /dev/null +++ b/core/apps/company/migrations/0002_rename_barnch_branch.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.4 on 2025-08-01 10:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='Barnch', + new_name='Branch', + ), + ] diff --git a/core/apps/company/migrations/__init__.py b/core/apps/company/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/apps/company/models/__init__.py b/core/apps/company/models/__init__.py new file mode 100644 index 0000000..110c940 --- /dev/null +++ b/core/apps/company/models/__init__.py @@ -0,0 +1,2 @@ +from .branch import * +from .comany import * \ No newline at end of file diff --git a/core/apps/company/models/branch.py b/core/apps/company/models/branch.py new file mode 100644 index 0000000..09afac1 --- /dev/null +++ b/core/apps/company/models/branch.py @@ -0,0 +1,18 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from core.apps.shared.models import BaseModel +from core.apps.company.models.comany import Company + + +class Branch(BaseModel): + name = models.CharField(max_length=200) + company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='branches') + location = models.CharField(max_length=250) + + def __str__(self): + return f"{self.name} - {self.company}" + + class Meta: + verbose_name = _('Filial') + verbose_name_plural = _('Filialar') diff --git a/core/apps/company/models/comany.py b/core/apps/company/models/comany.py new file mode 100644 index 0000000..dc8bdf5 --- /dev/null +++ b/core/apps/company/models/comany.py @@ -0,0 +1,15 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from core.apps.shared.models import BaseModel + + +class Company(BaseModel): + name = models.CharField(max_length=200, unique=True, db_index=True) + + def __str__(self): + return self.name + + class Meta: + verbose_name = _('Kompaniya') + verbose_name_plural = _("Kompaniyalar") \ No newline at end of file diff --git a/core/apps/company/serializers/__init__.py b/core/apps/company/serializers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/apps/company/serializers/branch.py b/core/apps/company/serializers/branch.py new file mode 100644 index 0000000..463e9f1 --- /dev/null +++ b/core/apps/company/serializers/branch.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from core.apps.company.models import Branch + + +class BranchListSerializer(serializers.ModelSerializer): + class Meta: + model = Branch + fields = ['id', 'name', 'location'] \ No newline at end of file diff --git a/core/apps/company/serializers/company.py b/core/apps/company/serializers/company.py new file mode 100644 index 0000000..f6e70b9 --- /dev/null +++ b/core/apps/company/serializers/company.py @@ -0,0 +1,18 @@ +from rest_framework import serializers + +from core.apps.company.models import Company +from core.apps.company.serializers.branch import BranchListSerializer + + +class CompanyListSerializer(serializers.ModelSerializer): + class Meta: + model = Company + fields = ['id', 'name'] + + +class CompanyDetailSerializer(serializers.ModelSerializer): + branches = BranchListSerializer(many=True) + + class Meta: + model = Company + fields = ['id', 'name', 'branches'] \ No newline at end of file diff --git a/core/apps/company/urls.py b/core/apps/company/urls.py new file mode 100644 index 0000000..6e7cea5 --- /dev/null +++ b/core/apps/company/urls.py @@ -0,0 +1,12 @@ +from django.urls import path, include + +from core.apps.company.views import company as company_views + +urlpatterns = [ + path('company/', include( + [ + path('list/', company_views.CompanyListApiView.as_view(), name='company-list'), + path('/', company_views.CompanyDetailApiView.as_view()), + ] + )), +] \ No newline at end of file diff --git a/core/apps/company/views/__init__.py b/core/apps/company/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/apps/company/views/company.py b/core/apps/company/views/company.py new file mode 100644 index 0000000..853ddba --- /dev/null +++ b/core/apps/company/views/company.py @@ -0,0 +1,22 @@ +from rest_framework import generics, status +from rest_framework.response import Response + +from core.apps.company.models import Company +from core.apps.company.serializers import company as serializers + +from core.apps.accounts.permissions.permissions import HasRolePermission + + +class CompanyListApiView(generics.ListAPIView): + serializer_class = serializers.CompanyListSerializer + queryset = Company.objects.all() + permission_classes = [HasRolePermission] + required_permissions = [] + + +class CompanyDetailApiView(generics.RetrieveAPIView): + serializer_class = serializers.CompanyDetailSerializer + queryset = Company.objects.prefetch_related('branches') + permission_classes = [HasRolePermission] + required_permissions = [] + lookup_field = 'id' \ No newline at end of file