Commit dc999beebf7488fab143cfc9e33d3b10ed12539f
1 parent
fabdadcb
Exists in
master
and in
3 other branches
Adding user's search
Showing
4 changed files
with
106 additions
and
3 deletions
Show diff stats
users/templates/users/list.html
@@ -24,7 +24,7 @@ | @@ -24,7 +24,7 @@ | ||
24 | 24 | ||
25 | <div class="row"> | 25 | <div class="row"> |
26 | <div class="col-md-9"> | 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 | <div class="form-group"> | 28 | <div class="form-group"> |
29 | <div class="col-md-11 col-sm-11 col-xs-11"> | 29 | <div class="col-md-11 col-sm-11 col-xs-11"> |
30 | <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" /> | 30 | <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" /> |
@@ -0,0 +1,71 @@ | @@ -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,8 +11,9 @@ urlpatterns = [ | ||
11 | url(r'^reset_password_confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', views.PasswordResetConfirmView.as_view(), name = 'reset_password_confirm'), | 11 | url(r'^reset_password_confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', views.PasswordResetConfirmView.as_view(), name = 'reset_password_confirm'), |
12 | url(r'^$', views.UsersListView.as_view(), name = 'manage'), | 12 | url(r'^$', views.UsersListView.as_view(), name = 'manage'), |
13 | url(r'^create/$', views.CreateView.as_view(), name = 'create'), | 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 | url(r'^profile/$', views.Profile.as_view(), name = 'profile'), | 17 | url(r'^profile/$', views.Profile.as_view(), name = 'profile'), |
17 | url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), | 18 | url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), |
18 | url(r'^change_pass/$', views.ChangePassView.as_view(), name='change_pass'), | 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,6 +5,7 @@ from django.contrib.auth import authenticate, login as login_user | ||
5 | from django.contrib.auth.mixins import LoginRequiredMixin | 5 | from django.contrib.auth.mixins import LoginRequiredMixin |
6 | from django.core.urlresolvers import reverse, reverse_lazy | 6 | from django.core.urlresolvers import reverse, reverse_lazy |
7 | from django.utils.translation import ugettext_lazy as _ | 7 | from django.utils.translation import ugettext_lazy as _ |
8 | +from django.db.models import Q | ||
8 | 9 | ||
9 | from .models import User | 10 | from .models import User |
10 | from .forms import RegisterUserForm, ProfileForm, UserForm, ChangePassForm, PassResetRequest, SetPasswordForm | 11 | from .forms import RegisterUserForm, ProfileForm, UserForm, ChangePassForm, PassResetRequest, SetPasswordForm |
@@ -42,6 +43,36 @@ class UsersListView(LoginRequiredMixin, generic.ListView): | @@ -42,6 +43,36 @@ class UsersListView(LoginRequiredMixin, generic.ListView): | ||
42 | 43 | ||
43 | return context | 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 | class CreateView(LoginRequiredMixin, generic.edit.CreateView): | 76 | class CreateView(LoginRequiredMixin, generic.edit.CreateView): |
46 | login_url = reverse_lazy("users:login") | 77 | login_url = reverse_lazy("users:login") |
47 | redirect_field_name = 'next' | 78 | redirect_field_name = 'next' |