First step of group management : tab, template, quick search, css.
authorcavaliet
Tue, 09 Aug 2011 11:51:12 +0200
changeset 127 854f0305d866
parent 126 8c90de3216f9
child 128 503e365a3af7
child 132 07cd56b3e6fa
First step of group management : tab, template, quick search, css.
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/static/ldt/css/style.css
src/ldt/ldt/static/ldt/css/workspace.css
src/ldt/ldt/static/ldt/js/projectscontents.js
src/ldt/ldt/templates/ldt/ldt_base.html
--- /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>