Esempio n. 1
0
class BaseModel(models.Model):
    uuid = UUIDField()
    created = CreationDateTimeField()
    modified = ModificationDateTimeField()

    class Meta:
        abstract = True
Esempio n. 2
0
class Notice(models.Model):
    LIVE = 1
    REMOVED = 2
    STATUS_CHOICES = (
        (LIVE, _('Published')),
        (REMOVED, _('Unpublished')),
    )
    title = models.CharField(max_length=255)
    body = models.TextField()
    created = CreationDateTimeField()
    status = models.IntegerField(choices=STATUS_CHOICES, default=LIVE)
    end_date = models.DateTimeField(blank=True,
                                    null=True,
                                    help_text='Optional. Determines when the'
                                    'notice dissapears')

    # managers
    objects = models.Manager()
    live = NoticeLiveManager()

    class Meta:
        ordering = ('-created', )

    def __unicode__(self):
        return u'Notice: %s' % self.title
class AkismetSubmission(models.Model):
    """
    Stores the submissions to Akismet that are sent by trusted writers.

    This shall be used as a log of sorts to make sure we know what the data
    has been reported to Akismet as spam or ham.
    """
    SPAM_TYPE, HAM_TYPE = 'spam', 'ham'
    TYPES = (
        (SPAM_TYPE, _('Spam')),
        (HAM_TYPE, _('Ham')),
    )
    sender = models.ForeignKey(settings.AUTH_USER_MODEL)
    sent = CreationDateTimeField(
        _('sent at'),
        db_index=True,
    )
    type = models.CharField(
        _('type'),
        max_length=4,
        choices=TYPES,
        db_index=True,
    )

    class Meta:
        get_latest_by = 'sent'
        ordering = ('-sent', )
        abstract = True
Esempio n. 4
0
class SalesContract(models.Model):
    external_reference = models.CharField(verbose_name=_("External Reference"),
                                          max_length=100,
                                          blank=True)
    discount = models.DecimalField(max_digits=5,
                                   decimal_places=2,
                                   verbose_name=_("Discount"),
                                   blank=True,
                                   null=True)
    customer = models.ForeignKey('crm_core.Customer',
                                 verbose_name=_("Customer"))
    dateofcreation = CreationDateTimeField(verbose_name=_("Created at"),
                                           editable=False)
    lastmodification = ModificationDateTimeField(
        verbose_name=_("Last modified"), editable=False)
    lastmodifiedby = models.ForeignKey(settings.AUTH_USER_MODEL,
                                       limit_choices_to={'is_staff': True},
                                       blank=True,
                                       verbose_name=_("Last modified by"),
                                       null=True)
    pdf_path = models.CharField(max_length=200,
                                null=True,
                                blank=True,
                                editable=False)

    class Meta:
        abstract = True

    @transaction.atomic()
    @reversion.create_revision()
    def save(self, *args, **kwargs):
        super(SalesContract, self).save(*args, **kwargs)
class APPReview(models.Model):
    class Meta:
        app_label = 'city_viewer'
        verbose_name = verbose_name_plural = _('App反馈')

    title = models.CharField(_('标题'),
                             max_length=100,
                             blank=True,
                             default='用户反馈')
    device = models.ForeignKey(APPDevice,
                               verbose_name=_('设备'),
                               blank=True,
                               null=True)
    content = models.TextField(_('内容'))
    contact = models.CharField(_('联系方式'), max_length=100, blank=True)
    tracked = models.CharField(_('处理结果'), max_length=255, default='未处理')
    ip = models.IPAddressField(blank=True, default='0.0.0.0')
    source = models.CharField(_('来源'),
                              max_length=3,
                              choices=SOURCE_CHOICES,
                              default='APP')
    app = models.ForeignKey(APPInfo,
                            verbose_name=_('APP'),
                            blank=True,
                            default='1')
    created_at = CreationDateTimeField()

    def __unicode__(self):
        return '%s[%s]' % (self.content, self.source)
Esempio n. 6
0
class ProjectBudgetLine(models.Model):
    """
    BudgetLine: Entries to the Project Budget sheet.
    This is the budget for the amount asked from this
    website.
    """
    project = models.ForeignKey('projects.Project')
    description = models.CharField(_('description'), max_length=255, default='')
    amount = MoneyField()

    created = CreationDateTimeField()
    updated = ModificationDateTimeField()

    @property
    def owner(self):
        return self.project.owner

    @property
    def parent(self):
        return self.project

    class Meta:
        verbose_name = _('budget line')
        verbose_name_plural = _('budget lines')

    def __unicode__(self):
        return u'{0} - {1}'.format(self.description, self.amount)
Esempio n. 7
0
class MeditationSession(models.Model):
    user = models.ForeignKey(User)
    meditation_id = models.IntegerField(
        blank=False, null=False)  # foreign key to local meditation_id
    percent_completed = models.FloatField()
    created_at = CreationDateTimeField(_('created_at'))
    updated_at = ModificationDateTimeField(_('updated_at'))
Esempio n. 8
0
class Poll(models.Model):
    created_at = CreationDateTimeField()
    text = models.CharField(_('Text'), max_length=400)
    latitude = models.DecimalField(max_digits=9,
                                   decimal_places=6,
                                   null=True,
                                   blank=True)
    longitude = models.DecimalField(max_digits=9,
                                    decimal_places=6,
                                    null=True,
                                    blank=True)

    author = models.ForeignKey(to='core.Profile', related_name='polls')

    class Meta:
        ordering = ['created_at']
        verbose_name = _('Poll')
        verbose_name_plural = _('Polls')

    def __unicode__(self):
        return self.text

    def get_sorted_answers(self):
        return self.answers.order_by('-likes', 'created_at')

    @property
    def get_interests_images(self):
        return map(lambda x: x.get_image_url, self.interests.all())
Esempio n. 9
0
class Hit(models.Model):
    created = CreationDateTimeField(editable=False)
    edited = ModificationDateTimeField(editable=False)
    path = models.CharField(db_index=True,
                            max_length=255,
                            verbose_name=_("Path"))
    method = models.CharField(max_length=6, verbose_name=_("Method"))
    ip = models.CharField(max_length=12, verbose_name=_("Ip"))
    user_agent = models.CharField(max_length=255, verbose_name=_("User agent"))
    authenticated = models.BooleanField(verbose_name=_("Authenticated user"),
                                        default=False)
    staff = models.BooleanField(verbose_name=_("Staff user"), default=False)
    superuser = models.BooleanField(verbose_name=_("Superuser"), default=False)
    username = models.CharField(db_index=True,
                                max_length=120,
                                verbose_name=_("Username"))
    referer = models.CharField(max_length=255,
                               blank=True,
                               verbose_name=_("Referer"))
    view = models.CharField(max_length=120, blank=True, verbose_name=_("View"))
    module = models.CharField(max_length=120,
                              blank=True,
                              verbose_name=_("Module"))
    status_code = models.PositiveSmallIntegerField(
        verbose_name=_("Status code"))
    reason_phrase = models.CharField(max_length=120,
                                     blank=True,
                                     verbose_name=_("Reason phrase"))
    request_time = models.PositiveIntegerField(verbose_name=_("Request time"))
    doc_size = models.PositiveIntegerField(verbose_name=_("Document size"))
    num_queries = models.PositiveIntegerField(
        verbose_name=_("Number of queries"))
    queries_time = models.PositiveIntegerField(verbose_name=_("Queries time"))
    is_tablet = models.BooleanField(default=False, verbose_name=_("Tablet"))
    is_pc = models.BooleanField(default=False, verbose_name=_("PC"))
    is_bot = models.BooleanField(default=False, verbose_name=_("Bot"))
    os = models.CharField(max_length=120, verbose_name=_("Operating system"))
    os_version = models.CharField(max_length=120,
                                  verbose_name=_("Operating system version"))
    is_tablet = models.BooleanField(default=False, verbose_name=_("Tablet"))
    is_mobile = models.BooleanField(default=False, verbose_name=_("Mobile"))
    is_touch = models.BooleanField(default=False,
                                   verbose_name=_("Has touch capabilities"))
    browser = models.CharField(max_length=255, verbose_name=_("Browser"))
    device = models.CharField(max_length=255, verbose_name=_("Device"))
    country = models.CharField(max_length=120, verbose_name=_("Country"))
    city = models.CharField(max_length=120, verbose_name=_("City"))
    latitude = models.CharField(max_length=24, verbose_name=_("Latitude"))
    longitude = models.CharField(max_length=25, verbose_name=_("Longitude"))
    region = models.CharField(max_length=120, verbose_name=_("Region"))
    city = models.CharField(max_length=120, verbose_name=_("City"))

    class Meta:
        app_label = 'watchtower'
        verbose_name = _(u'Hit')
        verbose_name_plural = _(u'Hits')
        ordering = ['-created']

    def __str__(self):
        return self.path + ' - ' + str(self.created)
Esempio n. 10
0
class Enquiry(models.Model):
    email = models.EmailField()
    name = models.CharField(_('Name'), max_length=255)
    message = models.TextField(_('Message'))
    created = CreationDateTimeField()
    modified = ModificationDateTimeField()

    def get_full_name(self):
        return "{0} {1}".format(self.name)

    def __unicode__(self):
        return self.email

    class Meta:
        verbose_name = 'Enquiry'
        verbose_name_plural = 'Enquiries'
        ordering = [
            'created',
        ]

    def save(self, *args, **kwargs):
        super(Enquiry, self).save(*args, **kwargs)
        send_mail(
            '[enquiry] From Chiswick Website',
            'From {0} email: {1} \n {2}'.format(self.name, self.email,
                                                self.message),
            settings.DEFAULT_FROM_EMAIL,
            [
                '*****@*****.**',
            ],
            fail_silently=False,
        )
Esempio n. 11
0
class BaseModel(models.Model):

    created = CreationDateTimeField()
    updated = ModificationDateTimeField()

    class Meta:
        abstract = True
Esempio n. 12
0
class Video(models.Model):
    """Video model for youtube videos
    """
    uploaded= CreationDateTimeField()
    youtube_id=models.CharField(max_length=20, unique=True)
    title=models.CharField(max_length=100)
    description=models.TextField(blank=True)
    programmes=models.ManyToManyField(Programme, blank=True)
    genre=models.ManyToManyField(Genre,blank=True)
    featured=models.BooleanField( default=False)
    hidden = models.BooleanField(default=False)

    def __unicode__(self):
        return self.title
    def thumbnail(self):
	    return '/'.join(['http://img.youtube.com/vi',self.youtube_id,'maxresdefault.jpg'])
    def get_genres(self):
        return ', '.join( list(self.genre.all()[:2]) )
    def summary(self):
        return ''.join([self.description[:50],'...'])
    def title_summary(self):
        title_truncated=self.title[:50]
        if len(title_truncated)<len(self.title):
            return ''.join([self.title[:50],'...'])
        else:
            return self.title
    class Meta:
        ordering = ['-uploaded']
        get_latest_by = 'uploaded'
Esempio n. 13
0
class Article(models.Model):
    forum = models.ForeignKey(Forum, verbose_name='板块')
    created = CreationDateTimeField("创建的时间")
    title = models.CharField("标题", max_length=255)
    body = models.TextField("文章内容")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='创建的用户')
    attachment = models.ManyToManyField(Attachment)
    update_date = models.DateTimeField('更新的时间', blank=True, null=True)
    kw = jsonfield.JSONField()

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        words = posseg.cut(self.title)
        words = [k.word for k in words if k.flag in ['n', 'eng'] and len(k.word) > 1]
        self.kw = words
        super(Article, self).save(force_insert, force_update, using, update_fields)

    def get_markdown(self):
        return markdown.markdown(self.body)

    def get_absolute_url(self):
        return reverse("article:detail", kwargs={"pk": self.id})

    def get_last_reply(self):
        return self.reply_set.order_by('created').last()

    class Meta(object):
        verbose_name = verbose_name_plural = '文章'

    def __str__(self):
        return self.title
Esempio n. 14
0
class Terms(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL)

    created = CreationDateTimeField(_('creation date'))
    updated = ModificationDateTimeField(_('last modification'))

    date = models.DateTimeField()

    contents = models.CharField(max_length=500000)
    version = models.CharField(max_length=40)

    def __unicode__(self):
        return 'Terms {0} - {1}'.format(self.version, self.date.date())

    class Meta:
        ordering = ('-date', )
        verbose_name_plural = _('Terms')
        verbose_name = _('Term')

    @classmethod
    def get_current(cls):
        queryset = cls.objects.filter(date__lte=now()).order_by('-date')
        if queryset.count():
            return queryset.all()[0]
        return None
Esempio n. 15
0
class TaskStatusLog(models.Model):
    task = models.ForeignKey('tasks.Task')
    status = models.CharField(_('status'), max_length=20)
    start = CreationDateTimeField(
        _('created'), help_text=_('When this task entered in this status.'))

    class Meta:
        verbose_name = _(u'task status log')
        verbose_name_plural = _(u'task status logs')

    class Analytics:
        type = 'task'
        tags = {
            'id': 'task.id',
            'status': 'status',
            'theme': {
                'task.project.theme.name': {
                    'translate': True
                }
            },
            'theme_slug': 'task.project.theme.slug',
            'location': 'task.project.location.name',
            'location_group': 'task.project.location.group.name',
            'country': 'task.project.country_name'
        }
        fields = {
            'id': 'task.id',
            'project_id': 'task.project.id',
            'user_id': 'task.author.id',
        }

        @staticmethod
        def timestamp(obj, created):
            return obj.start
Esempio n. 16
0
class Realm(models.Model):
    name = models.CharField(strings.NAME, max_length=128, unique=True)
    prefix = models.SlugField(strings.PREFIX)
    description = models.TextField(strings.DESCRIPTION)
    created_at = CreationDateTimeField(strings.CREATED_AT)
    updated_at = ModificationDateTimeField(strings.UPDATED_AT)

    class Meta:
        ordering = (
            'name',
            'created_at',
        )
        verbose_name = strings.REALM
        verbose_name_plural = strings.REALM_PLURAL

    def __unicode__(self):
        return self.name

    def apply_text_substitutions(self, text):
        substitutions = self.textsubstitution_set.all()
        for s in substitutions:
            regexp = re.compile(s.regexp)
            result = regexp.subn(s.sub, text)
            text = result[0]
        return text
Esempio n. 17
0
class ProjectPhaseLog(models.Model):
    project = models.ForeignKey('projects.Project')
    status = models.ForeignKey('bb_projects.ProjectPhase')
    start = CreationDateTimeField(
        _('created'), help_text=_('When this project entered in this status.')
    )

    class Meta:
        verbose_name = _('project phase log')
        verbose_name_plural = _('project phase logs')

    class Analytics:
        type = 'project'
        tags = {
            'id': 'project.id',
            'sub_type': 'project.project_type',
            'status': 'status.name',
            'status_slug': 'status.slug',
            'theme': {
                'project.theme.name': {'translate': True}
            },
            'theme_slug': 'project.theme.slug',
            'location': 'project.location.name',
            'location_group': 'project.location.group.name',
            'country': 'project.country_name'
        }
        fields = {
            'id': 'project.id',
            'user_id': 'project.owner.id'
        }

        @staticmethod
        def timestamp(obj, created):
            return obj.start
Esempio n. 18
0
class Base(models.Model):
    id = models.AutoField(primary_key=True)
    created = CreationDateTimeField()
    modified = ModificationDateTimeField()

    class Meta(object):
        abstract = True
Esempio n. 19
0
class BaseModel(models.Model):

    created = CreationDateTimeField(
        _(u'Fecha y hora de creación')
    )
    modified = ModificationDateTimeField(
        _(u'Fecha y hora de modificación')
    )

    class Meta:
        get_latest_by = 'modified'
        ordering = ('-modified', '-created',)
        abstract = True

    def __str__(self):
        return unidecode(self.__unicode__())

    def __unicode__(self):
        return u'Objeto %s (PK: %d)' % (
            self.__class__.__name__,
            self.pk
        )

    def __repr__(self):
        return '<%s object %s (PK: %d) at %s>' % (
            self.__class__.__name__,
            str(self),
            self.pk,
            hex(id(self))
        )

    def save(self, *args, **kwargs):
        self.full_clean()
        super(BaseModel, self).save(*args, **kwargs)
Esempio n. 20
0
class Tag(models.Model):
    created = CreationDateTimeField("创建的时间")
    title = models.CharField("名称", max_length=255)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='创建的用户')
    avatar = models.ImageField("图标", default="tag-default.png")
    describe = models.TextField("描述", null=True, blank=True)
    update_date = models.DateTimeField(default=now())

    def get_absolute_url(self):
        return reverse("tag:tag_detail", kwargs={"title": self.title})

    def get_week_count(self):
        return self.question_set.filter(created__gt=now() - datetime.timedelta(
            days=7)).count() + self.article_set.filter(
                created__gt=now() - datetime.timedelta(days=7)).count()

    def get_30_count(self):
        return self.question_set.filter(created__gt=now() - datetime.timedelta(
            days=30)).count() + self.article_set.filter(
                created__gt=now() - datetime.timedelta(days=30)).count()

    def __str__(self):
        return self.title

    class Meta(object):
        verbose_name = verbose_name_plural = '标签'
Esempio n. 21
0
class Topic(models.Model):
    """A political topic

    Political topic is a point of interest around a topic.

    Attributes
    ----------

    default_body : Body
        Many government bodies can work on a same topic, but usually one
        topic is bound to a particular government body. This parameter
        specifies which political body is most relevant for this topic.

    """
    created = CreationDateTimeField()
    slug = autoslug.AutoSlugField(populate_from='title')
    title = models.CharField(_("Pavadinimas"), max_length=255)
    description = models.TextField(_("Aprašymas"), blank=True)
    indicators = models.ManyToManyField(Indicator, blank=True)
    default_body = models.ForeignKey(Body,
                                     null=True,
                                     blank=True,
                                     on_delete=models.SET_NULL)
    logo = ImageField(upload_to='topics/%Y/%m/%d/', blank=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('topic-details', args=[self.pk, self.slug])
Esempio n. 22
0
class ShipmentDetails(models.Model):
    STATUS_TYPE_PENDING = 'PENDING'
    STATUS_TYPE_PROCESSED = 'PROCESSED'

    status_type_choices = ((STATUS_TYPE_PENDING, STATUS_TYPE_PENDING),
                           (STATUS_TYPE_PROCESSED, STATUS_TYPE_PROCESSED))

    id = models.CharField(max_length=24, primary_key=True, default=get_24_char_uuid)
    shipment_id = models.IntegerField(unique=True)
    shipment_date = models.DateTimeField()
    transport_id = models.CharField(max_length=30, unique=True)
    transport_label = models.CharField(max_length=15, blank=True, null=True)
    shipment_reference = models.CharField(max_length=50)
    status = models.CharField(max_length=30, choices=status_type_choices, default=STATUS_TYPE_PENDING)
    seller = models.ForeignKey(SellerDetails, on_delete=models.DO_NOTHING)
    user = models.ForeignKey(CustomerDetails, on_delete=models.DO_NOTHING, blank=True, null=True)

    created = CreationDateTimeField()
    modified = ModificationDateTimeField()

    def __unicode__(self):
        return '{} {}'.format(self.shipment_id, self.shipment_reference)

    class Meta:
        verbose_name = 'Shipment detail'
Esempio n. 23
0
class Hackathon(models.Model):
    class Meta:
        app_label = 'hackathon'
        db_table = 'hackathon_hackathon'
        verbose_name = 'Hackathon'
        ordering = ['-created']
        get_latest_by = 'created'

    name = models.CharField('Name', max_length=24, unique=True)
    slogan = models.CharField('Slogan', max_length=256)
    template = models.CharField('Template', max_length=32, default='default')
    slug = models.CharField('Team Slug', max_length=24, unique=True)
    cover = models.ImageField('Cover', upload_to='hackathons')
    start = models.DateTimeField('Start')
    end = models.DateTimeField('End')
    instruction = models.TextField(
        'Instructions',
        help_text='Please input the content with markdown syntax')
    created = CreationDateTimeField()
    updated = ModificationDateTimeField()

    def save(self,
             force_insert=False,
             force_update=False,
             using=None,
             update_fields=None):

        if not self.slug:
            self.slug = slugify(self.name)
        super(Hackathon, self).save(force_insert, force_update, using,
                                    update_fields)
Esempio n. 24
0
class Addon(models.Model):
    """Optional add-ons (applications) that are installed by the user."""

    name = models.CharField(unique=True, max_length=60)
    version = models.CharField(max_length=20,
                               help_text='Don\'t include a leading "V".')
    manufacturer = models.CharField(max_length=80)

    url_root = \
        models.CharField(unique=True,
                         max_length=40,
                         help_text="The urlconf is rooted here. "
                         "Don't use leading or trailing slashes.")

    notes = models.TextField(blank=True,
                             help_text="Instructions, release notes, etc.")

    installed_date = CreationDateTimeField()
    updated_date = ModificationDateTimeField()

    objects = ApplicationManager()

    def __unicode__(self):
        """Return a useful string."""

        return "%s v%s from %s, rooted at %s" % \
            (self.name, self.version, self.manufacturer, self.url_root)
Esempio n. 25
0
class BRCreationModificationModel(models.Model):

    data_criacao = CreationDateTimeField(_(u'Data de criação'))
    data_modificacao = ModificationDateTimeField(_(u'Data de modificação'))

    class Meta:
        abstract = True
Esempio n. 26
0
class OrganizationContact(ValidatedModelMixin, models.Model):
    """
    Basic details for an organization contact
    """
    name = models.TextField(_('name'), null=True, blank=True, max_length=100)
    email = models.EmailField(_('email'),
                              null=True,
                              blank=True,
                              max_length=254)
    phone = models.TextField(_('phone'), null=True, blank=True, max_length=40)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,
                              verbose_name=_('owner'),
                              null=True)

    created = CreationDateTimeField(
        _('created'), help_text=_('When this contact was created.'))
    updated = ModificationDateTimeField(_('updated'))

    required_fields = ['name', 'email']

    class Meta(object):
        verbose_name = _('Partner Organization Contact')
        verbose_name_plural = _('Partner Organization Contacts')

    def __str__(self):
        return str(self.name)
Esempio n. 27
0
class AkismetSubmission(models.Model):
    """
    Stores the submissions to Akismet that are sent by trusted writers.

    This shall be used as a log of sorts to make sure we know what the data
    has been reported to Akismet as spam or ham.
    """

    SPAM_TYPE, HAM_TYPE = "spam", "ham"
    TYPES = (
        (SPAM_TYPE, _("Spam")),
        (HAM_TYPE, _("Ham")),
    )
    sender = models.ForeignKey(settings.AUTH_USER_MODEL,
                               on_delete=models.PROTECT)
    sent = CreationDateTimeField(
        _("sent at"),
        db_index=True,
    )
    type = models.CharField(
        _("type"),
        max_length=4,
        choices=TYPES,
        db_index=True,
    )

    class Meta:
        get_latest_by = "sent"
        ordering = ("-sent", )
        abstract = True
Esempio n. 28
0
class Server(models.Model):
    host = models.CharField(_('host'),
                            max_length=255,
                            help_text=_('domain or ip address'))
    user = models.ForeignKey(to=get_user_model())

    created = CreationDateTimeField(_('created'))
    modified = ModificationDateTimeField(_('modified'))

    objects = ServerManager()

    def __unicode__(self):
        return u'%s' % self.host

    class Meta:
        get_latest_by = 'modified'
        ordering = (
            '-modified',
            '-created',
        )

    def get_absolute_url(self):
        return reverse('servers:server', kwargs={'server_id': self.pk})

    def get_last_scan(self):
        scans = ScanTask.objects.get_by_server(self)
        return scans[0] if scans else None
Esempio n. 29
0
class Contact(models.Model):
    contact_name = models.CharField(max_length=200, null=False)
    email = models.CharField(max_length=70, null=False)
    subject = models.CharField(max_length=40, null=False)
    message = models.TextField(null=True)
    created_date = CreationDateTimeField()
    updated_date = ModificationDateTimeField()
Esempio n. 30
0
class Tutorial(models.Model):
    LIVE = 1
    HIDDEN = 2
    STATUS_CHOICES = (
        (LIVE, _('Published')),
        (HIDDEN, _('Unpublished')),
        )
    title = models.CharField(max_length=255)
    slug = AutoSlugField(unique=True, populate_from='title')
    body = models.TextField()
    url = models.URLField(blank=True)
    thumbnail = models.ImageField(upload_to="tutorials", blank=True)
    status = models.IntegerField(choices=STATUS_CHOICES, default=HIDDEN)
    created = CreationDateTimeField()
    modified = ModificationDateTimeField()

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('tutorial:object_detail', [self.slug])

    @property
    def is_published(self):
        return self.status == self.LIVE