From f259f0c36f472b67a13b26bd4474d2393e11706e Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Wed, 5 Sep 2018 22:39:40 +1200 Subject: [PATCH] Limit selection of "Base" layer type If a user doesn't have publish rights and the type of the layer isn't already "Base" then disallow selecting the Base layer type. Some submitters are selecting this type for their own layers, but it's pretty much reserved for openembedded-core and meta-oe (so that they appear at the top of the layer list). Signed-off-by: Paul Eggleton --- TODO | 1 - layerindex/forms.py | 9 ++++++++- layerindex/views.py | 7 +++++-- templates/layerindex/editlayer.html | 4 ++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index 413a8ab..01b1d8e 100644 --- a/TODO +++ b/TODO @@ -14,7 +14,6 @@ Features * Allow users to make a comment sent to admins/maintainers? * Marking for recipes with ptest enabled * Make it easy to update people's email addresses -* Prevent selection of "Base" layer type for layer unless you have admin access (or layer is already of that type) * Use proper model to store inherits * Make dependency and inherits list items into search links * Full-text search on layer contents diff --git a/layerindex/forms.py b/layerindex/forms.py index c2e4e62..8b94091 100644 --- a/layerindex/forms.py +++ b/layerindex/forms.py @@ -56,7 +56,7 @@ class EditLayerForm(forms.ModelForm): model = LayerItem fields = ('name', 'layer_type', 'summary', 'description', 'vcs_url', 'vcs_web_url', 'vcs_web_tree_base_url', 'vcs_web_file_base_url', 'vcs_web_commit_url', 'usage_url', 'mailing_list_url') - def __init__(self, user, layerbranch, *args, **kwargs): + def __init__(self, user, layerbranch, allow_base_type, *args, **kwargs): super(self.__class__, self).__init__(*args, **kwargs) self.layerbranch = layerbranch if self.instance.pk: @@ -77,6 +77,7 @@ class EditLayerForm(forms.ModelForm): self.fields = new_fields self.fields['vcs_subdir'].initial = layerbranch.vcs_subdir self.was_saved = False + self.allow_base_type = allow_base_type def checked_deps(self): val = [int(v) for v in self['deps'].value()] @@ -100,6 +101,12 @@ class EditLayerForm(forms.ModelForm): summary = re.sub('\s+', ' ', summary) return summary + def clean_layer_type(self): + layer_type = self.cleaned_data['layer_type'] + if layer_type == 'A' and not self.allow_base_type: + raise forms.ValidationError("Base type is not allowed, please select a more specific type") + return layer_type + def clean_description(self): description = self.cleaned_data['description'].strip() return description diff --git a/layerindex/views.py b/layerindex/views.py index 8adebed..55a3633 100644 --- a/layerindex/views.py +++ b/layerindex/views.py @@ -121,9 +121,11 @@ def edit_layer_view(request, template_name, branch='master', slug=None): layerbranch = LayerBranch(layer=layeritem, branch=branchobj) deplistlayers = LayerItem.objects.filter(comparison=False).order_by('name') + allow_base_type = request.user.has_perm('layerindex.publish_layer') or layeritem.layer_type == 'A' + if request.method == 'POST': last_vcs_url = layeritem.vcs_url - form = EditLayerForm(request.user, layerbranch, request.POST, instance=layeritem) + form = EditLayerForm(request.user, layerbranch, allow_base_type, request.POST, instance=layeritem) maintainerformset = LayerMaintainerFormSet(request.POST, instance=layerbranch) if form.is_valid() and maintainerformset.is_valid(): with transaction.atomic(): @@ -196,13 +198,14 @@ def edit_layer_view(request, template_name, branch='master', slug=None): return_url = reverse_lazy(returnto, args=(branch, layeritem.name)) return HttpResponseRedirect(return_url) else: - form = EditLayerForm(request.user, layerbranch, instance=layeritem) + form = EditLayerForm(request.user, layerbranch, allow_base_type, instance=layeritem) maintainerformset = LayerMaintainerFormSet(instance=layerbranch) return render(request, template_name, { 'form': form, 'maintainerformset': maintainerformset, 'deplistlayers': deplistlayers, + 'allow_base_type': allow_base_type, 'return_url': return_url, }) diff --git a/templates/layerindex/editlayer.html b/templates/layerindex/editlayer.html index ce7b292..676d4af 100644 --- a/templates/layerindex/editlayer.html +++ b/templates/layerindex/editlayer.html @@ -391,6 +391,10 @@ $('#idx_vcs_web_type').change(auto_web_type_field) auto_web_fields(null) + {% if not allow_base_type %} + $("#id_layer_type option[value='A']").remove(); + {% endif %} + firstfield = $("#edit_layer_form input:text, #edit_layer_form textarea").first(); if( ! firstfield.val() ) firstfield.focus()