Browse Source

Added order notes to the order admin

master
David Winterbottom 15 years ago
parent
commit
f3697a8ea4

+ 23
- 9
oscar/order/abstract_models.py View File

4
 from django.utils.translation import ugettext_lazy as _
4
 from django.utils.translation import ugettext_lazy as _
5
 
5
 
6
 
6
 
7
-
8
-
9
 class AbstractOrder(models.Model):
7
 class AbstractOrder(models.Model):
10
     """
8
     """
11
     An order
9
     An order
51
         return u"#%s (amount: %.2f)" % (self.number, self.total_incl_tax)
49
         return u"#%s (amount: %.2f)" % (self.number, self.total_incl_tax)
52
 
50
 
53
 
51
 
54
-class AbstractOrderEvent(models.Model):
52
+class AbstractOrderNote(models.Model):
53
+    """
54
+    A note against an order.
55
+    """
56
+    order = models.ForeignKey('order.Order', related_name="notes")
57
+    user = models.ForeignKey('auth.User')
58
+    message = models.TextField()
59
+    date = models.DateTimeField(auto_now_add=True)
60
+    
61
+    class Meta:
62
+        abstract = True
63
+        
64
+    def __unicode__(self):
65
+        return u"'%s' (%s)" % (self.message[0:50], self.user)
66
+
67
+
68
+class AbstractCommunicationEvent(models.Model):
55
     """
69
     """
56
-    An event that happens to the order (rather than to one of its lines)
70
+    An order-level event involving a communication to the customer, such
71
+    as an confirmation email being sent.
57
     """
72
     """
58
     order = models.ForeignKey('order.Order', related_name="events")
73
     order = models.ForeignKey('order.Order', related_name="events")
59
-    type = models.ForeignKey('order.OrderEventType')
60
-    notes = models.TextField(_("Event notes"), blank=True, null=True)
74
+    type = models.ForeignKey('order.CommunicationEventType')
61
     date = models.DateTimeField(auto_now_add=True)
75
     date = models.DateTimeField(auto_now_add=True)
62
     
76
     
63
     class Meta:
77
     class Meta:
64
         abstract = True
78
         abstract = True
65
     
79
     
66
     
80
     
67
-class AbstractOrderEventType(models.Model):
81
+class AbstractCommunicationEventType(models.Model):
68
     """ 
82
     """ 
69
-    Order events are things like 'Cancellation', 'NoteAdded', 'ConfirmationEmailSent'
83
+    Communication events are things like 'OrderConfirmationEmailSent'
70
     """
84
     """
71
     # Code is used in forms
85
     # Code is used in forms
72
     code = models.CharField(max_length=128)
86
     code = models.CharField(max_length=128)
80
     
94
     
81
     class Meta:
95
     class Meta:
82
         abstract = True
96
         abstract = True
83
-        verbose_name_plural = _("Order event types")
97
+        verbose_name_plural = _("Communication event types")
84
         
98
         
85
     def __unicode__(self):
99
     def __unicode__(self):
86
         return self.name    
100
         return self.name    

+ 12
- 3
oscar/order/admin.py View File

7
 class BatchLineAdmin(admin.ModelAdmin):
7
 class BatchLineAdmin(admin.ModelAdmin):
8
     list_display = ('batch', 'product', 'quantity')
8
     list_display = ('batch', 'product', 'quantity')
9
 
9
 
10
-class OrderEventTypeAdmin(admin.ModelAdmin):
10
+class CommunicationEventTypeAdmin(admin.ModelAdmin):
11
     exclude = ('code',)
11
     exclude = ('code',)
12
 
12
 
13
 class ShippingEventTypeAdmin(admin.ModelAdmin):
13
 class ShippingEventTypeAdmin(admin.ModelAdmin):
15
     
15
     
16
 class PaymentEventTypeAdmin(admin.ModelAdmin):
16
 class PaymentEventTypeAdmin(admin.ModelAdmin):
17
     exclude = ('code',)
17
     exclude = ('code',)
18
+    
19
+class OrderNoteAdmin(admin.ModelAdmin):
20
+    exclude = ('user',)
21
+    
22
+    def save_model(self, request, obj, form, change):
23
+        if not change:
24
+            obj.user = request.user
25
+        obj.save()
18
 
26
 
19
 admin.site.register(Order)
27
 admin.site.register(Order)
20
-admin.site.register(OrderEvent)
21
-admin.site.register(OrderEventType, OrderEventTypeAdmin)
28
+admin.site.register(OrderNote, OrderNoteAdmin)
29
+admin.site.register(CommunicationEvent)
30
+admin.site.register(CommunicationEventType, CommunicationEventTypeAdmin)
22
 admin.site.register(BillingAddress)
31
 admin.site.register(BillingAddress)
23
 admin.site.register(Batch, BatchAdmin)
32
 admin.site.register(Batch, BatchAdmin)
24
 admin.site.register(ShippingAddress)
33
 admin.site.register(ShippingAddress)

+ 5
- 2
oscar/order/models.py View File

9
 class Order(AbstractOrder):
9
 class Order(AbstractOrder):
10
     pass
10
     pass
11
 
11
 
12
-class OrderEvent(AbstractOrderEvent):
12
+class OrderNote(AbstractOrderNote):
13
     pass
13
     pass
14
 
14
 
15
-class OrderEventType(AbstractOrderEventType):
15
+class CommunicationEvent(AbstractCommunicationEvent):
16
+    pass
17
+
18
+class CommunicationEventType(AbstractCommunicationEventType):
16
     pass
19
     pass
17
 
20
 
18
 class Batch(AbstractBatch):
21
 class Batch(AbstractBatch):

+ 52
- 1
oscar/order_management/templates/order_management/order.html View File

7
 
7
 
8
 {% block content %}
8
 {% block content %}
9
 
9
 
10
+<h3>Shipping address</h3>
11
+<table>
12
+    <tr>
13
+        <th>Address</th>
14
+        <td>
15
+            {% for field in order.shipping_address.active_address_fields %}
16
+            {{ field }}<br/>
17
+            {% endfor %}
18
+        </td>
19
+    </tr>
20
+    {% if order.shipping_address.phone_number %}
21
+    <tr>
22
+        <th>Concact number</th>
23
+        <td>{{ shipping_address.phone_number }}</td>
24
+    </tr>
25
+    {% endif %}
26
+    {% if order.shipping_address.notes %}
27
+    <tr>
28
+        <th>Shipping notes</th>
29
+        <td>{{ shipping_address.notes }}</td>
30
+    </tr>
31
+    {% endif %} 
32
+</table>
33
+
10
 <h3>Order contents</h3>
34
 <h3>Order contents</h3>
11
 
35
 
12
 {% for batch in order.batches.all %}
36
 {% for batch in order.batches.all %}
65
     </tr>
89
     </tr>
66
 </table>
90
 </table>
67
 
91
 
68
-<h4>Shipping events</h4>
92
+{% if order.shipping_events.count %}
93
+<h3>Shipping events</h3>
69
 <table>
94
 <table>
70
 <tr>
95
 <tr>
71
     <th>Partner</th>
96
     <th>Partner</th>
82
 </tr>
107
 </tr>
83
 {% endfor %}
108
 {% endfor %}
84
 </table>
109
 </table>
110
+{% endif %}
111
+
112
+<h3>Order notes</h3>
113
+
114
+{% if order.notes.count %}
115
+<table>
116
+<tr>
117
+    <th>Note</th>
118
+    <th>User</th>
119
+    <th>Date</th>
120
+</tr>
121
+{% for note in order.notes.all %}
122
+<tr>
123
+    <td>{{ note.message }}</td>
124
+    <td>{{ note.user }}</td>
125
+    <td>{{ note.date }}</td>
126
+</tr>
127
+{% endfor %}
128
+</table>
129
+{% endif %}
85
 
130
 
131
+<form method="post" action="{%url oscar-order-management-order order.number %}"/>
132
+    <input type="hidden" name="action" value="add_note" />
133
+    <label for="message">Message:</label>
134
+    <textarea id="message" name="message"></textarea>
135
+    <input type="submit" value="Add note" />
136
+</form>
86
 
137
 
87
 {% endblock content %}
138
 {% endblock content %}
88
 
139
 

+ 10
- 1
oscar/order_management/views.py View File

8
 from oscar.views import ModelView
8
 from oscar.views import ModelView
9
 from oscar.services import import_module
9
 from oscar.services import import_module
10
 order_models = import_module('order.models', ['Order', 'BatchLine', 'ShippingEvent', 'ShippingEventQuantity', 
10
 order_models = import_module('order.models', ['Order', 'BatchLine', 'ShippingEvent', 'ShippingEventQuantity', 
11
-                                              'ShippingEventType', 'PaymentEvent', 'PaymentEventType'])
11
+                                              'ShippingEventType', 'PaymentEvent', 'PaymentEventType', 'OrderNote'])
12
 
12
 
13
 
13
 
14
 class OrderListView(ListView):
14
 class OrderListView(ListView):
58
         for line in lines.values():
58
         for line in lines.values():
59
             order_models.PaymentEvent.objects.create(order=order, line=line, 
59
             order_models.PaymentEvent.objects.create(order=order, line=line, 
60
                                                      quantity=line.quantity, event_type=event_type)
60
                                                      quantity=line.quantity, event_type=event_type)
61
+            
62
+    def do_add_note(self, order):
63
+        """
64
+        Save a note against the order.
65
+        """
66
+        if self.request.user.is_authenticated():
67
+            note = order_models.OrderNote(order=order, message=self.request.POST['message'],
68
+                                          user=self.request.user)
69
+            note.save()
61
     
70
     

Loading…
Cancel
Save