Implement Web Assets' theme system and selection, and add 'light' theme #118

Merged
Márton Lente merged 97 commits from martonlente/extensions-website:ui/theme-light into main 2024-05-08 14:20:07 +02:00
4 changed files with 68 additions and 4 deletions
Showing only changes of commit 9fa54ff9ae - Show all commits

View File

@ -111,6 +111,17 @@ class ExtensionUpdateForm(forms.ModelForm):
'support',
)
def clean(self):
super().clean()
if (
'convert_to_draft' in self.data
and self.instance.status != self.instance.STATUSES.AWAITING_REVIEW
):
self.add_error(
None, 'An extension can be converted to draft only while it is Awating Review'
)
return self.cleaned_data
class ExtensionDeleteForm(forms.ModelForm):
class Meta:

View File

@ -97,13 +97,22 @@
<section class="card p-3 mt-3">
<div class="btn-col">
<button id="btn-save" type="submit" class="btn btn-primary">
<button id="btn-save" type="submit" class="btn btn-primary" name="save">
<i class="i-check"></i>
<span>
{% trans 'Save Changes' %}
</span>
</button>
{% if extension.status == extension.STATUSES.AWAITING_REVIEW %}
<button id="btn-convert-to-draft" type="submit" class="btn" name="convert_to_draft">
<i class="i-refresh"></i>
<span>
{% trans 'Convert to Draft' %}
</span>
</button>
{% endif %}
<hr>
<a href="{{ extension.get_new_version_url }}" class="btn">

View File

@ -2,9 +2,11 @@ from pathlib import Path
from django.test import TestCase
from common.tests.factories.extensions import create_approved_version
from common.tests.factories.extensions import create_approved_version, create_version
from common.tests.utils import _get_all_form_errors
from extensions.models import Extension
from files.models import File
from reviewers.models import ApprovalActivity
TEST_FILES_DIR = Path(__file__).resolve().parent / 'files'
POST_DATA = {
@ -280,3 +282,28 @@ class UpdateTest(TestCase):
response.context['add_preview_formset'].forms[0].errors,
{'source': ['Choose a JPEG, PNG or WebP image, or an MP4 video']},
)
def test_convert_to_draft(self):
version = create_version(extension__status=Extension.STATUSES.AWAITING_REVIEW)
extension = version.extension
url = extension.get_manage_url()
user = extension.authors.first()
self.client.force_login(user)
response = self.client.get(url)
self.assertContains(response, 'convert_to_draft')
response2 = self.client.post(
url,
{
**POST_DATA,
'convert_to_draft': '',
},
)
self.assertEqual(response2.status_code, 302)
extension.refresh_from_db()
self.assertEqual(extension.status, extension.STATUSES.INCOMPLETE)
self.assertEqual(
extension.review_activity.last().type, ApprovalActivity.ActivityType.AWAITING_CHANGES
)
response3 = self.client.get(url)
self.assertEqual(response3.status_code, 302)
self.assertEqual(response3['Location'], extension.get_draft_url())

View File

@ -3,7 +3,7 @@ from django import forms
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.db import transaction
from django.shortcuts import get_object_or_404, reverse
from django.shortcuts import get_object_or_404, redirect, reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
@ -109,6 +109,14 @@ class UpdateExtensionView(
template_name = 'extensions/manage/update.html'
form_class = ExtensionUpdateForm
success_message = "Updated successfully"
msg_converted_to_draft = _('Converted to Draft')
def get(self, request, *args, **kwargs):
extension = self.extension
if extension.status == extension.STATUSES.INCOMPLETE:
return redirect('extensions:draft', slug=extension.slug, type_slug=extension.type_slug)
else:
return super().get(request, *args, **kwargs)
def get_success_url(self):
self.object.refresh_from_db()
@ -147,6 +155,15 @@ class UpdateExtensionView(
@transaction.atomic
def form_valid(self, form):
if 'convert_to_draft' in self.request.POST:
form.instance.status = form.instance.STATUSES.INCOMPLETE
form.save()
ApprovalActivity(
user=self.request.user,
extension=form.instance,
type=ApprovalActivity.ActivityType.AWAITING_CHANGES,
message=self.msg_converted_to_draft,
).save()
edit_preview_formset = EditPreviewFormSet(
self.request.POST, self.request.FILES, instance=self.object
)
@ -357,7 +374,7 @@ class DraftExtensionView(
):
template_name = 'extensions/draft_finalise.html'
form_class = VersionForm
msg_awaiting_review = _('Extension is ready for initial review')
msg_awaiting_review = _('Ready for review')
@property
def success_message(self) -> str: