Migrazione da v1 a v2
Informazione
Questa semplice guida consente di aggiornare agevolmente una istanza di uniTicket v1.x alla versione 2.
01 - Stoppare il servizio
/etc/init.d/uni_ticket stop
02 - Export dei ContentType
E' necessario ricostruire la tabella dei ContentType, generata automaticamente da Django all’applicazione delle migrazioni, per mantenere la consistenza delle FK utilizzate dai log.
# CLI Django
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.all()
# old_conf sarà quindi una lista di dizionari
old_conf = []
for cct in ct:
old_conf.append({'pk': cct.pk,
'app_label': cct.app_label,
'model': cct.model})
print(old_conf)
Copiare old_conf su un file di testo, ci servirà dopo
02 - DB Backup
# CLI Django
./manage.py dumpdata --exclude auth.permission --exclude contenttypes --exclude sessions --indent 2 > path_to_your_file.json
03 - Path del progetto
Rinominare la folder del progetto [path]/uniticket in [path]/uniticket_tmp
Creare [path]/uniticket (è preferibile che si usi l’utente linux proprietario di [path]/uniticket)
04 - Download repository
# In [path]/uniticket
git clone https://github.com/UniversitaDellaCalabria/uniTicket.git
05 - Django settings
cp [path]/uniticket/uniticket/uni_ticket_project/settingslocal.py.example [path]/uniticket/uniticket/uni_ticket_project/settingslocal.py
Modificare le variabili opprtune (ignorare la parte dedicata al DB momentaneamente)
06 - Media e statics
Copiare uniticket/data/media e uniticket/data/statics in uniticket/data.
07 - Database
Se si intende utilizzare lo stesso DB, eliminare tutte le tabelle presenti altrimenti utilizzare un nuovo DB (opzione consigliata)
Aggiornare i dati relativi nel settingslocal.py
08 - Migrazioni
# CLI Django
./manage.py migrate
09 - Ripristino dei ContentType
Attenzione
Poichè i log delle richieste sono collegati ai ContentType, è necessario sovrascrivere i valori creati da Django nella migrazione iniziale per la consistenza del backup da importare.
Nel seguente script bisogna copiare il contenuto di old_conf stampato al punto 02 - Export dei ContentType
# CLI Django
# in una variabile "old_conf" copiare la lista prodotta allo step 01
old_conf = ...
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.all()
# cancella ContentType da aggiornare (quelli presenti nella lista)
to_delete = []
for cct in ct:
app_label = cct.app_label
model = cct.model
for old_ct in old_conf:
if old_ct['app_label'] == app_label and old_ct['model'] == model:
to_delete.append(cct.pk)
break
ct.filter(pk__in=to_delete).delete()
# aggiorna la pk dei ContentType rimasti
# per evitare che questa vada in conflitto con il successivo step di importazione
ct = ContentType.objects.all()
to_delete = []
for cct in ct:
app_label = cct.app_label
model = cct.model
# nuova pk che non vada in conflitto con quelle da importare
pk = cct.pk + 100
# cambio il valore dei campi del contenttype di origine
# con dei valori fake per permettere la creazione di uno nuovo
cct.app_label = pk
cct.model = pk
cct.save()
to_delete.append(cct.pk)
# crea nuovo ContentType
ContentType.objects.create(pk=pk, app_label=app_label, model=model)
ct.filter(pk__in=to_delete).delete()
# ripristina i contenttypes provenienti dal db di origine (lista old_conf)
for old_ct in old_conf:
ContentType.objects.create(pk=old_ct['pk'],
app_label=old_ct['app_label'],
model=old_ct['model'])
10 - Load Data
Sostituire nel dump json le seguenti definizioni con nano (https://it.stealthsettings.com/find-replace-nano-linux-os-x-terminal-text-editor.html)
matricola_dipendente => identificativo_dipendente
matricola_studente => identificativo_utente
Se nel dump sono presenti le tabelle delle app chat e channels abilitarle nelle INSTALLED_APPS del settingslocal e applicare le eventuali migrazioni
# CLI Django
./manage.py loaddata path_to_your_file.json
11 - Campo ticket.assigned_data
Attenzione
Questo campo è presente e viene salvato automaticamente nella nuova release quando una richiesta viene presa in carico la prima volta.
Deve essere inizializzato per tutte le richieste con la data della prima presa in carico. Questo è necessairio solo nel processo di migrazione dalla v1.x alla v2 x.
# CLI Django
from uni_ticket.models import Ticket, TicketAssignment
tickets = Ticket.objects.filter(assigned_date__isnull=True)
for ticket in tickets:
first_taken = TicketAssignment.objects\
.filter(ticket=ticket,
taken_date__isnull=False)\
.values_list("taken_date", flat=True)\
.first()
if first_taken:
ticket.assigned_date = first_taken
ticket.save()
print("Assigned data update for ticket ", ticket.code)
12 - Fine
Se non ci sono criticità è possibile rimuovere la cartella [path]/uniticket_tmp