Refactored the picker so that it is more generic
authorSverre Rabbelier <srabbelier@gmail.com>
Thu, 05 Feb 2009 23:49:46 +0000
changeset 1229 ec3768cbf369
parent 1228 b24796279fb9
child 1230 b1b1897e4df1
Refactored the picker so that it is more generic The picker now also works in the case the scope_path of the entity should not be filtered on. Also, it is now easier to add new functionality due to the fact that there is a seperate Field type to handle it now. Patch by: Sverre Rabbelier
app/soc/models/group_app.py
app/soc/models/org_app.py
app/soc/models/presence.py
app/soc/models/presence_with_tos.py
app/soc/views/helper/redirects.py
app/soc/views/helper/templatetags/forms_helpers.py
app/soc/views/models/group_app.py
app/soc/views/models/presence.py
app/soc/views/models/presence_with_tos.py
app/soc/views/models/request.py
--- a/app/soc/models/group_app.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/models/group_app.py	Thu Feb 05 23:49:46 2009 +0000
@@ -89,7 +89,6 @@
     required=True,  collection_name='group_app_backup_admin',
     verbose_name=ugettext(
       'Please select your backup group administrator.'))
-  backup_admin.redirect_url = soc.models.user.User.URL_NAME
 
   member_criteria = db.TextProperty(required=True,
     verbose_name=ugettext(
--- a/app/soc/models/org_app.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/models/org_app.py	Thu Feb 05 23:49:46 2009 +0000
@@ -77,7 +77,6 @@
     'This template will be presented to contributors, such as students'
     ' and other non-member participants, when they apply to contribute'
     ' to the organization.')
-  contrib_template.redirect_url = soc.models.document.Document.URL_NAME
 
   contrib_disappears = db.TextProperty(required=True,
     verbose_name=ugettext(
--- a/app/soc/models/presence.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/models/presence.py	Thu Feb 05 23:49:46 2009 +0000
@@ -49,7 +49,6 @@
     collection_name='home')
   home.help_text = ugettext(
       'Document to be used as the "/home" page static contents.')
-  home.redirect_url = soc.models.document.Document.URL_NAME
 
   #: Valid ATOM or RSS feed url or None if unused. Feed entries are shown 
   #: on the site page using Google's JavaScript blog widget  
--- a/app/soc/models/presence_with_tos.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/models/presence_with_tos.py	Thu Feb 05 23:49:46 2009 +0000
@@ -39,4 +39,3 @@
     collection_name='tos')
   tos.help_text = ugettext(
       'Document containing optional Terms of Service for participating.')
-  tos.redirect_url = soc.models.document.Document.URL_NAME
--- a/app/soc/views/helper/redirects.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/views/helper/redirects.py	Thu Feb 05 23:49:46 2009 +0000
@@ -166,34 +166,14 @@
   return result
 
 
-def getSelectRedirect(entity, params):
+def getSelectRedirect(params):
   """Returns the pick redirect for the specified entity.
   """
 
-  if entity:
-    result = '/%s/pick?scope_path=%s&field=%s&continue=%s' % (
-        params['url_name'], entity.key().name(),
-        params['field_name'], params['return_url'])
+  if params.get('args'):
+    return '/%(url_name)s/pick?%(args)s' % params
   else:
-    result = '/%s/pick?field=%s&continue=%s' % (
-        params['url_name'], params['field_name'], params['return_url'])
-
-  return result
-
-
-def getReturnRedirect(return_url, field):
-  """Returns a function that has return_url and field embedded.
-  """
-
-  def wrapped(entity, params):
-    """Returns the return redirect for the specified entity.
-    """
-
-    result = '%s?field=%s&value=%s' % (
-        return_url, field, entity.link_id)
-    return result
-
-  return wrapped
+    return '/%(url_name)s/pick' % params
 
 
 def getInviteAcceptedRedirect(entity, _):
--- a/app/soc/views/helper/templatetags/forms_helpers.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/views/helper/templatetags/forms_helpers.py	Thu Feb 05 23:49:46 2009 +0000
@@ -31,6 +31,8 @@
 from django.utils.encoding import force_unicode
 from django.utils.html import escape
 
+from soc.views.helper import widgets
+
 
 register = template.Library()
 
@@ -171,10 +173,10 @@
   # Iterate over all fields and prepare it for adding 
   for name, field in form.fields.items():
     bf = forms_in.BoundField(form, field, name)
-    reference = None
+    attrs = {}
 
-    if name.endswith('_link_id'):
-      reference = get_reference_url(form, name[:-8])
+    if isinstance(field, widgets.ReferenceField):
+      attrs = field.rf
 
     # If the field is hidden we display it elsewhere
     if not bf.is_hidden:
@@ -182,7 +184,7 @@
       if hasattr(field, 'example_text'):
         example_text = force_unicode(field.example_text)
 
-      item = (bf, field.required, example_text, reference)
+      item = (bf, field.required, example_text, attrs)
       fields.append(item)
     else:
       hidden_fields.append(unicode(bf))
@@ -226,7 +228,7 @@
   return as_table_row_helper(context, field, required, example_text, reference)
 
 
-def as_table_row_helper(context, field, required, example_text, reference):
+def as_table_row_helper(context, field, required, example_text, attrs):
   """See as_table_row().
   """
 
@@ -236,14 +238,23 @@
   form = context['form']
   entity = context['entity']
 
+  reference = attrs.get('reference_url')
+  filter = attrs.get('filter')
+
   if reference:
     from soc.views.helper import redirects
     params = {
         'url_name': reference,
-        'field_name': field.name,
-        'return_url': context['return_url']
         }
-    select_url = redirects.getSelectRedirect(entity, params)
+
+    if entity:
+      args = {}
+      for filter_field in (i for i in filter if hasattr(entity, i)):
+        args[filter_field] = getattr(entity, filter_field)
+
+      params['args'] = '&'.join(['%s=%s' % item for item in args.iteritems()])
+
+    select_url = redirects.getSelectRedirect(params)
 
   if field.label:
     label = escape(force_unicode(field.label))
--- a/app/soc/views/models/group_app.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/views/models/group_app.py	Thu Feb 05 23:49:46 2009 +0000
@@ -38,6 +38,7 @@
 from soc.views.helper import lists as list_helper
 from soc.views.helper import redirects
 from soc.views.helper import responses
+from soc.views.helper import widgets
 from soc.views.models import base
 
 import soc.logic.models.group_app
@@ -82,9 +83,9 @@
         'created_on', 'last_modified_on']
 
     new_params['create_extra_dynafields'] = {
-        'backup_admin_link_id': forms.CharField(
-              label=params['logic'].getModel().backup_admin.verbose_name
-              ),
+        'backup_admin_link_id': widgets.ReferenceField(
+              reference_url='user',
+              label=params['logic'].getModel().backup_admin.verbose_name),
         'clean_backup_admin_link_id': 
             cleaning.clean_users_not_same('backup_admin_link_id'),
         }
--- a/app/soc/views/models/presence.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/views/models/presence.py	Thu Feb 05 23:49:46 2009 +0000
@@ -35,6 +35,7 @@
 from soc.views.helper import access
 from soc.views.helper import decorators
 from soc.views.helper import redirects
+from soc.views.helper import widgets
 from soc.views.models import base
 
 import soc.models.presence
@@ -66,15 +67,19 @@
     new_params['home_template'] = 'soc/presence/home.html'
 
     new_params['create_extra_dynafields'] = {
-        'home_link_id': forms.CharField(required=False,
-            label=ugettext('Home page Document link ID'),
-            help_text=soc.models.work.Work.link_id.help_text),
-
         # add cleaning of the link id and feed url
         'clean_link_id': cleaning.clean_link_id('link_id'),
         'clean_feed_url': cleaning.clean_feed_url,
         }
 
+    new_params['edit_extra_dynafields'] = {
+        'home_link_id': widgets.ReferenceField(
+            reference_url='document', filter=['scope_path'],
+            required=False, label=ugettext('Home page Document link ID'),
+            help_text=soc.models.work.Work.link_id.help_text),
+    }
+
+
     patterns = []
 
     page_name = "Home"
@@ -136,6 +141,9 @@
     """See base.View._editPost().
     """
 
+    if 'home_link_id' not in fields:
+      return super(View, self)._editPost(request, entity, fields)
+
     scope_path = self._logic.getKeyNameFromFields(fields)
 
     key_fields = {
--- a/app/soc/views/models/presence_with_tos.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/views/models/presence_with_tos.py	Thu Feb 05 23:49:46 2009 +0000
@@ -30,6 +30,7 @@
 from soc.logic import dicts
 from soc.logic.models import document as document_logic
 from soc.views.models import presence
+from soc.views.helper import widgets
 
 import soc.logic.models.presence_with_tos
 import soc.models.work
@@ -50,9 +51,10 @@
     new_params = {}
     new_params['logic'] = soc.logic.models.presence_with_tos.logic
 
-    new_params['create_extra_dynafields'] = {
-        'tos_link_id': forms.CharField(required=False,
-            label=ugettext('Terms of Service Document link ID'),
+    new_params['edit_extra_dynafields'] = {
+        'tos_link_id': widgets.ReferenceField(
+            reference_url='document', filter=['scope_path'],
+            required=False, label=ugettext('Terms of Service Document link ID'),
             help_text=soc.models.work.Work.link_id.help_text),
         }
 
@@ -76,6 +78,9 @@
     """See base.View._editPost().
     """
 
+    if 'tos_link_id' not in fields:
+      return super(View, self)._editPost(request, entity, fields)
+
     scope_path = self._logic.getKeyNameFromFields(fields)
 
     key_fields = {
--- a/app/soc/views/models/request.py	Thu Feb 05 23:46:39 2009 +0000
+++ b/app/soc/views/models/request.py	Thu Feb 05 23:49:46 2009 +0000
@@ -88,6 +88,7 @@
     new_params['extra_dynaexclude'] = ['status', 'role_verbose']
 
     new_params['create_extra_dynafields'] = {
+        'link_id': widgets.ReferenceField(reference_url='user'),
         'role': forms.CharField(widget=widgets.ReadOnlyInput(),
                                    required=True),
         'clean_link_id': cleaning.clean_existing_user('link_id'),