Projet

Général

Profil

0001-misc-remove-obsolete-parameters-cell-39087.patch

Frédéric Péters, 19 janvier 2020 10:18

Télécharger (8,36 ko)

Voir les différences:

Subject: [PATCH] misc: remove obsolete parameters cell (#39087)

 combo/data/forms.py                           | 36 +-------
 .../migrations/0040_auto_20200119_1017.py     | 26 ++++++
 combo/data/models.py                          | 90 -------------------
 .../templates/combo/parameters-cell.html      | 14 ---
 4 files changed, 27 insertions(+), 139 deletions(-)
 create mode 100644 combo/data/migrations/0040_auto_20200119_1017.py
 delete mode 100644 combo/public/templates/combo/parameters-cell.html
combo/data/forms.py
18 18

  
19 19
from django import forms
20 20

  
21
from .models import Page, ParametersCell, MenuCell, LinkCell, LinkListCell, ConfigJsonCell
22
from jsonfield.widgets import JSONWidget
21
from .models import Page, MenuCell, LinkCell, LinkListCell, ConfigJsonCell
23 22

  
24 23
from combo.utils import cache_during_request
25 24

  
26 25

  
27
class ParametersForm(forms.Form):
28
    choice = forms.ChoiceField(choices=[])
29

  
30
    def __init__(self, *args, **kwargs):
31
        self.parameters = kwargs.pop('parameters')
32
        empty_label = kwargs.pop('empty_label')
33
        super(ParametersForm, self).__init__(*args, **kwargs)
34
        self.fields['choice'].choices = [('', empty_label)] + [(x['name'], x['name']) for x in self.parameters]
35

  
36
    def clean(self):
37
        choice = self.cleaned_data.get('choice')
38
        for parameter in self.parameters:
39
            if parameter['name'] == choice:
40
                self.cleaned_data['choice'] = parameter['value']
41
                break
42
        return self.cleaned_data
43

  
44

  
45
class ParametersCellForm(forms.ModelForm):
46
    class Meta:
47
        model = ParametersCell
48
        fields = ('title', 'url', 'empty_label', 'parameters',)
49
        widgets = {
50
            # XXX: replace with a more ergonomic widget
51
            'parameters': JSONWidget(
52
                attrs={
53
                    'rows': 30,
54
                    'cols': 100,
55
                    'style': 'resize: none'
56
                })
57
        }
58

  
59

  
60 26
@cache_during_request
61 27
def get_page_choices():
62 28
    pages = Page.get_as_reordered_flat_hierarchy(Page.objects.all())
combo/data/migrations/0040_auto_20200119_1017.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.17 on 2020-01-19 09:17
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('data', '0039_link_list_cell'),
12
    ]
13

  
14
    operations = [
15
        migrations.RemoveField(
16
            model_name='parameterscell',
17
            name='groups',
18
        ),
19
        migrations.RemoveField(
20
            model_name='parameterscell',
21
            name='page',
22
        ),
23
        migrations.DeleteModel(
24
            name='ParametersCell',
25
        ),
26
    ]
combo/data/models.py
1080 1080
        return super(FeedCell, self).render(context)
1081 1081

  
1082 1082

  
1083
@register_cell_class
1084
class ParametersCell(CellBase):
1085
    title = models.CharField(_('Title'), max_length=150, blank=True)
1086
    url = models.URLField(_('URL'), blank=True)
1087
    empty_label = models.CharField(_('Empty label'), max_length=64, default='---')
1088
    parameters = JSONField(_('Parameters'), blank=True,
1089
                           help_text=_('Must be a JSON list, containing dictionaries with 3 keys: '
1090
                                       'name, value and optionnally roles; name must be a string, '
1091
                                       'value must be a dictionary and roles must a list of role '
1092
                                       'names. Role names limit the visibility of the choice.'))
1093

  
1094
    template_name = 'combo/parameters-cell.html'
1095

  
1096
    class Meta:
1097
        verbose_name = _('Parameters')
1098

  
1099
    def get_additional_label(self):
1100
        return self.title
1101

  
1102
    def is_visible(self, user=None):
1103
        return bool(self.parameters) and super(ParametersCell, self).is_visible(user=user)
1104

  
1105
    def validate_schema(self, value):
1106
        if not isinstance(value, list):
1107
            return False, _('it must be a list')
1108
        if not all(isinstance(x, dict) for x in value):
1109
            return False, _('it must be a list of dictionaries')
1110
        if not all(set(x.keys()) <= set(['roles', 'name', 'value']) for x in value):
1111
            return False, _('permitted keys in the dictionaries are name, roles and value')
1112
        for x in value:
1113
            if 'roles' not in x:
1114
                continue
1115
            if not isinstance(x['roles'], list):
1116
                return False, _('roles must be a list')
1117
            if not all(isinstance(y, unicode) for y in x['roles']):
1118
                return False, _('roles must be a list of strings')
1119
            if len(set(x['roles'])) != len(x['roles']):
1120
                return False, _('role\'s names must be unique in a list of roles')
1121
            existing = Group.objects.filter(name__in=x['roles']).values_list('name', flat=True)
1122
            if len(existing) != len(x['roles']):
1123
                l = u', '.join(set(x['roles']) - set(existing))
1124
                return False, _('role(s) %s do(es) not exist') % l
1125
        if not all(isinstance(x['name'], unicode) for x in value):
1126
            return False, _('name must be a string')
1127
        if not all(isinstance(x['value'], dict) for x in value):
1128
            return False, ('value must be a dictionary')
1129
        if not len(set(x['name'] for x in value)) == len(value):
1130
            return False, _('names must be unique')
1131
        return True, ''
1132

  
1133
    def clean(self):
1134
        validated, msg = self.validate_schema(self.parameters)
1135
        if not validated:
1136
            raise ValidationError(_('Parameters does not validate the expected schema: %s') % msg)
1137

  
1138
    def get_form(self, request):
1139
        from .forms import ParametersForm
1140
        if not request.user.is_anonymous:
1141
            groups = set(request.user.groups.values_list('name', flat=True))
1142
        else:
1143
            groups = set()
1144
        parameters = [param for param in self.parameters
1145
                      if not param.get('roles') or set(param['roles']) & groups]
1146
        return ParametersForm(request.GET, parameters=parameters,
1147
                              empty_label=self.empty_label,
1148
                              prefix='parameters-cells-' + str(self.pk))
1149

  
1150
    def modify_global_context(self, context, request):
1151
        if not bool(self.parameters):
1152
            return
1153
        # Store form for later use by get_cell_extra_context
1154
        self._form = self.get_form(request)
1155
        if self._form.is_valid():
1156
            parameters = context['parameters'] if 'parameters' in context else {}
1157
            context['parameters'] = parameters
1158
            parameters.update(self._form.cleaned_data['choice'])
1159

  
1160
    def get_cell_extra_context(self, context):
1161
        ctx = super(ParametersCell, self).get_cell_extra_context(context)
1162
        if hasattr(self, '_form'):
1163
            ctx['form'] = self._form
1164
        ctx['title'] = self.title
1165
        ctx['url'] = utils.get_templated_url(self.url)
1166
        return ctx
1167

  
1168
    def get_default_form_class(self):
1169
        from .forms import ParametersCellForm
1170
        return ParametersCellForm
1171

  
1172

  
1173 1083
@register_cell_class
1174 1084
class ParentContentCell(CellBase):
1175 1085
    class Meta:
combo/public/templates/combo/parameters-cell.html
1
{% block cell-content %}
2
{% if form %}
3
    {% if title %}
4
    <h2>{% if url %}<a href="{{url}}">{% endif %}{{title}}{% if url %}</a>{% endif %}</h2>
5
    {% endif %}
6
    <form class="combo-parameters-cell-form" method="get">
7
      {{ form.choice }}
8
    </form>
9
    <!--
10
      Parameters: {{ parameters|pprint }}
11
      Choice: {{ form.cleaned_data.choice|pprint }}
12
    -->
13
{% endif %}
14
{% endblock %}
15
-