models.py 2.76 KB
# -*- coding: utf-8 -*-

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
from django.utils.translation import ugettext_lazy as _
from PIL import Image
from i18n_model.models import I18nModel


class Badge(models.Model):
    COMPARISON_CHOICES = (
        (u'gte', _(u'Greater than or equal')),
        (u'lte', _(u'less than or equal')),
        (u'equal', _(u'Equal')),
        (u'biggest', _(u'Biggest')),
    )
    TYPE_CHOICES = (
        (u'auto', _(u'Automatically')),
        (u'manual', _(u'Manual')),
    )
    USER_ATTR_CHOICES = (
        (u'messages', _(u'Messages')),
        (u'contributions', _(u'Contributions')),
        (u'wikis', _(u'Wikis')),
        (u'revisions', _(u'Revisions')),
        (u'tickets', _(u'Ticket')),
    )
    USER_ATTR_OPTS = {
        u'messages': u'message_count',
        u'revisions': u'changeset_count',
        u'tickets': u'ticket_count',
        u'wikis': u'wiki_count',
        u'contributions': u'contribution_count',
    }

    title = models.CharField(_(u'Title'), max_length=200, blank=True,
                             null=True)
    description = models.CharField(_(u'Description'), max_length=200,
                                   blank=True, null=True)
    image = models.ImageField(upload_to='badges')
    type = models.CharField(_(u'Type'), max_length=200, choices=TYPE_CHOICES)
    user_attr = models.CharField(
        _(u'User attribute'),max_length=100,
        choices=USER_ATTR_CHOICES,
        blank=True,
        null=True,
    )
    comparison = models.CharField(
        _(u'Comparison'),
        max_length=10,
        choices=COMPARISON_CHOICES,
        blank=True,
        null=True
    )
    value = models.PositiveSmallIntegerField(
        _(u'Value'),
        blank=True,
        null=True
    )
    awardees = models.ManyToManyField(
        get_user_model(),
        verbose_name=_(u'Awardees'),
        blank=True,
        null=True
    )
    order = models.PositiveSmallIntegerField(_(u'Order'), default=100)

    class Meta:
        verbose_name = _(u'Badge')
        verbose_name_plural = _(u'Badges')
        ordering = ['order', ]

    def get_badge_url(self):
        return u'{}{}'.format(settings.MEDIA_URL, self.image)

    def save(self, *args, **kwargs):
        img = Image.open(self.image)
        (width, height) = img.size
        img = img.resize((50, 50), Image.ANTIALIAS)
        super(Badge, self).save(*args, **kwargs)
        img.save(self.image.path)

    def __unicode__(self):
        return u'{} ({}, {})'.format(
            self.title,
            self.get_user_attr_display(),
            self.get_type_display(),
        )


class BadgeI18N(I18nModel):
    class Meta:
        source_model = Badge
        translation_fields = ('title', 'description')