diff smiley/models.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/smiley/models.py@3a626c48e9ae
children 0729c73d5761
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smiley/models.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,88 @@
+"""
+Models for the smiley application.
+"""
+import re
+
+from django.db import models
+from django.core.cache import cache
+
+CACHE_TIMEOUT = 60 * 60      # seconds
+
+
+class SmileyManager(models.Manager):
+
+    def get_smiley_map(self):
+        """
+        Returns a dictionary, the keys are smiley codes.
+        The values are the HTML representations of the keys.
+        The dictionary is cached.
+        """
+        map = cache.get('smiley_map')
+        if map:
+            return map
+
+        map = dict((s.code, s.html()) for s in self.all())
+        cache.set('smiley_map', map, CACHE_TIMEOUT)
+        return map
+
+    def get_smilies(self, extra=False):
+        """
+        Returns smiley model instances filtered by the extra flag.
+        """
+        key = 'smileys' if not extra else 'smileys_extra'
+        smilies = cache.get(key)
+        if smilies:
+            return smilies
+
+        smilies = self.filter(is_extra=extra)
+        cache.set(key, smilies, CACHE_TIMEOUT)
+        return smilies
+
+    def get_smiley_regexes(self):
+        """
+        Returns a list of 2-tuples of the form: (regex, repl)
+        where regex is a regular expression for a smiley and
+        repl is the replacement image in Markdown format.
+        """
+        regexes = cache.get('smiley_regexes')
+        if regexes:
+            return regexes
+
+        regexes = [(re.compile(r"(^|\s|(?<=\s))%s(\s|$)" % re.escape(s.code)),
+            r"\1%s\2" % s.markdown()) for s in self.all()]
+        cache.set('smiley_regexes', regexes, CACHE_TIMEOUT)
+        return regexes
+
+
+class Smiley(models.Model):
+    image = models.ImageField(upload_to='smiley/images/')
+    title = models.CharField(max_length=32)
+    code = models.CharField(max_length=32)
+    is_extra = models.BooleanField()
+
+    objects = SmileyManager()
+
+    class Meta:
+        verbose_name_plural = 'Smilies'
+        ordering = ('title', )
+
+    def __unicode__(self):
+        return self.title
+
+    def get_absolute_url(self):
+        return self.image.url
+
+    def html(self):
+        """Returns a HTML img tag representation of the smiley."""
+        if self.image:
+            return (u'<img src="%s" alt="%s" title="%s" />' %
+                    (self.get_absolute_url(), self.title, self.title))
+        return u''
+    html.allow_tags = True
+
+    def markdown(self):
+        """Returns a markdown representation of the smiley."""
+        if self.image:
+            return (u'![%s](%s "%s")' % 
+                    (self.title, self.get_absolute_url(), self.title))
+        return u''