Skip to content

Commit 615937c

Browse files
authored
Bug/spam snippet filtering (#272)
* Add flag filtering in the snippet listing * Update flake8 linting
1 parent 8e31bcf commit 615937c

File tree

4 files changed

+118
-103
lines changed

4 files changed

+118
-103
lines changed

cab/api/views.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66

77
class SnippetList(generics.ListCreateAPIView):
8-
queryset = Snippet.objects.all()
8+
queryset = Snippet.objects.active_snippet()
99
serializer_class = SnippetSerializer
1010

1111

1212
class SnippetDetail(generics.RetrieveUpdateAPIView):
13-
queryset = Snippet.objects.all()
13+
queryset = Snippet.objects.active_snippet()
1414
serializer_class = SnippetSerializer

cab/models.py

+35-25
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
from .listeners import start_listening
1414
from .utils import sanitize_markdown
1515

16-
VERSIONS = getattr(settings, 'CAB_VERSIONS', ())
16+
VERSIONS = getattr(settings, "CAB_VERSIONS", ())
1717

1818

1919
class LanguageManager(models.Manager):
2020
def top_languages(self):
21-
return self.annotate(score=Count('snippet')).order_by('-score')
21+
return self.annotate(score=Count("snippet")).order_by("-score")
2222

2323

2424
class Language(models.Model):
@@ -31,39 +31,43 @@ class Language(models.Model):
3131
objects = LanguageManager()
3232

3333
class Meta:
34-
ordering = ('name',)
34+
ordering = ("name",)
3535

3636
def __str__(self):
3737
return self.name
3838

3939
def get_absolute_url(self):
40-
return reverse('cab_language_detail', kwargs={'slug': self.slug})
40+
return reverse("cab_language_detail", kwargs={"slug": self.slug})
4141

4242
def get_lexer(self):
4343
return lexers.get_lexer_by_name(self.language_code)
4444

4545

4646
class SnippetManager(models.Manager):
4747
def top_authors(self):
48-
return User.objects.annotate(
49-
score=Count('snippet')).order_by('-score', 'username')
48+
return User.objects.annotate(score=Count("snippet")).order_by(
49+
"-score", "username"
50+
)
5051

5152
def top_tags(self):
52-
return self.model.tags.most_common().order_by('-num_times', 'name')
53+
return self.model.tags.most_common().order_by("-num_times", "name")
5354

5455
def top_rated(self):
5556
# this is slow
5657
# return self.annotate(score=Sum('ratings__score')).order_by('-score')
57-
return self.all().order_by('-rating_score', '-pub_date')
58+
return self.all().order_by("-rating_score", "-pub_date")
5859

5960
def most_bookmarked(self):
6061
# this is slow
6162
# self.annotate(score=Count('bookmarks')).order_by('-score')
62-
return self.all().order_by('-bookmark_count', '-pub_date')
63+
return self.all().order_by("-bookmark_count", "-pub_date")
6364

6465
def matches_tag(self, tag):
6566
return self.filter(tags__in=[tag])
6667

68+
def active_snippet(self):
69+
return self.exclude(flags__flag=SnippetFlag.FLAG_SPAM)
70+
6771

6872
class Snippet(models.Model):
6973
title = models.CharField(max_length=255)
@@ -73,7 +77,7 @@ class Snippet(models.Model):
7377
description_html = models.TextField(editable=False)
7478
code = models.TextField()
7579
highlighted_code = models.TextField(editable=False)
76-
version = models.CharField(max_length=5, choices=VERSIONS, default='0.0')
80+
version = models.CharField(max_length=5, choices=VERSIONS, default="0.0")
7781
pub_date = models.DateTimeField(auto_now_add=True)
7882
updated_date = models.DateTimeField(auto_now=True)
7983
bookmark_count = models.IntegerField(default=0) # denormalized count
@@ -85,7 +89,7 @@ class Snippet(models.Model):
8589
objects = SnippetManager()
8690

8791
class Meta:
88-
ordering = ('-pub_date',)
92+
ordering = ("-pub_date",)
8993

9094
def __str__(self):
9195
return self.title
@@ -96,15 +100,15 @@ def save(self, *args, **kwargs):
96100
super(Snippet, self).save(*args, **kwargs)
97101

98102
def get_absolute_url(self):
99-
return reverse('cab_snippet_detail', kwargs={'snippet_id': self.id})
103+
return reverse("cab_snippet_detail", kwargs={"snippet_id": self.id})
100104

101105
def highlight(self):
102-
return highlight(self.code,
103-
self.language.get_lexer(),
104-
formatters.HtmlFormatter(linenos=True))
106+
return highlight(
107+
self.code, self.language.get_lexer(), formatters.HtmlFormatter(linenos=True)
108+
)
105109

106110
def get_tagstring(self):
107-
return ", ".join([t.name for t in self.tags.order_by('name').all()])
111+
return ", ".join([t.name for t in self.tags.order_by("name").all()])
108112

109113
def get_version(self):
110114
return dict(VERSIONS)[self.version]
@@ -119,28 +123,30 @@ def update_bookmark_count(self):
119123

120124
def mark_as_inappropiate(self):
121125
snippet_flag = SnippetFlag(
122-
snippet=self, user=self.author, flag=SnippetFlag.FLAG_INAPPROPRIATE)
126+
snippet=self, user=self.author, flag=SnippetFlag.FLAG_INAPPROPRIATE
127+
)
123128
snippet_flag.save()
124129

125130
def mark_as_spam(self):
126131
snippet_flag = SnippetFlag(
127-
snippet=self, user=self.author, flag=SnippetFlag.FLAG_SPAM)
132+
snippet=self, user=self.author, flag=SnippetFlag.FLAG_SPAM
133+
)
128134
snippet_flag.save()
129135

130136

131137
class SnippetFlag(models.Model):
132138
FLAG_SPAM = 1
133139
FLAG_INAPPROPRIATE = 2
134140
FLAG_CHOICES = (
135-
(FLAG_SPAM, 'Spam'),
136-
(FLAG_INAPPROPRIATE, 'Inappropriate'),
141+
(FLAG_SPAM, "Spam"),
142+
(FLAG_INAPPROPRIATE, "Inappropriate"),
137143
)
138-
snippet = models.ForeignKey(Snippet, related_name='flags', on_delete=models.CASCADE)
144+
snippet = models.ForeignKey(Snippet, related_name="flags", on_delete=models.CASCADE)
139145
user = models.ForeignKey(User, on_delete=models.CASCADE)
140146
flag = models.IntegerField(choices=FLAG_CHOICES)
141147

142148
def __str__(self):
143-
return '%s flagged as %s by %s' % (
149+
return "%s flagged as %s by %s" % (
144150
self.snippet.title,
145151
self.get_flag_display(),
146152
self.user.username,
@@ -155,12 +161,16 @@ def remove_and_ban(self):
155161

156162

157163
class Bookmark(models.Model):
158-
snippet = models.ForeignKey(Snippet, related_name='bookmarks', on_delete=models.CASCADE)
159-
user = models.ForeignKey(User, related_name='cab_bookmarks', on_delete=models.CASCADE)
164+
snippet = models.ForeignKey(
165+
Snippet, related_name="bookmarks", on_delete=models.CASCADE
166+
)
167+
user = models.ForeignKey(
168+
User, related_name="cab_bookmarks", on_delete=models.CASCADE
169+
)
160170
date = models.DateTimeField(auto_now_add=True)
161171

162172
class Meta:
163-
ordering = ('-date',)
173+
ordering = ("-date",)
164174

165175
def __str__(self):
166176
return "%s bookmarked by %s" % (self.snippet, self.user)

0 commit comments

Comments
 (0)