First step of group management : tab, template, quick search, css.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html Tue Aug 09 11:51:12 2011 +0200
@@ -0,0 +1,109 @@
+{% extends "ldt/ldt_utils/workspace.html" %}
+{% load i18n %}
+
+
+{% block js_declaration %}
+{{block.super}}
+<script type="text/javascript">
+
+var content_filter_url = "{% url ldt.ldt_utils.views.contentsfilter filter='__FILTER__' %}";
+var project_filter_url = "{% url ldt.ldt_utils.views.projectsfilter filter='__FILTER__' is_owner='false' status='0' id_group='__ID_GROUP__' %}";
+var publish_project_url = "{% url ldt.ldt_utils.views.publish '__PROJECT_ID__' 'false' %}";
+var unpublish_project_url = "{% url ldt.ldt_utils.views.unpublish '__PROJECT_ID__' 'false' %}";
+var get_group_projects_url = "{% url ldt.ldt_utils.views.get_group_projects %}";
+
+
+function init_events(base_node) {
+
+ init_events_all(base_node, "{% url ldt.ldt_utils.views.popup_embed %}", content_filter_url, project_filter_url, publish_project_url, unpublish_project_url, get_group_projects_url);
+
+}
+
+
+var global_csrf_token = "{{ csrf_token }}";
+
+$(document).ready(function(){
+
+ input_list_init = [
+ {'input_selector':"#searchcontentsinput", 'container_selector':"#contentslistcontainer", 'url':content_filter_url},
+ {'input_selector':"#searchprojectsinput", 'container_selector':"#projectslistcontainer", 'url':project_filter_url}
+ ];
+
+ searchFieldInit(input_list_init);
+
+ init_events(document);
+
+ $(".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();
+ // Show the search textfield and update the id_group in the hidden input
+ $('#search_div').show();
+ $('#id_group').val(id_group);
+ $('#searchprojectsinput').val("");
+ $(".searchclear",$('#search_div')).hide();
+ // Send the request to update the projects list
+ $.ajax({
+ url: get_group_projects_url,
+ type: 'POST',
+ data: {csrfmiddlewaretoken:global_csrf_token,
+ id_group:id_group
+ },
+ success: function(msg, textStatus, XMLHttpRequest) {
+ $('#projectslistcontainer').html(msg);
+ init_events(document);
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ resp = $.parseJSON(jqXHR.responseText);
+ alert(resp.message);
+ }
+ });
+ });
+
+});
+</script>
+{% endblock %}
+
+{% block content %}
+<div class="span-24 last" id="allcontentsdiv">
+ {% if groups and groups.all|length > 0 %}
+ <div class="span-12" id="contentsdiv">
+ <div class="span-12 last titlediv" >
+ <div class="span-8 projectscontentstitle">{% trans "My groups" %}</div>
+ </div>
+ <div class="span-12 last projectscontentsdiv" id="contentslistcontainer">
+ <div class="projectscontentsheader groupsheader span-12 last" id="contentsheader">
+ {% trans "Click on the line to see the group's projects" %}
+ </div>
+ <input type='hidden' name='id_group' id='id_group' value='' />
+ <table class="projectscontentstable">
+ <tbody class="projectscontentsbody">
+ {% for group in groups.all %}
+ <tr class="imageline {% cycle 'projectscontentsoddline' 'projectscontentsevenline'%} update_group_projects" id="{{ group.id }}">
+ <td>{{ group.name }}</td><td class="align_right"><img src="{{LDT_MEDIA_PREFIX}}/img/control_play.png" class="next_icon"/></td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ </div>
+ <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" %}
+ </div>
+ </div>
+ {% else %}
+ <p>{% trans "You do not belong to any group." %}</p>
+ {% endif %}
+</div>
+{% endblock %}
+
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html Tue Aug 09 11:51:12 2011 +0200
@@ -24,9 +24,9 @@
</td>
<td class="projecttitle">
{% ifequal project.state 2 %}
- {{ project.title }}
+ {% if show_username %}{{ project.owner.user.username }} : {% endif %}{{ project.title }}
{% else %}
- <a class="projecttitlelink" href="{% url ldt.ldt_utils.views.update_project ldt_id=project.ldt_id %}">{{ project.title }}</a>
+ <a class="projecttitlelink" href="{% url ldt.ldt_utils.views.update_project ldt_id=project.ldt_id %}">{% if show_username %}{{ project.owner.user.username }} : {% endif %}{{ project.title }}</a>
{% endifequal %}
</td>
</tr>
--- a/src/ldt/ldt/ldt_utils/urls.py Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/urls.py Tue Aug 09 11:51:12 2011 +0200
@@ -9,6 +9,8 @@
url(r'^searchInit/(?P<field>.*)/(?P<query>.*)$', 'views.searchInit'),
url(r'^searchForm/$', 'views.searchForm'),
url(r'^published/$', 'views.published_project'),
+ url(r'^groups/$', 'views.groups'),
+ url(r'^get_group_projects/$', 'views.get_group_projects'),
url(r'^search/$', 'views.searchIndex'),
url(r'^search/(?P<field>.*)/(?P<query>.*)$', 'views.searchIndexGet'),
url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.searchLdt'),
@@ -25,6 +27,7 @@
url(r'^rdf/id/(?P<ldt_id>.*)$', 'views.project_annotations_rdf'),
url(r'^/?$', "views.workspace", name="root-view"),
url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)$', "views.projectsfilter",),
+ url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)/(?P<id_group>.*)$', "views.projectsfilter",),
url(r'^filtercontents/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.contentsfilter",),
(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'),
--- a/src/ldt/ldt/ldt_utils/views.py Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/ldt_utils/views.py Tue Aug 09 11:51:12 2011 +0200
@@ -1,5 +1,6 @@
from django.conf import settings
from django.contrib.auth.decorators import login_required
+from django.contrib.auth.models import User, Group
from django.core.urlresolvers import reverse
from django.db.models import Q
from django.forms.models import model_to_dict
@@ -34,6 +35,43 @@
import subprocess
import re
import datetime
+
+from django.db.backends.postgresql_psycopg2.base import psycopg2
+
+
+def import_rs(request):
+ # Connexion
+ conn = psycopg2.connect(database="test_import_rs", user="admin", password="admin")
+ cur = conn.cursor()
+ # Get all "regarssignes" contents
+ cur.execute("SELECT * from ldt_content")
+ rows = cur.fetchall()
+ s = "Show me the databases:\n"
+ for row in rows:
+ s += "\n " + str(row)
+ # (id-0, u'iri_id'-1, u'iri_url'-2, u'videopath'-3, datetime creation_date-4, datetime update_date-5, u'title'-6, description-7, eternal_id-8)
+ # (1, u'laurentcantet_entrelesmurs', u'laurentcantet_entrelesmurs/laurentcantet_entrelesmurs.iri', u'rtmp://media.iri.centrepompidou.fr/ddc_player/video/regardssignes/', datetime.datetime(2010, 2, 17, 5, 24, 13, 69794, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, name=None)), datetime.datetime(2010, 2, 17, 5, 24, 13, 91656, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, name=None)), u'Entre Les Murs', None, None)
+ # Get duration from the iri file
+ prePath = u"/Users/tc/dev/eclipse_workspace/regardssignes_svn/web/static/media/ldt/"
+ doc = lxml.etree.parse(prePath + row[2])
+ res = doc.xpath("/iri/body/medias/media[@id='video']/video")
+ if len(res) > 0:
+ try:
+ dur = int(res[0].get(u'dur', 0) or 0)
+ except:
+ dur = 3600000
+ else:
+ dur = 3600000
+ # Build platform media and platform content from "regarssignes" contents
+ media = Media.objects.create(external_id=row[8], creation_date=row[4], update_date=row[5], videopath=row[3], duration=dur,
+ description=row[7], title=row[6], src=(row[1]+u".flv"), mimetype_field="('video/x-flv', None)")
+ media.save()
+
+ content = Content.objects.create(iri_id=row[1], iriurl=row[2], creation_date=row[4], update_date=row[5], title=row[6], description=row[7],
+ content_creation_date=row[4], duration=dur, media_obj=media)
+ content.save()
+
+ return HttpResponse(s, mimetype="text/plain")
@@ -52,7 +90,22 @@
return render_to_response("ldt/ldt_utils/workspace.html",
{'contents': content_list, 'projects': project_list,
'is_gecko': is_gecko},
- context_instance=RequestContext(request))
+ context_instance=RequestContext(request))
+
+
+@login_required
+def groups(request):
+
+ # get list of all published projects
+ group_list = request.user.groups #@UndefinedVariable
+
+ is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+
+ # render list
+ return render_to_response("ldt/ldt_utils/groups.html",
+ {'groups': group_list,
+ 'is_gecko': is_gecko},
+ context_instance=RequestContext(request))
@login_required
@@ -112,7 +165,7 @@
@login_required
-def projectsfilter(request, filter, is_owner=False, status=0):
+def projectsfilter(request, filter, is_owner=False, status=0, id_group=None):
is_owner = boolean_convert(is_owner)
status = int(status)
@@ -133,10 +186,19 @@
if len(filter) > 0 and filter[0] == '_':
filter = filter[1:]
query &= Q(title__icontains=filter)
-
- project_list = Project.objects.filter(query) #@UndefinedVariable
is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+ show_username = False
+
+ if id_group > 0:
+ # Get group, user and project_list
+ grp = Group.objects.get(id=id_group) #@UndefinedVariable
+ users = User.objects.filter(groups__in=[grp]) #@UndefinedVariable
+ query &= Q(owner__user__in=users) #@UndefinedVariable
+ project_list = Project.objects.filter(query).extra(select={'lower_title': 'lower(title)'}).order_by('owner__user__username','lower_title') #@UndefinedVariable
+ show_username = True
+ else :
+ project_list = Project.objects.filter(query) #@UndefinedVariable
# Template depends on the projects's status
if status == 2 :
@@ -145,7 +207,7 @@
url_templ = "ldt/ldt_utils/partial/projectslist.html"
return render_to_response(url_templ,
- {'projects': project_list, 'is_gecko': is_gecko},
+ {'projects': project_list, 'show_username':show_username, 'is_gecko': is_gecko},
context_instance=RequestContext(request))
@@ -1040,4 +1102,21 @@
else:
return HttpResponse("", mimetype="text/plain")
except Exception as inst:
- return HttpResponse(str(inst), mimetype="text/plain")
\ No newline at end of file
+ return HttpResponse(str(inst), mimetype="text/plain")
+
+
+@login_required
+def get_group_projects(request):
+
+ # Get group, user and project_list
+ grp = Group.objects.get(id=request.POST["id_group"]) #@UndefinedVariable
+ users = User.objects.filter(groups__in=[grp]) #@UndefinedVariable
+ project_list = Project.objects.filter(owner__user__in=users).extra(select={'lower_title': 'lower(title)'}).order_by('owner__user__username','lower_title') #@UndefinedVariable
+
+ is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+
+ # render list
+ return render_to_response("ldt/ldt_utils/partial/projectslist.html",
+ {'projects': project_list, 'show_username':True,
+ 'is_gecko': is_gecko},
+ context_instance=RequestContext(request))
\ No newline at end of file
--- a/src/ldt/ldt/static/ldt/css/style.css Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/static/ldt/css/style.css Tue Aug 09 11:51:12 2011 +0200
@@ -195,6 +195,7 @@
}
#inner_content {
+ min-height: 600px;
padding: 40px 0px 50px 0px;
}
--- a/src/ldt/ldt/static/ldt/css/workspace.css Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/static/ldt/css/workspace.css Tue Aug 09 11:51:12 2011 +0200
@@ -82,6 +82,12 @@
tr.projectscontentsevenline {
background: white;
}
+tr.update_group_projects:hover {
+ background: lightblue;
+}
+td.align_right {
+ text-align: right;
+}
/* make the TH elements pretty */
@@ -93,6 +99,9 @@
padding: 1px 2px;
text-align: left;
}
+.groupsheader {
+ text-transform:none;
+}
#contentsheader {
@@ -146,6 +155,7 @@
}
.titlediv {
+ min-height: 46px;
vertical-align: middle;
}
@@ -186,3 +196,7 @@
margin-right: 20px;
margin-top: 20px;
}
+
+.next_icon {
+ display: none;
+}
--- a/src/ldt/ldt/static/ldt/js/projectscontents.js Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/static/ldt/js/projectscontents.js Tue Aug 09 11:51:12 2011 +0200
@@ -132,6 +132,7 @@
target.nextAll(".searchclear").hide();
var filterVal = "_" + escape(target.realVal());
url = url.replace('__FILTER__',filterVal);
+ url = url.replace('__ID_GROUP__',$('#id_group').val());
$.ajax({
url: url,
cache: false,
--- a/src/ldt/ldt/templates/ldt/ldt_base.html Thu Aug 04 13:08:04 2011 +0200
+++ b/src/ldt/ldt/templates/ldt/ldt_base.html Tue Aug 09 11:51:12 2011 +0200
@@ -108,6 +108,7 @@
<div id="tabsdiv" class="block span-20">
{% if user.is_authenticated %}
{% url ldt.ldt_utils.views.workspace as workspace_url %}
+ {% url ldt.ldt_utils.views.groups as groups_url %}
{% url ldt.ldt_utils.views.published_project as published_project_url %}
{% url ldt.ldt_utils.views.list_ldt as space_url %}
{% url ldt.ldt_utils.views.list_content as content_url %}
@@ -115,6 +116,7 @@
{% url ldt.ldt_utils.views.searchForm as search_url %}
<ul class="tabs">
<li class='{% active request "active" workspace_url %}'><a href="{{ workspace_url }}" >{% trans "home" %}</a></li>
+ <li class='{% active request "active" groups_url %}'><a href="{{ groups_url }}" >{% trans "My groups" %}</a></li>
<li class='{% active request "active" published_project_url %}'><a href="{{ published_project_url }}" >{% trans "Published projects" %}</a></li>
<!--li class='{% active request "active" content_url %}'><a href="{{ content_url }}">{% trans "contents" %}</a></li>
<li class='{% active request "active" space_url %}'><a href="{{ space_url }}">{% trans "indexation projects" %}</a></li>