snipt/snipts/models.py

126 lines
4.4 KiB
Python

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 taggit.utils import edit_string_for_tags
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter
from snipts.utils import slugify_uniquely
import md5
site = Site.objects.all()[0]
class Snipt(models.Model):
"""An individual Snipt."""
user = models.ForeignKey(User, blank=True, null=True)
title = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, blank=True)
tags = TaggableManager()
lexer = models.CharField(max_length=50)
code = models.TextField()
stylized = models.TextField(blank=True, null=True)
embedded = models.TextField(blank=True, null=True)
line_count = models.IntegerField(blank=True, null=True, default=None)
key = models.CharField(max_length=100, blank=True, null=True)
public = models.BooleanField(default=False)
# TODO: Change back auto
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.key:
self.key = md5.new(self.slug).hexdigest()
if not self.slug:
self.slug = slugify_uniquely(self.title, Snipt)
self.stylized = highlight(self.code,
get_lexer_by_name(self.lexer, encoding='UTF-8'),
HtmlFormatter())
self.line_count = len(self.code.split('\n'))
embedded = highlight(self.code,
get_lexer_by_name(self.lexer, encoding='UTF-8'),
HtmlFormatter(
style='native',
noclasses=True,
prestyles="""
background-color: #1C1C1C;
border-radius: 5px;
color: #D0D0D0;
display: block;
font: 11px Monaco, monospace !important;
margin: 0;
overflow: auto;
padding: 15px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
"""))
embedded = (embedded.replace("\\\"","\\\\\"")
.replace('\'','\\\'')
.replace('\\n','\\\\n')
.replace("\\x", "\\\\x")
.replace('\\'', '\\\\'')
.replace('\\s', '\\\\s')
.replace('background: #202020', ''))
self.embedded = embedded
return super(Snipt, self).save(*args, **kwargs)
def __unicode__(self):
return self.title
def get_absolute_url(self):
return '/{}/{}/'.format(self.user.username, self.slug)
def get_full_absolute_url(self):
if settings.DEBUG:
root = 'http://snipt.localhost'
else:
if settings.USE_HTTPS:
root = 'https://snipt.net'
else:
root = 'http://snipt.net'
return '{}/{}/{}/'.format(root, self.user.username, self.slug)
def get_embed_url(self):
return 'http{}://{}/embed/{}/'.format('s' if settings.USE_HTTPS else '',
site.domain,
self.key)
@property
def sorted_tags(self):
return self.tags.all().order_by('name')
@property
def tags_list(self):
return edit_string_for_tags(self.tags.all())
@property
def lexer_name(self):
return get_lexer_by_name(self.lexer).name
class Favorite(models.Model):
snipt = models.ForeignKey(Snipt)
user = models.ForeignKey(User)
# TODO: Change back auto
created = models.DateTimeField(auto_now_add=False, editable=False)
modified = models.DateTimeField(auto_now=False, editable=False)
def __unicode__(self):
return u'{} favorited by {}'.format(self.snipt.title, self.user.username)