[extensions-web] Allow the reporter to optionally include email address information



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]