Browse Source

Allow managing users in partner dashboard.

master
Maik Hoepfel 12 years ago
parent
commit
e8a220128f

+ 13
- 1
oscar/apps/dashboard/partners/app.py View File

@@ -11,6 +11,10 @@ class PartnersDashboardApplication(Application):
11 11
     create_view = views.PartnerCreateView
12 12
     update_view = views.PartnerUpdateView
13 13
     delete_view = views.PartnerDeleteView
14
+    manage_users_view = views.PartnerManageUsers
15
+    update_user_view = views.PartnerUpdateUserView
16
+    unlink_user_view = views.PartnerUnlinkUserView
17
+    create_user_view = views.PartnerCreateUserView
14 18
 
15 19
     def get_urls(self):
16 20
         urlpatterns = patterns('',
@@ -21,11 +25,19 @@ class PartnersDashboardApplication(Application):
21 25
                 name='partner-update'),
22 26
             url(r'^(?P<pk>\d+)/delete/$', self.delete_view.as_view(),
23 27
                 name='partner-delete'),
28
+            url(r'^(?P<pk>\d+)/manage_users/$', self.manage_users_view.as_view(),
29
+                name='partner-manage-users'),
30
+            url(r'^user/add_for/(?P<partner_pk>\d+)/$', self.create_user_view.as_view(),
31
+                name='partner-create-user'),
32
+            url(r'^user/(?P<pk>\d+)/update/$', self.update_user_view.as_view(),
33
+                name='partner-update-user'),
34
+            url(r'^user/(?P<user_pk>\d+)/unlink_from/(?P<partner_pk>\d+)/$',
35
+                self.unlink_user_view.as_view(), name='partner-unlink-user'),
36
+
24 37
         )
25 38
         return self.post_process_urls(urlpatterns)
26 39
 
27 40
     def get_url_decorator(self, url_name):
28 41
         return staff_member_required
29 42
 
30
-
31 43
 application = PartnersDashboardApplication()

+ 8
- 0
oscar/apps/dashboard/partners/forms.py View File

@@ -1,6 +1,8 @@
1
+from django.contrib.auth.models import User
1 2
 from django.utils.translation import ugettext_lazy as _
2 3
 from django.db.models import get_model
3 4
 from django import forms
5
+from oscar.apps.customer.forms import EmailUserCreationForm
4 6
 
5 7
 
6 8
 Partner = get_model('partner', 'Partner')
@@ -14,3 +16,9 @@ class PartnerCreateForm(forms.ModelForm):
14 16
     class Meta:
15 17
         model = Partner
16 18
         fields = ('name',)
19
+
20
+
21
+class UserForm(EmailUserCreationForm):
22
+    class Meta:
23
+        model = User
24
+        fields = ('first_name', 'last_name', 'email', 'password1', 'password2')

+ 105
- 1
oscar/apps/dashboard/partners/views.py View File

@@ -1,8 +1,12 @@
1 1
 from django.contrib import messages
2
-from django.core.urlresolvers import reverse_lazy
2
+from django.contrib.auth.models import User
3
+from django.core.urlresolvers import reverse_lazy, reverse
3 4
 from django.db.models import get_model
5
+from django.http import HttpResponseRedirect
6
+from django.shortcuts import get_object_or_404
4 7
 from django.utils.translation import ugettext_lazy as _
5 8
 from django.views import generic
9
+from oscar.apps.dashboard.partners.forms import UserForm
6 10
 
7 11
 from oscar.core.loading import get_classes
8 12
 from oscar.views.generic import BulkEditMixin
@@ -62,12 +66,28 @@ class PartnerCreateView(generic.CreateView):
62 66
     form_class = PartnerCreateForm
63 67
     success_url = reverse_lazy('dashboard:partner-list')
64 68
 
69
+    def get_context_data(self, **kwargs):
70
+        ctx = super(PartnerCreateView, self).get_context_data(**kwargs)
71
+        ctx['title'] = _('Create new partner')
72
+        return ctx
73
+
74
+    def get_success_url(self):
75
+        messages.success(self.request,
76
+                         _("Partner '%s' was created successfully.") %
77
+                         self.object.name)
78
+        return reverse_lazy('dashboard:partner-list')
79
+
65 80
 
66 81
 class PartnerUpdateView(generic.UpdateView):
67 82
     model = Partner
68 83
     template_name = 'dashboard/partners/partner_form.html'
69 84
     form_class = PartnerCreateForm
70 85
 
86
+    def get_context_data(self, **kwargs):
87
+        ctx = super(PartnerUpdateView, self).get_context_data(**kwargs)
88
+        ctx['title'] = _("Partner '%s'") % self.object.name
89
+        return ctx
90
+
71 91
     def get_success_url(self):
72 92
         messages.success(self.request,
73 93
                          _("Partner '%s' was updated successfully.") %
@@ -85,3 +105,87 @@ class PartnerDeleteView(generic.DeleteView):
85 105
                          self.object.name)
86 106
         return reverse_lazy('dashboard:partner-list')
87 107
 
108
+
109
+class PartnerCreateUserView(generic.CreateView):
110
+    model = User
111
+    template_name = 'dashboard/partners/partner_user_form.html'
112
+    form_class = UserForm
113
+
114
+    def dispatch(self, request, *args, **kwargs):
115
+        self.partner = get_object_or_404(Partner,
116
+                                         pk=kwargs.get('partner_pk', None))
117
+        return super(PartnerCreateUserView, self).dispatch(request, *args, **kwargs)
118
+
119
+    def get_context_data(self, **kwargs):
120
+        ctx = super(PartnerCreateUserView, self).get_context_data(**kwargs)
121
+        ctx['title'] = _("Create user for partner '%s'") % self.partner.name
122
+        return ctx
123
+
124
+    def form_valid(self, form):
125
+        ret = super(PartnerCreateUserView, self).form_valid(form)
126
+        self.partner.users.add(self.object)
127
+        return ret
128
+
129
+    def get_success_url(self):
130
+        name = self.object.get_full_name() or self.object.email
131
+        messages.success(self.request,
132
+                         _("User '%s' was created successfully.") % name)
133
+        return reverse_lazy('dashboard:partner-list')
134
+
135
+
136
+class PartnerUpdateUserView(generic.UpdateView):
137
+    model = User
138
+    template_name = 'dashboard/partners/partner_user_form.html'
139
+    form_class = UserForm
140
+
141
+    def get_context_data(self, **kwargs):
142
+        name = self.object.get_full_name() or self.object.email
143
+        ctx = super(PartnerUpdateUserView, self).get_context_data(**kwargs)
144
+        ctx['title'] = _("Edit user '%s'") % name
145
+        return ctx
146
+
147
+    def get_success_url(self):
148
+        name = self.object.get_full_name() or self.object.email
149
+        messages.success(self.request,
150
+                         _("User '%s' was updated successfully.") % name)
151
+        return reverse_lazy('dashboard:partner-list')
152
+
153
+
154
+class PartnerManageUsers(generic.ListView):
155
+    model = User
156
+    template_name = 'dashboard/partners/manage_users.html'
157
+    context_object_name = 'users'
158
+
159
+    def dispatch(self, request, *args, **kwargs):
160
+        self.partner = get_object_or_404(Partner,
161
+                                         pk=kwargs.get('pk', None))
162
+        return super(PartnerManageUsers, self).dispatch(request, *args, **kwargs)
163
+
164
+    def get_context_data(self, **kwargs):
165
+        ctx = super(PartnerManageUsers, self).get_context_data(**kwargs)
166
+        ctx['partner'] = self.partner
167
+        ctx['title'] = _("Manage users for partner '%s'") % self.partner.name
168
+        return ctx
169
+
170
+    def get_queryset(self):
171
+        return self.partner.users.all()
172
+
173
+
174
+class PartnerUnlinkUserView(generic.View):
175
+
176
+    def post(self, request, user_pk, partner_pk):
177
+        user = get_object_or_404(User, pk=user_pk)
178
+        name = user.get_full_name() or user.email
179
+        partner = get_object_or_404(Partner, pk=partner_pk)
180
+        users = partner.users.all()
181
+        if user in users:
182
+            partner.users.remove(user)
183
+            messages.success(request, _("User '%s' was unlinked from '%s'") %
184
+                                      (name, partner.name))
185
+        else:
186
+            messages.error(request, _("User '%s' is not linked to '%s'") %
187
+                                    (name, partner.name))
188
+        return HttpResponseRedirect(reverse('dashboard:partner-manage-users',
189
+                                            kwargs={'pk': partner_pk}))
190
+
191
+

+ 56
- 0
oscar/templates/oscar/dashboard/partners/manage_users.html View File

@@ -0,0 +1,56 @@
1
+{% extends 'dashboard/layout.html' %}
2
+{% load sorting_tags %}
3
+{% load i18n %}
4
+
5
+{% block title %}
6
+{% trans "Partner management" %} | {{ block.super }}
7
+{% endblock %}
8
+
9
+{% block breadcrumbs %}
10
+<ul class="breadcrumb">
11
+    <li>
12
+        <a href="{% url dashboard:index %}">{% trans "Dashboard" %}</a>
13
+        <span class="divider">/</span>
14
+	    <a href="{% url dashboard:partner-list %}">{% trans "Partner management" %}</a>
15
+	    <span class="divider">/</span>
16
+    </li>
17
+    <li class="active">{{ title }}</li>
18
+</ul>
19
+{% endblock %}
20
+
21
+{% block header %}
22
+<div class="page-header">
23
+	<a href="{% url dashboard:partner-create-user partner.pk %}" class="btn btn-primary pull-right"><i class="icon-plus"></i> {% trans "Link a new user" %}</a>
24
+    <h1>{{ title }}</h1>
25
+</div>
26
+{% endblock header %}
27
+
28
+{% block dashboard_content %}
29
+            <table class="table table-striped table-bordered">
30
+                {% if users.count %}
31
+                <tr>
32
+                    <th>{% trans 'Email' %}</th>
33
+	                <th>{% trans 'First name' %}</th>
34
+	                <th>{% trans 'Last name' %}</th>
35
+	                <th>&nbsp;</th>
36
+                </tr>
37
+                {% for user in users %}
38
+                <tr>
39
+                    <td><a href="{% url dashboard:partner-update-user user.id %}">{{ user.email }}</a></td>
40
+	                <td>{{ user.first_name }}</td>
41
+	                <td>{{ user.last_name }}</td>
42
+                    <td>
43
+	                    <form action="{% url dashboard:partner-unlink-user user.id partner.pk %}" method="post">
44
+		                {% csrf_token %}
45
+		                <button type="submit" class="btn">{% trans 'Unlink user' %}</button>
46
+		                </form>
47
+                    </td>
48
+                </tr>
49
+                {% endfor %}
50
+
51
+                {% else %}
52
+                <tr><td>{% trans "No users linked." %}</td></tr>
53
+                {% endif %}
54
+            </table>
55
+            {% include "partials/pagination.html" %}
56
+{% endblock dashboard_content %}

+ 30
- 4
oscar/templates/oscar/dashboard/partners/partner_list.html View File

@@ -43,11 +43,33 @@
43 43
                 {% if partners.count %}
44 44
                 <tr>
45 45
                     <th>{% anchor 'name' _('Partner name') %}</th>
46
-                    <th></th>
46
+	                <th>{% trans 'Users' %}</th>
47
+                    <th>&nbsp;</th>
47 48
                 </tr>
48 49
                 {% for partner in partners %}
49 50
                 <tr>
50
-                    <td><a href="{% url dashboard:partner-update partner.pk %}">{{ partner.name }}</a></td>
51
+                    <td>
52
+	                    <a href="{% url dashboard:partner-update partner.pk %}">
53
+		                    {{ partner.name }}
54
+	                    </a>
55
+                    </td>
56
+	                <td>
57
+			            {% with users=partner.users.all %}
58
+			            {% if users %}
59
+							<ul>
60
+							{% for user in users %}
61
+								<li>
62
+									<a href="{% url dashboard:partner-update-user user.id %}" title="{% trans "Edit the user's details" %}">
63
+										{{ user.get_full_name|default:user.email }}
64
+									</a>
65
+								</li>
66
+							{% endfor %}
67
+							</ul>
68
+			            {% else %}
69
+							{% trans 'No users associated.' %}
70
+			            {% endif %}
71
+			            {% endwith %}
72
+	                </td>
51 73
                     <td>
52 74
                         <div class="btn-toolbar">
53 75
                             <div class="btn-group">
@@ -56,8 +78,12 @@
56 78
                                 <span class="caret"></span>
57 79
                               </a>
58 80
                               <ul class="dropdown-menu pull-right">
59
-                                  <li><a class="" href="{% url dashboard:partner-update partner.pk %}">{% trans "Edit" %}</a></li>
60
-                                  <li><a class="" href="{% url dashboard:partner-delete partner.pk %}">{% trans "Delete" %}</a></li>
81
+                                  <li><a href="{% url dashboard:partner-update partner.pk %}">{% trans "Edit" %}</a></li>
82
+                                  <li><a href="{% url dashboard:partner-delete partner.pk %}">{% trans "Delete" %}</a></li>
83
+	                              {% if partner.users.count %}
84
+	                              <li><a href="{% url dashboard:partner-manage-users partner.pk %}">{% trans "Manage users" %}</a></li>
85
+	                              {% endif %}
86
+	                              <li><a href="{% url dashboard:partner-create-user partner.pk %}">{% trans "Link a new user" %}</a></li>
61 87
                               </ul>
62 88
                             </div>
63 89
                         </div>

+ 33
- 0
oscar/templates/oscar/dashboard/partners/partner_user_form.html View File

@@ -0,0 +1,33 @@
1
+{% extends 'dashboard/layout.html' %}
2
+{% load category_tags %}
3
+{% load i18n %}
4
+{% block body_class %}create-page partner{% endblock %}
5
+
6
+{% block title %}
7
+{{ title }} | {% trans "Partner management" %} | {{ block.super }}
8
+{% endblock %}
9
+
10
+{% block breadcrumbs %}
11
+<ul class="breadcrumb">
12
+    <li>
13
+        <a href="{% url dashboard:index %}">{% trans "Dashboard" %}</a>
14
+        <span class="divider">/</span>
15
+    </li>
16
+    <li>
17
+        <a href="{% url dashboard:partner-list %}">{% trans "Partner management" %}</a>
18
+        <span class="divider">/</span>
19
+    </li>
20
+    <li class="active">{{ title }}</li>
21
+</ul>
22
+{% endblock %}
23
+
24
+{% block headertext %}{{ title }}{% endblock %}
25
+
26
+{% block dashboard_content %}
27
+    <div class="table-header">
28
+        <h2>{{ title }}</h2>
29
+    </div>
30
+    <div class="well">
31
+        {% include 'partials/form.html' %}
32
+    </div>
33
+{% endblock dashboard_content %}

Loading…
Cancel
Save