Reverting last 4 patches containing GHOP related views.
authorMadhusudan.C.S <madhusudancs@gmail.com>
Mon, 24 Aug 2009 04:31:23 +0530
changeset 2787 8408741aee63
parent 2786 b06313c87817
child 2788 78d02dcd8eb0
Reverting last 4 patches containing GHOP related views. As Lennard suggested all the model patches should come first followed by the logic and views patches, to make sure nothing committed breaks the existing code after thorough review.
app/index.yaml
app/soc/logic/cleaning.py
app/soc/logic/models/program.py
app/soc/models/program.py
app/soc/modules/ghop/callback.py
app/soc/modules/ghop/logic/models/program.py
app/soc/modules/ghop/views/models/__init__.py
app/soc/modules/ghop/views/models/organization.py
app/soc/modules/ghop/views/models/program.py
app/soc/modules/ghop/views/models/timeline.py
app/soc/views/models/program.py
app/soc/views/models/timeline.py
--- a/app/index.yaml	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/index.yaml	Mon Aug 24 04:31:23 2009 +0530
@@ -80,55 +80,3 @@
 # manually, move them above the marker line.  The index.yaml file is
 # automatically uploaded to the admin console when you next deploy
 # your application using appcfg.py.
-
-# Used 265 times in query history.
-- kind: GHOPComment
-  ancestor: yes
-  properties:
-  - name: created_on
-
-# Used 248 times in query history.
-- kind: GHOPWorkSubmission
-  ancestor: yes
-  properties:
-  - name: submitted_on
-
-# Used 3 times in query history.
-- kind: TaskArbitraryTag
-  properties:
-  - name: scope
-  - name: order
-    direction: desc
-
-# Used 168 times in query history.
-- kind: TaskDifficultyTag
-  properties:
-  - name: scope
-  - name: order
-
-# Used 3 times in query history.
-- kind: TaskDifficultyTag
-  properties:
-  - name: scope
-  - name: order
-    direction: desc
-
-# Used 67 times in query history.
-- kind: TaskTypeTag
-  properties:
-  - name: mandatory
-  - name: scope
-  - name: order
-
-# Used 70 times in query history.
-- kind: TaskTypeTag
-  properties:
-  - name: scope
-  - name: order
-
-# Used 14 times in query history.
-- kind: TaskTypeTag
-  properties:
-  - name: scope
-  - name: order
-    direction: desc
--- a/app/soc/logic/cleaning.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/logic/cleaning.py	Mon Aug 24 04:31:23 2009 +0530
@@ -791,29 +791,3 @@
   if not has_access(rights, access_level, scope_path, prefix):
     self._errors[field] = ErrorList([DEF_NO_RIGHTS_FOR_ACL_MSG])
     del self.cleaned_data[field]
-
-def str2set(string_field):
-  """Clean method for cleaning comma separated string in the edit form.
-
-  Obtains the comma separated string from the form and stores it as
-  returns it as a list of strings.
-  """
-
-  def wrapper(self):
-    """Decorator wrapper method.
-    """
-    cleaned_data = self.cleaned_data
-
-    string_data = cleaned_data.get(string_field)
-
-    list_data = []
-    for string in string_data.split(','):
-      string_strip = string.strip()
-      if string_strip and string_strip not in list_data:
-        list_data.append(string_strip)
-
-    cleaned_data[string_field] = list_data
-
-    return cleaned_data[string_field]
-
-  return wrapper
--- a/app/soc/logic/models/program.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/logic/models/program.py	Mon Aug 24 04:31:23 2009 +0530
@@ -27,37 +27,24 @@
 from soc.logic.models import sponsor as sponsor_logic
 
 import gsoc.logic.models.timeline
+import soc.logic.models.timeline
 import soc.models.program
 
-import soc.modules.ghop.logic.models.timeline
-
 
 class Logic(presence_with_tos.Logic):
   """Logic methods for the Program model.
   """
 
+  TIMELINE_LOGIC = {'gsoc' : gsoc.logic.models.timeline.logic,
+                    'ghop' : soc.logic.models.timeline.logic}
+
   def __init__(self, model=soc.models.program.Program, 
                base_model=None, scope_logic=sponsor_logic):
     """Defines the name, key_name and model for this entity.
     """
 
-    self.timeline_logic = gsoc.logic.models.timeline.logic
-
     super(Logic, self).__init__(model=model, base_model=base_model,
                                 scope_logic=scope_logic)
 
-  def createTimelineForType(self, fields):
-    """Creates and stores a timeline model for the given type of program.
-    """
-
-    properties = self.timeline_logic.getKeyFieldsFromFields(fields)
-    key_name = self.timeline_logic.getKeyNameFromFields(properties)
-
-    properties['scope'] = fields['scope']
-
-    timeline = self.timeline_logic.updateOrCreateFromKeyName(properties,
-                                                             key_name)
-    return timeline
-
 
 logic = Logic()
--- a/app/soc/models/program.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/models/program.py	Mon Aug 24 04:31:23 2009 +0530
@@ -77,7 +77,7 @@
       '<small><i>(rich text formatting is supported)</i></small>')
 
   #: Required field storing application/tasks limit of the program.
-  apps_tasks_limit = db.IntegerProperty(required=True, default=20,
+  apps_tasks_limit = db.IntegerProperty(required=True,
       verbose_name=ugettext('Application/Tasks Limit'))
   apps_tasks_limit.example_text = ugettext(
       '<small><i>e.g.</i></small> '
@@ -98,7 +98,7 @@
       'The amount of slots each organization should get at most')
 
   #: Required field storing slots limit of the program.
-  slots = db.IntegerProperty(required=True, default=0,
+  slots = db.IntegerProperty(required=True,
       verbose_name=ugettext('Slots'))
   slots.example_text = ugettext(
       '<small><i>e.g.</i></small> '
--- a/app/soc/modules/ghop/callback.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/modules/ghop/callback.py	Mon Aug 24 04:31:23 2009 +0530
@@ -21,11 +21,6 @@
   ]
 
 
-from soc.modules.ghop.views.models import organization
-from soc.modules.ghop.views.models import program
-from soc.modules.ghop.views.models import timeline
-
-
 class Callback(object):
   """Callback object that handles interaction between the core.
   """
@@ -44,17 +39,9 @@
 
     self.core.requireUniqueService('registerWithSitemap')
 
-    self.core.registerSitemapEntry(organization.view.getDjangoURLPatterns())
-    self.core.registerSitemapEntry(program.view.getDjangoURLPatterns())
-    self.core.registerSitemapEntry(timeline.view.getDjangoURLPatterns())
-
   def registerWithSidebar(self):
     """Called by the server when sidebar entries should be registered.
     """
 
     # require that we had the chance to register the urls we need with the sitemap
     self.core.requireUniqueService('registerWithSidebar')
-
-    self.core.registerSidebarEntry(organization.view.getExtraMenus)
-    self.core.registerSidebarEntry(organization.view.getSidebarMenus)
-    self.core.registerSidebarEntry(program.view.getSidebarMenus)
--- a/app/soc/modules/ghop/logic/models/program.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/modules/ghop/logic/models/program.py	Mon Aug 24 04:31:23 2009 +0530
@@ -27,7 +27,6 @@
 
 import soc.models.program
 
-import soc.modules.ghop.logic.models.timeline
 import soc.modules.ghop.models.program
 
 
@@ -44,20 +43,5 @@
     super(Logic, self).__init__(model, base_model=base_model,
                                 scope_logic=scope_logic)
 
-    self.timeline_logic = soc.modules.ghop.logic.models.timeline.logic
-
-  def createTimelineForType(self, fields):
-    """Creates and stores a timeline model for the given type of program.
-    """
-
-    properties = self.timeline_logic.getKeyFieldsFromFields(fields)
-    key_name = self.timeline_logic.getKeyNameFromFields(properties)
-
-    properties['scope'] = fields['scope']
-
-    timeline = self.timeline_logic.updateOrCreateFromKeyName(properties,
-                                                             key_name)
-    return timeline
-
 
 logic = Logic()
--- a/app/soc/modules/ghop/views/models/__init__.py	Sat Aug 22 04:05:48 2009 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-# Copyright 2009 the Melange authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""This is the GHOP Views models module.
-"""
-
--- a/app/soc/modules/ghop/views/models/organization.py	Sat Aug 22 04:05:48 2009 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,184 +0,0 @@
-#!/usr/bin/python2.5
-#
-# Copyright 2009 the Melange authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""GHOP specific views for Organizations.
-"""
-
-__authors__ = [
-    '"Madhusudan.C.S" <madhusudancs@gmail.com>'
-  ]
-
-
-import datetime
-
-from django import forms
-
-from soc.logic import cleaning
-from soc.logic import dicts
-from soc.logic.helper import timeline as timeline_helper
-from soc.views.helper import decorators
-from soc.views.helper import redirects
-from soc.views.models import organization
-from soc.views.sitemap import sidebar
-
-import soc.cache.logic
-
-from soc.modules.ghop.views.models import program as ghop_program_view
-from soc.modules.ghop.views.helper import redirects as ghop_redirects
-
-import soc.modules.ghop.logic.models.organization
-
-
-class View(organization.View):
-  """View methods for the GHOP Program model.
-  """
-
-  def __init__(self, params=None):
-    """Defines the fields and methods required for the program View class
-    to provide the user with list, public, create, edit and delete views.
-
-    Params:
-      params: a dict with params for this View
-    """
-
-    new_params = {}
-    new_params['logic'] = soc.modules.ghop.logic.models.organization.logic
-    new_params['scope_view'] = ghop_program_view
-
-    new_params['name'] = "GHOP Organization"
-    new_params['module_name'] = "organization"
-    new_params['sidebar_grouping'] = 'Organizations'
-
-    new_params['module_package'] = 'soc.modules.ghop.views.models'
-    new_params['url_name'] = 'ghop/org'
-
-    new_params['extra_dynaexclude'] = ['slots', 'slots_calculated',
-                                       'nr_applications', 'nr_mentors',
-                                       'slots_desired', 'ideas',
-                                       'task_quota_limit']
-
-    params = dicts.merge(params, new_params, sub_merge=True)
-
-    super(View, self).__init__(params=params)
-
-  def _getExtraMenuItems(self, role_description, params=None):
-    """Used to create the specific GHOP Organization menu entries.
-
-    For args see soc.views.models.organization.View._getExtraMenuItems().
-    """
-    submenus = []
-
-    group_entity = role_description['group']
-    program_entity = group_entity.scope
-    roles = role_description['roles']
-
-    if roles.get('ghop_org_admin') or roles.get('ghop_mentor'):
-      # add a link to view all the organization tasks.
-      submenu = (ghop_redirects.getListTasksRedirect(
-          group_entity, {'url_name': 'ghop/task'}),
-          "View all Tasks", 'any_access')
-      submenus.append(submenu)
-
-
-    if roles.get('ghop_org_admin'):
-      # add a link to create task
-      submenu = (redirects.getCreateRedirect(
-           group_entity, {'url_name': 'ghop/task'}),
-          "Create a Task", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to the management page
-      submenu = (redirects.getListRolesRedirect(group_entity, params),
-          "Manage Admins and Mentors", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to invite an org admin
-      submenu = (redirects.getInviteRedirectForRole(
-          group_entity, 'ghop/org_admin'),
-          "Invite an Admin", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to invite a member
-      submenu = (redirects.getInviteRedirectForRole(
-          group_entity, 'ghop/mentor'), "Invite a Mentor", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to the request page
-      submenu = (redirects.getListRequestsRedirect(group_entity, params),
-          "List Requests and Invites", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to the edit page
-      submenu = (redirects.getEditRedirect(group_entity, params),
-          "Edit Organization Profile", 'any_access')
-      submenus.append(submenu)
-
-    if roles.get('ghop_mentor'):
-      # add a link to suggest task
-      submenu = (ghop_redirects.getSuggestTaskRedirect(
-          group_entity, {'url_name': 'ghop/task'}),
-          "Suggest a Task", 'any_access')
-      submenus.append(submenu)
-
-    if roles.get('ghop_org_admin') or roles.get('ghop_mentor'):
-      submenu = (redirects.getCreateDocumentRedirect(group_entity, 'ghop_org'),
-          "Create a New Document", 'any_access')
-      submenus.append(submenu)
-
-      submenu = (redirects.getListDocumentsRedirect(group_entity, 'ghop_org'),
-          "List Documents", 'any_access')
-      submenus.append(submenu)
-
-    if roles.get('org_admin'):
-      # add a link to the resign page
-      submenu = (redirects.getManageRedirect(roles['ghop_org_admin'],
-          {'url_name': 'ghop/org_admin'}),
-          "Resign as Admin", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to the edit page
-      submenu = (redirects.getEditRedirect(roles['ghop_org_admin'],
-          {'url_name': 'ghop/org_admin'}),
-          "Edit My Admin Profile", 'any_access')
-      submenus.append(submenu)
-
-
-    if roles.get('ghop_mentor'):
-      # add a link to the resign page
-      submenu = (redirects.getManageRedirect(roles['ghop_mentor'],
-          {'url_name' : 'ghop/mentor'}),
-          "Resign as Mentor", 'any_access')
-      submenus.append(submenu)
-
-      # add a link to the edit page
-      submenu = (redirects.getEditRedirect(roles['ghop_mentor'],
-          {'url_name': 'ghop/mentor'}),
-          "Edit My Mentor Profile", 'any_access')
-      submenus.append(submenu)
-
-    return submenus
-
-
-view = View()
-
-admin = decorators.view(view.admin)
-create = decorators.view(view.create)
-delete = decorators.view(view.delete)
-edit = decorators.view(view.edit)
-list = decorators.view(view.list)
-public = decorators.view(view.public)
-export = decorators.view(view.export)
-home = decorators.view(view.home)
--- a/app/soc/modules/ghop/views/models/program.py	Sat Aug 22 04:05:48 2009 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-#!/usr/bin/python2.5
-#
-# Copyright 2009 the Melange authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""GHOP specific views for Programs.
-"""
-
-__authors__ = [
-    '"Madhusudan.C.S" <madhusudancs@gmail.com>'
-  ]
-
-
-import datetime
-
-from django import forms
-
-from soc.logic import cleaning
-from soc.logic import dicts
-from soc.views.helper import decorators
-from soc.views.models import program 
-from soc.views.sitemap import sidebar
-
-import soc.cache.logic
-
-from soc.modules.ghop.logic.models import program as ghop_program_logic
-import soc.modules.ghop.logic.models.program
-
-
-class View(program.View):
-  """View methods for the GHOP Program model.
-  """
-
-  def __init__(self, params=None):
-    """Defines the fields and methods required for the program View class
-    to provide the user with list, public, create, edit and delete views.
-
-    Params:
-      params: a dict with params for this View
-    """
-
-    new_params = {}
-    new_params['logic'] = soc.modules.ghop.logic.models.program.logic
-
-    new_params['name'] = "GHOP Program"
-    new_params['module_name'] = "program"
-    new_params['sidebar_grouping'] = 'Programs'
-
-    new_params['module_package'] = 'soc.modules.ghop.views.models'
-    new_params['url_name'] = 'ghop/program'
-
-    new_params['extra_dynaexclude'] = ['apps_tasks_limit',
-                                       'min_slots', 'max_slots',
-                                       'slots', 'slot_allocation',
-                                       'allocations_visible',
-                                       'task_difficulties', 'task_types',
-                                       ]
-
-    new_params['create_dynafields'] = [
-        {'name': 'task_difficulties_str',
-         'base': forms.fields.CharField,
-         'label': 'Task Difficulty levels',
-         },
-        {'name': 'task_types_str',
-         'base': forms.fields.CharField,
-         'label': 'Task Types',
-         },
-        ]
-
-    new_params['create_extra_dynaproperties'] = {
-        'clean_task_difficulties_str': cleaning.str2set(
-            'task_difficulties_str'),
-        'clean_task_types_str': cleaning.str2set(
-            'task_types_str'),
-        }
-
-    params = dicts.merge(params, new_params, sub_merge=True)
-
-    super(View, self).__init__(params=params)
-
-  def _editGet(self, request, entity, form):
-    """See base.View._editGet().
-    """
-
-    if entity.task_difficulties:
-      form.fields['task_difficulties_str'].initial = ', '.join(
-          entity.task_difficulties)
-
-    if entity.task_types:
-      form.fields['task_types_str'].initial = ', '.join(entity.task_types)
-
-    return super(View, self)._editGet(request, entity, form)
-
-  def _editPost(self, request, entity, fields):
-    """See base._editPost().
-    """
-
-    fields['task_difficulties'] = fields['task_difficulties_str']
-    fields['task_types'] = fields['task_types_str']
-
-    return super(View, self)._editPost(request, entity, fields)
-
-
-view = View()
-
-admin = decorators.view(view.admin)
-create = decorators.view(view.create)
-delete = decorators.view(view.delete)
-edit = decorators.view(view.edit)
-list = decorators.view(view.list)
-public = decorators.view(view.public)
-export = decorators.view(view.export)
-home = decorators.view(view.home)
--- a/app/soc/modules/ghop/views/models/timeline.py	Sat Aug 22 04:05:48 2009 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-#!/usr/bin/python2.5
-#
-# Copyright 2009 the Melange authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""GHOP specific views for Timeline.
-"""
-
-__authors__ = [
-    '"Madhusudan.C.S" <madhusudancs@gmail.com>'
-  ]
-
-
-from soc.logic import dicts
-from soc.views.helper import decorators
-from soc.views.helper import dynaform
-from soc.views.helper import params as params_helper
-from soc.views.models import timeline 
-from soc.views.sitemap import sidebar
-
-import soc.cache.logic
-
-from soc.modules.ghop.logic.models import program as ghop_program_logic
-
-import soc.modules.ghop.logic.models.timeline
-
-
-class View(timeline.View):
-  """View methods for the GHOP Timeline model.
-  """
-
-  def __init__(self, params=None):
-    """Defines the fields and methods required for the program View class
-    to provide the user with list, public, create, edit and delete views.
-
-    Params:
-      params: a dict with params for this View
-    """
-
-    new_params = {}
-    new_params['logic'] = soc.modules.ghop.logic.models.timeline.logic
-
-    new_params['name'] = "GHOP Timeline"
-    new_params['module_name'] = "timeline"
-
-    new_params['module_package'] = 'soc.modules.ghop.views.models'
-    new_params['url_name'] = 'ghop/timeline'
-
-    params = dicts.merge(params, new_params, sub_merge=True)
-
-    super(View, self).__init__(params=params)
-
-  def edit(self, request, access_type,
-           page_name=None, params=None, seed=None, **kwargs):
-    """See base.View.edit.
-    """
-
-    params = dicts.merge(params, self._params)
-
-    key_fields = ghop_program_logic.logic.getKeyFieldsFromFields(kwargs)
-
-    program = ghop_program_logic.logic.getFromKeyFields(key_fields)
-    if program:
-      params['logic'] = ghop_program_logic.logic.timeline_logic
-
-    timeline_model = ghop_program_logic.logic.timeline_logic
-
-    return super(View, self).edit(request, access_type, page_name=page_name,
-                                  params=params, seed=seed, **kwargs)
-
-
-view = View()
-
-admin = decorators.view(view.admin)
-create = decorators.view(view.create)
-delete = decorators.view(view.delete)
-edit = decorators.view(view.edit)
-list = decorators.view(view.list)
-public = decorators.view(view.public)
-export = decorators.view(view.export)
--- a/app/soc/views/models/program.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/views/models/program.py	Mon Aug 24 04:31:23 2009 +0530
@@ -588,11 +588,27 @@
 
     if not entity:
       # there is no existing entity so create a new timeline
-      fields['timeline'] = self._params['logic'].createTimelineForType(fields)
+      fields['timeline'] = self._createTimelineForType(fields)
     else:
       # use the timeline from the entity
       fields['timeline'] = entity.timeline
 
+  def _createTimelineForType(self, fields):
+    """Creates and stores a timeline model for the given type of program.
+    """
+
+    workflow = fields['workflow']
+
+    timeline_logic = program_logic.logic.TIMELINE_LOGIC[workflow]
+
+    properties = timeline_logic.getKeyFieldsFromFields(fields)
+    key_name = timeline_logic.getKeyNameFromFields(properties)
+
+    properties['scope'] = fields['scope']
+
+    timeline = timeline_logic.updateOrCreateFromKeyName(properties, key_name)
+    return timeline
+
   @decorators.merge_params
   def getExtraMenus(self, id, user, params=None):
     """Returns the extra menu's for this view.
--- a/app/soc/views/models/timeline.py	Sat Aug 22 04:05:48 2009 +0530
+++ b/app/soc/views/models/timeline.py	Mon Aug 24 04:31:23 2009 +0530
@@ -58,7 +58,7 @@
     new_params['name'] = "Timeline"
 
     patterns = [(r'^%(url_name)s/(?P<access_type>edit)/%(key_fields)s$',
-                  '%(module_package)s.%(module_name)s.edit', 
+                  'soc.views.models.%(module_name)s.edit', 
                   "Edit %(name_short)s")]
 
     new_params['create_extra_dynaproperties'] = {
@@ -72,15 +72,16 @@
 
     super(View, self).__init__(params=params)
 
-    create_form = params_helper.getCreateForm(self._params, 
-        program_logic.logic.timeline_logic.getModel())
-    edit_form = dynaform.extendDynaForm(
-      dynaform = create_form,
-      dynainclude = self._params['edit_dynainclude'],
-      dynaexclude = self._params['edit_dynaexclude'],
-      )
+    for name, logic_value in program_logic.logic.TIMELINE_LOGIC.iteritems():
+      create_form = params_helper.getCreateForm(self._params, 
+          logic_value.getModel())
+      edit_form = dynaform.extendDynaForm(
+        dynaform = create_form,
+        dynainclude = self._params['edit_dynainclude'],
+        dynaexclude = self._params['edit_dynaexclude'],
+        )
 
-    self._params['edit_form'] = edit_form
+      self._params['edit_form_%s' % name] = edit_form
 
   def edit(self, request, access_type,
            page_name=None, params=None, seed=None, **kwargs):
@@ -96,7 +97,9 @@
 
     program = program_logic.logic.getFromKeyFields(key_fields)
     if program:
-      params['logic'] = program_logic.logic.timeline_logic
+      workflow = program.workflow
+      params['edit_form'] = params["edit_form_%s" % workflow]
+      params['logic'] = program_logic.logic.TIMELINE_LOGIC[workflow]
 
     return super(View, self).edit(request, access_type, page_name=page_name,
                                   params=params, seed=seed, **kwargs)