changeset 133:ba51d3b7740b

Add ability to upload a file to create a snippet If a file is specified, the contents of that file are used in preference to the contents of the 'content' text box.
author dellsystem <ilostwaldo@gmail.com>
date Sat, 22 Sep 2012 12:20:24 -0400
parents 4f6977515048
children 3a850f49eea6
files apps/snippet/forms.py apps/snippet/views.py templates/simple_field.djhtml templates/snippet/snippet_form.djhtml
diffstat 4 files changed, 91 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/apps/snippet/forms.py
+++ b/apps/snippet/forms.py
@@ -19,6 +19,12 @@
 EXPIRE_DEFAULT = 3600*24*30
 
 class SnippetForm(forms.ModelForm):
+    file = forms.FileField(help_text=_("If the snippet you want to post is \
+        saved as a file on your computer, you can upload it directly rather \
+        than having to copy and paste it into the box above. If a file \
+        is specified, the text in the content field above will be \
+        ignored."),
+        required=False)
 
     expire_options = forms.ChoiceField(
         choices=EXPIRE_CHOICES,
@@ -26,7 +32,8 @@
         label=_(u'Expires'),
     )
 
-    def __init__(self, request, *args, **kwargs):
+    def __init__(self, *args, **kwargs):
+        request = kwargs.pop('request')
         super(SnippetForm, self).__init__(*args, **kwargs)
         self.request = request
 
@@ -43,6 +50,26 @@
         except KeyError:
             pass
 
+        # Make the content field not required (validated in clean())
+        self.fields['content'].required = False
+        self.fields['title'].required = True
+
+    def clean(self):
+        cleaned_data = super(SnippetForm, self).clean()
+        file_data = cleaned_data.get('file')
+        content = cleaned_data.get('content')
+
+        if file_data:
+            file_data.open()
+            cleaned_data['content'] = file_data.read()
+        elif not content:
+            # No snippet data specified
+            raise forms.ValidationError(_("Please specify some content for \
+                the snippet, either in the content field or by uploading \
+                a file."))
+
+        return cleaned_data
+
     def save(self, parent=None, *args, **kwargs):
 
         # Set parent snippet
--- a/apps/snippet/views.py
+++ b/apps/snippet/views.py
@@ -1,7 +1,7 @@
 import difflib
 
 from django.shortcuts import render_to_response, \
-     get_object_or_404, get_list_or_404, render
+     get_object_or_404, get_list_or_404, render, redirect
 from django.template.context \
      import RequestContext
 from django.http \
@@ -28,40 +28,36 @@
     return render(request, 'snippet/explore.html', context)
 
 
-def snippet_new(request, template_name='snippet/snippet_new.djhtml'):
-
+def snippet_new(request):
     if request.method == "POST":
         snippet = Snippet()
-        try:
+
+        if request.user.is_authenticated():
             snippet.author = request.user
-        except:
-            pass
-        snippet_form = SnippetForm(data=request.POST, request=request,
+
+        snippet_form = SnippetForm(request.POST,
+                                   request.FILES,
+                                   request=request,
                                    instance=snippet)
+
         if snippet_form.is_valid():
             request, new_snippet = snippet_form.save()
-            return HttpResponseRedirect(new_snippet.get_absolute_url())
+            return redirect(new_snippet)
     else:
         snippet_form = SnippetForm(request=request)
 
     recent = Snippet.objects.all()[:10]
 
-    template_context = {
+    context = {
         'snippet_form': snippet_form,
         'recent_snippets' : recent,
     }
 
-    return render_to_response(
-        template_name,
-        template_context,
-        RequestContext(request)
-    )
+    return render(request, 'snippet/snippet_new.djhtml', context)
 
 
 def snippet_details(request, snippet_id,
-                    template_name='snippet/snippet_details.djhtml',
                     is_raw=False):
-
     snippet = get_object_or_404(Snippet, secret_id=snippet_id)
     snippet.num_views += 1
     snippet.save()
@@ -76,12 +72,13 @@
     }
 
     if request.method == "POST":
-        snippet_form = SnippetForm(data=request.POST,
+        snippet_form = SnippetForm(request.POST,
+                                   request.FILES,
                                    request=request,
                                    initial=new_snippet_initial)
         if snippet_form.is_valid():
             request, new_snippet = snippet_form.save(parent=snippet)
-            return HttpResponseRedirect(new_snippet.get_absolute_url())
+            return redirect(new_snippet)
     else:
         snippet_form = SnippetForm(initial=new_snippet_initial,
                                    request=request)
@@ -91,7 +88,7 @@
     else:
         default_pygments_style = PygmentsStyle.objects.get(pk=1)
 
-    template_context = {
+    context = {
         'snippet_form': snippet_form,
         'snippet': snippet,
         'lines': range(snippet.get_linecount()),
@@ -102,11 +99,7 @@
         'no_descendants': len(tree) == 1,
     }
 
-    response = render_to_response(
-        template_name,
-        template_context,
-        RequestContext(request)
-    )
+    response = render(request, 'snippet/snippet_details.djhtml', context)
 
     if is_raw:
         response['Content-Type'] = 'text/plain'
new file mode 100644
--- /dev/null
+++ b/templates/simple_field.djhtml
@@ -0,0 +1,10 @@
+{{ field.label_tag }}
+{{ field }}
+
+{% if field.errors %}
+<div class="errors">{{ field.errors }}</div>
+{% endif %}
+
+{% if field.help_text %}
+<p>{{ field.help_text }}</p>
+{% endif %}
--- a/templates/snippet/snippet_form.djhtml
+++ b/templates/snippet/snippet_form.djhtml
@@ -1,18 +1,40 @@
 {% load i18n %}
-<form method="post" action="" class="snippetform">
-{% csrf_token %}
-    {% for field in snippet_form %}
-        {{ field.errors }}
-        {{ field.label_tag }}
-        {{ field }}
-        {% if request.session.userprefs.display_all_lexer %}
-        {% ifequal field.name "lexer" %}
-            <input type="button" 
-                   value="{% trans "Guess lexer" %}" 
-                   id="guess_lexer_btn"/>
-        {% endifequal %}
-        {% endif %}
-    {% endfor %}
+<form method="post" action="" class="snippetform"
+    enctype="multipart/form-data">
+    {% if snippet_form.non_field_errors %}
+        <div class="errors">
+            {{ snippet_form.non_field_errors }}
+        </div>
+    {% endif %}
+
+    {% csrf_token %}
+
+    {% with field=snippet_form.title %}
+    {% include "simple_field.djhtml" %}
+    {% endwith %}
+
+    {% with field=snippet_form.content %}
+    {% include "simple_field.djhtml" %}
+    {% endwith %}
+
+    {% with field=snippet_form.file %}
+    {% include "simple_field.djhtml" %}
+    <br />
+    {% endwith %}
+
+    {% with field=snippet_form.lexer %}
+    {% include "simple_field.djhtml" %}
+    {% if request.session.userprefs.display_all_lexer %}
+    <input type="button"
+           value="{% trans "Guess lexer" %}"
+           id="guess_lexer_btn"/>
+    {% endif %}
+    {% endwith %}
+
+    {% with field=snippet_form.expire_options %}
+    {% include "simple_field.djhtml" %}
+    {% endwith %}
+
     <br />
     <div class="center-align">
         <button type="submit" class="button large">{% trans "Paste it" %}</button>