annotate apps/snippet/models.py @ 139:b8e0bdc37e32

Hide snippets created by anonymous users Created a custom manager for Snippet, with a public() method for easily retrieving all the snippets that were created by registered users. This change makes the code a bit neater, as it's no longer to necessary to have to do the {% if snippet.author %} check every time.
author dellsystem <ilostwaldo@gmail.com>
date Sat, 29 Sep 2012 21:31:17 -0400
parents 180404efc8cf
children c7be7def8b57
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
1 import datetime
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
2 import difflib
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
3 import random
101
a8da60d611f7 Reorder imports in some python files
dellsystem <ilostwaldo@gmail.com>
parents: 100
diff changeset
4
2
3cef0d445036 Start actual app structure
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
diff changeset
5 from django.db import models
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
6 from django.utils.translation import ugettext_lazy as _
54
898881bbfdea Tie snippets to their authors, enable a couple more lexer languages
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 46
diff changeset
7 from django.contrib.auth.models import User
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
8
101
a8da60d611f7 Reorder imports in some python files
dellsystem <ilostwaldo@gmail.com>
parents: 100
diff changeset
9 from agora.apps.snippet.highlight import LEXER_DEFAULT, LEXER_LIST, pygmentize
a8da60d611f7 Reorder imports in some python files
dellsystem <ilostwaldo@gmail.com>
parents: 100
diff changeset
10 import agora.apps.mptt as mptt
a8da60d611f7 Reorder imports in some python files
dellsystem <ilostwaldo@gmail.com>
parents: 100
diff changeset
11
91
8ef0a2a03034 Add some blank lines where relevant
dellsystem <ilostwaldo@gmail.com>
parents: 54
diff changeset
12
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
13 t = 'abcdefghijkmnopqrstuvwwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ1234567890'
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
14 def generate_secret_id(length=4):
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
15 return ''.join([random.choice(t) for i in range(length)])
2
3cef0d445036 Start actual app structure
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
diff changeset
16
139
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
17 class SnippetManager(models.Manager):
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
18 def public(self):
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
19 """
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
20 Returns all the snippets that were created by registered users
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
21 and thus can be publicly listed.
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
22 """
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
23 return self.filter(author__isnull=False)
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
24
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
25
3
9a4429652662 Define models
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
26 class Snippet(models.Model):
139
b8e0bdc37e32 Hide snippets created by anonymous users
dellsystem <ilostwaldo@gmail.com>
parents: 108
diff changeset
27 objects = SnippetManager()
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
28 secret_id = models.CharField(_(u'Secret ID'), max_length=4, blank=True)
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
29 title = models.CharField(_(u'Title'), max_length=120, blank=True)
54
898881bbfdea Tie snippets to their authors, enable a couple more lexer languages
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 46
diff changeset
30 author = models.ForeignKey(User, max_length=30, blank=True, null=True)
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
31 content = models.TextField(_(u'Content'), )
46
b7c1c22fdfe8 Format code for 80 columns, add some js to static/ dir
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 42
diff changeset
32 content_highlighted = models.TextField(_(u'Highlighted Content'),
b7c1c22fdfe8 Format code for 80 columns, add some js to static/ dir
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 42
diff changeset
33 blank=True)
99
d858aae811d0 Move choices for lexer field from SnippetForm to Snippet
dellsystem <ilostwaldo@gmail.com>
parents: 91
diff changeset
34 lexer = models.CharField(_(u'Lexer'),
d858aae811d0 Move choices for lexer field from SnippetForm to Snippet
dellsystem <ilostwaldo@gmail.com>
parents: 91
diff changeset
35 max_length=30,
d858aae811d0 Move choices for lexer field from SnippetForm to Snippet
dellsystem <ilostwaldo@gmail.com>
parents: 91
diff changeset
36 choices=LEXER_LIST,
d858aae811d0 Move choices for lexer field from SnippetForm to Snippet
dellsystem <ilostwaldo@gmail.com>
parents: 91
diff changeset
37 default=LEXER_DEFAULT)
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
38 published = models.DateTimeField(_(u'Published'), blank=True)
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
39 expires = models.DateTimeField(_(u'Expires'), blank=True, help_text='asdf')
46
b7c1c22fdfe8 Format code for 80 columns, add some js to static/ dir
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 42
diff changeset
40 parent = models.ForeignKey('self', null=True, blank=True,
b7c1c22fdfe8 Format code for 80 columns, add some js to static/ dir
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 42
diff changeset
41 related_name='children')
102
f872c643b056 Updates to snippet functionality (see details)
dellsystem <ilostwaldo@gmail.com>
parents: 101
diff changeset
42 num_views = models.IntegerField(default=0)
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
43
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
44 class Meta:
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
45 ordering = ('-published',)
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
46
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
47 def get_linecount(self):
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
48 return len(self.content.splitlines())
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
49
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
50 def content_splitted(self):
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
51 return self.content_highlighted.splitlines()
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
52
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
53 def save(self, *args, **kwargs):
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
54 if not self.pk:
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
55 self.published = datetime.datetime.now()
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
56 self.secret_id = generate_secret_id()
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
57 self.content_highlighted = pygmentize(self.content, self.lexer)
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
58 super(Snippet, self).save(*args, **kwargs)
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
59
100
365144dad9d1 Add a get_title() method to the Snippet model
dellsystem <ilostwaldo@gmail.com>
parents: 99
diff changeset
60 def get_title(self):
365144dad9d1 Add a get_title() method to the Snippet model
dellsystem <ilostwaldo@gmail.com>
parents: 99
diff changeset
61 return self.title or _('Snippet #%d' % self.id)
365144dad9d1 Add a get_title() method to the Snippet model
dellsystem <ilostwaldo@gmail.com>
parents: 99
diff changeset
62
108
180404efc8cf Remove unnecessary import from snippet models.py
dellsystem <ilostwaldo@gmail.com>
parents: 102
diff changeset
63 @models.permalink
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
64 def get_absolute_url(self):
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
65 return ('snippet_details', (self.secret_id,))
29
6ba969517b9c Implement initial profiles, cleanup models, change Free_license to FreeLicense
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
66
30
f14aaa98306a Register more apps in the admin site, write an actual template for the user profile page
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 29
diff changeset
67 def __unicode__(self):
42
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
68 return '%s' % self.secret_id
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
69
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
70 mptt.register(Snippet, order_insertion_by=['content'])
ab608f27ecd5 Copy preliminary django-paste code for snippets along with mptt. Works clunkily. Still need to adapt it for Agora.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 30
diff changeset
71
30
f14aaa98306a Register more apps in the admin site, write an actual template for the user profile page
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 29
diff changeset
72
29
6ba969517b9c Implement initial profiles, cleanup models, change Free_license to FreeLicense
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
73 class CodeLanguage(models.Model):
6ba969517b9c Implement initial profiles, cleanup models, change Free_license to FreeLicense
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
74 name = models.CharField(max_length=64)
30
f14aaa98306a Register more apps in the admin site, write an actual template for the user profile page
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 29
diff changeset
75
f14aaa98306a Register more apps in the admin site, write an actual template for the user profile page
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 29
diff changeset
76 def __unicode__(self):
f14aaa98306a Register more apps in the admin site, write an actual template for the user profile page
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 29
diff changeset
77 return name