add new app
This commit is contained in:
0
core/apps/projects/__init__.py
Normal file
0
core/apps/projects/__init__.py
Normal file
1
core/apps/projects/admin/__init__.py
Normal file
1
core/apps/projects/admin/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .project import *
|
||||
21
core/apps/projects/admin/project.py
Normal file
21
core/apps/projects/admin/project.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from core.apps.projects.models.project import ProjectDepartment, Project
|
||||
|
||||
|
||||
class ProjectDepartmentInline(admin.TabularInline):
|
||||
model = ProjectDepartment
|
||||
extra = 0
|
||||
|
||||
|
||||
@admin.register(Project)
|
||||
class ProjectAdmin(admin.ModelAdmin):
|
||||
list_display = ['name', 'location', 'start_date', 'end_date']
|
||||
search_fields = ['name']
|
||||
inlines = [ProjectDepartmentInline]
|
||||
|
||||
|
||||
@admin.register(ProjectDepartment)
|
||||
class ProjectDepartmentAdmin(admin.ModelAdmin):
|
||||
list_display = ['name', 'project']
|
||||
search_fields = ['name']
|
||||
9
core/apps/projects/apps.py
Normal file
9
core/apps/projects/apps.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ProjectsConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'core.apps.projects'
|
||||
|
||||
def ready(self):
|
||||
from . import admin
|
||||
46
core/apps/projects/migrations/0001_initial.py
Normal file
46
core/apps/projects/migrations/0001_initial.py
Normal file
@@ -0,0 +1,46 @@
|
||||
# Generated by Django 5.2.4 on 2025-08-01 14:55
|
||||
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Project',
|
||||
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=200)),
|
||||
('start_date', models.DateField()),
|
||||
('end_date', models.DateField()),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Loyiha',
|
||||
'verbose_name_plural': 'Loyihalar',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ProjectDepartment',
|
||||
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)),
|
||||
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='project_departments', to='projects.project')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': "Loyiha Bo'limi",
|
||||
'verbose_name_plural': "Loyiha Bo'limlari",
|
||||
},
|
||||
),
|
||||
]
|
||||
0
core/apps/projects/migrations/__init__.py
Normal file
0
core/apps/projects/migrations/__init__.py
Normal file
1
core/apps/projects/models/__init__.py
Normal file
1
core/apps/projects/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .project import *
|
||||
32
core/apps/projects/models/project.py
Normal file
32
core/apps/projects/models/project.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from core.apps.shared.models import BaseModel
|
||||
|
||||
|
||||
class Project(BaseModel):
|
||||
name = models.CharField(max_length=200)
|
||||
location = models.CharField(max_length=200)
|
||||
start_date = models.DateField()
|
||||
end_date = models.DateField()
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Loyiha')
|
||||
verbose_name_plural = _('Loyihalar')
|
||||
|
||||
|
||||
class ProjectDepartment(BaseModel):
|
||||
project = models.ForeignKey(
|
||||
Project, on_delete=models.CASCADE, related_name='project_departments'
|
||||
)
|
||||
name = models.CharField(max_length=200)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Loyiha Bo'limi")
|
||||
verbose_name_plural = _("Loyiha Bo'limlari")
|
||||
0
core/apps/projects/serializers/__init__.py
Normal file
0
core/apps/projects/serializers/__init__.py
Normal file
29
core/apps/projects/serializers/project.py
Normal file
29
core/apps/projects/serializers/project.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.projects.models.project import Project, ProjectDepartment
|
||||
|
||||
|
||||
class ProjectDepartmentListSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = ProjectDepartment
|
||||
fields = [
|
||||
'id', 'name'
|
||||
]
|
||||
|
||||
|
||||
class ProjectListSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Project
|
||||
fields = [
|
||||
'id', 'name', 'location', 'start_date', 'end_date'
|
||||
]
|
||||
|
||||
|
||||
class ProjectDetailSerialzier(serializers.ModelSerializer):
|
||||
project_departments = ProjectDepartmentListSerializer(many=True)
|
||||
|
||||
class Meta:
|
||||
model = Project
|
||||
fields = [
|
||||
'id', 'name', 'location', 'start_date', 'end_date', 'project_departments'
|
||||
]
|
||||
12
core/apps/projects/urls.py
Normal file
12
core/apps/projects/urls.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from django.urls import path, include
|
||||
|
||||
from core.apps.projects.views import project as project_views
|
||||
|
||||
urlpatterns = [
|
||||
path('project/', include(
|
||||
[
|
||||
path('list/', project_views.ProjectListApiView.as_view()),
|
||||
path('<uuid:id>/', project_views.ProjectDetailApiView.as_view()),
|
||||
]
|
||||
))
|
||||
]
|
||||
0
core/apps/projects/views/__init__.py
Normal file
0
core/apps/projects/views/__init__.py
Normal file
21
core/apps/projects/views/project.py
Normal file
21
core/apps/projects/views/project.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from rest_framework import generics, status
|
||||
from rest_framework.response import Response
|
||||
|
||||
from core.apps.projects.models.project import Project, ProjectDepartment
|
||||
from core.apps.projects.serializers import project as serializers
|
||||
from core.apps.accounts.permissions.permissions import HasRolePermission
|
||||
|
||||
|
||||
class ProjectListApiView(generics.ListAPIView):
|
||||
serializer_class = serializers.ProjectListSerializer
|
||||
queryset = Project.objects.all()
|
||||
permission_classes = [HasRolePermission]
|
||||
required_permissions = []
|
||||
|
||||
|
||||
class ProjectDetailApiView(generics.RetrieveAPIView):
|
||||
serializer_class = serializers.ProjectDetailSerialzier
|
||||
queryset = Project.objects.prefetch_related('project_departments')
|
||||
permission_classes = [HasRolePermission]
|
||||
required_permissions = []
|
||||
lookup_field = 'id'
|
||||
Reference in New Issue
Block a user