wiki:RiunioneOperativa20110414

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 Admin Interface django sample

Esempio di personalizzazione Cf. file in allegato. Aggiunto una barra di navigazione (con 2 entry per fare le prove)

Admin interface modificata barra di navigazione

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 Esempio pagina lista con filtri comandi blocchi

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

  • filter_horizontal = ('roles',) cf. imagine in allegato admin interface modifcata filtro su ruoli
  • lista con filtro a sisnistra e ricerca in alto fatto con 2 righe

search_fields = ('personname','personsurname') list_filter = ('gas',)

Lista ricerca filtro

  • 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)

action on admin interface

  • 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