Ejemplo n.º 1
0
def load_module_from_dict(d):
    required = ['name', 'id_name', 'category']
    for x in required:
        if not x in d:
            raise ValueError("Module specification missing field " + x)

    id_name = d['id_name']

    # If we can find an existing module with the same id_name, use that
    matches = Module.objects.filter(id_name=id_name)
    if len(matches)>0:
        assert (len(matches) == 1)  # no duplicates please
        module = matches[0]
    else:
        module = Module()

    # save module data
    module.name=d['name']
    module.category=d['category']
    module.id_name=id_name
    module.dispatch=id_name
    module.source=d['source'] if 'source' in d else ""

    module.save()

    #add module.last_updated here.
    source_version = d['source_version'] if 'source_version' in d else '1.0'
    version_matches = ModuleVersion.objects.filter(module=module, source_version_hash = source_version)

    if len(version_matches) > 0:
        assert (len(version_matches) == 1)  # no duplicates please
        module_version = version_matches[0]
    else:
        module_version = ModuleVersion()

    module_version.source_version_hash = source_version
    #the last_update_time should automatically be added based on _now_.
    #possible todo: should this be driven based on the last_commit time or the last system time?
    module_version.module = module

    module_version.save()

    # load params
    if 'parameters' in d:
        pspecs = [ load_parameter_spec(p, module_version, order) for (order,p) in enumerate(d['parameters']) ]
    else:
        pspecs = []

    # delete all ParameterSpecs (and hence ParameterVals) for this module that were not in the new module description
    for ps in ParameterSpec.objects.filter(module_version=module_version):
        if ps not in pspecs: # relies on model == comparing id field
            ps.delete()

    return module_version
Ejemplo n.º 2
0
def load_module_from_dict(d):

    with transaction.atomic():
        required = ['name', 'id_name', 'category']
        for x in required:
            if not x in d:
                raise ValueError("Module specification missing field " + x)

        id_name = d['id_name']

        # If we can find an existing module with the same id_name, use that
        try:
            module = Module.objects.get(id_name=id_name)
        except Module.DoesNotExist:
            module = Module()

        # save module data
        module.name = d['name']
        module.category = d['category']
        module.id_name = id_name
        module.dispatch = id_name
        module.source = d.get('source', '')
        module.description = d.get('description', '')
        module.author = d.get('author', 'Workbench')
        module.link = d.get('link', '')
        module.icon = d.get('icon', 'settings')
        module.loads_data = d.get('loads_data', False)
        module.help_url = d.get('help_url', '')
        module.has_zen_mode = d.get('has_zen_mode', False)
        module.row_action_menu_entry_title = d.get(
            'row_action_menu_entry_title', '')

        module.save()

        source_version = d.get(
            'source_version',
            '1.0')  # if no source_version, internal module, version 1.0 always
        try:
            # if we are loading the same version again, re-use existing module_version
            module_version = ModuleVersion.objects.get(
                module=module, source_version_hash=source_version)
            reusing_version = True
        except ModuleVersion.DoesNotExist:
            module_version = ModuleVersion(module=module,
                                           source_version_hash=source_version)
            reusing_version = False

        module_version.html_output = d.get('html_output', False)
        module_version.save()

        # load params
        if 'parameters' in d:
            pspecs = [
                load_parameter_spec(p, module_version, order)
                for (order, p) in enumerate(d['parameters'])
            ]
        else:
            pspecs = []

        # Migrate parameters, if we're updating an existing module_version
        if reusing_version:
            # Deleted parameters
            new_id_names = [p.id_name for p in pspecs]
            for old_spec in ParameterSpec.objects.filter(
                    module_version=module_version):
                if old_spec.id_name not in new_id_names:
                    old_spec.delete(
                    )  # also deletes old ParameterVals via cascade

            for new_spec in pspecs:
                try:
                    # Changed parameters
                    old_spec = ParameterSpec.objects.\
                        exclude(id=new_spec.id).\
                        get(id_name=new_spec.id_name, module_version=module_version)
                    for pv in ParameterVal.objects.filter(
                            parameter_spec=old_spec):
                        migrate_parameter_val(pv, old_spec, new_spec)
                    old_spec.delete()

                except ParameterSpec.DoesNotExist:
                    # Added parameters
                    for wfm in WfModule.objects.filter(
                            module_version=module_version):
                        create_parameter_val(wfm, new_spec)

    return module_version