--- a/src/ldt/ldt/ldt_utils/forms.py Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/forms.py Thu Dec 08 11:49:18 2011 +0100
@@ -1,7 +1,6 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
-from django.contrib.auth.models import User, Group
-from django.forms.widgets import MultipleHiddenInput
+from django.contrib.auth.models import Group
from ldt.forms import widgets as ldt_widgets
from ldt.security.forms import ShareForm
from models import Project, Content, Media
@@ -97,10 +96,8 @@
'all' : ('admin/css/forms.css', 'admin/css/base.css', 'admin/css/widgets.css')
}
-class GroupAddForm(forms.ModelForm):
+class GroupAddForm(ShareForm):
name = forms.CharField(required=True)
- members_list = forms.ModelMultipleChoiceField(User.objects.all(), required=False, widget=MultipleHiddenInput())
- admin_list = forms.ModelMultipleChoiceField(User.objects.all(), required=False, widget=MultipleHiddenInput())
class Meta:
model = Group
--- a/src/ldt/ldt/ldt_utils/models.py Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/models.py Thu Dec 08 11:49:18 2011 +0100
@@ -310,17 +310,19 @@
def is_public(): #@NoSelf
def fget(self):
- everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
- if 'view_content' in get_perms(everyone, self):
- return True
+ if self.pk:
+ everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+ if 'view_content' in get_perms(everyone, self):
+ return True
return False
def fset(self, value):
- everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
- if value:
- assign('view_content', everyone, self)
- else:
- remove_perm('view_content', everyone, self)
+ if self.pk:
+ everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+ if value:
+ assign('view_content', everyone, self)
+ else:
+ remove_perm('view_content', everyone, self)
return locals()
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html Thu Dec 08 11:49:18 2011 +0100
@@ -25,7 +25,7 @@
margin: 5px;
}
- #userslistcontainer, #memberslistcontainer, #selectors {
+ #userslistcontainer, #selectors {
float: left;
}
@@ -36,9 +36,10 @@
#selecteduserslistfooter, #userslistfooter {
text-align: center;
}
-
- #selectors {
+
+ #moveleftright {
margin-top: 125px;
+ margin-left: 10px;
}
</style>
@@ -95,7 +96,8 @@
<a href="#" id="selectall" title="{% trans "select all users" %}">{% trans "select all" %}</a>
</div>
</div>
- <div id="selectors">
+
+ <div id="moveleftright" class="span-1">
<a href="#" id="selectelems"><img src="{{LDT_MEDIA_PREFIX}}img/to-right.gif" title="{% trans "select users" %}"></a><br />
<a href="#" id="removeelems"><img src="{{LDT_MEDIA_PREFIX}}img/to-left.gif" title="{% trans "remove users" %}"></a>
</div>
@@ -106,7 +108,7 @@
</div>
<select multiple="multiple" id="selecteduserslist" >
{% for user in member_list %}
- <option value="{{ user.id }}" {% if user.change %}style="color: #2181B1;"{% endif %}>{{ user.username }}</option>
+ <option value="{{ user.id }}-{{user.type}}" {% if user.change %}style="color: #2181B1;"{% endif %}>{{ user.name }}</option>
{% endfor %}
</select>
<div id="selecteduserslistfooter" >
@@ -118,13 +120,13 @@
<div id="adminselection">
{% for user in admin_list %}
- <input name="admin_list" type="hidden" value="{{ user.id }}" />
+ <input name="write_list" type="hidden" value="{{ user.id }}-{{user.type}}" />
{% endfor %}
</div>
<div id="memberselection">
{% for user in member_list %}
- <input name="members_list" type="hidden" value="{{ user.id }}" />
+ <input name="read_list" type="hidden" value="{{ user.id }}-{{user.type}}" />
{% endfor %}
</div>
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Thu Dec 08 11:49:18 2011 +0100
@@ -82,8 +82,7 @@
<label for="description" class="projectdesc">{% trans "Description :" %}</label>
{{form.description}}
</div>
-
-
+
<div id="contentright" class="span-9 last">
<label>{% trans "List of contents" %}</label>
@@ -115,8 +114,7 @@
</div>
</div>
-
- {% include "ldt/ldt_utils/partial/permissions.html" %}
+ {% include "ldt/ldt_utils/partial/permissions.html" %}
<div id="submitcontent" class="span-18 last">
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html Thu Dec 08 11:49:18 2011 +0100
@@ -1,34 +1,4 @@
{% load i18n %}
-
-<style type="text/css">
- #elemslistcontainer, #selectors {
- float: left;
- }
-
- #sharelist, #selectedlist {
- width: 250px;
- height: 200px;
- }
-
- #selectedlistfooter, #elemslistfooter {
- text-align: center;
- }
-
- #selectedlistcontainer {
- padding-top: 35px;
- }
-
- #selectors {
- margin-top: 125px;
- padding-left: 45px;
- padding-right: 45px;
- }
-
- #elemslistheader input {
- background-color: white;
- width: 100px;
- }
-</style>
<script type="text/javascript">
@@ -69,8 +39,8 @@
</select>
<div id="selectedlistfooter" class="span-6" >
<a href="#" id="removeall" title="{% trans "select all users" %}">{% trans "remove all" %}</a>
- | <a href="#" id="chooseaux" title="{% trans "Decide whether a user user can change this group" %}">{% trans "is admin" %}</a>
- | <a href="#" id="removeaux">{% trans "is not admin" %}</a>
+ | <a href="#" id="chooseaux" title="{% trans "Decide whether a user user can change this group" %}">{% trans "can change" %}</a>
+ | <a href="#" id="removeaux">{% trans "can not change" %}</a>
</div>
</div>
--- a/src/ldt/ldt/ldt_utils/urls.py Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/urls.py Thu Dec 08 11:49:18 2011 +0100
@@ -32,7 +32,7 @@
url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)/(?P<id_group>.*)$', "views.projects_filter",),
url(r'^filtercontents/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.contents_filter",),
url(r'^filtergroups/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.groups_filter",),
- url(r'filtershare/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.share_filter"),
+ url(r'filtershare/_(?P<filter>[\w\%\_\-\+]*?)/(?P<use_groups>true|false)$', "views.share_filter"),
(r'^embedpopup/?$', "views.popup_embed"),
url(r'^segment/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.index_segment'),
url(r'^segmentInit/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.init_segment'),
--- a/src/ldt/ldt/ldt_utils/views.py Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/views.py Thu Dec 08 11:49:18 2011 +0100
@@ -166,14 +166,14 @@
grp = Group.objects.get(id=id_group)
project_list = get_objects_for_group(grp, 'ldt_utils.view_project').filter(query)
show_username = True
- else :
+ else:
project_list = Project.safe_objects.filter(query) #@UndefinedVariable
project_list = add_change_attr(request.user, project_list)
# Template depends on the projects's status
- if status == 2 :
+ if status == 2:
url_templ = "ldt/ldt_utils/partial/publishedprojectslist.html"
- else :
+ else:
url_templ = "ldt/ldt_utils/partial/projectslist.html"
return render_to_response(url_templ,
@@ -181,23 +181,24 @@
'is_gecko': is_gecko, 'group_id':id_group},
context_instance=RequestContext(request))
-def share_filter(request, filter):
-
+def share_filter(request, filter, use_groups=False):
+ use_groups = boolean_convert(use_groups)
if not filter or len(filter) == 0:
raise AttributeError("filter should be a string")
- filter = filter[1:]
-
+ filter = filter[1:]
users = User.objects.filter(username__icontains=filter)[0:20]
- groups = Group.objects.filter(name__icontains=filter).exclude(name=settings.PUBLIC_GROUP_NAME)[0:20]
resp = []
for u in users:
resp.append({'name':u.username, 'id':u.id, 'type': 'user'})
+
+ if use_groups:
+ groups = Group.objects.filter(name__icontains=filter).exclude(name=settings.PUBLIC_GROUP_NAME)[0:20]
+
+ for g in groups:
+ resp.append({'name': g.name, 'id': g.id, 'type': 'group'})
- for g in groups:
- resp.append({'name': g.name, 'id': g.id, 'type': 'group'})
-
resp = sorted(resp, key=lambda elem: elem['name'].lower())
return render_to_response("ldt/ldt_utils/partial/sharewith.html", {'elem_list' : resp}, context_instance=RequestContext(request))
@@ -970,13 +971,16 @@
del(dict[key])
add_prefix(content_instance_val, "content")
- add_prefix(media_instance_val, "media")
+ add_prefix(media_instance_val, "media")
for k in request.POST.keys():
value = request.POST.get(k)
content_instance_val[k] = value
media_instance_val[k] = value
-
+
+ content_instance_val['read_list'] = request.POST.getlist('read_list')
+ content_instance_val['write_list'] = request.POST.getlist('write_list')
+
content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
@@ -1078,6 +1082,7 @@
if source_file:
source_file.close()
+
if form_status != "error":
#try:
del cleaned_data["media_file"]
@@ -1099,27 +1104,30 @@
mimetype = cleaned_data.get('mimetype_field', None)
if not mimetype:
mimetype = mimetypes.guess_type(media.src)
- media.mimetype_field = mimetype
- media.save()
+ media.mimetype_field = mimetype
assign('view_media', request.user, media)
- assign('change_media', request.user, media)
+ assign('change_media', request.user, media)
+ media.save()
- if form_status != "error":
+ if form_status != "error":
content_defaults = {}
content_defaults.update(content_form.cleaned_data)
content_defaults['media_obj'] = media
- del content_defaults["media_input_type"]
- del content_defaults['groups']
+
+ for key in ["media_input_type", "groups", "is_public", "read_list", "write_list" ]:
+ del content_defaults[key]
+
content, created = Content.safe_objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
assign('change_content', request.user, content)
assign('view_content', request.user, content)
everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+
if content_form.cleaned_data['is_public']:
assign('view_content', everyone, content)
else:
remove_perm('view_content', everyone, content)
- assign_perm_to_obj(content, content_form.cleaned_data["read_list"], content_form.cleaned_data["write_list"], request.user)
+ assign_perm_to_obj(content, content_form.cleaned_data['read_list'], content_form.cleaned_data['write_list'], request.user)
if not created:
for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
setattr(content, attribute, content_defaults[attribute])
@@ -1147,7 +1155,7 @@
def write_content(request, iri_id=None):
submit_action = request.REQUEST.get("submit_button", False)
groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME)
-
+ elem_list = [{'name': u.username, 'id': u.id, 'type': 'user'} for u in User.objects.all()[0:20]]
if submit_action == "prepare_delete":
errors, titles = prepare_delete_content(request, iri_id)
@@ -1177,7 +1185,7 @@
content_form.fields["media_obj"].queryset = Media.safe_objects.all()
return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'media_form': media_form, 'form_status': form_status, 'create_content_action': create_content_action,
- 'iri_id': iri_id, 'session_key':session_key, 'cookie_name':cookie_name}, context_instance=RequestContext(request))
+ 'elem_list': elem_list, 'iri_id': iri_id, 'session_key':session_key, 'cookie_name':cookie_name}, context_instance=RequestContext(request))
@login_required
def prepare_delete_content(request, iri_id=None):
@@ -1289,23 +1297,24 @@
if form.is_valid():
name = form.cleaned_data['name']
- members_list = form.cleaned_data['members_list']
- admin_list = form.cleaned_data['admin_list']
+ members_list = form.cleaned_data['read_list']
+ admin_list = form.cleaned_data['write_list']
group = Group.objects.create(name=name)
group.save()
assign('change_group', request.user, group)
- for user in members_list:
- user.groups.add(group)
- if user in admin_list:
- assign('change_group', user, group)
+ for elem in members_list:
+ if hasattr(elem, 'username'):
+ elem.groups.add(group)
+ if elem in admin_list:
+ assign('change_group', elem, group)
+
request.user.groups.add(group)
form_status = 'saved'
else:
- form = GroupAddForm()
- form.fields['members_list'].queryset = user_list
+ form = GroupAddForm()
return render_to_response("ldt/ldt_utils/create_group.html", {'form' : form, 'form_status' : form_status, 'elem_list' : user_list}, context_instance=RequestContext(request))
@@ -1315,19 +1324,16 @@
return HttpResponseServerError('<h1>User can not update a group.</h1>')
group = get_object_or_404(Group, id=group_id)
- member_list = group.user_set.exclude(id=request.user.id)
- query = Q(id=settings.ANONYMOUS_USER_ID) | Q(id=request.user.id) | Q(is_superuser=True)
- user_list = User.objects.exclude(query)[0:20]
- admin_list = []
- form_status = ''
-
+
if not request.user.has_perm('change_group', group):
form_status = 'saved'
return render_to_response("ldt/ldt_utils/create_group.html", {'form_status' : form_status}, context_instance=RequestContext(request))
- for u in member_list:
- if u.has_perm('change_group', group):
- u.change = True
+ member_list = group.user_set.exclude(id=request.user.id)
+ query = Q(id=settings.ANONYMOUS_USER_ID) | Q(id=request.user.id) | Q(is_superuser=True)
+ user_list = User.objects.exclude(query)[0:20]
+ user_list = [{'name': x.username, 'id': x.id, 'type': 'user'} for x in user_list]
+ form_status = ''
if request.method == "POST":
form = GroupAddForm(request.POST, instance=group)
@@ -1340,17 +1346,19 @@
else:
if form.is_valid():
name = form.cleaned_data['name']
- new_member_list = form.cleaned_data['members_list']
- admin_list = form.cleaned_data['admin_list']
+ new_member_list = form.cleaned_data['read_list']
+ admin_list = form.cleaned_data['write_list']
group.name = name
-
- for user in new_member_list:
+
+ for user in new_member_list:
+ if not hasattr(user, 'username'):
+ raise AttributeError('new_member_list should only contain users')
group.user_set.add(user)
if user in admin_list:
assign('change_group', user, group)
else:
remove_perm('change_group', user, group)
-
+
for user in member_list:
if user not in new_member_list:
group.user_set.remove(user)
@@ -1360,11 +1368,12 @@
form_status = 'saved'
else:
- form = GroupAddForm(initial={'name':unicode(group.name), 'members_list':member_list})
-
+ form = GroupAddForm(initial={'name':unicode(group.name)})
+
+ member_list = [{'name': x.username, 'id': x.id, 'type': 'user'} for x in member_list]
return render_to_response("ldt/ldt_utils/create_group.html", {'group_id' : group_id, 'form' : form, 'form_status' : form_status,
- 'user_list' : user_list, 'member_list': member_list,
- 'admin_list' : admin_list}, context_instance=RequestContext(request))
+ 'elem_list' : user_list, 'member_list': member_list,
+ }, context_instance=RequestContext(request))
@login_required
def leave_group(request, group_id, redirect=True):
--- a/src/ldt/ldt/security/forms.py Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/security/forms.py Thu Dec 08 11:49:18 2011 +0100
@@ -2,7 +2,6 @@
from django.contrib.auth.models import User, Group
from django.forms.widgets import MultipleHiddenInput
-
class LazyMultipleChoiceField(forms.MultipleChoiceField):
# Should do some checking here
@@ -14,8 +13,16 @@
write_list = LazyMultipleChoiceField(required=False, widget=MultipleHiddenInput())
def clean(self):
- read_list = self.data.getlist("read_list")
- write_list = self.data.getlist("write_list")
+ super(ShareForm, self).clean()
+
+ try:
+ read_list = self.data.getlist("read_list")
+ write_list = self.data.getlist("write_list")
+ except AttributeError:
+ # This will be raised for content creation. As data is preprocessed, self.data
+ # is a dict and not a querydict, so getlist won't work
+ read_list = self.data.get('read_list', [])
+ write_list = self.data.get('write_list', [])
elems = read_list + write_list
users = [e.split('-')[0] for e in elems if e.split('-')[1] == 'user' ]
@@ -34,7 +41,7 @@
new_list.append(groups.get(id=id))
return new_list
- new_read_list = create_real_lists(read_list, users, groups)
+ new_read_list = create_real_lists(read_list, users, groups)
new_write_list = create_real_lists(write_list, users, groups)
self.cleaned_data["read_list"] = new_read_list