]> git.parisson.com Git - telemeta.git/commitdiff
add MediaItemRelatedFile model and forms to handle media item attachements
authoryomguy <yomguy@parisson.com>
Thu, 3 Nov 2011 17:04:29 +0000 (18:04 +0100)
committeryomguy <yomguy@parisson.com>
Thu, 3 Nov 2011 17:04:29 +0000 (18:04 +0100)
telemeta/admin.py
telemeta/models/media.py
telemeta/templates/telemeta/mediaitem_related_edit.html [new file with mode: 0644]
telemeta/templates/telemeta_default/mediaitem_detail.html
telemeta/templates/telemeta_default/mediaitem_related_edit.html [new file with mode: 0644]
telemeta/templatetags/telemeta_utils.py
telemeta/urls.py
telemeta/web/base.py

index bda90d9a62eff9e1c1b2f4a01bbd207b2c8ff5d3..2366969073c5e2f9950f86345838dd09017ca89e 100644 (file)
@@ -13,6 +13,10 @@ class MediaItemAdmin(admin.ModelAdmin):
     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']
@@ -48,6 +52,7 @@ class LocationRelationAdmin(admin.ModelAdmin):
 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)
index b20d7caa0fe3c00eb2f2a4008aa9020f8d71e904..ba12483d52760545a37c6ed66cfc792646b39d6e 100644 (file)
@@ -42,6 +42,7 @@ from telemeta.models.core import *
 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 *
@@ -319,18 +320,62 @@ class MediaItem(MediaResource):
             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"
@@ -464,8 +509,8 @@ class MediaItemTranscodingFlag(ModelCore):
     
     class Meta(MetaCore):
         db_table = 'media_transcoding'
-
-
+        
+        
 class Search(ModelCore):
     "Keywork search"
     
diff --git a/telemeta/templates/telemeta/mediaitem_related_edit.html b/telemeta/templates/telemeta/mediaitem_related_edit.html
new file mode 100644 (file)
index 0000000..6b318a9
--- /dev/null
@@ -0,0 +1 @@
+{% extends "telemeta_default/mediaitem_related_edit.html" %}
index 02117338364f4cae0662f5c053b104feba98d17d..e5b6c10db9dc8f1a2c2803a22500e1858fdf8c9d 100644 (file)
     {% 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 %}
diff --git a/telemeta/templates/telemeta_default/mediaitem_related_edit.html b/telemeta/templates/telemeta_default/mediaitem_related_edit.html
new file mode 100644 (file)
index 0000000..8a08f80
--- /dev/null
@@ -0,0 +1,49 @@
+{% 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 %}
index 3c678261cd29d3bc50d50b6b559b695a55cc9bdd..30ffe65fc26d8b396ed2331597ec4b0551974ff8 100644 (file)
@@ -12,6 +12,7 @@ from django.utils.encoding import smart_str, force_unicode
 from django.utils.safestring import mark_safe
 from django import db
 import re
+import os
 import datetime
 from django.conf import settings
 
@@ -319,3 +320,7 @@ def to_string(list):
         return list[0].encode('utf-8')
     else:
         return ''
+
+@register.filter
+def get_filename(file):
+    return file.path.split(os.sep)[-1]
index 5272a3b025e4cbdd3b546ae5b7117b748c66fcff..b67508cf1f9bf227860e4d7055eb92282037e2bc 100644 (file)
@@ -113,7 +113,8 @@ urlpatterns = patterns('',
     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"),
         
index c85464e5d7e233169a9e85409fff9de0354ec57d..4caca1918276349eaeb2cac5896e47068f70e06b 100644 (file)
@@ -505,13 +505,20 @@ class ItemView(object):
         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'))
@@ -561,6 +568,27 @@ class ItemView(object):
                     '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'):
@@ -710,7 +738,7 @@ class ItemView(object):
                 
         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 = []