Mercurial > agora-palash
view apps/snippet/models.py @ 102:f872c643b056
Updates to snippet functionality (see details)
Sorry about the large commit, but it was difficult to break it up as a lot
of new functionality was introduced. Most of it is specific to the snippet
feature but there are some other changes as well.
Commit highlights:
* Added the ability to switch the syntax highlighting colour scheme when
viewing a snippet. This is currently done on a per-snippet basis only,
but eventually it will be possible to set a default in your profile to
have all the snippets you view use that colour scheme. There are currently
8 different colour schemes, all of which were taken from the default
pygments stylesheets (some were modified).
* Added a "num_views" field to the Snippet model, with the field being
incremented any time the snippet view is called (raw or regular view).
* Created a simple "explore" view that lists the recently-posted snippets.
Will implement pagination and sorting by other attributes ("popularity",
for example, based on number of views) as well.
* Added a post-save hook to the User model to ensure that a Profile is created
for every user as soon as the User itself is created. This alleviates the
need for a get_profile method that checks if the user has a profile or not
and creates one if necessary. (The code is currently still there, will be
cleaned up soon).
* Added back the wordwrap toggling feature. Currently, if you want to enable
word-wrapping, the line numbers have to be hidden in order to ensure that
the lines and their numbers don't go out of sync. This will be fixed soon.
* History/diff view is back
* And some other minor cosmetic changes.
Note: since some existing models have been changed, you'll likely need to
delete the existing sqlite database before running syncdb. The alternative
is to determine the necessary column changes/additions and run the SQL
query yourself.
author | dellsystem <ilostwaldo@gmail.com> |
---|---|
date | Fri, 31 Aug 2012 02:53:22 -0400 |
parents | a8da60d611f7 |
children | 180404efc8cf |
line wrap: on
line source
import datetime import difflib import random from django.db import models from django.db.models import permalink from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from agora.apps.snippet.highlight import LEXER_DEFAULT, LEXER_LIST, pygmentize import agora.apps.mptt as mptt t = 'abcdefghijkmnopqrstuvwwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ1234567890' def generate_secret_id(length=4): return ''.join([random.choice(t) for i in range(length)]) class Snippet(models.Model): secret_id = models.CharField(_(u'Secret ID'), max_length=4, blank=True) title = models.CharField(_(u'Title'), max_length=120, blank=True) author = models.ForeignKey(User, max_length=30, blank=True, null=True) content = models.TextField(_(u'Content'), ) content_highlighted = models.TextField(_(u'Highlighted Content'), blank=True) lexer = models.CharField(_(u'Lexer'), max_length=30, choices=LEXER_LIST, default=LEXER_DEFAULT) published = models.DateTimeField(_(u'Published'), blank=True) expires = models.DateTimeField(_(u'Expires'), blank=True, help_text='asdf') parent = models.ForeignKey('self', null=True, blank=True, related_name='children') num_views = models.IntegerField(default=0) class Meta: ordering = ('-published',) def get_linecount(self): return len(self.content.splitlines()) def content_splitted(self): return self.content_highlighted.splitlines() def save(self, *args, **kwargs): if not self.pk: self.published = datetime.datetime.now() self.secret_id = generate_secret_id() self.content_highlighted = pygmentize(self.content, self.lexer) super(Snippet, self).save(*args, **kwargs) def get_title(self): return self.title or _('Snippet #%d' % self.id) @permalink def get_absolute_url(self): return ('snippet_details', (self.secret_id,)) def __unicode__(self): return '%s' % self.secret_id mptt.register(Snippet, order_insertion_by=['content']) class CodeLanguage(models.Model): name = models.CharField(max_length=64) def __unicode__(self): return name