Skip to content

Commit c32f211

Browse files
committed
Add lxml and cssselect
1 parent e20cf4b commit c32f211

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

requirements_test.in

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
pytest
33
pytest-twisted
44
pytest-django
5-
5+
lxml
6+
cssselect

requirements_test.txt

+4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ attrs==21.2.0
88
# via
99
# -c requirements.txt
1010
# pytest
11+
cssselect==1.1.0
12+
# via -r requirements_test.in
1113
decorator==5.0.7
1214
# via pytest-twisted
1315
greenlet==1.0.0
1416
# via pytest-twisted
1517
iniconfig==1.1.1
1618
# via pytest
19+
lxml==4.7.1
20+
# via -r requirements_test.in
1721
packaging==20.9
1822
# via pytest
1923
pluggy==0.13.1

yarrharr/templates/label_add.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ <h1>Add Label</h1>
1212
</div>
1313

1414
<div class="inventory-centered">
15-
<form action="{% url 'label-add' %}" method="POST">
15+
<form action="{% url 'label-add' %}" method="POST" name="label-add">
1616
{% csrf_token %}
1717
{{ form.as_p }}
1818
<div class="inventory-tools">

yarrharr/views.py

+35-10
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from django.db import connection, transaction
3131
from django.db.models import Count, Q, Sum
3232
from django.db.utils import IntegrityError
33-
from django.forms import ModelForm
33+
from django.forms import ModelForm, ValidationError
3434
from django.http import (
3535
HttpResponse,
3636
HttpResponseBadRequest,
@@ -399,10 +399,38 @@ def label_show(request, label_id: int, filter: ArticleFilter):
399399

400400

401401
class LabelForm(ModelForm):
402+
"""
403+
Always instantiate with an instance.
404+
"""
405+
402406
class Meta:
403407
model = Label
404408
fields = ["text", "feeds"]
405409

410+
def clean_text(self):
411+
"""
412+
Validate that the label text is unique
413+
"""
414+
data = self.cleaned_data["text"]
415+
if data == self.instance.text: # No change
416+
return data
417+
418+
if self.instance.user.label_set.filter(text=data).count() > 0:
419+
raise ValidationError(
420+
"Label text must be unique",
421+
code="duplicate"
422+
)
423+
424+
return data
425+
426+
def clean_feeds(self):
427+
"""
428+
Ensure that only the user's own feeds are selectable. Other PKs are
429+
ignored.
430+
"""
431+
data = self.cleaned_data["feeds"]
432+
return self.instance.user.feed_set.intersection(data)
433+
406434

407435
@login_required
408436
def label_edit(request, label_id: int):
@@ -437,25 +465,22 @@ def label_add(request):
437465
"""
438466
Add a new label.
439467
"""
468+
label = Label(user=request.user)
440469
if request.method == "POST":
441-
form = LabelForm(request.POST)
470+
form = LabelForm(request.POST, instance=label)
442471
if form.is_valid():
443-
label = form.save(commit=False)
444-
label.user = request.user
472+
label = form.save(commit=True)
445473
label.save()
446-
label.feeds.set(
447-
request.user.feed_set.filter(id__in=form.cleaned_data["feeds"]),
448-
)
449474
return HttpResponseRedirect(
450475
reverse(
451476
"label-show",
452477
kwargs={"label_id": label.pk, "filter": ArticleFilter.unread},
453478
),
454479
)
455-
elif request.method == "GET":
456-
form = LabelForm()
457-
else:
480+
elif request.method != "GET":
458481
return HttpResponseNotAllowed(["GET", "POST"])
482+
else:
483+
form = LabelForm(instance=label)
459484
return render(request, "label_add.html", {
460485
"form": form,
461486
"tabs_selected": {"global-label-list"},

0 commit comments

Comments
 (0)