changeset 44:9e11c9374822

The JSON feeds now properly provide absolute URLs to personas, regardless of whether the persona images are self-hosted or not.
author Atul Varma <varmaa@toolness.com>
date Tue, 04 Mar 2008 11:15:10 -0600
parents 564818c67b57
children cf6b5f26e902
files PersonasBackend/personas/json_feeds.py PersonasBackend/personas/models.py
diffstat 2 files changed, 66 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/PersonasBackend/personas/json_feeds.py	Tue Mar 04 10:37:24 2008 -0600
+++ b/PersonasBackend/personas/json_feeds.py	Tue Mar 04 11:15:10 2008 -0600
@@ -40,17 +40,13 @@
     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_url,
-             "footerURL" : persona.footer_img_url,
+             "headerURL" : persona.get_header_url(),
+             "footerURL" : persona.get_footer_url(),
              "menu" : JSON_CATEGORY_ID_TEMPLATE % persona.category.id,
              "preview" : "yes"}
             )
--- a/PersonasBackend/personas/models.py	Tue Mar 04 10:37:24 2008 -0600
+++ b/PersonasBackend/personas/models.py	Tue Mar 04 11:15:10 2008 -0600
@@ -53,6 +53,48 @@
 
 from django.db import models
 from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+
+def _external_url_or_hosted_media_url( external, media ):
+    """
+    Given an absolute URL representing an externally-hosted resource
+    OR an absolute or relative URL representing a hosted resource,
+    returns an absolute URL to the resource.
+
+      >>> _external_url_or_hosted_media_url(
+      ...   'http://blarg.com/', None
+      ... )
+      'http://blarg.com/'
+
+      >>> _external_url_or_hosted_media_url(
+      ...   None, '/personas/headers/blah.jpg'
+      ... )
+      u'http://example.com/personas/headers/blah.jpg'
+
+      >>> _external_url_or_hosted_media_url(
+      ...   None, 'http://blah.com/personas/headers/blah.jpg'
+      ... )
+      'http://blah.com/personas/headers/blah.jpg'
+    """
+
+    # TODO: Consider uncommenting the following assertions; they may
+    # make some tests break, though.
+    # 
+    #assert external or media, \
+    #    "one parameter must be non-null"
+    #assert (not external and media), \
+    #    "both paramaters cannot be be non-null"
+
+    if external:
+        return external
+    else:
+        if not media.startswith( "/" ):
+            return media
+        else:
+            return "http://%s%s" % (
+                Site.objects.get_current().domain,
+                media
+                )
 
 class Category(models.Model):
     """
@@ -207,6 +249,28 @@
         "status",
         )
 
+    def get_header_url(self):
+        """
+        Regardless of how a header image was submitted or where it's
+        located, return an absolute URL to its location.
+        """
+
+        return _external_url_or_hosted_media_url(
+            self.header_img_url,
+            self.get_header_img_file_url()
+            )
+
+    def get_footer_url(self):
+        """
+        Regardless of how a footer image was submitted or where it's
+        located, return an absolute URL to its location.
+        """
+
+        return _external_url_or_hosted_media_url(
+            self.footer_img_url,
+            self.get_footer_img_file_url()
+            )
+
     def __make_new_revision(self):
         """
         Detect if any of our versioned properties have changed, and if