'psutil',
'pyyaml',
'python-ebml',
+ 'django-extra-views',
+ 'django-ajax-selects',
+ 'django-breadcrumbs',
],
- dependency_links = ['https://github.com/yomguy/django-json-rpc/tarball/0.6.2',]
+ dependency_links = ['https://github.com/yomguy/django-json-rpc/tarball/0.6.2',
+ 'https://github.com/elo80ka/django-dynamic-formset/tarball/master',
+ ]
platforms=['OS Independent'],
license='CeCILL v2',
classifiers = CLASSIFIERS,
import django.forms as forms
from django.forms import ModelForm
from telemeta.models import *
+from extra_views import CreateWithInlinesView, UpdateWithInlinesView, InlineFormSet
+from extra_views.generic import GenericInlineFormSet
+
class MediaFondsForm(ModelForm):
children = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=MediaCorpus.objects.all())
class Meta:
model = MediaFonds
+
class MediaFondsRelatedForm(ModelForm):
class Meta:
model = MediaFondsRelated
+
class MediaCorpusForm(ModelForm):
children = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
queryset=MediaCollection.objects.all())
-
class Meta:
model = MediaCorpus
+
class MediaCorpusRelatedForm(ModelForm):
class Meta:
model = MediaCorpusRelated
+
class MediaCollectionForm(ModelForm):
class Meta:
model = MediaCollection
def clean_doctype_code(self):
return self.cleaned_data['doctype_code'] or 0
+
class MediaCollectionRelatedForm(ModelForm):
class Meta:
model = MediaCollectionRelated
+
class MediaItemForm(ModelForm):
class Meta:
model = MediaItem
super(MediaItemForm, self).__init__(*args, **kwargs)
self.fields.insert(18, 'comment', self.fields['comment'])
+
class MediaItemRelatedForm(ModelForm):
class Meta:
model = MediaItemRelated
+
class MediaItemKeywordForm(ModelForm):
class Meta:
model = MediaItemKeyword
+
class MediaItemPerformanceForm(ModelForm):
class Meta:
model = MediaItemPerformance
self.fields['instrument'].queryset = Instrument.objects.order_by('name')
self.fields['alias'].queryset = InstrumentAlias.objects.order_by('name')
+
class PlaylistForm(ModelForm):
class Meta:
model = Playlist
+
+class FondsRelatedInline(InlineFormSet):
+ model = MediaFondsRelated
+
+
+class CorpusRelatedInline(InlineFormSet):
+ model = MediaCorpusRelated
+
body {margin: 0; padding: 0;}
+
a {text-decoration: none; color: #969696;}
+
a img {border: none;}
-html, input, select, textarea, h1, h2, h3, h4, h5, h6 {
- font-size: 100%;
-}
+
body {
- font: 0.8125em/1em Verdana, sans-serif;
+ font: 0.8125em/1em verdana, sans-serif;
line-height: 1.3em;
color: #333;
background: #FFF;
margin: 0em;
+ text-rendering: optimizeLegibility;
+}
+
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-size: 100%;
+ vertical-align: baseline;
+ background: transparent;
+ /*width: auto;
+ height: auto;*/
}
/*a:link, a:visited {
/* Quick search */
#quick_search {
position: absolute;
- top: 1.7em;
+ top: 1.2em;
left: 35%;
background-color: #6a0307;
padding: 0.3em 0em 0.3em 0.3em;
-webkit-border-radius: 8px 8px 8px 8px;
border-radius: 8px 8px 8px 8px;
}
+
#quick_search form {
float: left;
margin-right: 12px;
}
-#quick_search p {
- margin-top: .3em;
- clear: left;
-}
-#quick_search a {
- font-size: .8em;
- font-weight: bold;
- vertical-align: middle;
-}
#quick_search input {
vertical-align: middle;
- font-size: .8em;
- margin-right: 0;
+ font-size: .9em;
+ margin-right: 0.5em;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
}
+
#quick_search_pattern {
background: #FFF url(search_bg.png) no-repeat;
padding: .4em .1em;
- padding-left: 25px;
width: 180px;
color: #555;
font-weight: bold;
+ float: left;
}
/* Authentication */
font-weight: bold;
}
+
form.login {
- font-size: 0.8em;
+ font-size: 0.9em;
float: left;
margin-top: 2em;
margin-bottom: 4em;
- padding: .5em;
- border: 1px dotted #888;
+ border: 0px dotted #888;
+ padding: 1em;
+ background-color: #FFF;
+ -moz-border-radius: 8px 0px 8px 8px;
+ -webkit-border-radius: 8px 0px 8px 8px;
+ border-radius: 8px 0px 8px 8px;
}
+.login-text{
+ background-color: white;
+}
.login-error {
color: #BB0000;
}
/* Main navigation bar (borrowed from Trac) */
#menu {
background-color: #6a0307 ;
- font: normal verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
border-top: .25em solid #6a0307;
padding-left:26px;
}
moz-border-radius-topright: 5px 5px;
border-top-right-radius: 5px 5px;
font-weight: bold;
- font-size: 14px;
+ font-size: 15px;
padding: .5em 1em;
}
#menu a:hover, #menu a.active{
color: #FFF;
font-size: 10px;
border-top: 1px solid;
- height: 31px;
+ height: 42px;
padding: 0.5em 0.5em 1.1em 0.5em;
margin-top: 2.5em;
}
clear: right;
}
-#module-set .module {
+#module-set-left {
+ float: left;
+ clear: left;
+}
+
+.module {
border: 1px solid #000;
background-image: url(../images/grid_bg.png);
padding: 0.2em;
border-radius: 11px 0px 11px 11px;
}
-#module-set .module h3 {
- color: #FFF;
+.module h3 {
+ color: white;
font-size: 1.1em;
font-weight: bold;
}
-#module-set .module a:hover {
+.module-title {
+ color: white;
+ font-size: 1.1em;
+ font-weight: bold;
+}
+
+
+.module a:hover {
text-decoration: none;
}
-#module-set .module div {
+.module div {
-moz-border-radius: 8px 0px 8px 8px;
-webkit-border-radius: 8px 0px 8px 8px;
border-radius: 8px 0px 8px 8px;
}
-#module-set .module img {
+.module img {
-moz-border-radius: 8px 0px 8px 8px;
-webkit-border-radius: 8px 0px 8px 8px;
border-radius: 8px 0px 8px 8px;
}
-#module-set .module ul, li {
+.module ul, li {
-moz-border-radius: 8px 0px 8px 8px;
-webkit-border-radius: 8px 0px 8px 8px;
border-radius: 8px 0px 8px 8px;
color:#444;
text-decoration: none;
margin:0;
+ font: 0.9em/1.2em sans-serif;
}
.component + .component, .component + .component_icon, .component_icon + .component ,
.component_icon + .component_icon{
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+<meta charset="utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+<link rel="alternate" href="/rss" title="RSS 2.0" type="application/rss+xml" />
+
<title>{%block head_title %}{% description %} - Telemeta{% endblock %}</title>
{% block stylesheets %}
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}telemeta/css/app.css" />
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}telemeta/css/telemeta.css" />
-<link rel="alternate" href="/rss" title="RSS 2.0" type="application/rss+xml" />
+
+
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}telemeta/css/telemeta_ie.css" />
<![endif]-->
{% block javascript %}
<script src="{% url "django.views.i18n.javascript_catalog" %}" type="text/javascript"></script>
-<script src="{{ STATIC_URL }}timeside/js/libs/jquery-1.6.min.js" type="text/javascript"></script>
+<script src="{{ STATIC_URL }}telemeta/bower_components/jquery/dist/jquery.min.js" type="text/javascript"></script>
<script src="{{ STATIC_URL }}telemeta/js/locale.js" type="text/javascript"></script>
<script src="{{ STATIC_URL }}telemeta/js/application.js" type="text/javascript"></script>
+<script src="{{ STATIC_URL }}telemeta/bower_components/modernizr/modernizr.js"></script>
{% if user.is_authenticated %}
<script type='text/javascript'>var CURRENT_USER_NAME="{{ user.username }}";</script>
{% else %}
<div id="quick_search">
<form action="{% url "telemeta-search" %}" id="_quickSearchForm" method="get">
<input type="text" id="quick_search_pattern" name="pattern" />
-<a href="#" class="component button"
- onclick="document.getElementById('_quickSearchForm').submit(); return false;">{% trans "Search" %}</a>
+<a href="#" class="component button" onclick="document.getElementById('_quickSearchForm').submit();">{% trans "Search" %}</a>
</form>
</div>
{% block postman_menu %}
{% endblock postman_menu %}
+{% if breadcrumbs %}
+<ul class="breadcrumbs">
+ <li><a href="#">Home</a></li>
+ <li><a href="#">Features</a></li>
+ <li class="unavailable"><a href="#">Gene Splicing</a></li>
+ <li class="current"><a href="#">Cloning</a></li>
+</ul>
+{% endif %}
+
<div id="content">
<table id="content_header"><tr>
<td class="leftcol"><h1>{% block title %}{% endblock %}</h1></td>
<td class="rightcol">{% block title_buttons %}{% endblock %}</td>
</tr></table>
-{% block content %}{% endblock %}
-<div class="nett"></div>
-{% block delete %}{% endblock %}
+
+ {% block content %}{% endblock %}
+ {% block delete %}{% endblock %}
+
</div>
{% block body %}
{% block footer %}
<div id="footer">
<hr />
- <table width="100%">
- <tr>
- <td>
+ <div class="row">
+ <div class="small-2 columns">
<a id="telemeta_powered" href="{% telemeta_url %}" target="_blank"><img src="{{ STATIC_URL }}telemeta/images/logo_mini_2.png"
alt="Telemeta Powered"/></a>
- <p class="left">
- {% trans "Powered by" %} <a href="{% telemeta_url %}" target="_blank"><strong>Telemeta {% telemeta_version %}</strong></a><br />
- {% trans "By" %} <a href="http://www.parisson.com/">Parisson SARL</a>
- </p>
- </td>
- <td>
- <p class="center">
+ <span style="font-weight: bold;"><br /> v{% telemeta_version %}</span>
+ </div>
+ <div class="small-8 columns">
+ <center>
{% trans "Usage of the archives in the respect of cultural heritage of the original communities." %}
- </p>
- </td>
- <td>
- <p class="right">
+ </center>
+ </div>
+ <div class="small-2 columns">
Copyright © {% current_year %} {% organization %}<br />
<a href="{% url "telemeta-flatpage" "legal_notices" %}">{% trans "Legal notices" %}</a>
- </p>
- </td>
- </tr>
- </table>
+ </div>
+ </div>
</div>
{% endblock %}
</div>
{% block analytics %}
{% endblock analytics %}
+<script src="{{ STATIC_URL }}telemeta/bower_components/jquery/dist/jquery.min.js" type="text/javascript"></script>
+<script src="{{ STATIC_URL }}telemeta/bower_components/fastclick/lib/fastclick.js" type="text/javascript"></script>
+<script src="{{ STATIC_URL }}telemeta/bower_components/foundation/js/foundation.min.js" type="text/javascript"></script>
+<script src="{{ STATIC_URL }}telemeta/js/app.js" type="text/javascript"></script>
</body>
</html>
<th class="highlight">{% trans "Title" %}</th>
<th>{% trans "Description" %}</th>
<th>{% trans "Code" %}</th>
- <th>{% trans "Sound" %}</th>
+ <th width="5%">{% trans "Sound" %}</th>
</tr>
{% for child in children %}
{% if child.code %}
<table class="listing">
<tr>
- <th class="highlight">{% trans "Title" %}</th>
+ <th class="highlight" width="15%">{% trans "Title" %}</th>
<th>{% trans "Description" %}</th>
- <th>{% trans "Code" %}</th>
- <th>{% trans "Sound" %}</th>
+ <th width="15%">{% trans "Code" %}</th>
+ <th width="5%">{% trans "Sound" %}</th>
</tr>
{% for resource in resources %}
<tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
<thead>
<tr>
<td>{% trans "Media" %}</td>
- <td>{% trans "Preview" %}</td>
+ <td width="25%">{% trans "Preview" %}</td>
</tr>
</thead>
<tbody>
{% extends "telemeta/base.html" %}
{% load i18n %}
-{% block title %}
- <img src="{{ STATIC_URL }}telemeta/images/user_red.png" style="vertical-align:middle" /> {% trans "User authentication" %}
-{% endblock %}
-
{% block content %}
<script>
$(document).ready(function() {
});
});
</script>
+
+
+<div id="module-set-left" class="row">
+{{ block.super }}
+<div class="large-4 columns"> </div>
+<div class="module large-4 columns">
+ <span class="module-title"><img src="{{ STATIC_URL }}telemeta/images/user_red.png" style="vertical-align:middle" />
+ {% trans "User authentication" %}</span>
+
+<div style="background-color: white; align: center; padding: 1em;">
+
+<form id="_loginForm" method="post" action="{% url "telemeta-login" %}">{% csrf_token %}
+
{% if form.errors %}
<p class="login-error">{% trans "Your username and password didn't match. Please try again." %}</p>
{% endif %}
-<form class="login" id="_loginForm" method="post" action="{% url "telemeta-login" %}">{% csrf_token %}
+
<p>
+<label>
{{ form.username.label_tag }}
-{{ form.username }}<br />
+{{ form.username }}
+</label>
+<label>
{{ form.password.label_tag }}
{{ form.password }}
-</p>
-<a href="#" class="component_icon button icon_login" style="float: right;" onclick="document.getElementById('_loginForm').submit(); return false;">{% trans "Sign in" %}</a>
+</label>
+
+<a href="#" class="component_icon button icon_login" style="float: right;" onclick="('#_loginForm').submit();">{% trans "Sign in" %}</a>
+
<input type="hidden" name="next" value="{{ next }}" />
-<span style="align: right; font-weight: bold;"><a href="{% url "telemeta-password-reset" %}">{% trans "Password forgotten" %} ?</a></span>
+
+<span><a href="{% url "telemeta-password-reset" %}">{% trans "Password forgotten" %} ?</a></span>
+</p>
+
</form>
+</div>
+</div>
+<div class="large-4 columns"> </div>
+</div>
{% endblock %}
{% block content %}
{% block infos %}
<div class="intro">
-
</div>
+
<div class="infos">
{% block general_info %}
<dl class="listing">
{% endwith %}
</div>
- {% endblock infos %}
- </div>
-{% endblock %}
+ </div>
+ {% endblock infos %}
+
+{% endblock content %}
{% block delete %}
<a href="{% url "telemeta-resource-dublincore" type resource.public_id %}" style="float:left;margin-top:0.5em;margin-bottom:1em" class="component_icon button icon_dublin_core">Dublin Core</a>
{% if user.is_authenticated and perms.telemeta.delete_mediaresource %}
<a href="{% url "telemeta-resource-delete" type resource.public_id %}" class="component_icon button icon_delete" style="float:right;margin-top:0.5em;margin-bottom:1em">{% trans "Delete" %}</a>
{% endif %}
-{% endblock %}
+{% endblock delete %}
{% else %}
<p>{% trans "No such resource" %}</p>
# Generic resources
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/$', ResourceListView.as_view(), name="telemeta-resource-list"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/$', ResourceDetailView.as_view(), name="telemeta-resource-detail"),
+ url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/edit2/$', ResourceFormSetView.as_view(), name="telemeta-resource-detail2"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/dc/$', ResourceDetailDCView.as_view(), name="telemeta-resource-dublincore"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/edit/$', ResourceEditView.as_view(), name="telemeta-resource-edit"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/copy/$', ResourceCopyView.as_view(), name="telemeta-resource-copy"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/related/(?P<media_id>[A-Za-z0-9._-]+)/view/$', resource_view.related_stream, name="telemeta-resource-related"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/related/(?P<media_id>[A-Za-z0-9._-]+)/download/$', resource_view.related_download, name="telemeta-resource-related-download"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/related_edit/$', resource_view.related_edit, dict(template='telemeta/resource_related_edit.html'), name="telemeta-resource-related_edit"),
- url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/dc/xml/$', resource_view.detail,
- {'format': 'dublin_core_xml'},
- name="telemeta-resource-dublincore-xml"),
- url(r'^archives/$', home_view.search, name="telemeta-archives"),
+
# search
+ # url(r'^archives/$', home_view.search, name="telemeta-archives"),
url(r'^search/$', home_view.search, name="telemeta-search"),
url(r'^search/collections/$', home_view.search, {'type': 'collections'},
name="telemeta-search-collections"),
playlists.append({'playlist': playlist, 'resources': resources})
return playlists
+
+def get_playlists_names(request, user=None):
+ if not user:
+ user = request.user
+ playlists = []
+ if user.is_authenticated():
+ user_playlists = user.playlists.all()
+ for playlist in user_playlists:
+ playlists.append({'playlist': playlist})
+ return playlists
+
+
def check_related_media(medias):
for media in medias:
if not media.mime_type:
from telemeta.views.core import *
+
class HomeView(object):
"""Provide general web UI methods"""
if 'quicktime' in mime_type:
mime_type = 'video/mp4'
- playlists = get_playlists(request)
+ playlists = get_playlists_names(request)
related_media = MediaItemRelated.objects.filter(item=item)
check_related_media(related_media)
revisions = Revision.objects.filter(element_type='item', element_id=item.id).order_by('-time')
class ItemSoundListView(ItemListView):
queryset = MediaItem.objects.sound().order_by('code', 'old_code')
-
'related_media': related_media, 'parents': parents, 'playlists': playlists,
'last_revision': last_revision })
- @jsonrpc_method('telemeta.change_fonds')
- @jsonrpc_method('telemeta.change_corpus')
def edit(self, request, type, public_id, template='telemeta/resource_edit.html'):
self.setup(type)
resource = self.model.objects.get(code=public_id)
form = self.form(instance=resource)
return render(request, template, {'resource': resource, 'type': type, 'form': form,})
- @jsonrpc_method('telemeta.add_fonds')
- @jsonrpc_method('telemeta.add_corpus')
def add(self, request, type, template='telemeta/resource_add.html'):
self.setup(type)
resource = self.model()
form = self.form(instance=resource)
return render(request, template, {'resource': resource, 'type': type, 'form': form,})
- @jsonrpc_method('telemeta.add_fonds')
- @jsonrpc_method('telemeta.add_corpus')
def copy(self, request, type, public_id, template='telemeta/resource_edit.html'):
self.setup(type)
if request.method == 'POST':
context = RequestContext(request, {'resource': resource, 'host': request.META['HTTP_HOST']})
return HttpResponse(template.render(context), mimetype=mimetype)
- @jsonrpc_method('telemeta.del_fonds')
- @jsonrpc_method('telemeta.del_corpus')
def delete(self, request, type, public_id):
self.setup(type)
resource = self.model.objects.get(code=public_id)
'related': MediaCorpusRelated,
'related_form': MediaCorpusRelatedForm,
'parent': MediaFonds,
+ 'inlines': [CorpusRelatedInline,]
},
'fonds':
{'model': MediaFonds,
'related': MediaFondsRelated,
'related_form': MediaFondsRelatedForm,
'parent': None,
+ 'inlines': [FondsRelatedInline,]
}
}
def setup(self, type):
self.model = self.types[type]['model']
self.form = self.types[type]['form']
+ self.form_class = self.types[type]['form']
self.related = self.types[type]['related']
self.related_form = self.types[type]['related_form']
self.parent = self.types[type]['parent']
+ self.inlines = self.types[type]['inlines']
self.type = type
def get_object(self):
class ResourceSingleMixin(ResourceMixin):
+ def get_queryset(self):
+ self.type = self.kwargs['type']
+ self.setup(self.type)
+ return self
+
def get_object(self):
# super(CorpusDetailView, self).get_object()
self.type = self.kwargs['type']
resource = self.get_object()
related_media = self.related.objects.filter(resource=resource)
check_related_media(related_media)
- playlists = get_playlists(self.request)
+ playlists = get_playlists_names(self.request)
revisions = Revision.objects.filter(element_type=self.type, element_id=self.pk).order_by('-time')
context['resource'] = resource
context['type'] = self.type
def get_success_url(self):
return reverse_lazy('telemeta-resource-list', kwargs={'type':self.kwargs['type']})
+
+
+class ResourceFormSetView(ResourceSingleMixin, UpdateWithInlinesView):
+
+ template_name = 'telemeta/resource_edit2.html'
+
+ def get_success_url(self):
+ return reverse_lazy('telemeta-resource-detail', kwargs={'type':self.kwargs['type'], 'public_id':self.kwargs['public_id']})
dir=/home/$USER/dev/$app/doc/
server="angus.parisson.com"
-epydoc -n $app -u https://github.com/yomguy/DeeFuzzer -o $dir $app/
-rsync -a --delete $dir $server:/var/www/files/doc/$app/
+epydoc -n $app -u https://github.com/yomguy/Telemeta -o $dir $app/
+rsync -a $dir $server:/var/www/files/doc/$app/