Varianta finala, inainte de publicare
This commit is contained in:
+3
-3
@@ -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."
|
||||
)
|
||||
|
||||
@@ -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!"))
|
||||
Reference in New Issue
Block a user