ordering = ['code']
exclude = ('copied_from_item', )
+class MediaItemRelatedFileAdmin(admin.ModelAdmin):
+ search_fields = ['title', 'code']
+ ordering = ['code']
+
class MediaPartAdmin(admin.ModelAdmin):
search_fields = ['title', 'item__code']
ordering = ['title']
admin.site.register(MediaCollection, MediaCollectionAdmin)
admin.site.register(MediaItem, MediaItemAdmin)
admin.site.register(MediaPart, MediaPartAdmin)
+admin.site.register(MediaItemRelatedFile, MediaItemRelatedFileAdmin)
admin.site.register(Instrument, InstrumentAdmin)
admin.site.register(InstrumentAlias, InstrumentAliasAdmin)
from telemeta.models.enum import ContextKeyword
from telemeta.util.unaccent import unaccent_icmp
import re
+import mimetypes
from telemeta.models.location import LocationRelation, Location
from telemeta.models.system import Revision
from telemeta.models.query import *
title = self.title
else:
title = unicode(self.collection)
-
if self.track:
title += ' ' + self.track
-
return title
-
class MediaItemForm(ModelForm):
class Meta:
model = MediaItem
def clean_code(self):
return self.cleaned_data['code'] or None
+
+
+class MediaItemRelatedFile(MediaResource):
+ "Item related attached file"
+
+ element_type = 'media'
+
+ item = ForeignKey('MediaItem', related_name="related", verbose_name=_('item'))
+ code = CharField(_('code'), unique=True, blank=True)
+ title = CharField(_('title'))
+ date = DateTimeField(_('date'), auto_now=True)
+ description = TextField(_('description'))
+ author = ForeignKey(User, related_name="related", verbose_name=_('author'))
+ mime_type = CharField(_('mime_type'), blank=True)
+ file = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename")
+
+ @property
+ def public_id(self):
+ if self.code:
+ return self.code
+ return self.id
+
+ def is_image(self):
+ return 'image' in self.mime_type
+
+ def save(self, force_insert=False, force_update=False):
+ super(MediaItemRelatedFile, self).save(force_insert, force_update)
+
+ def set_mime_type(self):
+ if self.file:
+ self.mime_type = mimetypes.guess_type(self.file.path)[0]
+
+ def __unicode__(self):
+ if self.title and not re.match('^ *N *$', self.title):
+ title = self.title
+ else:
+ title = unicode(self.item)
+ return title
+
+ class Meta(MetaCore):
+ db_table = 'media_item_related_file'
+
+class MediaItemRelatedFileForm(ModelForm):
+ class Meta:
+ model = MediaItemRelatedFile
+ def clean_code(self):
+ return self.cleaned_data['code'] or None
class MediaItemKeyword(ModelCore):
"Item keyword"
class Meta(MetaCore):
db_table = 'media_transcoding'
-
-
+
+
class Search(ModelCore):
"Keywork search"
--- /dev/null
+{% extends "telemeta_default/mediaitem_related_edit.html" %}
{% endblock infos %}
</div> <!-- with-rightcol -->
+<div class="infos">
+ {% block related_files %}
+ <div>
+ <h4><a href="#">{% trans "Related files" %}</a></h4>
+ {% if related_files %}
+ <div class="instruments">
+ <table class="instruments">
+ <thead>
+ <tr>
+ <td>{% field_label "MediaItemRelatedFile" "file" %}</td>
+ <td>{% field_label "MediaItemRelatedFile" "title" %}</td>
+ <td>{% field_label "MediaItemRelatedFile" "mime type" %}</td>
+ <td>{% field_label "MediaItemRelatedFile" "author" %}</td>
+ <td>{% field_label "MediaItemRelatedFile" "preview" %}</td>
+ </tr>
+ </thead>
+ <tbody>
+ {% for file in related_files %}
+ <tr>
+ <td><a href="{% url telemeta-item-related-file item.public_id file.id %}">{% if file.file %}{{ file.file|get_filename }}{% endif %}</a></td>
+ <td>{{ file.title }}</td>
+ <td>{{ file.mime_type }}</td>
+ <td>{{ file.author }}</td>
+ <td>{% if file.is_image %}<a href="{% url telemeta-item-related-file item.public_id file.id %}"><img src="{% url telemeta-item-related-file item.public_id file.id %}" style="width: 400px;" /></a>{% else %}<a href="{% url telemeta-item-related-file item.public_id file.id %}">link</a>{% endif %}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ {% if user.is_authenticated and perms.telemeta.change_mediaitem %}
+ <a href="{% url telemeta-item-related_edit item.public_id %}" class="component_icon button icon_edit">{% trans "Edit"%} {% trans "related"%}</a>
+ {% endif %}
+ </div>
+ {% endif %}
+ </div>
+ {% endblock related_files %}
+ </div>
+
{% endblock %}
{% block delete %}
--- /dev/null
+{% extends "telemeta/mediaitem_detail.html" %}
+{% load i18n %}
+{% load telemeta_utils %}
+
+{% block extra_javascript %}{% endblock %}
+
+{% block title %}
+ <img src="{% url telemeta-images "item.png" %}" style="vertical-align:middle" /> Item : {{ item }}
+{% endblock %}
+
+{% block title_buttons %}
+ <a href="{% url telemeta-item-detail item.public_id %}" class="component_icon button icon_cancel">{% trans "Cancel" %}</a>
+{% endblock %}
+
+{% block content %}
+ {% block infos %}
+ <div class="infos">
+ <form enctype="multipart/form-data" method="post" id="_editMediaItemRelatedFileForm" action="">{% csrf_token %}
+
+ {{ formset.management_form }}
+ {% for form in formset.forms %}
+ <table>
+ <tr><td><b>{% trans "File" %} :</b><td></td></tr>
+ {% for field in form %}
+ <tr>
+ {% if not "media_item" in field.html_name %}
+ {% if "id" in field.html_name or "item" in field.html_name %}
+ <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+ {% else %}
+ <td>{{ field.label_tag }}: </td><td>{{ field }}</td>
+ {% endif %}
+ {% else %}
+ <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </table>
+ <br />
+ {% endfor %}
+ <div align="center">
+ <a href="{% url telemeta-item-detail item.public_id %}"
+ class="component_icon button icon_cancel">{% trans "Cancel" %}</a>
+ <a href="#" class="component_icon button icon_save"
+ onclick="document.getElementById('_editMediaItemRelatedFileForm').submit(); return false;">{% trans "Save" %}</a>
+ </div>
+ </form>
+ </div>
+ {% endblock infos %}
+{% endblock content %}
from django.utils.safestring import mark_safe
from django import db
import re
+import os
import datetime
from django.conf import settings
return list[0].encode('utf-8')
else:
return ''
+
+@register.filter
+def get_filename(file):
+ return file.path.split(os.sep)[-1]
url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/keywords/$', item_view.item_keywords_edit,
dict(template='telemeta/mediaitem_keywords_edit.html'), name="telemeta-item-keywords_edit"),
url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/delete/$', item_view.item_delete, name="telemeta-item-delete"),
-
+ url(r'^items/(?P<item_public_id>[A-Za-z0-9._-]+)/related/(?P<file_id>[A-Za-z0-9._-]+)$', item_view.related_file_stream, name="telemeta-item-related-file"),
+ url(r'^items/(?P<public_id>[A-Za-z0-9._-]+)/related_edit/$', item_view.related_file_edit, dict(template='telemeta/mediaitem_related_edit.html'), name="telemeta-item-related_edit"),
# Markers
url(r'^markers/(?P<marker_id>[A-Za-z0-9]+)/$', item_view.item_detail, name="telemeta-item-detail-marker"),
playlists = get_playlists(request)
public_access = get_public_access(item.public_access, str(item.recorded_from_date).split('-')[0],
str(item.recorded_to_date).split('-')[0])
-
+
+ related_files = MediaItemRelatedFile.objects.filter(item=item)
+ for file in related_files:
+ if not file.mime_type:
+ file.set_mime_type()
+ file.save()
+
return render(request, template,
{'item': item, 'export_formats': formats,
'visualizers': graphers, 'visualizer_id': grapher_id,
'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True),
'previous' : previous, 'next' : next, 'marker': marker_id, 'playlists' : playlists,
'public_access': public_access, 'width': width, 'height': height,
+ 'related_files': related_files,
})
@method_decorator(permission_required('telemeta.change_mediaitem'))
'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True), "form": form,
'previous' : previous, 'next' : next,
})
+
+ def related_file_stream(self, request, item_public_id, file_id):
+ item = MediaItem.objects.get(public_id=item_public_id)
+ file = MediaItemRelatedFile.objects.get(item=item, id=file_id)
+ response = HttpResponse(stream_from_file(file.file.path), mimetype=file.mime_type)
+# response['Content-Disposition'] = 'attachment'
+ return response
+
+ @method_decorator(permission_required('telemeta.change_mediaitem'))
+ def related_file_edit(self, request, public_id, template):
+ item = MediaItem.objects.get(public_id=public_id)
+ MediaItemRelatedFileFormSet = inlineformset_factory(MediaItem, MediaItemRelatedFile, form=MediaItemRelatedFileForm)
+ if request.method == 'POST':
+ formset = MediaItemRelatedFileFormSet(data=request.POST, files=request.FILES, instance=item)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect('/items/'+public_id)
+ else:
+ formset = MediaItemRelatedFileFormSet(instance=item)
+
+ return render(request, template, {'item': item, 'formset': formset,})
@method_decorator(permission_required('telemeta.add_mediaitem'))
def item_add(self, request, public_id=None, template='telemeta/mediaitem_add.html'):
response = HttpResponse(self.cache_data.read_stream_bin(image_file), mimetype=mime_type)
return response
-
+
def list_export_extensions(self):
"Return the recognized item export file extensions, as a list"
list = []