Varianta finala, inainte de publicare

This commit is contained in:
2026-09-03 09:53:42 +03:00
parent ce5028a27f
commit 2f4c19b653
10 changed files with 1087 additions and 3 deletions
+3 -3
View File
@@ -60,7 +60,7 @@ class ComputerForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields["assigned_to"].disabled = True
# self.fields["assigned_to"].disabled = True
self.fields["assigned_to"].help_text = (
"Transferul se face doar generând un Proces Verbal nou."
)
@@ -99,7 +99,7 @@ class MonitorForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields["assigned_to"].disabled = True
# self.fields["assigned_to"].disabled = True
self.fields["assigned_to"].help_text = (
"Transferul se face doar generând un Proces Verbal nou."
)
@@ -138,7 +138,7 @@ class PeripheralForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields["assigned_to"].disabled = True
# self.fields["assigned_to"].disabled = True
self.fields["assigned_to"].help_text = (
"Transferul se face doar generând un Proces Verbal nou."
)
View File
@@ -0,0 +1,159 @@
import csv
from datetime import datetime
from django.utils import timezone
from django.core.management.base import BaseCommand
from users.models import Employee
from equipment.models import Computer, Monitor, Peripheral
class Command(BaseCommand):
help = "Importă date din CSV-urile exportate din Microsoft Access"
def handle(self, *args, **kwargs):
# Setăm delimiterul corect (poate fi ',' sau ';' în funcție de setările tale regionale la export)
CSV_DELIMITER = ","
# Dicționar pentru a lega ID-ul vechi din Access de noul obiect Employee din Django
employee_map = {}
# Funcție ajutătoare pentru a evita erorile la date calendaristice goale
# Funcție ajutătoare pentru conversia datelor din DD-MM-YYYY în YYYY-MM-DD
def parse_date(date_str):
# Definim data de rezervă dacă rubrică e goală
fallback_date = "2000-01-01"
if not date_str or str(date_str).strip() == "":
return fallback_date
clean_str = str(date_str).strip()
try:
parsed = datetime.strptime(clean_str, "%d-%m-%Y")
return parsed.strftime("%Y-%m-%d")
except ValueError:
try:
parsed = datetime.strptime(clean_str, "%d/%m/%Y")
return parsed.strftime("%Y-%m-%d")
except ValueError:
# Dacă data există dar formatul e complet invalid, punem tot fallback
self.stdout.write(
self.style.WARNING(
f"Atenție: Data '{clean_str}' e invalidă. Folosim data de azi."
)
)
return fallback_date
# 1. IMPORTUL ANGAJAȚILOR
self.stdout.write("Începe importul angajaților...")
try:
with open("Employee.csv", "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file, delimiter=CSV_DELIMITER)
for row in reader:
emp, created = Employee.objects.get_or_create(
username=row["username"],
defaults={
"name": row["name"],
"role": row.get("role", ""),
"office_number": row.get("office_number", ""),
"email": row.get("email", ""),
},
)
# Salvăm instanța generată în dicționar, folosind ID-ul vechi din CSV ca și cheie
employee_map[row["ID"]] = emp
if created:
self.stdout.write(f" Adăugat angajat: {emp.name}")
except FileNotFoundError:
self.stdout.write(
self.style.ERROR("Eroare: Nu am găsit fișierul Employee.csv")
)
# 2. IMPORTUL CALCULATOARELOR
self.stdout.write("\nÎncepe importul calculatoarelor...")
try:
with open("Computer.csv", "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file, delimiter=CSV_DELIMITER)
for row in reader:
# Folosim numele exact al coloanei specificat de tine (EmpolyeeID)
posesor = employee_map.get(row.get("EmpolyeeID"))
pc, created = Computer.objects.get_or_create(
equipment_code=row["equipment_code"],
defaults={
"entry_date": parse_date(row.get("entry_date")),
"oem_name": row.get("oem_name", ""),
"motherboard": row.get("motherboard", ""),
"cpu": row.get("cpu", ""),
"ram": row.get("ram", ""),
"storage": row.get("storage", ""),
"optical_drive": row.get("optical_drive", ""),
"gpu": row.get("gpu", ""),
"mac_address": row.get("mac_address", ""),
"os_license": row.get("os_license", ""),
"additional_licenses": row.get("additional_licenses", ""),
"observations": row.get("observations", ""),
"status": "activ",
"assigned_to": posesor,
},
)
if created:
self.stdout.write(f" Adăugat PC: {pc.equipment_code}")
except FileNotFoundError:
self.stdout.write(
self.style.ERROR("Eroare: Nu am găsit fișierul Computer.csv")
)
# 3. IMPORTUL MONITOARELOR
self.stdout.write("\nÎncepe importul monitoarelor...")
try:
with open("Monitor.csv", "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file, delimiter=CSV_DELIMITER)
for row in reader:
posesor = employee_map.get(row.get("EmployeeID"))
mon, created = Monitor.objects.get_or_create(
equipment_code=row["equipment_code"],
defaults={
"entry_date": parse_date(row.get("entry_date")),
"name": row.get("name", ""),
"serial_number": row.get("serial_number", ""),
"screen_diagonal": row.get("screen_diagonal", ""),
"observations": row.get("observations", ""),
"status": "activ",
"assigned_to": posesor,
},
)
if created:
self.stdout.write(f" Adăugat Monitor: {mon.equipment_code}")
except FileNotFoundError:
self.stdout.write(
self.style.ERROR("Eroare: Nu am găsit fișierul Monitor.csv")
)
# 4. IMPORTUL PERIFERICELOR
self.stdout.write("\nÎncepe importul perifericelor...")
try:
with open("Peripheral.csv", "r", encoding="utf-8-sig") as file:
reader = csv.DictReader(file, delimiter=CSV_DELIMITER)
for row in reader:
posesor = employee_map.get(row.get("EmployeeID"))
per, created = Peripheral.objects.get_or_create(
equipment_code=row["equipment_code"],
defaults={
"entry_date": parse_date(row.get("entry_date")),
"peripheral_type": row.get("peripheral_type", ""),
"name": row.get("name", ""),
"serial_number": row.get("serial_number", ""),
"observations": row.get("observations", ""),
"status": "activ",
"assigned_to": posesor,
},
)
if created:
self.stdout.write(f" Adăugat Periferic: {per.equipment_code}")
except FileNotFoundError:
self.stdout.write(
self.style.ERROR("Eroare: Nu am găsit fișierul Peripheral.csv")
)
self.stdout.write(self.style.SUCCESS("\nImport finalizat cu succes!"))