Différences entre les versions de « Compte-rendu WE admin sys »

De April MediaWiki
Aller à la navigationAller à la recherche
(Page créée avec « == Bilan == On a dégagé gDTC, le mail, sympa de mescaline On a cassé planet, le lien gDTC<->Sympa On a pas cassé la boutique ni dotproject, ni le planet en fait On a… »)
 
(Création)
Ligne 1 : Ligne 1 :
== Bilan ==
+
Migration des contact de dotProjet vers vCard pour import dans OwnCloud
 
On a dégagé gDTC, le mail, sympa de mescaline
 
  
On a cassé planet, le lien gDTC<->Sympa
+
Nous avons utilisé un script python :
  
On a pas cassé la boutique ni dotproject, ni le planet en fait
+
<source lang="python">
 +
import csv
 +
import vobject
 +
import re
  
On a mis en place un MX secondaire (non renseigné dans les DNS)
+
def are_null (row, args):
 +
  for arg in args:
 +
    if arg not in row:
 +
      return True
 +
    if row[arg] != "":
 +
      return False
 +
  return True
  
On a mis à jour les vservers suivants : ns1:dns2 pavot:dns ns1:lamp
+
def add_name (v, row):
 +
  v.add ('n')
 +
  v.n.value = vobject.vcard.Name(
 +
      family      = row["First Name"],
 +
      given      = row["Last Name"],
 +
      additional  = row["Middle Name"],
 +
      prefix      = row["Title"],
 +
      suffix      = row["Suffix"],
 +
      )
  
On a séparé mediawiki de lamp en créant ns1:mediawiki
+
def add_notes (v, row):
 +
  if are_null (row, ["Notes"]):
 +
    return
 +
  v.add ('note')
 +
  v.note.value = row["Notes"]
  
DTC est désormais sur ns1:lsd (le vserver avec drupal) réduisant le
+
def add_anniversary (v, row):
montage de partition entre les vservers
+
  if are_null (row, ["Birthday"]):
 +
    return
 +
  v.add ('bday')
 +
  v.bday.value = row["Birthday"]
  
Si quelqu'un peut mettre en forme ce compte-rendu pour une diffusion
+
def add_title (v, row):
plus large auprès des adhérents. : [http://www.april.org/migrations-de-serveurs-lapril Actualité sur le site web de l'April]
+
  v.add ('fn')
 +
  v.fn.value = "%s %s" % (row["First Name"], row["Last Name"])
  
== B's and C's ==
+
def add_organization (v, row):
=== B's ===
+
  if are_null (row, ["Company", "Department", "Job Title"]):
* Cadre agréable
+
    return
* Billard
+
  v.add ('org')
* BBQ
+
  v.org.value = [row["Company"], row["Department"], row ["Job Title"]]
* Jeu de carte coopératif pour la détente
 
* Émulation d'équipe
 
* Non perturbation
 
* On a enfin viré DTC mail de mescaline
 
* On a enfin viré le mail de mescaline
 
*  Test de folie par FBoulogne
 
  
=== C's ===
+
def add_address (v, row, pre, typ):
* Meilleure communication amont
+
  if are_null (row, [pre+" Street", pre+" City"]):
* Dormir tous sur place
+
    return
* Présence de toutes les personnes qui ont le A sur les tâches
+
  v.add ('adr')
* Lecture du changelog des logiciels migrés
+
  v.adr.type_param = typ
* Un des admins peut éviter de partir deux semaines en vacances
+
  v.adr.value = vobject.vcard.Address(
* Plus de testeurs.
+
      street =  row[pre+" Street"]  + "\n " +
 +
                row[pre+" Street 2"] + "\n " +
 +
                row[pre+" Street 3"],
 +
      city =    row[pre+" City"],
 +
      region =  row[pre+" State"],
 +
      code =    row[pre+" Postal Code"],
 +
      country = row[pre+" Country"],
 +
      )
 +
 
 +
def add_telephone (v, row, pre, typ):
 +
  if are_null (row, [pre+" Phone"]):
 +
    return
 +
  v.add('tel')
 +
  v.tel.type_param = typ
 +
  v.tel.value = row[pre+" Phone"]
 +
 
 +
def add_fax (v, row, pre, typ):
 +
  if are_null (row, [pre+" Fax"]):
 +
    return
 +
  v.add('fax')
 +
  v.fax.type_param = typ
 +
  v.fax.value = row[pre+" Fax"]
 +
 
 +
def unfuck_emails (s):
 +
  t= re.split ("[<>]", s)
 +
  for field in t:
 +
    if field.find ('@') > -1:
 +
      return field.strip()
 +
  # should raise ValueError("Badly splitted: " + s)
 +
  return s
 +
 
 +
def add_email (v, row, suf):
 +
    dn=  "E-mail" + suf + " Display Name"
 +
    ema= "E-mail" + suf + " Address"
 +
    emt= "E-mail" + suf + " Type"
 +
    if row[ema] != "":
 +
      v.add('email')
 +
      v.email.value = "%s <%s>" % (row[dn], unfuck_emails (row[ema]))
 +
      if row[emt] != "SMTP":
 +
        v.email.type_param = row[emt]
 +
 
 +
with open('APRILContacts-unix-utf8.csv', 'rb') as csvfile:
 +
  reader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
 +
  for row in reader:
 +
    for key in row:
 +
      if type (row[key]) is str:
 +
        row[key]= row[key].decode('utf8')
 +
 
 +
    v= vobject.vCard()
 +
   
 +
    add_title (v, row)
 +
    add_name  (v, row)
 +
    add_notes (v, row)
 +
    add_anniversary  (v, row)
 +
    add_organization (v, row)
 +
 
 +
    for (i,o) in [("Business", "WORK"), ("Home", "HOME"), ("Other", "OTHER")]:
 +
      add_address (v, row, i, o)
 +
      add_telephone (v, row, i, o)
 +
      add_telephone (v, row, i+" 2", o+" 2")
 +
      add_fax (v, row, i, o)
 +
 
 +
    for (i,o) in [("Mobile", "CELL")]:
 +
      add_telephone (v, row, i, o)
 +
 
 +
    for suf in ["", " 2", " 3"]:
 +
      add_email (v, row, suf)
 +
 
 +
    print v.serialize()
 +
</source>
 +
 
 +
Pour l'utiliser:
 +
* exporter les contacts depuis dotProjet en CSV ;
 +
* lancer le script : <tt>python dotp2vcard.py > contacts.vcard</tt>
  
 
[[Catégorie:Admin sys]]
 
[[Catégorie:Admin sys]]

Version du 7 juillet 2014 à 20:11

Migration des contact de dotProjet vers vCard pour import dans OwnCloud

Nous avons utilisé un script python :

import csv
import vobject
import re

def are_null (row, args):
  for arg in args:
    if arg not in row:
      return True
    if row[arg] != "":
      return False
  return True

def add_name (v, row):
  v.add ('n')
  v.n.value = vobject.vcard.Name(
      family      = row["First Name"],
      given       = row["Last Name"],
      additional  = row["Middle Name"],
      prefix      = row["Title"],
      suffix      = row["Suffix"],
      )

def add_notes (v, row):
  if are_null (row, ["Notes"]):
    return
  v.add ('note')
  v.note.value = row["Notes"]

def add_anniversary (v, row):
  if are_null (row, ["Birthday"]):
    return
  v.add ('bday')
  v.bday.value = row["Birthday"]

def add_title (v, row):
  v.add ('fn')
  v.fn.value = "%s %s" % (row["First Name"], row["Last Name"])

def add_organization (v, row):
  if are_null (row, ["Company", "Department", "Job Title"]):
    return
  v.add ('org')
  v.org.value = [row["Company"], row["Department"], row ["Job Title"]]

def add_address (v, row, pre, typ):
  if are_null (row, [pre+" Street", pre+" City"]):
    return
  v.add ('adr')
  v.adr.type_param = typ
  v.adr.value = vobject.vcard.Address(
      street =  row[pre+" Street"]   + "\n " +
                row[pre+" Street 2"] + "\n " +
                row[pre+" Street 3"],
      city =    row[pre+" City"],
      region =  row[pre+" State"],
      code =    row[pre+" Postal Code"],
      country = row[pre+" Country"],
      )

def add_telephone (v, row, pre, typ):
  if are_null (row, [pre+" Phone"]):
    return
  v.add('tel')
  v.tel.type_param = typ
  v.tel.value = row[pre+" Phone"]

def add_fax (v, row, pre, typ):
  if are_null (row, [pre+" Fax"]):
    return
  v.add('fax')
  v.fax.type_param = typ
  v.fax.value = row[pre+" Fax"]

def unfuck_emails (s):
  t= re.split ("[<>]", s)
  for field in t:
    if field.find ('@') > -1:
      return field.strip()
  # should raise ValueError("Badly splitted: " + s)
  return s

def add_email (v, row, suf):
    dn=  "E-mail" + suf + " Display Name"
    ema= "E-mail" + suf + " Address"
    emt= "E-mail" + suf + " Type"
    if row[ema] != "":
      v.add('email')
      v.email.value = "%s <%s>" % (row[dn], unfuck_emails (row[ema]))
      if row[emt] != "SMTP":
        v.email.type_param = row[emt]

with open('APRILContacts-unix-utf8.csv', 'rb') as csvfile:
  reader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
  for row in reader:
    for key in row:
      if type (row[key]) is str:
        row[key]= row[key].decode('utf8')

    v= vobject.vCard()
    
    add_title (v, row)
    add_name  (v, row)
    add_notes (v, row)
    add_anniversary  (v, row)
    add_organization (v, row)

    for (i,o) in [("Business", "WORK"), ("Home", "HOME"), ("Other", "OTHER")]:
      add_address (v, row, i, o)
      add_telephone (v, row, i, o)
      add_telephone (v, row, i+" 2", o+" 2")
      add_fax (v, row, i, o)

    for (i,o) in [("Mobile", "CELL")]:
      add_telephone (v, row, i, o)

    for suf in ["", " 2", " 3"]:
      add_email (v, row, suf)

    print v.serialize()

Pour l'utiliser:

  • exporter les contacts depuis dotProjet en CSV ;
  • lancer le script : python dotp2vcard.py > contacts.vcard