Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.

Commit e18e524

Browse files
authored
Merge pull request #104 from Weirdo914/master
[models] Addresses implementation is not optimal #61
2 parents c4b493d + 44ff090 commit e18e524

19 files changed

+121
-102
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ __pycache__/
77

88
# Distribution / packaging
99
.Python
10+
venv/
1011
env/
1112
build/
1213
develop-eggs/
@@ -54,6 +55,7 @@ target/
5455
# editors
5556
*.komodoproject
5657
*.komodotools
58+
.vscode/
5759

5860
# other
5961
*.DS_Store*

django_netjsongraph/base/link.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ def get_from_nodes(cls, source, target, topology):
103103
:param topology: Topology instance
104104
:returns: Link object or None
105105
"""
106-
source = ';{0};'.format(source)
107-
target = ';{0};'.format(target)
106+
source = '"{}"'.format(source)
107+
target = '"{}"'.format(target)
108108
q = (Q(source__addresses__contains=source,
109109
target__addresses__contains=target) |
110110
Q(source__addresses__contains=target,

django_netjsongraph/base/node.py

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class AbstractNode(TimeStampedEditableModel):
2323
on_delete=models.CASCADE)
2424
label = models.CharField(max_length=64, blank=True)
2525
# netjson ID and local_addresses
26-
addresses = models.CharField(max_length=510, db_index=True)
26+
addresses = JSONField(default=[])
2727
properties = JSONField(default=dict,
2828
blank=True,
2929
load_kwargs={'object_pairs_hook': OrderedDict},
@@ -40,50 +40,17 @@ def clean(self):
4040
self.properties = {}
4141

4242
def save(self, *args, **kwargs):
43-
self._format_addresses()
4443
super(AbstractNode, self).save(*args, **kwargs)
4544

46-
def _format_addresses(self):
47-
"""
48-
Ensure address format is correct: ";addr1;addr2;addr3;"
49-
"""
50-
self.addresses = self.addresses.replace(',', ';')\
51-
.replace(' ', '')\
52-
.replace(';', ';')
53-
if not self.addresses.startswith(';'):
54-
self.addresses = ';' + self.addresses
55-
if not self.addresses.endswith(';'):
56-
self.addresses += ';'
57-
58-
def truncate_addresses(self):
59-
"""
60-
ensures "addresses" field is not too long
61-
"""
62-
max_length = self._meta.get_field('addresses').max_length
63-
if len(self.addresses) <= max_length:
64-
return
65-
addresses = self.address_list
66-
# +1 stands for the character added in self._format_address()
67-
while len(';'.join(addresses)) + 2 > max_length:
68-
addresses.pop()
69-
self.addresses = ';'.join(addresses)
70-
71-
@cached_property
72-
def address_list(self):
73-
addresses = self.addresses.replace(' ', '')
74-
if addresses.startswith(';'):
75-
addresses = addresses[1:]
76-
return addresses[0:-1].split(';')
77-
7845
@property
7946
def netjson_id(self):
80-
if self.addresses:
81-
return self.address_list[0]
47+
if len(self.addresses) > 0:
48+
return self.addresses[0]
8249

8350
@cached_property
8451
def local_addresses(self):
85-
if self.addresses and len(self.address_list) > 1:
86-
return self.address_list[1:]
52+
if len(self.addresses) > 1:
53+
return self.addresses[1:]
8754

8855
@property
8956
def name(self):
@@ -114,7 +81,7 @@ def get_from_address(cls, address, topology):
11481
:param topology: Topology instance
11582
:returns: Node object or None
11683
"""
117-
address = ';{0};'.format(address)
84+
address = '"{}"'.format(address)
11885
return cls.objects.filter(topology=topology,
11986
addresses__contains=address).first()
12087

@@ -126,7 +93,7 @@ def count_address(cls, address, topology):
12693
:param topology: Topology instance
12794
:returns: int
12895
"""
129-
address = ';{0};'.format(address)
96+
address = '"{}"'.format(address)
13097
return cls.objects.filter(topology=topology,
13198
addresses__contains=address).count()
13299

django_netjsongraph/base/topology.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,14 +208,13 @@ def update(self, data=None):
208208
if node: # pragma no cover
209209
continue
210210
# if node doesn't exist create new
211-
addresses = '{0};'.format(node_dict['id'])
212-
addresses += ';'.join(node_dict.get('local_addresses', []))
211+
addresses = [node_dict['id']]
212+
addresses += node_dict.get('local_addresses', [])
213213
properties = node_dict.get('properties', {})
214214
node = self._create_node(addresses=addresses,
215215
properties=properties)
216216
if 'label' in node_dict:
217217
node.label = node_dict.get('label')
218-
node.truncate_addresses()
219218
node.full_clean()
220219
node.save()
221220

django_netjsongraph/fixtures/test_nodes.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"fields":{
66
"label":"node1",
77
"topology":"a083b494-8e16-4054-9537-fb9eba914861",
8-
"addresses": "192.168.0.1;",
8+
"addresses": ["192.168.0.1"],
99
"created":"2015-05-16T20:02:52.483Z",
1010
"modified":"2015-05-16T19:33:41.621Z",
1111
"properties": {}
@@ -17,7 +17,7 @@
1717
"fields":{
1818
"label":"node2",
1919
"topology":"a083b494-8e16-4054-9537-fb9eba914861",
20-
"addresses": "192.168.0.2;",
20+
"addresses": ["192.168.0.2"],
2121
"created":"2015-05-16T20:02:52.483Z",
2222
"modified":"2015-05-16T19:33:41.621Z",
2323
"properties": {}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 2.2.9 on 2019-12-24 07:52
2+
3+
import jsonfield.fields
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('django_netjsongraph', '0007_link_status_changed'),
11+
]
12+
13+
operations = [
14+
migrations.RenameField(
15+
model_name='node',
16+
old_name='addresses',
17+
new_name='addresses_old',
18+
),
19+
migrations.AddField(
20+
model_name='node',
21+
name='addresses',
22+
field=jsonfield.fields.JSONField(default=[]),
23+
),
24+
]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Generated by Django 2.2.9 on 2019-12-30 07:29
2+
3+
from django.db import migrations
4+
5+
from . import migrate_addresses
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('django_netjsongraph', '0008_create_new_address_field'),
12+
]
13+
14+
operations = [
15+
migrations.RunPython(migrate_addresses)
16+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 2.2.9 on 2019-12-30 07:45
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('django_netjsongraph', '0009_migrate_addresses_data'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='node',
15+
name='addresses_old',
16+
),
17+
]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
def migrate_addresses(apps, schema_editor, app='django_netjsongraph'):
2+
Node = apps.get_model(app, 'Node')
3+
for node in Node.objects.all():
4+
addresses = node.addresses_old.replace(' ', '')
5+
if addresses.startswith(';'):
6+
addresses = addresses[1:]
7+
addresses = addresses[0:-1].split(';')
8+
node.addresses = addresses
9+
node.save()

django_netjsongraph/tests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def _create_topology(self, **kwargs):
1717

1818
def _create_node(self, **kwargs):
1919
options = dict(label='TestNode',
20-
addresses='192.168.0.1;',
20+
addresses=['192.168.0.1'],
2121
created='2017-07-10T20:02:52.483Z',
2222
modified='2017-07-14T20:02:52.483Z',
2323
properties={})

0 commit comments

Comments
 (0)