diff weblinks/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/weblinks/models.py@368d731af479
children 6e6492468bb8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weblinks/models.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,139 @@
+"""
+This module contains the models for the weblinks application.
+"""
+import datetime
+
+from django.db import models
+from django.contrib.auth.models import User
+
+
+class Category(models.Model):
+    """Links belong to categories"""
+    title = models.CharField(max_length=64)
+    slug = models.SlugField(max_length=64)
+    description = models.TextField(blank=True)
+    count = models.IntegerField(default=0)
+
+    def __unicode__(self):
+        return self.title
+
+    class Meta:
+        verbose_name_plural = 'Categories'
+        ordering = ('title', )
+
+
+class PublicLinkManager(models.Manager):
+    """The manager for all public links."""
+    def get_query_set(self):
+        return super(PublicLinkManager, self).get_query_set().filter(
+                is_public=True).select_related()
+
+
+class LinkBase(models.Model):
+    """Abstract model to aggregate common fields of a web link."""
+    category = models.ForeignKey(Category)
+    title = models.CharField(max_length=128)
+    url = models.URLField(db_index=True)
+    description = models.TextField(blank=True)
+    user = models.ForeignKey(User)
+    date_added = models.DateTimeField(db_index=True)
+    update_date = models.DateTimeField(db_index=True, blank=True)
+
+    class Meta:
+        abstract = True
+
+
+class Link(LinkBase):
+    """Model to represent a web link"""
+    hits = models.IntegerField(default=0)
+    is_public = models.BooleanField(default=False, db_index=True)
+
+    # Managers:
+    objects = models.Manager()
+    public_objects = PublicLinkManager()
+
+    class Meta:
+        ordering = ('title', )
+
+    def __unicode__(self):
+        return self.title
+
+    def save(self, *args, **kwargs):
+        if not self.pk:
+            if not self.date_added:
+                self.date_added = datetime.datetime.now()
+            self.update_date = self.date_added
+        else:
+            self.update_date = datetime.datetime.now()
+
+        super(Link, self).save(*args, **kwargs)
+
+    @models.permalink
+    def get_absolute_url(self):
+        return ('weblinks-link_detail', [str(self.id)])
+
+    def search_title(self):
+        return self.title
+
+    def search_summary(self):
+        return self.description
+
+
+class PendingLink(LinkBase):
+    """This model represents links that users submit. They must be approved by
+    an admin before they become visible on the site.
+    """
+    class Meta:
+        ordering = ('date_added', )
+
+    def __unicode__(self):
+        return self.title
+
+    def save(self, *args, **kwargs):
+        if not self.pk:
+            self.date_added = datetime.datetime.now()
+            self.update_date = self.date_added
+        else:
+            self.update_date = datetime.datetime.now()
+
+        super(PendingLink, self).save(*args, **kwargs)
+
+
+class FlaggedLinkManager(models.Manager):
+
+    def create(self, link, user):
+        flagged_link = FlaggedLink(link = link, user = user, approved = False)
+        flagged_link.save()
+
+
+class FlaggedLink(models.Model):
+    """Model to represent links that have been flagged as broken by users"""
+    link = models.ForeignKey(Link)
+    user = models.ForeignKey(User)
+    date_flagged = models.DateField(auto_now_add = True)
+    approved = models.BooleanField(default = False, 
+        help_text = 'Check this and save to remove the referenced link from the database')
+
+    objects = FlaggedLinkManager()
+
+    def save(self, *args, **kwargs):
+        if self.approved:
+            self.link.delete()
+            self.delete()
+        else:
+            super(FlaggedLink, self).save(*args, **kwargs)
+
+    def url(self):
+        return self.link.url
+
+    def get_link_url(self):
+        return '<a href="%s">Link #%d</a>' % (self.link.get_absolute_url(),
+                self.link.id)
+    get_link_url.allow_tags = True
+    get_link_url.short_description = "View Link on Site"
+
+    def __unicode__(self):
+        return self.link.title
+
+    class Meta:
+        ordering = ('-date_flagged', )