Commit 108cddfac4cf4bce998c31de836856e2710cac47

Authored by Zambom
1 parent 3d05b2c1

Adding manage users page

amadeus/templates/base.html
... ... @@ -107,10 +107,8 @@
107 107 <li title data-original-title="{% trans 'settings' %}">
108 108 <a href="" data-toggle="dropdown"><i class="fa fa-cog" aria-hidden="true"></i></a>
109 109 <ul class="dropdown-menu pull-right">
110   - <li><a href="#">{% trans 'Perfil' %}</a></li>
111   - <li><a href="#">{% trans 'Edit Profile' %}</a></li>
112   - <li><a href="#">{% trans 'Change password' %}</a></li>
113   - <li><a href="#">{% trans 'Remove account' %}</a></li>
  110 + <li><a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>
  111 + <li><a href="#">{% trans 'Manage Courses' %}</a></li>
114 112 </ul>
115 113 </li>
116 114 <li>
... ...
users/templates/list_users.html
... ... @@ -1,95 +0,0 @@
1   -{% extends 'home.html' %}
2   -
3   -{% load i18n pagination django_bootstrap_breadcrumbs permission_tags static %}
4   -
5   -{% block breadcrumbs %}
6   -
7   - {{ block.super }}
8   - {% breadcrumb 'Manage Users' 'users:manage' %}
9   -
10   -{% endblock %}
11   -
12   -{% block menu %}
13   -{% endblock %}
14   -
15   -{% block content %}
16   - {% if messages %}
17   - {% for message in messages %}
18   - <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
19   - <button type="button" class="close" data-dismiss="alert" aria-label="Close">
20   - <span aria-hidden="true">&times;</span>
21   - </button>
22   - <p>{{ message }}</p>
23   - </div>
24   - {% endfor %}
25   - {% endif %}
26   - <form action="" method="GET" class="form-horizontal">
27   - <div class="form-group">
28   - <div class="col-md-11 col-sm-11 col-xs-11">
29   - <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" />
30   - </div>
31   - <div class="col-md-1 col-sm-1 col-xs-1">
32   - <button type="submit" class="btn btn-fab btn-fab-mini">
33   - <i class="material-icons">search</i>
34   - </button>
35   - </div>
36   - </div>
37   - </form>
38   -
39   - {% if users|length > 0 %}
40   - {% for acc in users %}
41   - <div class="row panel panel-default">
42   - <div class="panel-body">
43   - <div class="col-md-4">
44   - {% if acc.image %}
45   - <div style="background-image: url('{{ acc.image.url }}'); background-size: 100% 100%; background-repeat: no-repeat;" alt="photoUser" class="img-circle img-responsive img-list-user"></div>
46   - {% else %}
47   - {% if acc.gender == 'M' %}
48   - <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user">
49   - {% else %}
50   - <img src="{% static 'img/female_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user">
51   - {% endif %}
52   - {% endif %}
53   - </div>
54   - <div class="col-md-8">
55   - <p>{% trans 'Name' %}: {{ acc.name }}</p>
56   - <p>{% trans 'Profile' %}: {{ acc.get_type_profile_display }}</p>
57   - <p>{% trans 'Email' %}: {{ acc.email }}</p>
58   - <p>{% trans 'Contact' %}: {{ acc.phone }}</p>
59   - <div align="right">
60   - <a href="{% url 'users:update' acc.username %}" class="btn btn-raised btn-success">{% trans 'Edit' %}</a>
61   - <a href="javascript:void(0)" class="btn btn-default btn-raised btn-lg" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}">{% trans 'Delete' %}</a>
62   - </div>
63   - </div>
64   -
65   -
66   - <!-- Modal -->
67   - <div class="modal fade" id="DeleteModal{{ forloop.counter }}" tabindex="-1" role="dialog" aria-labelledby="DeleteModalLabel">
68   - <div class="modal-dialog" role="document">
69   - <div class="modal-content">
70   - <div class="modal-header">
71   - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
72   - <h4 class="modal-title" id="DeleteModalLabel">{% trans 'Confirm delete' %}</h4>
73   - </div>
74   - <div class="modal-body">
75   - {% trans 'Are you sure you want to delete the user' %} <b>{{acc.name}}</b>?
76   - </div>
77   - <div class="modal-footer">
78   - <a href="#" class="btn btn-raised btn-default" data-dismiss="modal">{% trans 'Cancel' %}</a>
79   - <a href="{% url 'users:delete' acc.username %}" class="btn btn-raised btn-success" style="margin-top: 0">{% trans 'Delete' %}</a>
80   - </div>
81   - </div>
82   - </div>
83   - </div>
84   - </div>
85   - </div>
86   - {% endfor %}
87   - {% pagination request paginator page_obj %}
88   - {% else %}
89   - <div class="row">
90   - <div class="col-md-12 col-sm-12 col-xs-12">
91   - <p>{% trans 'No users found' %}</p>
92   - </div>
93   - </div>
94   - {% endif %}
95   -{% endblock %}
users/templates/users/list.html 0 → 100644
... ... @@ -0,0 +1,67 @@
  1 +{% extends 'base.html' %}
  2 +
  3 +{% load i18n django_bootstrap_breadcrumbs permission_tags static %}
  4 +
  5 +{% block breadcrumbs %}
  6 + {{ block.super }}
  7 + {% breadcrumb 'Manage Users' 'users:manage' %}
  8 +{% endblock %}
  9 +
  10 +{% block menu %}
  11 +{% endblock %}
  12 +
  13 +{% block content %}
  14 + {% if messages %}
  15 + {% for message in messages %}
  16 + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
  17 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  18 + <span aria-hidden="true">&times;</span>
  19 + </button>
  20 + <p>{{ message }}</p>
  21 + </div>
  22 + {% endfor %}
  23 + {% endif %}
  24 + <form action="" method="GET" class="form-horizontal">
  25 + <div class="form-group">
  26 + <div class="col-md-11 col-sm-11 col-xs-11">
  27 + <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" />
  28 + </div>
  29 + <div class="col-md-1 col-sm-1 col-xs-1">
  30 + <button type="submit" class="btn btn-fab btn-fab-mini">
  31 + <i class="material-icons">search</i>
  32 + </button>
  33 + </div>
  34 + </div>
  35 + </form>
  36 +
  37 + {% if users %}
  38 + {% for acc in users %}
  39 + <div class="row-fluid panel panel-default">
  40 + <div class="panel-body">
  41 + <div class="col-md-3">
  42 + <span class="thumbnail">
  43 + <img src="{{ acc.image_url }}" class="img-responsive" />
  44 + </span>
  45 + </div>
  46 + <div class="col-md-6">
  47 + <p><b>{% trans 'Name' %}:</b> {{ acc }}</p>
  48 + <p><b>{% trans 'Email' %}:</b> {{ acc.email }}</p>
  49 + <p><b>{% trans 'Description' %}:</b> {{ acc.description|truncatechars:100|default:_("Not Informed") }}</p>
  50 + </div>
  51 + <div class="col-md-3">
  52 + <div align="right">
  53 + <a href="#" class="btn btn-primary btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a>
  54 + <a href="javascript:void(0)" class="btn btn-default btn-raised btn-sm" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
  55 + </div>
  56 + </div>
  57 + </div>
  58 + </div>
  59 + {% endfor %}
  60 + {% else %}
  61 + <div class="row">
  62 + <div class="col-md-12 col-sm-12 col-xs-12">
  63 + <p>{% trans 'No users found' %}</p>
  64 + </div>
  65 + </div>
  66 + {% endif %}
  67 +{% endblock %}
... ...
users/urls.py
... ... @@ -7,6 +7,7 @@ urlpatterns = [
7 7 url(r'^login/$', views.login, name='login'),
8 8 url(r'^logout/$', auth_views.logout, {'next_page': 'users:login'}, name='logout'),
9 9 url(r'^signup/$', views.RegisterUser.as_view(), name = 'signup'),
  10 + url(r'^$', views.UsersListView.as_view(), name = 'manage'),
10 11 url(r'^profile/$', views.Profile.as_view(), name = 'profile'),
11 12 url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'),
12 13 ]
... ...
users/views.py
... ... @@ -22,29 +22,7 @@ from .serializers import UserSerializer
22 22 from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly
23 23  
24 24 # ================ ADMIN =======================
25   -# class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
26 25  
27   -# allowed_roles = ['system_admin']
28   -# #login_url = reverse_lazy("core:home")
29   -# redirect_field_name = 'next'
30   -# template_name = 'list_users.html'
31   -# context_object_name = 'users'
32   -# paginate_by = 10
33   -
34   -# def get_queryset(self):
35   -# search = self.request.GET.get('search', None)
36   -
37   -# if search is None:
38   -# users = User.objects.all().order_by('name').exclude( username = self.request.user.username)
39   -# else:
40   -# users = User.objects.filter(Q(username = search) | Q(name = search) | Q(name__icontains = search) | Q(username__icontains = search)).exclude( username = self.request.user.username)
41   -
42   -# return users
43   -
44   -# def get_context_data (self, **kwargs):
45   -# context = super(UsersListView, self).get_context_data(**kwargs)
46   -# context['title'] = 'Manage Users'
47   -# return context
48 26  
49 27 # class Create(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView):
50 28  
... ... @@ -182,6 +160,27 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl
182 160  
183 161 # return context
184 162  
  163 +class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
  164 + login_url = reverse_lazy("users:login")
  165 + redirect_field_name = 'next'
  166 +
  167 + allowed_roles = ['system_admin']
  168 +
  169 + template_name = 'users/list.html'
  170 + context_object_name = 'users'
  171 + paginate_by = 10
  172 +
  173 + def get_queryset(self):
  174 + users = User.objects.all().order_by('social_name','username').exclude(email = self.request.user.email)
  175 +
  176 + return users
  177 +
  178 + def get_context_data (self, **kwargs):
  179 + context = super(UsersListView, self).get_context_data(**kwargs)
  180 + context['title'] = _('Manage Users')
  181 +
  182 + return context
  183 +
185 184 class Profile(LoginRequiredMixin, generic.DetailView):
186 185 login_url = reverse_lazy("users:login")
187 186 redirect_field_name = 'next'
... ...