Hello,
I’m working on an module extending the Project Application, to connect it with an external Kanban software. I created a class with classic inheritance on the project.project model and I’m trying to implement a method to import projects data from the internal software and map them into new project.project records in Odoo. The class is built as follows :
class ProjectExtension(models.Model):
_inherit='project.project'
url=fields.Char('Project page URL')
@api.multi
def import_projects(self):
imported_projects=self.get_client().import_data()
for project in imported_projects:
self.create({'url': project.url})
The import_data() function has been tested and does give the expected data. But, still, when I test the import_projects method, I get a ValueError: Expected singleton exception. The line that seems to give raise the exception is "self.create({'url': project.url})" and I can’t figure out why.
ERROR
======================================================================
ERROR: test_import_projects (odoo.addons.draft_odoo_trello.tests.test_project.TestTrelloProject)
Traceback (most recent call last):
` File "/odoo/addons-dev/draft_odoo_trello/tests/test_project.py", line 19, in test_import_projects
` projects.import_projects()
` File "/odoo/addons-dev/draft_odoo_trello/models/trello_project.py", line 42, in import_projects
` self.create({'url':project.url})
` File "/opt/odoo/odoo/addons/project/models/project.py", line 257, in create
` project = super(Project, self).create(vals)
` File "/opt/odoo/odoo/addons/mail/models/mail_alias.py", line 223, in create
` )).create(vals)
` File "/opt/odoo/odoo/addons/mail/models/mail_thread.py", line 236, in create
` thread = super(MailThread, self).create(values)
` File "/opt/odoo/odoo/odoo/models.py", line 3349, in create
` vals = self._add_missing_default_values(vals)
` File "/opt/odoo/odoo/odoo/models.py", line 1601, in _add_missing_default_values
` defaults = self.default_get(list(missing_defaults))
` File "/opt/odoo/odoo/odoo/models.py", line 1087, in default_get
` defaults = self._convert_to_write(defaults)
` File "/opt/odoo/odoo/odoo/models.py", line 4475, in _convert_to_write
` value = field.convert_to_cache(value, self, validate=False)
` File "/opt/odoo/odoo/odoo/fields.py", line 2076, in convert_to_cache
` ids = OrderedSet(record[self.name].ids if record.id else ())
` File "/opt/odoo/odoo/odoo/fields.py", line 2541, in __get__
` return record.ensure_one()._ids[0]
` File "/opt/odoo/odoo/odoo/models.py", line 4366, in ensure_one
` raise ValueError("Expected singleton: %s" % self)
` ValueError: Expected singleton: project.project(6, 14, 4, 3, 2, 5)
Thanks.
@Sudhir Arya (ERP Harbor Consulting Services), I know it is not project, since it is not an odoo record or recordset object. Self is a recordsets of several projects, so it does have multiple records.
@subbaro and @Sudhir Arya (ERP Harbor Consulting Services) what I understand from your answers is that the create method is a record level method, is that right ? It is a bit odd, since it aims at appending new records to the whole recordset.