source: telemeta/views/web.py @ 77469e8

cremcrem2devdev2diademsdj1.6feature/breadcrumbsfeature/ts-0.5feature/ts-0.5.4feature/writecacheformagenericinstru_searchlamlam2mapsv3mergenlivemultiproductionrelease/1.4.4sabiodsecurityserversocialstoragetelecastertestvideo
Last change on this file since 77469e8 was 77469e8, checked in by olivier <>, 7 years ago

web interface: added quick search and fixed export download

  • Property mode set to 100644
File size: 4.5 KB
Line 
1
2import telemeta
3from django.template import Context, loader
4from django.http import HttpResponse
5from django.http import Http404
6from telemeta.models import MediaItem
7from telemeta.models import MediaCollection
8from django.shortcuts import render_to_response
9import re
10from telemeta.core import *
11from telemeta.core import ComponentManager
12from telemeta.export import *
13from django.conf import settings
14import os
15
16def 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
26class 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
86comp_mgr = ComponentManager()
87view = WebView(comp_mgr)
88item_detail = view.item_detail
89item_export = view.item_export
90quick_search = view.quick_search
91
92def 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
99def 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   
Note: See TracBrowser for help on using the repository browser.