mirror of
https://github.com/netbox-community/netbox.git
synced 2026-03-12 05:22:17 +01:00
Compare commits
5 Commits
21157-expo
...
21556-fix-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23e5daa482 | ||
|
|
cac3c1221c | ||
|
|
3a9d00a537 | ||
|
|
4040e4f266 | ||
|
|
f938309ed9 |
32
.github/workflows/claude.yml
vendored
32
.github/workflows/claude.yml
vendored
@@ -30,16 +30,34 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
# Workaround for claude-code-action bug with fork PRs: The action tries to fetch by branch name, which doesn't
|
||||
# exist on origin for forks. Pre-fetch the PR ref so it's available as a local ref.
|
||||
- name: Fetch fork PR ref (if applicable)
|
||||
if: github.event.issue.pull_request != '' && github.event.issue.pull_request != null
|
||||
# Workaround for claude-code-action bug with fork PRs: The action fetches by branch name
|
||||
# (git fetch origin --depth=N <branch>), but fork PR branches don't exist on origin.
|
||||
# Fix: redirect origin to the fork's URL so the action can fetch the branch directly.
|
||||
- name: Configure git remote for fork PRs
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
PR_NUMBER=$(gh pr view ${{ github.event.issue.number }} --json number -q .number 2>/dev/null || echo "")
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
git fetch origin refs/pull/${PR_NUMBER}/head:refs/remotes/pull/${PR_NUMBER}/head || true
|
||||
# Determine PR number based on event type
|
||||
if [ "${{ github.event_name }}" = "issue_comment" ]; then
|
||||
PR_NUMBER="${{ github.event.issue.number }}"
|
||||
elif [ "${{ github.event_name }}" = "pull_request_review_comment" ] || [ "${{ github.event_name }}" = "pull_request_review" ]; then
|
||||
PR_NUMBER="${{ github.event.pull_request.number }}"
|
||||
else
|
||||
exit 0 # issues event — no PR branch to worry about
|
||||
fi
|
||||
|
||||
# Fetch fork info in one API call; silently skip if this is not a PR
|
||||
PR_INFO=$(gh pr view "${PR_NUMBER}" --json isCrossRepository,headRepositoryOwner,headRepository 2>/dev/null || echo "")
|
||||
if [ -z "$PR_INFO" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
IS_FORK=$(echo "$PR_INFO" | jq -r '.isCrossRepository')
|
||||
if [ "$IS_FORK" = "true" ]; then
|
||||
FORK_OWNER=$(echo "$PR_INFO" | jq -r '.headRepositoryOwner.login')
|
||||
FORK_REPO=$(echo "$PR_INFO" | jq -r '.headRepository.name')
|
||||
echo "Fork PR detected from ${FORK_OWNER}/${FORK_REPO}: updating origin to fork URL"
|
||||
git remote set-url origin "https://github.com/${FORK_OWNER}/${FORK_REPO}.git"
|
||||
fi
|
||||
|
||||
- name: Run Claude Code
|
||||
|
||||
8
.github/workflows/lock-threads.yml
vendored
8
.github/workflows/lock-threads.yml
vendored
@@ -11,14 +11,14 @@ permissions:
|
||||
pull-requests: write
|
||||
discussions: write
|
||||
|
||||
concurrency:
|
||||
group: lock-threads
|
||||
|
||||
jobs:
|
||||
lock:
|
||||
if: github.repository == 'netbox-community/netbox'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1
|
||||
- uses: dessant/lock-threads@v6.0.0
|
||||
with:
|
||||
issue-inactive-days: 90
|
||||
pr-inactive-days: 30
|
||||
discussion-inactive-days: 180
|
||||
issue-lock-reason: 'resolved'
|
||||
|
||||
@@ -218,7 +218,7 @@ class RackReservationTable(TenancyColumnsMixin, PrimaryModelTable):
|
||||
class Meta(PrimaryModelTable.Meta):
|
||||
model = RackReservation
|
||||
fields = (
|
||||
'pk', 'id', 'reservation', 'site', 'location', 'rack', 'unit_list', 'status', 'user', 'created', 'tenant',
|
||||
'pk', 'id', 'reservation', 'site', 'location', 'rack', 'unit_list', 'status', 'user', 'tenant',
|
||||
'tenant_group', 'description', 'comments', 'tags', 'actions', 'created', 'last_updated',
|
||||
)
|
||||
default_columns = ('pk', 'reservation', 'site', 'rack', 'unit_list', 'status', 'user', 'description')
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from collections import defaultdict
|
||||
|
||||
import jsonschema
|
||||
from django.conf import settings
|
||||
from django.core.validators import ValidationError
|
||||
@@ -6,6 +8,7 @@ from django.urls import reverse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from jsonschema.exceptions import ValidationError as JSONValidationError
|
||||
|
||||
from core.models import ObjectType
|
||||
from extras.models.mixins import RenderTemplateMixin
|
||||
from extras.querysets import ConfigContextQuerySet
|
||||
from netbox.models import ChangeLoggedModel, PrimaryModel
|
||||
@@ -299,3 +302,17 @@ class ConfigTemplate(
|
||||
"""
|
||||
self.template_code = self.data_file.data_as_string
|
||||
sync_data.alters_data = True
|
||||
|
||||
def get_context(self, context=None, queryset=None):
|
||||
_context = defaultdict(dict)
|
||||
|
||||
# Populate all public models for reference within the template
|
||||
for object_type in ObjectType.objects.public():
|
||||
if model := object_type.model_class():
|
||||
_context[object_type.app_label][model.__name__] = model
|
||||
|
||||
# Apply the provided context data, if any
|
||||
if context is not None:
|
||||
_context.update(context)
|
||||
|
||||
return _context
|
||||
|
||||
@@ -2,7 +2,6 @@ import importlib.abc
|
||||
import importlib.util
|
||||
import os
|
||||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
from django.core.files.storage import storages
|
||||
from django.db import models
|
||||
@@ -10,7 +9,6 @@ from django.http import HttpResponse
|
||||
from django.utils.module_loading import import_string
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from core.models import ObjectType
|
||||
from extras.constants import DEFAULT_MIME_TYPE, JINJA_ENV_PARAMS_WITH_PATH_IMPORT
|
||||
from extras.utils import filename_from_model, filename_from_object
|
||||
from utilities.jinja2 import render_jinja2
|
||||
@@ -122,17 +120,9 @@ class RenderTemplateMixin(models.Model):
|
||||
abstract = True
|
||||
|
||||
def get_context(self, context=None, queryset=None):
|
||||
_context = defaultdict(dict)
|
||||
|
||||
# Populate all public models for reference within the template
|
||||
for object_type in ObjectType.objects.public():
|
||||
if model := object_type.model_class():
|
||||
_context[object_type.app_label][model.__name__] = model
|
||||
|
||||
if context is not None:
|
||||
_context.update(context)
|
||||
|
||||
return _context
|
||||
raise NotImplementedError(_("{class_name} must implement a get_context() method.").format(
|
||||
class_name=self.__class__
|
||||
))
|
||||
|
||||
def get_environment_params(self):
|
||||
"""
|
||||
|
||||
@@ -458,8 +458,14 @@ class ExportTemplate(
|
||||
sync_data.alters_data = True
|
||||
|
||||
def get_context(self, context=None, queryset=None):
|
||||
_context = super().get_context(context=context, queryset=queryset)
|
||||
_context['queryset'] = queryset
|
||||
_context = {
|
||||
'queryset': queryset,
|
||||
}
|
||||
|
||||
# Apply the provided context data, if any
|
||||
if context is not None:
|
||||
_context.update(context)
|
||||
|
||||
return _context
|
||||
|
||||
|
||||
|
||||
@@ -8,15 +8,7 @@ from django.test import TestCase, tag
|
||||
|
||||
from core.models import AutoSyncRecord, DataSource, ObjectType
|
||||
from dcim.models import Device, DeviceRole, DeviceType, Location, Manufacturer, Platform, Region, Site, SiteGroup
|
||||
from extras.models import (
|
||||
ConfigContext,
|
||||
ConfigContextProfile,
|
||||
ConfigTemplate,
|
||||
ExportTemplate,
|
||||
ImageAttachment,
|
||||
Tag,
|
||||
TaggedItem,
|
||||
)
|
||||
from extras.models import ConfigContext, ConfigContextProfile, ConfigTemplate, ImageAttachment, Tag, TaggedItem
|
||||
from tenancy.models import Tenant, TenantGroup
|
||||
from utilities.exceptions import AbortRequest
|
||||
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
|
||||
@@ -812,36 +804,3 @@ class ConfigTemplateTest(TestCase):
|
||||
object_id=config_template.pk
|
||||
)
|
||||
self.assertEqual(autosync_records.count(), 0, "AutoSyncRecord should be deleted after detaching")
|
||||
|
||||
|
||||
class ExportTemplateContextTest(TestCase):
|
||||
"""
|
||||
Tests for ExportTemplate.get_context() including public model population.
|
||||
"""
|
||||
|
||||
def test_get_context_includes_public_models(self):
|
||||
et = ExportTemplate(name='test', template_code='test')
|
||||
ctx = et.get_context()
|
||||
|
||||
self.assertIs(ctx['dcim']['Site'], Site)
|
||||
self.assertIs(ctx['dcim']['Device'], Device)
|
||||
|
||||
def test_get_context_includes_queryset(self):
|
||||
et = ExportTemplate(name='test', template_code='test')
|
||||
qs = Site.objects.all()
|
||||
ctx = et.get_context(queryset=qs)
|
||||
|
||||
self.assertIs(ctx['queryset'], qs)
|
||||
|
||||
def test_get_context_applies_extra_context(self):
|
||||
et = ExportTemplate(name='test', template_code='test')
|
||||
ctx = et.get_context(context={'custom_key': 'custom_value'})
|
||||
|
||||
self.assertEqual(ctx['custom_key'], 'custom_value')
|
||||
self.assertIs(ctx['dcim']['Site'], Site)
|
||||
|
||||
def test_config_template_get_context_includes_public_models(self):
|
||||
ct = ConfigTemplate(name='test', template_code='test')
|
||||
ctx = ct.get_context()
|
||||
|
||||
self.assertIs(ctx['dcim']['Site'], Site)
|
||||
|
||||
2
netbox/project-static/dist/netbox.js
vendored
2
netbox/project-static/dist/netbox.js
vendored
File diff suppressed because one or more lines are too long
6
netbox/project-static/dist/netbox.js.map
vendored
6
netbox/project-static/dist/netbox.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -71,7 +71,7 @@ export class DynamicTomSelect extends TomSelect {
|
||||
this.addEventListeners();
|
||||
}
|
||||
|
||||
load(value: string) {
|
||||
load(value: string, preserveValue?: string | string[]) {
|
||||
const self = this;
|
||||
|
||||
// Automatically clear any cached options. (Only options included
|
||||
@@ -107,6 +107,14 @@ export class DynamicTomSelect extends TomSelect {
|
||||
// Pass the options to the callback function
|
||||
.then(options => {
|
||||
self.loadCallback(options, []);
|
||||
// Restore the previous selection if it is still valid under the new filter.
|
||||
if (preserveValue !== undefined) {
|
||||
const values = Array.isArray(preserveValue) ? preserveValue : [preserveValue];
|
||||
const validValues = values.filter(v => v !== '' && v in self.options);
|
||||
if (validValues.length > 0) {
|
||||
self.setValue(validValues.length === 1 ? validValues[0] : validValues, true);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
self.loadCallback([], []);
|
||||
@@ -338,6 +346,9 @@ export class DynamicTomSelect extends TomSelect {
|
||||
private handleEvent(event: Event): void {
|
||||
const target = event.target as HTMLSelectElement;
|
||||
|
||||
// Save the current selection so we can restore it after loading if it remains valid.
|
||||
const previousValue = this.getValue();
|
||||
|
||||
// Update the element's URL after any changes to a dependency.
|
||||
this.updateQueryParams(target.name);
|
||||
this.updatePathValues(target.name);
|
||||
@@ -345,7 +356,8 @@ export class DynamicTomSelect extends TomSelect {
|
||||
// Clear any previous selection(s) as the parent filter has changed
|
||||
this.clear();
|
||||
|
||||
// Load new data.
|
||||
this.load(this.lastValue);
|
||||
// Load new data, restoring the previous selection if it is still valid under the new filter.
|
||||
const preserve = previousValue !== '' && previousValue !== null ? previousValue : undefined;
|
||||
this.load(this.lastValue, preserve);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-03-10 05:18+0000\n"
|
||||
"POT-Creation-Date: 2026-03-11 05:18+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -62,7 +62,7 @@ msgstr ""
|
||||
#: netbox/ipam/choices.py:31 netbox/ipam/choices.py:49
|
||||
#: netbox/ipam/choices.py:69 netbox/ipam/choices.py:154
|
||||
#: netbox/templates/extras/configcontext.html:29
|
||||
#: netbox/templates/users/user.html:35 netbox/users/forms/bulk_edit.py:41
|
||||
#: netbox/users/forms/bulk_edit.py:41 netbox/users/ui/panels.py:38
|
||||
#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:45
|
||||
#: netbox/vpn/choices.py:19 netbox/vpn/choices.py:280
|
||||
#: netbox/wireless/choices.py:25
|
||||
@@ -471,7 +471,7 @@ msgstr ""
|
||||
#: netbox/dcim/tables/devicetypes.py:214 netbox/dcim/tables/devicetypes.py:255
|
||||
#: netbox/dcim/tables/devicetypes.py:274 netbox/dcim/tables/racks.py:30
|
||||
#: netbox/extras/forms/bulk_edit.py:306 netbox/extras/tables/tables.py:552
|
||||
#: netbox/netbox/ui/attrs.py:193 netbox/templates/circuits/circuittype.html:30
|
||||
#: netbox/netbox/ui/attrs.py:194 netbox/templates/circuits/circuittype.html:30
|
||||
#: netbox/templates/circuits/virtualcircuittype.html:30
|
||||
#: netbox/templates/dcim/cable.html:44 netbox/templates/dcim/frontport.html:40
|
||||
#: netbox/templates/dcim/inventoryitemrole.html:26
|
||||
@@ -890,10 +890,6 @@ msgstr ""
|
||||
#: netbox/templates/tenancy/contactrole.html:22
|
||||
#: netbox/templates/tenancy/tenant.html:24
|
||||
#: netbox/templates/tenancy/tenantgroup.html:33
|
||||
#: netbox/templates/users/group.html:21
|
||||
#: netbox/templates/users/objectpermission.html:21
|
||||
#: netbox/templates/users/owner.html:30
|
||||
#: netbox/templates/users/ownergroup.html:27
|
||||
#: netbox/templates/vpn/ikepolicy.html:17
|
||||
#: netbox/templates/vpn/ikeproposal.html:17
|
||||
#: netbox/templates/vpn/ipsecpolicy.html:17
|
||||
@@ -1344,9 +1340,6 @@ msgstr ""
|
||||
#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23
|
||||
#: netbox/templates/ipam/panels/fhrp_groups.html:9
|
||||
#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/tenant.html:20
|
||||
#: netbox/templates/users/group.html:6 netbox/templates/users/group.html:14
|
||||
#: netbox/templates/users/owner.html:26
|
||||
#: netbox/templates/users/ownergroup.html:20
|
||||
#: netbox/templates/vpn/tunnel.html:29
|
||||
#: netbox/templates/wireless/wirelesslan.html:18
|
||||
#: netbox/tenancy/forms/bulk_edit.py:44 netbox/tenancy/forms/bulk_import.py:46
|
||||
@@ -1743,10 +1736,6 @@ msgstr ""
|
||||
#: netbox/templates/tenancy/contactgroup.html:21
|
||||
#: netbox/templates/tenancy/contactrole.html:18
|
||||
#: netbox/templates/tenancy/tenantgroup.html:29
|
||||
#: netbox/templates/users/group.html:17
|
||||
#: netbox/templates/users/objectpermission.html:17
|
||||
#: netbox/templates/users/owner.html:22
|
||||
#: netbox/templates/users/ownergroup.html:23
|
||||
#: netbox/templates/vpn/ikepolicy.html:13
|
||||
#: netbox/templates/vpn/ikeproposal.html:13
|
||||
#: netbox/templates/vpn/ipsecpolicy.html:13
|
||||
@@ -2117,8 +2106,7 @@ msgid "Local"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/core/data_backends.py:64 netbox/core/tables/change_logging.py:21
|
||||
#: netbox/templates/account/profile.html:13 netbox/templates/users/user.html:15
|
||||
#: netbox/users/tables.py:64
|
||||
#: netbox/templates/account/profile.html:13 netbox/users/tables.py:64
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
@@ -2189,7 +2177,6 @@ msgstr ""
|
||||
#: netbox/templates/extras/eventrule.html:17
|
||||
#: netbox/templates/extras/savedfilter.html:25
|
||||
#: netbox/templates/extras/tableconfig.html:33
|
||||
#: netbox/templates/users/objectpermission.html:25
|
||||
#: netbox/users/forms/bulk_edit.py:87 netbox/users/forms/bulk_edit.py:105
|
||||
#: netbox/users/forms/filtersets.py:67 netbox/users/forms/filtersets.py:133
|
||||
#: netbox/users/tables.py:30 netbox/users/tables.py:113
|
||||
@@ -2302,8 +2289,7 @@ msgstr ""
|
||||
#: netbox/templates/core/objectchange.html:36
|
||||
#: netbox/templates/extras/savedfilter.html:21
|
||||
#: netbox/templates/extras/tableconfig.html:29
|
||||
#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:4
|
||||
#: netbox/templates/users/user.html:12 netbox/users/filtersets.py:135
|
||||
#: netbox/templates/inc/user_menu.html:31 netbox/users/filtersets.py:135
|
||||
#: netbox/users/filtersets.py:217 netbox/users/forms/filtersets.py:81
|
||||
#: netbox/users/forms/filtersets.py:126 netbox/users/forms/model_forms.py:181
|
||||
#: netbox/users/forms/model_forms.py:221 netbox/users/tables.py:22
|
||||
@@ -2747,7 +2733,7 @@ msgid "Deletion is prevented by a protection rule: {message}"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/core/tables/change_logging.py:26
|
||||
#: netbox/templates/account/profile.html:17 netbox/templates/users/user.html:19
|
||||
#: netbox/templates/account/profile.html:17
|
||||
msgid "Full Name"
|
||||
msgstr ""
|
||||
|
||||
@@ -5963,8 +5949,7 @@ msgstr ""
|
||||
#: netbox/dcim/forms/object_create.py:312 netbox/dcim/tables/devices.py:1130
|
||||
#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:43
|
||||
#: netbox/templates/dcim/virtualchassis_edit.html:59
|
||||
#: netbox/templates/ipam/fhrpgroup.html:38
|
||||
#: netbox/templates/users/ownergroup.html:35
|
||||
#: netbox/templates/ipam/fhrpgroup.html:38 netbox/users/views.py:347
|
||||
msgid "Members"
|
||||
msgstr ""
|
||||
|
||||
@@ -8828,7 +8813,6 @@ msgstr ""
|
||||
#: netbox/extras/forms/bulk_import.py:318
|
||||
#: netbox/extras/forms/model_forms.py:414 netbox/netbox/navigation/menu.py:415
|
||||
#: netbox/templates/extras/notificationgroup.html:41
|
||||
#: netbox/templates/users/group.html:29 netbox/templates/users/owner.html:46
|
||||
#: netbox/users/forms/filtersets.py:181 netbox/users/forms/model_forms.py:265
|
||||
#: netbox/users/forms/model_forms.py:277 netbox/users/forms/model_forms.py:352
|
||||
#: netbox/users/forms/model_forms.py:483 netbox/users/forms/model_forms.py:498
|
||||
@@ -8845,8 +8829,7 @@ msgstr ""
|
||||
#: netbox/netbox/navigation/menu.py:416
|
||||
#: netbox/templates/extras/notificationgroup.html:31
|
||||
#: netbox/templates/tenancy/contact.html:21
|
||||
#: netbox/templates/users/owner.html:36 netbox/tenancy/forms/bulk_edit.py:121
|
||||
#: netbox/tenancy/forms/filtersets.py:107
|
||||
#: netbox/tenancy/forms/bulk_edit.py:121 netbox/tenancy/forms/filtersets.py:107
|
||||
#: netbox/tenancy/forms/model_forms.py:93 netbox/tenancy/tables/contacts.py:57
|
||||
#: netbox/tenancy/tables/contacts.py:101 netbox/users/forms/filtersets.py:176
|
||||
#: netbox/users/forms/model_forms.py:210 netbox/users/forms/model_forms.py:222
|
||||
@@ -10008,7 +9991,7 @@ msgstr ""
|
||||
#: netbox/extras/tables/tables.py:517 netbox/extras/tables/tables.py:555
|
||||
#: netbox/templates/extras/customfield.html:105
|
||||
#: netbox/templates/extras/eventrule.html:27
|
||||
#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:110
|
||||
#: netbox/templates/users/panels/object_types.html:3 netbox/users/tables.py:110
|
||||
msgid "Object Types"
|
||||
msgstr ""
|
||||
|
||||
@@ -10059,7 +10042,7 @@ msgstr ""
|
||||
#: netbox/netbox/forms/mixins.py:162 netbox/netbox/forms/mixins.py:187
|
||||
#: netbox/netbox/tables/tables.py:292 netbox/netbox/tables/tables.py:307
|
||||
#: netbox/netbox/tables/tables.py:322 netbox/templates/generic/object.html:61
|
||||
#: netbox/templates/users/owner.html:19 netbox/users/forms/model_forms.py:481
|
||||
#: netbox/users/forms/model_forms.py:481
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
|
||||
@@ -12506,7 +12489,7 @@ msgstr ""
|
||||
#: netbox/templates/dcim/manufacturer.html:8
|
||||
#: netbox/templates/extras/tableconfig_edit.html:29
|
||||
#: netbox/templates/generic/bulk_add_component.html:22
|
||||
#: netbox/templates/users/objectpermission.html:38
|
||||
#: netbox/users/ui/panels.py:52
|
||||
#: netbox/utilities/templates/helpers/table_config_form.html:20
|
||||
#: netbox/utilities/templates/widgets/splitmultiselect.html:11
|
||||
#: netbox/utilities/templatetags/buttons.py:175
|
||||
@@ -12543,8 +12526,7 @@ msgstr ""
|
||||
#: netbox/templates/htmx/delete_form.html:70
|
||||
#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48
|
||||
#: netbox/templates/ipam/panels/fhrp_groups.html:34
|
||||
#: netbox/templates/users/objectpermission.html:46
|
||||
#: netbox/utilities/templatetags/buttons.py:146
|
||||
#: netbox/users/ui/panels.py:54 netbox/utilities/templatetags/buttons.py:146
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
@@ -12801,13 +12783,13 @@ msgstr ""
|
||||
msgid "Copy"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/netbox/ui/attrs.py:212
|
||||
#: netbox/netbox/ui/attrs.py:213
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Invalid decoding option: {decoding}! Must be one of {image_decoding_choices}"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/netbox/ui/attrs.py:343
|
||||
#: netbox/netbox/ui/attrs.py:344
|
||||
msgid "GPS coordinates"
|
||||
msgstr ""
|
||||
|
||||
@@ -13077,26 +13059,25 @@ msgid "Account Details"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/account/profile.html:27
|
||||
#: netbox/templates/tenancy/contact.html:53 netbox/templates/users/user.html:23
|
||||
#: netbox/templates/tenancy/contact.html:53
|
||||
#: netbox/tenancy/forms/bulk_edit.py:104
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/account/profile.html:31 netbox/templates/users/user.html:27
|
||||
#: netbox/templates/account/profile.html:31
|
||||
msgid "Account Created"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/account/profile.html:35 netbox/templates/users/user.html:31
|
||||
#: netbox/templates/account/profile.html:35
|
||||
msgid "Last Login"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/account/profile.html:39 netbox/templates/users/user.html:39
|
||||
#: netbox/templates/account/profile.html:39 netbox/users/ui/panels.py:39
|
||||
msgid "Superuser"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/account/profile.html:47
|
||||
#: netbox/templates/users/objectpermission.html:82
|
||||
#: netbox/templates/users/user.html:47
|
||||
#: netbox/templates/account/profile.html:47 netbox/users/views.py:104
|
||||
#: netbox/users/views.py:283
|
||||
msgid "Assigned Groups"
|
||||
msgstr ""
|
||||
|
||||
@@ -13126,14 +13107,7 @@ msgstr ""
|
||||
#: netbox/templates/ipam/panels/fhrp_groups.html:42
|
||||
#: netbox/templates/ui/panels/comments.html:9
|
||||
#: netbox/templates/ui/panels/related_objects.html:22
|
||||
#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44
|
||||
#: netbox/templates/users/group.html:54
|
||||
#: netbox/templates/users/objectpermission.html:77
|
||||
#: netbox/templates/users/objectpermission.html:87
|
||||
#: netbox/templates/users/owner.html:41 netbox/templates/users/owner.html:51
|
||||
#: netbox/templates/users/ownergroup.html:40
|
||||
#: netbox/templates/users/user.html:52 netbox/templates/users/user.html:62
|
||||
#: netbox/templates/users/user.html:72
|
||||
#: netbox/templates/users/panels/object_types.html:8
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
@@ -13465,8 +13439,7 @@ msgstr ""
|
||||
msgid "every %(interval)s minutes"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/core/objectchange.html:29
|
||||
#: netbox/templates/users/objectpermission.html:42
|
||||
#: netbox/templates/core/objectchange.html:29 netbox/users/ui/panels.py:53
|
||||
msgid "Change"
|
||||
msgstr ""
|
||||
|
||||
@@ -14252,8 +14225,8 @@ msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/virtualchassis_add_member.html:27
|
||||
#: netbox/templates/generic/object_edit.html:78
|
||||
#: netbox/templates/users/objectpermission.html:31
|
||||
#: netbox/users/forms/filtersets.py:64 netbox/users/forms/model_forms.py:373
|
||||
#: netbox/users/ui/panels.py:49
|
||||
msgid "Actions"
|
||||
msgstr ""
|
||||
|
||||
@@ -15392,45 +15365,19 @@ msgstr ""
|
||||
msgid "Local time"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:57
|
||||
msgid "Assigned Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/group.html:49 netbox/templates/users/user.html:67
|
||||
msgid "Owner Membership"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/inc/user_activity.html:6
|
||||
#: netbox/templates/users/inc/user_activity.html:6 netbox/users/views.py:118
|
||||
msgid "Recent Activity"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/inc/user_activity.html:9
|
||||
#: netbox/templates/users/inc/user_activity.html:9 netbox/users/views.py:123
|
||||
msgid "View All"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/objectpermission.html:6
|
||||
#: netbox/templates/users/objectpermission.html:14
|
||||
#: netbox/templates/users/objectpermission.html:4
|
||||
#: netbox/users/forms/filtersets.py:63
|
||||
msgid "Permission"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/objectpermission.html:34
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/objectpermission.html:52
|
||||
#: netbox/users/forms/model_forms.py:363 netbox/users/forms/model_forms.py:376
|
||||
msgid "Constraints"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/objectpermission.html:72
|
||||
msgid "Assigned Users"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/ownergroup.html:11
|
||||
msgid "Add Owner"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/users/token.html:4 netbox/users/forms/bulk_import.py:48
|
||||
#: netbox/users/forms/filtersets.py:117 netbox/users/forms/model_forms.py:127
|
||||
msgid "Token"
|
||||
@@ -15987,6 +15934,11 @@ msgstr ""
|
||||
msgid "Actions granted in addition to those listed above"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/forms/model_forms.py:363 netbox/users/forms/model_forms.py:376
|
||||
#: netbox/users/views.py:275
|
||||
msgid "Constraints"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/forms/model_forms.py:365
|
||||
msgid ""
|
||||
"JSON expression of a queryset filter that will return only permitted "
|
||||
@@ -16206,6 +16158,34 @@ msgstr ""
|
||||
msgid "Example Usage"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/ui/panels.py:32
|
||||
msgid "Full name"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/ui/panels.py:36
|
||||
msgid "Account created"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/ui/panels.py:37
|
||||
msgid "Last login"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/ui/panels.py:51
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/views.py:108 netbox/users/views.py:206
|
||||
msgid "Assigned Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/views.py:112 netbox/users/views.py:210
|
||||
msgid "Owner Membership"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/users/views.py:280
|
||||
msgid "Assigned Users"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/utilities/api.py:184
|
||||
#, python-brace-format
|
||||
msgid "Related object not found using the provided attributes: {params}"
|
||||
|
||||
Reference in New Issue
Block a user