如何在OpenStack horizon中重写SelfHandlingForm中的handle方法



我想在handle方法中向CreateImageForm属性添加更多数据。因此,当它创建图像时,它有一个自定义属性abc

更改后的代码可能像这个

def handle(self, request, data):
        # Glance does not really do anything with container_format at the
        # moment. It requires it is set to the same disk_format for the three
        # Amazon image types, otherwise it just treats them as 'bare.' As such
        # we will just set that to be that here instead of bothering the user
        # with asking them for information we can already determine.
        if data['disk_format'] in ('ami', 'aki', 'ari',):
            container_format = data['disk_format']
        else:
            container_format = 'bare'
        meta = {'is_public': data['is_public'],
                'protected': data['protected'],
                'disk_format': data['disk_format'],
                'container_format': container_format,
                'min_disk': (data['minimum_disk'] or 0),
                'min_ram': (data['minimum_ram'] or 0),
                'name': data['name'],
                'properties': {}}
        if data['description']:
            meta['properties']['description'] = data['description']
        if data['architecture']:
            meta['properties']['architecture'] = data['architecture']
        ###################################
        # My changes 
        ###################################
        meta['properties']['abc'] = 'def'
        if (settings.HORIZON_IMAGES_ALLOW_UPLOAD and
                policy.check((("image", "upload_image"),), request) and
                data.get('image_file', None)):
            meta['data'] = self.files['image_file']
        else:
            meta['copy_from'] = data['copy_from']
        try:
            image = api.glance.image_create(request, **meta)
            messages.success(request,
                _('Your image %s has been queued for creation.') %
                data['name'])
            return image
        except Exception:
            exceptions.handle(request, _('Unable to create new image.')) 

我想在不更改现有代码的情况下完成这项工作,比如重写或继承类。

没有覆盖方式而不接触任何代码

来自horizon/forms/views.py中的ModalFormView
您可以看到form_valid方法使用form.handle(...)

因此,这个handle方法在Horizon中是硬编码的。

至少,您必须触摸一个位置才能覆盖handle,而无需直接修改CreateImageForm:

# openstack_dashboard/dashboards/project/images/images/forms.py
class YourCreateImageForm(CreateImageForm): # <== Create your form inherited from CreateImageForm!
    def handle(self, request, data):
        ...
        (the whole your logic here)
        ...
# openstack_dashboard/dashboards/project/images/images/views.py
class CreateView(forms.ModalFormView):
    form_class = project_forms.YourCreateImageForm  # <== touch here!
    ...

也许你想覆盖它,因为你害怕将来升级地平线时发生冲突。

如果你想自定义地平线,并且不碰任何东西,最好的方法是:

  1. 创建您的dashborad(选项卡)
  2. 添加您的面板。在你的面板中,你可以很容易地从Project/Admin继承任何你想要的类,并更改你想要的部分。添加逻辑,添加表单元素,添加任何东西

最后,在您的情况下,您只想在代码中添加一行,为什么不直接添加呢?如果你升级你的地平线,我不认为这部分会引起冲突。

您可以使用HORIZON_CONFIG中的customization_module添加任何需要的覆盖。只需将路径添加到包含覆盖的文件中,如下所示:

HORIZON_CONFIG = {
    'customization_module': 'some_path.overrides',
}

在您创建的overrides.py文件中,您可以添加一个monkey补丁来用您的新类覆盖现有类:

class YourCreateImageForm(CreateImageForm):
    ...

form_class = project_forms.YourCreateImageForm

这基本上与上面注释中提到的想法相同,但您可以避免使用customization_module接触上游代码。

相关内容

  • 没有找到相关文章

最新更新