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
00a31980
authored
Jul 22, 2014
by
Bach Dániel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dashboard: add autocomplete for AclUpdateView
parent
6f5d8cc0
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
60 additions
and
20 deletions
+60
-20
circle/circle/settings/base.py
+1
-0
circle/dashboard/autocomplete_light_registry.py
+21
-0
circle/dashboard/forms.py
+6
-0
circle/dashboard/models.py
+5
-0
circle/dashboard/templates/base.html
+1
-0
circle/dashboard/templates/dashboard/template-edit.html
+5
-4
circle/dashboard/urls.py
+5
-0
circle/dashboard/views.py
+15
-16
requirements/base.txt
+1
-0
No files found.
circle/circle/settings/base.py
View file @
00a31980
...
@@ -260,6 +260,7 @@ THIRD_PARTY_APPS = (
...
@@ -260,6 +260,7 @@ THIRD_PARTY_APPS = (
'taggit'
,
'taggit'
,
'statici18n'
,
'statici18n'
,
'django_sshkey'
,
'django_sshkey'
,
'autocomplete_light'
,
)
)
# Apps specific for this project go here.
# Apps specific for this project go here.
...
...
circle/dashboard/autocomplete_light_registry.py
0 → 100644
View file @
00a31980
import
autocomplete_light
from
django.utils.translation
import
ugettext
as
_
from
.views
import
AclUpdateView
class
AclUserAutocomplete
(
autocomplete_light
.
AutocompleteGenericBase
):
search_fields
=
(
(
'^first_name'
,
'last_name'
,
'username'
,
'^email'
,
'profile__org_id'
),
(
'^name'
,
'groupprofile__org_id'
),
)
autocomplete_js_attributes
=
{
'placeholder'
:
_
(
"Name of group or user"
)}
def
choices_for_request
(
self
):
user
=
self
.
request
.
user
self
.
choices
=
(
AclUpdateView
.
get_allowed_users
(
user
),
AclUpdateView
.
get_allowed_groups
(
user
))
return
super
(
AclUserAutocomplete
,
self
)
.
choices_for_request
()
autocomplete_light
.
register
(
AclUserAutocomplete
)
circle/dashboard/forms.py
View file @
00a31980
...
@@ -27,6 +27,7 @@ from django.contrib.auth.models import User, Group
...
@@ -27,6 +27,7 @@ from django.contrib.auth.models import User, Group
from
django.core.validators
import
URLValidator
from
django.core.validators
import
URLValidator
from
django.core.exceptions
import
PermissionDenied
,
ValidationError
from
django.core.exceptions
import
PermissionDenied
,
ValidationError
import
autocomplete_light
from
crispy_forms.helper
import
FormHelper
from
crispy_forms.helper
import
FormHelper
from
crispy_forms.layout
import
(
from
crispy_forms.layout
import
(
Layout
,
Div
,
BaseInput
,
Field
,
HTML
,
Submit
,
Fieldset
,
TEMPLATE_PACK
,
Layout
,
Div
,
BaseInput
,
Field
,
HTML
,
Submit
,
Fieldset
,
TEMPLATE_PACK
,
...
@@ -1185,6 +1186,11 @@ class UserCreationForm(OrgUserCreationForm):
...
@@ -1185,6 +1186,11 @@ class UserCreationForm(OrgUserCreationForm):
return
user
return
user
class
AclUserAddForm
(
forms
.
Form
):
name
=
forms
.
CharField
(
widget
=
autocomplete_light
.
TextWidget
(
'AclUserAutocomplete'
,
attrs
=
{
'class'
:
'form-control'
}))
class
UserKeyForm
(
forms
.
ModelForm
):
class
UserKeyForm
(
forms
.
ModelForm
):
name
=
forms
.
CharField
(
required
=
True
,
label
=
_
(
'Name'
))
name
=
forms
.
CharField
(
required
=
True
,
label
=
_
(
'Name'
))
key
=
forms
.
CharField
(
key
=
forms
.
CharField
(
...
...
circle/dashboard/models.py
View file @
00a31980
...
@@ -142,6 +142,11 @@ class Profile(Model):
...
@@ -142,6 +142,11 @@ class Profile(Model):
def
__unicode__
(
self
):
def
__unicode__
(
self
):
return
self
.
get_display_name
()
return
self
.
get_display_name
()
class
Meta
:
permissions
=
(
(
'use_autocomplete'
,
_
(
'Can use autocomplete.'
)),
)
class
FutureMember
(
Model
):
class
FutureMember
(
Model
):
org_id
=
CharField
(
max_length
=
64
,
help_text
=
_
(
org_id
=
CharField
(
max_length
=
64
,
help_text
=
_
(
...
...
circle/dashboard/templates/base.html
View file @
00a31980
...
@@ -70,6 +70,7 @@
...
@@ -70,6 +70,7 @@
<script
src=
"//code.jquery.com/jquery-1.11.1.min.js"
></script>
<script
src=
"//code.jquery.com/jquery-1.11.1.min.js"
></script>
<script
src=
"//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"
></script>
<script
src=
"//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"
></script>
<script
src=
"{{ STATIC_URL }}jsi18n/{{ LANGUAGE_CODE }}/djangojs.js"
></script>
<script
src=
"{{ STATIC_URL }}jsi18n/{{ LANGUAGE_CODE }}/djangojs.js"
></script>
{% include 'autocomplete_light/static.html' %}
{% block extra_script %}
{% block extra_script %}
{% endblock %}
{% endblock %}
...
...
circle/dashboard/templates/dashboard/template-edit.html
View file @
00a31980
...
@@ -88,11 +88,12 @@
...
@@ -88,11 +88,12 @@
</tr>
</tr>
{% endfor %}
{% endfor %}
<tr><td><i
class=
"fa fa-plus"
></i></td>
<tr><td><i
class=
"fa fa-plus"
></i></td>
<td>
<input
type=
"text"
class=
"form-control"
name=
"perm-new-name"
<td>
{{aclform.name }}
</td>
placeholder=
"{% trans "
Name
of
group
or
user
"
%}"
></td
>
<td><select
class=
"form-control"
name=
"level"
>
<td><select
class=
"form-control"
name=
"perm-new"
>
{% for id, name in acl.levels %}
{%
for id, name
in acl.allowed_levels %}
{%
if id
in acl.allowed_levels %}
<option
value=
"{{id}}"
>
{{name}}
</option>
<option
value=
"{{id}}"
>
{{name}}
</option>
{% endif %}
{% endfor %}
{% endfor %}
</select></td><td></td>
</select></td><td></td>
</tr>
</tr>
...
...
circle/dashboard/urls.py
View file @
00a31980
...
@@ -18,6 +18,7 @@
...
@@ -18,6 +18,7 @@
from
__future__
import
absolute_import
from
__future__
import
absolute_import
from
django.conf.urls
import
patterns
,
url
,
include
from
django.conf.urls
import
patterns
,
url
,
include
import
autocomplete_light
from
vm.models
import
Instance
from
vm.models
import
Instance
from
.views
import
(
from
.views
import
(
AclUpdateView
,
FavouriteView
,
GroupAclUpdateView
,
GroupDelete
,
AclUpdateView
,
FavouriteView
,
GroupAclUpdateView
,
GroupDelete
,
...
@@ -43,7 +44,10 @@ from .views import (
...
@@ -43,7 +44,10 @@ from .views import (
LeaseAclUpdateView
,
LeaseAclUpdateView
,
)
)
autocomplete_light
.
autodiscover
()
urlpatterns
=
patterns
(
urlpatterns
=
patterns
(
''
,
''
,
url
(
r'^$'
,
IndexView
.
as_view
(),
name
=
"dashboard.index"
),
url
(
r'^$'
,
IndexView
.
as_view
(),
name
=
"dashboard.index"
),
url
(
r'^lease/(?P<pk>\d+)/$'
,
LeaseDetail
.
as_view
(),
url
(
r'^lease/(?P<pk>\d+)/$'
,
LeaseDetail
.
as_view
(),
...
@@ -181,4 +185,5 @@ urlpatterns = patterns(
...
@@ -181,4 +185,5 @@ urlpatterns = patterns(
url
(
r'^sshkey/create/$'
,
url
(
r'^sshkey/create/$'
,
UserKeyCreate
.
as_view
(),
UserKeyCreate
.
as_view
(),
name
=
"dashboard.views.userkey-create"
),
name
=
"dashboard.views.userkey-create"
),
url
(
r'^autocomplete/'
,
include
(
'autocomplete_light.urls'
)),
)
)
circle/dashboard/views.py
View file @
00a31980
...
@@ -61,7 +61,7 @@ from .forms import (
...
@@ -61,7 +61,7 @@ from .forms import (
UserCreationForm
,
GroupProfileUpdateForm
,
UnsubscribeForm
,
UserCreationForm
,
GroupProfileUpdateForm
,
UnsubscribeForm
,
VmSaveForm
,
UserKeyForm
,
VmRenewForm
,
VmSaveForm
,
UserKeyForm
,
VmRenewForm
,
CirclePasswordChangeForm
,
VmCreateDiskForm
,
VmDownloadDiskForm
,
CirclePasswordChangeForm
,
VmCreateDiskForm
,
VmDownloadDiskForm
,
TraitsForm
,
RawDataForm
,
GroupPermissionForm
TraitsForm
,
RawDataForm
,
GroupPermissionForm
,
AclUserAddForm
)
)
from
.tables
import
(
from
.tables
import
(
...
@@ -1068,8 +1068,8 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
...
@@ -1068,8 +1068,8 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
if
cls
.
has_next_level
(
user
,
obj
,
l
[
0
]))
if
cls
.
has_next_level
(
user
,
obj
,
l
[
0
]))
is_owner
=
'owner'
in
allowed_levels
is_owner
=
'owner'
in
allowed_levels
allowed_users
=
cls
.
get_allowed_users
(
user
,
is_owner
)
allowed_users
=
cls
.
get_allowed_users
(
user
)
allowed_groups
=
cls
.
get_allowed_groups
(
user
,
is_owner
)
allowed_groups
=
cls
.
get_allowed_groups
(
user
)
user_levels
=
list
(
user_levels
=
list
(
{
'user'
:
u
,
'level'
:
l
}
for
u
,
l
in
obj
.
get_users_with_level
()
{
'user'
:
u
,
'level'
:
l
}
for
u
,
l
in
obj
.
get_users_with_level
()
...
@@ -1100,30 +1100,28 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
...
@@ -1100,30 +1100,28 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
return
instance
.
has_level
(
user
,
next_level
)
return
instance
.
has_level
(
user
,
next_level
)
@classmethod
@classmethod
def
get_allowed_groups
(
cls
,
user
,
is_owner
):
def
get_allowed_groups
(
cls
,
user
):
if
is_owner
:
if
user
.
has_perm
(
'dashboard.use_autocomplete'
)
:
return
Group
.
objects
.
all
()
return
Group
.
objects
.
all
()
else
:
else
:
profiles
=
GroupProfile
.
get_objects_with_level
(
'owner'
,
user
)
profiles
=
GroupProfile
.
get_objects_with_level
(
'owner'
,
user
)
return
Group
.
objects
.
filter
(
groupprofile__in
=
profiles
)
.
distinct
()
return
Group
.
objects
.
filter
(
groupprofile__in
=
profiles
)
.
distinct
()
@classmethod
@classmethod
def
get_allowed_users
(
cls
,
user
,
is_owner
):
def
get_allowed_users
(
cls
,
user
):
if
is_owner
:
if
user
.
has_perm
(
'dashboard.use_autocomplete'
)
:
return
User
.
objects
.
all
()
return
User
.
objects
.
all
()
else
:
else
:
groups
=
cls
.
get_allowed_groups
(
user
,
is_owner
)
groups
=
cls
.
get_allowed_groups
(
user
)
return
User
.
objects
.
filter
(
return
User
.
objects
.
filter
(
Q
(
groups__in
=
groups
)
|
Q
(
pk
=
user
.
pk
))
.
distinct
()
Q
(
groups__in
=
groups
)
|
Q
(
pk
=
user
.
pk
))
.
distinct
()
def
check_auth
(
self
,
whom
,
old_level
,
new_level
):
def
check_auth
(
self
,
whom
,
old_level
,
new_level
):
if
isinstance
(
whom
,
Group
):
if
isinstance
(
whom
,
Group
):
if
whom
not
in
AclUpdateView
.
get_allowed_groups
(
self
.
request
.
user
,
if
whom
not
in
AclUpdateView
.
get_allowed_groups
(
self
.
request
.
user
):
self
.
is_owner
):
return
False
return
False
elif
isinstance
(
whom
,
User
):
elif
isinstance
(
whom
,
User
):
if
whom
not
in
AclUpdateView
.
get_allowed_users
(
self
.
request
.
user
,
if
whom
not
in
AclUpdateView
.
get_allowed_users
(
self
.
request
.
user
):
self
.
is_owner
):
return
False
return
False
return
(
return
(
AclUpdateView
.
has_next_level
(
self
.
request
.
user
,
AclUpdateView
.
has_next_level
(
self
.
request
.
user
,
...
@@ -1168,9 +1166,9 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
...
@@ -1168,9 +1166,9 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
self
.
set_level
(
entity
,
value
)
self
.
set_level
(
entity
,
value
)
def
add_levels
(
self
):
def
add_levels
(
self
):
name
=
self
.
request
.
POST
.
get
(
'
perm-new-
name'
,
None
)
name
=
self
.
request
.
POST
.
get
(
'name'
,
None
)
value
=
self
.
request
.
POST
.
get
(
'perm-new
'
,
None
)
level
=
self
.
request
.
POST
.
get
(
'level
'
,
None
)
if
not
name
or
not
value
:
if
not
name
or
not
level
:
return
return
try
:
try
:
entity
=
search_user
(
name
)
entity
=
search_user
(
name
)
...
@@ -1182,7 +1180,7 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
...
@@ -1182,7 +1180,7 @@ class AclUpdateView(LoginRequiredMixin, View, SingleObjectMixin):
messages
.
warning
(
messages
.
warning
(
self
.
request
,
_
(
'User or group "
%
s" not found.'
)
%
name
)
self
.
request
,
_
(
'User or group "
%
s" not found.'
)
%
name
)
return
return
self
.
set_level
(
entity
,
value
)
self
.
set_level
(
entity
,
level
)
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
instance
=
self
.
get_object
()
self
.
instance
=
self
.
get_object
()
...
@@ -1352,6 +1350,7 @@ class TemplateDetail(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
...
@@ -1352,6 +1350,7 @@ class TemplateDetail(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
obj
,
self
.
request
.
user
,
'dashboard.views.template-acl'
)
obj
,
self
.
request
.
user
,
'dashboard.views.template-acl'
)
context
[
'disks'
]
=
obj
.
disks
.
all
()
context
[
'disks'
]
=
obj
.
disks
.
all
()
context
[
'is_owner'
]
=
obj
.
has_level
(
self
.
request
.
user
,
'owner'
)
context
[
'is_owner'
]
=
obj
.
has_level
(
self
.
request
.
user
,
'owner'
)
context
[
'aclform'
]
=
AclUserAddForm
()
return
context
return
context
def
get_success_url
(
self
):
def
get_success_url
(
self
):
...
...
requirements/base.txt
View file @
00a31980
...
@@ -4,6 +4,7 @@ billiard==3.3.0.17
...
@@ -4,6 +4,7 @@ billiard==3.3.0.17
bpython==0.12
bpython==0.12
celery==3.1.11
celery==3.1.11
Django==1.6.3
Django==1.6.3
django-autocomplete-light==1.4.14
django-braces==1.4.0
django-braces==1.4.0
django-celery==3.1.10
django-celery==3.1.10
django-crispy-forms==1.4.0
django-crispy-forms==1.4.0
...
...
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