1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (C) 2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# See the file COPYING for details.
from django.db.models.signals import post_save, post_delete
from django.contrib.gis.db import models
from django.utils.translation import ugettext_lazy as _, ugettext
from ishtar_common.models import GeneralType, \
LightHistorizedItem, OwnPerms, Address, Person, post_save_cache
class WarehouseType(GeneralType):
class Meta:
verbose_name = _(u"Warehouse type")
verbose_name_plural = _(u"Warehouse types")
ordering = ('label',)
post_save.connect(post_save_cache, sender=WarehouseType)
post_delete.connect(post_save_cache, sender=WarehouseType)
class Warehouse(Address, OwnPerms):
name = models.CharField(_(u"Name"), max_length=200)
warehouse_type = models.ForeignKey(WarehouseType,
verbose_name=_(u"Warehouse type"))
person_in_charge = models.ForeignKey(
Person, on_delete=models.SET_NULL, related_name='warehouse_in_charge',
verbose_name=_(u"Person in charge"), null=True, blank=True)
comment = models.TextField(_(u"Comment"), null=True, blank=True)
associated_divisions = models.ManyToManyField(
'WarehouseDivision', verbose_name=_("Divisions"), blank=True,
through='WarehouseDivisionLink'
)
TABLE_COLS = ['name', 'warehouse_type']
class Meta:
verbose_name = _(u"Warehouse")
verbose_name_plural = _(u"Warehouses")
permissions = (
("view_warehouse", ugettext(u"Can view all Warehouses")),
("view_own_warehouse", ugettext(u"Can view own Warehouse")),
("add_own_warehouse", ugettext(u"Can add own Warehouse")),
("change_own_warehouse", ugettext(u"Can change own Warehouse")),
("delete_own_warehouse", ugettext(u"Can delete own Warehouse")),
)
def __unicode__(self):
return u"%s (%s)" % (self.name, unicode(self.warehouse_type))
class WarehouseDivision(GeneralType):
class Meta:
verbose_name = _(u"Warehouse division")
verbose_name_plural = _(u"Warehouse divisions")
class WarehouseDivisionLink(models.Model):
RELATIVE_MODELS = {Warehouse: 'warehouse'}
warehouse = models.ForeignKey(Warehouse)
division = models.ForeignKey(WarehouseDivision)
order = models.IntegerField(_("Order"), default=10)
class Meta:
ordering = ('warehouse', 'order')
unique_together = ('warehouse', 'division')
class ContainerType(GeneralType):
length = models.IntegerField(_(u"Length (mm)"), blank=True, null=True)
width = models.IntegerField(_(u"Width (mm)"), blank=True, null=True)
height = models.IntegerField(_(u"Height (mm)"), blank=True, null=True)
volume = models.IntegerField(_(u"Volume (l)"), blank=True, null=True)
reference = models.CharField(_(u"Ref."), max_length=30)
class Meta:
verbose_name = _(u"Container type")
verbose_name_plural = _(u"Container types")
ordering = ('label',)
post_save.connect(post_save_cache, sender=ContainerType)
post_delete.connect(post_save_cache, sender=ContainerType)
class Container(LightHistorizedItem):
TABLE_COLS = ['reference', 'container_type', 'location']
# search parameters
EXTRA_REQUEST_KEYS = {
'location': 'location__pk',
'container_type': 'container_type__pk',
'reference': 'reference__icontains',
}
# fields
location = models.ForeignKey(Warehouse, verbose_name=_(u"Warehouse"))
container_type = models.ForeignKey(ContainerType,
verbose_name=_("Container type"))
reference = models.CharField(_(u"Container ref."), max_length=40)
comment = models.TextField(_(u"Comment"))
class Meta:
verbose_name = _(u"Container")
verbose_name_plural = _(u"Containers")
def __unicode__(self):
lbl = u" - ".join((self.reference, unicode(self.container_type),
unicode(self.location)))
return lbl
|