Compare commits

..

10 Commits

27 changed files with 412 additions and 135 deletions

View File

@@ -77,8 +77,6 @@ networks:
# TODO
- Default value of association "Pagamento effettuato"
- import of storage, computers, courses.
- Tables Sorting with filters
# Licence

View File

@@ -4,6 +4,7 @@
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from datetime import datetime, timedelta
from logging import disable
from django import forms
from django.forms import SelectDateWidget, ModelForm, formset_factory, BaseFormSet
from .models import Supplier, Bundle, Computer, Accessory, Course, Student, Record, validate_image, StudentViewEditModel, Ticket
@@ -15,12 +16,11 @@ class BundleForm(forms.ModelForm):
("Accessory", "Accessorio"),
("Computer", "Computer")
)
product_type = forms.ChoiceField(choices=type_choices, initial="")
delivery_date = forms.DateField(widget=SelectDateWidget(), initial=datetime.now().date() )
product_type = forms.ChoiceField(choices=type_choices, initial="", label= "Tipo prodotto")
delivery_date = forms.DateField(widget=SelectDateWidget(), initial=datetime.now().date(), label="Data di Consegna")
class Meta:
model = Bundle
fields = "__all__"
labels = {
"product_type": "Tipo Prodotto",
"product_name": "Nome Prodotto",
@@ -89,6 +89,34 @@ class SupplierForm(forms.ModelForm):
class ComputerForm(forms.ModelForm):
choice = (
("assigned", "Assegnato"),
("in_stock", "In Magazzino"),
("eol", "Eol"),
("damaged", "Danneggiato"),
("replaced", "Sostituito"),
("in_repearing", "In Riparazione"),
("disposed", "Smaltito")
)
choice_motv = (
(None, "Seleziona un motivo"),
("deposit_paid", "Pagamento Effettuato"),
("replacement", "Sostitutivo"),
("temporary", "Temporaneo")
)
choice_retmotv = (
(None, "Seleziona un motivo"),
("student_resigned", "Studente Dimesso"),
("damaged","Danneggato"),
("not_necessary", "Non più necessario"),
)
status = forms.ChoiceField(choices=choice, initial = "", label="Status")
assignment_date = forms.DateField(widget=SelectDateWidget(), label="Data di assegnazione", required=False)
assignment_motivation = forms.ChoiceField(choices=choice_motv, label="Motivazione di assegnazione", required=False)
return_date = forms.DateField(widget=SelectDateWidget(), label="Data di restituzione", required=False)
return_motivation = forms.ChoiceField(choices=choice_retmotv, label="Motivazione di restituzione", required=False)
eol_date = forms.DateField(widget=SelectDateWidget(), label="Data di Eol: ", required= False, disabled=True)
class Meta:
model = Computer
fields = "__all__"
@@ -104,9 +132,13 @@ class ComputerForm(forms.ModelForm):
"eol_date": "Data di eol",
"notes": "Note",
"cespite": "Cespite",
"serial": "Seriale"
"serial": "Seriale",
"is_deleted": "É cancellato?"
}
class CespiteForm(forms.Form):
cespite = forms.CharField(label="Cespite")
serial = forms.CharField(label="Seriale")
class AccessoryForm(forms.ModelForm):
class Meta:
@@ -120,6 +152,30 @@ class AccessoryForm(forms.ModelForm):
class EditAccessoryForm(forms.ModelForm):
choice= (
("assigned", "Assegnato"),
("in_stock", "In Magazzino"),
("damaged", "Danneggiato"),
("replaced", "Sostituito"),
("in_repearing", "In Riparazione"),
("disposed","Smaltito")
)
choice_motv = (
(None, "Seleziona un motivo"),
("needed", "Necessario"),
("replacement", "Sostitutivo"),
("temporary", "Temporaneo")
)
choice_retmotv = (
(None, "Seleziona un motivo"),
("not_necessary", "Non più necessario"),
("damaged", "Danneggiato")
)
status = forms.ChoiceField(choices=choice, initial = "", label="Status")
assignment_date = forms.DateField(widget=SelectDateWidget(), label="Data di assegnazione", required=False)
assignment_motivation = forms.ChoiceField(choices=choice_motv, label="Motivazione di assegnazione", required=False)
return_date = forms.DateField(widget=SelectDateWidget(), label="Data di restituzione", required=False)
return_motivation = forms.ChoiceField(choices=choice_retmotv, label="Motivazione di restituzione", required=False)
class Meta:
model = Accessory
fields = "__all__"
@@ -135,13 +191,6 @@ class EditAccessoryForm(forms.ModelForm):
"return_motivation": "Motivazione di restituzione",
"notes": "Note",
}
exclude = [
"assignment_date",
"assignment_motivation",
"return_date",
"return_motivation"
]
class CSVUpdateForm(forms.Form):
file = forms.FileField(label="Seleziona un file CSV")
@@ -162,7 +211,6 @@ class CourseForm(forms.ModelForm):
class ResignationForm(forms.ModelForm):
resignation_date = forms.DateField(widget=SelectDateWidget(), label="Data di Dimissioni:", initial=datetime.now().date())
class Meta:
model = Student
@@ -170,6 +218,14 @@ class ResignationForm(forms.ModelForm):
class StudentForm(forms.ModelForm):
choice=(
("ok","Ok"),
("resigned", "Dimesso")
)
birth_date = forms.DateField(widget=SelectDateWidget(), label="Data di Nascita")
resignation_date = forms.DateField(widget=SelectDateWidget(), required=False, label="Data di Dimissioni:")
student_status = forms.ChoiceField(choices=choice, label="Status Studente")
class Meta:
model = Student
fields= "__all__"
@@ -197,7 +253,7 @@ class StudentForm(forms.ModelForm):
"nation_birth": "Nazione di Nascita",
"course_id": "Corso"
}
exclude = ["course_acronym", "course_code", "course_status", "course_year", "course_name"]
exclude = ["course_code", "course_status", "course_year", "course_name"]
class AssignmentComputerForm(forms.Form):
@@ -208,7 +264,6 @@ class AssignmentComputerForm(forms.Form):
)
course_code = forms.CharField(label="Codice Corso", max_length=255)
codice_fiscale = forms.CharField(label="Codice Fiscale", max_length=255)
cespite = forms.CharField(label="Cespite", max_length=255)
serial = forms.CharField(label="Seriale", max_length=255)
assignment_date = forms.DateField(widget=SelectDateWidget(), label="Data di assegnazione", initial=datetime.now().date)
assignment_motivation = forms.ChoiceField(choices=choice)

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.16 on 2024-10-24 14:51
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('gestionale', '0002_supplier_is_deleted'),
]
operations = [
migrations.RemoveField(
model_name='student',
name='id_student_course',
),
]

View File

@@ -87,7 +87,6 @@ class Student(models.Model):
birth_date = models.DateField()
codice_fiscale = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
id_student_course = models.IntegerField(blank= True, null=True)
course_acronym = models.CharField(max_length=255)
email_user = models.EmailField(max_length=255)
phone_number = models.CharField(max_length=255)

View File

@@ -15,6 +15,8 @@
<div class="benvenuto">
<h3>Stai aggiungendo un seriale al bundle</h3>
</div>
<a href="/import/serials" class="pure-button pure-button-primary add-button">Importa Seriali</a>
<a href="/storage" class="pure-button pure-button-primary add-button">Ritorna al Magazzino</a>
<form action="/add/serial" method="post" class="pure-form pure-form-2 pure-form-stacked">
{% csrf_token %}
<div class="form-content width-100">

View File

@@ -21,24 +21,35 @@
viewBox="0 0 16 16">
<path d="M13.5 3a.5.5 0 0 1 .5.5V11H2V3.5a.5.5 0 0 1 .5-.5zm-11-1A1.5 1.5 0 0 0 1 3.5V12h14V3.5A1.5 1.5 0 0 0 13.5 2zM0 12.5h16a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 0 12.5"/>
</svg>
Computer
<p>Computer</p>
</div>
</a>
<a href="/assignment/cespite">
<div class="link-card">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-123" viewBox="0 0 16 16">
<path d="M2.873 11.297V4.142H1.699L0 5.379v1.137l1.64-1.18h.06v5.961zm3.213-5.09v-.063c0-.618.44-1.169 1.196-1.169.676 0 1.174.44 1.174 1.106 0 .624-.42 1.101-.807 1.526L4.99 10.553v.744h4.78v-.99H6.643v-.069L8.41 8.252c.65-.724 1.237-1.332 1.237-2.27C9.646 4.849 8.723 4 7.308 4c-1.573 0-2.36 1.064-2.36 2.15v.057zm6.559 1.883h.786c.823 0 1.374.481 1.379 1.179.01.707-.55 1.216-1.421 1.21-.77-.005-1.326-.419-1.379-.953h-1.095c.042 1.053.938 1.918 2.464 1.918 1.478 0 2.642-.839 2.62-2.144-.02-1.143-.922-1.651-1.551-1.714v-.063c.535-.09 1.347-.66 1.326-1.678-.026-1.053-.933-1.855-2.359-1.845-1.5.005-2.317.88-2.348 1.898h1.116c.032-.498.498-.944 1.206-.944.703 0 1.206.435 1.206 1.07.005.64-.504 1.106-1.2 1.106h-.75z"/>
</svg>
<p>Cespite</p>
</div>
</a>
<a href="/assignment/accessory">
<div class="link-card">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-mouse3"
viewBox="0 0 16 16">
<path d="M7 0q-.891.002-1.527.463c-.418.302-.717.726-.93 1.208C4.123 2.619 4 3.879 4 5.187v.504L3.382 6A2.5 2.5 0 0 0 2 8.236v2.576C2 13.659 4.22 16 7 16h2c2.78 0 5-2.342 5-5.188V5.186c0-1.13-.272-2.044-.748-2.772-.474-.726-1.13-1.235-1.849-1.59C9.981.123 8.26 0 7 0m2.5 6.099V1.232c.51.11 1.008.267 1.46.49.596.293 1.099.694 1.455 1.24.355.543.585 1.262.585 2.225v1.69zm-1-5.025v4.803L5 5.099c.006-1.242.134-2.293.457-3.024.162-.366.363-.63.602-.801C6.292 1.105 6.593 1 7 1c.468 0 .98.018 1.5.074M5 6.124 13 7.9v2.912C13 13.145 11.19 15 9 15H7c-2.19 0-4-1.855-4-4.188V8.236a1.5 1.5 0 0 1 .83-1.342l.187-.093c.01.265.024.58.047.92.062.938.19 2.12.462 2.937a.5.5 0 1 0 .948-.316c-.227-.683-.35-1.75-.413-2.688a29 29 0 0 1-.06-1.528v-.002z"/>
</svg>
Accessorio
<p>Accessorio</p>
</div>
</a>
</div>
</div>
</div>
</div>
{% endif %}
{% endblock %}
{% endblock %}

View File

@@ -0,0 +1,31 @@
<!-- Copyright (C) 2024 Nastro_ -->
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at https://mozilla.org/MPL/2.0/. -->
{% extends "gestionale/base.html" %}
{% load static %}
{% block content %}
{% if user.is_authenticated %}
{% if success == True %}
<div>
<p>Cespite assegnato con successo!</p>
</div>
{% endif %}
{% if err == True %}
<div>
<p>{{ err_str }}</p>
</div>
{% endif %}
<form action="/assignment/cespite" method="post" class="pure-form pure-form-2 pure-form-stacked">
{% csrf_token %}
<div class="form-content width-100">
{{ form }}
</div>
<div class="form-buttons">
<button type="submit" class="pure-button pure-button-primary">Assegna</button>
<button type="reset" class="pure-button button-warning">Reset</button>
</div>
</form>
{% endif %}
{% endblock %}

View File

@@ -20,12 +20,12 @@
<div class="pure-menu pure-menu-horizontal">
<a href="/" class="pure-menu-heading pure-menu-link"><img src="{% static 'images/xlogo-itsaltoadriatico.svg' %}" width="150px"></a>
<ul class="pure-menu-list">
<li class="pure-menu-item">
<a href="/storage" class="pure-menu-link">Magazzino</a>
</li>
<li class="pure-menu-item">
<a href="/suppliers" class="pure-menu-link">Fornitori</a>
</li>
<li class="pure-menu-item">
<a href="/storage" class="pure-menu-link">Magazzino</a>
</li>
<li class="pure-menu-item">
<a href="/courses" class="pure-menu-link">Corsi</a>
</li>

View File

@@ -7,7 +7,12 @@
{% load static %}
{% block content %}
{% if user.is_authenticated %}
<div class="detail-content">
{% if bundle.product_type == "Computer" %}
<a href="/import/serials" class="pure-button pure-button-primary add-button">Importa Computer</a>
<a href="/export/computers/{{ bundle.id }}" class="pure-button pure-button-primary add-button">Esporta Computer Assegnati</a>
{% endif %}
<table class="pure-table pure-table-horizontal width-100">
<thead>
<tr>
@@ -178,4 +183,4 @@
</div>
{% endif %}
{% endif %}
{% endblock %}
{% endblock %}

View File

@@ -22,7 +22,6 @@
<li>Data di Nascita: {{ student.birth_date }}</li>
<li>Codice Fiscale: {{ student.codice_fiscale }}</li>
<li>Sesso: {{ student.gender }}</li>
<li>Id Studente Corso: {{ student.id_student_course }}</li>
<li>Sigla Corso: {{ student.course_acronym }}</li>
</ul>
</div>
@@ -166,4 +165,4 @@
</table>
</div>
{% endif %}
{% endblock %}
{% endblock %}

View File

@@ -12,16 +12,16 @@
<p>{{ err_str }}</p>
</div>
{% endif %}
<h3>Stai modificando: </h3>
<h3>Stai modificando lo studente {{ id }}:</h3>
<form action="/edit/student/{{ id }}" method="post" enctype="multipart/form-data" class="pure-form pure-form-2 pure-form-stacked">
{% csrf_token %}
<div class="from-content width-100">
{{ form }}
</div>
<div class="form-buttons">
<button type="submit" class="pure-button pure-button-primary">Modifica</button>
<button type="reset" class="pure-button button-warning">Reset</button>
</div>
</div>
<div class="form-buttons">
<button type="submit" class="pure-button pure-button-primary">Modifica</button>
<button type="reset" class="pure-button button-warning">Reset</button>
</div>
</form>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,28 @@
<!-- Copyright (C) 2024 Nastro_ -->
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at https://mozilla.org/MPL/2.0/. -->
{% extends "gestionale/base.html" %}
{% load static %}
{% block content %}
{% if user.is_authenticated %}
{% if err == True %}
<div>
{{ e }}
</div>
{% endif %}
<div class="import-card">
<div>
<form action="/import/courses" method="post" enctype="multipart/form-data" class="pure-form pure-form-stacked">
{% csrf_token %}
<div class="form-content">
{{ form }}
</div>
<button type="submit" class="pure-button pure-button-primary">Carica</button>
<button type="reset" class="pure-button button-warning">Reset</button>
</form>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,28 @@
<!-- Copyright (C) 2024 Nastro_ -->
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at https://mozilla.org/MPL/2.0/. -->
{% extends "gestionale/base.html" %}
{% load static %}
{% block content %}
{% if user.is_authenticated %}
{% if err == True %}
<div>
{{ e }}
</div>
{% endif %}
<div class="import-card">
<div>
<form action="/import/serials" method="post" enctype="multipart/form-data" class="pure-form pure-form-stacked">
{% csrf_token %}
<div class="form-content">
{{ form }}
</div>
<button type="submit" class="pure-button pure-button-primary">Carica</button>
<button type="reset" class="pure-button button-warning">Reset</button>
</form>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -9,6 +9,8 @@
{% block content %}
{% if user.is_authenticated %}
<a href="/add/course" class="pure-button pure-button-primary add-button">Aggiungi Corso</a>
<a href="/import/courses" class="pure-button pure-button-primary add-button">Importa Corsi</a>
<table class="pure-table pure-table-horizontal width-100">
<thead>
<tr>

View File

@@ -23,7 +23,6 @@
<li>Data di Nascita: {{ student.birth_date }}</li>
<li>Codice Fiscale: {{ student.codice_fiscale }}</li>
<li>Sesso: {{ student.gender }}</li>
<li>Id Studente Corso: {{ student.id_student_course }}</li>
<li>Sigla Corso: {{ student.course_acronym }}</li>
</ul>
</div>

View File

@@ -24,10 +24,10 @@ urlpatterns = [
path("assignment", views_assignment.assignment, name="assignment"),
path("assignment/computer", views_assignment.assignment_computer, name="assignment_computer"),
path("assignment/accessory", views_assignment.assignment_accessory, name="assignment_accessory"),
path("assignment/cespite", views_assignment.assignment_cespite, name="assignment_cespite"),
path("add/bundle", views_add.add_bundle, name="add_bundle"),
path("add/supplier", views_add.add_supplier, name="add_supplier"),
path("add/serial", views_add.add_serial, name="add_serial"),
path("add/serial", views_add.add_serial, name="add_serial"),
path("add/accessory", views_add.add_accessory, name="add_accessory"),
path("add/course", views_add.add_course, name="add_course"),
path("add/ticket", views_add.add_ticket, name="add_ticket"),
@@ -57,7 +57,11 @@ urlpatterns = [
path("reset/accessory/<int:id>", views_reset.reset_accessory, name="reset_accessory"),
path("import/students", views.import_students, name="import_students"),
path("import/serials", views.import_serials, name="import_serials"),
path("import/courses", views.import_courses, name="import_courses"),
path("export/computers/<int:id_b>", views.export_computers, name="export_computers"),
path("toggle/course/<int:id>", views.toggle_course, name="toggle_course"),
path("take/ticket/<int:id>", views.take_ticket, name="take_ticket"),

View File

@@ -8,6 +8,7 @@ import copy
import csv
from datetime import datetime
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.views.defaults import bad_request
@@ -43,7 +44,7 @@ def import_students(request):
if not csv_file.name.endswith(".csv"):
form = CSVUpdateForm()
err = True
return render(request, "gestionale/importstudents.html", {
return render(request, "gestionale/import/students.html", {
"err": err, "form": form
})
try:
@@ -58,15 +59,18 @@ def import_students(request):
csv_data = csv_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(csv_data)
for row in reader:
course = get_object_or_404(Course, course_code=row["Codice Corso"])
birth_date = datetime.strptime(row["DataNascita"], "%d/%m/%Y")
course = get_object_or_404(Course, course_code=row["CodiceCorso"])
birth_date = datetime.strptime(row["DataNascita"], "%m/%d/%Y")
if row["DataDimissioni"] == "":
resignation_date = None
else:
resignation_date = datetime.strptime(row["DataDimissioni"], "%m/%d/$Y")
student = Student()
student.id_student_course = row["IDAllievoCorso"]
student.codice_fiscale = row["CodiceFiscale"]
student.course_acronym = row["SiglaCorso"]
student.course_acronym = row["AcronimoCorso"]
student.last_name = row["Cognome"]
student.first_name = row["Nome"]
student.email_user = row["EmailUser"]
student.email_user = f"{row['Nome'].strip().replace(" ", "").lower()}.{row['Cognome'].strip().replace(" ","").lower()}@stud.itsaltoadriatico.it" if row["EmailGSuite"] == "" else row["EmailGSuite"].lower()
student.phone_number = row["Tel"]
student.municipality_residence = row["ComuneRes"]
student.province_residence = row["ProvRes"]
@@ -74,90 +78,96 @@ def import_students(request):
student.birth_date = birth_date
student.municipality_birth = row["ComuneNascita"]
student.province_birth = row["ProvNascita"]
student.resignation_date = None if row["DataDimissioni"]=="" else row["DataDimissioni"]
student.gender = row["Genere"]
student.resignation_date = resignation_date
student.gender = row["Sex"]
student.nation_birth = row["NazioneNasc"]
student.course_id = course
student.save()
except Exception as e:
form = CSVUpdateForm()
err = True
return render(request, "gestionale/importstudents.html", {
return render(request, "gestionale/import/students.html", {
"err": err, "form": form, "e": e
})
return redirect('import_students')
else:
form = CSVUpdateForm()
err = True
return render(request, "gestionale/importstudents.html", {
return render(request, "gestionale/import/students.html", {
"err": err, "form": form
})
else:
form = CSVUpdateForm()
return render(request, "gestionale/importstudents.html", {
return render(request, "gestionale/import/students.html", {
"form": form
})
def import_bundle(request):
def import_courses(request):
if request.method == "POST":
form = CSVUpdateForm(request.POST, request.FILES)
if form.is_valid():
csv_file = request.FILES["file"]
if not csv_file.name.endswith(".csv"):
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/courses.html",{
"err": err, "form": form
})
try:
record = Record()
record.date = datetime.now().date()
record.action = "import"
record.product = "courses"
record.product_detail = csv_file
record.user = request.user
record.save()
csv_data = csv_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(csv_data)
for row in reader:
course = Course()
course.course_name = row["Nome"]
course.course_name_extended = row["NomeEsteso"]
course.course_code = row["Codice"]
course.course_year = row["Anno"]
course.course_location = row["Posizione"]
course.student_number = row["NumeroStudenti"]
if row["Status"] == 0:
course.course_status = False
else:
course.course_status = True
course.save()
return redirect("courses")
except Exception as e:
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/courses.html", {
"err": err, "form": form, "e": e})
else:
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/courses.html", {
"err": err, "form": form
})
else:
form = CSVUpdateForm()
return render(request, "gestionale/import/courses.html", {
"form": form
})
def import_serials(request):
if request.method == "POST":
form = CSVUpdateForm(request.POST, request.FILES)
if form.is_valid():
csv_file = request.FILES["file"]
if not csv_file.endswith(".csv"):
if not csv_file.name.endswith(".csv"):
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/bundle.html",{
"err": err, "form": form
})
try:
record = Record()
record.date = datetime.now().date()
record.action = "import"
record.product = "bundle"
record.user = request.user
record.save()
csv_data = csv_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(csv_data)
for row in reader:
pass
except:
if request.method == "POST":
form = CSVUpdateForm(request.POST, request.FILES)
if form.is_valid():
csv_file = request.FILES["file"]
if not csv_file.endswith(".csv"):
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/bundle.html",{
"err": err, "form": form
})
try:
record = Record()
record.date = datetime.now().date()
record.action = "import"
record.product = "bundle"
record.user = request.user
record.save()
csv_data = csv_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(csv_data)
for row in reader:
pass
except:
pass
passpass
pass
def import_computers(request):
if request.method == "POST":
form = CSVUpdateForm(request.POST, request.FILES)
if form.is_valid():
csv_file = request.FILES["file"]
if not csv_file.endswith(".csv"):
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/computers.html",{
return render(request, "gestionale/import/serials.html",{
"err": err, "form": form
})
try:
@@ -165,24 +175,42 @@ def import_computers(request):
record.date = datetime.now().date()
record.action = "import"
record.product = "computers"
record.product_detail = csv_file
record.user = request.user
record.save()
csv_data = csv_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(csv_data)
for row in reader:
bundle= get_object_or_404(Bundle, id = row["Id Bundle"])
pass
except:
pass
bundle = get_object_or_404(Bundle, id = row["IdBundle"])
computer = Computer()
computer.id_bundle = bundle
computer.status = "in_stock"
computer.serial = row["Seriale"]
computer.is_deleted = False
computer.eol = False
computer.eol_date = None
computer.save()
def import_accessories(request):
pass
def import_courses(request):
pass
return redirect("storage")
except Exception as e:
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/serials.html", {
"err": err, "form": form, "e": e})
else:
form = CSVUpdateForm()
err = True
return render(request, "gestionale/import/serials.html", {
"err": err, "form": form
})
else:
form = CSVUpdateForm()
return render(request, "gestionale/import/serials.html", {
"form": form
})
@user_passes_test(lambda u: u.is_superuser or u.is_staff )
def toggle_course(request, id):
@@ -215,3 +243,24 @@ def take_ticket(request, id):
return redirect("tickets")
else:
return bad_request
@user_passes_test(lambda u: u.is_superuser or u.is_staff )
def export_computers(request, id_b):
response = HttpResponse(
content_type="text/csv",
headers={"Content-Disposition": "attachment; filename=export_computers.csv"}
)
writer = csv.writer(response)
writer.writerow(["Nome", "Cognome", "Corso", "CodiceFiscale", "Cespite", "Seriale", "DataConsegna"])
computers = Computer.objects.filter(status="assigned", id_bundle = id_b).order_by("id")
for computer in computers:
writer.writerow([
computer.id_student.first_name,
computer.id_student.last_name,
computer.id_student.course_id.course_name,
computer.id_student.codice_fiscale,
computer.cespite,
computer.serial,
computer.assignment_date
])
return response

View File

@@ -87,7 +87,7 @@ def add_supplier(request):
return render(request, "gestionale/add/addsupplier.html", {
"form": form, "err": err
})
return redirect('storage')
return redirect('suppliers')
else:
form = SupplierForm()
return render(request, "gestionale/add/addsupplier.html", {
@@ -95,7 +95,7 @@ def add_supplier(request):
})
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def add_serial(request):
def add_serial(request, form_serial=None):
bundle = Bundle.objects.last()
qt = range(bundle.qt)
if request.method == "POST":
@@ -122,9 +122,8 @@ def add_serial(request):
record.user = request.user
record.save()
return redirect('storage')
except ValidationError:
err = True
err_str = "L'inserimento é errato o incompleto!"

View File

@@ -11,7 +11,7 @@ from django.http import Http404
from django.shortcuts import render, get_object_or_404, redirect
from django.views.defaults import bad_request
from ..forms import AssignmentComputerForm, AssignmentAccessoryForm
from ..forms import AssignmentComputerForm, AssignmentAccessoryForm, CespiteForm
from ..models import Computer, Accessory, Student, Course, Record
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
@@ -23,6 +23,7 @@ def assignment(request):
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def assignment_computer(request):
success_ = None
if request.method == "POST":
form = AssignmentComputerForm(request.POST)
if form.is_valid():
@@ -35,7 +36,6 @@ def assignment_computer(request):
computer_copy = copy.deepcopy(computer)
record.prev_product_detail = computer_copy
eol_date = (form["assignment_date"] + timedelta(days=1460))
computer.cespite = form["cespite"]
computer.status = "assigned"
computer.id_student = student
computer.assignment_date = form["assignment_date"]
@@ -52,17 +52,19 @@ def assignment_computer(request):
except Http404:
form = AssignmentComputerForm()
success_ = False
err = True
err_str = "Uno o più dei valori inseriti non é stato trovato"
return render(request, "gestionale/assignment/assignment_computer.html", {
"err": err, "err_str": err_str, "form": form
"err": err, "err_str": err_str, "form": form, "success": success_
})
else:
form = AssignmentComputerForm()
success_ = False
err = True
err_str = "L'inserimento è incompleto o errato!"
return render(request, "gestionale/assignment/assignment_computer.html", {
"err": err, "err_str": err_str, "form": form
"err": err, "err_str": err_str, "form": form, "success": success_
})
return redirect("assignment_computer")
else:
@@ -70,11 +72,12 @@ def assignment_computer(request):
err = False
err_str = ""
return render(request, "gestionale/assignment/assignment_computer.html", {
"form": form, "err": err, "err_str": err_str
"form": form, "err": err, "err_str": err_str, "success": success_
})
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def assignment_accessory(request):
success_ = None
if request.method == "POST":
form = AssignmentAccessoryForm(request.POST)
if form.is_valid():
@@ -101,17 +104,19 @@ def assignment_accessory(request):
except Http404:
form = AssignmentAccessoryForm()
success_ = False
err = True
err_str = "Uno o più dei valori inseriti non é stato trovato"
return render(request, "gestionale/assignment/assignment_accessory.html", {
"err": err, "err_str": err_str, "form": form
"err": err, "err_str": err_str, "form": form, "success": success_
})
else:
form = AssignmentAccessoryForm()
success_ = False
err = True
err_str = "L'inserimento è incompleto o errato!"
return render(request, "gestionale/assignment/assignment_accessory.html", {
"err": err, "err_str": err_str, "form": form
"err": err, "err_str": err_str, "form": form, "success": success_
})
return redirect("assignment_accessory")
else:
@@ -119,5 +124,51 @@ def assignment_accessory(request):
err = False
err_str = ""
return render(request, "gestionale/assignment/assignment_accessory.html", {
"form": form, "err": err, "err_str": err_str
"form": form, "err": err, "err_str": err_str, "success": success_
})
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def assignment_cespite(request):
success_ = None
if request.method == "POST":
form = CespiteForm(request.POST)
if form.is_valid():
form = form.cleaned_data
try:
record = Record()
computer = get_object_or_404(Computer, serial=form["serial"])
computer_copy = copy.deepcopy(computer)
computer.cespite = form["cespite"]
computer.save()
record.date = datetime.now().date()
record.action = "assignment"
record.product = "cespite"
record.product_detail = computer
record.prev_product_detail = computer_copy
record.user = request.user
record.save()
except Http404:
form = CespiteForm()
success_ = False
err = True
err_str = "Uno o più dei valori inseriti non é stato trovato"
return render(request, "gestionale/assignment/cespite.html", {
"err": err, "err_str": err_str, "form": form, "success": success_
})
return redirect("assignment_cespite")
else:
form = CespiteForm()
success_ = False
err = True
err_str = "L'inserimento é incompleto o errato!"
return render(request, "gestionale/assignment/cespite.html", {
"form": form, "err": err, "err_str": err_str , "success": success_ })
else:
form = CespiteForm()
err = False
err_str = ""
return render(request, "gestionale/assignment/cespite.html", {
"form": form , "err": err, "err_str": err_str, "success": success_ })

View File

@@ -64,7 +64,7 @@ def delete_supplier(request, id):
supplier.is_deleted = True
record.date = datetime.now().date()
record.action = "reset"
record.action = "delete"
record.product = "supplier"
record.user = request.user
record.save()
@@ -91,7 +91,7 @@ def delete_computer(request, id):
computer.delete()
record.date = datetime.now().date()
record.action = "reset"
record.action = "delete"
record.product = "computer"
record.user = request.user
record.save()
@@ -118,8 +118,8 @@ def delete_accessory(request, id):
accessory.delete()
record.date = datetime.now().date()
record.action = "reset"
record.product = "computer"
record.action = "delete"
record.product = "accessory"
record.user = request.user
record.save()

View File

@@ -18,9 +18,9 @@ def details_bundle(request, id):
computers = None
accessories = None
if bundle.product_type == "Computer":
computers = Computer.objects.filter(id_bundle_id=id)
computers = Computer.objects.filter(id_bundle_id=id).order_by("id")
if bundle.product_type == "Accessory":
accessories = Accessory.objects.filter(id_bundle_id=id)
accessories = Accessory.objects.filter(id_bundle_id=id).order_by("id")
if request.method == "GET":
return render(request, "gestionale/details/detailsbundle.html", {
"bundle": bundle, "computers": computers, "accessories": accessories, "bundle_type": bundle_type,
@@ -32,7 +32,7 @@ def details_bundle(request, id):
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def details_course(request, id):
course = get_object_or_404(Course, id=id)
students = Student.objects.filter(course_id= id)
students = Student.objects.filter(course_id=id).order_by("id")
if request.method == "GET":
return render(request, "gestionale/details/detailscourse.html", {
"course": course, "students": students
@@ -43,8 +43,8 @@ def details_course(request, id):
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def details_student(request, id):
student = get_object_or_404(Student, id=id)
computers = Computer.objects.filter(id_student_id=id)
accessories = Accessory.objects.filter(id_student_id=id)
computers = Computer.objects.filter(id_student_id=id).order_by("id")
accessories = Accessory.objects.filter(id_student_id=id).order_by("id")
if request.method == "GET":
return render(request, "gestionale/details/detailsstudent.html", {
"student": student, "computers": computers, "accessories": accessories

View File

@@ -11,7 +11,7 @@ from ..models import Bundle, Supplier, Student, Course, Ticket
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def storage(request):
bundles = Bundle.objects.all()
bundles = Bundle.objects.all().order_by("-id")
if request.method == "GET":
return render(request, "gestionale/list/storage.html", {
"bundles": bundles
@@ -31,7 +31,7 @@ def suppliers(request):
@user_passes_test(lambda u: u.is_superuser or u.is_staff)
def students(request):
students = Student.objects.all().order_by("course_acronym")
students = Student.objects.all().order_by("course_id")
if request.method == "GET":
return render(request, "gestionale/list/students.html", {
"students": students