96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
from django.template.defaultfilters import slugify
|
|
from django.contrib.sites.models import Site
|
|
from django.contrib.auth.models import User
|
|
from django.conf import settings
|
|
from django.db import models
|
|
|
|
from taggit.managers import TaggableManager
|
|
|
|
from pygments import highlight
|
|
from pygments.lexers import get_lexer_by_name
|
|
from pygments.formatters import HtmlFormatter
|
|
|
|
|
|
site = Site.objects.all()[0]
|
|
|
|
class Snipt(models.Model):
|
|
"""An individual Snipt."""
|
|
|
|
user = models.ForeignKey(User)
|
|
|
|
title = models.CharField(max_length=255)
|
|
description = models.TextField(blank=True, null=True)
|
|
slug = models.SlugField(max_length=255, blank=True)
|
|
tags = TaggableManager()
|
|
|
|
lexer = models.CharField(max_length=50)
|
|
code = models.TextField()
|
|
stylized = models.TextField()
|
|
line_count = models.IntegerField(blank=True, null=True, default=None)
|
|
|
|
key = models.CharField(max_length=100)
|
|
public = models.BooleanField(default=False)
|
|
|
|
# TODO Set back to True for production!
|
|
created = models.DateTimeField(auto_now_add=False, editable=False)
|
|
modified = models.DateTimeField(auto_now=False, editable=False)
|
|
|
|
def save(self, *args, **kwargs):
|
|
if not self.slug:
|
|
self.slug = slugify(self.title)[:50]
|
|
|
|
return super(Snipt, self).save(*args, **kwargs)
|
|
|
|
def __unicode__(self):
|
|
return self.title
|
|
|
|
def get_absolute_url(self):
|
|
return "/%s/%s/" % (self.user.username, self.slug)
|
|
|
|
#TODO This needs to be deprecated - render stylized version on save
|
|
def get_stylized(self):
|
|
if self.stylized == '':
|
|
self.stylized = highlight(self.code,
|
|
get_lexer_by_name(self.lexer, encoding='UTF-8'),
|
|
HtmlFormatter())
|
|
self.save()
|
|
return self.stylized
|
|
else:
|
|
return self.stylized
|
|
|
|
#TODO This needs to be deprecated - render line count on save
|
|
def get_line_count(self):
|
|
if not self.line_count:
|
|
self.line_count = len(self.code.split('\n'))
|
|
self.save()
|
|
return self.line_count
|
|
else:
|
|
return self.line_count
|
|
|
|
def get_embed_url(self):
|
|
return 'http%s://%s/embed/%s/' % ('s' if settings.USE_HTTPS else '',
|
|
site.domain,
|
|
self.key)
|
|
|
|
@property
|
|
def lexer_name(self):
|
|
return get_lexer_by_name(self.lexer).name
|
|
|
|
class Comment(models.Model):
|
|
"""A comment on a Snipt"""
|
|
|
|
user = models.ForeignKey(User)
|
|
snipt = models.ForeignKey(Snipt)
|
|
|
|
comment = models.TextField()
|
|
|
|
# TODO Set back to True for production!
|
|
created = models.DateTimeField(auto_now_add=False, editable=False)
|
|
modified = models.DateTimeField(auto_now=False, editable=False)
|
|
|
|
def __unicode__(self):
|
|
return u'%s on %s' %(self.user, self.snipt)
|
|
|
|
def get_absolute_url(self):
|
|
return '%s#comment-%d' % (self.snipt.get_absolute_url(), self.id)
|