Use memoized_method decorator in views

A lot of horizon's views use the pattern:

    def get_data(self):
        if not hasattr(self, "_data"):
            # Calculate data here.
            self._data = data
        return self._data

This is copy-pasted all over the codebase. It's better to handle that
with a single decorator. In the future, we might even replace it with
some better caching approach.

Closes-bug: #1248230
Change-Id: Id021fccf9032e5068993ec91a7774a5d0fbf29bb
This commit is contained in:
Radomir Dopieralski 2013-10-28 11:24:00 +01:00
parent 491cda0a1f
commit b7537a8b81
32 changed files with 543 additions and 567 deletions

View File

@ -17,6 +17,7 @@
from django.utils.translation import ugettext_lazy as _ # noqa from django.utils.translation import ugettext_lazy as _ # noqa
from horizon.tables import MultiTableView # noqa from horizon.tables import MultiTableView # noqa
from horizon.utils import memoized
class ResourceBrowserView(MultiTableView): class ResourceBrowserView(MultiTableView):
@ -32,15 +33,15 @@ class ResourceBrowserView(MultiTableView):
self.navigation_selection = False self.navigation_selection = False
super(ResourceBrowserView, self).__init__(*args, **kwargs) super(ResourceBrowserView, self).__init__(*args, **kwargs)
@memoized.memoized_method
def get_browser(self): def get_browser(self):
if not hasattr(self, "browser"): browser = self.browser_class(self.request, **self.kwargs)
self.browser = self.browser_class(self.request, **self.kwargs) browser.set_tables(self.get_tables())
self.browser.set_tables(self.get_tables()) if not self.navigation_selection:
if not self.navigation_selection: ct = browser.content_table
ct = self.browser.content_table item = browser.navigable_item_name.lower()
item = self.browser.navigable_item_name.lower() ct._no_data_message = _("Select a %s to browse.") % item
ct._no_data_message = _("Select a %s to browse.") % item return browser
return self.browser
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ResourceBrowserView, self).get_context_data(**kwargs) context = super(ResourceBrowserView, self).get_context_data(**kwargs)

View File

@ -1074,6 +1074,10 @@ class DataTable(object):
@property @property
def filtered_data(self): def filtered_data(self):
# This function should be using django.utils.functional.cached_property
# decorator, but unfortunately due to bug in Django
# https://code.djangoproject.com/ticket/19872 it would make it fail
# when being mocked by mox in tests.
if not hasattr(self, '_filtered_data'): if not hasattr(self, '_filtered_data'):
self._filtered_data = self.data self._filtered_data = self.data
if self._meta.filter and self._meta._filter_action: if self._meta.filter and self._meta._filter_action:

View File

@ -194,6 +194,8 @@ class DataTableView(MultiTableView):
return self._tables return self._tables
def get_table(self): def get_table(self):
# Note: this method cannot be easily memoized, because get_context_data
# uses its cached value directly.
if not self.table_class: if not self.table_class:
raise AttributeError('You must specify a DataTable class for the ' raise AttributeError('You must specify a DataTable class for the '
'"table_class" attribute on %s.' '"table_class" attribute on %s.'

View File

@ -98,5 +98,9 @@ def memoized(func):
UnhashableKeyWarning, 2) UnhashableKeyWarning, 2)
value = func(*args, **kwargs) value = func(*args, **kwargs)
return value return value
return wrapped return wrapped
# We can use @memoized for methods now too, because it uses weakref and so
# it doesn't keep the instances in memory forever. We might want to separate
# them in the future, however.
memoized_method = memoized

View File

@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -58,17 +59,16 @@ class UpdateView(forms.ModalFormView):
template_name = constants.GROUPS_UPDATE_VIEW_TEMPLATE template_name = constants.GROUPS_UPDATE_VIEW_TEMPLATE
success_url = reverse_lazy(constants.GROUPS_INDEX_URL) success_url = reverse_lazy(constants.GROUPS_INDEX_URL)
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.keystone.group_get(self.request,
self._object = api.keystone.group_get(self.request, self.kwargs['group_id'])
self.kwargs['group_id']) except Exception:
except Exception: redirect = reverse(constants.GROUPS_INDEX_URL)
redirect = reverse(constants.GROUPS_INDEX_URL) exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to update group.'),
_('Unable to update group.'), redirect=redirect)
redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs) context = super(UpdateView, self).get_context_data(**kwargs)
@ -83,29 +83,24 @@ class UpdateView(forms.ModalFormView):
class GroupManageMixin(object): class GroupManageMixin(object):
@memoized.memoized_method
def _get_group(self): def _get_group(self):
if not hasattr(self, "_group"): group_id = self.kwargs['group_id']
group_id = self.kwargs['group_id'] return api.keystone.group_get(self.request, group_id)
self._group = api.keystone.group_get(self.request, group_id)
return self._group
@memoized.memoized_method
def _get_group_members(self): def _get_group_members(self):
if not hasattr(self, "_group_members"): group_id = self.kwargs['group_id']
group_id = self.kwargs['group_id'] return api.keystone.user_list(self.request, group=group_id)
self._group_members = api.keystone.user_list(self.request,
group=group_id)
return self._group_members
@memoized.memoized_method
def _get_group_non_members(self): def _get_group_non_members(self):
if not hasattr(self, "_group_non_members"): domain_id = self._get_group().domain_id
domain_id = self._get_group().domain_id all_users = api.keystone.user_list(self.request,
all_users = api.keystone.user_list(self.request, domain=domain_id)
domain=domain_id) group_members = self._get_group_members()
group_members = self._get_group_members() group_member_ids = [user.id for user in group_members]
group_member_ids = [user.id for user in group_members] return filter(lambda u: u.id not in group_member_ids, all_users)
self._group_non_members = filter(
lambda u: u.id not in group_member_ids, all_users)
return self._group_non_members
class ManageMembersView(GroupManageMixin, tables.DataTableView): class ManageMembersView(GroupManageMixin, tables.DataTableView):

View File

@ -27,6 +27,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.dashboards.admin.instances \ from openstack_dashboard.dashboards.admin.instances \
@ -126,26 +127,24 @@ class LiveMigrateView(forms.ModalFormView):
context["instance_id"] = self.kwargs['instance_id'] context["instance_id"] = self.kwargs['instance_id']
return context return context
@memoized.memoized_method
def get_hosts(self, *args, **kwargs): def get_hosts(self, *args, **kwargs):
if not hasattr(self, "_hosts"): try:
try: return api.nova.hypervisor_list(self.request)
self._hosts = api.nova.hypervisor_list(self.request) except Exception:
except Exception: redirect = reverse("horizon:admin:instances:index")
redirect = reverse("horizon:admin:instances:index") msg = _('Unable to retrieve hypervisor information.')
msg = _('Unable to retrieve hypervisor information.') exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._hosts
@memoized.memoized_method
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): instance_id = self.kwargs['instance_id']
instance_id = self.kwargs['instance_id'] try:
try: return api.nova.server_get(self.request, instance_id)
self._object = api.nova.server_get(self.request, instance_id) except Exception:
except Exception: redirect = reverse("horizon:admin:instances:index")
redirect = reverse("horizon:admin:instances:index") msg = _('Unable to retrieve instance details.')
msg = _('Unable to retrieve instance details.') exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
initial = super(LiveMigrateView, self).get_initial() initial = super(LiveMigrateView, self).get_initial()

View File

@ -19,6 +19,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.dashboards.project.networks.ports \ from openstack_dashboard.dashboards.project.networks.ports \
@ -38,18 +39,16 @@ class CreateView(forms.ModalFormView):
return reverse(self.success_url, return reverse(self.success_url,
args=(self.kwargs['network_id'],)) args=(self.kwargs['network_id'],))
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: network_id = self.kwargs["network_id"]
network_id = self.kwargs["network_id"] return api.neutron.network_get(self.request, network_id)
self._object = api.neutron.network_get(self.request, except Exception:
network_id) redirect = reverse(self.failure_url,
except Exception: args=(self.kwargs['network_id'],))
redirect = reverse(self.failure_url, msg = _("Unable to retrieve network.")
args=(self.kwargs['network_id'],)) exceptions.handle(self.request, msg, redirect=redirect)
msg = _("Unable to retrieve network.")
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(CreateView, self).get_context_data(**kwargs) context = super(CreateView, self).get_context_data(**kwargs)

View File

@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.dashboards.project.networks import views as user_views from openstack_dashboard.dashboards.project.networks import views as user_views
@ -39,18 +40,17 @@ class IndexView(tables.DataTableView):
table_class = networks_tables.NetworksTable table_class = networks_tables.NetworksTable
template_name = 'admin/networks/index.html' template_name = 'admin/networks/index.html'
@memoized.memoized_method
def _get_tenant_list(self): def _get_tenant_list(self):
if not hasattr(self, "_tenants"): try:
try: tenants, has_more = api.keystone.tenant_list(self.request)
tenants, has_more = api.keystone.tenant_list(self.request) except Exception:
except Exception: tenants = []
tenants = [] msg = _('Unable to retrieve instance project information.')
msg = _('Unable to retrieve instance project information.') exceptions.handle(self.request, msg)
exceptions.handle(self.request, msg)
tenant_dict = SortedDict([(t.id, t) for t in tenants]) tenant_dict = SortedDict([(t.id, t) for t in tenants])
self._tenants = tenant_dict return tenant_dict
return self._tenants
def get_data(self): def get_data(self):
try: try:
@ -107,20 +107,19 @@ class DetailView(tables.MultiTableView):
p.set_id_as_name_if_empty() p.set_id_as_name_if_empty()
return ports return ports
@memoized.memoized_method
def _get_data(self): def _get_data(self):
if not hasattr(self, "_network"): try:
try: network_id = self.kwargs['network_id']
network_id = self.kwargs['network_id'] network = api.neutron.network_get(self.request, network_id)
network = api.neutron.network_get(self.request, network_id) network.set_id_as_name_if_empty(length=0)
network.set_id_as_name_if_empty(length=0) except Exception:
except Exception: redirect = self.failure_url
redirect = self.failure_url exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve details for '
_('Unable to retrieve details for ' 'network "%s".') % network_id,
'network "%s".') % network_id, redirect=redirect)
redirect=redirect) return network
self._network = network
return self._network
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs) context = super(DetailView, self).get_context_data(**kwargs)

View File

@ -23,6 +23,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import tables from horizon import tables
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -47,18 +48,15 @@ INDEX_URL = "horizon:admin:projects:index"
class TenantContextMixin(object): class TenantContextMixin(object):
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): tenant_id = self.kwargs['tenant_id']
tenant_id = self.kwargs['tenant_id'] try:
try: return api.keystone.tenant_get(self.request, tenant_id, admin=True)
self._object = api.keystone.tenant_get(self.request, except Exception:
tenant_id, exceptions.handle(self.request,
admin=True) _('Unable to retrieve project information.'),
except Exception: redirect=reverse(INDEX_URL))
exceptions.handle(self.request,
_('Unable to retrieve project information.'),
redirect=reverse(INDEX_URL))
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(TenantContextMixin, self).get_context_data(**kwargs) context = super(TenantContextMixin, self).get_context_data(**kwargs)

View File

@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -49,17 +50,15 @@ class UpdateView(forms.ModalFormView):
template_name = 'admin/roles/update.html' template_name = 'admin/roles/update.html'
success_url = reverse_lazy('horizon:admin:roles:index') success_url = reverse_lazy('horizon:admin:roles:index')
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.keystone.role_get(self.request, self.kwargs['role_id'])
self._object = api.keystone.role_get(self.request, except Exception:
self.kwargs['role_id']) redirect = reverse("horizon:admin:roles:index")
except Exception: exceptions.handle(self.request,
redirect = reverse("horizon:admin:roles:index") _('Unable to update role.'),
exceptions.handle(self.request, redirect=redirect)
_('Unable to update role.'),
redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs) context = super(UpdateView, self).get_context_data(**kwargs)

View File

@ -29,6 +29,7 @@ from django.views.decorators.debug import sensitive_post_parameters # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -64,18 +65,16 @@ class UpdateView(forms.ModalFormView):
def dispatch(self, *args, **kwargs): def dispatch(self, *args, **kwargs):
return super(UpdateView, self).dispatch(*args, **kwargs) return super(UpdateView, self).dispatch(*args, **kwargs)
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.keystone.user_get(self.request, self.kwargs['user_id'],
self._object = api.keystone.user_get(self.request, admin=True)
self.kwargs['user_id'], except Exception:
admin=True) redirect = reverse("horizon:admin:users:index")
except Exception: exceptions.handle(self.request,
redirect = reverse("horizon:admin:users:index") _('Unable to update user.'),
exceptions.handle(self.request, redirect=redirect)
_('Unable to update user.'),
redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs) context = super(UpdateView, self).get_context_data(**kwargs)

View File

@ -28,6 +28,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.utils import filters from openstack_dashboard.utils import filters
@ -42,17 +43,16 @@ class DetailView(tables.DataTableView):
table_class = project_tables.RulesTable table_class = project_tables.RulesTable
template_name = 'project/access_and_security/security_groups/detail.html' template_name = 'project/access_and_security/security_groups/detail.html'
@memoized.memoized_method
def _get_data(self): def _get_data(self):
if not hasattr(self, '_sg'): sg_id = filters.get_int_or_uuid(self.kwargs['security_group_id'])
sg_id = filters.get_int_or_uuid(self.kwargs['security_group_id']) try:
try: return api.network.security_group_get(self.request, sg_id)
self._sg = api.network.security_group_get(self.request, sg_id) except Exception:
except Exception: redirect = reverse('horizon:project:access_and_security:index')
redirect = reverse('horizon:project:access_and_security:index') exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve security group.'),
_('Unable to retrieve security group.'), redirect=redirect)
redirect=redirect)
return self._sg
def get_data(self): def get_data(self):
return self._get_data().rules return self._get_data().rules
@ -68,17 +68,15 @@ class UpdateView(forms.ModalFormView):
template_name = 'project/access_and_security/security_groups/update.html' template_name = 'project/access_and_security/security_groups/update.html'
success_url = reverse_lazy('horizon:project:access_and_security:index') success_url = reverse_lazy('horizon:project:access_and_security:index')
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): sg_id = filters.get_int_or_uuid(self.kwargs['security_group_id'])
sg_id = filters.get_int_or_uuid(self.kwargs['security_group_id']) try:
try: return api.network.security_group_get(self.request, sg_id)
self._object = api.network.security_group_get(self.request, except Exception:
sg_id) msg = _('Unable to retrieve security group.')
except Exception: url = reverse('horizon:project:access_and_security:index')
msg = _('Unable to retrieve security group.') exceptions.handle(self.request, msg, redirect=url)
url = reverse('horizon:project:access_and_security:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs) context = super(UpdateView, self).get_context_data(**kwargs)

View File

@ -32,6 +32,7 @@ from django.views import generic
from horizon import browsers from horizon import browsers
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.api import swift from openstack_dashboard.api import swift
@ -265,19 +266,18 @@ class CopyView(forms.ModalFormView):
class ContainerDetailView(forms.ModalFormMixin, generic.TemplateView): class ContainerDetailView(forms.ModalFormMixin, generic.TemplateView):
template_name = 'project/containers/container_detail.html' template_name = 'project/containers/container_detail.html'
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.swift.swift_get_container(
self._object = api.swift.swift_get_container( self.request,
self.request, self.kwargs["container_name"],
self.kwargs["container_name"], with_data=False)
with_data=False) except Exception:
except Exception: redirect = reverse("horizon:project:containers:index")
redirect = reverse("horizon:project:containers:index") exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve details.'),
_('Unable to retrieve details.'), redirect=redirect)
redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ContainerDetailView, self).get_context_data(**kwargs) context = super(ContainerDetailView, self).get_context_data(**kwargs)
@ -288,20 +288,19 @@ class ContainerDetailView(forms.ModalFormMixin, generic.TemplateView):
class ObjectDetailView(forms.ModalFormMixin, generic.TemplateView): class ObjectDetailView(forms.ModalFormMixin, generic.TemplateView):
template_name = 'project/containers/object_detail.html' template_name = 'project/containers/object_detail.html'
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.swift.swift_get_object(
self._object = api.swift.swift_get_object( self.request,
self.request, self.kwargs["container_name"],
self.kwargs["container_name"], self.kwargs["object_path"],
self.kwargs["object_path"], with_data=False)
with_data=False) except Exception:
except Exception: redirect = reverse("horizon:project:containers:index")
redirect = reverse("horizon:project:containers:index") exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve details.'),
_('Unable to retrieve details.'), redirect=redirect)
redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ObjectDetailView, self).get_context_data(**kwargs) context = super(ObjectDetailView, self).get_context_data(**kwargs)

View File

@ -38,6 +38,8 @@ class IndexView(horizon_tables.DataTableView):
def _get_extra_data(self, backup): def _get_extra_data(self, backup):
"""Apply extra info to the backup.""" """Apply extra info to the backup."""
instance_id = backup.instance_id instance_id = backup.instance_id
# TODO(rdopieralski) It's not clear where this attribute is supposed
# to come from. At first glance it looks like it will always be {}.
if not hasattr(self, '_instances'): if not hasattr(self, '_instances'):
self._instances = {} self._instances = {}
instance = self._instances.get(instance_id) instance = self._instances.get(instance_id)

View File

@ -26,6 +26,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import tables as horizon_tables from horizon import tables as horizon_tables
from horizon import tabs as horizon_tabs from horizon import tabs as horizon_tabs
from horizon.utils import memoized
from horizon import workflows as horizon_workflows from horizon import workflows as horizon_workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -44,17 +45,18 @@ class IndexView(horizon_tables.DataTableView):
def has_more_data(self, table): def has_more_data(self, table):
return self._more return self._more
@memoized.memoized_method
def get_flavors(self):
try:
flavors = api.trove.flavor_list(self.request)
except Exception:
flavors = []
msg = _('Unable to retrieve database size information.')
exceptions.handle(self.request, msg)
return SortedDict((unicode(flavor.id), flavor) for flavor in flavors)
def _extra_data(self, instance): def _extra_data(self, instance):
if not hasattr(self, '_flavors'): flavor = self.get_flavors().get(instance.flavor["id"])
try:
flavors = api.trove.flavor_list(self.request)
except Exception:
flavors = []
msg = _('Unable to retrieve database size information.')
exceptions.handle(self.request, msg)
self._flavors = SortedDict([(unicode(flavor.id), flavor)
for flavor in flavors])
flavor = self._flavors.get(instance.flavor["id"])
if flavor is not None: if flavor is not None:
instance.full_flavor = flavor instance.full_flavor = flavor
return instance return instance
@ -95,25 +97,24 @@ class DetailView(horizon_tabs.TabbedTableView):
context["instance"] = self.get_data() context["instance"] = self.get_data()
return context return context
@memoized.memoized_method
def get_data(self): def get_data(self):
if not hasattr(self, "_instance"): try:
try: LOG.info("Obtaining instance for detailed view ")
LOG.info("Obtaining instance for detailed view ") instance_id = self.kwargs['instance_id']
instance_id = self.kwargs['instance_id'] instance = api.trove.instance_get(self.request, instance_id)
instance = api.trove.instance_get(self.request, instance_id) except Exception:
except Exception: redirect = reverse('horizon:project:databases:index')
redirect = reverse('horizon:project:databases:index') msg = _('Unable to retrieve details '
msg = _('Unable to retrieve details ' 'for database instance: %s') % instance_id
'for database instance: %s') % instance_id exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect) try:
try: instance.full_flavor = api.trove.flavor_get(
instance.full_flavor = api.trove.flavor_get( self.request, instance.flavor["id"])
self.request, instance.flavor["id"]) except Exception:
except Exception: LOG.error('Unable to retrieve flavor details'
LOG.error('Unable to retrieve flavor details' ' for database instance: %s') % instance_id
' for database instance: %s') % instance_id return instance
self._instance = instance
return self._instance
def get_tabs(self, request, *args, **kwargs): def get_tabs(self, request, *args, **kwargs):
instance = self.get_data() instance = self.get_data()

View File

@ -20,6 +20,7 @@ from django.conf import settings # noqa
from django.utils.translation import ugettext_lazy as _ # noqa from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -40,14 +41,13 @@ class SetInstanceDetailsAction(workflows.Action):
name = _("Details") name = _("Details")
help_text_template = ("project/databases/_launch_details_help.html") help_text_template = ("project/databases/_launch_details_help.html")
@memoized.memoized_method
def flavors(self, request): def flavors(self, request):
if not hasattr(self, '_flavors'): try:
try: return api.trove.flavor_list(request)
self._flavors = api.trove.flavor_list(request) except Exception:
except Exception: LOG.exception("Exception while obtaining flavors list")
LOG.exception("Exception while obtaining flavors list") self._flavors = []
self._flavors = []
return self._flavors
def populate_flavor_choices(self, request, context): def populate_flavor_choices(self, request, context):
flavor_list = [(f.id, "%s" % f.name) for f in self.flavors(request)] flavor_list = [(f.id, "%s" % f.name) for f in self.flavors(request)]

View File

@ -24,6 +24,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import messages from horizon import messages
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -131,17 +132,17 @@ class UpdateRuleView(forms.ModalFormView):
context['name'] = obj.name context['name'] = obj.name
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): rule_id = self.kwargs['rule_id']
rule_id = self.kwargs['rule_id'] try:
try: rule = api.fwaas.rule_get(self.request, rule_id)
self._object = api.fwaas.rule_get(self.request, rule_id) rule.set_id_as_name_if_empty()
self._object.set_id_as_name_if_empty() return rule
except Exception: except Exception:
redirect = self.success_url redirect = self.success_url
msg = _('Unable to retrieve rule details.') msg = _('Unable to retrieve rule details.')
exceptions.handle(self.request, msg, redirect=redirect) exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
rule = self._get_object() rule = self._get_object()
@ -163,17 +164,17 @@ class UpdatePolicyView(forms.ModalFormView):
context['name'] = obj.name context['name'] = obj.name
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"):
policy_id = self.kwargs['policy_id'] policy_id = self.kwargs['policy_id']
try: try:
self._object = api.fwaas.policy_get(self.request, policy_id) policy = api.fwaas.policy_get(self.request, policy_id)
self._object.set_id_as_name_if_empty() policy.set_id_as_name_if_empty()
return policy
except Exception: except Exception:
redirect = self.success_url redirect = self.success_url
msg = _('Unable to retrieve policy details.') msg = _('Unable to retrieve policy details.')
exceptions.handle(self.request, msg, redirect=redirect) exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
policy = self._get_object() policy = self._get_object()
@ -195,18 +196,18 @@ class UpdateFirewallView(forms.ModalFormView):
context['name'] = obj.name context['name'] = obj.name
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): firewall_id = self.kwargs['firewall_id']
firewall_id = self.kwargs['firewall_id'] try:
try: firewall = api.fwaas.firewall_get(self.request,
self._object = api.fwaas.firewall_get(self.request, firewall_id)
firewall_id) firewall.set_id_as_name_if_empty()
self._object.set_id_as_name_if_empty() return firewall
except Exception: except Exception:
redirect = self.success_url redirect = self.success_url
msg = _('Unable to retrieve firewall details.') msg = _('Unable to retrieve firewall details.')
exceptions.handle(self.request, msg, redirect=redirect) exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
firewall = self._get_object() firewall = self._get_object()
@ -229,17 +230,17 @@ class InsertRuleToPolicyView(forms.ModalFormView):
context['name'] = obj.name context['name'] = obj.name
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): policy_id = self.kwargs['policy_id']
policy_id = self.kwargs['policy_id'] try:
try: policy = api.fwaas.policy_get(self.request, policy_id)
self._object = api.fwaas.policy_get(self.request, policy_id) policy.set_id_as_name_if_empty()
self._object.set_id_as_name_if_empty() return policy
except Exception: except Exception:
redirect = self.success_url redirect = self.success_url
msg = _('Unable to retrieve policy details.') msg = _('Unable to retrieve policy details.')
exceptions.handle(self.request, msg, redirect=redirect) exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
policy = self._get_object() policy = self._get_object()
@ -263,17 +264,17 @@ class RemoveRuleFromPolicyView(forms.ModalFormView):
context['name'] = obj.name context['name'] = obj.name
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): policy_id = self.kwargs['policy_id']
policy_id = self.kwargs['policy_id'] try:
try: policy = api.fwaas.policy_get(self.request, policy_id)
self._object = api.fwaas.policy_get(self.request, policy_id) policy.set_id_as_name_if_empty()
self._object.set_id_as_name_if_empty() return policy
except Exception: except Exception:
redirect = self.success_url redirect = self.success_url
msg = _('Unable to retrieve policy details.') msg = _('Unable to retrieve policy details.')
exceptions.handle(self.request, msg, redirect=redirect) exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
policy = self._get_object() policy = self._get_object()

View File

@ -28,6 +28,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -49,16 +50,14 @@ class UpdateView(forms.ModalFormView):
template_name = 'project/images_and_snapshots/images/update.html' template_name = 'project/images_and_snapshots/images/update.html'
success_url = reverse_lazy("horizon:project:images_and_snapshots:index") success_url = reverse_lazy("horizon:project:images_and_snapshots:index")
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.glance.image_get(self.request, self.kwargs['image_id'])
self._object = api.glance.image_get(self.request, except Exception:
self.kwargs['image_id']) msg = _('Unable to retrieve image.')
except Exception: url = reverse('horizon:project:images_and_snapshots:index')
msg = _('Unable to retrieve image.') exceptions.handle(self.request, msg, redirect=url)
url = reverse('horizon:project:images_and_snapshots:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs) context = super(UpdateView, self).get_context_data(**kwargs)
@ -88,18 +87,15 @@ class DetailView(tabs.TabView):
context["image"] = self.get_data() context["image"] = self.get_data()
return context return context
@memoized.memoized_method
def get_data(self): def get_data(self):
if not hasattr(self, "_image"): try:
try: return api.glance.image_get(self.request, self.kwargs['image_id'])
image_id = self.kwargs['image_id'] except Exception:
self._image = api.glance.image_get(self.request, image_id) url = reverse('horizon:project:images_and_snapshots:index')
except Exception: exceptions.handle(self.request,
url = reverse('horizon:project:images_and_snapshots:index') _('Unable to retrieve image details.'),
exceptions.handle(self.request, redirect=url)
_('Unable to retrieve image details.'),
redirect=url)
return self._image
def get_tabs(self, request, *args, **kwargs): def get_tabs(self, request, *args, **kwargs):
image = self.get_data() image = self.get_data()

View File

@ -27,6 +27,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -39,17 +40,16 @@ class CreateView(forms.ModalFormView):
template_name = 'project/images_and_snapshots/snapshots/create.html' template_name = 'project/images_and_snapshots/snapshots/create.html'
success_url = reverse_lazy("horizon:project:images_and_snapshots:index") success_url = reverse_lazy("horizon:project:images_and_snapshots:index")
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: return api.nova.server_get(self.request,
self._object = api.nova.server_get(self.request, self.kwargs["instance_id"])
self.kwargs["instance_id"]) except Exception:
except Exception: redirect = reverse('horizon:project:instances:index')
redirect = reverse('horizon:project:instances:index') exceptions.handle(self.request,
exceptions.handle(self.request, _("Unable to retrieve instance."),
_("Unable to retrieve instance."), redirect=redirect)
redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
return {"instance_id": self.kwargs["instance_id"]} return {"instance_id": self.kwargs["instance_id"]}

View File

@ -29,6 +29,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import tables from horizon import tables
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.api import base from openstack_dashboard.api import base
@ -95,19 +96,16 @@ class DetailView(tabs.TabView):
context["snapshot"] = self.get_data() context["snapshot"] = self.get_data()
return context return context
@memoized.memoized_method
def get_data(self): def get_data(self):
if not hasattr(self, "_snapshot"): try:
try: snapshot_id = self.kwargs['snapshot_id']
snapshot_id = self.kwargs['snapshot_id'] return api.cinder.volume_snapshot_get(self.request, snapshot_id)
self._snapshot = api.cinder.volume_snapshot_get(self.request, except Exception:
snapshot_id) url = reverse('horizon:project:images_and_snapshots:index')
except Exception: exceptions.handle(self.request,
url = reverse('horizon:project:images_and_snapshots:index') _('Unable to retrieve snapshot details.'),
exceptions.handle(self.request, redirect=url)
_('Unable to retrieve snapshot details.'),
redirect=url)
return self._snapshot
def get_tabs(self, request, *args, **kwargs): def get_tabs(self, request, *args, **kwargs):
snapshot = self.get_data() snapshot = self.get_data()

View File

@ -32,6 +32,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -172,16 +173,15 @@ class UpdateView(workflows.WorkflowView):
context["instance_id"] = self.kwargs['instance_id'] context["instance_id"] = self.kwargs['instance_id']
return context return context
@memoized.memoized_method
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): instance_id = self.kwargs['instance_id']
instance_id = self.kwargs['instance_id'] try:
try: return api.nova.server_get(self.request, instance_id)
self._object = api.nova.server_get(self.request, instance_id) except Exception:
except Exception: redirect = reverse("horizon:project:instances:index")
redirect = reverse("horizon:project:instances:index") msg = _('Unable to retrieve instance details.')
msg = _('Unable to retrieve instance details.') exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
initial = super(UpdateView, self).get_initial() initial = super(UpdateView, self).get_initial()
@ -214,27 +214,26 @@ class DetailView(tabs.TabView):
context["instance"] = self.get_data() context["instance"] = self.get_data()
return context return context
@memoized.memoized_method
def get_data(self): def get_data(self):
if not hasattr(self, "_instance"): try:
try: instance_id = self.kwargs['instance_id']
instance_id = self.kwargs['instance_id'] instance = api.nova.server_get(self.request, instance_id)
instance = api.nova.server_get(self.request, instance_id) instance.volumes = api.nova.instance_volumes_list(self.request,
instance.volumes = api.nova.instance_volumes_list(self.request, instance_id)
instance_id) # Sort by device name
# Sort by device name instance.volumes.sort(key=lambda vol: vol.device)
instance.volumes.sort(key=lambda vol: vol.device) instance.full_flavor = api.nova.flavor_get(
instance.full_flavor = api.nova.flavor_get( self.request, instance.flavor["id"])
self.request, instance.flavor["id"]) instance.security_groups = api.network.server_security_groups(
instance.security_groups = api.network.server_security_groups( self.request, instance_id)
self.request, instance_id) except Exception:
except Exception: redirect = reverse('horizon:project:instances:index')
redirect = reverse('horizon:project:instances:index') exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve details for '
_('Unable to retrieve details for ' 'instance "%s".') % instance_id,
'instance "%s".') % instance_id, redirect=redirect)
redirect=redirect) return instance
self._instance = instance
return self._instance
def get_tabs(self, request, *args, **kwargs): def get_tabs(self, request, *args, **kwargs):
instance = self.get_data() instance = self.get_data()
@ -250,35 +249,33 @@ class ResizeView(workflows.WorkflowView):
context["instance_id"] = self.kwargs['instance_id'] context["instance_id"] = self.kwargs['instance_id']
return context return context
@memoized.memoized_method
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): instance_id = self.kwargs['instance_id']
instance_id = self.kwargs['instance_id'] try:
try: instance = api.nova.server_get(self.request, instance_id)
self._object = api.nova.server_get(self.request, instance_id) flavor_id = instance.flavor['id']
flavor_id = self._object.flavor['id'] flavors = self.get_flavors()
flavors = self.get_flavors() if flavor_id in flavors:
if flavor_id in flavors: instance.flavor_name = flavors[flavor_id].name
self._object.flavor_name = flavors[flavor_id].name else:
else: flavor = api.nova.flavor_get(self.request, flavor_id)
flavor = api.nova.flavor_get(self.request, flavor_id) instance.flavor_name = flavor.name
self._object.flavor_name = flavor.name except Exception:
except Exception: redirect = reverse("horizon:project:instances:index")
redirect = reverse("horizon:project:instances:index") msg = _('Unable to retrieve instance details.')
msg = _('Unable to retrieve instance details.') exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect) return instance
return self._object
@memoized.memoized_method
def get_flavors(self, *args, **kwargs): def get_flavors(self, *args, **kwargs):
if not hasattr(self, "_flavors"): try:
try: flavors = api.nova.flavor_list(self.request)
flavors = api.nova.flavor_list(self.request) return SortedDict((str(flavor.id), flavor) for flavor in flavors)
self._flavors = SortedDict([(str(flavor.id), flavor) except Exception:
for flavor in flavors]) redirect = reverse("horizon:project:instances:index")
except Exception: exceptions.handle(self.request,
redirect = reverse("horizon:project:instances:index") _('Unable to retrieve flavors.'), redirect=redirect)
exceptions.handle(self.request,
_('Unable to retrieve flavors.'), redirect=redirect)
return self._flavors
def get_initial(self): def get_initial(self):
initial = super(ResizeView, self).get_initial() initial = super(ResizeView, self).get_initial()

View File

@ -21,6 +21,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import messages from horizon import messages
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -162,16 +163,15 @@ class UpdatePoolView(forms.ModalFormView):
context["pool_id"] = self.kwargs['pool_id'] context["pool_id"] = self.kwargs['pool_id']
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): pool_id = self.kwargs['pool_id']
pool_id = self.kwargs['pool_id'] try:
try: return api.lbaas.pool_get(self.request, pool_id)
self._object = api.lbaas.pool_get(self.request, pool_id) except Exception as e:
except Exception as e: redirect = self.success_url
redirect = self.success_url msg = _('Unable to retrieve pool details. %s') % e
msg = _('Unable to retrieve pool details. %s') % e exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
pool = self._get_object() pool = self._get_object()
@ -193,16 +193,15 @@ class UpdateVipView(forms.ModalFormView):
context["vip_id"] = self.kwargs['vip_id'] context["vip_id"] = self.kwargs['vip_id']
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): vip_id = self.kwargs['vip_id']
vip_id = self.kwargs['vip_id'] try:
try: return api.lbaas.vip_get(self.request, vip_id)
self._object = api.lbaas.vip_get(self.request, vip_id) except Exception as e:
except Exception as e: redirect = self.success_url
redirect = self.success_url msg = _('Unable to retrieve VIP details. %s') % e
msg = _('Unable to retrieve VIP details. %s') % e exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
vip = self._get_object() vip = self._get_object()
@ -238,16 +237,15 @@ class UpdateMemberView(forms.ModalFormView):
context["member_id"] = self.kwargs['member_id'] context["member_id"] = self.kwargs['member_id']
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): member_id = self.kwargs['member_id']
member_id = self.kwargs['member_id'] try:
try: return api.lbaas.member_get(self.request, member_id)
self._object = api.lbaas.member_get(self.request, member_id) except Exception as e:
except Exception as e: redirect = self.success_url
redirect = self.success_url msg = _('Unable to retrieve member details. %s') % e
msg = _('Unable to retrieve member details. %s') % e exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
member = self._get_object() member = self._get_object()
@ -268,17 +266,15 @@ class UpdateMonitorView(forms.ModalFormView):
context["monitor_id"] = self.kwargs['monitor_id'] context["monitor_id"] = self.kwargs['monitor_id']
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): monitor_id = self.kwargs['monitor_id']
monitor_id = self.kwargs['monitor_id'] try:
try: return api.lbaas.pool_health_monitor_get(self.request, monitor_id)
self._object = api.lbaas.pool_health_monitor_get( except Exception as e:
self.request, monitor_id) redirect = self.success_url
except Exception as e: msg = _('Unable to retrieve health monitor details. %s') % e
redirect = self.success_url exceptions.handle(self.request, msg, redirect=redirect)
msg = _('Unable to retrieve health monitor details. %s') % e
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
monitor = self._get_object() monitor = self._get_object()

View File

@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -44,17 +45,16 @@ class UpdateView(forms.ModalFormView):
return reverse(self.success_url, return reverse(self.success_url,
args=(self.kwargs['network_id'],)) args=(self.kwargs['network_id'],))
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): port_id = self.kwargs['port_id']
port_id = self.kwargs['port_id'] try:
try: return api.neutron.port_get(self.request, port_id)
self._object = api.neutron.port_get(self.request, port_id) except Exception:
except Exception: redirect = reverse("horizon:project:networks:detail",
redirect = reverse("horizon:project:networks:detail", args=(self.kwargs['network_id'],))
args=(self.kwargs['network_id'],)) msg = _('Unable to retrieve port details')
msg = _('Unable to retrieve port details') exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs) context = super(UpdateView, self).get_context_data(**kwargs)

View File

@ -22,6 +22,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import tables from horizon import tables
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -87,18 +88,17 @@ class SubnetsTable(tables.DataTable):
gateway_ip = tables.Column("gateway_ip", verbose_name=_("Gateway IP")) gateway_ip = tables.Column("gateway_ip", verbose_name=_("Gateway IP"))
failure_url = reverse_lazy('horizon:project:networks:index') failure_url = reverse_lazy('horizon:project:networks:index')
@memoized.memoized_method
def _get_network(self): def _get_network(self):
if not hasattr(self, "_network"): try:
try: network_id = self.kwargs['network_id']
network_id = self.kwargs['network_id'] network = api.neutron.network_get(self.request, network_id)
network = api.neutron.network_get(self.request, network_id) network.set_id_as_name_if_empty(length=0)
network.set_id_as_name_if_empty(length=0) except Exception:
except Exception: msg = _('Unable to retrieve details for network "%s".') \
msg = _('Unable to retrieve details for network "%s".') \ % (network_id)
% (network_id) exceptions.handle(self.request, msg, redirect=self.failure_url)
exceptions.handle(self.request, msg, redirect=self.failure_url) return network
self._network = network
return self._network
class Meta: class Meta:
name = "subnets" name = "subnets"

View File

@ -22,6 +22,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -35,18 +36,17 @@ from openstack_dashboard.dashboards.project.networks.subnets \
class CreateView(workflows.WorkflowView): class CreateView(workflows.WorkflowView):
workflow_class = project_workflows.CreateSubnet workflow_class = project_workflows.CreateSubnet
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: network_id = self.kwargs["network_id"]
network_id = self.kwargs["network_id"] network = api.neutron.network_get(self.request, network_id)
self._object = api.neutron.network_get(self.request, network.set_id_as_name_if_empty()
network_id) return network
self._object.set_id_as_name_if_empty() except Exception:
except Exception: redirect = reverse('horizon:project:networks:index')
redirect = reverse('horizon:project:networks:index') msg = _("Unable to retrieve network.")
msg = _("Unable to retrieve network.") exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
network = self.get_object() network = self.get_object()
@ -57,16 +57,15 @@ class CreateView(workflows.WorkflowView):
class UpdateView(workflows.WorkflowView): class UpdateView(workflows.WorkflowView):
workflow_class = project_workflows.UpdateSubnet workflow_class = project_workflows.UpdateSubnet
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): subnet_id = self.kwargs['subnet_id']
subnet_id = self.kwargs['subnet_id'] try:
try: return api.neutron.subnet_get(self.request, subnet_id)
self._object = api.neutron.subnet_get(self.request, subnet_id) except Exception:
except Exception: redirect = reverse("horizon:project:networks:index")
redirect = reverse("horizon:project:networks:index") msg = _('Unable to retrieve subnet details')
msg = _('Unable to retrieve subnet details') exceptions.handle(self.request, msg, redirect=redirect)
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
initial = super(UpdateView, self).get_initial() initial = super(UpdateView, self).get_initial()

View File

@ -23,6 +23,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon.utils import memoized
from horizon import workflows from horizon import workflows
from openstack_dashboard import api from openstack_dashboard import api
@ -75,17 +76,15 @@ class UpdateView(forms.ModalFormView):
context["network_id"] = self.kwargs['network_id'] context["network_id"] = self.kwargs['network_id']
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): network_id = self.kwargs['network_id']
network_id = self.kwargs['network_id'] try:
try: return api.neutron.network_get(self.request, network_id)
self._object = api.neutron.network_get(self.request, except Exception:
network_id) redirect = self.success_url
except Exception: msg = _('Unable to retrieve network details.')
redirect = self.success_url exceptions.handle(self.request, msg, redirect=redirect)
msg = _('Unable to retrieve network details.')
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
network = self._get_object() network = self._get_object()
@ -125,18 +124,17 @@ class DetailView(tables.MultiTableView):
p.set_id_as_name_if_empty() p.set_id_as_name_if_empty()
return ports return ports
@memoized.memoized_method
def _get_data(self): def _get_data(self):
if not hasattr(self, "_network"): try:
try: network_id = self.kwargs['network_id']
network_id = self.kwargs['network_id'] network = api.neutron.network_get(self.request, network_id)
network = api.neutron.network_get(self.request, network_id) network.set_id_as_name_if_empty(length=0)
network.set_id_as_name_if_empty(length=0) except Exception:
except Exception: msg = _('Unable to retrieve details for network "%s".') \
msg = _('Unable to retrieve details for network "%s".') \ % (network_id)
% (network_id) exceptions.handle(self.request, msg, redirect=self.failure_url)
exceptions.handle(self.request, msg, redirect=self.failure_url) return network
self._network = network
return self._network
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs) context = super(DetailView, self).get_context_data(**kwargs)

View File

@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.dashboards.project.routers.extensions.routerrules\ from openstack_dashboard.dashboards.project.routers.extensions.routerrules\
@ -40,17 +41,15 @@ class AddRouterRuleView(forms.ModalFormView):
return reverse(self.success_url, return reverse(self.success_url,
args=(self.kwargs['router_id'],)) args=(self.kwargs['router_id'],))
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: router_id = self.kwargs["router_id"]
router_id = self.kwargs["router_id"] return api.neutron.router_get(self.request, router_id)
self._object = api.neutron.router_get(self.request, except Exception:
router_id) redirect = reverse(self.failure_url, args=[router_id])
except Exception: msg = _("Unable to retrieve router.")
redirect = reverse(self.failure_url, args=[router_id]) exceptions.handle(self.request, msg, redirect=redirect)
msg = _("Unable to retrieve router.")
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(AddRouterRuleView, self).get_context_data(**kwargs) context = super(AddRouterRuleView, self).get_context_data(**kwargs)

View File

@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -39,17 +40,15 @@ class AddInterfaceView(forms.ModalFormView):
return reverse(self.success_url, return reverse(self.success_url,
args=(self.kwargs['router_id'],)) args=(self.kwargs['router_id'],))
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: router_id = self.kwargs["router_id"]
router_id = self.kwargs["router_id"] return api.neutron.router_get(self.request, router_id)
self._object = api.neutron.router_get(self.request, except Exception:
router_id) redirect = reverse(self.failure_url, args=[router_id])
except Exception: msg = _("Unable to retrieve router.")
redirect = reverse(self.failure_url, args=[router_id]) exceptions.handle(self.request, msg, redirect=redirect)
msg = _("Unable to retrieve router.")
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(AddInterfaceView, self).get_context_data(**kwargs) context = super(AddInterfaceView, self).get_context_data(**kwargs)
@ -71,17 +70,15 @@ class SetGatewayView(forms.ModalFormView):
def get_success_url(self): def get_success_url(self):
return reverse(self.success_url) return reverse(self.success_url)
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): try:
try: router_id = self.kwargs["router_id"]
router_id = self.kwargs["router_id"] return api.neutron.router_get(self.request, router_id)
self._object = api.neutron.router_get(self.request, except Exception:
router_id) redirect = reverse(self.failure_url)
except Exception: msg = _("Unable to set gateway.")
redirect = reverse(self.failure_url) exceptions.handle(self.request, msg, redirect=redirect)
msg = _("Unable to set gateway.")
exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(SetGatewayView, self).get_context_data(**kwargs) context = super(SetGatewayView, self).get_context_data(**kwargs)

View File

@ -27,6 +27,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.dashboards.project.routers\ from openstack_dashboard.dashboards.project.routers\
import forms as project_forms import forms as project_forms
@ -90,31 +91,29 @@ class DetailView(tabs.TabbedTableView):
template_name = 'project/routers/detail.html' template_name = 'project/routers/detail.html'
failure_url = reverse_lazy('horizon:project:routers:index') failure_url = reverse_lazy('horizon:project:routers:index')
@memoized.memoized_method
def _get_data(self): def _get_data(self):
if not hasattr(self, "_router"): try:
router_id = self.kwargs['router_id']
router = api.neutron.router_get(self.request, router_id)
router.set_id_as_name_if_empty(length=0)
except Exception:
msg = _('Unable to retrieve details for router "%s".') \
% (router_id)
exceptions.handle(self.request, msg, redirect=self.failure_url)
if router.external_gateway_info:
ext_net_id = router.external_gateway_info['network_id']
try: try:
router_id = self.kwargs['router_id'] ext_net = api.neutron.network_get(self.request, ext_net_id,
router = api.neutron.router_get(self.request, router_id) expand_subnet=False)
router.set_id_as_name_if_empty(length=0) ext_net.set_id_as_name_if_empty(length=0)
router.external_gateway_info['network'] = ext_net.name
except Exception: except Exception:
msg = _('Unable to retrieve details for router "%s".') \ msg = _('Unable to retrieve an external network "%s".') \
% (router_id) % (ext_net_id)
exceptions.handle(self.request, msg, redirect=self.failure_url) exceptions.handle(self.request, msg)
if router.external_gateway_info: router.external_gateway_info['network'] = ext_net_id
ext_net_id = router.external_gateway_info['network_id'] return router
try:
ext_net = api.neutron.network_get(self.request, ext_net_id,
expand_subnet=False)
ext_net.set_id_as_name_if_empty(length=0)
router.external_gateway_info['network'] = ext_net.name
except Exception:
msg = _('Unable to retrieve an external network "%s".') \
% (ext_net_id)
exceptions.handle(self.request, msg)
router.external_gateway_info['network'] = ext_net_id
self._router = router
return self._router
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs) context = super(DetailView, self).get_context_data(**kwargs)

View File

@ -19,6 +19,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from django.core.urlresolvers import reverse # noqa from django.core.urlresolvers import reverse # noqa
from django.core.urlresolvers import reverse_lazy # noqa from django.core.urlresolvers import reverse_lazy # noqa
@ -100,19 +101,18 @@ class DetailView(tabs.TabView):
context["stack"] = self.get_data(self.request) context["stack"] = self.get_data(self.request)
return context return context
@memoized.memoized_method
def get_data(self, request, **kwargs): def get_data(self, request, **kwargs):
if not hasattr(self, "_stack"): stack_id = kwargs['stack_id']
stack_id = kwargs['stack_id'] try:
try: stack = api.heat.stack_get(request, stack_id)
stack = api.heat.stack_get(request, stack_id) request.session['stack_id'] = stack.id
self._stack = stack request.session['stack_name'] = stack.stack_name
request.session['stack_id'] = stack.id return stack
request.session['stack_name'] = stack.stack_name except Exception:
except Exception: msg = _("Unable to retrieve stack.")
msg = _("Unable to retrieve stack.") redirect = reverse('horizon:project:stacks:index')
redirect = reverse('horizon:project:stacks:index') exceptions.handle(request, msg, redirect=redirect)
exceptions.handle(request, msg, redirect=redirect)
return self._stack
def get_tabs(self, request, **kwargs): def get_tabs(self, request, **kwargs):
stack = self.get_data(request, **kwargs) stack = self.get_data(request, **kwargs)
@ -129,33 +129,31 @@ class ResourceView(tabs.TabView):
context["metadata"] = self.get_metadata(self.request, **kwargs) context["metadata"] = self.get_metadata(self.request, **kwargs)
return context return context
@memoized.memoized_method
def get_data(self, request, **kwargs): def get_data(self, request, **kwargs):
if not hasattr(self, "_resource"): try:
try: resource = api.heat.resource_get(
resource = api.heat.resource_get( request,
request, kwargs['stack_id'],
kwargs['stack_id'], kwargs['resource_name'])
kwargs['resource_name']) return resource
self._resource = resource except Exception:
except Exception: msg = _("Unable to retrieve resource.")
msg = _("Unable to retrieve resource.") redirect = reverse('horizon:project:stacks:index')
redirect = reverse('horizon:project:stacks:index') exceptions.handle(request, msg, redirect=redirect)
exceptions.handle(request, msg, redirect=redirect)
return self._resource
@memoized.memoized_method
def get_metadata(self, request, **kwargs): def get_metadata(self, request, **kwargs):
if not hasattr(self, "_metadata"): try:
try: metadata = api.heat.resource_metadata_get(
metadata = api.heat.resource_metadata_get( request,
request, kwargs['stack_id'],
kwargs['stack_id'], kwargs['resource_name'])
kwargs['resource_name']) return json.dumps(metadata, indent=2)
self._metadata = json.dumps(metadata, indent=2) except Exception:
except Exception: msg = _("Unable to retrieve metadata.")
msg = _("Unable to retrieve metadata.") redirect = reverse('horizon:project:stacks:index')
redirect = reverse('horizon:project:stacks:index') exceptions.handle(request, msg, redirect=redirect)
exceptions.handle(request, msg, redirect=redirect)
return self._metadata
def get_tabs(self, request, **kwargs): def get_tabs(self, request, **kwargs):
resource = self.get_data(request, **kwargs) resource = self.get_data(request, **kwargs)

View File

@ -27,6 +27,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.api import cinder from openstack_dashboard.api import cinder
@ -97,21 +98,20 @@ class DetailView(tabs.TabView):
context["volume"] = self.get_data() context["volume"] = self.get_data()
return context return context
@memoized.memoized_method
def get_data(self): def get_data(self):
if not hasattr(self, "_volume"): try:
try: volume_id = self.kwargs['volume_id']
volume_id = self.kwargs['volume_id'] volume = cinder.volume_get(self.request, volume_id)
self._volume = cinder.volume_get(self.request, volume_id) for att in volume.attachments:
for att in self._volume.attachments: att['instance'] = api.nova.server_get(self.request,
att['instance'] = api.nova.server_get(self.request, att['server_id'])
att['server_id']) except Exception:
except Exception: redirect = reverse('horizon:project:volumes:index')
redirect = reverse('horizon:project:volumes:index') exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve volume details.'),
_('Unable to retrieve volume details.'), redirect=redirect)
redirect=redirect) return volume
return self._volume
def get_tabs(self, request, *args, **kwargs): def get_tabs(self, request, *args, **kwargs):
volume = self.get_data() volume = self.get_data()
@ -156,16 +156,15 @@ class EditAttachmentsView(tables.DataTableView, forms.ModalFormView):
template_name = 'project/volumes/attach.html' template_name = 'project/volumes/attach.html'
success_url = reverse_lazy("horizon:project:volumes:index") success_url = reverse_lazy("horizon:project:volumes:index")
@memoized.memoized_method
def get_object(self): def get_object(self):
if not hasattr(self, "_object"): volume_id = self.kwargs['volume_id']
volume_id = self.kwargs['volume_id'] try:
try: return cinder.volume_get(self.request, volume_id)
self._object = cinder.volume_get(self.request, volume_id) except Exception:
except Exception: self._object = None
self._object = None exceptions.handle(self.request,
exceptions.handle(self.request, _('Unable to retrieve volume information.'))
_('Unable to retrieve volume information.'))
return self._object
def get_data(self): def get_data(self):
try: try:
@ -187,11 +186,10 @@ class EditAttachmentsView(tables.DataTableView, forms.ModalFormView):
return {'volume': self.get_object(), return {'volume': self.get_object(),
'instances': instances} 'instances': instances}
@memoized.memoized_method
def get_form(self): def get_form(self):
if not hasattr(self, "_form"): form_class = self.get_form_class()
form_class = self.get_form_class() return super(EditAttachmentsView, self).get_form(form_class)
self._form = super(EditAttachmentsView, self).get_form(form_class)
return self._form
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(EditAttachmentsView, self).get_context_data(**kwargs) context = super(EditAttachmentsView, self).get_context_data(**kwargs)

View File

@ -25,6 +25,7 @@ from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import tables from horizon import tables
from horizon import tabs from horizon import tabs
from horizon.utils import memoized
from openstack_dashboard import api from openstack_dashboard import api
@ -119,18 +120,18 @@ class UpdateNetworkProfileView(forms.ModalFormView):
context["profile_id"] = self.kwargs['profile_id'] context["profile_id"] = self.kwargs['profile_id']
return context return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs): def _get_object(self, *args, **kwargs):
if not hasattr(self, "_object"): profile_id = self.kwargs['profile_id']
profile_id = self.kwargs['profile_id'] try:
try: profile = api.neutron.profile_get(self.request,
self._object = api.neutron.profile_get(self.request, profile_id)
profile_id) LOG.debug("Network Profile object=%s", profile)
LOG.debug("Network Profile object=%s", self._object) return profile
except Exception: except Exception:
redirect = self.success_url redirect = self.success_url
msg = _('Unable to retrieve network profile details.') msg = _('Unable to retrieve network profile details.')
exceptions.handle(self.request, msg, redirect=redirect) exceptions.handle(self.request, msg, redirect=redirect)
return self._object
def get_initial(self): def get_initial(self):
profile = self._get_object() profile = self._get_object()