Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gutyán Gábor
/
circlestack
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
b8c96939
authored
Mar 05, 2014
by
Oláh István Gergely
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dashboard: add trait with view
parent
2972e5cb
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
101 additions
and
34 deletions
+101
-34
circle/dashboard/forms.py
+14
-2
circle/dashboard/templates/dashboard/node-add-trait.html
+31
-0
circle/dashboard/templates/dashboard/node-detail-home.html
+11
-9
circle/dashboard/urls.py
+3
-1
circle/dashboard/views.py
+42
-22
No files found.
circle/dashboard/forms.py
View file @
b8c96939
...
...
@@ -815,8 +815,20 @@ class TraitForm(forms.ModelForm):
self
.
helper
.
form_show_labels
=
False
self
.
helper
.
layout
=
Layout
(
Div
(
'name'
,
css_class
=
"col-sm-2"
,
Div
(
Field
(
'name'
,
id
=
"node-details-traits-input"
,
css_class
=
"input-sm input-traits"
),
Div
(
HTML
(
'<input type="submit" '
'class="btn btn-default btn-sm input-traits" '
'value="Add trait"/>'
,
),
css_class
=
"input-group-btn"
,
),
css_class
=
"input-group"
,
id
=
"node-details-traits-form"
,
),
css_class
=
"row"
,
),
)
...
...
circle/dashboard/templates/dashboard/node-add-trait.html
0 → 100644
View file @
b8c96939
{% extends "dashboard/base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block content %}
<style>
.help-block
{
display
:
none
;
}
.row
{
margin-bottom
:
15px
;
}
</style>
<div
class=
"row"
>
<div
class=
"col-md-12"
>
<div
class=
"panel panel-default"
>
<div
class=
"panel-heading"
>
<h3
class=
"no-margin"
><i
class=
"icon-plus"
></i>
{% trans "Add Trait" %}
</h3>
</div>
<div
class=
"panel-body"
>
{% with form=form %}
{% include "display-form-errors.html" %}
{% endwith %}
{% crispy form %}
</div>
</div>
</div>
</div>
{% endblock %}
circle/dashboard/templates/dashboard/node-detail-home.html
View file @
b8c96939
...
...
@@ -21,15 +21,17 @@
<small>
{% trans "No trait added!" %}
</small>
{% endif %}
</div>
<form
action=
""
method=
"POST"
>
{% csrf_token %}
<div
class=
"input-group"
id=
"node-details-traits-form"
>
<input
type=
"text"
class=
"form-control input-sm input-traits"
name=
"new_trait"
id=
"node-details-traits-input"
/>
<div
class=
"input-group-btn"
>
<input
type=
"submit"
class=
"btn btn-default btn-sm input-traits"
value=
"{% trans "
Add
trait
"
%}"
/>
</div>
</div>
</form>
{% load crispy_forms_tags %}
<style>
.row
{
margin-bottom
:
15px
;
}
</style>
<form
action=
"{% url "
dashboard
.
views
.
node-addtrait
"
node
.
pk
%}"
method=
"POST"
>
{% csrf_token %}
{% crispy trait_form %}
</form>
</div>
<!-- id:node-details-traits -->
</div>
<div
class=
"col-md-8"
>
...
...
circle/dashboard/urls.py
View file @
b8c96939
...
...
@@ -8,7 +8,7 @@ from .views import (
TemplateList
,
LeaseDetail
,
NodeCreate
,
LeaseCreate
,
TemplateCreate
,
FavouriteView
,
NodeStatus
,
GroupList
,
TemplateDelete
,
LeaseDelete
,
VmGraphView
,
TemplateAclUpdateView
,
GroupDetailView
,
GroupDelete
,
GroupAclUpdateView
,
GroupUserDelete
,
GroupAclUpdateView
,
GroupUserDelete
,
NodeAddTraitView
,
)
urlpatterns
=
patterns
(
...
...
@@ -52,6 +52,8 @@ urlpatterns = patterns(
url
(
r'^node/list/$'
,
NodeList
.
as_view
(),
name
=
'dashboard.views.node-list'
),
url
(
r'^node/(?P<pk>\d+)/$'
,
NodeDetailView
.
as_view
(),
name
=
'dashboard.views.node-detail'
),
url
(
r'^node/(?P<pk>\d+)/add-trait/$'
,
NodeAddTraitView
.
as_view
(),
name
=
'dashboard.views.node-addtrait'
),
url
(
r'^tx/$'
,
TransferOwnershipConfirmView
.
as_view
(),
name
=
'dashboard.views.vm-transfer-ownership-confirm'
),
url
(
r'^node/delete/(?P<pk>\d+)/$'
,
NodeDelete
.
as_view
(),
...
...
circle/dashboard/views.py
View file @
b8c96939
...
...
@@ -29,11 +29,12 @@ from braces.views import LoginRequiredMixin, SuperuserRequiredMixin
from
.forms
import
(
VmCreateForm
,
TemplateForm
,
LeaseForm
,
NodeForm
,
HostForm
,
DiskAddForm
,
TraitForm
,
)
from
.tables
import
(
VmListTable
,
NodeListTable
,
NodeVmListTable
,
TemplateListTable
,
LeaseListTable
,
GroupListTable
,)
from
vm.models
import
(
Instance
,
InstanceTemplate
,
InterfaceTemplate
,
InstanceActivity
,
Node
,
instance_activity
,
Lease
,
InstanceActivity
,
Node
,
Trait
,
instance_activity
,
Lease
,
Interface
,
NodeActivity
,
)
from
firewall.models
import
Vlan
,
Host
,
Rule
from
storage.models
import
Disk
...
...
@@ -439,8 +440,12 @@ class VmDetailView(CheckedDetailView):
class
NodeDetailView
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
DetailView
):
template_name
=
"dashboard/node-detail.html"
model
=
Node
form
=
None
form_class
=
TraitForm
def
get_context_data
(
self
,
**
kwargs
):
def
get_context_data
(
self
,
form
=
None
,
**
kwargs
):
if
form
is
None
:
form
=
self
.
form_class
()
context
=
super
(
NodeDetailView
,
self
)
.
get_context_data
(
**
kwargs
)
instances
=
Instance
.
active
.
filter
(
node
=
self
.
object
)
context
[
'table'
]
=
NodeVmListTable
(
instances
)
...
...
@@ -448,6 +453,7 @@ class NodeDetailView(LoginRequiredMixin, SuperuserRequiredMixin, DetailView):
node
=
self
.
object
,
parent
=
None
)
.
order_by
(
'-started'
)
.
select_related
()
context
[
'activities'
]
=
ia
context
[
'trait_form'
]
=
form
return
context
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
...
...
@@ -455,8 +461,6 @@ class NodeDetailView(LoginRequiredMixin, SuperuserRequiredMixin, DetailView):
return
self
.
__set_name
(
request
)
if
request
.
POST
.
get
(
'new_status'
):
return
self
.
__set_status
(
request
)
if
request
.
POST
.
get
(
'new_trait'
):
return
self
.
__add_trait
(
request
)
if
request
.
POST
.
get
(
'to_remove'
):
return
self
.
__remove_trait
(
request
)
...
...
@@ -508,24 +512,6 @@ class NodeDetailView(LoginRequiredMixin, SuperuserRequiredMixin, DetailView):
return
redirect
(
reverse_lazy
(
"dashboard.views.node-detail"
,
kwargs
=
{
'pk'
:
self
.
object
.
pk
}))
def
__add_trait
(
self
,
request
):
new_trait_name
=
request
.
POST
.
get
(
'new_trait'
)
self
.
object
=
self
.
get_object
()
if
len
(
new_trait_name
)
<
1
:
message
=
u"Please input something!"
elif
len
(
new_trait_name
)
>
20
:
message
=
u"Trait name is too long!"
else
:
self
.
object
.
traits
.
create
(
name
=
new_trait_name
)
try
:
messages
.
error
(
request
,
message
)
except
:
pass
return
redirect
(
self
.
object
.
get_absolute_url
())
def
__remove_trait
(
self
,
request
):
try
:
to_remove
=
request
.
POST
.
get
(
'to_remove'
)
...
...
@@ -1230,6 +1216,40 @@ class NodeDelete(LoginRequiredMixin, SuperuserRequiredMixin, DeleteView):
return
reverse_lazy
(
'dashboard.index'
)
class
NodeAddTraitView
(
SuperuserRequiredMixin
,
DetailView
):
model
=
Node
template_name
=
"dashboard/node-add-trait.html"
def
get_success_url
(
self
):
next
=
self
.
request
.
GET
.
get
(
'next'
)
if
next
:
return
next
else
:
return
reverse_lazy
(
"dashboard.views.node-detail"
,
kwargs
=
{
'pk'
:
self
.
object
.
pk
})
def
get_context_data
(
self
,
**
kwargs
):
self
.
object
=
self
.
get_object
()
context
=
super
(
NodeAddTraitView
,
self
)
.
get_context_data
(
**
kwargs
)
context
[
'form'
]
=
(
TraitForm
(
self
.
request
.
POST
)
if
self
.
request
.
POST
else
TraitForm
())
return
context
def
post
(
self
,
request
,
pk
,
*
args
,
**
kwargs
):
context
=
self
.
get_context_data
(
**
kwargs
)
form
=
context
[
'form'
]
if
form
.
is_valid
():
node
=
self
.
object
n
=
form
.
cleaned_data
[
'name'
]
trait
,
created
=
Trait
.
objects
.
get_or_create
(
name
=
n
)
node
.
traits
.
add
(
trait
)
success_message
=
_
(
"Trait successfully added to node."
)
messages
.
success
(
request
,
success_message
)
return
redirect
(
self
.
get_success_url
())
else
:
return
self
.
get
(
self
,
request
,
pk
,
*
args
,
**
kwargs
)
class
NodeStatus
(
LoginRequiredMixin
,
SuperuserRequiredMixin
,
DetailView
):
template_name
=
"dashboard/confirm/node-status.html"
model
=
Node
...
...
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