Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 1 addition & 149 deletions packages/views/flag.py
Original file line number Diff line number Diff line change
@@ -1,157 +1,9 @@
import re

from django import forms
from django.conf import settings
from django.contrib.auth.decorators import permission_required
from django.core.mail import EmailMessage
from django.db import transaction
from django.shortcuts import get_object_or_404, redirect, render
from django.template import loader
from django.utils.timezone import now
from django.views.decorators.cache import cache_page, never_cache
from django.shortcuts import get_object_or_404, redirect

from main.models import Package

from ..models import FlagDenylist, FlagRequest


class FlagForm(forms.Form):
email = forms.EmailField(label='E-mail Address')
message = forms.CharField(label='Message To Developer',
widget=forms.Textarea)
# The field below is used to filter out bots that blindly fill out all
# input elements
website = forms.CharField(label='',
widget=forms.TextInput(),
required=False)

def __init__(self, *args, **kwargs):
# we remove the 'email' field if this form is being shown to a
# logged-in user, e.g., a developer.
auth = kwargs.pop('authenticated', False)
super().__init__(*args, **kwargs)
if auth:
del self.fields['email']

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 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


@cache_page(3600)
def flaghelp(request):
return render(request, 'packages/flaghelp.html')


@never_cache
def flag(request, name, repo, arch):
pkg = get_object_or_404(Package.objects.normal(),
pkgname=name, repo__name__iexact=repo, arch__name=arch)
if pkg.flag_date is not None:
# already flagged. do nothing.
return render(request, 'packages/flagged.html', {'pkg': pkg})
# find all packages from (hopefully) the same PKGBUILD
pkgs = Package.objects.normal().filter(
pkgbase=pkg.pkgbase, flag_date__isnull=True,
repo__testing=pkg.repo.testing,
repo__staging=pkg.repo.staging).order_by(
'pkgname', 'repo__name', 'arch__name')

authenticated = request.user.is_authenticated

if request.POST:
form = FlagForm(request.POST, authenticated=authenticated)
if form.is_valid() and form.cleaned_data['website'] == '':
# save the package list for later use
flagged_pkgs = list(pkgs)

# find a common version if there is one available to store
versions = {(pkg.pkgver, pkg.pkgrel, pkg.epoch) for pkg in flagged_pkgs}
if len(versions) == 1:
version = versions.pop()
else:
version = ('', '', 0)

message = form.cleaned_data['message']
ip_addr = request.META.get('REMOTE_ADDR')
if authenticated:
email = request.user.email
else:
email = form.cleaned_data['email']

@transaction.atomic
def perform_updates():
current_time = now()
pkgs.update(flag_date=current_time)
# store our flag request
flag_request = FlagRequest(created=current_time,
user_email=email, message=message,
ip_address=ip_addr, pkgbase=pkg.pkgbase,
repo=pkg.repo, pkgver=version[0], pkgrel=version[1],
epoch=version[2], num_packages=len(flagged_pkgs))
if authenticated:
flag_request.user = request.user
flag_request.save()

perform_updates()

maints = pkg.maintainers
if not maints:
toemail = settings.NOTIFICATIONS
subject = f'Orphan {pkg.repo.name} package [{pkg.pkgname}] marked out-of-date'
else:
toemail = []
subject = f'{pkg.repo.name} package [{pkg.pkgname}] marked out-of-date'
for maint in maints:
if maint.userprofile.notify is True:
toemail.append(maint.email)

if toemail:
# send notification email to the maintainers
tmpl = loader.get_template('packages/outofdate.txt')
ctx = {
'email': email,
'message': message,
'pkg': pkg,
'packages': flagged_pkgs,
}
msg = EmailMessage(subject,
tmpl.render(ctx),
'Arch Website Notification <nobody@archlinux.org>',
toemail)
msg.send(fail_silently=True)

return redirect('package-flag-confirmed', name=name, repo=repo, arch=arch)
else:
form = FlagForm(authenticated=authenticated)

context = {
'package': pkg,
'packages': pkgs,
'form': form
}
return render(request, 'packages/flag.html', context)


def flag_confirmed(request, name, repo, arch):
pkg = get_object_or_404(Package,
pkgname=name, repo__name__iexact=repo, arch__name=arch)
pkgs = Package.objects.normal().filter(
pkgbase=pkg.pkgbase, flag_date=pkg.flag_date,
repo__testing=pkg.repo.testing,
repo__staging=pkg.repo.staging).order_by(
'pkgname', 'repo__name', 'arch__name')

context = {'package': pkg, 'packages': pkgs}

return render(request, 'packages/flag_confirmed.html', context)


@permission_required('main.change_package')
def unflag(request, name, repo, arch):
Expand Down
54 changes: 0 additions & 54 deletions templates/packages/flag.html

This file was deleted.

22 changes: 0 additions & 22 deletions templates/packages/flag_confirmed.html

This file was deleted.

31 changes: 0 additions & 31 deletions templates/packages/flaghelp.html

This file was deleted.

Loading