--- a/src/ldt/ldt/ldt_utils/models.py Fri Oct 28 16:45:37 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/models.py Fri Nov 04 10:31:47 2011 +0100
@@ -114,7 +114,7 @@
class Meta:
ordering = ["title"]
permissions = (
- ('view_content', 'View Content'),
+ ('view_content', 'Can view Content'),
)
def natural_key(self):
@@ -291,11 +291,19 @@
return locals()
external_id = property(**external_id())
+
+class MyManager(models.Manager):
+
+ def get_query_set(self, *args, **kwargs):
+ return super(MyManager, self).get_query_set(*args, **kwargs)
class SafeManager(models.Manager):
- user = None
- checker = None
+ def __init__(self, model_name):
+ super(SafeManager, self).__init__()
+ self.user = None
+ self.checker = None
+ self.model_name = model_name
def check_perm_for(self, user):
self.user = user
@@ -312,7 +320,7 @@
if not self.has_user():
raise AttributeError("A user has to be chosen to check permissions.")
- res = get_objects_for_user(self.user, 'ldt_utils.view_project')
+ res = get_objects_for_user(self.user, 'ldt_utils.view_%s' % self.model_name)
return res
@@ -335,12 +343,12 @@
state = models.IntegerField(choices=STATE_CHOICES, default=1)
description = models.TextField(null=True, blank=True)
objects = models.Manager()
- objects_safe = SafeManager()
+ objects_safe = SafeManager('project')
class Meta:
ordering = ["title"]
permissions = (
- ('view_project', 'View Project'),
+ ('view_project', 'Can view project'),
)
@@ -393,11 +401,11 @@
project.changed_by = user.username
project.state = 1
project.save()
+ assign('view_project', user, project)
+ assign('change_project', user, project)
for content in contents:
project.contents.add(content)
project.save()
- assign('view_project', user, project)
- assign('change_project', user, project)
return create_ldt(project, user)
def copy_project(self, user, title, description=''):
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Fri Oct 28 16:45:37 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html Fri Nov 04 10:31:47 2011 +0100
@@ -21,32 +21,80 @@
width:390px;
height: 100px;
}
-
+
+ #lefttable {
+ float: left;
+ }
+
+ #righttable {
+ }
+
+ .choice {
+ font-weight: bold;
+ }
+
+ .permission {
+ cursor: pointer;
+ text-decoration: none;
+ color: black;
+ }
+
+ .permcol {
+ width: 100px;
+ }
+
</style>
{% endblock %}
{% block js_declaration %}
{{ block.super }}
<script type="text/javascript">
+ function checkbox_selection(id_checkbox, checkbox_type) {
+ var check_all = '{% trans "check all" %}';
+ var uncheck_all = '{% trans "uncheck all" %}';
+ var id_str = "#" + id_checkbox;
+
+ $(id_str).attr('title', uncheck_all);
+
+ $(id_str).change(function () {
+ if ($(id_str).is(":checked")) {
+ $(".cellcheckbox input[name=\"" + checkbox_type + "\"]").attr('checked', 'true');
+ $(id_str).attr('title', uncheck_all );
+ } else {
+ $(".cellcheckbox input[name=\"" + checkbox_type + "\"]").removeAttr('checked');
+ $(id_str).attr('title', check_all);
+ }
+ });
+ }
+
$(document).ready(function() {
+
$("#close_button").click(function (e) {
e.preventDefault();
parent.$.nmTop().close();
});
-
- var check_all = '{% trans "check all" %}';
- var uncheck_all = '{% trans "uncheck all" %}';
-
- $("#check_projects").attr('title', uncheck_all);
- $("#check_projects").change(function () {
- if ($("#check_projects").is(":checked")) {
- $(".cellcheckbox input").attr('checked', 'true');
- $("#check_projects").attr('title', uncheck_all );
- } else {
- $(".cellcheckbox input").removeAttr('checked');
- $("#check_projects").attr('title', check_all);
- }
- });
+
+ checkbox_selection("check_contents", "contents");
+ checkbox_selection("check_groups", "groups");
+
+ $(".permission").click(function () {
+ var name = $(this).attr('value');
+
+ $("a[value=\"" + name + "\"]").removeClass('choice');
+ $(this).addClass('choice');
+ });
+
+ $("input[name=\"groups\"]").change(function() {
+ var line = $(this).closest('td').next().next();
+
+ if (!$(this).is(":checked")) {
+ $(".choice", line).removeClass('choice');
+ $(".choice", line).removeClass('permission');
+ } else {
+ $(".perm_read", line).addClass('choice');
+ $(".perm_read, .perm_write", line).addClass('permission');
+ }
+ });
});
</script>
@@ -72,8 +120,9 @@
{% endblock %}
{% block body %}
- <div id="add_contribution" class="span-12 last">
- <div class="projectscontentstitle span-12 last">{% if ldt_id %}{% trans "Update your project" %}{% else %}{% trans "Create your project" %}{% endif %}</div>
+ <div id="add_contribution" class="span-23 last">
+
+ <div class="projectscontentstitle span-23 last">{% if ldt_id %}{% trans "Update your project" %}{% else %}{% trans "Create your project" %}{% endif %}</div>
<form action="{{create_project_action}}" method="POST" {% if target_parent %}target="_parent"{% endif %}>
{% csrf_token %}
<input type="hidden" name="form_status" value="{{form_status}}" id="project_form_status" />
@@ -81,37 +130,75 @@
{{form.title}}
<label for="description" class="projectdesc">{% trans "Description :" %}</label>
{{form.description}}
- <label>{% trans "List of contents" %}</label>
- <div class="span-12 last projectscontentsdiv" id="ldtcreatecontentslistcontainer">
- <div class="span-12 last projectscontentstablediv" id="ldtcreatecontentstablediv">
- <table class="projectscontentstable">
-
- <tr class="projectscontentsheader last" id="contentslistheader">
- <td class="cellcheckbox">
- {% if not ldt_id %}
- {% if contents|length > 1 %}
- <input class="selectallprojects" id="check_projects" type="checkbox" checked="true" />
- {% endif %}
- {% endif %}
- </td>
- <td class="projectcontentsheadertitle">{% trans "name" %}</td>
- </tr>
-
- <tbody class="projectscontentsbody">
- {% for content in contents %}
- <tr class="imageline {% cycle 'projectscontentsoddline' 'projectscontentsevenline'%}">
- <td class="cellcheckbox"><input type="checkbox" name="contents" value="{{ content.id }}" checked="true" {% if ldt_id %}disabled="disabled"{% endif %} /></td>
- <td class="contenttitle">{{ content.title }}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
+
+ <div id="lefttable" class="span-11">
+ <label>{% trans "List of contents" %}</label>
+
+ <div class="span-10 last" id="ldtcreatecontentslistcontainer">
+ <div class="span-10 last projectscontentstablediv" id="ldtcreatecontentstablediv">
+ <table class="projectscontentstable">
+
+ <tr class="projectscontentsheader last" id="contentslistheader">
+ <td class="cellcheckbox">
+ {% if not ldt_id %}
+ {% if contents|length > 1 %}
+ <input class="selectallcontents" id="check_contents" type="checkbox" checked="true" />
+ {% endif %}
+ {% endif %}
+ </td>
+ <td class="projectcontentsheadertitle">{% trans "name" %}</td>
+ </tr>
+
+ <tbody class="projectscontentsbody">
+ {% for content in contents %}
+ <tr class="imageline {% cycle 'projectscontentsoddline' 'projectscontentsevenline'%}">
+ <td class="cellcheckbox"><input type="checkbox" name="contents" value="{{ content.id }}" checked="true" /></td>
+ <td class="contenttitle">{{ content.title }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
</div>
-
-
- </div>
+ </div>
+
+
+ <div id="righttable" class="span-11">
+ <label>{% trans "group list"%}</label>
- <div id="submitcontent-buttons" class="span-12 last">
+ <div class="span-10 last" id="ldtcreatecontentslistcontainer">
+ <div class="span-10 last projectscontentstablediv" id="ldtcreatecontentstablediv">
+ <table class="projectscontentstable">
+
+ <tr class="projectscontentsheader last" id="contentslistheader">
+ <td class="cellcheckbox">
+ {% if groups|length > 1 %}
+ <input class="selectallgroups" id="check_groups" type="checkbox" checked="true"/>
+ {% endif %}
+ </td>
+ <td class="projectcontentsheadertitle">{% trans "nom" %}</td>
+ <td class="projectcontentsheadertitle permcol" >{% trans "Permissions" %}</td>
+ </tr>
+
+ <tbody class="projectscontentsbody">
+
+ {% for group in groups %}
+ <tr class="imageline projectscontentsoddline">
+ <td class="cellcheckbox"><input type="checkbox" name="groups" value="{{ group.id }}" checked="true" /></td>
+ <td class="projecttitle">{{ group.name }}</td>
+ <td><a value="group_{{group.id}}" class="perm_read permission choice" title="{% trans "This group can read the project" %}">{% trans "perm.read" %}</a> <a value="group_{{group.id}}" class="perm_write permission" title="{% trans "This group can change the project" %}">{% trans "perm.write" %}</a></td>
+ </tr>
+ {% endfor %}
+
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ </div>
+
+
+ <div id="submitcontent-buttons" class="span-10 last">
<button type="button" id="close_button" value="close">{% trans 'close_cancel' %}</button>
{% if ldt_id %}
<button class="button" id="ldt_submit" type="submit" value="prepare_delete" name="submit_button">{% trans "delete_project" %}</button>
@@ -119,9 +206,12 @@
{% else %}
<button class="button" id="ldt_submit" type="submit" value="create" name="submit_button">{% trans "create_project" %}</button>
{% endif %}
- </div>
- </form>
- </div>
+ </div>
+
+ </form>
+ </div>
+
+ </div>
{% endblock %}
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html Fri Oct 28 16:45:37 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html Fri Nov 04 10:31:47 2011 +0100
@@ -22,10 +22,10 @@
$(".update_group_projects").click(function(){
//alert("group id = " + $(this).attr('id') + ", url = " + get_group_projects_url);
id_group = $(this).attr('id');
- // Remove the icons from all the lines
- $(".next_icon").hide();
- // Display the icon from the good line
- $(".next_icon",this).show();
+ // Remove icons from all the lines
+ $(".next_icon, td .create_group").hide();
+ // Display icons from the good line
+ $(".next_icon, .create_group",this).show();
// Show the search textfield and update the id_group in the hidden input
$('#search_div').show();
$('#id_group').val(id_group);
@@ -44,8 +44,6 @@
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText);
- resp = $.parseJSON(jqXHR.responseText);
- alert(resp.message);
}
});
});
@@ -91,6 +89,9 @@
<div class="span-12 last" id="projectsdiv">
<div class="span-12 last titlediv" >
<div class="span-8 projectscontentstitle" >{% trans "The group's projects" %}</div>
+ <div class="span-4 last searchfielddiv" id="search_div" style='display:none'>
+ <div class="searchfield rounded"><input id="searchprojectsinput" class="searchfieldinput searchfieldinputbase" value="{% trans 'search' %}" type="text" /><img id="projectsajaxloader" class="searchajaxloader" src="{{LDT_MEDIA_PREFIX}}/img/ajax-loader-16x16.gif" alt="loader"/><img id="projecsclear" class="searchclear" src="{{LDT_MEDIA_PREFIX}}img/clear-left.png"/></div>
+ </div>
</div>
<div class="span-12 last projectscontentsdiv" id="projectslistcontainer">
{% include "ldt/ldt_utils/partial/projectslist.html" %}
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html Fri Oct 28 16:45:37 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html Fri Nov 04 10:31:47 2011 +0100
@@ -25,9 +25,9 @@
</td>
<td class="projecttitle">
{% ifequal project.state 2 %}
- {% if show_username %}{{ project.owner.username }} : {% endif %} <span class="projectinfos" data-title="{{ project.title }}" data-desc="{{ project.description|linebreaksbr }}" >{{ project.title }}</span>
+ <span class="projectinfos" data-title="{{ project.title }}" data-desc="{{ project.description|linebreaksbr }}" >{% if show_username %}{{ project.owner.username }} : {% endif %}{{ project.title }}</span>
{% else %}
- <a class="projecttitlelink" href="{% url ldt.ldt_utils.views.update_project ldt_id=project.ldt_id %}">{% if show_username %}{{ project.owner.username }} : {% endif %}<span class="projectinfos" data-title="{{ project.title }}" data-desc="{{ project.description|linebreaksbr }}" >{{ project.title }}</span></a>
+ <a class="projecttitlelink" href="{% url ldt.ldt_utils.views.update_project ldt_id=project.ldt_id %}"><span class="projectinfos" data-title="{{ project.title }}" data-desc="{{ project.description|linebreaksbr }}" >{% if show_username %}{{ project.owner.username }} : {% endif %}{{ project.title }}</span></a>
{% endifequal %}
</td>
</tr>
--- a/src/ldt/ldt/ldt_utils/views.py Fri Oct 28 16:45:37 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/views.py Fri Nov 04 10:31:47 2011 +0100
@@ -41,7 +41,6 @@
import re
import datetime
-
@login_required
@group_security
def workspace(request):
@@ -397,6 +396,7 @@
form = LdtAddForm(request.POST)
form_status = "none"
contents = Content.objects.all()
+ groups = request.user.groups.all()
if form.is_valid():
user = request.user
@@ -406,9 +406,10 @@
else:
form = LdtAddForm()
contents = Content.objects.all() #@UndefinedVariable
+ groups = request.user.groups.all()
form_status = "none"
- return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form, 'form_status':form_status, 'create_project_action':reverse(create_ldt_view), 'language_code' : settings.LANGUAGE_CODE[2:]}, context_instance=RequestContext(request))
+ return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'groups': groups, 'form': form, 'form_status':form_status, 'create_project_action':reverse(create_ldt_view), 'language_code' : settings.LANGUAGE_CODE[2:]}, context_instance=RequestContext(request))
def created_ldt(request):
return render_to_response('ldt/ldt_utils/save_done.html', context_instance=RequestContext(request))
@@ -774,6 +775,7 @@
project = get_object_or_404(Project, ldt_id=ldt_id)
contents = project.contents.all()
+ groups = request.user.groups.all()
if request.method == "POST" :
submit_action = request.REQUEST.get("submit_button", False)
if submit_action == "prepare_delete":
@@ -808,7 +810,7 @@
form = AddProjectForm({'title':unicode(project.title), 'description':unicode(project.get_description())})
form_status = 'none'
- return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status':form_status, 'ldt_id': ldt_id, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request))
+ return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'form_status':form_status, 'groups': groups, 'ldt_id': ldt_id, 'contents':contents, 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request))
@login_required
@@ -1137,6 +1139,7 @@
@login_required
+@group_security
def get_group_projects(request):
# Get group, user and project_list
@@ -1184,7 +1187,7 @@
group = get_object_or_404(Group, id=group_id)
- user_list = User.objects.exclude(username='AnonymousUser').exclude(id=request.user.id)
+ user_list = User.objects.exclude(id=settings.ANONYMOUS_USER_ID).exclude(id=request.user.id)
members_list = User.objects.filter(groups__id=group_id)
form_status = ''
@@ -1213,8 +1216,7 @@
group.name = name
for user in User.objects.all():
- if user in members_list:
-
+ if user in members_list:
group.user_set.add(user)
else:
group.user_set.remove(user)
--- a/src/ldt/ldt/static/ldt/css/workspace.css Fri Oct 28 16:45:37 2011 +0200
+++ b/src/ldt/ldt/static/ldt/css/workspace.css Fri Nov 04 10:31:47 2011 +0100
@@ -201,6 +201,6 @@
margin-top: 20px;
}
-.next_icon {
+.next_icon, tr .create_group {
display: none;
}