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:
|