def create_slivers(modeladmin, request, queryset): """ Create slivers in selected nodes """ opts = modeladmin.model._meta app_label = opts.app_label slice = get_object_or_404(Slice, pk=modeladmin.slice_id) if not modeladmin.has_change_permission(request, obj=slice): raise PermissionDenied n = queryset.count() if n == 1: node = queryset.get() return redirect('admin:slices_slice_add_sliver', modeladmin.slice_id, node.pk) if request.POST.get('post'): form = SliverIfaceBulkForm(slice, queryset, request.POST) if form.is_valid(): optional_ifaces = form.cleaned_data requested_ifaces = [ field for field, value in optional_ifaces.iteritems() if value ] for node in queryset: sliver = Sliver(slice=slice, node=node) if not request.user.has_perm('slices.add_sliver', sliver): raise PermissionDenied sliver.save() for iface_type in requested_ifaces: SliverIface.objects.create_default(sliver, iface_type) slice_modeladmin = get_modeladmin(Slice) msg = 'Added sliver "%s"' % force_text(sliver) slice_modeladmin.log_change(request, slice, msg) sliver_modeladmin = get_modeladmin(Sliver) # AUTO_CREATE SliverIfaces sliver_modeladmin.log_addition(request, sliver) modeladmin.message_user(request, "Successfully created %d slivers." % n) # Return None to display the change list page again. return redirect('admin:slices_slice_change', slice.pk) context = { "title": "Are you sure?", "slice": slice, "deletable_objects": [[get_admin_link(node) for node in queryset]], 'queryset': queryset, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'form': SliverIfaceBulkForm(slice, queryset), } return TemplateResponse( request, "admin/slices/slice/create_slivers_confirmation.html", context, current_app=modeladmin.admin_site.name)
def test_get_modeladmin(self): # Try to get every modeladmin from controller's models CONTROLLER_APPS = ['communitynetworks', 'firmware', 'gis', 'issues', 'maintenance', 'monitor', 'nodes', 'notifications', 'pings', 'resources', 'slices', 'state', 'tinc', 'users'] for app_name in CONTROLLER_APPS: if not is_installed(app_name): continue app = get_app(app_name) for model in get_models(app): get_modeladmin(model)
def create_slivers(modeladmin, request, queryset): """ Create slivers in selected nodes """ opts = modeladmin.model._meta app_label = opts.app_label slice = get_object_or_404(Slice, pk=modeladmin.slice_id) if not modeladmin.has_change_permission(request, obj=slice): raise PermissionDenied n = queryset.count() if n == 1: node = queryset.get() return redirect('admin:slices_slice_add_sliver', modeladmin.slice_id, node.pk) if request.POST.get('post'): form = SliverIfaceBulkForm(slice, queryset, request.POST) if form.is_valid(): optional_ifaces = form.cleaned_data requested_ifaces = [ field for field, value in optional_ifaces.iteritems() if value ] for node in queryset: sliver = Sliver(slice=slice, node=node) if not request.user.has_perm('slices.add_sliver', sliver): raise PermissionDenied sliver.save() for iface_type in requested_ifaces: iface = Sliver.get_registered_ifaces()[iface_type] SliverIface.objects.create(sliver=sliver, name=iface.DEFAULT_NAME, type=iface_type) slice_modeladmin = get_modeladmin(Slice) msg = 'Added sliver "%s"' % force_text(sliver) slice_modeladmin.log_change(request, slice, msg) sliver_modeladmin = get_modeladmin(Sliver) # AUTO_CREATE SliverIfaces sliver_modeladmin.log_addition(request, sliver) modeladmin.message_user(request, "Successfully created %d slivers." % n) # Return None to display the change list page again. return redirect('admin:slices_slice_change', slice.pk) context = { "title": "Are you sure?", "slice": slice, "deletable_objects": [[ get_admin_link(node) for node in queryset ]], 'queryset': queryset, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'form': SliverIfaceBulkForm(slice, queryset), } return TemplateResponse(request, "admin/slices/slice/create_slivers_confirmation.html", context, current_app=modeladmin.admin_site.name)
def delete_build_view(request, node_id): """ View for deleting a firmware build (with confirmation) """ node = get_object_or_404(Node, pk=node_id) build = get_object_or_404(Build, node=node) # Check that the user has delete permission for the actual model node_modeladmin = get_modeladmin(Node) if not node_modeladmin.has_change_permission(request, obj=node, view=False): raise PermissionDenied # The user has already confirmed the deletion. if request.POST.get('post'): build.delete() node_modeladmin.log_change(request, node, "Deleted firmware build") node_modeladmin.message_user( request, "Firmware build has been successfully deleted.") return redirect('admin:nodes_node_firmware', node_id) context = { 'opts': node_modeladmin.model._meta, 'app_label': node_modeladmin.model._meta.app_label, 'title': 'Are your sure?', 'build': build, 'node': node, } return render(request, 'admin/firmware/delete_build_confirmation.html', context)
def execute_operation(modeladmin, request, queryset): if not request.user.is_superuser: raise PermissionDenied opts = modeladmin.model._meta app_label = opts.app_label operation = get_object_or_404(Operation, pk=modeladmin.operation_id) if request.POST.get('post'): form = ExecutionForm(request.POST) if form.is_valid(): include_new_nodes = form.cleaned_data['include_new_nodes'] retry_if_offline = form.cleaned_data['retry_if_offline'] instances = operation.execute(queryset, include_new_nodes=include_new_nodes, retry_if_offline=retry_if_offline) for instance in instances: msg = 'Executed operation "%s"' % force_text(operation) modeladmin.log_change(request, operation, msg) instance_modeladmin = get_modeladmin(Instance) # AUTO_CREATE instances instance_modeladmin.log_addition(request, instance) modeladmin.message_user(request, "Successfully created %d instances." % len(instances)) # Return None to display the change list page again. return redirect('admin:maintenance_operation_change', operation.pk) include_new_nodes = operation.executions.filter(include_new_nodes=True).exists() context = { "title": "Are you sure?", "operation": operation, "deletable_objects": [[ get_admin_link(node) for node in queryset ]], 'queryset': queryset, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'form': ExecutionForm(initial={'include_new_nodes': include_new_nodes}), } return TemplateResponse(request, "admin/maintenance/operation/execute_operation_confirmation.html", context, current_app=modeladmin.admin_site.name)
def save(self, commit=True): action = self.cleaned_data.get("action") roles = self.cleaned_data.get("roles") request = self.__request__ site = RequestSite(request) jrequest = self.instance username = jrequest.user.get_full_name() log = "" if roles and action in ["accept", ""]: # Accept if explicit and also when a role is selected without any action jrequest.accept(roles=roles) jrequest.send_approval_email(site=site) log = "Accepted join request of user %s with initial roles: %s." % (username, roles) elif action == "reject": jrequest.reject() jrequest.send_rejection_email(site=site) log = "Rejected join request of user %s." % username elif action == "ignore": jrequest.delete() log = "Ignored join request of user %s." % username if log: modeladmin = get_modeladmin(Group) modeladmin.log_change(request, jrequest.group, log)
def save(self, commit=True): action = self.cleaned_data.get('action') roles = self.cleaned_data.get('roles') request = self.__request__ site = RequestSite(request) jrequest = self.instance username = jrequest.user.get_full_name() log = '' if roles and action in ['accept', '']: # Accept if explicit and also when a role is selected without any action jrequest.accept(roles=roles) jrequest.send_approval_email(site=site) log = "Accepted join request of user %s with initial roles: %s." % ( username, roles) elif action == 'reject': jrequest.reject() jrequest.send_rejection_email(site=site) log = "Rejected join request of user %s." % username elif action == 'ignore': jrequest.delete() log = "Ignored join request of user %s." % username if log: modeladmin = get_modeladmin(Group) modeladmin.log_change(request, jrequest.group, log)
def delete_build_view(request, node_id): """ View for deleting a firmware build (with confirmation) """ node = get_object_or_404(Node, pk=node_id) build = get_object_or_404(Build, node=node) # Check that the user has delete permission for the actual model node_modeladmin = get_modeladmin(Node) if not node_modeladmin.has_change_permission(request, obj=node, view=False): raise PermissionDenied # The user has already confirmed the deletion. if request.POST.get('post'): build.delete() node_modeladmin.log_change(request, node, "Deleted firmware build") node_modeladmin.message_user(request, "Firmware build has been successfully deleted.") return redirect('admin:nodes_node_firmware', node_id) context = { 'opts': node_modeladmin.model._meta, 'app_label': node_modeladmin.model._meta.app_label, 'title': 'Are your sure?', 'build': build, 'node': node, } return render(request, 'admin/firmware/delete_build_confirmation.html', context)
def has_change_permission(self, request, obj=None, view=True): """ Inherit permissions from SliceModelAdmin """ slice_modeladmin = get_modeladmin(Slice) return slice_modeladmin.has_change_permission(request, obj=obj, view=view)
if is_installed('firmware'): from firmware.admin import BaseImageInline from firmware.models import BaseImage from firmware.settings import FIRMWARE_BASE_IMAGE_EXTENSIONS if vct_settings.VCT_LOCAL_FILES: BaseImageInline.form = local_files_form_factory( BaseImage, 'image', extensions=FIRMWARE_BASE_IMAGE_EXTENSIONS) # Replace node firmware download for "VM manager" if vct_settings.VCT_VM_MANAGEMENT: insert_change_view_action(Node, vm_management) insertattr(Node, 'actions', vm_management) node_modeladmin = get_modeladmin(Node) old_get_change_view_actions_as_class = node_modeladmin.get_change_view_actions_as_class def get_change_view_actions_as_class(self): actions = old_get_change_view_actions_as_class() return [ action for action in actions if action.url_name != 'firmware' ] type( node_modeladmin ).get_change_view_actions_as_class = get_change_view_actions_as_class # Slices customization if vct_settings.VCT_LOCAL_FILES: TemplateAdmin.form = local_files_form_factory(
insertattr(Node, 'actions', refresh_state) insertattr(Sliver, 'actions', refresh_state) insertattr(Node, 'list_filter', NodeStateListFilter) insertattr(NodeListAdmin, 'list_filter', NodeStateListFilter) insertattr(Sliver, 'list_filter', SliverStateListFilter) insertattr(Node, 'list_filter', FirmwareVersionListFilter) SliverInline.sliver_state = state_link SliverInline.readonly_fields.append('sliver_state') SliverInline.fields.append('sliver_state') SliverNodeInline.sliver_state = state_link SliverNodeInline.readonly_fields.append('sliver_state') SliverNodeInline.fields.append('sliver_state') node_modeladmin = get_modeladmin(Node) node_modeladmin.set_change_view_action(show_state) sliver_modeladmin = get_modeladmin(Sliver) sliver_modeladmin.set_change_view_action(show_state) actions = getattr(SliceSliversAdmin, 'change_view_actions', []) SliceSliversAdmin.change_view_actions = actions + [show_state] old_slice_get_urls = SliceAdmin.get_urls def get_urls(self): urls = old_slice_get_urls(self) extra_urls = patterns( "", url( "^(?P<slice_id>\d+)/slivers/(?P<object_id>\d+)/state",
return type("VCTLocalFileForm", (base_class,), attributes) if is_installed("firmware"): from firmware.admin import BaseImageInline from firmware.models import BaseImage from firmware.settings import FIRMWARE_BASE_IMAGE_EXTENSIONS if settings.VCT_LOCAL_FILES: BaseImageInline.form = local_files_form_factory(BaseImage, "image", extensions=FIRMWARE_BASE_IMAGE_EXTENSIONS) # Replace node firmware download for "VM manager" if settings.VCT_VM_MANAGEMENT: insert_change_view_action(Node, vm_management) insertattr(Node, "actions", vm_management) node_modeladmin = get_modeladmin(Node) old_get_change_view_actions_as_class = node_modeladmin.get_change_view_actions_as_class def get_change_view_actions_as_class(self): actions = old_get_change_view_actions_as_class() return [action for action in actions if action.url_name != "firmware"] type(node_modeladmin).get_change_view_actions_as_class = get_change_view_actions_as_class # Slices customization if settings.VCT_LOCAL_FILES: TemplateAdmin.form = local_files_form_factory( Template, "image", extensions=slices_settings.SLICES_TEMPLATE_IMAGE_EXTENSIONS ) SliceAdmin.form = local_files_form_factory(
series = series.filter(date__gte=date_from, date__lte=date_to) if raw and raw.capitalize() == 'True': series = [[False, [serie]] for serie in series] else: series = group_by_interval(series, timedelta(minutes=5)) previous = None for __, series in series: serie = monitor.aggregate(series) serie.apply_relativity(previous) previous = serie date = int(serie.date.strftime('%s').split('.')[0] + '000') data.append([date, serie.value]) return HttpResponse(json.dumps(data), content_type="application/json") ServerAdmin = get_modeladmin(Server) old_server_get_urls = ServerAdmin.get_urls def get_urls(): urls = old_server_get_urls() extra_urls = patterns( "", url("^monitor/(?P<name>\w+)", wrap_admin_view(ServerAdmin, time_serie_view), name='nodes_server_monitor_netio'), url("^monitor", wrap_admin_view(ServerAdmin, monitor_view), name='nodes_server_monitor'), ) return extra_urls + urls
insertattr(Sliver, 'list_display', state_link) insertattr(Node, 'actions', refresh_state) insertattr(Sliver, 'actions', refresh_state) insertattr(Node, 'list_filter', NodeStateListFilter) insertattr(Sliver, 'list_filter', SliverStateListFilter) insertattr(Node, 'list_filter', FirmwareVersionListFilter) SliverInline.sliver_state = state_link SliverInline.readonly_fields.append('sliver_state') SliverInline.fields.append('sliver_state') SliverNodeInline.sliver_state = state_link SliverNodeInline.readonly_fields.append('sliver_state') SliverNodeInline.fields.append('sliver_state') node_modeladmin = get_modeladmin(Node) node_modeladmin.set_change_view_action(show_state) sliver_modeladmin = get_modeladmin(Sliver) sliver_modeladmin.set_change_view_action(show_state) actions = getattr(SliceSliversAdmin, 'change_view_actions', []) SliceSliversAdmin.change_view_actions = actions + [show_state] old_slice_get_urls = SliceAdmin.get_urls def get_urls(self): urls = old_slice_get_urls(self) extra_urls = patterns("", url("^(?P<slice_id>\d+)/slivers/(?P<object_id>\d+)/state", wrap_admin_view(self, wrap_action(show_state, SliceSliversAdmin(Sliver, self.admin_site))),) ) return extra_urls + urls
date_to = datetime.fromtimestamp(float(date_to), timezone.utc) series = series.filter(date__gte=date_from, date__lte=date_to) if raw and raw.capitalize() == 'True': series = [ [False, [serie]] for serie in series ] else: series = group_by_interval(series, timedelta(minutes=5)) previous = None for __, series in series: serie = monitor.aggregate(series) serie.apply_relativity(previous) previous = serie date = int(serie.date.strftime('%s').split('.')[0] + '000') data.append([date, serie.value]) return HttpResponse(json.dumps(data), content_type="application/json") ServerAdmin = get_modeladmin(Server) old_server_get_urls = ServerAdmin.get_urls def get_urls(): urls = old_server_get_urls() extra_urls = patterns("", url("^monitor/(?P<name>\w+)", wrap_admin_view(ServerAdmin, time_serie_view), name='nodes_server_monitor_netio'), url("^monitor", wrap_admin_view(ServerAdmin, monitor_view), name='nodes_server_monitor'), ) return extra_urls + urls ServerAdmin.get_urls = get_urls