app/soc/views/models/host.py
changeset 944 5ea2bd9e3fa6
parent 920 39badbfb80be
child 959 b6e8750c9407
--- a/app/soc/views/models/host.py	Sat Jan 24 10:18:30 2009 +0000
+++ b/app/soc/views/models/host.py	Sat Jan 24 10:19:17 2009 +0000
@@ -19,17 +19,24 @@
 
 __authors__ = [
     '"Sverre Rabbelier" <sverre@rabbelier.nl>',
+    '"Lennard de Rijk" <ljvderijk@gmail.com>',
   ]
 
 
+from django import forms
+
+from soc.logic import cleaning
 from soc.logic import accounts
 from soc.logic import dicts
 from soc.logic.models import host as host_logic
 from soc.logic.models import user as user_logic
+from soc.logic.models import sponsor as sponsor_logic
 from soc.views import helper
+from soc.views.helper import access
+from soc.views.helper import dynaform
+from soc.views.helper import widgets
 from soc.views.models import role
 from soc.views.models import sponsor as sponsor_view
-from soc.views.helper import access
 
 import soc.models.host
 import soc.logic.models.host
@@ -40,47 +47,6 @@
 # and remove this tolist assignment
 tolist = list
 
-
-class CreateForm(helper.forms.BaseForm):
-  """Django form displayed when creating a Host.
-  """
-
-  class Meta:
-    """Inner Meta class that defines some behavior for the form.
-    """
-
-    #: db.Model subclass for which the form will gather information
-    model = soc.models.host.Host
-
-    #: list of model fields which will *not* be gathered by the form
-    exclude = ['scope', 'user', 'state']
-
-  def clean_empty(self, field):
-    data = self.cleaned_data.get(field)
-    if not data or data == u'':
-      return None
-
-    return data
-
-  def clean_home_page(self):
-    return self.clean_empty('home_page')
-
-  def clean_blog(self):
-    return self.clean_empty('blog')
-
-  def clean_photo_url(self):
-    return self.clean_empty('photo_url')
-
-
-class EditForm(CreateForm):
-  """Django form displayed when editing a Host.
-  """
-
-  pass
-
-# TODO(ljvderijk) rewrite the Host View module to comply with the new request system
-# so that non-developers can create Hosts
-
 class View(role.View):
   """View methods for the Host model.
   """
@@ -94,31 +60,52 @@
     """
 
     rights = {}
-    rights['create'] = [access.checkIsDeveloper]
-    # TODO(ljvderijk) write the edit check
-    #rights['edit'] = [access.checkIsMyHost]
+    rights['create'] = [access.checkIsHost]
+    rights['edit'] = [access.checkIsMyActiveRole(soc.logic.models.host)]
+    rights['invite'] = [access.checkIsHost]
     rights['list'] = [access.checkIsHost]
+    rights['accept_invite'] = [access.checkCanCreateFromRequest('host')]
+
 
     new_params = {}
     new_params['rights'] = rights
     new_params['logic'] = soc.logic.models.host.logic
+    new_params['group_logic'] = sponsor_logic.logic
 
     new_params['scope_view'] = sponsor_view
 
-    new_params['logic'] = soc.logic.models.host.logic
     new_params['group_view'] = soc.views.models.sponsor.view
     new_params['invite_filter'] = {'group_ln': 'link_id'}
 
     new_params['name'] = "Program Administrator"
     new_params['module_name'] = "host"
 
-    new_params['edit_form'] = EditForm
-    new_params['create_form'] = CreateForm
+    new_params['extra_dynaexclude'] = ['user', 'state']
+
+    new_params['create_extra_dynafields'] = {
+       'scope_path': forms.CharField(widget=forms.HiddenInput,
+                                  required=True),
+       'clean_link_id' : cleaning.clean_existing_user('link_id'),
+       'clean_home_page' : cleaning.clean_url('home_page'),
+       'clean_blog' : cleaning.clean_url('blog'),
+       'clean_photo_url' : cleaning.clean_url('photo_url')}
 
     params = dicts.merge(params, new_params)
 
     super(View, self).__init__(params=params)
 
+    # create and store the special form for invited users
+    updated_fields = {
+        'link_id': forms.CharField(widget=widgets.ReadOnlyInput(),
+            required=False)}
+
+    invited_create_form = dynaform.extendDynaForm(
+        dynaform = self._params['create_form'],
+        dynafields = updated_fields)
+
+    params['invited_create_form'] = invited_create_form
+
+
   def list(self, request, access_type, page_name=None, 
            params=None, filter=None):
     """See base.View.list.
@@ -144,18 +131,29 @@
     """See base.View._editPost().
     """
 
-    user = user_logic.logic.getFromKeyName(fields['link_id'])
-    fields['user'] = user
+    fields['user'] = fields['link_id']
+    fields['link_id'] = fields['link_id'].link_id
 
     super(View, self)._editPost(request, entity, fields)
 
+  def _acceptInvitePost(self, fields, request, context, params, **kwargs):
+    """Fills in the fields that were missing in the invited_created_form
+    
+    For params see base.View._acceptInvitePost()
+    """
+    # fill in the appropriate fields that were missing in the form
+    fields['user'] = fields['link_id']
+    fields['link_id'] = fields['link_id'].link_id
+
+
 view = View()
 
+acceptInvite = view.acceptInvite
 create = view.create
 delete = view.delete
 edit = view.edit
+invite = view.invite
 list = view.list
 public = view.public
 export = view.export
-invite = view.invite