2011-10-02 15:38:20 -07:00
|
|
|
from django.contrib.sites.models import Site
|
2011-06-02 19:39:14 -07:00
|
|
|
from django.contrib.auth.models import User
|
2011-10-02 15:38:20 -07:00
|
|
|
from django.conf import settings
|
2011-06-02 19:39:14 -07:00
|
|
|
from django.db import models
|
|
|
|
|
2011-06-05 09:51:56 -07:00
|
|
|
from taggit.managers import TaggableManager
|
2012-02-17 16:14:53 -08:00
|
|
|
from taggit.utils import edit_string_for_tags
|
2011-06-05 09:51:56 -07:00
|
|
|
|
2012-04-23 11:34:21 -07:00
|
|
|
from markdown_deux import markdown
|
2011-10-02 15:38:20 -07:00
|
|
|
from pygments import highlight
|
|
|
|
from pygments.lexers import get_lexer_by_name
|
|
|
|
from pygments.formatters import HtmlFormatter
|
|
|
|
|
2012-02-11 07:23:09 -08:00
|
|
|
from snipts.utils import slugify_uniquely
|
|
|
|
|
2012-01-29 20:49:14 -08:00
|
|
|
import md5
|
|
|
|
|
2011-10-02 15:38:20 -07:00
|
|
|
|
2011-10-23 20:30:57 -07:00
|
|
|
site = Site.objects.all()[0]
|
2011-10-02 15:38:20 -07:00
|
|
|
|
2011-06-02 19:39:14 -07:00
|
|
|
class Snipt(models.Model):
|
2011-10-01 10:23:05 -07:00
|
|
|
"""An individual Snipt."""
|
2011-06-02 19:39:14 -07:00
|
|
|
|
2012-01-29 20:49:14 -08:00
|
|
|
user = models.ForeignKey(User, blank=True, null=True)
|
2011-06-02 19:39:14 -07:00
|
|
|
|
2012-02-13 19:36:59 -08:00
|
|
|
title = models.CharField(max_length=255)
|
|
|
|
slug = models.SlugField(max_length=255, blank=True)
|
|
|
|
tags = TaggableManager()
|
2011-06-02 19:39:14 -07:00
|
|
|
|
2012-02-13 19:36:59 -08:00
|
|
|
lexer = models.CharField(max_length=50)
|
|
|
|
code = models.TextField()
|
|
|
|
stylized = models.TextField(blank=True, null=True)
|
2012-02-26 19:20:37 -08:00
|
|
|
embedded = models.TextField(blank=True, null=True)
|
2011-10-19 20:50:23 -07:00
|
|
|
line_count = models.IntegerField(blank=True, null=True, default=None)
|
2011-06-02 19:39:14 -07:00
|
|
|
|
2012-01-29 20:49:14 -08:00
|
|
|
key = models.CharField(max_length=100, blank=True, null=True)
|
2011-06-02 19:39:14 -07:00
|
|
|
public = models.BooleanField(default=False)
|
|
|
|
|
2012-04-07 21:52:10 -07:00
|
|
|
created = models.DateTimeField(auto_now_add=True, editable=False)
|
|
|
|
modified = models.DateTimeField(auto_now=True, editable=False)
|
2011-06-02 19:39:14 -07:00
|
|
|
|
2011-10-01 10:23:05 -07:00
|
|
|
def save(self, *args, **kwargs):
|
2012-01-29 20:49:14 -08:00
|
|
|
|
2011-10-01 10:23:05 -07:00
|
|
|
if not self.slug:
|
2012-02-14 08:39:45 -08:00
|
|
|
self.slug = slugify_uniquely(self.title, Snipt)
|
2011-10-01 10:23:05 -07:00
|
|
|
|
2012-04-09 12:19:09 -07:00
|
|
|
if not self.key:
|
|
|
|
self.key = md5.new(self.slug).hexdigest()
|
|
|
|
|
2012-04-23 11:34:21 -07:00
|
|
|
if self.lexer == 'markdown':
|
|
|
|
self.stylized = markdown(self.code, 'default')
|
|
|
|
else:
|
|
|
|
self.stylized = highlight(self.code,
|
|
|
|
get_lexer_by_name(self.lexer, encoding='UTF-8'),
|
|
|
|
HtmlFormatter())
|
2012-01-29 20:49:14 -08:00
|
|
|
self.line_count = len(self.code.split('\n'))
|
|
|
|
|
2012-04-23 11:34:21 -07:00
|
|
|
if self.lexer == 'markdown':
|
|
|
|
lexer_for_embedded = 'text'
|
|
|
|
else:
|
|
|
|
lexer_for_embedded = self.lexer
|
|
|
|
|
2012-02-26 19:20:37 -08:00
|
|
|
embedded = highlight(self.code,
|
2012-04-23 11:34:21 -07:00
|
|
|
get_lexer_by_name(lexer_for_embedded, encoding='UTF-8'),
|
2012-02-26 19:20:37 -08:00
|
|
|
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
|
|
|
|
|
2011-10-02 11:02:13 -07:00
|
|
|
return super(Snipt, self).save(*args, **kwargs)
|
2011-10-01 10:23:05 -07:00
|
|
|
|
2011-06-02 19:39:14 -07:00
|
|
|
def __unicode__(self):
|
2011-10-01 10:23:05 -07:00
|
|
|
return self.title
|
2011-06-05 08:55:27 -07:00
|
|
|
|
2011-10-01 16:09:59 -07:00
|
|
|
def get_absolute_url(self):
|
2012-04-12 13:44:25 -07:00
|
|
|
if self.public:
|
|
|
|
return '/{}/{}/'.format(self.user.username, self.slug)
|
|
|
|
else:
|
|
|
|
return '/{}/{}/?key={}'.format(self.user.username, self.slug, self.key)
|
2011-10-01 16:09:59 -07:00
|
|
|
|
2012-01-16 21:07:15 -08:00
|
|
|
def get_full_absolute_url(self):
|
|
|
|
if settings.DEBUG:
|
|
|
|
root = 'http://snipt.localhost'
|
|
|
|
else:
|
2012-04-23 18:41:16 -07:00
|
|
|
root = 'https://snipt.net'
|
2012-02-13 19:36:59 -08:00
|
|
|
return '{}/{}/{}/'.format(root, self.user.username, self.slug)
|
2012-01-16 21:07:15 -08:00
|
|
|
|
2011-10-23 20:30:57 -07:00
|
|
|
def get_embed_url(self):
|
2012-04-23 18:41:16 -07:00
|
|
|
return 'https://{}/embed/{}/'.format(site.domain, self.key)
|
2011-10-02 15:38:20 -07:00
|
|
|
|
2011-11-10 11:34:51 -08:00
|
|
|
@property
|
|
|
|
def sorted_tags(self):
|
|
|
|
return self.tags.all().order_by('name')
|
|
|
|
|
2012-02-17 16:14:53 -08:00
|
|
|
@property
|
|
|
|
def tags_list(self):
|
|
|
|
return edit_string_for_tags(self.tags.all())
|
|
|
|
|
2011-10-13 10:30:44 -07:00
|
|
|
@property
|
|
|
|
def lexer_name(self):
|
2012-04-23 11:34:21 -07:00
|
|
|
if self.lexer == 'markdown':
|
|
|
|
return 'Markdown'
|
|
|
|
else:
|
|
|
|
return get_lexer_by_name(self.lexer).name
|
2012-02-13 19:36:59 -08:00
|
|
|
|
|
|
|
class Favorite(models.Model):
|
|
|
|
snipt = models.ForeignKey(Snipt)
|
|
|
|
user = models.ForeignKey(User)
|
|
|
|
|
2012-04-07 21:52:10 -07:00
|
|
|
created = models.DateTimeField(auto_now_add=True, editable=False)
|
|
|
|
modified = models.DateTimeField(auto_now=True, editable=False)
|
2012-02-13 19:36:59 -08:00
|
|
|
|
|
|
|
def __unicode__(self):
|
|
|
|
return u'{} favorited by {}'.format(self.snipt.title, self.user.username)
|