datetimeplonezopedexterityplone-4.x

How to setup default date in Dexterity Type schema.datetime?


I'm writing a Dexterity Type using Python 2.7.x to Plone 4.3.10.

I want setup a default date to field schema.Datetime.

import datetime
agoradatetime = datetime.datetime.now()

directives.read_permission(uploded_at="cmf.ManagePortal")
directives.write_permission(uploded_at="cmf.ManagePortal")
uploded_at = schema.Datetime(
    title=_(u"Data de Upload"),
    required=True,
    default=agoradatetime,
)

When I set default=agoradatetimei got this error:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File     "/home/jafar/training/buildout/src/projetime.ged/src/projetime/ged/content/digitalfile.py", line 32, in <module>
    class IDigitalFile(model.Schema):
  File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/model.py", line 67, in __init__
    self._SchemaClass_finalize()
  File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/model.py", line 74, in _SchemaClass_finalize
adapter()
  File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/directives.py", line 84, in __call__
    for fieldName in self.check():
  File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/directives.py", line 76, in check
    if fieldName not in schema:
  File "/home/jafar/training/buildout/eggs/zope.interface-3.6.7-py2.7-linux-x86_64.egg/zope/interface/interface.py", line 564, in __contains__
    return self.get(name) is not None
  File "/home/jafar/training/buildout/eggs/zope.interface-3.6.7-py2.7-linux-x86_64.egg/zope/interface/interface.py", line 415, in get
    attr = attrs.get(name)
TypeError: Error when calling the metaclass bases
    unhashable type: 'list'

I think the problem here is the output of datetime.datetime.now() its like it datetime.datetime(2016, 9, 6, 14, 34, 51, 812271), I follow this tip http://docs.plone.org/4/en/external/plone.app.dexterity/docs/advanced/defaults.html

I tried using:

from DateTime import DateTime
datenow = DateTime()

But got error WrongType, see bellow:

WrongType: (DateTime('2016/09/06 14:39:29.021494 GMT-3'), <type 'datetime.datetime'>, '')

[UPDATE 2]

Look the new code:

# -*- coding: utf-8 -*-
from plone.app.textfield import RichText
from plone.autoform import directives
from plone.namedfile import field as namedfile
from plone.supermodel.directives import fieldset
from plone.supermodel import model
from z3c.form.browser.radio import RadioFieldWidget
from zope import schema
from zope.schema.interfaces import IContextAwareDefaultFactory
from zope.schema.vocabulary import SimpleVocabulary
from zope.schema.vocabulary import SimpleTerm
from zope.interface import provider
from DateTime import DateTime
from datetime import datetime

from projetime.ged import _

TipoDeDocumentoVocabulary = SimpleVocabulary(
    [SimpleTerm(value=u'processo', title=_(u'Processos')),
     SimpleTerm(value=u'contratos', title=_(u'Contratos')),
     SimpleTerm(value=u'outros', title=_(u'Outros'))]
)

def nowDateTime():
    zope_dt = DateTime().asdatetime()
    python_dt = datetime.today()

    return python_dt

class IDigitalFile(model.Schema):
    """Dexterity-Schema
    """

    directives.widget(TipoDeDocumento=RadioFieldWidget)
    TipoDeDocumento = schema.Choice(
        title=_(u"Tipo de Documento"),
        vocabulary=TipoDeDocumentoVocabulary,
        required=True
    )

    titulo = schema.TextLine(
        title=_(u"Título"),
        required=True
    )

    codDoDocumento = schema.TextLine(
        title=_(u"Cód. do Documento"),
        required=False
    )

    CpfCnpj = schema.TextLine(
        title=_(u"CPF/CNPJ"),
        required=False
    )

    Assunto = schema.TextLine(
        title=_(u"Assunto"),
        required=True
        )

    Tipo = schema.TextLine(
        title=_(u"Tipo"),
        required=False
    )

    Descricao = schema.Text(
        title=_(u"Descrição"),
        required=True
    )

    fieldset('file', fields=['Arquivo'] )
    Arquivo = namedfile.NamedBlobFile(
        title=_(u"Arquivo Digitalizado"),
        required=True
    )

    directives.omitted(['Automatico', 'uploded_at'])
    directives.read_permission(Automatico="cmf.ManagePortal")
    directives.write_permission(Automatico="cmf.ManagePortal")
    directives.widget(Automatico=RadioFieldWidget)
    Automatico = schema.Bool(
        title=_(u"Upload via Script?"),
        required=True,
        default=True,
    )

    directives.read_permission(uploded_at="cmf.ManagePortal")
    directives.write_permission(uploded_at="cmf.ManagePortal")
    uploded_at = schema.Datetime(
        title=_(u"Data de Upload"),
        required=True,
        defaultFactory=nowDateTime,
    )

The documentaion say: Python Datetime: Here and Here.

But I got error:

TypeError: Error when calling the metaclass bases
unhashable type: 'list'

So What I Need? I need when user create a Contenttype Dexterity in plone, the field uploaded_at construct with the "date and time now".

[UPDATE 3]

FULL TRACEBACK

>>> from projetime.ged.content.digitalfile import IDigitalFile
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/jafar/training/buildout/src/projetime.ged/src/projetime/ged/content/digitalfile.py", line 37, in <module>
class IDigitalFile(model.Schema):
File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/model.py", line 67, in __init__
self._SchemaClass_finalize()
File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/model.py", line 74, in _SchemaClass_finalize
adapter()
File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/directives.py", line 84, in __call__
for fieldName in self.check():
File "/home/jafar/training/buildout/eggs/plone.supermodel-1.2.7-py2.7.egg/plone/supermodel/directives.py", line 76, in check
if fieldName not in schema:
File "/home/jafar/training/buildout/eggs/zope.interface-3.6.7-py2.7-linux-x86_64.egg/zope/interface/interface.py", line 564, in __contains__
return self.get(name) is not None
File "/home/jafar/training/buildout/eggs/zope.interface-3.6.7-py2.7-linux-x86_64.egg/zope/interface/interface.py", line 415, in get
attr = attrs.get(name)
TypeError: Error when calling the metaclass bases
unhashable type: 'list'

Solution

  • The documentation link you used clearly use defaultFactory and not default, and the value to use must be a function that is called for getting the default every time it's needed. So my suggestion is to use defaultFactory too.

    BTW: I don't know why default is not working, but even if it worked the result would probably be something unexpected: the agoradatetime is computed at module level, that mean is a datetime computed once, at Zope startup.