|
|
|
@ -11,14 +11,16 @@ from django.db import transaction
@@ -11,14 +11,16 @@ from django.db import transaction
|
|
|
|
|
import PIL.Image |
|
|
|
|
import StringIO |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Account(models.Model): |
|
|
|
|
user = models.OneToOneField(User) |
|
|
|
|
card_number = models.CharField(max_length=32, unique=True, blank=True, |
|
|
|
|
null=True, verbose_name = _('card number')) |
|
|
|
|
pin = models.CharField(max_length=32, blank=True, verbose_name = _('PIN')) |
|
|
|
|
daily_digest = models.BooleanField(verbose_name = _('daily digest'), default=True) |
|
|
|
|
null=True, verbose_name=_('card number')) |
|
|
|
|
pin = models.CharField(max_length=32, blank=True, verbose_name=_('PIN')) |
|
|
|
|
daily_digest = models.BooleanField(verbose_name=_('daily digest'), |
|
|
|
|
default=True) |
|
|
|
|
credit = models.DecimalField(max_digits=5, decimal_places=2, default=0, |
|
|
|
|
verbose_name = _('credit')) |
|
|
|
|
verbose_name=_('credit')) |
|
|
|
|
|
|
|
|
|
def __unicode__(self): |
|
|
|
|
return self.user.username |
|
|
|
@ -36,8 +38,8 @@ class Account(models.Model):
@@ -36,8 +38,8 @@ class Account(models.Model):
|
|
|
|
|
else: |
|
|
|
|
# When we already have an account, |
|
|
|
|
# we can add the number form LDAP (mongo shit) |
|
|
|
|
if hasattr(instance, 'ldap_user') \ |
|
|
|
|
and instance.ldap_user.attrs.has_key('employeenumber'): |
|
|
|
|
if (hasattr(instance, 'ldap_user') and |
|
|
|
|
'employeenumber' in instance.ldap_user.attrs): |
|
|
|
|
instance.account.card_number = \ |
|
|
|
|
instance.ldap_user.attrs['employeenumber'][0] |
|
|
|
|
instance.account.save() |
|
|
|
@ -61,7 +63,8 @@ class Account(models.Model):
@@ -61,7 +63,8 @@ class Account(models.Model):
|
|
|
|
|
if min(products.values()) <= 0: |
|
|
|
|
raise ValueError('Non-positive amount in products dict.') |
|
|
|
|
|
|
|
|
|
total_value = sum(map(lambda p: p.price * products[p], products.keys())) |
|
|
|
|
total_value = sum(map(lambda p: p.price * products[p], |
|
|
|
|
products.keys())) |
|
|
|
|
if self.credit - total_value >= MAX_DEBIT: |
|
|
|
|
desc = '' |
|
|
|
|
for product in products.keys(): |
|
|
|
@ -70,7 +73,8 @@ class Account(models.Model):
@@ -70,7 +73,8 @@ class Account(models.Model):
|
|
|
|
|
amount = products[product] |
|
|
|
|
|
|
|
|
|
logentry = SalesLogEntry(account=self, product=product, |
|
|
|
|
count=amount, unit_price=product.price) |
|
|
|
|
count=amount, |
|
|
|
|
unit_price=product.price) |
|
|
|
|
logentry.save() |
|
|
|
|
|
|
|
|
|
desc += '%d x %s\n' % (amount, product.name) |
|
|
|
@ -95,11 +99,12 @@ class Account(models.Model):
@@ -95,11 +99,12 @@ class Account(models.Model):
|
|
|
|
|
def check_pin(self, pin): |
|
|
|
|
return pin == self.pin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProductCategory(models.Model): |
|
|
|
|
name = models.CharField(max_length=32, unique=True, |
|
|
|
|
verbose_name = _('name')) |
|
|
|
|
verbose_name=_('name')) |
|
|
|
|
comment = models.CharField(max_length=128, blank=True, |
|
|
|
|
verbose_name = _('comment')) |
|
|
|
|
verbose_name=_('comment')) |
|
|
|
|
|
|
|
|
|
def __unicode__(self): |
|
|
|
|
return "%s (%s)" % (self.name, self.comment) |
|
|
|
@ -108,18 +113,19 @@ class ProductCategory(models.Model):
@@ -108,18 +113,19 @@ class ProductCategory(models.Model):
|
|
|
|
|
verbose_name = _('product category') |
|
|
|
|
verbose_name_plural = _('product categories') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Product(models.Model): |
|
|
|
|
name = models.CharField(max_length=32, unique=True, |
|
|
|
|
verbose_name = _('name')) |
|
|
|
|
verbose_name=_('name')) |
|
|
|
|
price = models.DecimalField(max_digits=5, decimal_places=2, |
|
|
|
|
verbose_name = _('price')) |
|
|
|
|
active = models.BooleanField(default = True, verbose_name = _('active')) |
|
|
|
|
verbose_name=_('price')) |
|
|
|
|
active = models.BooleanField(default=True, verbose_name=_('active')) |
|
|
|
|
category = models.ForeignKey(ProductCategory, blank=True, null=True, |
|
|
|
|
verbose_name = _('category')) |
|
|
|
|
image = models.ImageField(upload_to="products", verbose_name = _('image'), |
|
|
|
|
verbose_name=_('category')) |
|
|
|
|
image = models.ImageField(upload_to="products", verbose_name=_('image'), |
|
|
|
|
blank=True, null=True) |
|
|
|
|
image_thumbnail = models.ImageField(upload_to="products_thumb", |
|
|
|
|
verbose_name = _('image'), |
|
|
|
|
verbose_name=_('image'), |
|
|
|
|
blank=True, null=True) |
|
|
|
|
|
|
|
|
|
def __unicode__(self): |
|
|
|
@ -129,6 +135,7 @@ class Product(models.Model):
@@ -129,6 +135,7 @@ class Product(models.Model):
|
|
|
|
|
verbose_name = _('product') |
|
|
|
|
verbose_name_plural = _('products') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@receiver(pre_save, sender=Product) |
|
|
|
|
def product_post_save_handler(sender, instance, **kwargs): |
|
|
|
|
img = instance.image |
|
|
|
@ -147,10 +154,10 @@ def product_post_save_handler(sender, instance, **kwargs):
@@ -147,10 +154,10 @@ def product_post_save_handler(sender, instance, **kwargs):
|
|
|
|
|
|
|
|
|
|
class ProductBarcode(models.Model): |
|
|
|
|
barcode = models.CharField(max_length=32, unique=True, |
|
|
|
|
verbose_name = _('barcode')) |
|
|
|
|
verbose_name=_('barcode')) |
|
|
|
|
comment = models.CharField(max_length=128, blank=True, |
|
|
|
|
verbose_name = _('comment')) |
|
|
|
|
product = models.ForeignKey(Product, verbose_name = _('product')) |
|
|
|
|
verbose_name=_('comment')) |
|
|
|
|
product = models.ForeignKey(Product, verbose_name=_('product')) |
|
|
|
|
|
|
|
|
|
def __unicode__(self): |
|
|
|
|
return self.barcode |
|
|
|
@ -159,34 +166,38 @@ class ProductBarcode(models.Model):
@@ -159,34 +166,38 @@ class ProductBarcode(models.Model):
|
|
|
|
|
verbose_name = _('barcode') |
|
|
|
|
verbose_name_plural = _('barcodes') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Transaction(models.Model): |
|
|
|
|
account = models.ForeignKey(Account, verbose_name = _('account')) |
|
|
|
|
account = models.ForeignKey(Account, verbose_name=_('account')) |
|
|
|
|
timestamp = models.DateTimeField(auto_now_add=True, |
|
|
|
|
verbose_name = _('timestamp')) |
|
|
|
|
subject = models.CharField(max_length=32, verbose_name = _('subject')) |
|
|
|
|
description = models.TextField(verbose_name = _('description')) |
|
|
|
|
verbose_name=_('timestamp')) |
|
|
|
|
subject = models.CharField(max_length=32, verbose_name=_('subject')) |
|
|
|
|
description = models.TextField(verbose_name=_('description')) |
|
|
|
|
amount = models.DecimalField(max_digits=5, decimal_places=2, |
|
|
|
|
verbose_name = _('amount')) |
|
|
|
|
verbose_name=_('amount')) |
|
|
|
|
|
|
|
|
|
class Meta: |
|
|
|
|
verbose_name = _('transaction') |
|
|
|
|
verbose_name_plural = _('transactions') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SalesLogEntry(models.Model): |
|
|
|
|
account = models.ForeignKey(Account, verbose_name = _('account')) |
|
|
|
|
product = models.ForeignKey(Product, verbose_name = _('product')) |
|
|
|
|
count = models.IntegerField(verbose_name = _('count')) |
|
|
|
|
account = models.ForeignKey(Account, verbose_name=_('account')) |
|
|
|
|
product = models.ForeignKey(Product, verbose_name=_('product')) |
|
|
|
|
count = models.IntegerField(verbose_name=_('count')) |
|
|
|
|
unit_price = models.DecimalField(max_digits=5, decimal_places=2, |
|
|
|
|
verbose_name = _('unit price')) |
|
|
|
|
verbose_name=_('unit price')) |
|
|
|
|
timestamp = models.DateTimeField(auto_now_add=True, |
|
|
|
|
verbose_name = _('timestamp')) |
|
|
|
|
verbose_name=_('timestamp')) |
|
|
|
|
|
|
|
|
|
def __unicode__(self): |
|
|
|
|
return '%dx %s - %s' % (self.count, self.product, self.account) |
|
|
|
|
|
|
|
|
|
class Meta: |
|
|
|
|
verbose_name = _('sales log entry') |
|
|
|
|
verbose_name_plural = _('sales log entries') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@receiver(pre_delete, sender=SalesLogEntry) |
|
|
|
|
def logentry_pre_delete_handler(sender, instance, **kwargs): |
|
|
|
|
SUBJECT = ugettext_noop('Cancellation') |
|
|
|
@ -196,4 +207,3 @@ def logentry_pre_delete_handler(sender, instance, **kwargs):
@@ -196,4 +207,3 @@ def logentry_pre_delete_handler(sender, instance, **kwargs):
|
|
|
|
|
instance.unit_price * instance.count, |
|
|
|
|
SUBJECT, DESC % (instance.count, instance.product.name) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|