def codice_a_barre_articolo_table(soup=None, op=None, dao=None, row=None, all=False):
    d = None
    if soup and not all:
        record = soup.codice_a_barre_articolo.get(loads(row.object))
    else:
        record = row
    if op =="DELETE":
        if all:
            d = CodiceABarreArticolo().getRecord(id=row.id)
        else:
            d = CodiceABarreArticolo().getRecord(id=loads(row.object))
        if d:
            d.delete()
        return True
    elif op == "INSERT":
        if all:
            d = CodiceABarreArticolo()
            d.id = record.id
        else:
            d = CodiceABarreArticolo().getRecord(id=loads(row.object))
    elif op == "UPDATE":
        if all:
            d = CodiceABarreArticolo().getRecord(id=row.id)
        else:
            d = CodiceABarreArticolo().getRecord(id=loads(row.object))
        if not d:
            d = CodiceABarreArticolo()
            d.id = record.id
    d.codice = record.codice
    d.id_articolo = record.id_articolo
    d.primario = record.primario

    d.persist()
    return True
class AnagraficaCodiciABarreArticoliDetail(AnagraficaDetail):
    """ Dettaglio dell'anagrafica dei codici a barre """

    def __init__(self, anagrafica):
        AnagraficaDetail.__init__(self,
                anagrafica,
                path='_anagrafica_codici_a_barre_articoli_elements.glade')

    def setDao(self, dao, codice=None):
        self.dao = dao
        if dao is None:
            self.dao = CodiceABarreArticolo()
            self.dao.id_articolo = self._anagrafica._idArticolo
            if codice:
                self.dao.codice = codice
                self._anagrafica._newRow((self.dao, codice, False))
            else:
                self._anagrafica._newRow((self.dao, '', False))
            #self._refresh()
        return self.dao

    def updateDao(self):
        if self.dao:
            self.dao = CodiceABarreArticolo().getRecord(id=self.dao.id)
        self._refresh()

    def _refresh(self):
        sel = self._anagrafica.anagrafica_treeview.get_selection()
        (model, iterator) = sel.get_selected()
        if iterator and self.dao:
            model.set_value(iterator, 0, self.dao)
            model.set_value(iterator, 1, self.dao.codice)
            model.set_value(iterator, 2, self.dao.primario or False)

    def saveDao(self):
        sel = self._anagrafica.anagrafica_treeview.get_selection()
        (model, iterator) = sel.get_selected()
        codice = model.get_value(iterator, 1) or ''
        if (codice == ''):
            obligatoryField(self._anagrafica.getTopLevel(),
                                self._anagrafica.anagrafica_treeview)
        self.verifica(codice)
        primario = model.get_value(iterator, 2)

        self.dao.id_articolo = self._anagrafica._idArticolo
        self.dao.codice = codice
        self.dao.primario = primario
        self.dao.persist()

    def deleteDao(self):
        self.dao.delete()

    def verifica(self, codice):
        bars = CodiceABarreArticolo().select(idArticolo=None,
                                                         codice=codice,
                                                         offset=None,
                                                         batchSize=None)
        if len(bars) > 0:
            # FIXME: la select non esegue una ricerca esatta !!
            if bars[0].codice != codice:
                return

            if bars[0].id_articolo != self._anagrafica._idArticolo:
                articolo = leggiArticolo(bars[0].id_articolo)
                msg = "Codice gia' assegnato all'articolo: \n\nCod. " \
                + articolo["codice"] + " (" + articolo["denominazione"] + ")"
                messageInfo(msg=msg, transient=self._anagrafica.getTopLevel())
                raise Exception('Operation aborted: Cod Barre già assegnato')