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()