Skip to content

Commit 3594fa3

Browse files
authored
Merge branch 'develop' into renovate/Werkzeug-to-3.1.5
2 parents d5d8661 + b677291 commit 3594fa3

File tree

15 files changed

+259
-155
lines changed

15 files changed

+259
-155
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.0-SNAPSHOT
1+
1.5.0

WebApp/PagoPA/settings.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from socket import gethostname
1616

1717
import os
18+
import re
1819

1920
# Build paths inside the project like this: BASE_DIR / 'subdir'.
2021
BASE_DIR = Path(__file__).resolve().parent.parent
@@ -35,6 +36,18 @@
3536
ALLOWED_HOSTS.append(gethostbyname(gethostname()))
3637
USE_X_FORWARDED_HOST = True
3738
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
39+
CSRF_TRUSTED_ORIGINS = []
40+
for singolo_host in ALLOWED_HOSTS:
41+
CSRF_TRUSTED_ORIGINS.extend([
42+
'http://'+singolo_host+':80',
43+
'https://'+singolo_host+':80',
44+
'http://'+singolo_host+':8080',
45+
'https://'+singolo_host+':8080',
46+
'http://'+singolo_host+':443',
47+
'https://'+singolo_host+':443',
48+
'http://'+singolo_host+':8443',
49+
'https://'+singolo_host+':8443'
50+
])
3851
else:
3952
ALLOWED_HOSTS = []
4053

@@ -60,7 +73,7 @@
6073
'whitenoise.middleware.WhiteNoiseMiddleware',
6174
'django.contrib.sessions.middleware.SessionMiddleware',
6275
'django.middleware.common.CommonMiddleware',
63-
#'django.middleware.csrf.CsrfViewMiddleware',
76+
'django.middleware.csrf.CsrfViewMiddleware',
6477
'django.contrib.auth.middleware.AuthenticationMiddleware',
6578
'django.contrib.messages.middleware.MessageMiddleware',
6679
'django.middleware.clickjacking.XFrameOptionsMiddleware',

WebApp/Simulatore/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

44
urlpatterns = [
55
path('risultati/<id_simulazione>', risultati, name='risultati'),
6-
path('confronto_risultati/<id1>/<id2>/', confronto_risultati, name='confronto_risultati'),
6+
path('confronto_risultati/<int:id1>/<int:id2>/', confronto_risultati, name='confronto_risultati'),
77
]

WebApp/Simulatore/views.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from zoneinfo import ZoneInfo
1111
import boto3
1212
from botocore.config import Config
13+
from django.utils.http import url_has_allowed_host_and_scheme
1314
import locale
1415
locale.setlocale(locale.LC_ALL, 'it_IT.UTF-8')
1516

@@ -18,6 +19,9 @@ def homepage(request):
1819
lista_simulazioni = table_simulazione.objects.exclude(STATO='Bozza').order_by('-TIMESTAMP_ESECUZIONE')
1920

2021
for singola_simulazione in lista_simulazioni:
22+
# cambio stato su 'Non completata' se siamo sullo stato 'In lavorazione' da più di 2gg
23+
if singola_simulazione.STATO=='In lavorazione' and singola_simulazione.TIMESTAMP_ESECUZIONE < (datetime.now(ZoneInfo("Europe/Rome")).replace(tzinfo=None) - timedelta(days=2)):
24+
singola_simulazione.STATO = 'Non completata'
2125
# cambio stato su 'In lavorazione' per schedulata con timestamp_esecuzione <= now()
2226
if singola_simulazione.STATO=='Schedulata' and singola_simulazione.TRIGGER=='Schedule' and singola_simulazione.TIMESTAMP_ESECUZIONE <= datetime.now(ZoneInfo("Europe/Rome")).replace(tzinfo=None):
2327
singola_simulazione.STATO = 'In lavorazione'
@@ -378,8 +382,16 @@ def rimuovi_simulazione(request, id_simulazione):
378382
except:
379383
pass
380384

381-
next_url = request.GET.get('next', '/') # fallback alla home
382-
return redirect(next_url)
385+
next_url = request.GET.get('next')
386+
387+
if next_url and url_has_allowed_host_and_scheme(
388+
next_url,
389+
allowed_hosts={request.get_host()},
390+
require_https=request.is_secure(),
391+
):
392+
return redirect(next_url)
393+
394+
return redirect('/')
383395

384396

385397
# AJAX

WebApp/html/home.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,9 +368,9 @@ <h5 class="modal-title" id="modalConfrontoRisultatiLabel{{ forloop.counter }}"><
368368
<!-- funzione per ricondurre alla pagina confronto_risultati cliccando su "Confronta" nella modale -->
369369
<script>
370370
$(document).on('click', '.btn-confronto', function() {
371-
const id1 = document.getElementById('value_id1').textContent;
372-
const id2 = $(`#simulazione_selezionata_per_confronto_${id1}`).val();
373-
const url = `/confronto_risultati/${id1}/${id2}/`;
371+
const id1 = parseInt(document.getElementById('value_id1').textContent);
372+
const id2 = parseInt($(`#simulazione_selezionata_per_confronto_${id1}`).val());
373+
const url = `/confronto_risultati/${encodeURIComponent(id1)}/${encodeURIComponent(id2)}/`;
374374
if (id1!=null && id2!=null){
375375
window.location.href = url;
376376
}

WebApp/html/simulazioni/nuova_simulazione.html

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,9 @@ <h5 class="modal-title" id="exampleModalLabel"></h5>
437437
tipo_capacita_selezionata = document.querySelector('#tipo_capacita_da_modificare').value;
438438
// inseriamo il tipo_capacita_da_modificare nell'intestazione della colonna 'Capacità settimanale'
439439
document.querySelectorAll(".th_capacita_settimanale").forEach(el => {
440-
el.innerHTML = '<br>(' + tipo_capacita_selezionata + ')';
440+
el.textContent = '';
441+
el.appendChild(document.createElement('br'));
442+
el.appendChild(document.createTextNode(`(${tipo_capacita_selezionata})`));
441443
});
442444
// inseriamo il tipo_capacita_da_modificare nel sotto-accordion
443445
document.querySelectorAll(".span_tipo_capacita_selezionata").forEach(span => {
@@ -617,7 +619,7 @@ <h2 class="accordion-header">
617619
const radioSchedule = document.getElementById("inlineRadio1");
618620
const timeSchedule = document.getElementById("timeSchedule");
619621
if (radioSchedule.checked) {
620-
tipo_scheduling.innerHTML = 'Sei sicuro di voler avviare lo scheduling con trigger "Schedule" ('+timeSchedule.value+')?';
622+
tipo_scheduling.textContent = `Sei sicuro di voler avviare lo scheduling con trigger "Schedule" (${timeSchedule.value})?`;
621623
}
622624
else{
623625
tipo_scheduling.innerHTML = 'Sei sicuro di voler avviare lo scheduling con trigger "Now"?';
@@ -802,8 +804,14 @@ <h2 class="accordion-header">
802804
});
803805
</script>
804806

805-
806-
807+
<!-- funzione helper per risolvere vulnerabilità code review automatica github -->
808+
<script>
809+
function tdText(value) {
810+
const td = document.createElement('td');
811+
td.textContent = value;
812+
return td;
813+
}
814+
</script>
807815

808816
<script>
809817
// Funzione per aggiungere una riga alla tabella
@@ -824,21 +832,49 @@ <h2 class="accordion-header">
824832
const celleUltimaRiga = ultimaRigaOriginale.querySelectorAll('td');
825833
let capacita_reale_ultima_riga = celleUltimaRiga[6].textContent.split(" ");
826834
capacita_reale_ultima_riga = capacita_reale_ultima_riga[capacita_reale_ultima_riga.length -1]
835+
836+
nuovaRiga.appendChild(tdText(celleUltimaRiga[0].textContent));
837+
nuovaRiga.appendChild(tdText(celleUltimaRiga[1].textContent));
838+
nuovaRiga.appendChild(tdText(celleUltimaRiga[2].textContent));
839+
nuovaRiga.appendChild(tdText('0'));
840+
841+
// TD con input date (static HTML, ok)
842+
const tdInizio = document.createElement('td');
843+
tdInizio.innerHTML = '<input type="date" class="form-control text-center input_inizioPeriodoValidita" onkeydown="return (event.keyCode!=13);">';
844+
nuovaRiga.appendChild(tdInizio);
845+
846+
const tdFine = document.createElement('td');
847+
tdFine.innerHTML = '<input type="date" class="form-control text-center input_finePeriodoValidita" onkeydown="return (event.keyCode!=13);">';
848+
nuovaRiga.appendChild(tdFine);
849+
850+
// TD capacità (parte dinamica via proprietà, NON HTML)
851+
const tdCapacita = document.createElement('td');
852+
853+
const inputCap = document.createElement('input');
854+
inputCap.type = 'text';
855+
inputCap.className = 'form-control text-center input_capacita';
856+
inputCap.value = capacita_reale_ultima_riga;
857+
858+
const label = document.createElement('label');
859+
label.className = 'm-0 p-0';
860+
label.style.fontSize = '12px';
861+
label.textContent = `Capacità reale: ${capacita_reale_ultima_riga}`;
862+
863+
tdCapacita.appendChild(inputCap);
864+
tdCapacita.appendChild(label);
865+
nuovaRiga.appendChild(tdCapacita);
866+
867+
nuovaRiga.appendChild(tdText('-'));
868+
nuovaRiga.appendChild(tdText(''));
869+
870+
const tdBtn = document.createElement('td');
871+
const btn = document.createElement('button');
872+
btn.type = 'button';
873+
btn.className = 'btn btn-outline-danger btn-sm rimuovi-riga';
874+
btn.textContent = '-';
875+
tdBtn.appendChild(btn);
876+
nuovaRiga.appendChild(tdBtn);
827877

828-
nuovaRiga.innerHTML = `
829-
<td>${celleUltimaRiga[0].textContent}</td>
830-
<td>${celleUltimaRiga[1].textContent}</td>
831-
<td>${celleUltimaRiga[2].textContent}</td>
832-
<td>0</td>
833-
<td><input type="date" class="form-control text-center input_inizioPeriodoValidita" onkeydown="return (event.keyCode!=13);"></td>
834-
<td><input type="date" class="form-control text-center input_finePeriodoValidita" onkeydown="return (event.keyCode!=13);"></td>
835-
<td><input class="form-control text-center input_capacita" autocomplete="off" type="text" inputmode="numeric" step="1" min="0" maxlength="8" value="${capacita_reale_ultima_riga}" onkeydown="return (event.keyCode!=13);" oninput="this.value = this.value.replace(/[^0-9]/g, '')"><label class="m-0 p-0" style="font-size:12px">Capacità reale: ${capacita_reale_ultima_riga}</label></td>
836-
<td>-</td>
837-
<td></td> <!-- colonna alert vuota -->
838-
<td>
839-
<button type="button" class="btn btn-outline-danger btn-sm rimuovi-riga" title="Rimuovi riga">-</button>
840-
</td>
841-
`;
842878

843879
// Aggiungi la nuova riga al tbody
844880
tbody.appendChild(nuovaRiga);
@@ -874,7 +910,6 @@ <h2 class="accordion-header">
874910
});
875911
</script>
876912

877-
878913
<!-- flatpickr per vincoli datepicker STEP 3: l'inizializzazione dei calendari datepicker (flatpickr) dev'essere fatta solo dopo aver caricato l'input con il relativo id -->
879914
<script>
880915
function inizializzazione_datepicker_flatpickr(array_dataminima_nuovariga){

functions/CalcoloPrimaSettimana/lambda_function.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
from datetime import datetime, timedelta
33
from zoneinfo import ZoneInfo
4+
import os
45

56
def lambda_handler(event, context):
67
try:
@@ -15,9 +16,9 @@ def lambda_handler(event, context):
1516
mese = datetime_now.month
1617
anno = datetime_now.year
1718

18-
# REQUISITO: dopo il 16 del mese corrente bisogna processare il mese successivo
19+
# REQUISITO: dopo il cut-off (impostato tramite parametro modificabile) del mese corrente bisogna processare il mese successivo
1920

20-
if giorno > 16:
21+
if giorno > int(os.environ['cutoff']):
2122
# aumentiamo il mese di 1
2223
if mese == 12:
2324
anno = anno + 1

functions/FillCapProvRegFromS3Lookup/lambda_function.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,24 @@ def lambda_handler(event, context):
3535
db_host = os.environ['DB_HOST']
3636
db_name = os.environ['DB_NAME']
3737
db_port = os.environ['DB_PORT']
38+
s3_bucket = os.environ['source_bucket']
3839
# recupero credenziali da SecretsManager
3940
creds = get_db_credentials(secretsManager_SecretId)
4041
# connessione db
4142
conn = get_connection(db_host, db_name, db_port, creds)
4243

4344
# recupero record da csv salvato su s3
44-
rows = read_csv_from_s3("pn-simulatore-recapiti-hesplora-dev", "dataset_db/regione_provincia_cap.csv")
45+
rows = read_csv_from_s3(s3_bucket, "dataset_db/regione_provincia_cap.csv")
4546
# rimozione header
4647
rows = rows[1:]
4748

48-
#query
4949
cur = conn.cursor()
50+
# cancellazione
51+
cur.execute('DELETE FROM public."CAP_PROV_REG";')
52+
# commit della cancellazione
53+
conn.commit()
54+
55+
# inserimento
5056
insert_query = """
5157
INSERT INTO public."CAP_PROV_REG" ("CAP", "REGIONE", "PROVINCIA", "COD_SIGLA_PROVINCIA", "POP_CAP", "PERCENTUALE_POP_CAP")
5258
VALUES (%s, %s, %s, %s, %s, %s)

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ packaging==25.0
4141
pandas==2.3.3
4242
plotly==6.3.0
4343
psycopg2-binary==2.9.10
44-
pyasn1==0.6.1
44+
pyasn1==0.6.2
4545
pyasn1_modules==0.4.2
4646
pycparser==2.23
4747
pyOpenSSL==25.3.0
@@ -58,8 +58,8 @@ Twisted==25.5.0
5858
txaio==25.9.2
5959
typing_extensions==4.15.0
6060
tzdata==2025.2
61-
urllib3==2.5.0
6261
Werkzeug==3.1.5
62+
urllib3==2.6.3
6363
whitenoise==6.11.0
6464
zipp==3.23.0
6565
zope.interface==8.0.1

scripts/aws/cfn/microservice-dev-cfg.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"TableUsedSenderLimitMock": "pn-PaperDeliveryUsedSenderLimitMock",
1717
"TableCountersMock": "pn-PaperDeliveryCountersMock",
1818
"TableDriverCapacities": "pn-PaperDeliveryDriverCapacities",
19-
"TableDriverCapacitiesMock": "pn-PaperDeliveryDriverCapacitiesMock"
19+
"TableDriverCapacitiesMock": "pn-PaperDeliveryDriverCapacitiesMock",
20+
"LambdaCalcoloPrimaSettimanaCutOffDay": "25"
2021
}
2122
}

0 commit comments

Comments
 (0)