[extensions-web] Allow the reporter to optionally include email address information
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [extensions-web] Allow the reporter to optionally include email address information
- Date: Tue, 1 Nov 2011 14:47:58 +0000 (UTC)
commit 05b25047ab90235c84d2a7636e32ca4cf75680ca
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Mon Oct 31 18:50:56 2011 -0400
Allow the reporter to optionally include email address information
sweettooth/errorreports/forms.py | 25 +++++
...0004_auto__add_field_errorreport_can_contact.py | 98 ++++++++++++++++++++
sweettooth/errorreports/models.py | 3 +-
.../templates/errorreports/report.html | 10 ++-
.../errorreports/templates/errorreports/view.html | 8 ++
sweettooth/errorreports/views.py | 31 +++---
sweettooth/static/css/sweettooth.css | 25 +++--
7 files changed, 170 insertions(+), 30 deletions(-)
---
diff --git a/sweettooth/errorreports/forms.py b/sweettooth/errorreports/forms.py
new file mode 100644
index 0000000..83fbd05
--- /dev/null
+++ b/sweettooth/errorreports/forms.py
@@ -0,0 +1,25 @@
+
+from django import forms
+
+from errorreports.models import ErrorReport
+
+class ErrorReportForm(forms.ModelForm):
+
+ comments = forms.CharField(widget=forms.Textarea())
+ can_contact = forms.BooleanField(label="I wish to provide the extension author with my email address")
+
+ class Meta:
+ model = ErrorReport
+ fields = ('comments', 'can_contact')
+
+ def clean_comments(self):
+ return self.cleaned_data['comments'].strip()
+
+ def save(self, request, version, commit=True):
+ report = super(ErrorReportForm, self).save(commit=False)
+ report.user = request.user
+ report.version = version
+ if commit:
+ report.save()
+ return report
+
diff --git a/sweettooth/errorreports/migrations/0004_auto__add_field_errorreport_can_contact.py b/sweettooth/errorreports/migrations/0004_auto__add_field_errorreport_can_contact.py
new file mode 100644
index 0000000..14dcab2
--- /dev/null
+++ b/sweettooth/errorreports/migrations/0004_auto__add_field_errorreport_can_contact.py
@@ -0,0 +1,98 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'ErrorReport.can_contact'
+ db.add_column('errorreports_errorreport', 'can_contact', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'ErrorReport.can_contact'
+ db.delete_column('errorreports_errorreport', 'can_contact')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'errorreports.errorreport': {
+ 'Meta': {'object_name': 'ErrorReport'},
+ 'can_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['auth.User']"}),
+ 'version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['extensions.ExtensionVersion']"})
+ },
+ 'extensions.extension': {
+ 'Meta': {'object_name': 'Extension'},
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ 'icon': ('django.db.models.fields.files.ImageField', [], {'default': "'/static/images/plugin.png'", 'max_length': '100', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'screenshot': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'slug': ('autoslug.fields.AutoSlugField', [], {'unique_with': '()', 'max_length': '50', 'populate_from': 'None', 'db_index': 'True'}),
+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200', 'db_index': 'True'})
+ },
+ 'extensions.extensionversion': {
+ 'Meta': {'unique_together': "(('extension', 'version'),)", 'object_name': 'ExtensionVersion'},
+ 'extension': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'versions'", 'to': "orm['extensions.Extension']"}),
+ 'extra_json_fields': ('django.db.models.fields.TextField', [], {}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'shell_versions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['extensions.ShellVersion']", 'symmetrical': 'False'}),
+ 'source': ('django.db.models.fields.files.FileField', [], {'max_length': '223'}),
+ 'status': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'version': ('django.db.models.fields.IntegerField', [], {'default': '0'})
+ },
+ 'extensions.shellversion': {
+ 'Meta': {'object_name': 'ShellVersion'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'major': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'minor': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'point': ('django.db.models.fields.IntegerField', [], {})
+ }
+ }
+
+ complete_apps = ['errorreports']
diff --git a/sweettooth/errorreports/models.py b/sweettooth/errorreports/models.py
index 9935df5..4e12856 100644
--- a/sweettooth/errorreports/models.py
+++ b/sweettooth/errorreports/models.py
@@ -6,9 +6,8 @@ from extensions.models import ExtensionVersion
class ErrorReport(models.Model):
comment = models.TextField(blank=True)
-
user = models.ForeignKey(auth.models.User, related_name="+")
-
version = models.ForeignKey(ExtensionVersion)
+ can_contact = models.BooleanField()
error_reported = Signal(providing_args=["version", "report"])
diff --git a/sweettooth/errorreports/templates/errorreports/report.html b/sweettooth/errorreports/templates/errorreports/report.html
index afb5ce9..446ec16 100644
--- a/sweettooth/errorreports/templates/errorreports/report.html
+++ b/sweettooth/errorreports/templates/errorreports/report.html
@@ -3,16 +3,20 @@
{% block body %}
<h2><em>{{ version.extension.name }}</em> is malfunctioning?</h2>
-<p>Please look through the information below and edit out
- any private information.</p>
+<p>Please look through the information below and edit out any unwanted information.</p>
<form action="" method="POST" id="error_report">
{% csrf_token %}
<h3> Comments for the author </h3>
- <textarea name="comment" id="comment"></textarea>
+ {{ form.comments }}
+
+ <p>GNOME Shell Extensions will not provide the extension author with any contact information by default. If you wish to be contacted by the extension author, please check the box below.</p>
+
+ {{ form.can_contact }} {{ form.can_contact.label_tag }}
<input type="submit" value="Report Errors">
</form>
+
{% endblock %}
{% block document-ready %}
diff --git a/sweettooth/errorreports/templates/errorreports/view.html b/sweettooth/errorreports/templates/errorreports/view.html
index 0636298..dfecf44 100644
--- a/sweettooth/errorreports/templates/errorreports/view.html
+++ b/sweettooth/errorreports/templates/errorreports/view.html
@@ -7,6 +7,14 @@
<h3> Comments for the author </h3>
<div>{{ report.comment|default:"No comments" }}</div>
</div>
+
+<h3> Contact information </h3>
+{% if report.can_contact %}
+<p>Please email the reporter back to respond. The user's address is:</p>
+<a class="email" href="mailto:{{ report.user.email }}">{{ report.user.email }}</a>
+{% else %}
+<p>The reporter did not provide you with his contact information.</p>
+{% endif %}
{% endblock %}
{% block navclass %}main{% endblock %}
diff --git a/sweettooth/errorreports/views.py b/sweettooth/errorreports/views.py
index 3e023b7..01de793 100644
--- a/sweettooth/errorreports/views.py
+++ b/sweettooth/errorreports/views.py
@@ -8,6 +8,7 @@ from django.shortcuts import redirect
from django.template.loader import render_to_string
from errorreports.models import ErrorReport, error_reported
+from errorreports.forms import ErrorReportForm
from extensions.models import ExtensionVersion
from decorators import post_only_view, model_view
@@ -18,29 +19,29 @@ def report_error_view(request, obj):
extension, version = obj.extension, obj
if request.method == 'POST':
- comment = request.POST['comment']
+ form = ErrorReportForm(data=request.POST)
if not request.user.is_authenticated():
return HttpResponseForbidden()
- report = ErrorReport(version=version,
- comment=comment,
- user=request.user)
- report.save()
+ if form.is_valid():
+ report = form.save(request=request, version=version)
+ error_reported.send(sender=request, version=version, report=report)
- error_reported.send(sender=request, version=version, report=report)
+ messages.info(request, "Thank you for your error report!")
- messages.info(request, "Thank you for your error report!")
-
- return redirect('extensions-version-detail',
- pk=version.pk,
- ext_pk=extension.pk,
- slug=extension.slug)
+ return redirect('extensions-version-detail',
+ pk=version.pk,
+ ext_pk=extension.pk,
+ slug=extension.slug)
else:
- context = dict(version=version,
- extension=extension)
- return render(request, 'errorreports/report.html', context)
+ form = ErrorReportForm()
+
+ context = dict(version=version,
+ extension=extension,
+ form=form)
+ return render(request, 'errorreports/report.html', context)
@model_view(ErrorReport)
def view_error_report_view(request, obj):
diff --git a/sweettooth/static/css/sweettooth.css b/sweettooth/static/css/sweettooth.css
index 302ad74..1d9f359 100644
--- a/sweettooth/static/css/sweettooth.css
+++ b/sweettooth/static/css/sweettooth.css
@@ -355,8 +355,13 @@ li.extension:last-child {
padding-left: 16px;
}
-#error_report input {
- float: right;
+#error_report input[name=can_contact] {
+ margin-left: 1em;
+}
+
+#error_report input[type=submit] {
+ display: block;
+ margin: 1em;
}
#error_report textarea,
@@ -379,14 +384,14 @@ li.extension:last-child {
white-space: pre;
}
-#error_report .no-errors {
- color: #888;
- font: inherit;
- text-align: center;
- height: 1.6em;
- min-height: 1.6em;
- line-height: 1.6em;
- resize: none;
+#error_report .email {
+ display: block;
+ margin: .2em auto;
+
+ background-color: white;
+ color: #333;
+ font-family: monospace;
+ font-size: 1.2em;
}
/* Comments */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]