annotate weblinks/models.py @ 1201:fe10aea76cbd tip

Add 2023 MP3 compilation links
author Brian Neal <bgneal@gmail.com>
date Sun, 24 Mar 2024 14:50:23 -0500
parents eeaf387803c6
children
rev   line source
bgneal@193 1 """
gremmie@1 2 This module contains the models for the weblinks application.
bgneal@193 3 """
bgneal@204 4 import datetime
bgneal@204 5
bgneal@1035 6 from django.contrib.auth.models import User
bgneal@1035 7 from django.core.urlresolvers import reverse
gremmie@1 8 from django.db import models
gremmie@1 9
gremmie@1 10
gremmie@1 11 class Category(models.Model):
bgneal@193 12 """Links belong to categories"""
bgneal@193 13 title = models.CharField(max_length=64)
bgneal@242 14 slug = models.SlugField(max_length=64)
bgneal@193 15 description = models.TextField(blank=True)
bgneal@193 16 count = models.IntegerField(default=0)
gremmie@1 17
gremmie@1 18 def __unicode__(self):
gremmie@1 19 return self.title
gremmie@1 20
gremmie@1 21 class Meta:
gremmie@1 22 verbose_name_plural = 'Categories'
gremmie@1 23 ordering = ('title', )
gremmie@1 24
gremmie@1 25
gremmie@1 26 class PublicLinkManager(models.Manager):
gremmie@1 27 """The manager for all public links."""
bgneal@740 28 def get_queryset(self):
bgneal@740 29 return super(PublicLinkManager, self).get_queryset().filter(
bgneal@191 30 is_public=True).select_related()
gremmie@1 31
gremmie@1 32
bgneal@204 33 class LinkBase(models.Model):
bgneal@204 34 """Abstract model to aggregate common fields of a web link."""
gremmie@1 35 category = models.ForeignKey(Category)
gremmie@1 36 title = models.CharField(max_length=128)
bgneal@572 37 url = models.URLField(db_index=True)
gremmie@1 38 description = models.TextField(blank=True)
bgneal@237 39 user = models.ForeignKey(User)
bgneal@277 40 date_added = models.DateTimeField(db_index=True)
bgneal@277 41 update_date = models.DateTimeField(db_index=True, blank=True)
bgneal@204 42
bgneal@204 43 class Meta:
bgneal@204 44 abstract = True
bgneal@204 45
bgneal@204 46
bgneal@204 47 class Link(LinkBase):
bgneal@204 48 """Model to represent a web link"""
gremmie@1 49 hits = models.IntegerField(default=0)
gremmie@1 50 is_public = models.BooleanField(default=False, db_index=True)
gremmie@1 51
gremmie@1 52 # Managers:
gremmie@1 53 objects = models.Manager()
gremmie@1 54 public_objects = PublicLinkManager()
gremmie@1 55
bgneal@20 56 class Meta:
bgneal@20 57 ordering = ('title', )
bgneal@20 58
gremmie@1 59 def __unicode__(self):
gremmie@1 60 return self.title
gremmie@1 61
bgneal@277 62 def save(self, *args, **kwargs):
bgneal@277 63 if not self.pk:
bgneal@277 64 if not self.date_added:
bgneal@277 65 self.date_added = datetime.datetime.now()
bgneal@277 66 self.update_date = self.date_added
bgneal@277 67 else:
bgneal@277 68 self.update_date = datetime.datetime.now()
bgneal@277 69
bgneal@277 70 super(Link, self).save(*args, **kwargs)
bgneal@277 71
bgneal@20 72 def get_absolute_url(self):
bgneal@1035 73 return reverse('weblinks-link_detail', args=[str(self.pk)])
gremmie@1 74
bgneal@220 75 def search_title(self):
bgneal@220 76 return self.title
bgneal@220 77
bgneal@220 78 def search_summary(self):
bgneal@220 79 return self.description
bgneal@220 80
gremmie@1 81
bgneal@204 82 class PendingLink(LinkBase):
bgneal@204 83 """This model represents links that users submit. They must be approved by
bgneal@204 84 an admin before they become visible on the site.
bgneal@204 85 """
bgneal@204 86 class Meta:
bgneal@204 87 ordering = ('date_added', )
bgneal@204 88
bgneal@204 89 def __unicode__(self):
bgneal@204 90 return self.title
bgneal@204 91
bgneal@204 92 def save(self, *args, **kwargs):
bgneal@204 93 if not self.pk:
bgneal@204 94 self.date_added = datetime.datetime.now()
bgneal@277 95 self.update_date = self.date_added
bgneal@277 96 else:
bgneal@277 97 self.update_date = datetime.datetime.now()
bgneal@277 98
bgneal@204 99 super(PendingLink, self).save(*args, **kwargs)
bgneal@204 100
bgneal@204 101
gremmie@1 102 class FlaggedLinkManager(models.Manager):
gremmie@1 103
gremmie@1 104 def create(self, link, user):
gremmie@1 105 flagged_link = FlaggedLink(link = link, user = user, approved = False)
gremmie@1 106 flagged_link.save()
gremmie@1 107
gremmie@1 108
gremmie@1 109 class FlaggedLink(models.Model):
bgneal@193 110 """Model to represent links that have been flagged as broken by users"""
gremmie@1 111 link = models.ForeignKey(Link)
bgneal@237 112 user = models.ForeignKey(User)
gremmie@1 113 date_flagged = models.DateField(auto_now_add = True)
bgneal@675 114 approved = models.BooleanField(default = False,
gremmie@1 115 help_text = 'Check this and save to remove the referenced link from the database')
gremmie@1 116
gremmie@1 117 objects = FlaggedLinkManager()
gremmie@1 118
bgneal@182 119 def save(self, *args, **kwargs):
gremmie@1 120 if self.approved:
gremmie@1 121 self.link.delete()
gremmie@1 122 self.delete()
gremmie@1 123 else:
bgneal@182 124 super(FlaggedLink, self).save(*args, **kwargs)
gremmie@1 125
gremmie@1 126 def url(self):
gremmie@1 127 return self.link.url
gremmie@1 128
bgneal@165 129 def get_link_url(self):
bgneal@165 130 return '<a href="%s">Link #%d</a>' % (self.link.get_absolute_url(),
bgneal@165 131 self.link.id)
bgneal@165 132 get_link_url.allow_tags = True
bgneal@165 133 get_link_url.short_description = "View Link on Site"
bgneal@165 134
gremmie@1 135 def __unicode__(self):
gremmie@1 136 return self.link.title
gremmie@1 137
gremmie@1 138 class Meta:
gremmie@1 139 ordering = ('-date_flagged', )