changeset 41:ced361f3d90b

Uploading of header/footer images now works.
author Atul Varma <varmaa@toolness.com>
date Tue, 04 Mar 2008 09:18:13 -0600
parents 748547f73357
children 6cde01f6012a
files PersonasBackend/personas/json_feeds.py PersonasBackend/personas/models.py PersonasBackend/personas/templates/personas/edit.html PersonasBackend/personas/views.py PersonasBackend/settings.py PersonasBackend/urls.py
diffstat 6 files changed, 98 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/PersonasBackend/personas/json_feeds.py	Mon Mar 03 19:39:53 2008 -0600
+++ b/PersonasBackend/personas/json_feeds.py	Tue Mar 04 09:18:13 2008 -0600
@@ -39,13 +39,18 @@
 
     for persona in models.Persona.objects.all():
         # TODO: Make sure the Persona is marked as published.
+
+        # TODO: Make model accessors to get the final header/footer
+        # URL regardless of whether they were uploaded or specified as
+        # external URLs, and use those here.
+
         personaDicts.append(
             {"label" : persona.name,
              "id" : JSON_PERSONA_ID_TEMPLATE % persona.id,
              "dark" : ( persona.color_scheme == "dark" ),
              "baseURL" : "",
-             "headerURL" : persona.header_img,
-             "footerURL" : persona.footer_img,
+             "headerURL" : persona.header_img_url,
+             "footerURL" : persona.footer_img_url,
              "menu" : JSON_CATEGORY_ID_TEMPLATE % persona.category.id,
              "preview" : "yes"}
             )
--- a/PersonasBackend/personas/models.py	Mon Mar 03 19:39:53 2008 -0600
+++ b/PersonasBackend/personas/models.py	Tue Mar 04 09:18:13 2008 -0600
@@ -101,20 +101,44 @@
         blank=False,
         )
 
-    header_img = models.URLField(
-        "Header image",
+    header_img_url = models.URLField(
+        "Header image URL",
         help_text=("URL for the image that will be placed behind "
-                   "the browser's top chrome."),
+                   "the browser's top chrome. Only needed if "
+                   "a header image file is not specified."),
         verify_exists=True,
-        blank=False,
+        blank=True,
         )
 
-    footer_img = models.URLField(
-        "Footer image",
+    MAX_FILE_NAME_LENGTH = 255
+
+    header_img_file = models.ImageField(
+        "Header image file",
+        help_text=("File for the image that will be placed behind "
+                   "the browser's top chrome.  Only needed if "
+                   "a header image URL is not specified."),
+        upload_to="headers",
+        blank=True,
+        max_length=MAX_FILE_NAME_LENGTH,
+        )
+
+    footer_img_url = models.URLField(
+        "Footer image URL",
         help_text=("URL for the image that will be placed behind "
-                   "the browser's bottom chrome."),
+                   "the browser's bottom chrome.  Only needed if "
+                   "a footer image file is not specified."),
         verify_exists=True,
-        blank=False,
+        blank=True,
+        max_length=MAX_FILE_NAME_LENGTH,
+        )
+
+    footer_img_file = models.ImageField(
+        "Footer image file",
+        help_text=("File for the image that will be placed behind "
+                   "the browser's bottom chrome.  Only needed if "
+                   "a footer image URL is not specified."),
+        upload_to="footers",
+        blank=True,
         )
 
     MAX_COLOR_SCHEME_LENGTH = 10
@@ -175,8 +199,10 @@
         "name",
         "category",
         "description",
-        "header_img",
-        "footer_img",
+        "header_img_url",
+        "header_img_file",
+        "footer_img_url",
+        "footer_img_file",
         "color_scheme",
         "status",
         )
@@ -221,6 +247,7 @@
 
           >>> p = Persona(name='Test Persona',
           ...             description='Thos is a test.',
+          ...             header_img_file='test.png',
           ...             category=Category.objects.get(name='General'))
           >>> p.save()
           >>> p.revision
@@ -229,6 +256,7 @@
           []
 
           >>> p.description = 'This is a test.'
+          >>> p.header_img_file = 'blarg.png'
           >>> p.save()
           >>> p.revision
           1
@@ -236,6 +264,8 @@
           [<Revision: Test Persona - r0>]
           >>> p.revisions.get(revision=0).description
           u'Thos is a test.'
+          >>> p.revisions.get(revision=0).header_img_file
+          u'test.png'
         """
 
         if self.id == None:
@@ -316,14 +346,27 @@
         null=True,
         )
 
-    header_img = models.URLField(
+    # TODO: Add validation that ensures that either header_img_url or
+    # header_img_file is non-null; same goes for footer.
+
+    header_img_url = models.URLField(
         null=True,
         )
 
-    footer_img = models.URLField(
+    header_img_file = models.CharField(
+        max_length=Persona.MAX_FILE_NAME_LENGTH,
+        null=True
+        )
+
+    footer_img_url = models.URLField(
         null=True,
         )
 
+    footer_img_file = models.CharField(
+        max_length=Persona.MAX_FILE_NAME_LENGTH,
+        null=True
+        )
+
     color_scheme = models.CharField(
         max_length=Persona.MAX_COLOR_SCHEME_LENGTH,
         null=True,
@@ -344,6 +387,7 @@
 
           >>> p = Persona(name='Test Persona',
           ...             description='Thos is a test.',
+          ...             footer_img_file='test.png',
           ...             category=Category.objects.get(name='General'))
           >>> p.save()
           >>> p.description = 'This is a test.'
@@ -352,7 +396,8 @@
           >>> p.save()
           >>> p.description = "This is a great test."
           >>> p.save()
-          >>> p.header_img = "http://www.test.com"
+          >>> p.header_img_url = "http://www.test.com"
+          >>> p.footer_img_file = "test2.png"
           >>> p.save()
           >>> r = p.revisions.get(revision=0)
           >>> r.resolve()
@@ -360,8 +405,10 @@
           u'Test Persona'
           >>> r.description
           u'Thos is a test.'
-          >>> r.header_img
+          >>> r.header_img_url
           u''
+          >>> r.footer_img_file
+          u'test.png'
         """
 
         persona = self.revision_of
--- a/PersonasBackend/personas/templates/personas/edit.html	Mon Mar 03 19:39:53 2008 -0600
+++ b/PersonasBackend/personas/templates/personas/edit.html	Tue Mar 04 09:18:13 2008 -0600
@@ -8,7 +8,7 @@
     <div class="message">{{ message }}</div>
     {% endfor %}
     {% endif %}
-    <form method="post" action=".">
+    <form enctype="multipart/form-data" method="post" action=".">
       <table>
         {{ form }}
       </table>
--- a/PersonasBackend/personas/views.py	Mon Mar 03 19:39:53 2008 -0600
+++ b/PersonasBackend/personas/views.py	Tue Mar 04 09:18:13 2008 -0600
@@ -14,6 +14,26 @@
         context_instance = RequestContext(request)
         )
 
+def _rename_file( filedict, persona ):
+    import os
+    import time
+
+    # TODO: This feels hacky.  It might be cleaner to just rename the
+    # file after the commit is made or something.
+
+    origExt = os.path.splitext( filedict["filename"] )[1]
+    # TODO: Normalize origExt somehow?
+    if persona:
+        filename = "persona_%d_rev_%d%s" % (
+            persona.id,
+            persona.revision + 1,
+            origExt
+            )
+    else:
+        filename = "new_persona_%Y_%m_%d_%H_%M_%S" + origExt
+        filename = time.strftime( filename )
+    filedict["filename"] = filename
+
 @login_required
 def edit_view( request, persona_id=None ):
     # TODO: Perform permissions check to see if user has
@@ -25,7 +45,10 @@
         persona = models.Persona.objects.get( id=persona_id )
 
     if request.method == "POST":
-        form = forms.PersonaForm( request.POST, instance=persona )
+        for img_name in request.FILES:
+            _rename_file( request.FILES[img_name], persona )
+        form = forms.PersonaForm( request.POST, request.FILES,
+                                  instance=persona )
         if form.is_valid():
             newPersona = form.save( commit=False )
             newPersona.updater = request.user
--- a/PersonasBackend/settings.py	Mon Mar 03 19:39:53 2008 -0600
+++ b/PersonasBackend/settings.py	Tue Mar 04 09:18:13 2008 -0600
@@ -40,11 +40,11 @@
 
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = ''
+MEDIA_ROOT = os.path.normpath( os.path.join( myPath, "..", "media" ) )
 
 # URL that handles the media served from MEDIA_ROOT.
 # Example: "http://media.lawrence.com"
-MEDIA_URL = ''
+MEDIA_URL = '/personas/media/'
 
 # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
 # trailing slash.
--- a/PersonasBackend/urls.py	Mon Mar 03 19:39:53 2008 -0600
+++ b/PersonasBackend/urls.py	Tue Mar 04 09:18:13 2008 -0600
@@ -1,6 +1,9 @@
 from django.conf.urls.defaults import *
+from PersonasBackend import settings
 
 urlpatterns = patterns('',
     (r'^personas/admin/', include('django.contrib.admin.urls')),
+    (r'^personas/media/(?P<path>.*)$', 'django.views.static.serve',
+     {'document_root': settings.MEDIA_ROOT}),
     (r'^personas/', include('PersonasBackend.personas.urls')),
 )