Migration Archetype Dexterity Field Help

atapi.StringField(
          name='areaEspReq',
          required=False,
          widget=atapi.SelectionWidget(
              format="select",
              label=_(u'requisicoes_label_areaEspReq', default=u'Area Especifica'),
              description=_(u'requisicoes_help_areaEspReq', default=u""),
              render_own_label=False,
              macro="selection_requisicoes",
          ),
          vocabulary="getItensContas",
          schemata=_(u'Requisicao')
      ), 

security.declarePrivate('getItensContas')    
    def getItensContas(self):
        """
        """
        registry = getUtility(IRegistry)
        codsValue = registry['ip.requisicoes2.contasReq']
        out = []
        dictValues = {}
        for i in codsValue:
            values = i.split(':')
            dictValues[values[0]] = values[1]

        relContasReq = registry['ip.requisicoes2.relContasReq']
        for line in relContasReq:
            values = line.split(':')
            tuple = dictValues[values[0]],'-'+str(values[0])
            out.append(tuple)
            for innerVal in values[1].split(';'):
                tuple = dictValues[innerVal],str(innerVal)
                out.append(tuple)
                
        return atapi.DisplayList(out)   

DataGridField('itensConsolidados',
        searchable = True,
        columns = ('dataInsercao','descricao', 'quant', 'preco','total','ivaInc','totalS','conta','CPV','INTRASTAT','peso','totalCF','patrimonio','factura','info','controlField','lineCreator','role'),
        widget = DataGridWidget(
		            label = _(u'deslocacoes_label_valoresRealizado', default='Despesas (Realizado)'),
                description = _(u'deslocacoes_description_valoresRealizado', default=""),
		            auto_insert = False,
                columns={
                    'dataInsercao' : Column(_(u'deslocacoes_label_controlField', default=u'Data')),                    
                    'descricao' : Column(_(u'requisicoes_label_descricao', default=u'Desc'),),
                    'quant' : Column(_(u'requisicoes_label_quant', default=u'Qtd'),),
                    'preco' : Column(_(u'requisicoes_label_preco', default=u'Preco'),),
                    'total' : Column(_(u'requisicoes_label_total', default=u'Total'),),
                    'ivaInc' : Column(_(u'requisicoes_label_ivaInc', default=u'IVA'),),
                    'totalS' : Column(_(u'requisicoes_label_totalS', default=u'Total (s/iva)'),),
                    'conta' : RequisicoesSelectColumn(_(u'requisicoes_label_conta', default=u'Tipo'), vocabulary="getROptGroup", macro="requisicoes_select_cell"),
                    "CPV" : Column(_(u'requisicoes_label_CPV', default=u'CPV'),),
                    "INTRASTAT" : Column(_(u'requisicoes_label_INTRASTAT', default=u'INTRASTAT'),),
                    "peso" : Column(_(u'requisicoes_label_peos', default=u'Peso'),),                    
                    'totalCF' : Column(_(u'requisicoes_label_totalCF', default=u'Total CF'),),
                    'patrimonio' : Column(_(u'requisicoes_label_patrimonio', default=u'Patrimonio'),),
                    'factura' : Column(_(u'requisicoes_label_factura', default=u'Fatura'),),
                    'info' : Column(_(u'requisicoes_label_info', default=u'Info'),),
                    'controlField' : Column(_(u'deslocacoes_label_controlField', default=u'controlField')),
                    'lineCreator' : Column(_(u'deslocacoes_label_tipo', default=u'Utilizador')),
                    'role' : Column(_(u'deslocacoes_label_role', default=u'Role')),
                },
        ),
        write_permission="Manage portal",
    ),

atapi.LinesField('extraInfo',
          searchable=True,
          storage=atapi.AnnotationStorage(),
          widget=atapi.MultiSelectionWidget(
              format = 'checkbox',
              label=_(u'requisicoes_label_extraInfo', default=u"Informacao extra"),
              description=_(u'requisicoes_help_extraInfo', default=u""),
              render_own_label=False,
              macro="multiselection_requisicoes",
          ),
          schemata=_(u'Requisicao'),
          vocabulary=["O material vai ser incorporado ou anexado a equipamento existente",
                      "O material vai ser incorporado em fornecimento ao exterior",
                      "O material vai ser utilizado para construcao de um prototipo"],
      ),

BlobField('prop1File',
          widget=atapi.FileWidget(label='Anexo Proposta 1',
                                  description='Ficheiro identificativo da proposta 1',
                                  render_own_label=True,
                                  macro="file_requisicoes",
          ),
          schemata=_(u'Conclusao'),
    ),

 atapi.StringField(
          name='reqElegibilidadeCG',
          required=False,
          widget=atapi.SelectionWidget(
              format="radio",
              label=_(u'requisicoes_label_reqElegibilidadeCG', default=u'Elegibilidade'),
              description=_(u'requisicoes_help_reqElegibilidadeCG', default=u""),
              macro="selection_requisicoes",
              render_own_label=False,
          ),
          vocabulary=["Sim","Não"],
          write_permission="ip.requisicoes2: CG evaluation",
    ),

atapi.StringField(
        name='processNumber',
        searchable=True,
        widget=atapi.ComputedWidget(
            label=_(u'editais_label_processNumber', default=u'Numero do Processo'),
            description=_(u'editais_help_processNumber', default=u""),
            render_own_label=True,
        ),
        read_permission="Manage portal",
        write_permission="Manage portal",
        schemata=_(u'Management Information')
    ),

I am doing a migration (Plone5.1 to Plone6 --> Archetypes to Dexterity), in this fields definition, I didn't quite understand how would I define them in Dexterity. My doubts are:

  1. On the first field definition (areaEspReq), the vocabulary, I don't understand how to do this in Dexterity, how would it look like
  2. On the DataGridField field definition of itensConsolidados, I just want to know if the format os the definition stays the same in Dexterity
  3. The definition of extraInfo field, the field is a LinesField, the widget is a MultiselectionWidget, this makes me confused, since the Widgets definition, for what I could understand, stop existing in Dexterity
  4. The BlobField with FileWidget I just don't quite undestand how to migrate
  5. With the field reqElegibilidadeCG, my doubt is on the write_permission part (I did not create this add-on, and I am not familiar with how this definition worked then, so I don't understand it now)
  6. The last one is still about the widget and the read_permission and write_permission part, I need someone to please explain this to me

Ok, so I guess that is it, sorry if it is something that can be easily found online, I just could not find the information I was looking for, so this is just my last hope on understanding this. Sorry if is something easy once again, I really don't want to waste anyone's time ahah

Also, I don't know if it is relevant, but I am doing this definition of content type on a new Plone6 website, so that eventually I can use the collective.exportimport to import all the content on the old website.

Thank you!

You might have a look to the excellent GitHub - collective/example.contenttype: A dexterity contenttype with all available fields to have some ideas on how to write dexterity content types.

You will find examples using vocabularies.

The DatagridField for dexterity is now in this addon: GitHub - collective/collective.z3cform.datagridfield: Datagrid Field for z3c.forms

The widget definition is done using directives:

There is some documentation for dexterity covering also the topic of the permissions for fields, see e.g.:

I know it is quite a lot to handle, but I hope that this can move you forward.

Kudos to all the devs that worked on those packages and on the documentation!

1 Like

Thank you so much, that was so helpful!

1 Like