code: def create_asset_model(self, project, releasetype):
          
          rootdata = treemodel.ListItemData(['Name'])
          rootitem = treemodel.TreeItem(rootdata)
          for atype in project.atype_set.all():
              atypedata = djitemdata.AtypeItemData(atype)
              atypeitem = treemodel.TreeItem(atypedata, rootitem)
              for asset in atype.asset_set.filter(project=project):
                  assetdata = djitemdata.AssetItemData(asset)
                  assetitem = treemodel.TreeItem(assetdata, atypeitem)
                  for task in asset.tasks.all():
                      taskdata = djitemdata.TaskItemData(task)
                      taskitem = treemodel.TreeItem(taskdata, assetitem)
                      taskfiles = task.taskfile_set.filter(releasetype=releasetype, typ=self._filetype)
                      # get all descriptor values as a list. disctinct eliminates duplicates.
                      for d in taskfiles.order_by('descriptor').values_list('descriptor', flat=True).distinct():
                          ddata = treemodel.ListItemData([d,])
                          treemodel.TreeItem(ddata, taskitem)
          assetmodel = treemodel.TreeModel(rootitem)
          return assetmodel
docs: Create and return a new tree model that represents assets til descriptors
  
          The tree will include assettypes, assets, tasks and descriptors of the given releaetype.
  
          :param releasetype: the releasetype for the model
          :type releasetype: :data:`djadapter.RELEASETYPES`
          :param project: the project of the assets
          :type project: :class:`djadapter.models.Project`
          :returns: the created tree model
          :rtype: :class:`jukeboxcore.gui.treemodel.TreeModel`
          :raises: None