| Version 37 (modified by dom_thual, 2 years ago) (diff) |
|---|
Appunti per la riunione del Giovedì 14 aprile 2011 Dalle ore 14:00 alle ore 17:30, max 19:00.
Luogo: Mumble
Presenti: Luca, Lorenzo, Dominique, Enrico
Odg:
- stato di avanzamento Sito di presentazione per i GAS
- admin interface
- Riunione REES-MC o altrimenti Incontro con responsabili informatici dei GAS
- Ruoli parametrici
- Ticket
RIUNIONE
- stato di avanzamento Sito di presentazione per i GAS
Problema di istanze multiple. difficoltà nel creare sotto siti con temi differente dal sito principale Vedere admin interface per rendere similare la tematica.
- admin interface
Concetto complesso per personalizzare della form di inserimento dei dati: Inline. Modificare il rendering grafico per mettere campi a fianco ad esempio. Possono essere più di una. Destinato ad super utente e quindi non curata. Differente la GASAdmin che dovremmo fare per agevolare l'uso della piattaforma per persone tipo: Produttori, referenti, coordinatori...
Fase di inserimento dei dati (scheda prodotti)
Possono essere schede diverse. Per ruolo PRODUTTORE scheda completa (impegnativa)
Sono Maschere di inserimento. Cf file in allegato
Esempio di personalizzazione Cf. file in allegato. Aggiunto una barra di navigazione (con 2 entry per fare le prove)
- Bozza grafica http://www.jagom.org/trac/REESGas/wiki/BozzaGrafica
Link alla documentazione sull'admin interface: http://docs.djangoproject.com/en/1.3/ref/contrib/admin/
Screenshot: http://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter
Notare la disposizione dei comandi, filtri di ricerca, aggiungere altri blocchi (ad esempio serie di links)
Esempio: Cf. utente cambiamento lista
Enrico: essere operativo? Avere accesso ftp o installare sul suo pc
Impostare le chiave SSH
Creare l'account su GitHub. Nel profilo aggiungere la chiave pubblica xxx_rsa.pub
Scaricare il codice via Git: git clone git@…:feroda/gasistafelice.git
git pull per aggiornare il repositori locale
git branch Enrico origin/Enrico per creare un branch locale che punta sul server al nuovo account di Enrico
Enrico lavora.
Enrico decide di aggiornare il suo lavoro
Se lavori su notepad++ (tabs da mettere in spazio per il codice Python sul framework Django)
Enrico fa il commit sul repository locale
git commit -a -m"my stuff"
Enrico decide di aggiornare il server remoto
git pull
git branch Enrico
git push git@…:feroda/gasistafelice.com Enrico
Questo lavoro lo fa Luca sul server di macerata. Enrico ha ftp accesso.
PARTE INFORMATICO
Tecnica: Admin interface link GAS non riconosciuto? Problema sul modello? http://www.nomadjourney.com/2009/11/splitting-up-django-models/
Notice the definition of the app_label property in the inner Meta classes for each model. This is very important to let Django’s syncdb command know that these split up model classes belong to the same application.
class Bar( models.Model ):
class Meta:
app_label = 'myapp'
We’re not done yet. You’ll also need to explicitly import each model class in the model module’s init.py file:
- syncdb:
Creazione della banca dati da nulla: python manage.py syncdb
WorkFlows non crea le tabella prima di essere usato quando si usa in altre applicazione.
per partire di una database vuoto: se usi mysql cambi solo il nome del database se usi sqllite puo fare un reset dell'applicazione
1/2 Riepilogo interventi sul codice Riassunto di quello che è fatto:
- Lorenzo: Workflow e Permessi
Prevedere una gestione custom per la gestione dei ruoli e permessi.
Usare parametri. Prima era un ruolo con parametri.
Uso di Git
Ruoli parametrici
- ForeignKey a specifiche con valore null
ricavare il modello giusto (GAS - Prodotto)
Usando un modello generico di Django Content_type framework combinazione di 2 campi (etichetta del modello più Foreignkey: permette di identificare) + 1
param1 e parma2 sostituiscono i varie riferimenti precedenti class GlobalPermission(models.Model):
permission = models.ForeignKey(Permission)
param_role = models.ForeignKey(Role)
content_type = models.ForeignKey(ContentType)
class Meta:
# forbid duplicated GlobalPermission entries in the DB
unique_together = ("permission", "role", "content_type")
Definire ruolo parametrico: poco comodo? non situazione ottimale? solo 2 parametri? ci basta?
Piuttosto usare un ManyToManyField: come? che punta a cosa? verso una tabella Id del ruolo che siamo parametrizzando e la GenericForeignKey (già il nome del modello) Recupero ed assegnazione per nome (visto che abbiamo una GenericForeignKey composta da 2 elementi). Uso di setter e getter. Recupera tutti ManyToManyField? che corrispondono a questo nome.
Non è possibile passare parametri all'init: perché durante il get del modello lui crea di nuovo.
Modifica di 2 tabelle. Usare transazione per gestire le 2 query. se una fallisce l'altra non verrà eseguita. usare il decoratore: @transaction + usare il metodo !commit_on_success() !register_parametric_roles() deve stare in una transazione: usare il decoratore @transaction + commit_on_success()
Principal Role relation: parte mancante da creare + la funzione da usare nelle views. Codice DjangoPermission Permessi associati ai ruoli. Permessi associati agli utente. Principal vuole dire un gruppo o persone. Fare in modo di finire questo lavoro a breve altrimenti continuare sul modello.
Dopo lavorare sulla presentazione
2/2 ticket sul codice Lingua inglese
Creato nuova cartella !gassistafelice per integrare meglio !eclipse
cambiare !gassistafelice con !desonline: non adesso
Localizzazione: register permision. convenzione: from django.utils.translation import !ugettext, !ugettext_lazy as _
Usare l'internazionalizzazione per traduzione in lingua.
La localizzazione è per i dati locali (formato data, valuta): si usa !getText. convenzione: import ugettext as _
La localizzazione funziona cosi: Django crea i file di localizzazione da riempire con la traduzione giusta. processo make_messages per ogni lingua che vogliamo. compila. Django dal browser riconosce il default.
In pratica usare cosi: verbose_name = "" --> _"" help_text = "" --> _""
Attributi della classe. Crea problemi al momento dell'importazione del modello al momento del lancio del server in pratica. Questa localizzazione deve essere fatta solo al momento della visualizzazione e non della importazione. Django Stesso problema con il query set. Non farlo durante l'import. In pratica usare !ugettext dentro le viste. Le viste sono funzioni. Sono eseguite solo quando viene visualizzata, richiesta dal browser e quindi richiede solo localizzazione. Usare !ugettextlazy: dentro il modello sistematicamente.
Ticket #61 Evitare codice dentro __initpy perché va eseguito all'inizializzazione del modello. Usare le !fixture in python.
Import di python: NON nominare i file con i nomi chiave di python. esempio di worflows.py creava problemi. Rinominato worklow-related data
- Dominique
vim gedit(opzione)
Git merge: problemi. Come aggiornare il mio branch con le ultime modifiche degli altri. Senza commitare sugli altri branch. Git permette di risalire Lavorare sul suo branch. Luca solo aggiorna la master. Farlo più speso Garantire sicurezza.
Fork: Ambiante completamente isolato. Viaggia in parallelo.
mettere il mio repositori locale a puntare sul Fork Dal Fork fare la pull per prendere le ultime aggiornamento prima di lavorare fare la pull dal master lavorare e aggiornare il Fork. chiedere a Luca di importare gli aggiornamento dal Fork 1 - Fork sincronizzare con origine.
git rebase master: modifiche mettere tutte le modifiche degli altri prima delle mie.
2 - Istanza di Test riempire con dati vero simili per preparare la riunione. Avere un esportazione per i nostri sviluppi locali
3 - Lavorare un po sul modello
4 - Scrivere un test: come si usa i modelli
Sara lagumi: Gas di Macerata. Mail per i referenti dei GAS del maceratese. Interessata ad testarla. KeyUser
5 - dare altri email da persone adatte a fare i test.
GAS MC parte con il prototipo. Perché L'informazione del gruppo non passa? Dominique deve comunicare queste informazione che riguarda il progetto in corso. Nota: Il GAS MC ha ufficializzato l'uso del prototipo in attesa della piattaforma durante l'incontro regionale REES-MC. Nota: il prototipo non è di Dominique è un progetto del GAS di MATELICA. Dominique è solo uno sviluppatore.
Usare tutto in inglese anche le help_text: verranno localizzate.
2/2 Personalizzazione admin Interface development
SERVER DES MACERATA
Connesso al server desmacerata.it Lorenzo, Luca e dominique
AdminInterface? come personalizzare.
- la classe !GASMemberAdmin deriva da admin.ModelAdmin?. Voglio i caratteri unicode.
- per definire i campi nella lista usare !list_display = ('unicode', 'gas')
- fare un link: oggetto del modello definito come def gas_with_link(self, obj):
url = urlresolvers.reverse('admin:gas_gas_change', args=(obj.gas.id,))
return u'<a href="%s">%s</a>' % (url, obj.gas)
gas_with_link.allow_tags = True
- set !Allow_tags = True: campo !safe per consentire i tags
- modifica su più righe !list_display_links. Pero di default prende il link relativo all'oggetto. Quindi tutti campi hanno lo stesso links
- cambiare titolo di una colonna: usare !short_description = "COLONNA TITLE"
- mostrare 2 colonne:
Code highlighting:
fieldsets = ((None, { 'fields' : ('gas', 'person') })
None è il nome del fieldsets
- aggiungere altri campi del modello in sotto sezione
Code highlighting:
("Extra", { 'fields' : ('available_for_roles','roles'), 'classes': ('collapse',) }),
aggiungiamo un altro fieldsets chiamato Extra di tipo !collapse
- lista con filtro a sisnistra e ricerca in alto fatto con 2 righe
search_fields = ('personname','personsurname') list_filter = ('gas',)
- Action da fare su alcuni elementi
Code highlighting:
actions = ['say_hello'] def say_hello(self, request, queryset): for obj in queryset.all(): messages.info(request, _("Hello %s") % obj) #getText_lazy say_hello.short_description = _("Create a new certificate") #gettext
usare gettext (message.info ) o getText_lazy (se attributi di classe)
- admin form. handler prima di passare al modello.
Code highlighting:
class ClientForm(forms.ModelForm): class Meta: model = Client def clean_name(self): if Client.objects.filter(name=self.cleaned_data["name"]): raise forms.ValidationError(_("Name must be unique")) return self.cleaned_data["name"]
sollevare gli errori di validazione ho specifica la mia classe Form che sovrascrive tutte le Form del admin interface
COMPITI
Bozza definitiva dell'admin interface per settimana 16 (Giovedì 21 Aprile). http://www.desmacerata.it:8000/gas-admin/gas/gas/
Tempi corti.
Fare backend o preparare viste per la parte pubblica?
Finire il modello: è fondamentale. Personalizzare l'admin interface è secondario. Può essere fatto in seguito usando le pagine di base dell'admin interface.
Non essere perfetto. Solo i campi necessari per preparare la riunione di 2 ore.
Enrico: Alla tematica ci pensa Enrico. Concentrare sulla barra di navigazione dell'Admin Interface: (Inspired from django-pki)
Altri (gruppo sviluppo): Modello & rifiniture in secondo
leggere la documentazione sull'admin Interface
iniziare a sistemare gli attributi (list_display, fieldsets, search_fields)
Attachments
-
AdminInterface.png
(51.9 KB) -
added by dom_thual 2 years ago.
Admin Interface django sample
-
AdminInterfaceModificata.png
(23.8 KB) -
added by dom_thual 2 years ago.
Admin interface modificata barra di navigazione
-
users_changelist.png
(58.0 KB) -
added by dom_thual 2 years ago.
Esempio pagina lista con filtri comandi blocchi
-
filter.png
(44.2 KB) -
added by dom_thual 2 years ago.
admin interface modifcata filtro su ruoli
-
Lista ricerca filtro.png
(26.7 KB) -
added by dom_thual 2 years ago.
Lista ricerca filtro
-
action.png
(34.3 KB) -
added by dom_thual 2 years ago.
action on admin interface




