You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.7 KiB
Python

from __future__ import unicode_literals
from django.utils.encoding import force_text
from django.utils.encoding import python_2_unicode_compatible
from django.utils.timezone import now as tznow
from django.template.defaultfilters import slugify
from django.contrib.contenttypes.models import ContentType
from django.conf import settings
from django.db import models
from django.utils.translation import ugettext_lazy as _
#from django.conf import settings
from nano.tools.models import GenericForeignKeyAbstractModel
from nano.mark.managers import MarksManager
class MarkedMixin(models.Model):
"Used by marked models"
class Meta:
abstract = True
def marks(self):
ct = ContentType.objects.get_for_model(self)
return Mark.objects.filter(content_type = ct, object_pk = force_text(self.pk))
def flagged(self):
return self.marks.filter(marktype__slug='flag')
def faved(self):
return self.marks.filter(marktype__slug='fave')
def scrambled(self):
return self.marks.filter(marktype__slug='scrambled')
def removed(self):
return self.marks.filter(marktype__slug='removed')
@property
def hidden(self):
marks = self.marks.filter(marktype__slug='flag')
return True if marks.filter(marktype__hide=True) else False
@python_2_unicode_compatible
class MarkType(models.Model):
name = models.CharField(max_length=32)
slug = models.SlugField(unique=True)
hide = models.BooleanField(default=False)
verify = models.BooleanField(default=False)
permanent = models.BooleanField(default=False)
class Meta:
db_table='nano_mark_marktype'
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(MarkType, self).save(*args, **kwargs)
@python_2_unicode_compatible
class Mark(GenericForeignKeyAbstractModel):
marked_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
verbose_name=_('user'),
related_name="marks"
)
marked_at = models.DateTimeField(_('date/time marked'), default=tznow)
marktype = models.ForeignKey(
MarkType,
on_delete=models.CASCADE,
)
comment = models.CharField(max_length=256, blank=True, null=True)
objects = MarksManager()
class Meta:
db_table='nano_mark_mark'
class Meta:
db_table = "nano_mark"
ordering = ('marked_at',)
get_latest_by = 'marked_at'
def __str__(self):
return "%s have marked %s" % (self.marked_by, self.content_object)
def save(self, parent=None, *args, **kwargs):
if self.marked_at is None:
self.marked_at = tznow()
super(Mark, self).save(*args, **kwargs)