Mercurial > personas_backend
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')), )