Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gyuricska Milán
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
26220312
authored
Aug 24, 2013
by
Kálmán Viktor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
network: object deletion
parent
3f4f880d
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
281 additions
and
50 deletions
+281
-50
network/templates/network/base.html
+16
-9
network/templates/network/blacklist-edit.html
+1
-0
network/templates/network/confirm/base_delete.html
+43
-0
network/templates/network/confirm/remove_host_group.html
+1
-1
network/templates/network/confirm/rule_delete.html
+0
-16
network/templates/network/domain-edit.html
+2
-1
network/templates/network/group-edit.html
+2
-1
network/templates/network/host-edit.html
+2
-2
network/templates/network/record-edit.html
+1
-0
network/templates/network/rule-edit.html
+1
-0
network/templates/network/vlan-edit.html
+2
-1
network/templates/network/vlan-group-edit.html
+2
-1
network/urls.py
+21
-7
network/views.py
+187
-11
No files found.
network/templates/network/base.html
View file @
26220312
...
...
@@ -25,6 +25,10 @@
footer
{
margin-top
:
40px
;
}
.messagelist
{
margin-top
:
25px
;
}
</style>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
...
...
@@ -50,16 +54,19 @@
</ul>
</div>
</div>
{% block messages %}
{% if messages %}
<ul
class=
"messagelist"
>
{% for message in messages %}
<li
{%
if
message
.
tags
%}
class=
"{{ message.tags }}"
{%
endif
%}
>
{{ message }}
</li>
{% endfor %}
</ul>
{% endif %}
{% endblock messages %}
<div
class=
"container"
>
{% block messages %}
{% if messages %}
<div
class=
"messagelist"
>
{% for message in messages %}
<div
class=
"alert
{% if message.tags %} alert-{% if message.tags == "
error
"
%}
danger
{%
else
%}{{
message
.
tags
}}{%
endif
%}{%
endif
%}"
>
{{ message }}
</div>
{% endfor %}
</div>
{% endif %}
{% endblock messages %}
{% block content %}
<div
class=
"alert-block"
>
This is an abstract base template.
</div>
{% endblock %}
...
...
network/templates/network/blacklist-edit.html
View file @
26220312
...
...
@@ -7,6 +7,7 @@
{% block content %}
<div
class=
"page-header"
>
<a
href=
"{% url network.blacklist_delete pk=blacklist_pk %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this blaclist
</a>
<h1>
{{ form.ipv4.value }}
<small>
{{ form.type.value }}
</small></h1>
</div>
<div
class=
"row"
>
...
...
network/templates/network/confirm/base_delete.html
0 → 100644
View file @
26220312
{% extends "network/base.html" %}
{% load i18n %}
{% load l10n %}
{% block content %}
<div
class=
"page-header"
>
<h2>
Are you sure you want to delete
<strong>
"{% if to_delete %}{{ to_delete }}{% else %}{{ object }}{% endif %}"
</strong>
?
</h2>
</div>
<form
action=
""
method=
"post"
>
{% csrf_token %}
{% if deps %}
<div
class=
"alert alert-warning"
>
This action also
<strong>
removes
</strong>
the following
{% for dep in deps %}
<div
class=
"alert"
>
<strong>
{{ dep.name }}
</strong>
<ul
class=
""
>
{{ dep.data|unordered_list }}
</ul>
</div>
{% endfor %}
</div>
{% else %}
<div
class=
"alert alert-success"
>
No dependencies, safe to delete!
</div>
{% endif %}
<form
action=
""
method=
"post"
>
{% csrf_token %}
<input
type=
"hidden"
value=
"{{ request.GET.from }}"
name=
"next"
/>
{% if confirmation %}
<label><p>
If you are really sure, type in the object's name!
<input
type=
"text"
name=
"confirm"
class=
"form-control"
placeholder=
"{{ object }}"
/>
</p></label>
{% else %}
{% endif %}
<input
type=
"submit"
class=
"btn btn-danger btn-lg pull-right"
value=
"Yes delete it!"
/>
</form>
{% endblock %}
network/templates/network/confirm/remove_host_group.html
View file @
26220312
...
...
@@ -3,7 +3,7 @@
{% load l10n %}
{% block content %}
<div
class=
"page-head
ing"
>
<div
class=
"page-head
er"
>
<h1>
Remove
<small></small></h1>
</div>
<form
action=
""
method=
"post"
>
{% csrf_token %}
...
...
network/templates/network/confirm/rule_delete.html
deleted
100644 → 0
View file @
3f4f880d
{% extends "network/base.html" %}
{% load i18n %}
{% load l10n %}
{% block content %}
<div
class=
"page-heading"
>
<h1>
Delete
<small>
delete this rule
</small></h1>
</div>
<form
action=
""
method=
"post"
>
{% csrf_token %}
<p>
Are you sure you want to delete
<strong>
"{{ object }}"
</strong>
?
</p>
<input
type=
"hidden"
value=
"{{ request.GET.from }}"
name=
"next"
/>
<a
href=
"{{ request.GET.from }}"
class=
"btn btn-info"
>
Back
</a>
<input
type=
"submit"
class=
"btn btn-danger"
value=
"Confirm"
/>
</form>
{% endblock %}
network/templates/network/domain-edit.html
View file @
26220312
...
...
@@ -7,7 +7,8 @@
{% block content %}
<div
class=
"page-header"
>
<h1>
{{ form.name.value }}
<small></small></h1>
<a
href=
"{% url network.domain_delete pk=domain_pk %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this domain
</a>
<h1>
{{ form.name.value }}
<small></small></h1>
</div>
<div
class=
"row"
>
...
...
network/templates/network/group-edit.html
View file @
26220312
...
...
@@ -7,7 +7,8 @@
{% block content %}
<div
class=
"page-header"
>
<h1>
{{ form.name.value }}
<small>
details of group
</small></h1>
<a
href=
"{% url network.group_delete pk=group.pk %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this group
</a>
<h1>
{{ form.name.value }}
<small>
details of group
</small></h1>
</div>
<div
class=
"row"
>
...
...
network/templates/network/host-edit.html
View file @
26220312
...
...
@@ -7,10 +7,10 @@
{% block content %}
<div
class=
"page-header"
>
<h1>
{{ form.hostname.value }}
<small>
details of host
</small></h1>
<a
href=
"{% url network.host_delete pk=host_pk%}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this host
</a>
<h1>
{{ form.hostname.value }}
<small>
details of host
</small></h1>
</div>
<div
class=
"row"
>
<div
class=
"col-sm-8"
>
{% crispy form %}
...
...
network/templates/network/record-edit.html
View file @
26220312
...
...
@@ -7,6 +7,7 @@
{% block content %}
<div
class=
"page-header"
>
<a
href=
"{% url network.record_delete pk=record_pk %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this record
</a>
<h1>
{{ fqdn }}
<small>
details of record
</small></h1>
</div>
...
...
network/templates/network/rule-edit.html
View file @
26220312
...
...
@@ -7,6 +7,7 @@
{% block content %}
<div
class=
"page-header"
>
<a
href=
"{% url network.rule_delete pk=rule.pk %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this rule
</a>
<h3>
{% with rule as record %}
{% include "network/columns/host-rule.html" %}
...
...
network/templates/network/vlan-edit.html
View file @
26220312
...
...
@@ -7,7 +7,8 @@
{% block content %}
<div
class=
"page-header"
>
<h1>
{{ form.name.value }}
<small>
details of vlan
</small></h1>
<a
href=
"{% url network.vlan_delete vid=vlan_vid %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this vlan
</a>
<h1>
{{ form.name.value }}
<small>
details of vlan
</small></h1>
</div>
<div
class=
"row"
>
...
...
network/templates/network/vlan-group-edit.html
View file @
26220312
...
...
@@ -7,7 +7,8 @@
{% block content %}
<div
class=
"page-header"
>
<h1>
{{ form.name.value }}
<small>
details of vlan group
</small></h1>
<a
href=
"{% url network.vlangroup_delete pk=vlangroup_pk %}"
class=
"btn btn-danger pull-right"
><i
class=
"icon-remove-sign"
></i>
Delete this group
</a>
<h1>
{{ form.name.value }}
<small>
details of vlan group
</small></h1>
</div>
<div
class=
"row"
>
...
...
network/urls.py
View file @
26220312
from
django.conf.urls
import
patterns
,
url
from
.views
import
(
IndexView
,
HostList
,
HostDetail
,
HostCreate
,
VlanList
,
VlanDetail
,
DomainList
,
DomainDetail
,
GroupList
,
GroupDetail
,
RecordList
,
RecordDetail
,
RecordCreate
,
BlacklistList
,
BlacklistDetail
,
HostList
,
HostDetail
,
HostCreate
,
HostDelete
,
VlanList
,
VlanDetail
,
VlanDelete
,
DomainList
,
DomainDetail
,
DomainDelete
,
GroupList
,
GroupDetail
,
GroupDelete
,
RecordList
,
RecordDetail
,
RecordCreate
,
RecordDelete
,
BlacklistList
,
BlacklistDetail
,
BlacklistDelete
,
RuleList
,
RuleDetail
,
RuleDelete
,
VlanGroupList
,
VlanGroupDetail
,
VlanGroupList
,
VlanGroupDetail
,
VlanGroupDelete
,
remove_host_group
,
add_host_group
)
js_info_dict
=
{
...
...
@@ -22,28 +22,42 @@ urlpatterns = patterns(
name
=
'network.blacklist_list'
),
url
(
'^blacklists/(?P<pk>
\
d+)/$'
,
BlacklistDetail
.
as_view
(),
name
=
'network.blacklist'
),
url
(
'^blacklists/delete/(?P<pk>
\
d+)/$'
,
BlacklistDelete
.
as_view
(),
name
=
"network.blacklist_delete"
),
url
(
'^domains/$'
,
DomainList
.
as_view
(),
name
=
'network.domain_list'
),
url
(
'^domains/(?P<pk>
\
d+)/$'
,
DomainDetail
.
as_view
(),
name
=
'network.domain'
),
url
(
'^domains/delete/(?P<pk>
\
d+)/$'
,
DomainDelete
.
as_view
(),
name
=
"network.domain_delete"
),
url
(
'^groups/$'
,
GroupList
.
as_view
(),
name
=
'network.group_list'
),
url
(
'^groups/(?P<pk>
\
d+)/$'
,
GroupDetail
.
as_view
(),
name
=
'network.group'
),
url
(
'^groups/delete/(?P<pk>
\
d+)/$'
,
GroupDelete
.
as_view
(),
name
=
"network.group_delete"
),
url
(
'^hosts/$'
,
HostList
.
as_view
(),
name
=
'network.host_list'
),
url
(
'^hosts/create$'
,
HostCreate
.
as_view
(),
name
=
'network.host_create'
),
url
(
'^hosts/(?P<pk>
\
d+)/$'
,
HostDetail
.
as_view
(),
name
=
'network.host'
),
url
(
'^hosts/delete/(?P<pk>
\
d+)/$'
,
HostDelete
.
as_view
(),
name
=
"network.host_delete"
),
url
(
'^records/$'
,
RecordList
.
as_view
(),
name
=
'network.record_list'
),
url
(
'^records/create$'
,
RecordCreate
.
as_view
(),
name
=
'network.record_create'
),
url
(
'^records/(?P<pk>
\
d+)/$'
,
RecordDetail
.
as_view
(),
name
=
'network.record'
),
url
(
'^records/delete/(?P<pk>
\
d+)/$'
,
RecordDelete
.
as_view
(),
name
=
"network.record_delete"
),
url
(
'^rules/$'
,
RuleList
.
as_view
(),
name
=
'network.rule_list'
),
url
(
'^rules/(?P<pk>
\
d+)/$'
,
RuleDetail
.
as_view
(),
name
=
'network.rule'
),
url
(
'^vlans/$'
,
VlanList
.
as_view
(),
name
=
'network.vlan_list'
),
url
(
'^vlans/(?P<vid>
\
d+)/$'
,
VlanDetail
.
as_view
(),
name
=
'network.vlan'
),
url
(
'^vlans/delete/(?P<vid>
\
d+)/$'
,
VlanDelete
.
as_view
(),
name
=
"network.vlan_delete"
),
url
(
'^vlangroups/$'
,
VlanGroupList
.
as_view
(),
name
=
'network.vlan_group_list'
),
url
(
'^vlangroups/(?P<pk>
\
d+)/$'
,
VlanGroupDetail
.
as_view
(),
name
=
'network.vlan_group'
),
url
(
'^vlangroups/delete/(?P<pk>
\
d+)/$'
,
VlanGroupDelete
.
as_view
(),
name
=
"network.vlangroup_delete"
),
url
(
'^rules/delete/(?P<pk>
\
d+)/$'
,
RuleDelete
.
as_view
(),
name
=
"network.rule_delete"
),
url
(
'^hosts/(?P<pk>
\
d+)/remove/(?P<group_pk>
\
d+)/$'
,
remove_host_group
,
...
...
network/views.py
View file @
26220312
...
...
@@ -14,6 +14,8 @@ from .tables import (HostTable, VlanTable, SmallHostTable, DomainTable,
from
.forms
import
(
HostForm
,
VlanForm
,
DomainForm
,
GroupForm
,
RecordForm
,
BlacklistForm
,
RuleForm
,
VlanGroupForm
)
from
django.contrib
import
messages
from
django.utils.translation
import
ugettext_lazy
as
_
from
itertools
import
chain
import
json
...
...
@@ -66,6 +68,33 @@ class BlacklistDetail(UpdateView):
if
'pk'
in
self
.
kwargs
:
return
reverse_lazy
(
'network.blacklist'
,
kwargs
=
self
.
kwargs
)
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
BlacklistDetail
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'blacklist_pk'
]
=
self
.
object
.
pk
return
context
class
BlacklistDelete
(
DeleteView
):
model
=
Blacklist
template_name
=
"network/confirm/base_delete.html"
def
get_context_data
(
self
,
**
kwargs
):
""" display more information about the object """
context
=
super
(
BlacklistDelete
,
self
)
.
get_context_data
(
**
kwargs
)
if
'pk'
in
self
.
kwargs
:
to_delete
=
Blacklist
.
objects
.
get
(
pk
=
self
.
kwargs
[
'pk'
])
context
[
'to_delete'
]
=
"
%
s -
%
s -
%
s"
%
(
to_delete
.
ipv4
,
to_delete
.
reason
,
to_delete
.
type
)
return
context
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
self
.
request
.
POST
[
'next'
]
else
:
return
reverse_lazy
(
'network.blacklist_list'
)
class
DomainList
(
SingleTableView
):
model
=
Domain
...
...
@@ -83,6 +112,23 @@ class DomainDetail(UpdateView):
if
'pk'
in
self
.
kwargs
:
return
reverse_lazy
(
'network.domain'
,
kwargs
=
self
.
kwargs
)
def
get_context_data
(
self
,
*
args
,
**
kwargs
):
context
=
super
(
DomainDetail
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'domain_pk'
]
=
self
.
get_object
()
.
pk
return
context
class
DomainDelete
(
DeleteView
):
model
=
Domain
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
self
.
request
.
POST
[
'next'
]
else
:
return
reverse_lazy
(
'network.domain_list'
)
class
GroupList
(
SingleTableView
):
model
=
Group
...
...
@@ -101,6 +147,23 @@ class GroupDetail(UpdateView):
return
reverse_lazy
(
'network.group'
,
kwargs
=
self
.
kwargs
)
class
GroupDelete
(
DeleteView
):
model
=
Group
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
self
.
request
.
POST
[
'next'
]
else
:
return
reverse_lazy
(
'network.group_list'
)
def
get_context_data
(
self
,
*
args
,
**
kwargs
):
context
=
super
(
GroupDelete
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'group_pk'
]
=
self
.
object
.
pk
return
context
class
HostList
(
SingleTableView
):
model
=
Host
table_class
=
HostTable
...
...
@@ -192,6 +255,43 @@ class HostCreate(CreateView):
form_class
=
HostForm
class
HostDelete
(
DeleteView
):
model
=
Host
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
self
.
request
.
POST
[
'next'
]
else
:
return
reverse_lazy
(
'network.host_list'
)
def
get_context_data
(
self
,
*
args
,
**
kwargs
):
context
=
super
(
HostDelete
,
self
)
.
get_context_data
(
**
kwargs
)
deps
=
[]
records
=
Record
.
objects
.
filter
(
host
=
self
.
object
)
.
all
()
if
records
:
deps
.
append
({
'name'
:
'Records'
,
'data'
:
records
})
context
[
'deps'
]
=
deps
context
[
'confirmation'
]
=
True
return
context
def
delete
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
object
=
self
.
get_object
()
if
unicode
(
self
.
object
)
!=
request
.
POST
.
get
(
'confirm'
):
messages
.
error
(
request
,
_
(
"Object name does not match!"
))
return
self
.
get
(
request
,
*
args
,
**
kwargs
)
response
=
super
(
HostDelete
,
self
)
.
delete
(
request
,
*
args
,
**
kwargs
)
messages
.
success
(
request
,
"Deletion successful!"
)
return
response
class
RecordList
(
SingleTableView
):
model
=
Record
table_class
=
RecordTable
...
...
@@ -206,8 +306,8 @@ class RecordDetail(UpdateView):
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
RecordDetail
,
self
)
.
get_context_data
(
**
kwargs
)
q
=
Record
.
objects
.
get
(
pk
=
self
.
object
.
pk
)
.
fqdn
context
[
'
fqdn'
]
=
q
context
[
'fqdn'
]
=
self
.
object
.
fqdn
context
[
'
record_pk'
]
=
self
.
object
.
pk
return
context
def
get_success_url
(
self
):
...
...
@@ -221,6 +321,18 @@ class RecordCreate(CreateView):
form_class
=
RecordForm
class
RecordDelete
(
DeleteView
):
model
=
Record
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
self
.
request
.
POST
[
'next'
]
else
:
return
reverse_lazy
(
'network.record_list'
)
class
RuleList
(
SingleTableView
):
model
=
Rule
table_class
=
RuleTable
...
...
@@ -240,8 +352,7 @@ class RuleDetail(UpdateView):
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
RuleDetail
,
self
)
.
get_context_data
(
**
kwargs
)
pk
=
self
.
kwargs
.
get
(
'pk'
)
rule
=
Rule
.
objects
.
get
(
pk
=
pk
)
rule
=
self
.
get_object
()
context
[
'rule'
]
=
rule
return
context
...
...
@@ -249,11 +360,12 @@ class RuleDetail(UpdateView):
class
RuleDelete
(
DeleteView
):
model
=
Rule
template_name
=
"network/confirm/
rul
e_delete.html"
template_name
=
"network/confirm/
bas
e_delete.html"
def
get_success_url
(
self
):
if
'next'
in
self
.
request
.
POST
:
return
self
.
request
.
POST
[
'next'
]
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
next
else
:
return
reverse_lazy
(
'network.rule_list'
)
...
...
@@ -276,11 +388,62 @@ class VlanDetail(UpdateView):
context
=
super
(
VlanDetail
,
self
)
.
get_context_data
(
**
kwargs
)
q
=
Host
.
objects
.
filter
(
vlan
=
self
.
object
)
.
all
()
context
[
'host_list'
]
=
SmallHostTable
(
q
)
context
[
'vlan_vid'
]
=
self
.
kwargs
.
get
(
'vid'
)
return
context
success_url
=
reverse_lazy
(
'network.vlan_list'
)
class
VlanDelete
(
DeleteView
):
model
=
Vlan
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
next
else
:
return
reverse_lazy
(
'network.vlan_list'
)
def
get_object
(
self
,
queryset
=
None
):
""" we identify vlans by vid and not pk """
return
Vlan
.
objects
.
get
(
vid
=
self
.
kwargs
[
'vid'
])
def
delete
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
object
=
self
.
get_object
()
if
unicode
(
self
.
object
)
!=
request
.
POST
.
get
(
'confirm'
):
messages
.
error
(
request
,
_
(
"Object name does not match!"
))
return
self
.
get
(
request
,
*
args
,
**
kwargs
)
response
=
super
(
VlanDelete
,
self
)
.
delete
(
request
,
*
args
,
**
kwargs
)
messages
.
success
(
request
,
"Deletion successful!"
)
return
response
def
get_context_data
(
self
,
**
kwargs
):
context
=
super
(
VlanDelete
,
self
)
.
get_context_data
(
**
kwargs
)
deps
=
[]
# hosts
hosts
=
Host
.
objects
.
filter
(
vlan
=
self
.
get_object
)
.
all
()
if
len
(
hosts
)
>
0
:
deps
.
append
({
'name'
:
'Hosts'
,
'data'
:
hosts
})
# records
records
=
Record
.
objects
.
filter
(
host__in
=
deps
[
0
][
'data'
])
if
len
(
records
)
>
0
:
deps
.
append
({
'name'
:
'Records'
,
'data'
:
records
})
context
[
'deps'
]
=
deps
context
[
'confirmation'
]
=
True
return
context
class
VlanGroupList
(
SingleTableView
):
model
=
VlanGroup
table_class
=
VlanGroupTable
...
...
@@ -295,6 +458,23 @@ class VlanGroupDetail(UpdateView):
success_url
=
reverse_lazy
(
'network.vlan_group_list'
)
def
get_context_data
(
self
,
*
args
,
**
kwargs
):
context
=
super
(
VlanGroupDetail
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'vlangroup_pk'
]
=
self
.
object
.
pk
return
context
class
VlanGroupDelete
(
DeleteView
):
model
=
VlanGroup
template_name
=
"network/confirm/base_delete.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
POST
.
get
(
'next'
)
if
next
:
return
next
else
:
return
reverse_lazy
(
'network.vlan_group_list'
)
def
remove_host_group
(
request
,
**
kwargs
):
host
=
Host
.
objects
.
get
(
pk
=
kwargs
[
'pk'
])
...
...
@@ -323,7 +503,3 @@ def add_host_group(request, **kwargs):
group
=
Group
.
objects
.
get
(
pk
=
group_pk
)
host
.
groups
.
add
(
group
)
return
redirect
(
reverse_lazy
(
'network.host'
,
kwargs
=
kwargs
))
def
get_host_as_json
(
request
,
**
kwargs
):
pass
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment