app/soc/views/models/request.py
changeset 920 39badbfb80be
parent 890 b3bf833c4580
child 928 df051fc9d7a1
--- a/app/soc/views/models/request.py	Fri Jan 23 11:40:35 2009 +0000
+++ b/app/soc/views/models/request.py	Fri Jan 23 12:00:48 2009 +0000
@@ -27,8 +27,11 @@
 from google.appengine.api import users
 
 from django import forms
+from django import http
+from django.core import urlresolvers
 from django.utils.translation import ugettext_lazy
 
+from soc.logic import cleaning
 from soc.logic import dicts
 from soc.logic.models import sponsor as sponsor_logic
 from soc.logic.models import user as user_logic
@@ -37,6 +40,8 @@
 from soc.views.helper import access
 from soc.views.helper import decorators
 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.models.request
@@ -45,53 +50,10 @@
 import soc.views.helper
 import soc.views.helper.lists
 import soc.views.helper.responses
-import soc.views.helper.widgets
-
-
-class CreateForm(helper.forms.BaseForm):
-  """Django form displayed when Developer creates a Request.
-  """
-
-  class Meta:
-    """Inner Meta class that defines some behavior for the form.
-    """
-    model = soc.models.request.Request
-
-    #: list of model fields which will *not* be gathered by the form
-    exclude = ['scope', 'scope_path', 'link_id', 'role', 'declined']
-
-  role = forms.CharField(widget=helper.widgets.ReadOnlyInput())
-
-  user = forms.CharField(
-      label=soc.models.request.Request.link_id.verbose_name,
-      help_text=soc.models.request.Request.link_id.help_text,
-      widget=helper.widgets.ReadOnlyInput())
-
-  group = forms.CharField(
-      label=soc.models.request.Request.scope.verbose_name,
-      help_text=soc.models.request.Request.scope.help_text,
-      widget=helper.widgets.ReadOnlyInput())
-
-  def clean_user(self):
-    self.cleaned_data['requester'] =  user_logic.logic.getForFields(
-        {'link_id': self.cleaned_data['user']}, unique=True)
-    return self.cleaned_data['user']
-
-  def clean_group(self):
-    self.cleaned_data['to'] = sponsor_logic.logic.getFromFields(
-        link_id=self.cleaned_data['group'])
-    return self.cleaned_data['group']
-
-
-class EditForm(CreateForm):
-  """Django form displayed when Developer edits a Request.
-  """
-
-  pass
 
 
 class View(base.View):
-  """View methods for the Docs model.
+  """View methods for the Request model.
   """
 
   def __init__(self, params=None):
@@ -104,7 +66,11 @@
 
     rights = {}
     rights['listSelf'] = [access.checkAgreesToSiteToS]
-    rights['create'] = [access.checkCanInvite]
+    rights['create'] = [access.allow] # TODO(ljvderijk) Set to deny once host has been converted
+    rights['edit'] = [access.checkIsDeveloper]
+    rights['process_invite'] = [access.checkIsMyUncompletedRequest]
+    rights['list'] = [access.checkIsDeveloper]
+    rights['delete'] = [access.checkIsDeveloper]
 
     new_params = {}
     new_params['rights'] = rights
@@ -112,17 +78,87 @@
 
     new_params['name'] = "Request"
 
-    new_params['edit_form'] = EditForm
-    new_params['create_form'] = CreateForm
-
     new_params['sidebar_defaults'] = [('/%s/list', 'List %(name_plural)s', 'list')]
 
     new_params['save_message'] = [ugettext_lazy('Request saved.')]
+    
+    new_params['extra_dynaexclude'] = ['group_accepted', 'user_accepted', 
+        'role_verbose', 'completed']
+    
+    # TODO(ljvderijk) add clean field that checks to see if the user already has
+    # the role that's been entered in the create form fields
+    new_params['create_extra_dynafields'] = {
+        'role' : forms.CharField(widget=widgets.ReadOnlyInput(),
+                                   required=True),
+        'clean_link_id': cleaning.clean_existing_user('link_id')
+        }
+
+    patterns = [(r'^%(url_name)s/(?P<access_type>invite)/%(lnp)s$',
+        'soc.views.models.%(module_name)s.invite',
+        'Create invite for %(name_plural)s'),
+        (r'^%(url_name)s/(?P<access_type>process_invite)/%(key_fields)s$',
+          'soc.views.models.%(module_name)s.processInvite',
+          'Process Invite to for a Role')]
+
+    new_params['extra_django_patterns'] = patterns
+    
+    new_params['invite_processing_template'] = 'soc/request/process_invite.html'
 
     params = dicts.merge(params, new_params)
 
     super(View, self).__init__(params=params)
 
+
+  @decorators.merge_params
+  @decorators.check_access
+  def processInvite(self, request, access_type,
+                   page_name=None, params=None, **kwargs):
+    """Creates the page upon which an invite can be processed.
+
+    Args:
+      request: the standard Django HTTP request object
+      access_type : the name of the access type which should be checked
+      context: dictionary containing the context for this view
+      params: a dict with params for this View
+      kwargs: the Key Fields for the specified entity
+    """
+
+    # get the context for this webpage
+    context = responses.getUniversalContext(request)
+    context['page_name'] = page_name
+    
+    request_logic = params['logic']
+
+    # get the request entity using the information from kwargs
+    fields = {'link_id' : kwargs['link_id'],
+        'scope_path' : kwargs['scope_path'],
+        'role' : kwargs['role'],
+        'group_accepted' : True,
+        'user_accepted' : False,
+        'completed' : False}
+    request_entity = request_logic.getForFields(fields, unique=True)
+    
+    get_dict = request.GET
+    
+    if 'status' in get_dict.keys():
+      if get_dict['status'] == 'rejected':
+        # this invite has been rejected mark accepted as False and mark completed as True
+        request_logic.updateModelProperties(request_entity, {
+            'user_accepted' : False, 'completed' : True})
+        
+        # redirect to user role overview
+        return http.HttpResponseRedirect('/user/roles')
+
+    # put the entity in the context
+    context['entity'] = request_entity
+    context['module_name'] = params['module_name']
+
+    #display the invite processing page using the appropriate template
+    template = params['invite_processing_template']
+
+    return responses.respond(request, template, context=context)
+
+
   @decorators.merge_params
   @decorators.check_access
   def listSelf(self, request, access_type,
@@ -140,26 +176,29 @@
     properties = {'account': users.get_current_user()}
     user_entity = user_logic.logic.getForFields(properties, unique=True)
 
-    # construct the Unhandled Requests list
+    # construct the Unhandled Invites list
 
-    # only select the requests for this user that haven't been handled yet
+    # only select the Invites for this user that haven't been handled yet
     filter = {'link_id': user_entity.link_id,
-              'group_accepted' : True}
+              'group_accepted' : True,
+              'user_accepted' : False,
+              'completed' : False}
 
     uh_params = params.copy()
-    uh_params['list_action'] = (redirects.inviteAcceptedRedirect, None)
+    uh_params['list_action'] = (redirects.inviteProcessRedirect, None)
     uh_params['list_description'] = ugettext_lazy(
-        "An overview of your unhandled requests.")
+        "An overview of your unhandled invites.")
 
     uh_list = helper.lists.getListContent(
         request, uh_params, filter, 0)
 
     # construct the Open Requests list
 
-    # only select the requests for the user
+    # only select the requests from the user
     # that haven't been accepted by an admin yet
     filter = {'link_id' : user_entity.link_id,
-              'group_accepted' : False}
+              'group_accepted' : False,
+              'completed' : False}
 
     ar_params = params.copy()
     ar_params['list_description'] = ugettext_lazy(
@@ -174,32 +213,20 @@
     # call the _list method from base to display the list
     return self._list(request, params, contents, page_name)
 
-  def _editSeed(self, request, seed):
-    """See base.View._editGet().
-    """
-
-    # fill in the email field with the data from the entity
-    seed['user'] = seed['link_id']
-    seed['group'] = seed['scope_path']
-
-  def _editGet(self, request, entity, form):
-    """See base.View._editGet().
-    """
-
-    # fill in the email field with the data from the entity
-    form.fields['user'].initial = entity.link_id
-    form.fields['group'].initial = entity.scope_path
-
-    super(View, self)._editGet(request, entity, form)
 
   def _editPost(self, request, entity, fields):
     """See base.View._editPost().
     """
 
-    # fill in the account field with the user created from email
-    fields['link_id'] = fields['requester'].link_id
-    fields['scope_path'] = fields['to'].link_id
-    fields['scope'] = fields['to']
+    # TODO(ljvderijk) remove this once host has been rewritten
+    callback, args, kwargs = urlresolvers.resolve(request.path)
+
+    # fill in the fields via kwargs
+    fields['link_id'] = kwargs['link_id']
+    fields['scope_path'] = kwargs['scope_path']
+    fields['role'] = kwargs['role']
+    fields['role_verbose'] = 'Some Role'
+    fields['group_accepted'] = True
 
     super(View, self)._editPost(request, entity, fields)
 
@@ -211,6 +238,7 @@
 delete = view.delete
 list = view.list
 list_self = view.listSelf
+processInvite = view.processInvite
 public = view.public
 export = view.export