summaryrefslogtreecommitdiff
path: root/core/management/commands/import_data.py
blob: cf1d4b6950a479094f4a23f34549dc21fa10a251 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import csv
import os
from typing import Any
from datetime import datetime

from django.core.files.images import ImageFile
from django.core.management.base import BaseCommand

from core.models import Order, OrderItem, PickupPoint, Supplier, User, Product, Role

class Command(BaseCommand):
    def handle(self, *args: Any, **kwargs: Any) -> str | None:
        base_path = "attachments/"

        with open(os.path.join(base_path, "pickup_point.csv"), encoding="utf-8-sig") as f:
            reader = csv.DictReader(f, ["address"])
            for row in reader:
                print(row)
                PickupPoint.objects.get_or_create(address=row["address"])

        with open(os.path.join(base_path, "product.csv"), encoding="utf-8-sig") as f:
            reader = csv.DictReader(f)
            for row in reader:
                print(row)
                if not row:
                    continue

                photo_name = row.pop("photo_name", None)

                sup_obj, _ = Supplier.objects.get_or_create(name=row.pop("supplier"))
                product, _ = Product.objects.get_or_create(article=row["article"], supplier=sup_obj, defaults=row)

                if photo_name:
                    photo_path = os.path.join(base_path, photo_name)
                    if os.path.exists(photo_path):
                        with open(photo_path, "rb") as img_file:
                            image = ImageFile(img_file)
                            print(image.width, image.height)
                            product.photo.save(
                                os.path.basename(photo_path),
                                image,
                                save=True
                            )

        with open(os.path.join(base_path, "user.csv"), encoding="utf-8-sig") as f:
            reader = csv.DictReader(f)
            for row in reader:
                print(row)
                if not row:
                    continue

                role_obj, _ = Role.objects.get_or_create(name=row["role"])
                if not User.objects.filter(username=row["login"]).exists():
                    user = User.objects.create(
                        username=row["login"], full_name=row["name"], role=role_obj
                    )
                    user.set_password(str(row["password"]).strip())
                    user.save()

        with open(os.path.join(base_path, "order.csv"), encoding="utf-8-sig") as f:
            reader = csv.DictReader(f)
            for row in reader:
                print(row)
                if not row:
                    continue

                pp = row.pop("pp", 1)
                items_string = row.pop("items", None)

                delivery_date_str = row.pop("delivery_date", None)
                delivery_date = datetime.strptime(delivery_date_str, "%m-%d-%Y").date() if delivery_date_str else None

                order_date_str = row.pop("order_date", None)
                order_date = datetime.strptime(order_date_str, "%m-%d-%Y").date() if order_date_str else None

                pp_obj = (
                    PickupPoint.objects.get(id=pp)
                    if PickupPoint.objects.filter(id=pp).exists()
                    else PickupPoint.objects.first()
                )

                status = "completed" if row.pop("status", None) == "Завершен" else "new"

                user_obj = User.objects.get(full_name=row["client_name"])
                order, created = Order.objects.get_or_create(
                    id=row["id"],
                    pickup_point=pp_obj,
                    user=user_obj,
                    delivery_date=delivery_date,
                    order_date=order_date,
                    status=status,
                    defaults=row,
                )
                if created and items_string:
                    items = items_string.split(", ")
                    for i in range(0, len(items), 2):
                        art = items[i].strip()
                        prod = Product.objects.get(article=art)
                        OrderItem.objects.create(
                            order=order, product=prod, count=int(items[i+1])
                        )