diff --git a/media/css/seahub.css b/media/css/seahub.css
index 872f33f416..ece9a0adfa 100644
--- a/media/css/seahub.css
+++ b/media/css/seahub.css
@@ -1915,6 +1915,7 @@ textarea:-moz-placeholder {/* for FF */
height: 30px;
}
+
/* wiki page */
#wiki-area.article {
padding: 0 0;
@@ -1925,3 +1926,55 @@ textarea:-moz-placeholder {/* for FF */
.wiki-page-missing {
color:red;
}
+
+#search-form {
+ float: right;
+ margin-top: 5px;
+ width: 200px;
+ height: 24px;
+ border: 2px solid #CDCDCD;
+ border-color: #9A9A9A #CDCDCD #CDCDCD #9A9A9A;
+ border-radius: 3px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ -ms-border-radius: 3px;
+ -o-border-radius: 3px;
+ box-shadow: 0 0 0 #000,inset 0px 3px 3px #eee;
+ -moz-box-shadow: 0 0 0 #000,inset 0px 3px 3px #eee;
+ -webkit-box-shadow: 0 0 0 #000,inset 0px 3px 3px #eee;
+}
+
+#search-keyword {
+ margin: 0;
+ width: 180px;
+ height: 20px;
+ padding: 2px;
+ padding-left: 18px;
+ font-size: 12px;
+ line-height: 12px;
+ border: 0;
+ outline: 0;
+ background: url('../img/search.png') no-repeat scroll left center;
+}
+
+.search-info {
+ font-size: 16px;
+ border-bottom: 1px solid #8A948F;
+ padding-bottom: 3px;
+}
+
+.search-result-count {
+ font-size: 13px;
+ color: #999;
+ line-height: 35px;
+}
+
+.search-info-keyword {
+ font-size: 18px;
+ font-weight: bold;
+}
+
+.search-results {
+ margin-top: 10px;
+}
+
diff --git a/media/img/search.png b/media/img/search.png
new file mode 100644
index 0000000000..ad1c434937
Binary files /dev/null and b/media/img/search.png differ
diff --git a/search.py b/search.py
new file mode 100644
index 0000000000..8ad26a2f7a
--- /dev/null
+++ b/search.py
@@ -0,0 +1,58 @@
+import settings
+import os
+import stat
+import simplejson as json
+import re
+import tempfile
+import sys
+import urllib
+import urllib2
+import logging
+import chardet
+from urllib import quote
+from django.core.cache import cache
+from django.core.urlresolvers import reverse
+from django.core.mail import send_mail
+from django.contrib import messages
+from django.contrib.sites.models import Site, RequestSite
+from django.db import IntegrityError
+from django.db.models import F
+from django.http import HttpResponse, HttpResponseBadRequest, Http404, \
+ HttpResponseRedirect
+from django.shortcuts import render_to_response, redirect
+from django.template import Context, loader, RequestContext
+from django.template.loader import render_to_string
+from django.utils.hashcompat import md5_constructor
+from django.utils.translation import ugettext as _
+from django.views.generic.base import TemplateView, TemplateResponseMixin
+from django.views.generic.edit import BaseFormView, FormMixin
+
+from auth.decorators import login_required
+
+from seahub.utils import search_file_by_name
+
+@login_required
+def search(request):
+ keyword = request.GET['keyword']
+ current_page = int(request.GET.get('page', '1'))
+ per_page= int(request.GET.get('per_page', '25'))
+
+ start = (current_page - 1) * per_page
+ size = per_page
+ results, total = search_file_by_name(request, keyword, start, size)
+
+ if total > current_page * per_page:
+ has_more = True
+ else:
+ has_more = False
+
+ return render_to_response('search_results.html', {
+ 'keyword': keyword,
+ 'results': results,
+ 'total': total,
+ 'has_more': has_more,
+ 'current_page': current_page,
+ 'prev_page': current_page - 1,
+ 'next_page': current_page + 1,
+ 'per_page': per_page,
+ }, context_instance=RequestContext(request))
\ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index 546583ff24..6138733c71 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -86,6 +86,12 @@
{% block nav %}{% endblock %}
+
+ {% if request.user.is_authenticated %}
+
+ {% trans 'Search results for' %} "{{ keyword }}" +
+{% if not results %} ++ {% trans 'No search result found' %} +
+{% else %} +{% trans 'Found' %} {{ total }} {% trans 'results' %}
++ | {% trans 'Name' %} | +{% trans 'Library' %} | +{% trans 'Owner' %} | +
---|---|---|---|
+ |
+ + {{ file.name }} + ({{ file.score }}) + | ++ {{ file.repo.name }} + | ++ {% avatar file.repo.owner 20 %} + {{ file.repo.owner|email2nickname }} + | +