Merge branch 'list-columns'
diff --git a/app/app.yaml.template b/app/app.yaml.template
index 2164f94..44871db 100644
--- a/app/app.yaml.template
+++ b/app/app.yaml.template
@@ -15,7 +15,7 @@
 # TODO(proto): uncomment and supply a Google App Engine application instance
 # application: FIXME
 # TODO(release): see the instructions in README about the "version:" field
-version: 2-0-20130103-p1
+version: 2-0-20130110
 runtime: python
 api_version: 1
 
diff --git a/app/soc/modules/gci/views/homepage.py b/app/soc/modules/gci/views/homepage.py
index 0aaf40d..1fca43e 100644
--- a/app/soc/modules/gci/views/homepage.py
+++ b/app/soc/modules/gci/views/homepage.py
@@ -14,6 +14,9 @@
 
 """Module containing the views for GCI home page."""
 
+
+from django.utils import translation
+
 from soc.views.helper import url_patterns
 from soc.views.template import Template
 
@@ -28,9 +31,11 @@
 class HowItWorks(Template):
   """How it works template."""
 
-  CONTEST_BEGINS_ON_MSG = "Contest begins on %s %s"
+  CONTEST_BEGINS_ON_MSG = translation.ugettext('Contest begins on %s')
 
-  GET_STARTED_NOW_MSG = "Get Started Now!"
+  CONTEST_CLOSED_ON_MSG = translation.ugettext('Contest closed on %s')
+
+  GET_STARTED_NOW_MSG = translation.ugettext('Get Started Now!')
 
   def __init__(self, data):
     self.data = data
@@ -89,13 +94,14 @@
     return "v2/modules/gci/homepage/_how_it_works.html"
 
   def _getMainText(self):
-    if self.data.timeline.studentSignup():
-      return self.GET_STARTED_NOW_MSG
-    else:
+    if self.data.timeline.beforeStudentSignupStart():
       sign_up_start = self.data.timeline.studentSignupStart()
-      month = sign_up_start.strftime("%b")
-      day = sign_up_start.strftime("%d")
-      return self.CONTEST_BEGINS_ON_MSG % (month, day)
+      return self.CONTEST_BEGINS_ON_MSG % (sign_up_start.strftime('%b %d'),)
+    elif self.data.timeline.studentSignup():
+      return self.GET_STARTED_NOW_MSG
+    elif self.data.timeline.afterStopAllWorkDeadline():
+      contest_closed = self.data.timeline.stopAllWorkDeadline()
+      return self.CONTEST_CLOSED_ON_MSG % (contest_closed.strftime('%b %d'),)
 
 
 class FeaturedTask(Template):
diff --git a/app/soc/modules/gsoc/views/helper/request_data.py b/app/soc/modules/gsoc/views/helper/request_data.py
index 15c3b05..f9c210c 100644
--- a/app/soc/modules/gsoc/views/helper/request_data.py
+++ b/app/soc/modules/gsoc/views/helper/request_data.py
@@ -563,7 +563,6 @@
       self._url_name = 'show_gsoc_request'
     else:
       self._url_name = 'gsoc_invitation'
-    self._url_name = 'show_gsoc_request'
     return self
   
   def connect(self, user=None):
diff --git a/app/soc/modules/gsoc/views/org_app.py b/app/soc/modules/gsoc/views/org_app.py
index e61c62c..0c0cef3 100644
--- a/app/soc/modules/gsoc/views/org_app.py
+++ b/app/soc/modules/gsoc/views/org_app.py
@@ -21,6 +21,7 @@
 from django.utils.translation import ugettext
 
 from soc.logic.exceptions import BadRequest
+from soc.logic.exceptions import NotFound
 from soc.mapreduce.helper import control as mapreduce_control
 from soc.models.org_app_record import OrgAppRecord
 from soc.views import org_app
@@ -80,7 +81,6 @@
 
   def checkAccess(self):
     self.check.isHost()
-    self.mutator.orgAppFromKwargs(raise_not_found=False)
 
   def templatePath(self):
     return 'v2/modules/gsoc/org_app/edit.html'
@@ -158,7 +158,8 @@
 
   def checkAccess(self):
     self.check.isHost()
-    self.mutator.orgAppFromKwargs(raise_not_found=True)
+    if not self.data.org_app:
+      raise NotFound(access_checker.DEF_NO_ORG_APP % self.data.program.name)
 
   def templatePath(self):
     return 'v2/modules/gsoc/org_app/take.html'
@@ -191,7 +192,8 @@
     ]
 
   def checkAccess(self):
-    self.mutator.orgAppFromKwargs()
+    if not self.data.org_app:
+      raise NotFound(access_checker.DEF_NO_ORG_APP % self.data.program.name)
     self.mutator.orgAppRecordIfIdInKwargs()
     assert access_checker.isSet(self.data.org_app)
 
@@ -343,7 +345,8 @@
     ]
 
   def checkAccess(self):
-    self.mutator.orgAppFromKwargs()
+    if not self.data.org_app:
+      raise NotFound(access_checker.DEF_NO_ORG_APP % self.data.program.name)
     self.mutator.orgAppRecordIfIdInKwargs()
     assert access_checker.isSet(self.data.org_app_record)
 
diff --git a/app/soc/modules/gsoc/views/program.py b/app/soc/modules/gsoc/views/program.py
index a6b3f12..67aa344 100644
--- a/app/soc/modules/gsoc/views/program.py
+++ b/app/soc/modules/gsoc/views/program.py
@@ -56,7 +56,7 @@
 
   def __init__(self, request_data, *args, **kwargs):
     self.request_data = request_data
-    super(program.GSoCProgramMessagesForm, self).__init__(*args, **kwargs)
+    super(GSoCProgramMessagesForm, self).__init__(*args, **kwargs)
 
   class Meta:
     css_prefix = 'program_messages_form'
@@ -186,7 +186,7 @@
     return 'v2/modules/gsoc/program/messages.html'
 
   def _getForm(self, entity):
-    return program.GSoCProgramMessagesForm(self.data, self.data.POST or None,
+    return GSoCProgramMessagesForm(self.data, self.data.POST or None,
         instance=entity)
 
   def _getModel(self):
diff --git a/app/soc/views/helper/access_checker.py b/app/soc/views/helper/access_checker.py
index 4ab98ef..fdf72be 100644
--- a/app/soc/views/helper/access_checker.py
+++ b/app/soc/views/helper/access_checker.py
@@ -384,21 +384,6 @@
     if self.data.host or self.data.user.host_for:
       self.data.is_host = True
 
-  def orgAppFromKwargs(self, raise_not_found=True):
-    """Sets the organization application in RequestData object.
-
-    Args:
-      raise_not_found: iff False do not send 404 response.
-    """
-    assert self.data.program
-
-    q = OrgAppSurvey.all()
-    q.filter('program', self.data.program)
-    self.data.org_app = q.get()
-
-    if raise_not_found and not self.data.org_app:
-      raise NotFound(DEF_NO_ORG_APP % self.data.program.name)
-
   def orgAppRecordIfIdInKwargs(self):
     """Sets the organization application in RequestData object.
     """
diff --git a/app/soc/views/helper/request_data.py b/app/soc/views/helper/request_data.py
index 28711a7..e7b4fb6 100644
--- a/app/soc/views/helper/request_data.py
+++ b/app/soc/views/helper/request_data.py
@@ -96,6 +96,9 @@
   def studentSignupEnd(self):
     return self.timeline.student_signup_end
 
+  def stopAllWorkDeadline(self):
+    return self.timeline.stop_all_work_deadline
+
   def studentsSignupBetween(self):
     return (self.timeline.student_signup_start,
             self.timeline.student_signup_end)
@@ -132,6 +135,9 @@
   def afterStudentSignupEnd(self):
     return isAfter(self.studentSignupEnd())
 
+  def afterStopAllWorkDeadline(self):
+    return isAfter(self.stopAllWorkDeadline())
+
   def surveyPeriod(self, survey):
     start = survey.survey_start
     end = survey.survey_end
diff --git a/scripts/interactive.py b/scripts/interactive.py
index 40f6dcf..311ad13 100755
--- a/scripts/interactive.py
+++ b/scripts/interactive.py
@@ -155,7 +155,7 @@
 
   extra_paths = [here,
                  os.path.join(appengine_location, 'lib', 'django'),
-                 os.path.join(appengine_location, 'lib', 'webob'),
+                 os.path.join(appengine_location, 'lib', 'webob_0_9'),
                  os.path.join(appengine_location, 'lib', 'yaml', 'lib'),
                  os.path.join(appengine_location, 'lib', 'fancy_urllib'),
                  os.path.join(appengine_location, 'lib', 'simplejson'),