Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
94
Merge Requests
10
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
317e11b7
authored
Apr 09, 2014
by
Kálmán Viktor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dashboard: template wizard draft 2
parent
f1402363
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
549 additions
and
5 deletions
+549
-5
circle/dashboard/static/dashboard/bootstrap-tour.min.css
+20
-0
circle/dashboard/static/dashboard/bootstrap-tour.min.js
+20
-0
circle/dashboard/static/dashboard/vm-tour.js
+130
-0
circle/dashboard/templates/base.html
+1
-0
circle/dashboard/templates/dashboard/_template-create-1.html
+2
-1
circle/dashboard/templates/dashboard/vm-detail.html
+49
-2
circle/dashboard/templates/dashboard/vm-detail/resources.html
+1
-1
circle/dashboard/views.py
+16
-1
circle/vm/migrations/0022_auto__add_field_instance_is_base.py
+309
-0
circle/vm/models/instance.py
+1
-0
No files found.
circle/dashboard/static/dashboard/bootstrap-tour.min.css
0 → 100644
View file @
317e11b7
/* ===========================================================
# bootstrap-tour - v0.9.1
# http://bootstraptour.com
# ==============================================================
# Copyright 2012-2013 Ulrich Sossou
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/
.tour-backdrop
{
position
:
fixed
;
top
:
0
;
right
:
0
;
bottom
:
0
;
left
:
0
;
z-index
:
1100
;
background-color
:
#000
;
opacity
:
.8
}
.tour-step-backdrop
{
position
:
relative
;
z-index
:
1101
;
background
:
inherit
}
.tour-step-background
{
position
:
absolute
;
z-index
:
1100
;
background
:
inherit
;
border-radius
:
6px
}
.popover
[
class
*=
tour-
]
{
z-index
:
1100
}
.popover
[
class
*=
tour-
]
.popover-navigation
{
padding
:
9px
14px
}
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
end
]
{
float
:
right
}
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
prev
],
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
next
],
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
end
]
{
cursor
:
pointer
}
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
prev
]
.disabled
,
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
next
]
.disabled
,
.popover
[
class
*=
tour-
]
.popover-navigation
[
data-role
=
end
]
.disabled
{
cursor
:
default
}
.popover
[
class
*=
tour-
]
.orphan
{
position
:
fixed
;
margin-top
:
0
}
.popover
[
class
*=
tour-
]
.orphan
.arrow
{
display
:
none
}
\ No newline at end of file
circle/dashboard/static/dashboard/bootstrap-tour.min.js
0 → 100644
View file @
317e11b7
/* ===========================================================
# bootstrap-tour - v0.9.1
# http://bootstraptour.com
# ==============================================================
# Copyright 2012-2013 Ulrich Sossou
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/
!
function
(
a
,
b
){
var
c
,
d
;
return
d
=
b
.
document
,
c
=
function
(){
function
c
(
c
){
this
.
_options
=
a
.
extend
({
name
:
"tour"
,
steps
:[],
container
:
"body"
,
keyboard
:
!
0
,
storage
:
b
.
localStorage
,
debug
:
!
1
,
backdrop
:
!
1
,
redirect
:
!
0
,
orphan
:
!
1
,
duration
:
!
1
,
basePath
:
""
,
template
:
"<div class='popover'> <div class='arrow'></div> <h3 class='popover-title'></h3> <div class='popover-content'></div> <div class='popover-navigation'> <div class='btn-group'> <button class='btn btn-sm btn-default' data-role='prev'>« Prev</button> <button class='btn btn-sm btn-default' data-role='next'>Next »</button> <button class='btn btn-sm btn-default' data-role='pause-resume' data-pause-text='Pause' data-resume-text='Resume'>Pause</button> </div> <button class='btn btn-sm btn-default' data-role='end'>End tour</button> </div> </div>"
,
afterSetState
:
function
(){},
afterGetState
:
function
(){},
afterRemoveState
:
function
(){},
onStart
:
function
(){},
onEnd
:
function
(){},
onShow
:
function
(){},
onShown
:
function
(){},
onHide
:
function
(){},
onHidden
:
function
(){},
onNext
:
function
(){},
onPrev
:
function
(){},
onPause
:
function
(){},
onResume
:
function
(){}},
c
),
this
.
_force
=!
1
,
this
.
_inited
=!
1
,
this
.
backdrop
=
{
overlay
:
null
,
$element
:
null
,
$background
:
null
,
backgroundShown
:
!
1
,
overlayElementShown
:
!
1
}}
return
c
.
prototype
.
addSteps
=
function
(
a
){
var
b
,
c
,
d
;
for
(
c
=
0
,
d
=
a
.
length
;
d
>
c
;
c
++
)
b
=
a
[
c
],
this
.
addStep
(
b
);
return
this
},
c
.
prototype
.
addStep
=
function
(
a
){
return
this
.
_options
.
steps
.
push
(
a
),
this
},
c
.
prototype
.
getStep
=
function
(
b
){
return
null
!=
this
.
_options
.
steps
[
b
]?
a
.
extend
({
id
:
"step-"
+
b
,
path
:
""
,
placement
:
"right"
,
title
:
""
,
content
:
"<p></p>"
,
next
:
b
===
this
.
_options
.
steps
.
length
-
1
?
-
1
:
b
+
1
,
prev
:
b
-
1
,
animation
:
!
0
,
container
:
this
.
_options
.
container
,
backdrop
:
this
.
_options
.
backdrop
,
redirect
:
this
.
_options
.
redirect
,
orphan
:
this
.
_options
.
orphan
,
duration
:
this
.
_options
.
duration
,
template
:
this
.
_options
.
template
,
onShow
:
this
.
_options
.
onShow
,
onShown
:
this
.
_options
.
onShown
,
onHide
:
this
.
_options
.
onHide
,
onHidden
:
this
.
_options
.
onHidden
,
onNext
:
this
.
_options
.
onNext
,
onPrev
:
this
.
_options
.
onPrev
,
onPause
:
this
.
_options
.
onPause
,
onResume
:
this
.
_options
.
onResume
},
this
.
_options
.
steps
[
b
]):
void
0
},
c
.
prototype
.
init
=
function
(
a
){
return
this
.
_force
=
a
,
this
.
ended
()?(
this
.
_debug
(
"Tour ended, init prevented."
),
this
):(
this
.
setCurrentStep
(),
this
.
_initMouseNavigation
(),
this
.
_initKeyboardNavigation
(),
this
.
_onResize
(
function
(
a
){
return
function
(){
return
a
.
showStep
(
a
.
_current
)}}(
this
)),
null
!==
this
.
_current
&&
this
.
showStep
(
this
.
_current
),
this
.
_inited
=!
0
,
this
)},
c
.
prototype
.
start
=
function
(
a
){
var
b
;
return
null
==
a
&&
(
a
=!
1
),
this
.
_inited
||
this
.
init
(
a
),
null
===
this
.
_current
&&
(
b
=
this
.
_makePromise
(
null
!=
this
.
_options
.
onStart
?
this
.
_options
.
onStart
(
this
):
void
0
),
this
.
_callOnPromiseDone
(
b
,
this
.
showStep
,
0
)),
this
},
c
.
prototype
.
next
=
function
(){
var
a
;
return
a
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
a
,
this
.
_showNextStep
)},
c
.
prototype
.
prev
=
function
(){
var
a
;
return
a
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
a
,
this
.
_showPrevStep
)},
c
.
prototype
.
goTo
=
function
(
a
){
var
b
;
return
b
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
b
,
this
.
showStep
,
a
)},
c
.
prototype
.
end
=
function
(){
var
c
,
e
;
return
c
=
function
(
c
){
return
function
(){
return
a
(
d
).
off
(
"click.tour-"
+
c
.
_options
.
name
),
a
(
d
).
off
(
"keyup.tour-"
+
c
.
_options
.
name
),
a
(
b
).
off
(
"resize.tour-"
+
c
.
_options
.
name
),
c
.
_setState
(
"end"
,
"yes"
),
c
.
_inited
=!
1
,
c
.
_force
=!
1
,
c
.
_clearTimer
(),
null
!=
c
.
_options
.
onEnd
?
c
.
_options
.
onEnd
(
c
):
void
0
}}(
this
),
e
=
this
.
hideStep
(
this
.
_current
),
this
.
_callOnPromiseDone
(
e
,
c
)},
c
.
prototype
.
ended
=
function
(){
return
!
this
.
_force
&&!!
this
.
_getState
(
"end"
)},
c
.
prototype
.
restart
=
function
(){
return
this
.
_removeState
(
"current_step"
),
this
.
_removeState
(
"end"
),
this
.
setCurrentStep
(
0
),
this
.
start
()},
c
.
prototype
.
pause
=
function
(){
var
a
;
return
a
=
this
.
getStep
(
this
.
_current
),
a
&&
a
.
duration
?(
this
.
_paused
=!
0
,
this
.
_duration
-=
(
new
Date
).
getTime
()
-
this
.
_start
,
b
.
clearTimeout
(
this
.
_timer
),
this
.
_debug
(
"Paused/Stopped step "
+
(
this
.
_current
+
1
)
+
" timer ("
+
this
.
_duration
+
" remaining)."
),
null
!=
a
.
onPause
?
a
.
onPause
(
this
,
this
.
_duration
):
void
0
):
this
},
c
.
prototype
.
resume
=
function
(){
var
a
;
return
a
=
this
.
getStep
(
this
.
_current
),
a
&&
a
.
duration
?(
this
.
_paused
=!
1
,
this
.
_start
=
(
new
Date
).
getTime
(),
this
.
_duration
=
this
.
_duration
||
a
.
duration
,
this
.
_timer
=
b
.
setTimeout
(
function
(
a
){
return
function
(){
return
a
.
_isLast
()?
a
.
next
():
a
.
end
()}}(
this
),
this
.
_duration
),
this
.
_debug
(
"Started step "
+
(
this
.
_current
+
1
)
+
" timer with duration "
+
this
.
_duration
),
null
!=
a
.
onResume
&&
this
.
_duration
!==
a
.
duration
?
a
.
onResume
(
this
,
this
.
_duration
):
void
0
):
this
},
c
.
prototype
.
hideStep
=
function
(
b
){
var
c
,
d
,
e
;
return
(
e
=
this
.
getStep
(
b
))?(
this
.
_clearTimer
(),
d
=
this
.
_makePromise
(
null
!=
e
.
onHide
?
e
.
onHide
(
this
,
b
):
void
0
),
c
=
function
(
c
){
return
function
(){
var
d
;
return
d
=
a
(
e
.
element
),
d
.
data
(
"bs.popover"
)
||
d
.
data
(
"popover"
)
||
(
d
=
a
(
"body"
)),
d
.
popover
(
"destroy"
).
removeClass
(
"tour-"
+
c
.
_options
.
name
+
"-element tour-"
+
c
.
_options
.
name
+
"-"
+
b
+
"-element"
),
e
.
reflex
&&
d
.
css
(
"cursor"
,
""
).
off
(
"click.tour-"
+
c
.
_options
.
name
),
e
.
backdrop
&&
c
.
_hideBackdrop
(),
null
!=
e
.
onHidden
?
e
.
onHidden
(
c
):
void
0
}}(
this
),
this
.
_callOnPromiseDone
(
d
,
c
),
d
):
void
0
},
c
.
prototype
.
showStep
=
function
(
a
){
var
b
,
c
,
e
,
f
;
return
this
.
ended
()?(
this
.
_debug
(
"Tour ended, showStep prevented."
),
this
):(
f
=
this
.
getStep
(
a
))?(
e
=
a
<
this
.
_current
,
b
=
this
.
_makePromise
(
null
!=
f
.
onShow
?
f
.
onShow
(
this
,
a
):
void
0
),
c
=
function
(
b
){
return
function
(){
var
c
,
g
;
if
(
b
.
setCurrentStep
(
a
),
g
=
function
(){
switch
({}.
toString
.
call
(
f
.
path
)){
case
"[object Function]"
:
return
f
.
path
();
case
"[object String]"
:
return
this
.
_options
.
basePath
+
f
.
path
;
default
:
return
f
.
path
}}.
call
(
b
),
c
=
[
d
.
location
.
pathname
,
d
.
location
.
hash
].
join
(
""
),
b
.
_isRedirect
(
g
,
c
))
return
void
b
.
_redirect
(
f
,
g
);
if
(
b
.
_isOrphan
(
f
)){
if
(
!
f
.
orphan
)
return
b
.
_debug
(
"Skip the orphan step "
+
(
b
.
_current
+
1
)
+
". Orphan option is false and the element doesn't exist or is hidden."
),
void
(
e
?
b
.
_showPrevStep
():
b
.
_showNextStep
());
b
.
_debug
(
"Show the orphan step "
+
(
b
.
_current
+
1
)
+
". Orphans option is true."
)}
return
f
.
backdrop
&&
b
.
_showBackdrop
(
b
.
_isOrphan
(
f
)?
void
0
:
f
.
element
),
b
.
_scrollIntoView
(
f
.
element
,
function
(){
return
null
!=
f
.
element
&&
f
.
backdrop
&&
b
.
_showOverlayElement
(
f
.
element
),
b
.
_showPopover
(
f
,
a
),
null
!=
f
.
onShown
&&
f
.
onShown
(
b
),
b
.
_debug
(
"Step "
+
(
b
.
_current
+
1
)
+
" of "
+
b
.
_options
.
steps
.
length
)}),
f
.
duration
?
b
.
resume
():
void
0
}}(
this
),
this
.
_callOnPromiseDone
(
b
,
c
),
b
):
void
0
},
c
.
prototype
.
getCurrentStep
=
function
(){
return
this
.
_current
},
c
.
prototype
.
setCurrentStep
=
function
(
a
){
return
null
!=
a
?(
this
.
_current
=
a
,
this
.
_setState
(
"current_step"
,
a
)):(
this
.
_current
=
this
.
_getState
(
"current_step"
),
this
.
_current
=
null
===
this
.
_current
?
null
:
parseInt
(
this
.
_current
,
10
)),
this
},
c
.
prototype
.
_setState
=
function
(
a
,
b
){
var
c
,
d
;
if
(
this
.
_options
.
storage
){
d
=
""
+
this
.
_options
.
name
+
"_"
+
a
;
try
{
this
.
_options
.
storage
.
setItem
(
d
,
b
)}
catch
(
e
){
c
=
e
,
c
.
code
===
DOMException
.
QUOTA_EXCEEDED_ERR
&&
this
.
debug
(
"LocalStorage quota exceeded. State storage failed."
)}
return
this
.
_options
.
afterSetState
(
d
,
b
)}
return
null
==
this
.
_state
&&
(
this
.
_state
=
{}),
this
.
_state
[
a
]
=
b
},
c
.
prototype
.
_removeState
=
function
(
a
){
var
b
;
return
this
.
_options
.
storage
?(
b
=
""
+
this
.
_options
.
name
+
"_"
+
a
,
this
.
_options
.
storage
.
removeItem
(
b
),
this
.
_options
.
afterRemoveState
(
b
)):
null
!=
this
.
_state
?
delete
this
.
_state
[
a
]:
void
0
},
c
.
prototype
.
_getState
=
function
(
a
){
var
b
,
c
;
return
this
.
_options
.
storage
?(
b
=
""
+
this
.
_options
.
name
+
"_"
+
a
,
c
=
this
.
_options
.
storage
.
getItem
(
b
)):
null
!=
this
.
_state
&&
(
c
=
this
.
_state
[
a
]),(
void
0
===
c
||
"null"
===
c
)
&&
(
c
=
null
),
this
.
_options
.
afterGetState
(
a
,
c
),
c
},
c
.
prototype
.
_showNextStep
=
function
(){
var
a
,
b
,
c
;
return
c
=
this
.
getStep
(
this
.
_current
),
b
=
function
(
a
){
return
function
(){
return
a
.
showStep
(
c
.
next
)}}(
this
),
a
=
this
.
_makePromise
(
null
!=
c
.
onNext
?
c
.
onNext
(
this
):
void
0
),
this
.
_callOnPromiseDone
(
a
,
b
)},
c
.
prototype
.
_showPrevStep
=
function
(){
var
a
,
b
,
c
;
return
c
=
this
.
getStep
(
this
.
_current
),
b
=
function
(
a
){
return
function
(){
return
a
.
showStep
(
c
.
prev
)}}(
this
),
a
=
this
.
_makePromise
(
null
!=
c
.
onPrev
?
c
.
onPrev
(
this
):
void
0
),
this
.
_callOnPromiseDone
(
a
,
b
)},
c
.
prototype
.
_debug
=
function
(
a
){
return
this
.
_options
.
debug
?
b
.
console
.
log
(
"Bootstrap Tour '"
+
this
.
_options
.
name
+
"' | "
+
a
):
void
0
},
c
.
prototype
.
_isRedirect
=
function
(
a
,
b
){
return
null
!=
a
&&
""
!==
a
&&
(
"[object RegExp]"
===
toString
.
call
(
a
)
&&!
a
.
test
(
b
)
||
"[object String]"
===
toString
.
call
(
a
)
&&
a
.
replace
(
/
\?
.*$/
,
""
).
replace
(
/
\/?
$/
,
""
)
!==
b
.
replace
(
/
\/?
$/
,
""
))},
c
.
prototype
.
_redirect
=
function
(
b
,
c
){
return
a
.
isFunction
(
b
.
redirect
)?
b
.
redirect
.
call
(
this
,
c
):
b
.
redirect
===!
0
?(
this
.
_debug
(
"Redirect to "
+
c
),
d
.
location
.
href
=
c
):
void
0
},
c
.
prototype
.
_isOrphan
=
function
(
b
){
return
null
==
b
.
element
||!
a
(
b
.
element
).
length
||
a
(
b
.
element
).
is
(
":hidden"
)
&&
"http://www.w3.org/2000/svg"
!==
a
(
b
.
element
)[
0
].
namespaceURI
},
c
.
prototype
.
_isLast
=
function
(){
return
this
.
_current
<
this
.
_options
.
steps
.
length
-
1
},
c
.
prototype
.
_showPopover
=
function
(
b
,
c
){
var
d
,
e
,
f
,
g
,
h
,
i
;
return
i
=
a
.
extend
({},
this
.
_options
),
f
=
a
(
a
.
isFunction
(
b
.
template
)?
b
.
template
(
c
,
b
):
b
.
template
),
e
=
f
.
find
(
".popover-navigation"
),
h
=
this
.
_isOrphan
(
b
),
h
&&
(
b
.
element
=
"body"
,
b
.
placement
=
"top"
,
f
=
f
.
addClass
(
"orphan"
)),
d
=
a
(
b
.
element
),
f
.
addClass
(
"tour-"
+
this
.
_options
.
name
+
" tour-"
+
this
.
_options
.
name
+
"-"
+
c
),
d
.
addClass
(
"tour-"
+
this
.
_options
.
name
+
"-element tour-"
+
this
.
_options
.
name
+
"-"
+
c
+
"-element"
),
b
.
options
&&
a
.
extend
(
i
,
b
.
options
),
b
.
reflex
&&
d
.
css
(
"cursor"
,
"pointer"
).
on
(
"click.tour-"
+
this
.
_options
.
name
,
function
(
a
){
return
function
(){
return
a
.
_isLast
()?
a
.
next
():
a
.
end
()}}(
this
)),
b
.
prev
<
0
&&
e
.
find
(
"[data-role='prev']"
).
addClass
(
"disabled"
),
b
.
next
<
0
&&
e
.
find
(
"[data-role='next']"
).
addClass
(
"disabled"
),
b
.
duration
||
e
.
find
(
"[data-role='pause-resume']"
).
remove
(),
b
.
template
=
f
.
clone
().
wrap
(
"<div>"
).
parent
().
html
(),
d
.
popover
({
placement
:
b
.
placement
,
trigger
:
"manual"
,
title
:
b
.
title
,
content
:
b
.
content
,
html
:
!
0
,
animation
:
b
.
animation
,
container
:
b
.
container
,
template
:
b
.
template
,
selector
:
b
.
element
}).
popover
(
"show"
),
g
=
d
.
data
(
"bs.popover"
)?
d
.
data
(
"bs.popover"
).
tip
():
d
.
data
(
"popover"
).
tip
(),
g
.
attr
(
"id"
,
b
.
id
),
this
.
_reposition
(
g
,
b
),
h
?
this
.
_center
(
g
):
void
0
},
c
.
prototype
.
_reposition
=
function
(
b
,
c
){
var
e
,
f
,
g
,
h
,
i
,
j
,
k
;
if
(
h
=
b
[
0
].
offsetWidth
,
f
=
b
[
0
].
offsetHeight
,
k
=
b
.
offset
(),
i
=
k
.
left
,
j
=
k
.
top
,
e
=
a
(
d
).
outerHeight
()
-
k
.
top
-
b
.
outerHeight
(),
0
>
e
&&
(
k
.
top
=
k
.
top
+
e
),
g
=
a
(
"html"
).
outerWidth
()
-
k
.
left
-
b
.
outerWidth
(),
0
>
g
&&
(
k
.
left
=
k
.
left
+
g
),
k
.
top
<
0
&&
(
k
.
top
=
0
),
k
.
left
<
0
&&
(
k
.
left
=
0
),
b
.
offset
(
k
),
"bottom"
===
c
.
placement
||
"top"
===
c
.
placement
){
if
(
i
!==
k
.
left
)
return
this
.
_replaceArrow
(
b
,
2
*
(
k
.
left
-
i
),
h
,
"left"
)}
else
if
(
j
!==
k
.
top
)
return
this
.
_replaceArrow
(
b
,
2
*
(
k
.
top
-
j
),
f
,
"top"
)},
c
.
prototype
.
_center
=
function
(
c
){
return
c
.
css
(
"top"
,
a
(
b
).
outerHeight
()
/
2
-
c
.
outerHeight
()
/
2
)},
c
.
prototype
.
_replaceArrow
=
function
(
a
,
b
,
c
,
d
){
return
a
.
find
(
".arrow"
).
css
(
d
,
b
?
50
*
(
1
-
b
/
c
)
+
"%"
:
""
)},
c
.
prototype
.
_scrollIntoView
=
function
(
c
,
d
){
var
e
,
f
,
g
,
h
,
i
,
j
;
return
e
=
a
(
c
),
e
.
length
?(
f
=
a
(
b
),
h
=
e
.
offset
().
top
,
j
=
f
.
height
(),
i
=
Math
.
max
(
0
,
h
-
j
/
2
),
this
.
_debug
(
"Scroll into view. ScrollTop: "
+
i
+
". Element offset: "
+
h
+
". Window height: "
+
j
+
"."
),
g
=
0
,
a
(
"body,html"
).
stop
(
!
0
,
!
0
).
animate
({
scrollTop
:
Math
.
ceil
(
i
)},
function
(
a
){
return
function
(){
return
2
===++
g
?(
d
(),
a
.
_debug
(
"Scroll into view. Animation end element offset: "
+
e
.
offset
().
top
+
". Window height: "
+
f
.
height
()
+
"."
)):
void
0
}}(
this
))):
d
()},
c
.
prototype
.
_onResize
=
function
(
c
,
d
){
return
a
(
b
).
on
(
"resize.tour-"
+
this
.
_options
.
name
,
function
(){
return
clearTimeout
(
d
),
d
=
setTimeout
(
c
,
100
)})},
c
.
prototype
.
_initMouseNavigation
=
function
(){
var
b
;
return
b
=
this
,
a
(
d
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='prev']:not(.disabled)"
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='next']:not(.disabled)"
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='end']"
).
off
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='pause-resume']"
).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='next']:not(.disabled)"
,
function
(
a
){
return
function
(
b
){
return
b
.
preventDefault
(),
a
.
next
()}}(
this
)).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='prev']:not(.disabled)"
,
function
(
a
){
return
function
(
b
){
return
b
.
preventDefault
(),
a
.
prev
()}}(
this
)).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='end']"
,
function
(
a
){
return
function
(
b
){
return
b
.
preventDefault
(),
a
.
end
()}}(
this
)).
on
(
"click.tour-"
+
this
.
_options
.
name
,
".popover.tour-"
+
this
.
_options
.
name
+
" *[data-role='pause-resume']"
,
function
(
c
){
var
d
;
return
c
.
preventDefault
(),
d
=
a
(
this
),
d
.
text
(
d
.
data
(
b
.
_paused
?
"pause-text"
:
"resume-text"
)),
b
.
_paused
?
b
.
resume
():
b
.
pause
()})},
c
.
prototype
.
_initKeyboardNavigation
=
function
(){
return
this
.
_options
.
keyboard
?
a
(
d
).
on
(
"keyup.tour-"
+
this
.
_options
.
name
,
function
(
a
){
return
function
(
b
){
if
(
b
.
which
)
switch
(
b
.
which
){
case
39
:
return
b
.
preventDefault
(),
a
.
_isLast
()?
a
.
next
():
a
.
end
();
case
37
:
if
(
b
.
preventDefault
(),
a
.
_current
>
0
)
return
a
.
prev
();
break
;
case
27
:
return
b
.
preventDefault
(),
a
.
end
()}}}(
this
)):
void
0
},
c
.
prototype
.
_makePromise
=
function
(
b
){
return
b
&&
a
.
isFunction
(
b
.
then
)?
b
:
null
},
c
.
prototype
.
_callOnPromiseDone
=
function
(
a
,
b
,
c
){
return
a
?
a
.
then
(
function
(
a
){
return
function
(){
return
b
.
call
(
a
,
c
)}}(
this
)):
b
.
call
(
this
,
c
)},
c
.
prototype
.
_showBackdrop
=
function
(){
return
this
.
backdrop
.
backgroundShown
?
void
0
:(
this
.
backdrop
=
a
(
"<div/>"
,{
"class"
:
"tour-backdrop"
}),
this
.
backdrop
.
backgroundShown
=!
0
,
a
(
"body"
).
append
(
this
.
backdrop
))},
c
.
prototype
.
_hideBackdrop
=
function
(){
return
this
.
_hideOverlayElement
(),
this
.
_hideBackground
()},
c
.
prototype
.
_hideBackground
=
function
(){
return
this
.
backdrop
.
remove
(),
this
.
backdrop
.
overlay
=
null
,
this
.
backdrop
.
backgroundShown
=!
1
},
c
.
prototype
.
_showOverlayElement
=
function
(
b
){
var
c
,
d
,
e
;
return
d
=
a
(
b
),
d
&&
0
!==
d
.
length
&&!
this
.
backdrop
.
overlayElementShown
?(
this
.
backdrop
.
overlayElementShown
=!
0
,
c
=
a
(
"<div/>"
),
e
=
d
.
offset
(),
e
.
top
=
e
.
top
,
e
.
left
=
e
.
left
,
c
.
width
(
d
.
innerWidth
()).
height
(
d
.
innerHeight
()).
addClass
(
"tour-step-background"
).
offset
(
e
),
d
.
addClass
(
"tour-step-backdrop"
),
a
(
"body"
).
append
(
c
),
this
.
backdrop
.
$element
=
d
,
this
.
backdrop
.
$background
=
c
):
void
0
},
c
.
prototype
.
_hideOverlayElement
=
function
(){
return
this
.
backdrop
.
overlayElementShown
?(
this
.
backdrop
.
$element
.
removeClass
(
"tour-step-backdrop"
),
this
.
backdrop
.
$background
.
remove
(),
this
.
backdrop
.
$element
=
null
,
this
.
backdrop
.
$background
=
null
,
this
.
backdrop
.
overlayElementShown
=!
1
):
void
0
},
c
.
prototype
.
_clearTimer
=
function
(){
return
b
.
clearTimeout
(
this
.
_timer
),
this
.
_timer
=
null
,
this
.
_duration
=
null
},
c
}(),
b
.
Tour
=
c
}(
jQuery
,
window
);
\ No newline at end of file
circle/dashboard/static/dashboard/vm-tour.js
0 → 100644
View file @
317e11b7
/* TODO i18n
* https://docs.djangoproject.com/en/1.5/topics/i18n/translation/#internationalization-in-javascript-code
* TODO new tour template
* http://bootstraptour.com/api/
* TODO change placeholder yos
*/
$
(
function
()
{
$
(
".vm-details-start-template-tour"
).
click
(
function
()
{
ttour
=
createTemplateTour
();
ttour
.
init
();
ttour
.
start
();
});
});
function
createTemplateTour
()
{
var
ttour
=
new
Tour
({
storage
:
false
,
});
ttour
.
addStep
({
element
:
".alert-new-template"
,
title
:
"Template Tutorial Tour"
,
content
:
"Welcome to the template tutorial. In this quick tour, we gonna show you how to do the steps described above. "
+
"For the next tour step press the Next button or the right arrow (or Back button/left arrow for the previous step). "
+
"During the tour please don't try the functions because it may lead to graphical glitches, however "
+
"you can end the tour any time you want with the End Tour button!"
,
placement
:
"bottom"
,
backdrop
:
true
,
});
ttour
.
addStep
({
backdrop
:
true
,
element
:
'a[href="#home"]'
,
title
:
"Home tab"
,
content
:
"yo"
,
placement
:
'top'
,
onShow
:
function
()
{
console
.
log
(
"yosag van"
);
$
(
'a[href="#home"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'a[href="#resources"]'
,
title
:
"Resources tab"
,
backdrop
:
true
,
placement
:
'top'
,
content
:
"On the resources tab you can edit the CPU/RAM options and add/remove disks!"
,
onShow
:
function
()
{
$
(
'a[href="#resources"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'#vm-details-resources-form'
,
placement
:
'left'
,
backdrop
:
true
,
title
:
"Resources"
,
content
:
'<p><strong>CPU priority:</strong> higher (or lower?) is better</p>'
+
'<p><strong>CPU count:</strong> yooo</p>'
+
'<p><strong>RAM amount:</strong> yoo RAM</p>'
,
onShow
:
function
()
{
$
(
'a[href="#resources"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'.vm-details-resources-disk'
,
backdrop
:
true
,
placement
:
'left'
,
title
:
"Disks"
,
content
:
"jo a kontent, bar lehetne hosszabb is es akkor nem nez ki ilyen butan az end tour gomb!"
,
onShow
:
function
()
{
$
(
'a[href="#resources"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
'a[href="#network"]'
,
backdrop
:
true
,
placement
:
'top'
,
title
:
"Network tab"
,
content
:
'You can add new network interfaces or remove existing ones here.'
,
onShow
:
function
()
{
$
(
'a[href="#network"]'
).
trigger
(
"click"
);
},
});
ttour
.
addStep
({
element
:
"#vm-details-button-deploy"
,
title
:
"Deploy"
,
backdrop
:
true
,
content
:
"Deploy the virtual machine"
,
});
ttour
.
addStep
({
element
:
"#vm-info-pane"
,
title
:
"Connect"
,
backdrop
:
true
,
content
:
"Use the connection string or connect with your choice of client!"
,
});
ttour
.
addStep
({
element
:
".alert-new-template"
,
placement
:
"bottom"
,
title
:
"Customize the virtual machine"
,
content
:
"Do the modifications"
,
});
ttour
.
addStep
({
element
:
".vm-details-button-save-as"
,
title
:
"Save"
,
placement
:
"left"
,
backdrop
:
true
,
content
:
"Press this button and wait!"
,
});
ttour
.
addStep
({
element
:
".alert-new-template"
,
title
:
"Fin"
,
backdrop
:
true
,
placement
:
"bottom"
,
content
:
"Congrats you managed to sit trough this exciting tour!"
,
});
return
ttour
;
}
circle/dashboard/templates/base.html
View file @
317e11b7
...
...
@@ -17,6 +17,7 @@
<script
src=
"{{ STATIC_URL }}dashboard/js/jquery.knob.js"
></script>
<script
src=
"{{ STATIC_URL}}dashboard/bootstrap-slider/bootstrap-slider.js"
></script>
<link
rel=
"stylesheet"
href=
"{{ STATIC_URL }}dashboard/bootstrap-slider/slider.css"
/>
<link
href=
"{{ STATIC_URL }}dashboard/bootstrap-tour.min.css"
rel=
"stylesheet"
>
<link
href=
"{{ STATIC_URL }}dashboard/dashboard.css"
rel=
"stylesheet"
>
<script
src=
"{{ STATIC_URL }}dashboard/dashboard.js"
></script>
</head>
...
...
circle/dashboard/templates/dashboard/_template-create-1.html
View file @
317e11b7
...
...
@@ -4,7 +4,8 @@
{% trans "Customize an existing template or create a brand new one from scratch!" %}
</div>
<form
action=
"{% url "
dashboard
.
views
.
template-create
"
%}"
>
<form
action=
"{% url "
dashboard
.
views
.
template-choose
"
%}"
method=
"POST"
>
{% csrf_token %}
<div
class=
"template-choose-list"
>
{% for t in templates %}
<div
class=
"panel panel-default template-choose-list-element"
>
...
...
circle/dashboard/templates/dashboard/vm-detail.html
View file @
317e11b7
...
...
@@ -4,6 +4,51 @@
{% block title-page %}{{ instance.name }} | vm{% endblock %}
{% block content %}
<style>
.alert-new-template
{
background
:
#3071a9
;
color
:
white
;
font-size
:
25px
;
}
.alert-new-template
ol
{
margin-left
:
25px
;
}
</style>
{% if instance.is_base %}
<div
class=
"alert alert-info alert-new-template"
>
<strong>
{% trans "This is the master vm of your new template" %}
</strong>
<a
href=
"#"
class=
"btn btn-default btn-lg pull-right vm-details-start-template-tour"
>
<i
class=
"icon-play"
></i>
{% trans "Start template tutorial tour" %}
</a>
<ol>
<li>
Modify the vm to suit your needs
<strong>
(optional)
</strong>
<ul>
<li>
Change the description
</li>
<li>
Change the resources it will need (CPU and RAM)
</li>
<li>
Attach or deattach disks
</li>
<li>
Add or remove network interfaces
</li>
</ul>
</li>
<li>
Deploy the vm
</li>
<li>
Connect to the machine
</li>
<li>
Do all the needed installation/customization
</li>
<li>
Log off
</li>
<li>
Press the "Save as template" button
<form
style=
"display: inline;"
class=
"vm-details-button-save-as pull-right"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
{% csrf_token %}
<input
type=
"hidden"
name=
"save_as"
/>
<button
class=
"btn btn-default btn-lg"
type=
"submit"
>
<i
class=
"icon-save"
></i>
{% trans "Save as template" %}
</button>
</form>
</li>
</ol>
</div>
{% endif %}
<div
class=
"body-content"
>
<div
class=
"page-header"
>
<div
class=
"pull-right"
style=
"padding-top: 15px;"
>
...
...
@@ -12,7 +57,7 @@
<input
type=
"hidden"
name=
"sleep"
/>
<button
title=
"{% trans "
Sleep
"
%}"
class=
"btn btn-default btn-xs"
type=
"submit"
><i
class=
"icon-moon"
></i></button>
</form>
<form
style=
"display: inline;"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
<form
style=
"display: inline;"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
id=
"vm-details-button-deploy"
>
{% csrf_token %}
<input
type=
"hidden"
name=
"deploy"
/>
<button
title=
"{% trans "
Deploy
"
%}"
class=
"btn btn-default btn-xs"
type=
"submit"
><i
class=
"icon-play"
></i></button>
...
...
@@ -47,7 +92,7 @@
<a
title=
"Migrate"
data-vm-pk=
"{{ instance.pk }}"
href=
"{% url "
dashboard
.
views
.
vm-migrate
"
pk=
instance.pk
%}"
class=
"btn btn-default btn-xs vm-migrate"
>
<i
class=
"icon-truck"
></i>
</a>
<form
style=
"display: inline;"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
<form
style=
"display: inline;"
class=
"vm-details-button-save-as"
method=
"POST"
action=
"{% url "
dashboard
.
views
.
detail
"
pk=
instance.pk
%}"
>
{% csrf_token %}
<input
type=
"hidden"
name=
"save_as"
/>
<button
title=
"{% trans "
Save
as
template
"
%}"
class=
"btn btn-default btn-xs"
type=
"submit"
><i
class=
"icon-save"
></i></button>
...
...
@@ -194,8 +239,10 @@
{% endblock %}
{% block extra_js %}
<script
src=
"{{ STATIC_URL }}dashboard/bootstrap-tour.min.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-details.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-common.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-console.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/disk-list.js"
></script>
<script
src=
"{{ STATIC_URL }}dashboard/vm-tour.js"
></script>
{% endblock %}
circle/dashboard/templates/dashboard/vm-detail/resources.html
View file @
317e11b7
...
...
@@ -42,7 +42,7 @@
<hr
/>
<div
class=
"row"
>
<div
class=
"row
vm-details-resources-disk
"
>
<div
class=
"col-sm-11"
>
<h3>
{% trans "Disks" %}
...
...
circle/dashboard/views.py
View file @
317e11b7
...
...
@@ -757,10 +757,25 @@ class TemplateChoose(TemplateView):
'box_title'
:
_
(
'Choose template'
),
'ajax_title'
:
False
,
'template'
:
"dashboard/_template-create-1.html"
,
'templates'
:
templates
.
all
(),
'templates'
:
templates
.
all
(),
# TODO acl?
})
return
context
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
if
not
request
.
user
.
has_perm
(
'vm.create_template'
):
raise
PermissionDenied
()
template
=
request
.
POST
.
get
(
"parent"
)
if
template
==
"base_vm"
:
return
redirect
(
reverse
(
"dashboard.views.template-create"
))
else
:
template
=
get_object_or_404
(
InstanceTemplate
,
pk
=
template
)
instance
=
Instance
.
create_from_template
(
template
=
template
,
owner
=
request
.
user
,
is_base
=
True
)
return
redirect
(
instance
.
get_absolute_url
())
class
TemplateClone
(
CreateView
):
template_name
=
"dashboard/template-clone.html"
...
...
circle/vm/migrations/0022_auto__add_field_instance_is_base.py
0 → 100644
View file @
317e11b7
# -*- coding: utf-8 -*-
import
datetime
from
south.db
import
db
from
south.v2
import
SchemaMigration
from
django.db
import
models
class
Migration
(
SchemaMigration
):
def
forwards
(
self
,
orm
):
# Adding field 'Instance.is_base'
db
.
add_column
(
u'vm_instance'
,
'is_base'
,
self
.
gf
(
'django.db.models.fields.BooleanField'
)(
default
=
False
),
keep_default
=
False
)
def
backwards
(
self
,
orm
):
# Deleting field 'Instance.is_base'
db
.
delete_column
(
u'vm_instance'
,
'is_base'
)
models
=
{
u'acl.level'
:
{
'Meta'
:
{
'unique_together'
:
"(('content_type', 'codename'),)"
,
'object_name'
:
'Level'
},
'codename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['contenttypes.ContentType']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
}),
'weight'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'null'
:
'True'
})
},
u'acl.objectlevel'
:
{
'Meta'
:
{
'unique_together'
:
"(('content_type', 'object_id', 'level'),)"
,
'object_name'
:
'ObjectLevel'
},
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['contenttypes.ContentType']"
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Group']"
,
'symmetrical'
:
'False'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'level'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['acl.Level']"
}),
'object_id'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'users'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'symmetrical'
:
'False'
})
},
u'auth.group'
:
{
'Meta'
:
{
'object_name'
:
'Group'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'80'
}),
'permissions'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Permission']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
})
},
u'auth.permission'
:
{
'Meta'
:
{
'ordering'
:
"(u'content_type__app_label', u'content_type__model', u'codename')"
,
'unique_together'
:
"((u'content_type', u'codename'),)"
,
'object_name'
:
'Permission'
},
'codename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['contenttypes.ContentType']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
})
},
u'auth.user'
:
{
'Meta'
:
{
'object_name'
:
'User'
},
'date_joined'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'email'
:
(
'django.db.models.fields.EmailField'
,
[],
{
'max_length'
:
'75'
,
'blank'
:
'True'
}),
'first_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'30'
,
'blank'
:
'True'
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Group']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'is_active'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'is_staff'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'is_superuser'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'last_login'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'last_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'30'
,
'blank'
:
'True'
}),
'password'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'128'
}),
'user_permissions'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['auth.Permission']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'30'
})
},
u'contenttypes.contenttype'
:
{
'Meta'
:
{
'ordering'
:
"('name',)"
,
'unique_together'
:
"(('app_label', 'model'),)"
,
'object_name'
:
'ContentType'
,
'db_table'
:
"'django_content_type'"
},
'app_label'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'model'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
})
},
u'firewall.domain'
:
{
'Meta'
:
{
'object_name'
:
'Domain'
},
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'40'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'ttl'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'default'
:
'600'
})
},
u'firewall.group'
:
{
'Meta'
:
{
'object_name'
:
'Group'
},
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'20'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'firewall.host'
:
{
'Meta'
:
{
'ordering'
:
"('normalized_hostname', 'vlan')"
,
'unique_together'
:
"(('hostname', 'vlan'),)"
,
'object_name'
:
'Host'
},
'comment'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'symmetrical'
:
'False'
,
'to'
:
u"orm['firewall.Group']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'hostname'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'40'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'ipv4'
:
(
'firewall.fields.IPAddressField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'ipv6'
:
(
'firewall.fields.IPAddressField'
,
[],
{
'max_length'
:
'100'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'location'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'mac'
:
(
'firewall.fields.MACAddressField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'17'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'normalized_hostname'
:
(
'common.models.HumanSortField'
,
[],
{
'default'
:
"''"
,
'maximum_number_length'
:
'4'
,
'max_length'
:
'80'
,
'monitor'
:
"'hostname'"
,
'blank'
:
'True'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'pub_ipv4'
:
(
'firewall.fields.IPAddressField'
,
[],
{
'max_length'
:
'100'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'reverse'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'40'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'shared_ip'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'vlan'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Vlan']"
})
},
u'firewall.vlan'
:
{
'Meta'
:
{
'object_name'
:
'Vlan'
},
'comment'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'created_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'dhcp_pool'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'domain'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Domain']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'ipv6_template'
:
(
'django.db.models.fields.TextField'
,
[],
{
'default'
:
"'2001:738:2001:4031:
%(b)
d:
%(c)
d:
%(d)
d:0'"
}),
'managed'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'modified_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'20'
}),
'network4'
:
(
'firewall.fields.IPNetworkField'
,
[],
{
'max_length'
:
'100'
}),
'network6'
:
(
'firewall.fields.IPNetworkField'
,
[],
{
'max_length'
:
'100'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'network_type'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'20'
}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'reverse_domain'
:
(
'django.db.models.fields.TextField'
,
[],
{
'default'
:
"'
%(d)
d.
%(c)
d.
%(b)
d.
%(a)
d.in-addr.arpa'"
}),
'snat_ip'
:
(
'django.db.models.fields.GenericIPAddressField'
,
[],
{
'max_length'
:
'39'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'snat_to'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'symmetrical'
:
'False'
,
'to'
:
u"orm['firewall.Vlan']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'vid'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'unique'
:
'True'
})
},
u'storage.datastore'
:
{
'Meta'
:
{
'ordering'
:
"[u'name']"
,
'object_name'
:
'DataStore'
},
'hostname'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'40'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'path'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'200'
})
},
u'storage.disk'
:
{
'Meta'
:
{
'ordering'
:
"[u'name']"
,
'object_name'
:
'Disk'
},
'base'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'derivatives'"
,
'null'
:
'True'
,
'to'
:
u"orm['storage.Disk']"
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'datastore'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['storage.DataStore']"
}),
'destroyed'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'dev_num'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"u'a'"
,
'max_length'
:
'1'
}),
'filename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'256'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
,
'blank'
:
'True'
}),
'size'
:
(
'sizefield.models.FileSizeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
}),
'type'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
})
},
u'taggit.tag'
:
{
'Meta'
:
{
'object_name'
:
'Tag'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'slug'
:
(
'django.db.models.fields.SlugField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
})
},
u'taggit.taggeditem'
:
{
'Meta'
:
{
'object_name'
:
'TaggedItem'
},
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'taggit_taggeditem_tagged_items'"
,
'to'
:
u"orm['contenttypes.ContentType']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'object_id'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'db_index'
:
'True'
}),
'tag'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'taggit_taggeditem_items'"
,
'to'
:
u"orm['taggit.Tag']"
})
},
u'vm.instance'
:
{
'Meta'
:
{
'ordering'
:
"(u'pk',)"
,
'object_name'
:
'Instance'
},
'access_method'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'active_since'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'arch'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'boot_menu'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'destroyed_at'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'disks'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'related_name'
:
"u'instance_set'"
,
'symmetrical'
:
'False'
,
'to'
:
u"orm['storage.Disk']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'is_base'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'lease'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['vm.Lease']"
}),
'max_ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
,
'blank'
:
'True'
}),
'node'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'instance_set'"
,
'null'
:
'True'
,
'to'
:
u"orm['vm.Node']"
}),
'num_cores'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'pw'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'20'
}),
'ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'raw_data'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'req_traits'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['vm.Trait']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'status'
:
(
'model_utils.fields.StatusField'
,
[],
{
'default'
:
"u'NOSTATE'"
,
'max_length'
:
'100'
,
u'no_check_for_status'
:
'True'
}),
'status_changed'
:
(
'model_utils.fields.MonitorField'
,
[],
{
'default'
:
'datetime.datetime.now'
,
u'monitor'
:
"u'status'"
}),
'system'
:
(
'django.db.models.fields.TextField'
,
[],
{}),
'template'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'instance_set'"
,
'null'
:
'True'
,
'on_delete'
:
'models.SET_NULL'
,
'to'
:
u"orm['vm.InstanceTemplate']"
}),
'time_of_delete'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'time_of_suspend'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'None'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'vnc_port'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'default'
:
'None'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.instanceactivity'
:
{
'Meta'
:
{
'ordering'
:
"[u'-finished', u'-started', u'instance', u'-id']"
,
'object_name'
:
'InstanceActivity'
},
'activity_code'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'finished'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'instance'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'activity_log'"
,
'to'
:
u"orm['vm.Instance']"
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'parent'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"'children'"
,
'null'
:
'True'
,
'to'
:
u"orm['vm.InstanceActivity']"
}),
'result'
:
(
'django.db.models.fields.TextField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'resultant_state'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'20'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'started'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'succeeded'
:
(
'django.db.models.fields.NullBooleanField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'task_uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.instancetemplate'
:
{
'Meta'
:
{
'ordering'
:
"(u'name',)"
,
'object_name'
:
'InstanceTemplate'
},
'access_method'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'arch'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'boot_menu'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'description'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'disks'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'related_name'
:
"u'template_set'"
,
'symmetrical'
:
'False'
,
'to'
:
u"orm['storage.Disk']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'lease'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['vm.Lease']"
}),
'max_ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'num_cores'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'owner'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
}),
'parent'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['vm.InstanceTemplate']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'raw_data'
:
(
'django.db.models.fields.TextField'
,
[],
{
'blank'
:
'True'
}),
'req_traits'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['vm.Trait']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'system'
:
(
'django.db.models.fields.TextField'
,
[],
{})
},
u'vm.interface'
:
{
'Meta'
:
{
'object_name'
:
'Interface'
},
'host'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Host']"
,
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'instance'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'interface_set'"
,
'to'
:
u"orm['vm.Instance']"
}),
'vlan'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'vm_interface'"
,
'to'
:
u"orm['firewall.Vlan']"
})
},
u'vm.interfacetemplate'
:
{
'Meta'
:
{
'object_name'
:
'InterfaceTemplate'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'managed'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'template'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'interface_set'"
,
'to'
:
u"orm['vm.InstanceTemplate']"
}),
'vlan'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Vlan']"
})
},
u'vm.lease'
:
{
'Meta'
:
{
'ordering'
:
"[u'name']"
,
'object_name'
:
'Lease'
},
'delete_interval_seconds'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'100'
}),
'suspend_interval_seconds'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.namedbaseresourceconfig'
:
{
'Meta'
:
{
'object_name'
:
'NamedBaseResourceConfig'
},
'arch'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'10'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'max_ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'50'
}),
'num_cores'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'ram_size'
:
(
'django.db.models.fields.IntegerField'
,
[],
{})
},
u'vm.node'
:
{
'Meta'
:
{
'ordering'
:
"(u'-enabled', u'normalized_name')"
,
'object_name'
:
'Node'
},
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'enabled'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'host'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['firewall.Host']"
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'50'
}),
'normalized_name'
:
(
'common.models.HumanSortField'
,
[],
{
'default'
:
"''"
,
'maximum_number_length'
:
'4'
,
'max_length'
:
'100'
,
'monitor'
:
"u'name'"
,
'blank'
:
'True'
}),
'overcommit'
:
(
'django.db.models.fields.FloatField'
,
[],
{
'default'
:
'1.0'
}),
'priority'
:
(
'django.db.models.fields.IntegerField'
,
[],
{}),
'traits'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
u"orm['vm.Trait']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
})
},
u'vm.nodeactivity'
:
{
'Meta'
:
{
'object_name'
:
'NodeActivity'
},
'activity_code'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'finished'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'node'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'activity_log'"
,
'to'
:
u"orm['vm.Node']"
}),
'parent'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"'children'"
,
'null'
:
'True'
,
'to'
:
u"orm['vm.NodeActivity']"
}),
'result'
:
(
'django.db.models.fields.TextField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'started'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'succeeded'
:
(
'django.db.models.fields.NullBooleanField'
,
[],
{
'null'
:
'True'
,
'blank'
:
'True'
}),
'task_uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
,
'unique'
:
'True'
,
'null'
:
'True'
,
'blank'
:
'True'
}),
'user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
u"orm['auth.User']"
,
'null'
:
'True'
,
'blank'
:
'True'
})
},
u'vm.trait'
:
{
'Meta'
:
{
'object_name'
:
'Trait'
},
u'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
})
}
}
complete_apps
=
[
'vm'
]
\ No newline at end of file
circle/vm/models/instance.py
View file @
317e11b7
...
...
@@ -212,6 +212,7 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel,
vnc_port
=
IntegerField
(
blank
=
True
,
default
=
None
,
null
=
True
,
help_text
=
_
(
"TCP port where VNC console listens."
),
unique
=
True
,
verbose_name
=
_
(
'vnc_port'
))
is_base
=
BooleanField
(
default
=
False
)
owner
=
ForeignKey
(
User
)
destroyed_at
=
DateTimeField
(
blank
=
True
,
null
=
True
,
help_text
=
_
(
"The virtual machine's time of "
...
...
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