From 77469e83bbb197f6a62e488d26daeac705c8a2b7 Mon Sep 17 00:00:00 2001 From: olivier <> Date: Mon, 23 Apr 2007 13:37:06 +0000 Subject: [PATCH] web interface: added quick search and fixed export download --- telemeta/css/style.css | 29 +++++++++++++++++++++---- telemeta/models.py | 21 +++++++++++++++++- telemeta/templates/base.html | 12 +++++++++-- telemeta/templates/index.html | 13 ----------- telemeta/templates/search_results.html | 30 ++++++++++++++++++++++++++ telemeta/urls.py | 3 +++ telemeta/views/web.py | 17 ++++++++++++++- 7 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 telemeta/templates/search_results.html diff --git a/telemeta/css/style.css b/telemeta/css/style.css index 5b3036fa..e7d75b60 100644 --- a/telemeta/css/style.css +++ b/telemeta/css/style.css @@ -1,26 +1,34 @@ body { font-family: Verdana; - font-size: 11px; + font-size: 80%; } #header { - font-size: 16px; + font-size: 140%; border-bottom: solid 1px black; font-weight: bold; + padding-bottom: 0.8em; + padding-top: 1em; +} +#header a { + color: black; + text-decoration: none; } +/* label { width: 20ex; display: block; float: left; } - input { - margin-bottom: 4px; + margin-bottom: 1ex; } +*/ #menu { text-align: right; + clear: right; } #menu a:link, #menu a:visited { @@ -36,3 +44,16 @@ input { #menu a { } + +#quick_search { + float: right; + font-size: 80%; +} + +#quick_search input { + vertical-align: middle; + font-size: 80%; +} + +#quick_search_pattern { +} diff --git a/telemeta/models.py b/telemeta/models.py index ae202810..0a3b893d 100644 --- a/telemeta/models.py +++ b/telemeta/models.py @@ -1,5 +1,6 @@ import telemeta from django.db import models +from django.db.models import Q from telemeta.core import * class MediaModel(Component): @@ -18,6 +19,13 @@ class MediaCore: fields_dict[field.name] = getattr(self, field.name) return fields_dict +class MediaCollectionManager(models.Manager): + def quick_search(self, pattern): + return super(MediaCollectionManager, self).get_query_set().filter( + Q(title__icontains=pattern) | + Q(description__icontains=pattern) + ) + class MediaCollection(models.Model, MediaCore): "Group related media items" @@ -35,6 +43,8 @@ class MediaCollection(models.Model, MediaCore): source = models.CharField(maxlength=250, blank=True) subject = models.CharField(maxlength=250, blank=True) + objects = MediaCollectionManager() + def __str__(self): return self.title @@ -45,7 +55,14 @@ class MediaCollection(models.Model, MediaCore): class Admin: pass - +class MediaItemManager(models.Manager): + def quick_search(self, pattern): + return super(MediaItemManager, self).get_query_set().filter( + Q(title__icontains=pattern) | + Q(creator__icontains=pattern) | + Q(identifier__icontains=pattern) | + Q(description__icontains=pattern) + ) class MediaItem(models.Model, MediaCore): "Describe a item with metadata" @@ -68,6 +85,8 @@ class MediaItem(models.Model, MediaCore): source = models.CharField(maxlength=250, blank=True) duration = models.FloatField(max_digits=11, decimal_places=3, null=True, blank=True) + objects = MediaItemManager() + def __str__(self): return self.title diff --git a/telemeta/templates/base.html b/telemeta/templates/base.html index f69b266e..6c61ed28 100644 --- a/telemeta/templates/base.html +++ b/telemeta/templates/base.html @@ -2,11 +2,19 @@ {% block content %}{% endblock %} diff --git a/telemeta/templates/index.html b/telemeta/templates/index.html index 47858bc7..e48212a8 100644 --- a/telemeta/templates/index.html +++ b/telemeta/templates/index.html @@ -1,17 +1,4 @@ {% extends "base.html" %} {% block content %} -

Media items

-{% if object_list %} - -{% else %} -

No media item available.

-{% endif %} {% endblock %} diff --git a/telemeta/templates/search_results.html b/telemeta/templates/search_results.html new file mode 100644 index 00000000..5bf9c113 --- /dev/null +++ b/telemeta/templates/search_results.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} + +{% block content %} +

Search: {{ pattern }}

+{% if collections %} +

Collections

+ +{% endif %} +{% if items %} +

Items

+ +{% endif %} +{% if not collections and not items %} +No result +{% endif %} +{% endblock %} diff --git a/telemeta/urls.py b/telemeta/urls.py index 8ca6fa4e..09b36cbc 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -25,6 +25,9 @@ urlpatterns = patterns('', 'django.views.generic.list_detail.object_detail', dict(all_collections, template_name="collection_detail.html")), + (r'^search/$', + 'telemeta.views.web.quick_search'), + # CSS (FIXME: for developement only) (r'^css/(?P.*)$', 'django.views.static.serve', {'document_root': './telemeta/css'}), diff --git a/telemeta/views/web.py b/telemeta/views/web.py index a4ff71e9..7b733db0 100644 --- a/telemeta/views/web.py +++ b/telemeta/views/web.py @@ -4,6 +4,7 @@ from django.template import Context, loader from django.http import HttpResponse from django.http import Http404 from telemeta.models import MediaItem +from telemeta.models import MediaCollection from django.shortcuts import render_to_response import re from telemeta.core import * @@ -67,12 +68,26 @@ class WebView(Component): outfile = exporter.process(item.id, infile, metadata, []) - return HttpResponse(self.file_stream(outfile), mimetype = mime_type) + response = HttpResponse(self.file_stream(outfile), mimetype = mime_type) + response['Content-Disposition'] = 'attachment; filename="download.' + \ + exporter.get_file_extension() + '"' + return response + + def quick_search(self, request): + pattern = request.REQUEST["pattern"] + collections = MediaCollection.objects.quick_search(pattern) + items = MediaItem.objects.quick_search(pattern) + return render_to_response('search_results.html', + {'pattern': pattern, 'collections': collections, + 'items': items}) + + comp_mgr = ComponentManager() view = WebView(comp_mgr) item_detail = view.item_detail item_export = view.item_export +quick_search = view.quick_search def media_item_edit(request, media_item_id): "Provide MediaItem object edition" -- 2.39.5