Compare commits

..

5 Commits

Author SHA1 Message Date
Jeremy Stretch
23e5daa482 Fixes #21556: Restore previous value (if applicable) after clearing related dropdown 2026-03-11 16:54:34 -04:00
Martin Hauser
cac3c1221c Closes #21631: Remove duplicate 'created' field in RackReservation table (#21632) 2026-03-11 11:49:01 -05:00
Jeremy Stretch
3a9d00a537 Update the lock-threads workflow 2026-03-11 08:56:39 -04:00
github-actions
4040e4f266 Update source translation strings 2026-03-11 05:19:17 +00:00
Jeremy Stretch
f938309ed9 Second attempt to fix @claude for PRs from forks (#21633) 2026-03-10 10:35:28 -07:00
11 changed files with 137 additions and 155 deletions

View File

@@ -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

View File

@@ -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'

View File

@@ -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')

View File

@@ -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

View File

@@ -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):
"""

View File

@@ -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

View File

@@ -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)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -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);
}
}

View File

@@ -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}"