Add rebuilderd status to the package details page
The reproducible status is now shown for logged in users, as the reproducible effort is still much experimental and so to not confuse not logged in users.
This commit is contained in:
parent
30ac888c62
commit
3f807c8e18
9
main/fixtures/denylist.json
Normal file
9
main/fixtures/denylist.json
Normal file
@ -0,0 +1,9 @@
|
||||
[
|
||||
{
|
||||
"model": "packages.flagdenylist",
|
||||
"pk": 1,
|
||||
"fields": {
|
||||
"keyword": "bit.ly"
|
||||
}
|
||||
}
|
||||
]
|
@ -1,7 +1,7 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from .models import (PackageRelation, FlagRequest, Signoff, SignoffSpecification,
|
||||
Update)
|
||||
from .models import (PackageRelation, FlagDenylist, FlagRequest, Signoff,
|
||||
SignoffSpecification, Update)
|
||||
|
||||
|
||||
class PackageRelationAdmin(admin.ModelAdmin):
|
||||
@ -12,6 +12,13 @@ class PackageRelationAdmin(admin.ModelAdmin):
|
||||
date_hierarchy = 'created'
|
||||
|
||||
|
||||
class FlagDenylistAdmin(admin.ModelAdmin):
|
||||
list_display = ('keyword',)
|
||||
list_filter = ('keyword',)
|
||||
search_fields = ('keyword',)
|
||||
ordering = ('keyword',)
|
||||
|
||||
|
||||
class FlagRequestAdmin(admin.ModelAdmin):
|
||||
list_display = ('pkgbase', 'full_version', 'repo', 'created', 'who',
|
||||
'is_spam', 'is_legitimate', 'message')
|
||||
@ -54,6 +61,7 @@ class UpdateAdmin(admin.ModelAdmin):
|
||||
|
||||
|
||||
admin.site.register(PackageRelation, PackageRelationAdmin)
|
||||
admin.site.register(FlagDenylist, FlagDenylistAdmin)
|
||||
admin.site.register(FlagRequest, FlagRequestAdmin)
|
||||
admin.site.register(Signoff, SignoffAdmin)
|
||||
admin.site.register(SignoffSpecification, SignoffSpecificationAdmin)
|
||||
|
20
packages/migrations/0002_flagdenylist.py
Normal file
20
packages/migrations/0002_flagdenylist.py
Normal file
@ -0,0 +1,20 @@
|
||||
# Generated by Django 3.2.3 on 2021-06-17 14:56
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('packages', '0001_squashed_0003_auto_20170524_0704'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='FlagDenylist',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('keyword', models.CharField(max_length=255)),
|
||||
],
|
||||
),
|
||||
]
|
@ -224,6 +224,10 @@ def __str__(self):
|
||||
return '%s from %s on %s' % (self.pkgbase, self.who(), self.created)
|
||||
|
||||
|
||||
class FlagDenylist(models.Model):
|
||||
keyword = models.CharField(max_length=255)
|
||||
|
||||
|
||||
class UpdateManager(models.Manager):
|
||||
def log_update(self, old_pkg, new_pkg):
|
||||
'''Utility method to help log an update. This will determine the type
|
||||
|
@ -271,7 +271,7 @@ def test_groups_details(self):
|
||||
|
||||
class FlagPackage(TestCase):
|
||||
fixtures = ['main/fixtures/arches.json', 'main/fixtures/repos.json',
|
||||
'main/fixtures/package.json']
|
||||
'main/fixtures/package.json', 'main/fixtures/denylist.json']
|
||||
|
||||
def test_flag_package(self):
|
||||
data = {
|
||||
@ -307,6 +307,19 @@ def test_flag_package_invalid(self):
|
||||
self.assertIn('Enter a valid and useful out-of-date message', response.content.decode())
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
def test_flag_package_invalid_denylist(self):
|
||||
data = {
|
||||
'website': '',
|
||||
'email': 'nobody@archlinux.org',
|
||||
'message': 'check out https://bit.ly/4z3rty',
|
||||
}
|
||||
response = self.client.post('/packages/core/x86_64/linux/flag/',
|
||||
data,
|
||||
follow=True)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn('Enter a valid and useful out-of-date message', response.content.decode())
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
def test_flag_help(self):
|
||||
response = self.client.get('/packages/flaghelp/')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
@ -10,7 +10,7 @@
|
||||
from django.utils.timezone import now
|
||||
from django.views.decorators.cache import cache_page, never_cache
|
||||
|
||||
from ..models import FlagRequest
|
||||
from ..models import FlagDenylist, FlagRequest
|
||||
from main.models import Package
|
||||
|
||||
|
||||
@ -35,8 +35,13 @@ def __init__(self, *args, **kwargs):
|
||||
def clean_message(self):
|
||||
data = self.cleaned_data['message']
|
||||
# make sure the message isn't garbage (only punctuation or whitespace)
|
||||
# or spam (using a simple denylist)
|
||||
# and ensure a certain minimum length
|
||||
if re.match(r'^[^0-9A-Za-z]+$', data) or len(data) < 3:
|
||||
if (
|
||||
re.match(r'^[^0-9A-Za-z]+$', data)
|
||||
or any(fd.keyword in data for fd in FlagDenylist.objects.all())
|
||||
or len(data) < 3
|
||||
):
|
||||
raise forms.ValidationError("Enter a valid and useful out-of-date message.")
|
||||
return data
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user