From 1afa476a19396fd48bd390521dc16e1cd4628114 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 May 2024 15:28:36 -0400 Subject: [PATCH 01/11] PRVB --- netbox/netbox/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 031c984f1..23803ccc1 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.7.7' +VERSION = '3.7.8-dev' # Hostname HOSTNAME = platform.node() From 2c1a9ae455c42f4dae52383a53e08ada38a263d1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 3 May 2024 08:33:47 -0400 Subject: [PATCH 02/11] Fixes #15925: Fix rendering of cable traces to circuit terminations --- netbox/dcim/svg/cables.py | 7 ++-- netbox/dcim/tests/test_cablepaths.py | 63 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 596f0c6bf..82eb9a417 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -223,7 +223,7 @@ class CableTraceSVG: nodes_height = 0 nodes = [] # Sort them by name to make renders more readable - for i, term in enumerate(sorted(terminations, key=lambda x: x.name)): + for i, term in enumerate(sorted(terminations, key=lambda x: str(x))): node = Node( position=(offset_x + i * width, self.cursor), width=width, @@ -266,7 +266,7 @@ class CableTraceSVG: Draw the far-end objects and its terminations and return all created nodes """ # Make sure elements are sorted by name for readability - objects = sorted(obj_list, key=lambda x: x.name) + objects = sorted(obj_list, key=lambda x: str(x)) width = self.width / len(objects) # Max-height of created terminations @@ -361,7 +361,8 @@ class CableTraceSVG: # Connector (a Cable or WirelessLink) if links: - parent_object_nodes, far_terminations = self.draw_far_objects(set(end.parent_object for end in far_ends), far_ends) + obj_list = {end.parent_object for end in far_ends} + parent_object_nodes, far_terminations = self.draw_far_objects(obj_list, far_ends) for cable in links: # Fill in labels and description with all available data description = [ diff --git a/netbox/dcim/tests/test_cablepaths.py b/netbox/dcim/tests/test_cablepaths.py index a827939f7..66f712ff7 100644 --- a/netbox/dcim/tests/test_cablepaths.py +++ b/netbox/dcim/tests/test_cablepaths.py @@ -394,6 +394,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 2 cable2.delete() path1 = self.assertPathExists( @@ -450,6 +453,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 2 cable2.delete() path1 = self.assertPathExists( @@ -558,6 +564,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 3 cable3.delete() @@ -673,6 +682,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 3 cable3.delete() @@ -804,6 +816,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 3 cable3.delete() @@ -931,6 +946,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 5 cable5.delete() @@ -1034,6 +1052,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 3 cable3.delete() @@ -1093,6 +1114,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 3) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 1 cable1.delete() @@ -1135,6 +1159,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 1) + # Test SVG generation + CableTraceSVG(interface1).render() + def test_210_interface_to_circuittermination(self): """ [IF1] --C1-- [CT1] @@ -1156,6 +1183,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 1) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 1 cable1.delete() self.assertEqual(CablePath.objects.count(), 0) @@ -1212,6 +1242,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 2 cable2.delete() path1 = self.assertPathExists( @@ -1277,6 +1310,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 2 cable2.delete() path1 = self.assertPathExists( @@ -1314,6 +1350,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 1) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 1 cable1.delete() self.assertEqual(CablePath.objects.count(), 0) @@ -1342,6 +1381,9 @@ class CablePathTestCase(TestCase): self.assertEqual(CablePath.objects.count(), 1) self.assertTrue(CablePath.objects.first().is_complete) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 1 cable1.delete() self.assertEqual(CablePath.objects.count(), 0) @@ -1439,6 +1481,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cables 3-4 cable3.delete() cable4.delete() @@ -1495,6 +1540,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 2 cable2.delete() path1 = self.assertPathExists( @@ -1578,6 +1626,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 2 cable2.delete() @@ -1697,6 +1748,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 4) + # Test SVG generation + CableTraceSVG(interface1).render() + # Delete cable 3 cable3.delete() @@ -1784,6 +1838,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 2) + # Test SVG generation + CableTraceSVG(interface1).render() + def test_220_interface_to_interface_duplex_via_multiple_front_and_rear_ports(self): """ [IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- [IF2] @@ -1877,6 +1934,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 3) + # Test SVG generation + CableTraceSVG(interface1).render() + def test_221_non_symmetric_paths(self): """ [IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- -------------------------------------- [IF2] @@ -1997,6 +2057,9 @@ class CablePathTestCase(TestCase): ) self.assertEqual(CablePath.objects.count(), 3) + # Test SVG generation + CableTraceSVG(interface1).render() + def test_301_create_path_via_existing_cable(self): """ [IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- [IF2] From 53e1ab5fc50b9accc7ac17257e813454819cf61b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 3 May 2024 09:20:25 -0400 Subject: [PATCH 03/11] Fixes #15877: Consider VC membership when assigning LAG interfaces via bulk edit --- netbox/dcim/forms/bulk_edit.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 68d8d4f89..142aed3c6 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -1411,9 +1411,9 @@ class InterfaceBulkEditForm( device = Device.objects.filter(pk=self.initial['device']).first() # Restrict parent/bridge/LAG interface assignment by device - self.fields['parent'].widget.add_query_param('device_id', device.pk) - self.fields['bridge'].widget.add_query_param('device_id', device.pk) - self.fields['lag'].widget.add_query_param('device_id', device.pk) + self.fields['parent'].widget.add_query_param('virtual_chassis_member_id', device.pk) + self.fields['bridge'].widget.add_query_param('virtual_chassis_member_id', device.pk) + self.fields['lag'].widget.add_query_param('virtual_chassis_member_id', device.pk) # Limit VLAN choices by device self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk) From a544b55e9e8872c616ba28dafbb0c1e30fbb5142 Mon Sep 17 00:00:00 2001 From: Nancy Yang Date: Fri, 3 May 2024 13:22:29 -0400 Subject: [PATCH 04/11] Fixes #15917: slim-select-pagination-bug-fix : fixed several bugs related to slim select (#15918) * slim-select-pagination-bug-fix : fixed several bugs related to slim select search box gui element 1. If user enters a search text in the filter text box, the user will not be able to scroll to the next page. That is the user will only be able to see the first page of returned item with a none empty search string. 2. User will not be able to select an item returned from search query if user clicks reload after a dynami search. When the user is able to load a second page, the user will be able to select an item from the third+ page if previous bug is fixed. * Recompile static assets --------- Co-authored-by: Jeremy Stretch --- netbox/project-static/dist/netbox.js | Bin 529484 -> 529723 bytes netbox/project-static/dist/netbox.js.map | Bin 450007 -> 450193 bytes .../src/select/api/apiSelect.ts | 71 ++++++++++++------ 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index b6dd11eda19dccd93a677378ba6a93e09e6ea814..d5b0ce28a4066784c132f4a98853ecb03606f227 100644 GIT binary patch delta 1609 zcmah}U1%It6lS-Zd!lI~+BQUEnq;h-89P}LMXA{g!O&Q#)z*ly&=NAc_a=Mk>}+yp zCNaiEiVsButG4EX6@Ngn5sG3S=D{d5>4S)nh)^)LjedEIy8WRJ)Yx5BQNAG97A)nCnX#C>xkMUbo?m~7 zoUQ9|nEQN%UCjt>#$xWwq-lAqCohUdMxReh-Nw*?9E4Am-ns31USMY*~{bbsPUajJ7)r|aj zl{~g(Q z<21cJFH+pjS{`MNs?5wNS~4lGuabM8$O}xVl?sf;QPEk_hfgp?P1h`stJ2`|8iG4T)Pa7HM$6VgIRb8eZ?$Xgu5s&4IDj| zty2G)6EL)UdvIHxIQ74H9UiICk)$h#pDb|N)|IBb_kbv;MPu(?EqHn8KOl}#zu`0- zN}%{-XW(#x@;+6*En%lzJOiH)%9F|V33=-SX!cK?g?D3!Yng@Pc)UCdM^V{NvoIV) zKYR{)G1{QMI0tVa&cFFSjMkxtork5M85^HLN*|n6|+B*CbzbEpz!Ac1n@~`XA)EwQHmksTY xB4z6aG$Hf84QRpjGqeHQi4oy%U+#`;x|_DUnRWRjJH+i1(PHyIya5;P{}+@QIUxW5 delta 1411 zcmZ`(U1%It6lT-SJqd}5v^Mo;iW2x{iSjJYR|kugrZ zvSz0GLcV)TXonv06|8;Km>pzRP_0YezlM5yEM7Piwk})7j?Ktx z1oKi^x8(loNVFHZZgF|-Ix774d0-Wt-(7bfBYvse=#^LReKyQwY8ArAi6&=P(Y_${ z6B_D}zu!a?2d61vcJd*S%^R6TZd8rxrb=Y&ul7B=81ZMOFcV~;!mEWM&-z%U@lE;e z8cNEQo2X|*0aYVs@ho*pOxVQJwV4^sn4Q%hmfPaZat*UySvZ%hjeVT;8f~a>iEp7x zJ?V6+$PYKJ+3a&6)h|;&qh2|18+B)lfmEHMiKf#NhzpC?6Z1Qy{b9dw5Jx zLydta6~Y`{1bGG{z1^Xe6JKyADS}VV!Txqr&_Z7rKjl(8*_RVEKghF;IOBd_#i(nf`87#a9q_fRD+{&K@aP4wFW!nmo@kd395QODObOSox$XX@KH?pbxSy* z1eNfXs%%NZ+hKI-0_0V6K?L{$ys!L%-#&)1E`_{)36{fqtzCqy9Gr&(3aie;VuzCb zi|}U1dG-nzN?p7HxsEQy;t73(8#y8W{8lwi1c|HAsf8rB?m$8&Zve>QyD+Gb+FjTa zGJLfLscoti@`YC*BNy&~9+>yw*dyv;pI(Rj_Gq$2p_YOZjxqRg9sX{!BE-ijJR+^MCjM#wYuCT4_!&uRFkBev((9dQ}t76KkQPWy<@;< zWPrNc@|dnuf0P^0Nxf!D$R?u{?c7IbdMX+J0pCYw2$jAN;!R3$Eji%=-w{ElW*Tff zK(#7`wrfKWcfG$AJLs*lgTUC6pWyH2V`LlD2a$Sic0r2D2WTh^=p~Q)nHx&qmZGar zue=b5bDDc#v3kj;j9N$U6^EMmG`A3aLb=`_(l;ACp?Ene&USa*g&Y5U=dXcYHG6k) z3&VN)X9(*BW8XK66U91JwtIaj723(!FSvd4RvgP%QO$CkT%N(j=wrR<{*;dRcbB zmI_y>t&d7Dh@hf{omL`7BR=)^q35-F}xs33RPLra&J7@tW88MGN?GRMf(pR z#$8lPX~EGPBie!?Su;_T2LE>l%MQzGB23X{qgwlIB3Pft>@0mfg4e+`JFF;YdR3-3 z3l(j@Ko6a*LZZ9CTTRt01pfwe3}ow?`tM?G = null; /** * Scroll position of options is at the bottom of the list, or not. Used to determine if * additional options should be fetched from the API. @@ -359,30 +363,41 @@ export class APISelect { this.slim.enable(); } + private setSearchKey(event: Event) { + const { value: q } = event.target as HTMLInputElement; + this.searchKey = q + } + /** * Add event listeners to this element and its dependencies so that when dependencies change * this element's options are updated. */ private addEventListeners(): void { // Create a debounced function to fetch options based on the search input value. - const fetcher = debounce((event: Event) => this.handleSearch(event), 300, false); + const fetcher = debounce((action:ApplyMethod, url: Nullable) => this.handleSearch(action, url), 300, false); // Query the API when the input value changes or a value is pasted. this.slim.slim.search.input.addEventListener('keyup', event => { // Only search when necessary keys are pressed. if (!event.key.match(/^(Arrow|Enter|Tab).*/)) { - return fetcher(event); + this.setSearchKey(event); + return fetcher('replace', null); } }); - this.slim.slim.search.input.addEventListener('paste', event => fetcher(event)); + this.slim.slim.search.input.addEventListener('paste', event => { + this.setSearchKey(event); + return fetcher('replace', null);; +}); // Watch every scroll event to determine if the scroll position is at bottom. this.slim.slim.list.addEventListener('scroll', () => this.handleScroll()); // When the scroll position is at bottom, fetch additional options. - this.base.addEventListener(`netbox.select.atbottom.${this.name}`, () => - this.fetchOptions(this.more, 'merge'), - ); + this.base.addEventListener(`netbox.select.atbottom.${this.name}`, () => { + if (this.more!=null) { + return fetcher('merge', this.more, ) + } + }); // When the base select element is disabled or enabled, properly disable/enable this instance. this.base.addEventListener(`netbox.select.disabled.${this.name}`, event => @@ -551,6 +566,14 @@ export class APISelect { } } + private getUrl() { + var url = this.queryUrl + if (this.searchKey!=null) { + url = queryString.stringifyUrl({ url: this.queryUrl, query: { q : this.searchKey } }) + } + return url + } + /** * Query the NetBox API for this element's options. */ @@ -559,21 +582,25 @@ export class APISelect { this.resetOptions(); return; } - await this.fetchOptions(this.queryUrl, action); + const url = this.getUrl() + await this.fetchOptions(url, action); } /** * Query the API for a specific search pattern and add the results to the available options. */ - private async handleSearch(event: Event) { - const { value: q } = event.target as HTMLInputElement; - const url = queryString.stringifyUrl({ url: this.queryUrl, query: { q } }); - if (!url.includes(`{{`)) { - await this.fetchOptions(url, 'merge'); - this.slim.data.search(q); - this.slim.render(); + private async handleSearch(action: ApplyMethod = 'merge', url: Nullable ) { + if (url==null) { + url = this.getUrl() } - return; + if (url.includes(`{{`)) { + return + } + await this.fetchOptions(url, action); + if (this.searchKey!=null) { + this.slim.data.search(this.searchKey); + } + this.slim.render(); } /** @@ -586,13 +613,11 @@ export class APISelect { Math.floor(this.slim.slim.list.scrollTop) + this.slim.slim.list.offsetHeight === this.slim.slim.list.scrollHeight; - if (this.atBottom && !atBottom) { - this.atBottom = false; + this.atBottom = atBottom + + if (this.atBottom) { this.base.dispatchEvent(this.bottomEvent); - } else if (!this.atBottom && atBottom) { - this.atBottom = true; - this.base.dispatchEvent(this.bottomEvent); - } + } } /** @@ -994,7 +1019,9 @@ export class APISelect { ['btn', 'btn-sm', 'btn-ghost-dark'], [createElement('i', null, ['mdi', 'mdi-reload'])], ); - refreshButton.addEventListener('click', () => this.loadData()); + // calling this.loadData() will prevent first page of returned items + // with non-null search key inplace not selectable + refreshButton.addEventListener('click', () => this.handleSearch('replace', null)); refreshButton.type = 'button'; this.slim.slim.search.container.appendChild(refreshButton); } From ed7a0a32cc0c6372c6298dc22d2b4584d386217b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 3 May 2024 17:34:45 -0400 Subject: [PATCH 05/11] Changelog for #15877, #15917, #15925 --- docs/release-notes/version-3.7.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 337526c14..d3ae2c3ea 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,5 +1,15 @@ # NetBox v3.7 +## v3.7.8 (FUTURE) + +### Bug Fixes + +* [#15877](https://github.com/netbox-community/netbox/issues/15877) - Account for virtual chassis membership when assigning related interfaces via bulk edit +* [#15917](https://github.com/netbox-community/netbox/issues/15917) - Fix pagination through search results within dropdown fields +* [#15925](https://github.com/netbox-community/netbox/issues/15925) - Fix SVG rendering of cable traces to circuit terminations + +--- + ## v3.7.7 (2024-05-01) ### Enhancements From 552c81509ad7a8406e7924b0ce54ccc2d1b141f5 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 3 May 2024 11:39:03 -0700 Subject: [PATCH 06/11] 12127 enable cable add button --- netbox/dcim/views.py | 6 ------ netbox/netbox/navigation/menu.py | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 805e9d881..bdd92a979 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -3166,12 +3166,6 @@ class CableListView(generic.ObjectListView): filterset = filtersets.CableFilterSet filterset_form = forms.CableFilterForm table = tables.CableTable - actions = { - 'import': {'add'}, - 'export': {'view'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, - } @register_model_view(Cable) diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index d4969386e..25a63f908 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -102,7 +102,7 @@ CONNECTIONS_MENU = Menu( MenuGroup( label=_('Connections'), items=( - get_model_item('dcim', 'cable', _('Cables'), actions=['import']), + get_model_item('dcim', 'cable', _('Cables')), get_model_item('wireless', 'wirelesslink', _('Wireless Links')), MenuItem( link='dcim:interface_connections_list', From 85d250014fbe2403223b2dd766c8fbd4b5ded39e Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Mon, 6 May 2024 08:48:14 -0500 Subject: [PATCH 07/11] Fixes: #15948 - Fixes cable fanin/fanout when both are required (#15953) * Preliminary fix for #15948 * Tweaking of line height --- netbox/dcim/svg/cables.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 82eb9a417..daf595257 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -17,7 +17,7 @@ PADDING = 10 LINE_HEIGHT = 20 FANOUT_HEIGHT = 35 FANOUT_LEG_HEIGHT = 15 -CABLE_HEIGHT = 4 * LINE_HEIGHT + FANOUT_HEIGHT + FANOUT_LEG_HEIGHT +CABLE_HEIGHT = 5 * LINE_HEIGHT + FANOUT_HEIGHT + FANOUT_LEG_HEIGHT class Node(Hyperlink): @@ -405,7 +405,17 @@ class CableTraceSVG: end = far[0].top_center text_offset = 0 - if len(near) > 1: + if len(near) > 1 and len(far) > 1: + start_center = sum([pos.bottom_center[0] for pos in near]) / len(near) + end_center = sum([pos.bottom_center[0] for pos in far]) / len(far) + center_x = (start_center + end_center) / 2 + + start = (center_x, start[1] + FANOUT_HEIGHT + FANOUT_LEG_HEIGHT) + end = (center_x, end[1] - FANOUT_HEIGHT - FANOUT_LEG_HEIGHT) + text_offset -= (FANOUT_HEIGHT + FANOUT_LEG_HEIGHT) + self.draw_fanin(start, near, color) + self.draw_fanout(end, far, color) + elif len(near) > 1: # Handle Fan-In - change start position to be directly below start start = (end[0], start[1] + FANOUT_HEIGHT + FANOUT_LEG_HEIGHT) self.draw_fanin(start, near, color) From 6dd311f6004da3076951ac5dc3c967cc52c09bdc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 May 2024 09:26:20 -0400 Subject: [PATCH 08/11] Fixes #15961: Fix secret toggle button by avoiding duplicate event handler --- netbox/project-static/dist/netbox.js | Bin 529723 -> 529768 bytes netbox/project-static/dist/netbox.js.map | Bin 450193 -> 450225 bytes .../src/buttons/secretToggle.ts | 13 ++++++------- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index d5b0ce28a4066784c132f4a98853ecb03606f227..05dbfa99386efa21e073dc0a9ad732746796bf47 100644 GIT binary patch delta 17518 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 delta 17395 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 diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index e4edee5f23959d91ac87d409e65070b07ac0eb1e..37b54735a4b5bcd104edde507d0fcee7ae579eda 100644 GIT binary patch delta 118 zcmbQZS9;@K>4p}@7N!>F7M2#)Eo}D8+V18~I+2c!8j*hubI?j&HRnAa0P$Ut= z^wmjq^v!af?!?Tdr4p}@7N!>F7M2#)Eo}D8%)TW~)3cb_^rlb$#wsD1>!joE=$Hs1e09>D V99=7%bv&IjT%ETcWM=zt3jpLu75V@G diff --git a/netbox/project-static/src/buttons/secretToggle.ts b/netbox/project-static/src/buttons/secretToggle.ts index 057a324e4..4113a0788 100644 --- a/netbox/project-static/src/buttons/secretToggle.ts +++ b/netbox/project-static/src/buttons/secretToggle.ts @@ -60,18 +60,17 @@ function handleSecretToggle(state: StateManager, button: HTMLButton toggleSecretButton(hidden, button); } +function toggleCallback(event: MouseEvent) { + handleSecretToggle(secretState, event.currentTarget as HTMLButtonElement); +} + /** * Initialize secret toggle button. */ export function initSecretToggle(): void { hideSecret(); for (const button of getElements('button.toggle-secret')) { - button.addEventListener( - 'click', - event => { - handleSecretToggle(secretState, event.currentTarget as HTMLButtonElement); - }, - false, - ); + button.removeEventListener('click', toggleCallback); + button.addEventListener('click', toggleCallback); } } From b1cfbbc472ed998f304a30db04c9d7f2996df499 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 May 2024 09:40:36 -0400 Subject: [PATCH 09/11] Fixes #15960: Use internal ManyToManyColumn to ensure proper export behavior --- netbox/dcim/tables/devices.py | 2 +- netbox/ipam/tables/ip.py | 2 +- netbox/vpn/tables/crypto.py | 4 ++-- netbox/vpn/tables/tunnels.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 800b55bf1..169631506 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -618,7 +618,7 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi verbose_name=_('VRF'), linkify=True ) - inventory_items = tables.ManyToManyColumn( + inventory_items = columns.ManyToManyColumn( linkify_item=True, verbose_name=_('Inventory Items'), ) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index 3b50b257d..8d25e5068 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -378,7 +378,7 @@ class IPAddressTable(TenancyColumnsMixin, NetBoxTable): orderable=False, verbose_name=_('NAT (Inside)') ) - nat_outside = tables.ManyToManyColumn( + nat_outside = columns.ManyToManyColumn( linkify_item=True, orderable=False, verbose_name=_('NAT (Outside)') diff --git a/netbox/vpn/tables/crypto.py b/netbox/vpn/tables/crypto.py index 5e102db24..474062b39 100644 --- a/netbox/vpn/tables/crypto.py +++ b/netbox/vpn/tables/crypto.py @@ -63,7 +63,7 @@ class IKEPolicyTable(NetBoxTable): mode = tables.Column( verbose_name=_('Mode') ) - proposals = tables.ManyToManyColumn( + proposals = columns.ManyToManyColumn( linkify_item=True, verbose_name=_('Proposals') ) @@ -129,7 +129,7 @@ class IPSecPolicyTable(NetBoxTable): verbose_name=_('Name'), linkify=True ) - proposals = tables.ManyToManyColumn( + proposals = columns.ManyToManyColumn( linkify_item=True, verbose_name=_('Proposals') ) diff --git a/netbox/vpn/tables/tunnels.py b/netbox/vpn/tables/tunnels.py index cf4230652..94f65e573 100644 --- a/netbox/vpn/tables/tunnels.py +++ b/netbox/vpn/tables/tunnels.py @@ -91,7 +91,7 @@ class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable): verbose_name=_('Tunnel interface'), linkify=True ) - ip_addresses = tables.ManyToManyColumn( + ip_addresses = columns.ManyToManyColumn( accessor=tables.A('termination__ip_addresses'), orderable=False, linkify_item=True, From 0d7bac433ed129e9302cd8fe015457975bdb1580 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 5 May 2024 17:09:31 +0000 Subject: [PATCH 10/11] Translate django.po in ja 100% translated source file: 'django.po' on 'ja'. --- netbox/translations/ja/LC_MESSAGES/django.po | 467 +++++++++++-------- 1 file changed, 262 insertions(+), 205 deletions(-) diff --git a/netbox/translations/ja/LC_MESSAGES/django.po b/netbox/translations/ja/LC_MESSAGES/django.po index 34193822c..fee37274a 100644 --- a/netbox/translations/ja/LC_MESSAGES/django.po +++ b/netbox/translations/ja/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-04 19:11+0000\n" +"POT-Creation-Date: 2024-04-22 19:49+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: teapot, 2024\n" "Language-Team: Japanese (https://app.transifex.com/netbox-community/teams/178115/ja/)\n" @@ -104,7 +104,7 @@ msgstr "廃止" #: dcim/filtersets.py:903 dcim/filtersets.py:1207 dcim/filtersets.py:1702 #: dcim/filtersets.py:1945 dcim/filtersets.py:2003 ipam/filtersets.py:305 #: ipam/filtersets.py:896 virtualization/filtersets.py:45 -#: virtualization/filtersets.py:173 vpn/filtersets.py:330 +#: virtualization/filtersets.py:173 vpn/filtersets.py:341 msgid "Region (ID)" msgstr "リージョン (ID)" @@ -114,7 +114,7 @@ msgstr "リージョン (ID)" #: dcim/filtersets.py:1952 dcim/filtersets.py:2010 extras/filtersets.py:414 #: ipam/filtersets.py:312 ipam/filtersets.py:903 #: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:325 +#: vpn/filtersets.py:336 msgid "Region (slug)" msgstr "リージョン (slug)" @@ -192,7 +192,7 @@ msgstr "サイト" #: dcim/filtersets.py:363 extras/filtersets.py:436 ipam/filtersets.py:215 #: ipam/filtersets.py:335 ipam/filtersets.py:926 #: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:335 +#: vpn/filtersets.py:346 msgid "Site (slug)" msgstr "サイト (slug)" @@ -238,7 +238,7 @@ msgstr "回線タイプ (slug)" #: dcim/filtersets.py:1969 dcim/filtersets.py:2028 ipam/filtersets.py:209 #: ipam/filtersets.py:329 ipam/filtersets.py:920 #: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:340 +#: vpn/filtersets.py:351 msgid "Site (ID)" msgstr "サイト (ID)" @@ -250,11 +250,11 @@ msgstr "サイト (ID)" #: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 #: extras/filtersets.py:645 ipam/forms/model_forms.py:416 #: netbox/filtersets.py:275 netbox/forms/__init__.py:23 -#: netbox/forms/base.py:163 templates/htmx/object_selector.html:28 +#: netbox/forms/base.py:158 templates/htmx/object_selector.html:28 #: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 #: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:87 #: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 -#: users/filtersets.py:117 utilities/forms/forms.py:99 +#: users/filtersets.py:117 utilities/forms/forms.py:105 msgid "Search" msgstr "検索" @@ -598,7 +598,7 @@ msgstr "サービス情報" #: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 #: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 #: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:679 -#: dcim/forms/model_forms.py:1485 ipam/forms/model_forms.py:61 +#: dcim/forms/model_forms.py:1574 ipam/forms/model_forms.py:61 #: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 #: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 #: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 @@ -639,18 +639,19 @@ msgstr "回線のタイプ" #: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 #: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 #: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +#: wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "運用状況" #: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 #: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:286 #: dcim/forms/bulk_import.py:428 dcim/forms/bulk_import.py:1171 -#: dcim/forms/bulk_import.py:1319 ipam/forms/bulk_import.py:41 -#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 -#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 -#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 -#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 -#: virtualization/forms/bulk_import.py:70 +#: dcim/forms/bulk_import.py:1319 dcim/forms/bulk_import.py:1383 +#: ipam/forms/bulk_import.py:41 ipam/forms/bulk_import.py:70 +#: ipam/forms/bulk_import.py:98 ipam/forms/bulk_import.py:118 +#: ipam/forms/bulk_import.py:138 ipam/forms/bulk_import.py:167 +#: ipam/forms/bulk_import.py:253 ipam/forms/bulk_import.py:289 +#: ipam/forms/bulk_import.py:455 virtualization/forms/bulk_import.py:70 #: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 #: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 msgid "Assigned tenant" @@ -1138,6 +1139,10 @@ msgstr "アカウント数" msgid "ASN Count" msgstr "ASN 数" +#: core/api/views.py:39 +msgid "This user does not have permission to synchronize this data source." +msgstr "このユーザーには、このデータソースを同期する権限がありません。" + #: core/choices.py:18 msgid "New" msgstr "新規" @@ -1267,9 +1272,9 @@ msgstr "パラメータ" msgid "Ignore rules" msgstr "ignoreルール" -#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 -#: extras/forms/model_forms.py:167 extras/forms/model_forms.py:464 -#: extras/forms/model_forms.py:517 extras/tables/tables.py:149 +#: core/forms/filtersets.py:26 core/forms/model_forms.py:96 +#: extras/forms/model_forms.py:167 extras/forms/model_forms.py:465 +#: extras/forms/model_forms.py:518 extras/tables/tables.py:149 #: extras/tables/tables.py:368 extras/tables/tables.py:403 #: templates/core/datasource.html:31 #: templates/dcim/device/render_config.html:19 @@ -1346,89 +1351,89 @@ msgstr "以前に完了" msgid "User" msgstr "ユーザ" -#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: core/forms/model_forms.py:53 core/tables/data.py:46 #: templates/core/datafile.html:36 templates/extras/report/base.html:33 #: templates/extras/script/base.html:32 templates/extras/script_result.html:45 msgid "Source" msgstr "ソース" -#: core/forms/model_forms.py:56 +#: core/forms/model_forms.py:57 msgid "Backend Parameters" msgstr "バックエンド設定" -#: core/forms/model_forms.py:94 +#: core/forms/model_forms.py:95 msgid "File Upload" msgstr "ファイルのアップロード" -#: core/forms/model_forms.py:106 +#: core/forms/model_forms.py:107 msgid "Cannot upload a file and sync from an existing file" msgstr "ファイルをアップロードして既存のファイルから同期することはできません" -#: core/forms/model_forms.py:108 +#: core/forms/model_forms.py:109 msgid "Must upload a file or select a data file to sync" msgstr "同期するファイルをアップロードするか、データファイルを選択する必要があります" -#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: core/forms/model_forms.py:151 templates/core/configrevision.html:43 #: templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "ラック図" -#: core/forms/model_forms.py:148 dcim/choices.py:1413 +#: core/forms/model_forms.py:152 dcim/choices.py:1413 #: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 #: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 #: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 msgid "Power" msgstr "電源" -#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: core/forms/model_forms.py:153 netbox/navigation/menu.py:142 #: templates/core/configrevision.html:79 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: core/forms/model_forms.py:154 netbox/navigation/menu.py:218 #: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 #: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 #: vpn/forms/model_forms.py:145 msgid "Security" msgstr "セキュリティ" -#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +#: core/forms/model_forms.py:155 templates/core/configrevision.html:107 msgid "Banners" msgstr "バナー" -#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +#: core/forms/model_forms.py:156 templates/core/configrevision.html:131 msgid "Pagination" msgstr "ページネーション" -#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: core/forms/model_forms.py:157 extras/forms/model_forms.py:63 #: templates/core/configrevision.html:147 msgid "Validation" msgstr "バリデーション" -#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: core/forms/model_forms.py:158 templates/account/preferences.html:6 #: templates/core/configrevision.html:175 msgid "User Preferences" msgstr "ユーザ設定" -#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: core/forms/model_forms.py:159 dcim/forms/filtersets.py:658 #: templates/core/configrevision.html:193 users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "その他" -#: core/forms/model_forms.py:158 +#: core/forms/model_forms.py:162 msgid "Config Revision" msgstr "設定履歴" -#: core/forms/model_forms.py:197 +#: core/forms/model_forms.py:201 msgid "This parameter has been defined statically and cannot be modified." msgstr "このパラメータは静的に定義されており、変更できません。" -#: core/forms/model_forms.py:205 +#: core/forms/model_forms.py:209 #, python-brace-format msgid "Current value: {value}" msgstr "現在の値: {value}" -#: core/forms/model_forms.py:207 +#: core/forms/model_forms.py:211 msgid " (default)" msgstr " (デフォルト)" @@ -1666,7 +1671,7 @@ msgstr "最終更新日" #: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 #: extras/tables/tables.py:174 extras/tables/tables.py:345 #: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 -#: wireless/tables/wirelesslink.py:16 +#: utilities/forms/forms.py:74 wireless/tables/wirelesslink.py:16 msgid "ID" msgstr "ID" @@ -1698,6 +1703,10 @@ msgstr "ファシリティ ID" msgid "Position (U)" msgstr "ポジション (U)" +#: dcim/api/serializers.py:671 +msgid "Deprecated in v3.6 in favor of `role`." +msgstr "v3.6で廃止され、`role`が採用されました。" + #: dcim/choices.py:21 virtualization/choices.py:21 msgid "Staging" msgstr "ステージング" @@ -1774,7 +1783,7 @@ msgstr "インチ" #: dcim/forms/bulk_import.py:778 dcim/forms/bulk_import.py:1033 #: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 #: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 -#: dcim/forms/model_forms.py:962 dcim/forms/model_forms.py:1303 +#: dcim/forms/model_forms.py:962 dcim/forms/model_forms.py:1392 #: dcim/forms/object_import.py:181 dcim/tables/devices.py:680 #: dcim/tables/devices.py:964 extras/tables/tables.py:181 #: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 @@ -1886,7 +1895,7 @@ msgstr "仮想" #: dcim/choices.py:796 dcim/choices.py:1022 dcim/forms/bulk_edit.py:1398 #: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:888 -#: dcim/forms/model_forms.py:1197 netbox/navigation/menu.py:128 +#: dcim/forms/model_forms.py:1286 netbox/navigation/menu.py:128 #: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 msgid "Wireless" msgstr "無線" @@ -2297,7 +2306,7 @@ msgstr "モジュールベイ (ID)" #: dcim/filtersets.py:1172 dcim/filtersets.py:1264 ipam/filtersets.py:577 #: ipam/filtersets.py:807 ipam/filtersets.py:1026 -#: virtualization/filtersets.py:161 vpn/filtersets.py:351 +#: virtualization/filtersets.py:161 vpn/filtersets.py:362 msgid "Device (ID)" msgstr "デバイス (ID)" @@ -2306,7 +2315,7 @@ msgid "Rack (name)" msgstr "ラック (名前)" #: dcim/filtersets.py:1270 ipam/filtersets.py:572 ipam/filtersets.py:802 -#: ipam/filtersets.py:1032 vpn/filtersets.py:346 +#: ipam/filtersets.py:1032 vpn/filtersets.py:357 msgid "Device (name)" msgstr "デバイス (名前)" @@ -2350,7 +2359,7 @@ msgstr "割当 VID" #: dcim/filtersets.py:1448 dcim/forms/bulk_edit.py:1374 #: dcim/forms/bulk_import.py:836 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1182 dcim/models/device_components.py:712 +#: dcim/forms/model_forms.py:1271 dcim/models/device_components.py:712 #: dcim/tables/devices.py:646 ipam/filtersets.py:282 ipam/filtersets.py:293 #: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 #: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 @@ -2382,7 +2391,7 @@ msgstr "VRF" msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1459 ipam/filtersets.py:967 vpn/filtersets.py:314 +#: dcim/filtersets.py:1459 ipam/filtersets.py:967 vpn/filtersets.py:325 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" @@ -2446,8 +2455,8 @@ msgid "Power panel (ID)" msgstr "電源盤 (ID)" #: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 -#: extras/forms/model_forms.py:453 extras/forms/model_forms.py:504 -#: netbox/forms/base.py:82 netbox/forms/mixins.py:81 +#: extras/forms/model_forms.py:454 extras/forms/model_forms.py:505 +#: netbox/forms/base.py:77 netbox/forms/mixins.py:81 #: netbox/tables/columns.py:448 #: templates/circuits/inc/circuit_termination.html:119 #: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 @@ -2524,7 +2533,7 @@ msgstr "タイムゾーン" #: dcim/forms/bulk_import.py:1021 dcim/forms/filtersets.py:299 #: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 #: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:970 -#: dcim/forms/model_forms.py:1311 dcim/forms/object_import.py:186 +#: dcim/forms/model_forms.py:1400 dcim/forms/object_import.py:186 #: dcim/tables/devices.py:202 dcim/tables/devices.py:837 #: dcim/tables/devices.py:948 dcim/tables/devicetypes.py:300 #: dcim/tables/racks.py:69 extras/filtersets.py:457 @@ -2661,9 +2670,10 @@ msgstr "ラック" #: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 #: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 #: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 -#: dcim/forms/model_forms.py:596 dcim/forms/model_forms.py:1381 +#: dcim/forms/model_forms.py:596 dcim/forms/model_forms.py:1470 #: templates/dcim/device_edit.html:20 #: templates/dcim/inventoryitem_edit.html:23 +#: templates/dcim/inventoryitemtemplate_edit.html:22 msgid "Hardware" msgstr "ハードウェア" @@ -2678,7 +2688,7 @@ msgstr "ハードウェア" #: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 #: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 #: dcim/forms/model_forms.py:334 dcim/forms/model_forms.py:374 -#: dcim/forms/model_forms.py:975 dcim/forms/model_forms.py:1316 +#: dcim/forms/model_forms.py:975 dcim/forms/model_forms.py:1405 #: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 #: dcim/tables/devices.py:205 dcim/tables/devices.py:951 #: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 @@ -2729,7 +2739,7 @@ msgstr "モジュールタイプ" #: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:474 msgid "VM role" -msgstr "仮想マシンのロール" +msgstr "VMのロール" #: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 #: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:376 @@ -2788,8 +2798,8 @@ msgstr "プラットフォーム" #: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 #: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 #: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:562 -#: dcim/forms/model_forms.py:760 dcim/forms/model_forms.py:1011 -#: dcim/forms/model_forms.py:1460 dcim/forms/object_create.py:256 +#: dcim/forms/model_forms.py:760 dcim/forms/model_forms.py:1100 +#: dcim/forms/model_forms.py:1549 dcim/forms/object_create.py:256 #: dcim/tables/connections.py:22 dcim/tables/connections.py:41 #: dcim/tables/connections.py:60 dcim/tables/devices.py:318 #: dcim/tables/devices.py:383 dcim/tables/devices.py:427 @@ -2927,8 +2937,8 @@ msgid "Allocated power draw (watts)" msgstr "割当消費電力 (ワット)" #: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:731 -#: dcim/forms/model_forms.py:855 dcim/forms/model_forms.py:1083 -#: dcim/forms/model_forms.py:1368 dcim/forms/object_import.py:60 +#: dcim/forms/model_forms.py:855 dcim/forms/model_forms.py:1172 +#: dcim/forms/model_forms.py:1457 dcim/forms/object_import.py:60 msgid "Power port" msgstr "電源ポート" @@ -2962,7 +2972,7 @@ msgid "Wireless role" msgstr "無線ロール" #: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:595 -#: dcim/forms/model_forms.py:1026 dcim/tables/devices.py:341 +#: dcim/forms/model_forms.py:1115 dcim/tables/devices.py:341 #: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 #: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 #: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 @@ -2976,7 +2986,7 @@ msgstr "モジュール" msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1110 +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1199 msgid "Virtual device contexts" msgstr "仮想デバイスコンテキスト" @@ -3000,37 +3010,37 @@ msgstr "速度" msgid "Mode" msgstr "モード" -#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1159 +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1248 #: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 #: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 #: virtualization/forms/model_forms.py:324 msgid "VLAN group" msgstr "VLAN グループ" -#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1164 +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1253 #: dcim/tables/devices.py:603 virtualization/forms/bulk_edit.py:247 #: virtualization/forms/model_forms.py:329 msgid "Untagged VLAN" msgstr "タグなし VLAN" -#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1173 +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1262 #: dcim/tables/devices.py:609 virtualization/forms/bulk_edit.py:255 #: virtualization/forms/model_forms.py:338 msgid "Tagged VLANs" msgstr "タグ付き VLAN" -#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1146 +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1235 msgid "Wireless LAN group" msgstr "無線 LAN グループ" -#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1151 +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1240 #: dcim/tables/devices.py:639 netbox/navigation/menu.py:134 #: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "無線 LAN" #: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 -#: dcim/forms/model_forms.py:1192 ipam/forms/bulk_edit.py:270 +#: dcim/forms/model_forms.py:1281 ipam/forms/bulk_edit.py:270 #: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 #: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 #: virtualization/forms/model_forms.py:352 @@ -3038,22 +3048,22 @@ msgid "Addressing" msgstr "アドレス" #: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 -#: dcim/forms/model_forms.py:1193 virtualization/forms/model_forms.py:353 +#: dcim/forms/model_forms.py:1282 virtualization/forms/model_forms.py:353 msgid "Operation" msgstr "オペレーション" #: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 -#: dcim/forms/model_forms.py:887 dcim/forms/model_forms.py:1195 +#: dcim/forms/model_forms.py:887 dcim/forms/model_forms.py:1284 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1194 +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1283 #: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 #: virtualization/forms/model_forms.py:354 msgid "Related Interfaces" msgstr "関連インタフェース" -#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1196 +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1285 #: virtualization/forms/bulk_edit.py:267 #: virtualization/forms/model_forms.py:355 msgid "802.1Q Switching" @@ -3173,7 +3183,8 @@ msgstr "モジュール重量の単位" msgid "Limit platform assignments to this manufacturer" msgstr "プラットフォーム割り当てをこのメーカに限定する" -#: dcim/forms/bulk_import.py:421 tenancy/forms/bulk_import.py:106 +#: dcim/forms/bulk_import.py:421 dcim/forms/bulk_import.py:1376 +#: tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "割当ロール" @@ -3304,13 +3315,13 @@ msgstr "このコンセントに給電する電源ポート" msgid "Electrical phase (for three-phase circuits)" msgstr "電気位相 (三相回路用)" -#: dcim/forms/bulk_import.py:782 dcim/forms/model_forms.py:1121 +#: dcim/forms/bulk_import.py:782 dcim/forms/model_forms.py:1210 #: virtualization/forms/bulk_import.py:155 #: virtualization/forms/model_forms.py:308 msgid "Parent interface" msgstr "親インタフェース" -#: dcim/forms/bulk_import.py:789 dcim/forms/model_forms.py:1129 +#: dcim/forms/bulk_import.py:789 dcim/forms/model_forms.py:1218 #: virtualization/forms/bulk_import.py:162 #: virtualization/forms/model_forms.py:316 msgid "Bridged interface" @@ -3373,7 +3384,7 @@ msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} デバイスには割り当てられていません {device}" #: dcim/forms/bulk_import.py:896 dcim/forms/model_forms.py:900 -#: dcim/forms/model_forms.py:1376 dcim/forms/object_import.py:122 +#: dcim/forms/model_forms.py:1465 dcim/forms/object_import.py:122 msgid "Rear port" msgstr "背面ポート" @@ -3515,7 +3526,7 @@ msgstr "MTU" msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " "parent device/VM, or they must be global" -msgstr "タグ付き VLAN ({vlans}) はインタフェースの親デバイス/仮想マシンと同サイトに属しているか、グローバルである必要があります" +msgstr "タグ付き VLAN ({vlans}) はインタフェースの親デバイス/VMと同サイトに属しているか、グローバルである必要があります" #: dcim/forms/common.py:110 msgid "" @@ -3604,14 +3615,14 @@ msgstr "専有済" msgid "Connection" msgstr "接続" -#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1484 +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1573 #: templates/dcim/virtualdevicecontext.html:16 msgid "Virtual Device Context" msgstr "仮想デバイスコンテキスト" #: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 #: extras/forms/bulk_import.py:245 extras/forms/filtersets.py:479 -#: extras/forms/model_forms.py:557 extras/tables/tables.py:487 +#: extras/forms/model_forms.py:558 extras/tables/tables.py:487 #: templates/extras/journalentry.html:33 msgid "Kind" msgstr "種類" @@ -3620,7 +3631,7 @@ msgstr "種類" msgid "Mgmt only" msgstr "管理のみ" -#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1187 +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1276 #: dcim/models/device_components.py:630 templates/dcim/interface.html:134 msgid "WWN" msgstr "WWN" @@ -3727,18 +3738,52 @@ msgstr "最大長は32767です (任意の単位)" msgid "Characteristics" msgstr "特性" -#: dcim/forms/model_forms.py:1137 +#: dcim/forms/model_forms.py:986 +msgid "Console port template" +msgstr "コンソールポートテンプレート" + +#: dcim/forms/model_forms.py:994 +msgid "Console server port template" +msgstr "コンソールサーバポートテンプレート" + +#: dcim/forms/model_forms.py:1002 +msgid "Front port template" +msgstr "全面ポートテンプレート" + +#: dcim/forms/model_forms.py:1010 +msgid "Interface template" +msgstr "インタフェーステンプレート" + +#: dcim/forms/model_forms.py:1018 +msgid "Power outlet template" +msgstr "電源コンセントテンプレート" + +#: dcim/forms/model_forms.py:1026 +msgid "Power port template" +msgstr "電源ポートテンプレート" + +#: dcim/forms/model_forms.py:1034 +msgid "Rear port template" +msgstr "背面ポートテンプレート" + +#: dcim/forms/model_forms.py:1087 dcim/forms/model_forms.py:1521 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "在庫品目は1つの構成要素にのみ割り当てることができます。" + +#: dcim/forms/model_forms.py:1226 msgid "LAG interface" msgstr "LAG インタフェース" -#: dcim/forms/model_forms.py:1191 dcim/forms/model_forms.py:1352 +#: dcim/forms/model_forms.py:1280 dcim/forms/model_forms.py:1441 #: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 #: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 #: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 #: templates/circuits/inc/circuit_termination.html:78 #: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 #: templates/dcim/interface.html:190 templates/dcim/interface.html:322 -#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/dcim/inventoryitem_edit.html:54 +#: templates/dcim/inventoryitemtemplate_edit.html:51 +#: templates/dcim/rearport.html:109 #: templates/ipam/fhrpgroupassignment_edit.html:11 #: templates/virtualization/vminterface.html:19 #: templates/vpn/tunneltermination.html:32 @@ -3751,52 +3796,49 @@ msgstr "LAG インタフェース" msgid "Interface" msgstr "インタフェース" -#: dcim/forms/model_forms.py:1285 +#: dcim/forms/model_forms.py:1374 msgid "Child Device" msgstr "子デバイス" -#: dcim/forms/model_forms.py:1286 +#: dcim/forms/model_forms.py:1375 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." msgstr "まず子デバイスを作成し、親デバイスのサイトとラックに割り当てる必要があります。" -#: dcim/forms/model_forms.py:1328 +#: dcim/forms/model_forms.py:1417 msgid "Console port" msgstr "コンソールポート" -#: dcim/forms/model_forms.py:1336 +#: dcim/forms/model_forms.py:1425 msgid "Console server port" msgstr "コンソールサーバポート" -#: dcim/forms/model_forms.py:1344 +#: dcim/forms/model_forms.py:1433 msgid "Front port" msgstr "前面ポート" -#: dcim/forms/model_forms.py:1360 +#: dcim/forms/model_forms.py:1449 msgid "Power outlet" msgstr "電源コンセント" -#: dcim/forms/model_forms.py:1380 templates/dcim/inventoryitem.html:17 +#: dcim/forms/model_forms.py:1469 templates/dcim/inventoryitem.html:17 #: templates/dcim/inventoryitem_edit.html:10 +#: templates/dcim/inventoryitemtemplate_edit.html:10 msgid "Inventory Item" msgstr "在庫品目" -#: dcim/forms/model_forms.py:1432 -msgid "An InventoryItem can only be assigned to a single component." -msgstr "在庫品目は1つの構成要素にのみ割り当てることができます。" - -#: dcim/forms/model_forms.py:1446 templates/dcim/inventoryitemrole.html:15 +#: dcim/forms/model_forms.py:1535 templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "在庫品目ロール" -#: dcim/forms/model_forms.py:1466 templates/dcim/device.html:195 +#: dcim/forms/model_forms.py:1555 templates/dcim/device.html:195 #: templates/dcim/virtualdevicecontext.html:33 #: templates/virtualization/virtualmachine.html:51 msgid "Primary IPv4" msgstr "プライマリ IPv4" -#: dcim/forms/model_forms.py:1475 templates/dcim/device.html:211 +#: dcim/forms/model_forms.py:1564 templates/dcim/device.html:211 #: templates/dcim/virtualdevicecontext.html:44 #: templates/virtualization/virtualmachine.html:67 msgid "Primary IPv6" @@ -5309,6 +5351,7 @@ msgstr "サイト B" #: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 #: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 #: templates/dcim/inventoryitem_edit.html:39 +#: templates/dcim/inventoryitemtemplate_edit.html:36 msgid "Console Port" msgstr "コンソールポート" @@ -5320,6 +5363,7 @@ msgstr "到達可能" #: dcim/tables/connections.py:46 dcim/tables/devices.py:533 #: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/inventoryitemtemplate_edit.html:61 #: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 msgid "Power Port" msgstr "電源ポート" @@ -5335,10 +5379,10 @@ msgstr "デバイス" #: dcim/tables/devices.py:99 dcim/tables/devices.py:144 #: virtualization/tables/clusters.py:88 msgid "VMs" -msgstr "仮想マシン" +msgstr "VM" #: dcim/tables/devices.py:133 dcim/tables/devices.py:249 -#: extras/forms/model_forms.py:515 templates/dcim/device.html:114 +#: extras/forms/model_forms.py:516 templates/dcim/device.html:114 #: templates/dcim/device/render_config.html:11 #: templates/dcim/device/render_config.html:15 #: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 @@ -5403,7 +5447,7 @@ msgstr "電源コンセント" #: dcim/tables/devices.py:279 dcim/tables/devices.py:1091 #: dcim/tables/devicetypes.py:125 dcim/views.py:1005 dcim/views.py:1244 -#: dcim/views.py:1930 netbox/navigation/menu.py:82 +#: dcim/views.py:1932 netbox/navigation/menu.py:82 #: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 #: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 #: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 @@ -5494,7 +5538,7 @@ msgid "VDCs" msgstr "VDC" #: dcim/tables/devices.py:651 dcim/tables/devicetypes.py:48 -#: dcim/tables/devicetypes.py:140 dcim/views.py:1080 dcim/views.py:2023 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1080 dcim/views.py:2025 #: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 #: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 #: templates/dcim/inc/panels/inventory_items.html:5 @@ -5507,6 +5551,7 @@ msgstr "在庫品目" #: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 #: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 #: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/inventoryitemtemplate_edit.html:66 #: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 msgid "Rear Port" msgstr "背面ポート" @@ -5546,7 +5591,7 @@ msgid "Module Types" msgstr "モジュールタイプ" #: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 -#: extras/forms/model_forms.py:423 netbox/navigation/menu.py:66 +#: extras/forms/model_forms.py:424 netbox/navigation/menu.py:66 msgid "Platforms" msgstr "プラットフォーム" @@ -5567,7 +5612,7 @@ msgid "Instances" msgstr "インスタンス" #: dcim/tables/devicetypes.py:113 dcim/views.py:945 dcim/views.py:1184 -#: dcim/views.py:1870 netbox/navigation/menu.py:85 +#: dcim/views.py:1872 netbox/navigation/menu.py:85 #: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 #: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 #: templates/dcim/moduletype/base.html:22 @@ -5575,7 +5620,7 @@ msgid "Console Ports" msgstr "コンソールポート" #: dcim/tables/devicetypes.py:116 dcim/views.py:960 dcim/views.py:1199 -#: dcim/views.py:1885 netbox/navigation/menu.py:86 +#: dcim/views.py:1887 netbox/navigation/menu.py:86 #: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 #: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 #: templates/dcim/moduletype/base.html:25 @@ -5583,7 +5628,7 @@ msgid "Console Server Ports" msgstr "コンソールサーバポート" #: dcim/tables/devicetypes.py:119 dcim/views.py:975 dcim/views.py:1214 -#: dcim/views.py:1900 netbox/navigation/menu.py:87 +#: dcim/views.py:1902 netbox/navigation/menu.py:87 #: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 #: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 #: templates/dcim/moduletype/base.html:28 @@ -5591,7 +5636,7 @@ msgid "Power Ports" msgstr "電源ポート" #: dcim/tables/devicetypes.py:122 dcim/views.py:990 dcim/views.py:1229 -#: dcim/views.py:1915 netbox/navigation/menu.py:88 +#: dcim/views.py:1917 netbox/navigation/menu.py:88 #: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 #: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 #: templates/dcim/moduletype/base.html:31 @@ -5599,27 +5644,27 @@ msgid "Power Outlets" msgstr "電源コンセント" #: dcim/tables/devicetypes.py:128 dcim/views.py:1020 dcim/views.py:1259 -#: dcim/views.py:1951 netbox/navigation/menu.py:83 +#: dcim/views.py:1953 netbox/navigation/menu.py:83 #: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 #: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 msgid "Front Ports" msgstr "前面ポート" #: dcim/tables/devicetypes.py:131 dcim/views.py:1035 dcim/views.py:1274 -#: dcim/views.py:1966 netbox/navigation/menu.py:84 +#: dcim/views.py:1968 netbox/navigation/menu.py:84 #: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 #: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 #: templates/dcim/moduletype/base.html:40 msgid "Rear Ports" msgstr "背面ポート" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1065 dcim/views.py:2004 +#: dcim/tables/devicetypes.py:134 dcim/views.py:1065 dcim/views.py:2006 #: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 #: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "デバイスベイ" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1050 dcim/views.py:1985 +#: dcim/tables/devicetypes.py:137 dcim/views.py:1050 dcim/views.py:1987 #: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 #: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 msgid "Module Bays" @@ -5665,7 +5710,7 @@ msgid "Max Weight" msgstr "最大重量" #: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:403 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:404 #: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 #: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 #: netbox/navigation/menu.py:18 @@ -5689,17 +5734,17 @@ msgstr "予約" msgid "Non-Racked Devices" msgstr "ラック搭載でないデバイス" -#: dcim/views.py:2036 extras/forms/model_forms.py:463 +#: dcim/views.py:2038 extras/forms/model_forms.py:464 #: templates/extras/configcontext.html:10 #: virtualization/forms/model_forms.py:228 virtualization/views.py:408 msgid "Config Context" msgstr "コンフィグコンテキスト" -#: dcim/views.py:2046 virtualization/views.py:418 +#: dcim/views.py:2048 virtualization/views.py:418 msgid "Render Config" msgstr "レンダーコンフィグ" -#: dcim/views.py:2974 ipam/tables/ip.py:233 +#: dcim/views.py:2976 ipam/tables/ip.py:233 msgid "Children" msgstr "子ども" @@ -5943,7 +5988,7 @@ msgid "White" msgstr "白" #: extras/choices.py:306 extras/forms/model_forms.py:235 -#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +#: extras/forms/model_forms.py:322 templates/extras/webhook.html:11 msgid "Webhook" msgstr "Webhook" @@ -6323,7 +6368,7 @@ msgid "Choices" msgstr "選択肢" #: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 -#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:458 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:459 #: templates/core/job.html:86 templates/extras/configcontext.html:86 #: templates/extras/eventrule.html:111 msgid "Data" @@ -6343,7 +6388,7 @@ msgstr "Content type" msgid "HTTP content type" msgstr "HTTP content type" -#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:271 +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:272 #: templates/extras/eventrule.html:46 msgid "Events" msgstr "イベント" @@ -6368,7 +6413,7 @@ msgstr "オブジェクト削除" msgid "Job starts" msgstr "ジョブの開始" -#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:290 +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:291 msgid "Job terminations" msgstr "ジョブの終了" @@ -6380,44 +6425,44 @@ msgstr "タグ付きオブジェクトタイプ" msgid "Allowed object type" msgstr "許可されるオブジェクトタイプ" -#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:393 +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:394 #: netbox/navigation/menu.py:19 msgid "Regions" msgstr "リージョン" -#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:398 +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:399 msgid "Site groups" msgstr "サイトグループ" -#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:408 +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:409 #: netbox/navigation/menu.py:21 msgid "Locations" msgstr "ロケーション" -#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:413 +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:414 msgid "Device types" msgstr "デバイスタイプ" -#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:418 +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:419 msgid "Roles" msgstr "ロール" -#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:428 +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:429 msgid "Cluster types" msgstr "クラスタタイプ" -#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:433 +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:434 msgid "Cluster groups" msgstr "クラスタグループ" -#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:438 +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:439 #: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 #: templates/virtualization/clustertype.html:33 #: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "クラスタ" -#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:443 +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:444 msgid "Tenant groups" msgstr "テナントグループ" @@ -6435,7 +6480,7 @@ msgstr "以前" msgid "Time" msgstr "時間" -#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:273 +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:274 #: extras/tables/tables.py:445 templates/extras/eventrule.html:90 #: templates/extras/objectchange.html:50 msgid "Action" @@ -6498,7 +6543,7 @@ msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "リンク URL の Jinja2 テンプレートコード。オブジェクトを次のように参照します。 {example}。" -#: extras/forms/model_forms.py:160 extras/forms/model_forms.py:509 +#: extras/forms/model_forms.py:160 extras/forms/model_forms.py:510 msgid "Template code" msgstr "テンプレートコード" @@ -6510,11 +6555,11 @@ msgstr "テンプレートをエクスポート" msgid "Rendering" msgstr "レンダリング" -#: extras/forms/model_forms.py:182 extras/forms/model_forms.py:534 +#: extras/forms/model_forms.py:182 extras/forms/model_forms.py:535 msgid "Template content is populated from the remote source selected below." msgstr "選択したリモートソースから、テンプレートコンテンツが入力されます。" -#: extras/forms/model_forms.py:189 extras/forms/model_forms.py:541 +#: extras/forms/model_forms.py:189 extras/forms/model_forms.py:542 msgid "Must specify either local content or a data file" msgstr "ローカルコンテンツまたはデータファイルのいずれかを指定する必要があります" @@ -6545,55 +6590,55 @@ msgid "" "href=\"https://json.org/\">JSON format." msgstr "JSON フォーマットでアクションに渡すパラメータを入力してください。" -#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:11 +#: extras/forms/model_forms.py:271 templates/extras/eventrule.html:11 msgid "Event Rule" msgstr "イベントルール" -#: extras/forms/model_forms.py:272 templates/extras/eventrule.html:78 +#: extras/forms/model_forms.py:273 templates/extras/eventrule.html:78 msgid "Conditions" msgstr "条件" -#: extras/forms/model_forms.py:286 +#: extras/forms/model_forms.py:287 msgid "Creations" msgstr "作成" -#: extras/forms/model_forms.py:287 +#: extras/forms/model_forms.py:288 msgid "Updates" msgstr "更新" -#: extras/forms/model_forms.py:288 +#: extras/forms/model_forms.py:289 msgid "Deletions" msgstr "削除" -#: extras/forms/model_forms.py:289 +#: extras/forms/model_forms.py:290 msgid "Job executions" msgstr "ジョブの実行" -#: extras/forms/model_forms.py:375 users/forms/model_forms.py:286 +#: extras/forms/model_forms.py:376 users/forms/model_forms.py:286 msgid "Object types" msgstr "オブジェクトタイプ" -#: extras/forms/model_forms.py:448 netbox/navigation/menu.py:40 +#: extras/forms/model_forms.py:449 netbox/navigation/menu.py:40 #: tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "テナント" -#: extras/forms/model_forms.py:465 ipam/forms/filtersets.py:141 +#: extras/forms/model_forms.py:466 ipam/forms/filtersets.py:141 #: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 #: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 #: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:324 msgid "Assignment" msgstr "割当" -#: extras/forms/model_forms.py:491 +#: extras/forms/model_forms.py:492 msgid "Data is populated from the remote source selected below." msgstr "データは、以下で選択したリモートソースから入力されます。" -#: extras/forms/model_forms.py:497 +#: extras/forms/model_forms.py:498 msgid "Must specify either local data or a data file" msgstr "ローカルデータまたはデータファイルのいずれかを指定する必要があります" -#: extras/forms/model_forms.py:516 templates/core/datafile.html:65 +#: extras/forms/model_forms.py:517 templates/core/datafile.html:65 msgid "Content" msgstr "コンテンツ" @@ -7626,19 +7671,19 @@ msgstr "プレーンテキスト" msgid "Invalid IP address format: {address}" msgstr "IP アドレス形式が無効です: {address}" -#: ipam/filtersets.py:47 vpn/filtersets.py:276 +#: ipam/filtersets.py:47 vpn/filtersets.py:287 msgid "Import target" msgstr "インポート対象" -#: ipam/filtersets.py:53 vpn/filtersets.py:282 +#: ipam/filtersets.py:53 vpn/filtersets.py:293 msgid "Import target (name)" msgstr "インポート対象 (名前)" -#: ipam/filtersets.py:58 vpn/filtersets.py:287 +#: ipam/filtersets.py:58 vpn/filtersets.py:298 msgid "Export target" msgstr "エクスポート対象" -#: ipam/filtersets.py:64 vpn/filtersets.py:293 +#: ipam/filtersets.py:64 vpn/filtersets.py:304 msgid "Export target (name)" msgstr "エクスポート対象 (名前)" @@ -7688,11 +7733,11 @@ msgstr "このプレフィックス / IP を含むプレフィックス" msgid "Mask length" msgstr "マスクの長さ" -#: ipam/filtersets.py:339 vpn/filtersets.py:399 +#: ipam/filtersets.py:339 vpn/filtersets.py:410 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:343 vpn/filtersets.py:394 +#: ipam/filtersets.py:343 vpn/filtersets.py:405 msgid "VLAN number (1-4094)" msgstr "VLAN 番号 (1-4094)" @@ -7711,25 +7756,25 @@ msgid "Parent prefix" msgstr "親プレフィックス" #: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1042 -#: vpn/filtersets.py:357 +#: vpn/filtersets.py:368 msgid "Virtual machine (name)" msgstr "仮想マシン (名前)" #: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1036 #: virtualization/filtersets.py:278 virtualization/filtersets.py:317 -#: vpn/filtersets.py:362 +#: vpn/filtersets.py:373 msgid "Virtual machine (ID)" msgstr "仮想マシン (ID)" -#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:379 msgid "Interface (name)" msgstr "インタフェース (名前)" -#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:384 msgid "Interface (ID)" msgstr "インタフェース (ID)" -#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:390 msgid "VM interface (name)" msgstr "VM インタフェース (名前)" @@ -7951,7 +7996,7 @@ msgstr "仮想マシン" #: ipam/forms/bulk_import.py:314 msgid "Parent VM of assigned interface (if any)" -msgstr "割当インタフェースの親仮想マシン (存在する場合)" +msgstr "割当インタフェースの親VM (存在する場合)" #: ipam/forms/bulk_import.py:321 msgid "Assigned interface" @@ -7959,19 +8004,19 @@ msgstr "割当インタフェース" #: ipam/forms/bulk_import.py:324 msgid "Is primary" -msgstr "プライマリです" +msgstr "プライマリか" #: ipam/forms/bulk_import.py:325 msgid "Make this the primary IP for the assigned device" -msgstr "これを割当デバイスのプライマリ IP アドレスにする" +msgstr "割当デバイスのプライマリ IP アドレスにする" #: ipam/forms/bulk_import.py:364 msgid "No device or virtual machine specified; cannot set as primary IP" -msgstr "デバイスまたは仮想マシンが指定されていません。プライマリ IP として設定できません" +msgstr "デバイスまたは仮想マシンが指定されていないため、プライマリ IP として設定できません" #: ipam/forms/bulk_import.py:368 msgid "No interface specified; cannot set as primary IP" -msgstr "インタフェースが指定されていません。プライマリ IP として設定できません" +msgstr "インタフェースが指定されていないため、プライマリ IP として設定できません" #: ipam/forms/bulk_import.py:397 msgid "Auth type" @@ -8010,7 +8055,7 @@ msgstr "デバイスに割り当てられていない場合は必須" #: ipam/forms/bulk_import.py:525 #, python-brace-format msgid "{ip} is not assigned to this device/VM." -msgstr "{ip} このデバイス/VM には割り当てられていません。" +msgstr "{ip} はこのデバイス/VM には割り当てられていません。" #: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 #: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:409 @@ -8050,7 +8095,7 @@ msgstr "レンジ" #: ipam/forms/filtersets.py:127 msgid "Start" -msgstr "[開始]" +msgstr "開始" #: ipam/forms/filtersets.py:131 msgid "End" @@ -8058,31 +8103,31 @@ msgstr "終了" #: ipam/forms/filtersets.py:181 msgid "Search within" -msgstr "内で検索" +msgstr "範囲内を検索" #: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 msgid "Present in VRF" -msgstr "VRF でのプレゼンテーション" +msgstr "VRF 内に存在する" #: ipam/forms/filtersets.py:297 msgid "Device/VM" -msgstr "デバイス/仮想マシン" +msgstr "デバイス/VM" #: ipam/forms/filtersets.py:333 msgid "Assigned Device" -msgstr "割り当て済みデバイス" +msgstr "割当デバイス" #: ipam/forms/filtersets.py:338 msgid "Assigned VM" -msgstr "割当仮想マシン" +msgstr "割当VM" #: ipam/forms/filtersets.py:352 msgid "Assigned to an interface" -msgstr "インタフェースに割り当てられる" +msgstr "インタフェースに割当済" #: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 msgid "DNS Name" -msgstr "DNS ネーム" +msgstr "DNS名" #: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 #: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 @@ -8122,7 +8167,7 @@ msgstr "仮想マシン" #: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 #: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 msgid "Aggregate" -msgstr "集計" +msgstr "集約" #: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 msgid "ASN Range" @@ -8143,7 +8188,7 @@ msgstr "FHRP グループ" #: ipam/forms/model_forms.py:300 msgid "Make this the primary IP for the device/VM" -msgstr "これをデバイス/仮想マシンのプライマリIPにする" +msgstr "デバイス/VMのプライマリIPにする" #: ipam/forms/model_forms.py:351 msgid "An IP address can only be assigned to a single object." @@ -8158,7 +8203,7 @@ msgstr "親オブジェクトのプライマリ IP として指定されてい #: ipam/forms/model_forms.py:367 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." -msgstr "プライマリ IP として指定できるのは、インタフェースに割当 IP アドレスのみです。" +msgstr "プライマリ IP として指定できるのは、インタフェースに割り当てられた IP アドレスのみです。" #: ipam/forms/model_forms.py:442 msgid "Virtual IP Address" @@ -8166,7 +8211,7 @@ msgstr "仮想 IP アドレス" #: ipam/forms/model_forms.py:523 msgid "Assignment already exists" -msgstr "アサインメントは既に存在します" +msgstr "既に割り当てられています" #: ipam/forms/model_forms.py:602 ipam/forms/model_forms.py:641 #: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 @@ -8182,7 +8227,7 @@ msgstr "子 VLAN" msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." -msgstr "1 つ以上のポート番号をカンマで区切ったリスト。範囲はハイフンを使用して指定できます。" +msgstr "カンマ区切りのポート番号のリスト。範囲はハイフンを使用して指定できます。" #: ipam/forms/model_forms.py:677 templates/ipam/servicetemplate.html:12 msgid "Service Template" @@ -8212,15 +8257,15 @@ msgstr "ASN レンジ" #: ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." -msgstr "ASN を起動しています ({start}) は終了 ASN () より小さくなければなりません{end})。" +msgstr "開始ASN ({start}) は終了ASN ({end}) より小さくなければなりません)。" #: ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" -msgstr "この AS 番号空間を担当するリージョンインターネットレジストリ" +msgstr "この AS 番号空間を担当する地域インターネットレジストリ" #: ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" -msgstr "16 ビットまたは 32 ビットの自律システム番号" +msgstr "16 または 32 ビットのAS番号" #: ipam/models/fhrp.py:22 msgid "group ID" @@ -8252,15 +8297,15 @@ msgstr "優先度" #: ipam/models/fhrp.py:113 msgid "FHRP group assignment" -msgstr "FHRP グループアサイン" +msgstr "FHRP グループ割当" #: ipam/models/fhrp.py:114 msgid "FHRP group assignments" -msgstr "FHRP グループアサイメント" +msgstr "FHRP グループ割当" #: ipam/models/ip.py:64 msgid "private" -msgstr "非公開です" +msgstr "プライベート" #: ipam/models/ip.py:65 msgid "IP space managed by this RIR is considered private" @@ -8272,11 +8317,11 @@ msgstr "RIR" #: ipam/models/ip.py:83 msgid "IPv4 or IPv6 network" -msgstr "IPv4 ネットワークまたは IPv6 ネットワーク" +msgstr "IPv4 または IPv6 ネットワーク" #: ipam/models/ip.py:90 msgid "Regional Internet Registry responsible for this IP space" -msgstr "この IP スペースを管理するリージョンインターネットレジストリ" +msgstr "この IP スペースを管理する地域インターネットレジストリ" #: ipam/models/ip.py:100 msgid "date added" @@ -8284,29 +8329,29 @@ msgstr "追加日" #: ipam/models/ip.py:114 msgid "aggregate" -msgstr "集計" +msgstr "集約" #: ipam/models/ip.py:115 msgid "aggregates" -msgstr "集合体" +msgstr "集約" #: ipam/models/ip.py:131 msgid "Cannot create aggregate with /0 mask." -msgstr "/0 マスクを使用してアグリゲートを作成することはできません。" +msgstr "/0 マスクを使用して集約を作成することはできません。" #: ipam/models/ip.py:143 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " "aggregate ({aggregate})." -msgstr "アグリゲートは重複できません。 {prefix} 既存のアグリゲートですでにカバーされている ({aggregate})。" +msgstr "集約は重複できません。{prefix} は既存の集約({aggregate}) に含まれます。" #: ipam/models/ip.py:157 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " "({aggregate})." -msgstr "プレフィックスはアグリゲートと重複できません。 {prefix} 既存のアグリゲートを対象とする ({aggregate})。" +msgstr "プレフィックスは集約と重複できません。 {prefix} は既存の集約 ({aggregate}) に含まれます。" #: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 msgid "role" @@ -8996,15 +9041,17 @@ msgstr "正規表現" msgid "Object type(s)" msgstr "オブジェクトタイプ" -#: netbox/forms/base.py:77 -msgid "Id" -msgstr "Id" +#: netbox/forms/base.py:81 +msgid "" +"Tag slugs separated by commas, encased with double quotes (e.g. " +"\"tag1,tag2,tag3\")" +msgstr "二重引用符で囲まれたカンマ区切りのタグslug (例:\"tag1,tag2,tag3\")" -#: netbox/forms/base.py:116 +#: netbox/forms/base.py:111 msgid "Add tags" msgstr "タグを追加" -#: netbox/forms/base.py:121 +#: netbox/forms/base.py:116 msgid "Remove tags" msgstr "タグを削除する" @@ -9276,8 +9323,9 @@ msgstr "カスタマイズ" #: netbox/navigation/menu.py:310 #: templates/circuits/circuittermination_edit.html:53 #: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 -#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/inventoryitem_edit.html:102 +#: templates/dcim/inventoryitemtemplate_edit.html:99 +#: templates/dcim/rack_edit.html:81 templates/dcim/virtualchassis_add.html:31 #: templates/dcim/virtualchassis_edit.html:41 #: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 #: templates/inc/panels/custom_fields.html:7 @@ -9507,31 +9555,31 @@ msgstr "初期化後にストアをレジストリに追加できない" msgid "Cannot delete stores from registry" msgstr "レジストリからストアを削除できません" -#: netbox/settings.py:724 +#: netbox/settings.py:727 msgid "English" msgstr "英語" -#: netbox/settings.py:725 +#: netbox/settings.py:728 msgid "Spanish" msgstr "スペイン語" -#: netbox/settings.py:726 +#: netbox/settings.py:729 msgid "French" msgstr "フランス語" -#: netbox/settings.py:727 +#: netbox/settings.py:730 msgid "Japanese" msgstr "日本語" -#: netbox/settings.py:728 +#: netbox/settings.py:731 msgid "Portuguese" msgstr "ポルトガル語" -#: netbox/settings.py:729 +#: netbox/settings.py:732 msgid "Russian" msgstr "ロシア語" -#: netbox/settings.py:730 +#: netbox/settings.py:733 msgid "Turkish" msgstr "トルコ語" @@ -9991,6 +10039,7 @@ msgstr "接続" #: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 #: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 #: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/inventoryitemtemplate_edit.html:46 #: templates/dcim/rearport.html:112 msgid "Front Port" msgstr "前面ポート" @@ -10231,6 +10280,7 @@ msgstr "未接続" #: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 #: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +#: templates/dcim/inventoryitemtemplate_edit.html:41 msgid "Console Server Port" msgstr "コンソールサーバポート" @@ -10481,7 +10531,7 @@ msgstr "[デバイスを追加]" #: templates/dcim/devicerole.html:43 msgid "VM Role" -msgstr "仮想マシンのロール" +msgstr "VMのロール" #: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 msgid "Model Name" @@ -10661,10 +10711,12 @@ msgid "This will also delete all child inventory items of those listed" msgstr "これにより、リストされている商品の子在庫品目もすべて削除されます。" #: templates/dcim/inventoryitem_edit.html:33 +#: templates/dcim/inventoryitemtemplate_edit.html:30 msgid "Component Assignment" msgstr "構成要素割り当て" #: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/inventoryitemtemplate_edit.html:56 #: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 msgid "Power Outlet" msgstr "電源コンセント" @@ -12982,16 +13034,21 @@ msgstr "MAC アドレスは EUI-48 形式である必要があります" msgid "Use regular expressions" msgstr "正規表現を使う" -#: utilities/forms/forms.py:87 +#: utilities/forms/forms.py:76 +msgid "" +"Numeric ID of an existing object to update (if not creating a new object)" +msgstr "更新する既存のオブジェクトの数値 ID (新しいオブジェクトを作成しない場合)" + +#: utilities/forms/forms.py:93 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "認識できないヘッダー: {name}" -#: utilities/forms/forms.py:113 +#: utilities/forms/forms.py:119 msgid "Available Columns" msgstr "使用可能な列" -#: utilities/forms/forms.py:121 +#: utilities/forms/forms.py:127 msgid "Selected Columns" msgstr "選択した列" @@ -13161,7 +13218,7 @@ msgstr "書き込み" msgid "Testing" msgstr "テスト" -#: utilities/testing/views.py:625 +#: utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "テストでは csv_update_data を定義する必要があります。" @@ -13524,31 +13581,31 @@ msgstr "トンネル (名前)" msgid "Outside IP (ID)" msgstr "外部IP (ID)" -#: vpn/filtersets.py:235 +#: vpn/filtersets.py:142 vpn/filtersets.py:246 msgid "IKE policy (ID)" msgstr "IKE ポリシー (ID)" -#: vpn/filtersets.py:241 +#: vpn/filtersets.py:148 vpn/filtersets.py:252 msgid "IKE policy (name)" msgstr "IKE ポリシー (名前)" -#: vpn/filtersets.py:245 +#: vpn/filtersets.py:256 msgid "IPSec policy (ID)" msgstr "IPsec ポリシー (ID)" -#: vpn/filtersets.py:251 +#: vpn/filtersets.py:262 msgid "IPSec policy (name)" msgstr "IPsec ポリシー (名前)" -#: vpn/filtersets.py:320 +#: vpn/filtersets.py:331 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:384 +#: vpn/filtersets.py:395 msgid "VM Interface (ID)" msgstr "VM インタフェース (ID)" -#: vpn/filtersets.py:390 +#: vpn/filtersets.py:401 msgid "VLAN (name)" msgstr "VLAN (名前)" @@ -13593,7 +13650,7 @@ msgstr "割当インタフェースの親デバイス" #: vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" -msgstr "割当インタフェースの親仮想マシン" +msgstr "割当インタフェースの親VM" #: vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" From be903a64a2f5e2b6d070ac40adbff13197656242 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 May 2024 12:43:46 -0400 Subject: [PATCH 11/11] Release v3.7.8 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.7.md | 9 ++++++++- netbox/netbox/settings.py | 2 +- netbox/translations/ja/LC_MESSAGES/django.mo | Bin 233577 -> 234483 bytes requirements.txt | 6 +++--- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 3679e5db9..89f8a0520 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -26,7 +26,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v3.7.7 + placeholder: v3.7.8 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 0cf522960..1d5de7173 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.7.7 + placeholder: v3.7.8 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index d3ae2c3ea..caf8b65e4 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,12 +1,19 @@ # NetBox v3.7 -## v3.7.8 (FUTURE) +## v3.7.8 (2024-05-06) + +### Enhancements + +* [#12127](https://github.com/netbox-community/netbox/issues/12127) - Enable adding new cables directly from navigation menu ### Bug Fixes * [#15877](https://github.com/netbox-community/netbox/issues/15877) - Account for virtual chassis membership when assigning related interfaces via bulk edit * [#15917](https://github.com/netbox-community/netbox/issues/15917) - Fix pagination through search results within dropdown fields * [#15925](https://github.com/netbox-community/netbox/issues/15925) - Fix SVG rendering of cable traces to circuit terminations +* [#15948](https://github.com/netbox-community/netbox/issues/15948) - Fix cable trace SVG generation for cables with multiple terminations at both ends +* [#15960](https://github.com/netbox-community/netbox/issues/15960) - Replace CSV export formatting for several many-to-many fields +* [#15961](https://github.com/netbox-community/netbox/issues/15961) - Fix secret toggle button for IKE policies --- diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 23803ccc1..2e64acf76 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.7.8-dev' +VERSION = '3.7.8' # Hostname HOSTNAME = platform.node() diff --git a/netbox/translations/ja/LC_MESSAGES/django.mo b/netbox/translations/ja/LC_MESSAGES/django.mo index da77c423a93b827c487bdcf2cb38945c431e816c..ff1727e47b55a398303c338e2836ee857b01238e 100644 GIT binary patch delta 62884 zcmXWkci@gy|G@G4`~6yx5h}^d9@#<)*(+NS*%|RjNT}RIiCy07~V&yOog?ORhSyR&Se)@L;f3KQY)1aSu-RXk%n2;{UR2azB+78Zm1xJe#)bRPhStaRXVEEp zE3SVP<-741$`7L>JNmyA&86$<-?IB$z~>zIF1V!rh?2;wBp@phYz5E zJ%3TT z^U;xC7x`6aK#ySud=v!Z#KJMbiQs^3G~{SSfx@o_S>wD2Xau_`w zrAwrIZLC7R724hzSrV@8Iq2q^jXqLuL#KWN8qhE3=E*xUSq?olwa^aQqa!;54QzZk zGs-VTA7D42oAd$n{_GPZjQkz6fzPlO{({4?Y{^u99y-!2+Q72#E_5mGLr3&D+R=;X zz&=GkD}F`qFH|aBuYi_zN0H z=hA70`k*s03Z22JXnPCMO}QA$dj4-9;ac4j7oI?O_vY{ibXS)xlNvY%N0P6MZmLVr z-F-P4;MHiyOXK?8XkcscWPA(_Xg3z}{O2E)8ZL_7SSs?B!W!6~^7`Sq=#1Qt?ujSS zJ+LkEU!Vc~j!yjnbjC`RP3>1i1FDNzFEk@zgYCjz*qZzhtdC2h{F!hYx>-L&13rLu zSfpI)=t%Uw3SlR7>ZgVmpzU8=j`Q!-Z=k?6c^TbYZ-pPDQ~V9uz;0}Yf8eQDr+i+f z0iJ_xaVb{DH?af$jJ2`h(P>i;#1qKR3GX3CO#a39WLSF8z`RwpA^f*6+4&WQK{;}EP(g=H@OECytic#o@ z|A)@VO!RnK-_3I!w!_uv%zcfn>Cfot`4d~<5f#(*cIaN|iZ0m@JQlO#N%-uZhmPzi zw1FSc7mh<{$IXsU4Ru5#?}^r%hX!~9x(Dt=2e2x96bTIl&_ES7s9vEC+O$s-q?fIFI+9PQyvYtIvQ|uwB2r) zHS)nE?05t^g7N4~OhNa?g>ijdT;GW9mFI8({)T=`cdVY;xf5;o9`txWj4thSXkf3S zr{R<8oPQ%f>V$NmCOQ+%!&A{s(+zFtOf>R|aeWp#;`wO9%fr>^T0f3HIlqbWnl;kE znqyPS+ttXXf@u_Z+%7^Jx)kkrX}A&%U|r;2jQqRkBlhda{~gzh*Gz#`L<4S&wtFht zZf|tPhi6IHz&LaybJ32j3s;~O*P%1BG0L}~OY}avw!6Z;=u{WfN^4yj-AgslK$=8( zJG8&-fT%D54P+)-aWT4CZb4r*A4G51hIX(Mo8wPtfK_Uzj%uSLY>qB%C$yb2!gJA? zn1}R}&0LcbncL&SeQ3l_g)hbRcO(BrJxx90dS5iKGthP? zV{y;_Y!Y_3&;ne7c6bvyRjbkC^f(&eGjaXpxc)xc;MY;UC-R5UB`r}eeHc|oH+c`V z-F}$$#*rk9Yzo@(0(6b9L$BYCe%P$VM)*DY2tKBM8gWbXzHaCn&|oy+vm!q>@)N`J z(E#Sw=lnZGS5aVO*P#vEgwDk6=!owPA4LOuI(!-J=w0-_Ptp2c#Py%h0sIyDf(Ge& zX*7W28gTw?ur39)u?6~OG7K%h5j~D8(A~TakH@WOhhL!ezC{Dx8y>>0;o6r!F-24fJw6T4^0sIIozN*B6!|e&mHZ5}p=Ic%yAK`63+QJ2 z0lohp%X zD!K$&bV(M6H(?R-{}=iD(3#wTx%0mzm*5vqw1E%M2EIV2@R#s#l$U9iHdQ6G<9cZQ zlcT&V+Ri}ifFt7i-RMj{fKL6VmV5qxBT*9%Vhya;JT=%E?VumJ6r-bjW|YrI8(JFI z??IR7DKzlyn0qduBi@5!@Gv^Fqg!zPo%+cnI^zs9@~6qeJ9}qnmUBdRnePJH9%u-_(-x?^){67*u3bq%3w$5lgh#YaUo6_= z8RRFU4Znz<f4HEe}`tsjC7a0Xic?kov+@%?e(QS?jV zXV?{wJvlAK2=qJNEVSWk&?Q)oKDt+hPoej}iGFD<);7)Tk=UL5@#qqaL!SrPsU#fv zBDA56Xa{fMQ}`h^#p_N<&;A$C`g_7!r>1wgv(TAYiXHGR^qW=bcImzWIFtMWbVmO| z+R0{4Z=XhXDLNCkq5<5EuF)Dau!qspumwF0???If=tvHsFDhj_r0;-@(J4M1J)T3* z_Qs+8OwN^a{>~@ivAHC?37w)x&_Fh#H@<*w(pS+Z*$y`3C5H z9nkywqW6u&lAix*QDGi7B!3MW`P1mgUP4FkX_SADHuQU3&+nLKumW1IF}gY1qMNZp zl=nafG8i4$aLhUttbIkdxPcTl9%H4c!};q8%^C z6L1B##w~IE5c)eo=`PtcB`0=Ck+(oQ?1%=|9c^e(7*{wi+Gj zgXsP1&^`4G9)~ZZOZ!EZgj4<(x~BhyrMsq?sEVHB-gqwd3pb%_S-V@>yeFc8cSQs5 zjkY%g4P;_m|6k;1L_Ry4gb~g|r}(PyCN!{Bas9#YNpvJHq5-^tcJLm$1RtRR{Dijm zSCkiYPvu9W^{XT8XEU`)cw=MqSezCPK&NPIT%Us;(C}J-QTI&^6r=*Z)MH zn1y?!_A8!8_0=+?!}1KcN8}KnGB` zSIU<`uUAHwqCu3mLhE%#XQD4=9m&Y3aDH5vhc<96+Q1#?jcd^kA4m7b^XOjK7T4cH z8{Uc5`xU+aAX>j@?^M4GI^c@EIsaZbodT!k40KJ0p$(ji26ADPUl!hocC;$;kE8Wp zL-$mc(=DW;=+hF~4tK?msfGK|9R!OXs^J z+Hg7at;GduY{D>ty|NoG1DvAtDQ+GUi-s_;p?o@R1 zOhrew0Nq?yqk*hIXW}tzft$iTXdtx)rS?w5n&dm7-?%1XJFu=^&Lw{ux_O>K8~7TlVc|1U$F;E)`C(WGm!TbQ!n*hc+U^l&rmyoSV%G2VQ%Ll| z2heY)|DYpmJtQypM#(2oB@ zm#Wx^^deFpdyqdJFU6a)B;0HjN9OTgs`-5m%jfZn2l`pCX;j)o&!K_768Y`ujC_o4 z-XG9F|3&MS7@Yz>8r|*H&_J7_$Mht0b7rTIa0+Ll4J<;}@CG!1H_->pc5II2$K++6 z!R}~Bg~z6jN~0ZAM3<~8`a;q)uD3#Gv?Cf&U!-0(Gm3X`ff-!KYVqf^)kJuclNKRdhx z{rtZaZQyQn>F!4d@H9Hot?1kCo9G%B8J_|ug}!{2M+eXdv*SpdLZTY3#Jcz*dOUtc z8!S2@-B1SYunHPLqp%G&B;Of5p66qCybRqlZ=nI^PfVNkNOWnApUC-l>Z(#;q_x9F z=#-y?2G9vz+unFO4!~Nt0-fTQ!*{VJ`JHG71(Q<8MZ=>o*D*TNRVQ)&-HkOVa1*se z^WCut4#oPo7#;BjbOxRe-$4WY0^Rky(HZy;4Y1s~Y3ACX9d|^9p*YlJ9sDj27P`UKxd-Vl4Ga=u-4R2b3L1!iGmg!Bq5y zIZ=K^l;4a7^nYl>kD&E7p@DBhNAwYP#)2v7^}9PZAU_i4;S#i+;{VIdbT)G=i4!QO z8}>q{aww#or}85-pj}b^bCmBxNBR%CcM45S^@@kbU`fya2_%fX z3HpU$7#i{PTm^n~!aC$1M32w==o9f*?0`+rOC3x{H`Q!xh?ihJyg#nLk52g~XyD&s z?)?8k!cBJ|DjYE_ElGKFWHr&LZW6YO^4{oF4nZ3}C(5VcQ1TZ?{zJ6=uh6}-4{fjL z`J8{J@@Nt^R2iN6`sh@j681u;@+`FeIJChj=!51G^z=M|&dfISrS{0_X=%IT6!Md? z8GeMmDV3PP`EN|3!;JKTF%6xv|3g2e-ay}I@@J;wcrunU(#ccb|=m>UtgrrXeC_7?ig|0eQ>&?zlDEA5Ti z=+t*Wm+m&S{=JdkjJE$8dg?yTk}$#_(Ovo%8u=k~DKZzP=R;XEfaB4nXo{|R+psIT zsrsV<55asqJFbsHJD!X#-P|y{goGX4fxf9cj8*ZSsIUh+kk6Z)W~3uFAwL-1M3O-O&-Afi^fg%BO|%!mBYi z)oA^D(RS9MGy4R(r?#MbW;gmfLaVv{#>DyWN5TfO=oBtN1GoY0ct!XKT5oe)e=YJK zh2NkZ?mQ06hKwb!fH4R4d`aN0)9M8qhV7zZGp~E&7~z9Bt>7DBqqXVTYeZ!Pn>%|B6oOA+*8L3)0LS zkB+Db*2RA4RL?L^vb765UI8qMP|%bim(YbCM%8SStk zx^}Ix8FoUy9nXsE>(Tq3N2l~9bPw%7JKTkX@CUS=Q?E$vcE?8K2VqP4&nzV2=GlnN z@l|w}A41nO|H_oFhBjOq9YJICg{1>}|C#7s7>{n+E3pdRf-b?6Xuz+boA7PSeg1z; z!iK*@r}ihbfdgp8Vprv5`e9jgQ;o&`cs-tuU!fy!vN)ZJ)@XaDgk8cu;hEv6#hiaD zPNKk5FddC>PE?qO?ujd+{9$xP9!IBqI~w5EXaKv>nfnu+@`GsmMV6$^T^ik6wXi8R zTf+HwB;zQsp(oI(eI5;HJKEq!Xoow|hWDU*82_GmIM8R@&A;s*bxZji5G~ZyotA==nYqZD0!8;056&QGOY^gx8`Yy9J%W)p318xEUSL zD_Gj|{{aarev3}wU+74SU7yO2Ma%0({$zB?dPRP8BCpwTd=!~vM+uelS z@HNXl|7DlvWftLa=sVk8=tx(h=lg#273u}_L+6{g{sX!<_M)fe5ZXcB4e9=ATC8_@taNBK6io%f>r zyC~m_CsBSdY_>ern}ptf@p8_8?$}Y_2$o|tya!#om(eMI4-H@kTJKAA1bfjL+>g%G zVYI#CH>FR<3fP+b5OmWnMFYJRH{*j@5^jdcH>U<3M=LyscJwaV;8)lI_uwhm^p?EL zQk;sjF>`CWZw?yJ)#%JEL)&>8eR95r4(tas;Ow6yydm$lRIwPk`6{3tSC8_>=$f}j zXQCgv+t0#!cplo$t>`9P5k7*xM{GuC;A8YOeTghVHnWd}9UjJpSoHRIiNsFi2Vph5 z1#99)H1eJ31L`MqM2FFKO5Bl_raU_GifF*~(EwV6r{u14{yIm&pl~=k@^R>9n~pYc zA=>c*bnUN+>&wtUZb1Wi5WRmRo{XY(Au!AqrUHNnP7aDQi zUCATR0FFYJqB8m*Y82(2qr6{~kB;&S(ccXhqJghK2X-%J-Q5q6aLpb;8{QngjaK{u z?f6@CgnQ8u9**)O?@qsob~FUtTqDu7n}`Oy9P8lo=*RF6XubUZOZSyP11XE{`Vm+ar(s9DK1;%>c`y71 z?f6e@jQ>Tx@v78d8#K@k=u-4SM>Y%{`B-!SQ_*%8pdH^3`PFEE8^Y{n5{~edsPI-? z*oAiV13FcIp;KLWb=pivVQun_&^p#y1z26htWe*Zg_gdO)l z8yboRFcQ7teDo{W9PEIP<5>IyJ^w@2r2D3#9nXyX0(7mfi2U_&{U$VkRhWDKzn_E^ zA43D!gs$NWXaH|Veh0c2zD2(Y{ejL*v$d&yCv?;H$7Z+yeSukzF3IcYjO{=_jDA_m z`L~1O_oax+q8%KE!?13YFGA}rL8o*X+VP!n{bBSGyaC-4+tB0q7B;~jqWrk~)BRP@ z8K`?d=ii1KM?ov}iP#REiH>N)-O*dj7T0Kj`h+Bkh(4}aHEpzDE@Fp6-C+GlviR+mM z)Ads5_3ZH^tZ*XQz-d?u`-T^w9o~+1v!1O) zMh2SAbRkiff<9to2|zqX{Ij5UgTduKNCtm zn%b|2OUMtv+i)kI?EC+mb*aL7w1dylcec`xrDuJ2JeT|h=r12%;Ei~~{}XwcQMd!W zvGtRw;Yrwn{4MAVyovQO^Hh2zYk>Y9Fc>@Fh1kiokv z-B@OGUhW@}xB#8%Pthk|<>%5ApNZ|sFT;uW9{MCa<@xk0*9vs=mVY6Q_+*?y{vvdb z{eT|3qh3q_)_gIWmsvo;ofOo=s$0?@FzkW-$zPAoz*o2$+iXq0gzQA0Y>i(^pN3u0 z2hLdZ$#w}kgSX>lc`OZ{M1J5aX$BYLRPyVxBzzI5_G;QBW6?lvM`z$Abj^xxOC#@v zeaJ7tN%#qRN;w`fB@qtAtd=qp#5*Yh&fur9X59$^+6kl&EZX1G#*dH z579kP=*c5S^h9(Lg^(N4OiCr~xD z!nJ$=tKm9qf$w4+EV@1I^2X>0dZQyh7wzy4td8$Q{&#d!*M2w6+$40$??)fWo6!0@ z-sSxJz5j0ts$zxr(iFGG+=mgmhJDcy4@W;E#)gxld@1U^Kp7qw?e<=UWJz5 zi|(mc(7p3LHp5@h0IGjt;GDnOBrIrzj<7izX(x1wPDcY8gO2nfbZ;y~>tB!7TY

p}=zT5GneB*WJ^%ek*uYqHjb@__FG6SL#>n4;*4uz}@inxAeQ1Ei zKT93eK%a2xK2I+g$D$9S?&ztQgT)o36O zqV+yNJN_oh_oI8F+RhYsO>{}xp!J6CdLFGk;hZixJLbj?0SM|k9}w3%w5 zYuYGmiPgxTg3jRCI14A?Yxo83zz4oa52l4*rdP3-zs#mh_7??izFJ?U1{$FGR_I!t zitgfG=o$_}M=%=w(3u(eE7AJ5hxef~^CY^IFGu-~@Y^g2e;(V1eoU77Iz1vgqYaHh z1DP86nc=1A3|x;+@y+OIxgG1_Yv_~p53GUZzDf04A;&J$F7nwPB%HE-=!k}+OK~20 z3NA!%Sb%nPbzHw59oa4D{cF$}dK?Y>8T9_w!uQeoJJF@wjXaq6^IzYljw_*4*%*BQ zbwa0XaOB5_v(eqV813jbwBxmChwIRp*%ak3qV2qnF5PG7jQ*ID^Y3`^m zihq{^IR>4Xx@f~~(S|yr0rW*5P-mm}Ux3cw{K#L44s02EeAl4&KZCiy|FeyRBiMo7 z_=Okn2XxB*LT@PieJU@D)~|++q#k--<0x;12HXK1*g!O}v(W)eMB6pi4bVq%d-Qk@M@K#vo!RTqfN%eS^KZke zDDcK7(2>7}M)(oh;rCJg2RicnA5#M*(16RK^=hI^(G=ZeJ<#^XpdC*`>s^e_%vC>f z{+*g-6!;l%S6oqW3u74Wk-=X*aj*e_U8rXkmJ7s=K`Qy=c8lp?l zI!nR|?a>+NiB8oBwBn4=dUm`d^0!2OHQM1iw4IIU$hM+0_!ipH=ixW#p7|NQFT0n7 zQ}j35K+&I50A_%7PO=V;_Vp%18oQC@O)>Zl?bVC}F;l%E`SMK}8ZG|+P} z_xJzjkT9Y}=t!@L3U{C*c@*8%FQHTVIXabpp&b_aHCYA?v|?BXoq-nU5_drR>4Prq znV9?Uf5S*P@-b+`6VMwjL@Qnv*RMjS@LIIt8_^C|pn*JucJL%RqtA!0p!MHE`}qW| zx9eBVzc>C61;3;DgJI#{QU|5cfGVK@){pX&qr4kBbAuy44y`vG-5Zxi{u(skJJI&; z|Bdr+WKTtft#RRfG}5oo5r2=4XgAv6ALttXhb~dMJ*l0#VGFdQ4(RSb9diMq?T*9T zsmYQsl9^HAQuM~9=uF%dt_>eUZ+r%=_ezw%k9M#V9nfyH-rtcgv^V9;gvXuG?daM*hz?)_8t8NAsd*!=?@Z;{%=aX$ z_y^j+VYH*tzo$Sdq7BqWKXjU-51=0C%#A_=o{H9+i{5_)IE>yHnoMEUf{FGSnF3O#m9(c`-k`B2Md zo+4p{@1Pxij#m5`?cgBVz>x=%<3JJuyX5BuX9JOls6 z*4Xc0`lI=B}74-N0&1U&NJbl*%ILw*A`!wQF! zz0kci58L2X*b%p&ffV_V^KXRhNi@WzXos88FOOfLBXjGG$zzJqK(5Qn&rR)<*pK{c zxCD>S&(AExHFyO!D9Fz(#p76${PXB0{TAIr{}kk>@Bf7g<>%Ju1hnEw=o$?}fAg7w zf8pi08ZRlFpZodzgd+L5e?N37_NKg`XntNwsd}Olih_qDA@s~*cGdD{S5T&cy^R8#S_V|jQrc^^I{kJBlLHe`}aTdk4_C7jds)u z4dnF5pN+nL&p6+)-T<4B?}@g15gOpq@P4e~`QKs!zd|eK z9h*EBEk6xeo{%-r5jI2X^@;p6^ju$!)o>-+-ivYlBeb7C(00pJOxJ5vW<)T)~9>x^5;pNVf`rD|!j{)E-YA6-4=Pr`4= zXGfEmNTTZr>Dm1VdQ6(vNFAPxM%)e0#xrpMZou(atY&`hzvZ5XKB%@vzGSV`&KP`v z@=55-9bG%M+W?u7Y^F5{FLXpdW{03t_8#`d=5^9Dej#2!{!etzOs<=}0-do{;S*85 zE&LXp!Mu9O8fg74IXQnrqF^#Q(s}3}xE8%}4LbGP&}aCEXuU5ZzZZQ0IfUL(PMflKKLKrihWK@G4Ev%T4o6SJ+vuaW zOY;=?Sy-F=#psf*LhpYS-7_CV{*N%5*CJIYg|6lCXva;%&gdREGrSkA_h(q5Wq$5$ zxH|fpeLC9VXmpLIqMLah+Rg^_{z50^>SZ$(N%W?m4*F!9nJ#253vUST4j)7t-iWUC zHXMvcv`TwmB>E<_9=%?=b$W31#UA7z!d|!^JNo-yr#30V%kh6)couzmY;baV6}v2a z9j~GMsJ7{WbT``3QKzKO`6)P`{GI4qb(K?7K-17yw3pEGO6`(Uu^0Vko+sg>^vL#U z>Smx*G#}jyH=&zuMO#x zgAVXQ^f)fglJG%rAKFpL?x{jWG=Cx>UzhTMVX+|oe9i0^UPH4U1=nPH4 zo_Hya$2X(A#p&M1`Rhr-0M0}^T7@=nKf0@*4nIRXI*c}4qE8B-dU!G#@IdtX_$a>^ zU6SQ!`;TL;T|CODIpK9teoy2d zMB8~W{1mfB@&^e$reCVi8a;0PBY!b^eK|JACnNte8c@mp>A6uJ%}+vqQJIF$WEKtV zIy8WL(7-qMkMqAhF8qXUl7a#0hN@@-EzujgMEQ_#YPbk(__oMDj_&epcmjTdE?v=q zsonDETX+3|oPUo=M+$Q19et)xL2q~k4d8vWgKxrr=ucSi3!Gs;It`Gw)) zD8Dl&=kIY6xy^#E^*89q{=h-lVQ6Z2Il5G9(HVOl{WAF(I-;s)rTc560h|j()y>iB4_(5$R*|R5aj)=o`_K=>1(r zru&DXU%waP2z(ZOL8&w<4R8Tk|H@IEe;+h=QQ!!+p;Pw{_P|1;)2CD)bY>=_*QaAE zyg16&NBO46zZAX^z8BX&K~Kdu=%?!5(b*J9!I<>KIxeh>j<{9W6FvWDqf3&Sj`D)B>HEVmXuW~x9vhz};pgyU=o-Hr7j~gvI2w#g9Zf_x={&Ultx^6& zl)r%n_I+GG;+(WMYKL9WfXAT$%*9!ly@rGx7aE_Yrabxttd36k#dsnv#PPT;$}3Dr z_fEl>FS!?jz8SUdAc-9{RG{;eV-}9%x`A(R$O-naQF7T#nB8dd&U)x0Qqyzm5xg zumkzb)b!2fG&F#l(FVRl&wcsxQp3&B22Vz3qGvcBhmgM%4d7GE%^3R5`6uT7{r{oU z(prs2kKGcijUS*l9>Vf@d@P@zmZHM+{M?@p9)Ld4u0UsO7oLyJW~2^QV{h`sX6EPq z?dQShH=)OORdKM(hzGk(Nu&c7o(W_Bv5j80K~^f;XwaeYo)zZ%`u4~HM3 zOLG_vwDO#^*}9|cjSd%LRr2>_NjQ?1&|Ugvco6-NIC^e+QVqcxW%SyK~Xaybx)hzyD9d$akSrv>%P|xJ%LuG)C8OI+ntF(HYx- zQ*b*PK)ZSA#iS4VY+r%adkpRPE%Z6^J^JLU&eB(Q_uWFm-*}!t8~Oviq0sy^MU~N! z)kLqi3cH18qJd9{{8ecEThSSO5Z%NZ(Ry3ZcD^<5?*Eg7ksiAsb=Vwj;AAY0r(-=F z64x)qTgYF9x8n(yrUo}-WAbmI9UewcQL%+-=E|c>TqCT5x&Qyq1|*EMB|3E-(Ips! z|e+&AK_YV4v=L598edwdO@S>Ej7&ctQ`8U#b6xdLAwBupu zr`-9GzZTu)tI;XkgdVTY(U~iDS=wwh(fd20Ps*WDeg%5py^((vUE=RAW34>~nak5u z7Y)mzySFkL;3;8O^t|^&XJj_o(3O#2i3YR|{kVQJ@;{*M6uKhKL@6|1BTJ$ui4)O4 zW~1lca`P`@K5j!t{05$c`_TX!U71eL>F6;%C!B@O=oRSF+=edYnz+6x%)UXwDf=9K z0PRC>EO}L$@@i-UtSl#n~Q(Sl|+#dcE z7F?You7oz!4DF~7y1PeXGn|37@m};n^JZKxdQGZ#9J=NW&?je0%$@&>NchTiC;D-E z0PU#XwV213QJhTv%Inh9|AFp}Lf5AemB2~lYog`Xq5&>Pmu@Y(WE;>u^Ag(rH<T>AXv_&iS52vBW@j7%0A4HGiOW|i|hx^bG7P%om_s96lp!vSxQ1k&b77cX5 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 Z#-94E+1K%Sq@`O5kIjy%(UyD({|^<<*bx8# delta 62425 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 diff --git a/requirements.txt b/requirements.txt index 0cf22c7d8..2040bf422 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,10 +19,10 @@ drf-spectacular-sidecar==2024.5.1 feedparser==6.0.11 graphene-django==3.0.0 gunicorn==22.0.0 -Jinja2==3.1.3 +Jinja2==3.1.4 Markdown==3.6 -mkdocs-material==9.5.20 -mkdocstrings[python-legacy]==0.25.0 +mkdocs-material==9.5.21 +mkdocstrings[python-legacy]==0.25.1 netaddr==1.2.1 Pillow==10.3.0 psycopg[binary,pool]==3.1.18