diff --git a/src/backoffice/forms.py b/src/backoffice/forms.py index a9440699e2d959f6bf3d010ea0c68fa47c04a7ad..6c1aef84c0ebd2885960c7a7440c4bd9547d456f 100644 --- a/src/backoffice/forms.py +++ b/src/backoffice/forms.py @@ -11,9 +11,10 @@ from django.core.validators import validate_slug from core.base_forms import TranslatedFieldsForm from core.integrations import Hangar, IntegrationError, WorkAdventure from core.models import Application, Assembly, AssemblyMember, Conference, Event, PlatformUser, Room, RoomLink, \ - ScheduleSource, WorkadventureTexture, StaticPageRevision + ScheduleSource, WorkadventureTexture, StaticPageRevision, StaticPage from core.utils import str2timedelta +from modeltranslation.settings import AVAILABLE_LANGUAGES logger = logging.getLogger(__name__) @@ -505,17 +506,14 @@ class CreateAssemblyRoomLinkForm(forms.ModelForm): fields = ['name', 'link_type', 'link'] -class StaticPageForm(TranslatedFieldsForm): +class StaticPageCreateForm(forms.ModelForm): class Meta: - model = StaticPageRevision - fields = ['title', 'body', 'is_draft'] + model = StaticPage + fields = ['slug', 'language'] - publish = forms.BooleanField(required=False) - - def clean_publish(self): - if self.cleaned_data['is_draft'] and self.cleaned_data['publish']: - raise ValidationError(_('StaticPage__cannot_publish_draft')) - return self.cleaned_data['publish'] + language = forms.CharField(widget=forms.Select(choices=[(lang, lang) for lang in AVAILABLE_LANGUAGES]), required=True) + title = forms.CharField(required=True) + body = forms.CharField(required=True, widget=forms.Textarea()) class AssignBadgeForm(forms.Form): diff --git a/src/backoffice/templates/backoffice/staticpage_list.html b/src/backoffice/templates/backoffice/staticpage_list.html index c87279972e9078ed0bca339cc1be4b9624f4c9d2..5c427b75d6f30bc6ddf0dcf755d29ae86e92948b 100644 --- a/src/backoffice/templates/backoffice/staticpage_list.html +++ b/src/backoffice/templates/backoffice/staticpage_list.html @@ -14,6 +14,7 @@ <tr> <th>{% trans "StaticPage__slug" %}</th> <th>{% trans "StaticPage__title" %}</th> + <th>{% trans "StaticPage__language" %}</th> <th>{% trans "StaticPage__last_edited_by" %}</th> <th>{% trans "StaticPage__last_edited_at" %}</th> </tr> @@ -23,6 +24,7 @@ <tr class="{% if page.public_revision == 0 %}text-dim{% endif %}"> <td><a href="{% url 'backoffice:page-detail' pk=page.pk %}">{{ page.slug }}</a></td> <td>{{ page.title }}</td> + <td>{{ page.language }}</td> <td>{{ page.last_revision_details.author | default:"-" }}</td> <td>{{ page.last_revision_details.timestamp | date:"DATETIME_FORMAT" }}</td> </tr> diff --git a/src/backoffice/views/pages.py b/src/backoffice/views/pages.py index d0b84518502d00916f7a9accd12030b3de826fd9..0bb7922bd91afe83c050611babda4b1c6e878e91 100644 --- a/src/backoffice/views/pages.py +++ b/src/backoffice/views/pages.py @@ -16,7 +16,7 @@ from django.utils.translation import gettext_lazy as _, get_language from core.models import StaticPage, StaticPageRevision -from ..forms import StaticPageForm +from ..forms import StaticPageCreateForm from .mixins import ConferenceMixin @@ -45,7 +45,8 @@ class PagesView(ConferenceMixin, ListView): def get_queryset(self, *args, **kwargs): last_revision_details = StaticPageRevision.objects.filter(page=OuterRef('pk'), pk=OuterRef('public_revision'))\ .values(data=LastRevisionJSONObject(author=F('author__username'), timestamp=F('timestamp')))[0:1] - return StaticPage.objects.accessible_by_user(conference=self.conference, user=self.request.user, language=get_language())\ + return StaticPage.objects.accessible_by_user(conference=self.conference, user=self.request.user, language=None)\ + .order_by('slug', 'language')\ .annotate(last_revision_details=last_revision_details) def get_context_data(self, **kwargs): @@ -57,16 +58,14 @@ class PagesView(ConferenceMixin, ListView): return context -class NewPageView(ConferenceMixin, CreateView): +class NewPageView(ConferenceMixin, FormView): permission_required = ('core.static_pages') - model = StaticPage - fields = ['slug'] + form_class = StaticPageCreateForm template_name = 'backoffice/staticpage_form.html' def post(self, request, *args, **kwargs): try: response = super().post(request, *args, **kwargs) - except IntegrityError: messages.error(request, _('StaticPage__slug__duplicate')) response = self.get(request, *args, **kwargs) @@ -74,7 +73,17 @@ class NewPageView(ConferenceMixin, CreateView): return response def form_valid(self, form): - form.instance.conference = self.conference + static_page = form.save(commit=False) + static_page.conference = self.conference + static_page.save() + + revision = StaticPageRevision(page=static_page, title=form.cleaned_data['title'], author=self.request.user, body=form.cleaned_data['body']) + revision.save() + revision.set_public() + revision.save() + + self.object = static_page + return super().form_valid(form) def get_context_data(self, **kwargs): diff --git a/src/core/models/pages.py b/src/core/models/pages.py index e1662f90bbeda680afa18e095e5df4a9bea54d51..5140b32eafb100444e2fe5601005b635ce0cc21f 100644 --- a/src/core/models/pages.py +++ b/src/core/models/pages.py @@ -43,8 +43,11 @@ for (prefix, group) in settings.STATIC_PAGE_NAMESPACES: class StaticPageManager(models.Manager): - def accessible_by_user(self, user: PlatformUser, conference: Conference, language: str = ''): - qs = self.get_queryset().filter(language=language, conference=conference) + def accessible_by_user(self, user: PlatformUser, conference: Conference, language: Optional[str] = ''): + if language is not None: + qs = self.get_queryset().filter(language=language, conference=conference) + else: + qs = self.get_queryset().filter(conference=conference) # for global staff apply no more limits if user.is_superuser or user.is_staff: