Commit dc999beebf7488fab143cfc9e33d3b10ed12539f

Authored by Zambom
1 parent fabdadcb

Adding user's search

users/templates/users/list.html
... ... @@ -24,7 +24,7 @@
24 24  
25 25 <div class="row">
26 26 <div class="col-md-9">
27   - <form action="" method="GET" class="form-horizontal">
  27 + <form action="{% url 'users:search' %}" method="GET" class="form-horizontal">
28 28 <div class="form-group">
29 29 <div class="col-md-11 col-sm-11 col-xs-11">
30 30 <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" />
... ...
users/templates/users/search.html 0 → 100644
... ... @@ -0,0 +1,71 @@
  1 +{% extends 'users/list.html' %}
  2 +
  3 +{% load i18n pagination django_bootstrap_breadcrumbs permission_tags static %}
  4 +
  5 +{% block breadcrumbs %}
  6 + {{ block.super }}
  7 + {% with 'Search for "'|add:search|add:'"' as search_bread %}
  8 + {% breadcrumb search_bread 'users:search' %}
  9 + {% endwith %}
  10 +{% endblock %}
  11 +
  12 +{% block menu %}
  13 +{% endblock %}
  14 +
  15 +{% block content %}
  16 + <div class="row">
  17 + <div class="col-md-9">
  18 + <form action="{% url 'users:search' %}" method="GET" class="form-horizontal">
  19 + <div class="form-group">
  20 + <div class="col-md-11 col-sm-11 col-xs-11">
  21 + <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" />
  22 + </div>
  23 + <div class="col-md-1 col-sm-1 col-xs-1">
  24 + <button type="submit" class="btn btn-fab btn-fab-mini">
  25 + <i class="fa fa-search"></i>
  26 + </button>
  27 + </div>
  28 + </div>
  29 + </form>
  30 + </div>
  31 + <div class="col-md-3">
  32 + <a href="{% url 'users:create' %}" class="pull-right btn btn-primary btn-raised btn-md"><i class="fa fa-plus"></i> {% trans 'Create User' %}</a>
  33 + </div>
  34 + </div>
  35 +
  36 + {% if users %}
  37 + {% for acc in users %}
  38 + <div class="row-fluid panel panel-default">
  39 + <div class="panel-body">
  40 + <div class="col-md-3">
  41 + <span class="thumbnail">
  42 + <img src="{{ acc.image_url }}" class="img-responsive" />
  43 + </span>
  44 + </div>
  45 + <div class="col-md-6">
  46 + <p><b>{% trans 'Name' %}:</b> {{ acc }}</p>
  47 + <p><b>{% trans 'Email' %}:</b> {{ acc.email }}</p>
  48 + <p><b>{% trans 'Description' %}:</b>
  49 + {% autoescape off %}
  50 + {{ acc.description|default:_("Not Informed")|striptags|truncatechars:300 }}
  51 + {% endautoescape %}
  52 + </p>
  53 + </div>
  54 + <div class="col-md-3">
  55 + <div align="right">
  56 + <a href="{% url 'users:update' acc.email %}" class="btn btn-primary btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a>
  57 + <a href="{% url 'users:delete' acc.email %}" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
  58 + </div>
  59 + </div>
  60 + </div>
  61 + </div>
  62 + {% endfor %}
  63 + {% pagination request paginator page_obj %}
  64 + {% else %}
  65 + <div class="row">
  66 + <div class="col-md-12 col-sm-12 col-xs-12">
  67 + <p>{% trans 'No users found' %}</p>
  68 + </div>
  69 + </div>
  70 + {% endif %}
  71 +{% endblock %}
... ...
users/urls.py
... ... @@ -11,8 +11,9 @@ urlpatterns = [
11 11 url(r'^reset_password_confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', views.PasswordResetConfirmView.as_view(), name = 'reset_password_confirm'),
12 12 url(r'^$', views.UsersListView.as_view(), name = 'manage'),
13 13 url(r'^create/$', views.CreateView.as_view(), name = 'create'),
14   - url(r'^edit/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.UpdateView.as_view(), name='update'),
15   - url(r'^delete/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.DeleteView.as_view(), name='delete'),
  14 + url(r'^edit/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.UpdateView.as_view(), name = 'update'),
  15 + url(r'^delete/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.DeleteView.as_view(), name = 'delete'),
  16 + url(r'^search/$', views.SearchView.as_view(), name = 'search'),
16 17 url(r'^profile/$', views.Profile.as_view(), name = 'profile'),
17 18 url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'),
18 19 url(r'^change_pass/$', views.ChangePassView.as_view(), name='change_pass'),
... ...
users/views.py
... ... @@ -5,6 +5,7 @@ from django.contrib.auth import authenticate, login as login_user
5 5 from django.contrib.auth.mixins import LoginRequiredMixin
6 6 from django.core.urlresolvers import reverse, reverse_lazy
7 7 from django.utils.translation import ugettext_lazy as _
  8 +from django.db.models import Q
8 9  
9 10 from .models import User
10 11 from .forms import RegisterUserForm, ProfileForm, UserForm, ChangePassForm, PassResetRequest, SetPasswordForm
... ... @@ -42,6 +43,36 @@ class UsersListView(LoginRequiredMixin, generic.ListView):
42 43  
43 44 return context
44 45  
  46 +class SearchView(LoginRequiredMixin, generic.ListView):
  47 + login_url = reverse_lazy("users:login")
  48 + redirect_field_name = 'next'
  49 +
  50 + template_name = 'users/search.html'
  51 + context_object_name = 'users'
  52 + paginate_by = 10
  53 +
  54 + def dispatch(self, request, *args, **kwargs):
  55 + search = self.request.GET.get('search', '')
  56 +
  57 + if search == '':
  58 + return redirect(reverse_lazy('users:manage'))
  59 +
  60 + return super(SearchView, self).dispatch(request, *args, **kwargs)
  61 +
  62 + def get_queryset(self):
  63 + search = self.request.GET.get('search', '')
  64 +
  65 + users = User.objects.filter(Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)).order_by('social_name','username').exclude(email = self.request.user.email)
  66 +
  67 + return users
  68 +
  69 + def get_context_data (self, **kwargs):
  70 + context = super(SearchView, self).get_context_data(**kwargs)
  71 + context['title'] = _('Search Users')
  72 + context['search'] = self.request.GET.get('search')
  73 +
  74 + return context
  75 +
45 76 class CreateView(LoginRequiredMixin, generic.edit.CreateView):
46 77 login_url = reverse_lazy("users:login")
47 78 redirect_field_name = 'next'
... ...