mirror of
git://git.yoctoproject.org/layerindex-web.git
synced 2025-07-05 13:14:46 +02:00
Add CAPTCHA to submission form
This should prevent spamming even though this is less likely with this kind of site. The CAPTCHA does not show when editing, only submitting, and is also not shown for authenticated users. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
parent
482abdcc8a
commit
4b3aad2cea
1
README
1
README
|
@ -29,6 +29,7 @@ In order to make use of this application you will need:
|
||||||
* django-registration
|
* django-registration
|
||||||
* django-reversion
|
* django-reversion
|
||||||
* django-reversion-compare
|
* django-reversion-compare
|
||||||
|
* django-simple-captcha
|
||||||
|
|
||||||
Setup instructions:
|
Setup instructions:
|
||||||
|
|
||||||
|
|
2
TODO
2
TODO
|
@ -9,8 +9,6 @@ TODO:
|
||||||
* Breadcrumbs / fix tab navigation?
|
* Breadcrumbs / fix tab navigation?
|
||||||
* Need an admin contact in footer
|
* Need an admin contact in footer
|
||||||
* Show recipes from non-software/base layers differently in recipes list
|
* Show recipes from non-software/base layers differently in recipes list
|
||||||
* Submit layer form fixes:
|
|
||||||
* Captcha
|
|
||||||
|
|
||||||
Later:
|
Later:
|
||||||
* Usage links in list page?
|
* Usage links in list page?
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
|
|
||||||
<div class="formfields">
|
<div class="formfields">
|
||||||
{% for field in form.visible_fields %}
|
{% for field in form.visible_fields %}
|
||||||
|
{% if field.name != 'captcha' %}
|
||||||
{% if field.errors %}
|
{% if field.errors %}
|
||||||
<div class="control-group alert alert-error">
|
<div class="control-group alert alert-error">
|
||||||
{{ field.errors }}
|
{{ field.errors }}
|
||||||
|
@ -92,6 +93,7 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<h3 id="maintainers">Maintainers</h3>
|
<h3 id="maintainers">Maintainers</h3>
|
||||||
|
@ -115,16 +117,39 @@
|
||||||
<div class="control-label">
|
<div class="control-label">
|
||||||
{{ field.label_tag }}
|
{{ field.label_tag }}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="controls">
|
||||||
{{ field }}
|
{{ field }}
|
||||||
<span class="help-inline custom-help">
|
<span class="help-inline custom-help">
|
||||||
{{ field.help_text }}
|
{{ field.help_text }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<p><a href="#" class="btn btn-small" id="addanothermaintainer"><i class="icon-plus"></i>Add maintainer</a><p>
|
<p><a href="#" class="btn btn-small" id="addanothermaintainer"><i class="icon-plus"></i>Add maintainer</a><p>
|
||||||
|
|
||||||
|
|
||||||
|
{% if form.captcha %}
|
||||||
|
<div class="captchafield">
|
||||||
|
<h3>Verification</h3>
|
||||||
|
{% if form.captcha.errors %}
|
||||||
|
<div class="control-group alert alert-error">
|
||||||
|
{{ form.captcha.errors }}
|
||||||
|
{% else %}
|
||||||
|
<div class="control-group">
|
||||||
|
{% endif %}
|
||||||
|
<div class="controls">
|
||||||
|
{{ form.captcha }}
|
||||||
|
<span class="help-inline custom-help">
|
||||||
|
{{ form.captcha.help_text }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="submitbuttons">
|
<div class="submitbuttons">
|
||||||
{% block submitbuttons %}
|
{% block submitbuttons %}
|
||||||
<input type="submit" value="Save layer" class="btn btn-primary btn-large" />
|
<input type="submit" value="Save layer" class="btn btn-primary btn-large" />
|
||||||
|
|
|
@ -8,6 +8,7 @@ from layerindex.models import LayerItem, LayerMaintainer, LayerNote
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.core.validators import URLValidator, RegexValidator, email_re
|
from django.core.validators import URLValidator, RegexValidator, email_re
|
||||||
from django.forms.models import inlineformset_factory
|
from django.forms.models import inlineformset_factory
|
||||||
|
from captcha.fields import CaptchaField
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,17 +47,21 @@ LayerMaintainerFormSet = inlineformset_factory(LayerItem, LayerMaintainer, form=
|
||||||
class SubmitLayerForm(forms.ModelForm):
|
class SubmitLayerForm(forms.ModelForm):
|
||||||
# Additional form fields
|
# Additional form fields
|
||||||
deps = forms.ModelMultipleChoiceField(label='Other layers this layer depends upon', queryset=LayerItem.objects.all(), required=False)
|
deps = forms.ModelMultipleChoiceField(label='Other layers this layer depends upon', queryset=LayerItem.objects.all(), required=False)
|
||||||
|
captcha = CaptchaField(label='Verification', help_text='Please enter the letters displayed for verification purposes', error_messages={'invalid':'Incorrect entry, please try again'})
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = LayerItem
|
model = LayerItem
|
||||||
fields = ('name', 'layer_type', 'summary', 'description', 'vcs_url', 'vcs_subdir', 'vcs_web_url', 'vcs_web_tree_base_url', 'vcs_web_file_base_url', 'usage_url', 'mailing_list_url')
|
fields = ('name', 'layer_type', 'summary', 'description', 'vcs_url', 'vcs_subdir', 'vcs_web_url', 'vcs_web_tree_base_url', 'vcs_web_file_base_url', 'usage_url', 'mailing_list_url')
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, user, *args, **kwargs):
|
||||||
super(self.__class__, self).__init__(*args, **kwargs)
|
super(self.__class__, self).__init__(*args, **kwargs)
|
||||||
if self.instance.pk:
|
if self.instance.pk:
|
||||||
self.fields['deps'].initial = [d.dependency.pk for d in self.instance.dependencies_set.all()]
|
self.fields['deps'].initial = [d.dependency.pk for d in self.instance.dependencies_set.all()]
|
||||||
|
del self.fields['captcha']
|
||||||
else:
|
else:
|
||||||
self.fields['deps'].initial = [l.pk for l in LayerItem.objects.filter(name='openembedded-core')]
|
self.fields['deps'].initial = [l.pk for l in LayerItem.objects.filter(name='openembedded-core')]
|
||||||
|
if user.is_authenticated():
|
||||||
|
del self.fields['captcha']
|
||||||
self.was_saved = False
|
self.was_saved = False
|
||||||
|
|
||||||
def checked_deps(self):
|
def checked_deps(self):
|
||||||
|
|
|
@ -115,6 +115,16 @@ padding: 8px;
|
||||||
padding-right: 3px;
|
padding-right: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.captchafield {
|
||||||
|
padding-top: 1em;
|
||||||
|
padding-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.captcha {
|
||||||
|
padding-right: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.submitbuttons {
|
.submitbuttons {
|
||||||
margin-top: 2em;
|
margin-top: 2em;
|
||||||
padding-top: 1em;
|
padding-top: 1em;
|
||||||
|
|
|
@ -88,7 +88,7 @@ def edit_layer_view(request, template_name, slug=None):
|
||||||
layeritem = LayerItem()
|
layeritem = LayerItem()
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = SubmitLayerForm(request.POST, instance=layeritem)
|
form = SubmitLayerForm(request.user, request.POST, instance=layeritem)
|
||||||
maintainerformset = LayerMaintainerFormSet(request.POST, instance=layeritem)
|
maintainerformset = LayerMaintainerFormSet(request.POST, instance=layeritem)
|
||||||
if form.is_valid() and maintainerformset.is_valid():
|
if form.is_valid() and maintainerformset.is_valid():
|
||||||
with transaction.commit_on_success():
|
with transaction.commit_on_success():
|
||||||
|
@ -132,7 +132,7 @@ def edit_layer_view(request, template_name, slug=None):
|
||||||
return HttpResponseRedirect(reverse('submit_layer_thanks'))
|
return HttpResponseRedirect(reverse('submit_layer_thanks'))
|
||||||
form.was_saved = True
|
form.was_saved = True
|
||||||
else:
|
else:
|
||||||
form = SubmitLayerForm(instance=layeritem)
|
form = SubmitLayerForm(request.user, instance=layeritem)
|
||||||
maintainerformset = LayerMaintainerFormSet(instance=layeritem)
|
maintainerformset = LayerMaintainerFormSet(instance=layeritem)
|
||||||
|
|
||||||
return render(request, template_name, {
|
return render(request, template_name, {
|
||||||
|
|
|
@ -140,7 +140,8 @@ INSTALLED_APPS = (
|
||||||
'layerindex',
|
'layerindex',
|
||||||
'registration',
|
'registration',
|
||||||
'reversion',
|
'reversion',
|
||||||
'reversion_compare'
|
'reversion_compare',
|
||||||
|
'captcha'
|
||||||
)
|
)
|
||||||
|
|
||||||
# A sample logging configuration. The only tangible logging
|
# A sample logging configuration. The only tangible logging
|
||||||
|
|
1
urls.py
1
urls.py
|
@ -14,5 +14,6 @@ urlpatterns = patterns('',
|
||||||
url(r'^layerindex/', include('layerindex.urls')),
|
url(r'^layerindex/', include('layerindex.urls')),
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
url(r'^accounts/', include('registration.urls')),
|
url(r'^accounts/', include('registration.urls')),
|
||||||
|
url(r'^captcha/', include('captcha.urls')),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user