| 1 | |
|---|
| 2 | import telemeta |
|---|
| 3 | from django.template import Context, loader |
|---|
| 4 | from django.http import HttpResponse |
|---|
| 5 | from django.http import Http404 |
|---|
| 6 | from telemeta.models import MediaItem |
|---|
| 7 | from telemeta.models import MediaCollection |
|---|
| 8 | from django.shortcuts import render_to_response |
|---|
| 9 | import re |
|---|
| 10 | from telemeta.core import * |
|---|
| 11 | from telemeta.core import ComponentManager |
|---|
| 12 | from telemeta.export import * |
|---|
| 13 | from django.conf import settings |
|---|
| 14 | import os |
|---|
| 15 | |
|---|
| 16 | def index(request): |
|---|
| 17 | "Render the homepage" |
|---|
| 18 | |
|---|
| 19 | media_items = MediaItem.objects.all() |
|---|
| 20 | template = loader.get_template('index.html') |
|---|
| 21 | context = Context({ |
|---|
| 22 | 'media_items' : media_items, |
|---|
| 23 | }) |
|---|
| 24 | return HttpResponse(template.render(context)) |
|---|
| 25 | |
|---|
| 26 | class WebView(Component): |
|---|
| 27 | |
|---|
| 28 | exporters = ExtensionPoint(IExporter) |
|---|
| 29 | |
|---|
| 30 | def item_detail(self, request, item_id): |
|---|
| 31 | item = MediaItem.objects.get(pk=item_id) |
|---|
| 32 | formats = [] |
|---|
| 33 | for exporter in self.exporters: |
|---|
| 34 | formats.append(exporter.get_format()) |
|---|
| 35 | return render_to_response('mediaitem_detail.html', |
|---|
| 36 | {'item': item, 'export_formats': formats}) |
|---|
| 37 | |
|---|
| 38 | def file_stream(self, filepath): |
|---|
| 39 | buffer_size = 0xFFFF |
|---|
| 40 | f = open(filepath, 'rb') |
|---|
| 41 | chunk = f.read(buffer_size) |
|---|
| 42 | yield chunk |
|---|
| 43 | while chunk: |
|---|
| 44 | chunk = f.read(buffer_size) |
|---|
| 45 | yield chunk |
|---|
| 46 | f.close() |
|---|
| 47 | |
|---|
| 48 | def item_export(self, request, item_id, format): |
|---|
| 49 | for exporter in self.exporters: |
|---|
| 50 | if exporter.get_format() == format: |
|---|
| 51 | break |
|---|
| 52 | |
|---|
| 53 | if exporter.get_format() != format: |
|---|
| 54 | raise Http404 |
|---|
| 55 | |
|---|
| 56 | mime_type = exporter.get_mime_type() |
|---|
| 57 | |
|---|
| 58 | exporter.set_cache_dir(settings.TELEMETA_EXPORT_CACHE_DIR) |
|---|
| 59 | |
|---|
| 60 | item = MediaItem.objects.get(pk=item_id) |
|---|
| 61 | |
|---|
| 62 | infile = settings.MEDIA_ROOT + "/" + item.file |
|---|
| 63 | metadata = item.to_dict() |
|---|
| 64 | metadata['collection'] = str(metadata['collection']) |
|---|
| 65 | metadata['Collection'] = metadata['collection'] |
|---|
| 66 | metadata['Artist'] = metadata['creator'] |
|---|
| 67 | metadata['Title'] = metadata['title'] |
|---|
| 68 | |
|---|
| 69 | outfile = exporter.process(item.id, infile, metadata, []) |
|---|
| 70 | |
|---|
| 71 | response = HttpResponse(self.file_stream(outfile), mimetype = mime_type) |
|---|
| 72 | response['Content-Disposition'] = 'attachment; filename="download.' + \ |
|---|
| 73 | exporter.get_file_extension() + '"' |
|---|
| 74 | return response |
|---|
| 75 | |
|---|
| 76 | def quick_search(self, request): |
|---|
| 77 | pattern = request.REQUEST["pattern"] |
|---|
| 78 | collections = MediaCollection.objects.quick_search(pattern) |
|---|
| 79 | items = MediaItem.objects.quick_search(pattern) |
|---|
| 80 | return render_to_response('search_results.html', |
|---|
| 81 | {'pattern': pattern, 'collections': collections, |
|---|
| 82 | 'items': items}) |
|---|
| 83 | |
|---|
| 84 | |
|---|
| 85 | |
|---|
| 86 | comp_mgr = ComponentManager() |
|---|
| 87 | view = WebView(comp_mgr) |
|---|
| 88 | item_detail = view.item_detail |
|---|
| 89 | item_export = view.item_export |
|---|
| 90 | quick_search = view.quick_search |
|---|
| 91 | |
|---|
| 92 | def media_item_edit(request, media_item_id): |
|---|
| 93 | "Provide MediaItem object edition" |
|---|
| 94 | |
|---|
| 95 | media_item = MediaItem.objects.get(pk=media_item_id) |
|---|
| 96 | dynprops = media_item.get_dynamic_properties() |
|---|
| 97 | return render_to_response('media_item.html', {'media_item': media_item, 'dynprops' : dynprops}) |
|---|
| 98 | |
|---|
| 99 | def media_item_update(request, media_item_id): |
|---|
| 100 | "Handle MediaItem object edition form submission" |
|---|
| 101 | |
|---|
| 102 | media_item = MediaItem.objects.get(pk=media_item_id) |
|---|
| 103 | media_item.author = request.POST['author'] |
|---|
| 104 | media_item.title = request.POST['title'] |
|---|
| 105 | media_item.save() |
|---|
| 106 | |
|---|
| 107 | pattern = re.compile(r'^dynprop_(\d+)$') |
|---|
| 108 | for name, value in request.POST.items(): |
|---|
| 109 | match = pattern.search(name) |
|---|
| 110 | if match: |
|---|
| 111 | prop_id = match.groups()[0] |
|---|
| 112 | prop = MediaItemPropertyDefinition.objects.get(pk=prop_id) |
|---|
| 113 | telemeta.logger.debug("prop_id: " + prop_id + " ; " + "media_item_id: " + |
|---|
| 114 | media_item_id + " ; value: " + value + |
|---|
| 115 | " ; type:" + prop.type) |
|---|
| 116 | media_item = MediaItem.objects.get(pk=media_item_id) |
|---|
| 117 | property, created = MediaItemProperty.objects.get_or_create( |
|---|
| 118 | media_item=media_item, definition=prop) |
|---|
| 119 | |
|---|
| 120 | if prop.type == 'text': |
|---|
| 121 | property.value = value |
|---|
| 122 | else: |
|---|
| 123 | value = int(value) |
|---|
| 124 | |
|---|
| 125 | if value > 0: |
|---|
| 126 | enum_item = MediaItemPropertyEnumerationItem.objects.get(pk=value) |
|---|
| 127 | property.enum_item = enum_item |
|---|
| 128 | else: |
|---|
| 129 | property.enum_item = 0 |
|---|
| 130 | |
|---|
| 131 | property.save() |
|---|
| 132 | |
|---|
| 133 | return media_item_edit(request, media_item_id) |
|---|
| 134 | |
|---|
| 135 | |
|---|
| 136 | |
|---|
| 137 | |
|---|
| 138 | |
|---|