-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(documentation): add CategoryCreateView and CategoryUpdateView, their…
…s tests, templates and navigation
- Loading branch information
1 parent
ea0bd1a
commit 11b3a24
Showing
15 changed files
with
393 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
from django import forms | ||
from django.conf import settings | ||
from taggit.models import Tag | ||
|
||
from lacommunaute.documentation.models import Category, Document | ||
from lacommunaute.partner.models import Partner | ||
from lacommunaute.utils.iframe import wrap_iframe_in_div_tag | ||
|
||
|
||
class DocumentationFormMixin: | ||
name = forms.CharField(required=True, label="Titre") | ||
short_description = forms.CharField( | ||
widget=forms.Textarea(attrs={"rows": 3}), | ||
max_length=400, | ||
required=True, | ||
label="Sous-titre (400 caractères pour le SEO)", | ||
) | ||
description = forms.CharField( | ||
widget=forms.Textarea(attrs={"rows": 20}), required=True, label="Contenu (markdown autorisé)" | ||
) | ||
image = forms.ImageField( | ||
label="Banniere de couverture, format 1200 x 630 pixels recommandé", | ||
widget=forms.FileInput(attrs={"accept": settings.SUPPORTED_IMAGE_FILE_TYPES.keys()}), | ||
) | ||
|
||
def save(self, commit=True): | ||
instance = super().save(commit=False) | ||
instance.description = wrap_iframe_in_div_tag(self.cleaned_data.get("description")) | ||
|
||
if commit: | ||
instance.save() | ||
return instance | ||
|
||
|
||
class CategoryForm(forms.ModelForm, DocumentationFormMixin): | ||
class Meta: | ||
model = Category | ||
fields = ["name", "short_description", "description", "image"] | ||
|
||
|
||
class DocumentForm(forms.ModelForm, DocumentationFormMixin): | ||
certified = forms.BooleanField(required=False, label="Certifiée par la communauté de l'inclusion") | ||
partner = forms.ModelChoiceField( | ||
label="Sélectionner un partenaire", | ||
queryset=Partner.objects.all(), | ||
required=False, | ||
) | ||
category = forms.ModelChoiceField( | ||
label="Sélectionner une catégorie documentaire", | ||
queryset=Category.objects.all(), | ||
required=False, | ||
) | ||
tags = forms.ModelMultipleChoiceField( | ||
label="Sélectionner un ou plusieurs tags", | ||
queryset=Tag.objects.all(), | ||
widget=forms.CheckboxSelectMultiple, | ||
required=False, | ||
) | ||
new_tags = forms.CharField(required=False, label="Ajouter un tag ou plusieurs tags (séparés par des virgules)") | ||
|
||
def __init__(self, *args, **kwargs): | ||
super().__init__(*args, **kwargs) | ||
if self.instance.pk: | ||
self.fields["tags"].initial = self.instance.tags.all() | ||
|
||
def save(self, commit=True): | ||
instance = super().save(commit=False) | ||
|
||
if commit: | ||
instance.save() | ||
instance.tags.set(self.cleaned_data["tags"]) | ||
( | ||
instance.tags.add(*[tag.strip() for tag in self.cleaned_data["new_tags"].split(",")]) | ||
if self.cleaned_data.get("new_tags") | ||
else None | ||
) | ||
return instance | ||
|
||
class Meta: | ||
model = Document | ||
fields = ["name", "short_description", "description", "image", "certified", "partner", "category"] |
50 changes: 50 additions & 0 deletions
50
lacommunaute/documentation/migrations/0002_alter_category_image_and_more.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
# Generated by Django 5.0.9 on 2024-09-19 14:09 | ||
|
||
import storages.backends.s3 | ||
from django.db import migrations, models | ||
|
||
import lacommunaute.utils.validators | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
("documentation", "0001_initial"), | ||
] | ||
|
||
operations = [ | ||
migrations.AlterField( | ||
model_name="category", | ||
name="image", | ||
field=models.ImageField( | ||
blank=True, | ||
null=True, | ||
storage=storages.backends.s3.S3Storage(bucket_name="private-bucket", file_overwrite=False), | ||
upload_to="", | ||
validators=[lacommunaute.utils.validators.validate_image_size], | ||
), | ||
), | ||
migrations.AlterField( | ||
model_name="category", | ||
name="short_description", | ||
field=models.CharField(default="empty", max_length=400, verbose_name="Description courte (SEO)"), | ||
preserve_default=False, | ||
), | ||
migrations.AlterField( | ||
model_name="document", | ||
name="image", | ||
field=models.ImageField( | ||
blank=True, | ||
null=True, | ||
storage=storages.backends.s3.S3Storage(bucket_name="private-bucket", file_overwrite=False), | ||
upload_to="", | ||
validators=[lacommunaute.utils.validators.validate_image_size], | ||
), | ||
), | ||
migrations.AlterField( | ||
model_name="document", | ||
name="short_description", | ||
field=models.CharField(default="empty", max_length=400, verbose_name="Description courte (SEO)"), | ||
preserve_default=False, | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
58 changes: 58 additions & 0 deletions
58
lacommunaute/documentation/tests/tests_category_create_view.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
import pytest # noqa | ||
|
||
from django.urls import reverse | ||
|
||
from lacommunaute.documentation.models import Category | ||
from lacommunaute.users.factories import UserFactory | ||
|
||
|
||
@pytest.fixture(name="url") | ||
def fixture_url(): | ||
return reverse("documentation:category_create") | ||
|
||
|
||
@pytest.fixture(name="superuser") | ||
def fixture_superuser(db): | ||
return UserFactory(is_superuser=True) | ||
|
||
|
||
def test_user_pass_test_mixin(client, db, url, superuser): | ||
response = client.get(url) | ||
assert response.status_code == 302 | ||
|
||
client.force_login(superuser) | ||
response = client.get(url) | ||
assert response.status_code == 200 | ||
|
||
|
||
def test_context(client, db, url, superuser): | ||
client.force_login(superuser) | ||
response = client.get(url) | ||
assert response.status_code == 200 | ||
assert response.context["title"] == "Ajouter une catégorie documentaire" | ||
assert response.context["back_url"] == reverse("documentation:category_list") | ||
assert response.context["form"].fields.keys() == {"name", "short_description", "description", "image"} | ||
assert response.context["form"].fields["name"].required | ||
assert response.context["form"].fields["short_description"].required | ||
|
||
|
||
def test_create_category(client, db, url, superuser): | ||
client.force_login(superuser) | ||
response = client.post( | ||
url, | ||
data={ | ||
"name": "Test Name", | ||
"short_description": "Test Short Description", | ||
"description": "Test Description", | ||
}, | ||
) | ||
assert response.status_code == 302 | ||
|
||
category = Category.objects.get() | ||
assert category.name == "Test Name" | ||
assert category.short_description == "Test Short Description" | ||
assert category.description.raw == "Test Description" | ||
assert category.slug == "test-name" | ||
|
||
|
||
# TODO tester avec image |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 64 additions & 0 deletions
64
lacommunaute/documentation/tests/tests_category_update_view.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import pytest # noqa | ||
|
||
from django.urls import reverse | ||
|
||
from lacommunaute.documentation.factories import CategoryFactory | ||
from lacommunaute.documentation.models import Category | ||
from lacommunaute.users.factories import UserFactory | ||
|
||
|
||
@pytest.fixture(name="category") | ||
def fixture_category(db): | ||
return CategoryFactory(for_snapshot=True) | ||
|
||
|
||
@pytest.fixture(name="url") | ||
def fixture_url(category): | ||
return reverse("documentation:category_update", kwargs={"pk": category.pk, "slug": category.slug}) | ||
|
||
|
||
@pytest.fixture(name="superuser") | ||
def fixture_superuser(db): | ||
return UserFactory(is_superuser=True) | ||
|
||
|
||
def test_user_pass_test_mixin(client, db, url, superuser): | ||
response = client.get(url) | ||
assert response.status_code == 302 | ||
|
||
client.force_login(superuser) | ||
response = client.get(url) | ||
assert response.status_code == 200 | ||
|
||
|
||
def test_context(client, db, url, superuser, category): | ||
client.force_login(superuser) | ||
response = client.get(url) | ||
assert response.status_code == 200 | ||
assert response.context["title"] == "Mettre à jour la catégorie Test Category" | ||
assert response.context["back_url"] == category.get_absolute_url() | ||
assert response.context["form"].fields.keys() == {"name", "short_description", "description", "image"} | ||
assert response.context["form"].fields["name"].required | ||
assert response.context["form"].fields["short_description"].required | ||
|
||
|
||
def test_update_category(client, db, url, superuser, category): | ||
client.force_login(superuser) | ||
response = client.post( | ||
url, | ||
data={ | ||
"name": "Updated Name", | ||
"short_description": "Updated Short Description", | ||
"description": "Updated Description", | ||
}, | ||
) | ||
assert response.status_code == 302 | ||
|
||
category = Category.objects.get() | ||
assert category.name == "Updated Name" | ||
assert category.short_description == "Updated Short Description" | ||
assert category.description.raw == "Updated Description" | ||
assert category.slug == "updated-name" | ||
|
||
|
||
# TODO tester la mise à jour de l'image |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.