product: product folders import is done

This commit is contained in:
behruz-dev
2025-10-30 23:32:17 +05:00
parent 96a3be9f3c
commit b8decb3a60
7 changed files with 628 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
{
"data": {
"projects": [],
"project_folders": [
{
"id": 131,
"name": "Mezbon",
"color": "#F79009",
"projects_count": 9,
"percent": 9.51,
"total_amount": 18824049921.63,
"spend_amount": 33197807945.95,
"prediction_amount": 33197807945.95,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "16.03.2027",
"is_archived": false
},
{
"id": 89,
"name": "Mavrid",
"color": "#1E90FF",
"projects_count": 4,
"percent": 13.94,
"total_amount": 5025316534.38,
"spend_amount": 80865978602.1,
"prediction_amount": 80865978602.1,
"start_date": "01.04.2024",
"due_date": "30.04.2026",
"prediction_date": "21.12.2028",
"is_archived": false
},
{
"id": 575,
"name": "papka 1",
"color": null,
"projects_count": 0,
"percent": 0,
"total_amount": 0,
"spend_amount": 0,
"prediction_amount": 0,
"start_date": null,
"due_date": null,
"prediction_date": null,
"is_archived": false
}
]
},
"message": {
"uz": "Muvaffaqiyatli!",
"ru": "Успешно!",
"en": "Success!",
"tr": "Başarılı!"
}
}

View File

@@ -0,0 +1,339 @@
{
"data": [
{
"id": 89,
"name": "Mavrid",
"color": "#1E90FF",
"percent": 13.94,
"total_amount": 5025316534.38,
"spend_amount": 80865978602.1,
"prediction_amount": 80865978602.1,
"projects_count": 4,
"start_date": "01.04.2024",
"due_date": "30.04.2026",
"prediction_date": "30.10.2025",
"projects": [
{
"id": 332,
"name": "A BLOK",
"status": "process",
"percent": 55.76,
"start_date": "01.04.2024",
"due_date": "30.04.2026",
"prediction_date": "21.12.2028",
"total_amount": 1354794239.61,
"prediction_amount": 20216494650.52,
"spend_amount": 20216494650.52,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 1
},
{
"id": 376,
"name": "B BLOK",
"status": "planning",
"percent": 0,
"start_date": "03.07.2025",
"due_date": "30.04.2026",
"prediction_date": "30.10.2025",
"total_amount": 1835261147.38,
"prediction_amount": 20216494650.52,
"spend_amount": 20216494650.52,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 2
},
{
"id": 377,
"name": "C BLOK",
"status": "planning",
"percent": 0,
"start_date": "01.04.2024",
"due_date": "30.04.2026",
"prediction_date": "30.10.2025",
"total_amount": 1835261147.38,
"prediction_amount": 20216494650.52,
"spend_amount": 20216494650.52,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 3
},
{
"id": 438,
"name": "Ushbu loyihada ishlatilgan texnikalar",
"status": "planning",
"percent": 0,
"start_date": "01.04.2024",
"due_date": "30.04.2026",
"prediction_date": "30.10.2025",
"total_amount": 0,
"prediction_amount": 20216494650.52,
"spend_amount": 20216494650.52,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 1754932443
}
]
},
{
"id": 131,
"name": "Mezbon",
"color": "#F79009",
"percent": 9.51,
"total_amount": 18824049921.63,
"spend_amount": 33197807945.95,
"prediction_amount": 33197807945.95,
"projects_count": 9,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "30.10.2025",
"projects": [
{
"id": 307,
"name": "Blok №1",
"status": "process",
"percent": 27.92,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "30.04.2026",
"total_amount": 5422185157.58,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 1
},
{
"id": 375,
"name": "Blok №2",
"status": "process",
"percent": 41.03,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "19.11.2026",
"total_amount": 2367992764,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 2
},
{
"id": 382,
"name": "Blok №3",
"status": "process",
"percent": 16.67,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "27.09.2026",
"total_amount": 2269876000.05,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 3
},
{
"id": 380,
"name": "Blok №4",
"status": "planning",
"percent": 0,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "16.03.2027",
"total_amount": 2190999000,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 4
},
{
"id": 381,
"name": "Blok №5",
"status": "planning",
"percent": 0,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "16.03.2027",
"total_amount": 2190999000,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 5
},
{
"id": 378,
"name": "Blok №6",
"status": "planning",
"percent": 0,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "16.03.2027",
"total_amount": 2190999000,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 6
},
{
"id": 379,
"name": "Blok №7",
"status": "planning",
"percent": 0,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "16.03.2027",
"total_amount": 2190999000,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 7
},
{
"id": 407,
"name": "Ushbu loyihada ishlagan texnikalar",
"status": "planning",
"percent": 0,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "30.10.2025",
"total_amount": 0,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 8
},
{
"id": 657,
"name": "Ushbu loyihadagi boshqa mahsulotlar",
"status": "planning",
"percent": 0,
"start_date": "14.02.2025",
"due_date": "14.02.2028",
"prediction_date": "30.10.2025",
"total_amount": 0,
"prediction_amount": 3688645327.33,
"spend_amount": 3688645327.33,
"currency": {
"id": 1,
"name": {
"ru": "Узбекский сум",
"uz": "O'zbek so'mi"
},
"symbol": "UZS",
"icon": "https://backend.app.uyqur.uz/public/upload/image/YZfoihq4VHMSHaZziQlp.webp"
},
"is_archived": false,
"order": 1761819015
}
]
}
],
"message": {
"uz": "Muvaffaqiyatli!",
"ru": "Успешно!",
"en": "Success!",
"tr": "Başarılı!"
}
}

View File

@@ -0,0 +1,94 @@
import json
import requests
from datetime import datetime
from django.core.management import BaseCommand
from core.apps.projects.models import ProjectFolder, Project, ProjectLocation
from core.apps.wherehouse.models import WhereHouse
from core.apps.finance.models import CashTransaction
from core.apps.shared.models import Region, District
from core.apps.accounts.models import User
def get_project_data(project_id):
url = f"https://backend.app.uyqur.uz/main/project/view?id={project_id}"
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MTgzMzg2OSwiZXhwIjoxNzYxOTIwMjY5LCJuYmYiOjE3NjE4MzM4NjksImp0aSI6IjZSQWE1RzlyT0pGbXF1T2kiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.ACT7oxl-A2eit_bzxeal2jF_xLa0klFObNBpp1HuheE"
response = requests.get(url, headers={"Authorization": f"Bearer {token}"})
if response.status_code == 200:
return response.json().get("data")
return None
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument("file_path", type=str)
def handle(self, *args, **options):
file_path = options["file_path"]
with open(file_path, "r") as f:
data = json.load(f)
for folder in data["data"]:
folder_name = folder["name"]
folder_projects = folder["projects"]
project_folder = ProjectFolder.objects.filter(name=folder_name).first()
if not project_folder:
project_folder = ProjectFolder.objects.create(name=folder_name)
statuses = {
"process": "IN_PROGRESS",
"planning": "PLANNED",
}
for project_meta in folder_projects:
start_date = datetime.strptime(project_meta["start_date"], "%d.%m.%Y")
end_date = datetime.strptime(project_meta["due_date"], "%d.%m.%Y")
project_data = get_project_data(project_meta["id"])
if not project_data:
self.stdout.write(self.style.ERROR(f"{project_meta['name']} topilmadi"))
continue
cash_names = [c["name"] for c in project_data.get("cashs", [])]
cash_qs = CashTransaction.objects.filter(name__in=cash_names)
warehouse_names = [w["name"] for w in project_data.get("warehouses", [])]
warehouse_qs = WhereHouse.objects.filter(name__in=warehouse_names)
manager_names = [u["full_name"] for u in project_data["project_users"] if u["type"] == "manager"]
foreman_names = [u["full_name"] for u in project_data["project_users"] if u["type"] == "foreman"]
participant_names = [u["full_name"] for u in project_data["project_users"] if u["type"] == "participant"]
boss_qs = User.objects.filter(full_name__in=manager_names)
foreman_qs = User.objects.filter(full_name__in=foreman_names)
other_qs = User.objects.filter(full_name__in=participant_names)
project_obj, created = Project.objects.update_or_create(
name=project_data["name"],
defaults={
"folder": project_folder,
"currency": project_data["currency"]["symbol"].lower(),
"status": statuses.get(project_data["status"]),
"is_archive": project_data.get("is_archived", False),
"start_date": start_date,
"end_date": end_date,
"benifit_plan": project_data['prediction_amount'],
"area": project_data.get("area", 0),
},
)
project_obj.cash_transaction.set(cash_qs)
project_obj.wherehouse.set(warehouse_qs)
project_obj.boss.set(boss_qs)
project_obj.foreman.set(foreman_qs)
project_obj.other_members.set(other_qs)
project_obj.save()
msg = "Yaratildi" if created else "Yangilandi"
self.stdout.write(self.style.SUCCESS(f"{project_obj.name}{msg}"))
self.stdout.write(self.style.SUCCESS("✅ Barcha projectlar muvaffaqiyatli qo'shildi!"))

View File

@@ -0,0 +1,24 @@
import json
from django.core.management import BaseCommand
from core.apps.projects.models import ProjectFolder
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument("file_path", type=str)
def handle(self, *args, **options):
file_path = options["file_path"]
with open(file_path, "r") as f:
data = json.load(f)
for item in data['data']['project_folders']:
ProjectFolder.objects.get_or_create(
name=item['name'],
)
self.stdout.write("Project Folderlar qo'shildi")