Skip to content

Commit 5accdb9

Browse files
authored
Merge pull request #10 from k01ek/develop
Develop
2 parents 7533d86 + 7c10478 commit 5accdb9

File tree

10 files changed

+170
-18
lines changed

10 files changed

+170
-18
lines changed

.github/workflows/pub-pypi.yml

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
build-n-publish:
9+
name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
10+
runs-on: ubuntu-18.04
11+
steps:
12+
- uses: actions/checkout@main
13+
- name: Set up Python 3.7
14+
uses: actions/setup-python@v1
15+
with:
16+
python-version: 3.7
17+
- name: Install pypa/build
18+
run: >-
19+
python -m
20+
pip install
21+
build
22+
--user
23+
- name: Build a binary wheel and a source tarball
24+
run: >-
25+
python -m
26+
build
27+
--sdist
28+
--wheel
29+
--outdir dist/
30+
.
31+
- name: Publish distribution 📦 to PyPI
32+
uses: pypa/gh-action-pypi-publish@release/v1
33+
with:
34+
user: __token__
35+
password: ${{ secrets.PYPI_API_TOKEN }}

Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
PYTHON_VER?=3.7
2-
NETBOX_VER?=v2.10.3
2+
NETBOX_VER?=v2.11.1
33

44
NAME=netbox-bgp
55

@@ -47,12 +47,12 @@ makemigrations:
4747
run netbox python manage.py makemigrations --name ${BUILD_NAME}
4848
docker-compose -f ${COMPOSE_FILE} -p ${BUILD_NAME} down
4949

50-
build:
50+
pbuild:
5151
python3 -m pip install --upgrade build
5252
python3 -m build
5353

5454
pypipub:
55-
python3 -m pip install --user --upgrade twine
55+
python3 -m pip install --upgrade twine
5656
python3 -m twine upload dist/*
5757

5858
relpatch:

netbox_bgp/api/serializers.py

+46-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,55 @@
1-
from rest_framework.serializers import ModelSerializer
1+
from rest_framework.serializers import Serializer, HyperlinkedIdentityField
22

3-
from netbox.api import ChoiceField
3+
from netbox.api import ChoiceField, WritableNestedSerializer
44
from dcim.api.nested_serializers import NestedSiteSerializer
55
from tenancy.api.nested_serializers import NestedTenantSerializer
6-
from extras.api.serializers import TaggedObjectSerializer
7-
from extras.api.customfields import CustomFieldModelSerializer
6+
7+
try:
8+
from extras.api.customfields import CustomFieldModelSerializer
9+
except ImportError:
10+
from netbox.api.serializers import CustomFieldModelSerializer
11+
12+
from extras.models import Tag
813
from netbox_bgp.models import ASN, ASNStatusChoices, BGPSession, SessionStatusChoices
914

1015

16+
class NestedTagSerializer(WritableNestedSerializer):
17+
url = HyperlinkedIdentityField(view_name='extras-api:tag-detail')
18+
19+
class Meta:
20+
model = Tag
21+
fields = ['id', 'url', 'name', 'slug', 'color']
22+
23+
24+
class TaggedObjectSerializer(Serializer):
25+
tags = NestedTagSerializer(many=True, required=False)
26+
27+
def create(self, validated_data):
28+
tags = validated_data.pop('tags', None)
29+
instance = super().create(validated_data)
30+
31+
if tags is not None:
32+
return self._save_tags(instance, tags)
33+
return instance
34+
35+
def update(self, instance, validated_data):
36+
tags = validated_data.pop('tags', None)
37+
# Cache tags on instance for change logging
38+
instance._tags = tags or []
39+
40+
instance = super().update(instance, validated_data)
41+
if tags is not None:
42+
return self._save_tags(instance, tags)
43+
return instance
44+
45+
def _save_tags(self, instance, tags):
46+
if tags:
47+
instance.tags.set(*[t.name for t in tags])
48+
else:
49+
instance.tags.clear()
50+
return instance
51+
52+
1153
class ASNSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
1254
status = ChoiceField(choices=ASNStatusChoices, required=False)
1355
site = NestedSiteSerializer(required=False, allow_null=True)
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Generated by Django 3.2 on 2021-04-23 05:03
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('netbox_bgp', '0009_netbox_bgp'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='asn',
16+
name='id',
17+
field=models.BigAutoField(primary_key=True, serialize=False),
18+
),
19+
migrations.AlterField(
20+
model_name='asngroup',
21+
name='id',
22+
field=models.BigAutoField(primary_key=True, serialize=False),
23+
),
24+
migrations.AlterField(
25+
model_name='bgppeergroup',
26+
name='id',
27+
field=models.BigAutoField(primary_key=True, serialize=False),
28+
),
29+
migrations.AlterField(
30+
model_name='bgpsession',
31+
name='id',
32+
field=models.BigAutoField(primary_key=True, serialize=False),
33+
),
34+
migrations.RemoveField(
35+
model_name='bgpsession',
36+
name='peer_group',
37+
),
38+
migrations.AddField(
39+
model_name='bgpsession',
40+
name='peer_group',
41+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='netbox_bgp.bgppeergroup'),
42+
),
43+
migrations.AlterField(
44+
model_name='community',
45+
name='id',
46+
field=models.BigAutoField(primary_key=True, serialize=False),
47+
),
48+
]

netbox_bgp/models.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55

66
from utilities.choices import ChoiceSet
77
from utilities.querysets import RestrictedQuerySet
8-
from extras.models import ChangeLoggedModel, TaggedItem
8+
try:
9+
from extras.models import ChangeLoggedModel
10+
except ImportError:
11+
from netbox.models import ChangeLoggedModel
12+
from extras.models import TaggedItem
913
from extras.utils import extras_features
1014

1115

@@ -239,9 +243,11 @@ class BGPSession(ChangeLoggedModel):
239243
max_length=200,
240244
blank=True
241245
)
242-
peer_group = models.ManyToManyField(
246+
peer_group = models.ForeignKey(
243247
BGPPeerGroup,
248+
on_delete=models.SET_NULL,
244249
blank=True,
250+
null=True
245251
)
246252
afi_safi = None # for future use
247253
tags = TaggableManager(through=TaggedItem)

netbox_bgp/tables.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import django_tables2 as tables
22
from django.utils.safestring import mark_safe
33

4-
from utilities.tables import (
5-
BaseTable, ChoiceFieldColumn, ToggleColumn,
6-
)
7-
8-
from tenancy.tables import COL_TENANT
4+
from utilities.tables import BaseTable, ChoiceFieldColumn, ToggleColumn
95

106
from .models import ASN, Community, BGPSession
117

128
AVAILABLE_LABEL = mark_safe('<span class="label label-success">Available</span>')
9+
COL_TENANT = """
10+
{% if record.tenant %}
11+
<a href="{{ record.tenant.get_absolute_url }}" title="{{ record.tenant.description }}">{{ record.tenant }}</a>
12+
{% else %}
13+
&mdash;
14+
{% endif %}
15+
"""
1316

1417

1518
class ASNTable(BaseTable):

netbox_bgp/templates/netbox_bgp/asn.html

+7-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,13 @@
5050
{% endif %}
5151
</div>
5252
<h1>{% block title %}AS{{ object }}{% endblock %}</h1>
53-
{% include 'inc/created_updated.html' %}
53+
<p>
54+
<small class="text-muted">
55+
Created {{ object.created }} &middot;
56+
Updated <span title="{{ object.last_updated }}">{{ object.last_updated|timesince }}</span> ago
57+
</small>
58+
<span class="label label-default">{{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}:{{ object.pk }}</span>
59+
</p>
5460
<div class="pull-right noprint">
5561
{% custom_links object %}
5662
</div>

netbox_bgp/templates/netbox_bgp/bgpsession.html

+7-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,13 @@
5050
{% endif %}
5151
</div>
5252
<h1>{% block title %}BGP Session {{ object }}{% endblock %}</h1>
53-
{% include 'inc/created_updated.html' %}
53+
<p>
54+
<small class="text-muted">
55+
Created {{ object.created }} &middot;
56+
Updated <span title="{{ object.last_updated }}">{{ object.last_updated|timesince }}</span> ago
57+
</small>
58+
<span class="label label-default">{{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}:{{ object.pk }}</span>
59+
</p>
5460
<div class="pull-right noprint">
5561
{% custom_links object %}
5662
</div>

netbox_bgp/templates/netbox_bgp/community.html

+7-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,13 @@
5050
{% endif %}
5151
</div>
5252
<h1>{% block title %}{{ object }}{% endblock %}</h1>
53-
{% include 'inc/created_updated.html' %}
53+
<p>
54+
<small class="text-muted">
55+
Created {{ object.created }} &middot;
56+
Updated <span title="{{ object.last_updated }}">{{ object.last_updated|timesince }}</span> ago
57+
</small>
58+
<span class="label label-default">{{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}:{{ object.pk }}</span>
59+
</p>
5460
<div class="pull-right noprint">
5561
{% custom_links object %}
5662
</div>

netbox_bgp/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.1.0"
1+
__version__ = "0.2.0"

0 commit comments

Comments
 (0)