manager: associate a page to a card model (#68675)
This commit is contained in:
parent
d29dc19ee9
commit
8acf380a63
|
@ -102,3 +102,11 @@ def get_matching_pages_from_card_slug(card_slug, order=True):
|
|||
if not order:
|
||||
return matching_pages
|
||||
return Page.get_as_reordered_flat_hierarchy(matching_pages)
|
||||
|
||||
|
||||
def get_wcs_matching_card_model(sub_slug):
|
||||
card_models = get_wcs_options('/api/cards/@list')
|
||||
for carddef_reference, card_label in card_models:
|
||||
card_id = '%s_id' % carddef_reference.split(':')[1]
|
||||
if '<%s>' % card_id in sub_slug or sub_slug == card_id:
|
||||
return carddef_reference, card_label
|
||||
|
|
|
@ -64,6 +64,7 @@ from django.utils.timezone import now
|
|||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from combo import utils
|
||||
from combo.apps.wcs.utils import get_wcs_matching_card_model, is_wcs_enabled
|
||||
from combo.utils import NothingInCacheException
|
||||
|
||||
from .fields import RichTextField, TemplatableURLField
|
||||
|
@ -273,6 +274,17 @@ class Page(models.Model):
|
|||
return None
|
||||
return os.path.splitext(self.picture.name)[-1]
|
||||
|
||||
def get_sub_slug_details(self):
|
||||
if not self.sub_slug:
|
||||
return
|
||||
|
||||
if not is_wcs_enabled(None):
|
||||
return self.sub_slug, None
|
||||
result = get_wcs_matching_card_model(self.sub_slug)
|
||||
if not result:
|
||||
return self.sub_slug, None
|
||||
return self.sub_slug.replace('-', '_'), result[1]
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if 'update_fields' in kwargs:
|
||||
return super().save(*args, **kwargs)
|
||||
|
|
|
@ -26,6 +26,7 @@ from django.template.loader import TemplateDoesNotExist, get_template
|
|||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from combo import utils
|
||||
from combo.apps.wcs.utils import get_wcs_matching_card_model, get_wcs_options
|
||||
from combo.data.forms import get_page_choices
|
||||
from combo.data.models import Page, ParentContentCell, SiteSettings, compile_sub_slug
|
||||
|
||||
|
@ -151,6 +152,14 @@ class PageEditSlugForm(forms.ModelForm):
|
|||
model = Page
|
||||
fields = ('slug', 'sub_slug')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
if self.instance.sub_slug:
|
||||
result = get_wcs_matching_card_model(self.instance.sub_slug)
|
||||
if result:
|
||||
self.initial['sub_slug'] = ''
|
||||
|
||||
def clean_slug(self):
|
||||
value = self.cleaned_data.get('slug')
|
||||
if self.instance.slug == value:
|
||||
|
@ -172,6 +181,40 @@ class PageEditSlugForm(forms.ModelForm):
|
|||
return value
|
||||
|
||||
|
||||
class PageEditLinkedCardForm(forms.ModelForm):
|
||||
carddef_reference = forms.ChoiceField(
|
||||
label=_('Linked card model'),
|
||||
required=False,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Page
|
||||
fields = []
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
card_models = get_wcs_options('/api/cards/@list')
|
||||
self.fields['carddef_reference'].choices = [('', '-----')] + card_models
|
||||
|
||||
if self.instance.sub_slug:
|
||||
result = get_wcs_matching_card_model(self.instance.sub_slug)
|
||||
if result:
|
||||
self.initial['carddef_reference'] = result[0]
|
||||
|
||||
def save(self, commit=True, *args, **kwargs):
|
||||
super().save(commit=False, *args, **kwargs)
|
||||
|
||||
if self.cleaned_data.get('carddef_reference'):
|
||||
self.instance.sub_slug = '%s_id' % self.cleaned_data['carddef_reference'].split(':')[1]
|
||||
else:
|
||||
self.instance.sub_slug = ''
|
||||
|
||||
if commit:
|
||||
self.instance.save()
|
||||
return self.instance
|
||||
|
||||
|
||||
class PageEditDescriptionForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Page
|
||||
|
|
|
@ -40,11 +40,21 @@
|
|||
(<a rel="popup" href="{% url 'combo-manager-page-edit-title' pk=object.id %}">{% trans 'change' %}</a>)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<label>{% trans 'Slug:' %}</label>
|
||||
<tt>{{ object.slug }}{% if object.sub_slug %}/<span class="subslug">{{ object.sub_slug }}</span>{% endif %}</tt>
|
||||
(<a rel="popup" href="{% url 'combo-manager-page-edit-slug' pk=object.id %}">{% trans 'change' %}</a>)
|
||||
</p>
|
||||
{% with object.get_sub_slug_details as sub_slug_details %}
|
||||
<p>
|
||||
<label>{% trans 'Slug:' %}</label>
|
||||
<tt>{{ object.slug }}{% if sub_slug_details and not sub_slug_details.1 %}/<span class="subslug">{{ sub_slug_details.0 }}</span>{% endif %}</tt>
|
||||
(<a rel="popup" href="{% url 'combo-manager-page-edit-slug' pk=object.id %}">{% trans 'change' %}</a>)
|
||||
</p>
|
||||
|
||||
{% if with_wcs %}
|
||||
<p>
|
||||
<label>{% trans 'Linked card model:' %}</label>
|
||||
<tt>{% if sub_slug_details.1 %}{{ sub_slug_details.1 }} <span class="subslug">{{ sub_slug_details.0 }}</span>{% endif %}</tt>
|
||||
(<a rel="popup" href="{% url 'combo-manager-page-edit-linked-card' pk=object.id %}">{% trans 'change' %}</a>)
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
|
||||
<p>
|
||||
<label>{% trans 'Description:' %}</label>
|
||||
|
|
|
@ -52,6 +52,11 @@ urlpatterns = [
|
|||
name='combo-manager-page-edit-include-in-navigation',
|
||||
),
|
||||
re_path(r'^pages/(?P<pk>\d+)/slug$', views.page_edit_slug, name='combo-manager-page-edit-slug'),
|
||||
re_path(
|
||||
r'^pages/(?P<pk>\d+)/linked-card$',
|
||||
views.page_edit_linked_card,
|
||||
name='combo-manager-page-edit-linked-card',
|
||||
),
|
||||
re_path(r'^pages/(?P<pk>\d+)/title$', views.page_edit_title, name='combo-manager-page-edit-title'),
|
||||
re_path(
|
||||
r'^pages/(?P<pk>\d+)/description$',
|
||||
|
|
|
@ -54,6 +54,7 @@ from django.views.generic import (
|
|||
)
|
||||
|
||||
from combo import plugins
|
||||
from combo.apps.wcs.utils import is_wcs_enabled
|
||||
from combo.data.library import get_cell_class
|
||||
from combo.data.models import CellBase, LinkListCell, Page, PageSnapshot, ParentContentCell, SiteSettings
|
||||
from combo.data.utils import (
|
||||
|
@ -75,6 +76,7 @@ from .forms import (
|
|||
PageEditDescriptionForm,
|
||||
PageEditExtraVariablesFormSet,
|
||||
PageEditIncludeInNavigationForm,
|
||||
PageEditLinkedCardForm,
|
||||
PageEditPictureForm,
|
||||
PageEditRedirectionForm,
|
||||
PageEditRolesForm,
|
||||
|
@ -335,6 +337,14 @@ class PageEditSlugView(PageEditView):
|
|||
page_edit_slug = PageEditSlugView.as_view()
|
||||
|
||||
|
||||
class PageEditLinkedCardView(PageEditView):
|
||||
form_class = PageEditLinkedCardForm
|
||||
comment = _('changed linked card')
|
||||
|
||||
|
||||
page_edit_linked_card = PageEditLinkedCardView.as_view()
|
||||
|
||||
|
||||
class PageEditDescriptionView(PageEditView):
|
||||
form_class = PageEditDescriptionForm
|
||||
comment = _('changed description')
|
||||
|
@ -441,6 +451,7 @@ class PageView(ManagedPageMixin, DetailView):
|
|||
context['cell_type_groups'] = list(cell_type_groups.items())
|
||||
context['cell_type_groups'].sort(key=lambda x: x[0])
|
||||
context['page_has_subpages'] = self.object.get_children().exists()
|
||||
context['with_wcs'] = is_wcs_enabled(None)
|
||||
|
||||
self.object.prefetched_cells = cells
|
||||
placeholders = []
|
||||
|
|
|
@ -3133,124 +3133,6 @@ def test_card_cell_assets(mock_send, settings, app, admin_user):
|
|||
|
||||
|
||||
def test_page_snapshot_with_old_card_cells():
|
||||
"""
|
||||
page_serialization = {
|
||||
'cells': [{
|
||||
'model': 'data.parentcontentcell',
|
||||
'fields': {
|
||||
'slug': '',
|
||||
'order': 0,
|
||||
'groups': [],
|
||||
'public': True,
|
||||
'condition': None,
|
||||
'placeholder': 'footer',
|
||||
'template_name': None,
|
||||
'extra_css_class': '',
|
||||
'last_update_timestamp': '2022-08-08T13:55:29.599Z',
|
||||
'restricted_to_unlogged': False,
|
||||
'page': 14
|
||||
}
|
||||
}, {
|
||||
'model': 'wcs.wcscardinfoscell',
|
||||
'fields': {
|
||||
'slug': 'enfant',
|
||||
'limit': None,
|
||||
'order': 1,
|
||||
'groups': [],
|
||||
'public': True,
|
||||
'card_ids': '',
|
||||
'condition': '',
|
||||
'title_type': 'auto',
|
||||
'placeholder': 'content',
|
||||
'custom_title': '',
|
||||
'display_mode': 'card',
|
||||
'without_user': False,
|
||||
'custom_schema': {},
|
||||
'only_for_user': False,
|
||||
'template_name': None,
|
||||
'extra_css_class': '',
|
||||
'carddef_reference': 'eservices:test-related-enfant',
|
||||
'related_card_path': '',
|
||||
'last_update_timestamp': '2022-08-11T13:57:43.362Z',
|
||||
'restricted_to_unlogged': False,
|
||||
'page': 14
|
||||
}
|
||||
}, {
|
||||
'model': 'wcs.wcscardinfoscell',
|
||||
'fields': {
|
||||
'slug': '',
|
||||
'limit': None,
|
||||
'order': 2,
|
||||
'groups': [],
|
||||
'public': True,
|
||||
'card_ids': '',
|
||||
'condition': '',
|
||||
'title_type': 'auto',
|
||||
'placeholder': 'content',
|
||||
'custom_title': '',
|
||||
'display_mode': 'card',
|
||||
'without_user': False,
|
||||
'custom_schema': {},
|
||||
'only_for_user': False,
|
||||
'template_name': None,
|
||||
'extra_css_class': '',
|
||||
'carddef_reference': 'eservices:test-related-adulte:par-defaut',
|
||||
'related_card_path': 'enfant/block_parents_parent',
|
||||
'last_update_timestamp': '2022-08-08T19:53:02.097Z',
|
||||
'restricted_to_unlogged': False,
|
||||
'page': 14
|
||||
}
|
||||
}, {
|
||||
'model': 'wcs.wcscardinfoscell',
|
||||
'fields': {
|
||||
'slug': '',
|
||||
'limit': None,
|
||||
'order': 3,
|
||||
'groups': [],
|
||||
'public': True,
|
||||
'card_ids': '',
|
||||
'condition': '',
|
||||
'title_type': 'empty',
|
||||
'placeholder': 'content',
|
||||
'custom_title': 'Les parents !',
|
||||
'display_mode': 'table',
|
||||
'without_user': False,
|
||||
'custom_schema': {},
|
||||
'only_for_user': False,
|
||||
'template_name': None,
|
||||
'extra_css_class': '',
|
||||
'carddef_reference': 'eservices:test-related-adulte:par-defaut',
|
||||
'related_card_path': 'enfant/block_parents_parent',
|
||||
'last_update_timestamp': '2022-08-11T13:07:35.757Z',
|
||||
'restricted_to_unlogged': False,
|
||||
'page': 14
|
||||
}
|
||||
}],
|
||||
'fields': {
|
||||
'slug': 'related-enfant',
|
||||
'order': 6,
|
||||
'title': 'Related enfant',
|
||||
'groups': [],
|
||||
'parent': ['search-related'],
|
||||
'public': True,
|
||||
'picture': '',
|
||||
'snapshot': None,
|
||||
'sub_slug': 'test-related-enfant_id',
|
||||
'edit_role': None,
|
||||
'description': '',
|
||||
'redirect_url': '',
|
||||
'template_name': 'standard',
|
||||
'extra_variables': {},
|
||||
'creation_timestamp': '2022-08-08T13:55:29.502Z',
|
||||
'subpages_edit_role': None,
|
||||
'placeholder_options': {},
|
||||
'last_update_timestamp': '2022-08-11T13:57:43.369Z',
|
||||
'exclude_from_navigation': True
|
||||
},
|
||||
'model': 'data.page',
|
||||
'pk': 14
|
||||
}
|
||||
"""
|
||||
page = Page.objects.create(title='xxx', slug='test_snapshots', template_name='standard')
|
||||
PageSnapshot.take(page)
|
||||
snapshot = page.pagesnapshot_set.first()
|
||||
|
@ -3394,3 +3276,45 @@ def test_export_import_card_cell_with_page_link():
|
|||
new_card_page = Page.objects.get(slug='card')
|
||||
new_cell = WcsCardCell.objects.get()
|
||||
assert new_cell.custom_schema['cells'][0]['page'] == ''
|
||||
|
||||
|
||||
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
|
||||
def test_page_edit_linked_card(mock_send, app, admin_user):
|
||||
page = Page.objects.create(title='One', slug='one', template_name='two')
|
||||
|
||||
app = login(app)
|
||||
resp = app.get('/manage/pages/%s/' % page.pk)
|
||||
|
||||
resp = resp.click(href='.*/linked-card')
|
||||
assert [o[0] for o in resp.form['carddef_reference'].options] == [
|
||||
'',
|
||||
'default:card_model_1',
|
||||
'default:card_model_2',
|
||||
'default:card_model_3',
|
||||
'default:card_a',
|
||||
'default:card_b',
|
||||
'default:card_c',
|
||||
'default:card_d',
|
||||
'default:card_e',
|
||||
'other:card_model_1',
|
||||
'other:card_model_2',
|
||||
'other:card_model_3',
|
||||
'other:card_a',
|
||||
'other:card_b',
|
||||
'other:card_c',
|
||||
'other:card_d',
|
||||
'other:card_e',
|
||||
]
|
||||
resp.form['carddef_reference'] = 'default:card_model_3'
|
||||
resp = resp.form.submit().follow()
|
||||
page.refresh_from_db()
|
||||
assert page.sub_slug == 'card_model_3_id'
|
||||
resp = app.get('/manage/pages/%s/slug' % page.pk)
|
||||
assert resp.form['sub_slug'].value == ''
|
||||
|
||||
resp = app.get('/manage/pages/%s/linked-card' % page.pk)
|
||||
assert resp.form['carddef_reference'].value == 'default:card_model_3'
|
||||
resp.form['carddef_reference'] = ''
|
||||
resp = resp.form.submit().follow()
|
||||
page.refresh_from_db()
|
||||
assert page.sub_slug == ''
|
||||
|
|
Loading…
Reference in New Issue