app/soc/views/models/group_app.py
changeset 1138 18ef39338211
parent 858 e79e7a22326f
child 1139 7a6f94ffcc87
--- a/app/soc/views/models/group_app.py	Sun Feb 01 09:11:39 2009 +0000
+++ b/app/soc/views/models/group_app.py	Sun Feb 01 09:55:02 2009 +0000
@@ -19,13 +19,23 @@
 
 __authors__ = [
     '"Sverre Rabbelier" <sverre@rabbelier.nl>',
+    '"Lennard de Rijk" <ljvderijk@gmail.com>',
   ]
 
 
 from django import forms
+from django.utils.translation import ugettext
 
+from soc.logic import accounts
+from soc.logic import cleaning
 from soc.logic import dicts
+from soc.logic.helper import notifications
 from soc.logic.models import group_app as group_app_logic
+from soc.logic.models import user as user_logic
+from soc.views.helper import decorators
+from soc.views.helper import lists as list_helper
+from soc.views.helper import redirects
+from soc.views.helper import responses
 from soc.views.models import base
 
 import soc.logic.models.group_app
@@ -49,7 +59,278 @@
     new_params['name'] = "Group Application"
     new_params['name_short'] = "Group App"
 
-    params = dicts.merge(params, new_params)
+    # use the twoline templates for these questionnaires
+    new_params['create_template'] = 'soc/models/twoline_edit.html'
+    new_params['edit_template'] = 'soc/models/twoline_edit.html'
+
+    patterns = [(r'^%(url_name)s/(?P<access_type>review)$',
+        'soc.views.models.%(module_name)s.review_overview',
+        'Review %(name_plural)s'),
+        (r'^%(url_name)s/(?P<access_type>review)/%(lnp)s$',
+          'soc.views.models.%(module_name)s.review',
+          'Review %(name_short)s')]
+
+    new_params['extra_django_patterns'] = patterns
+
+    new_params['sidebar_additional'] = [
+        ('/%(url_name)s/review' % params,
+         'Review %(name_plural)s' % params, 'review')]
+
+    new_params['extra_dynaexclude'] = ['applicant', 'backup_admin', 'status',
+        'created_on', 'last_modified_on']
+
+    new_params['create_extra_dynafields'] = {
+        'backup_admin_link_id': forms.CharField(
+              label=params['logic'].getModel().backup_admin.verbose_name
+              ),
+        'clean_backup_admin_link_id': 
+            cleaning.clean_users_not_same('backup_admin_link_id'),
+        }
+
+    new_params['edit_extra_dynafields'] = {
+        'clean_link_id' : cleaning.clean_link_id('link_id'),
+        }
+
+    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().
+    """
+
+    form.fields['backup_admin_link_id'].initial = entity.backup_admin.link_id
+
+    super(View, self)._editGet(request, entity, form)
+
+  def _editPost(self, request, entity, fields):
+    """See base.View._editPost().
+    """
+
+    fields['backup_admin'] = fields['backup_admin_link_id']
+
+    if not entity:
+      fields['applicant'] = user_logic.logic.getForCurrentAccount()
+
+    # the application has either been created or edited so
+    # the status needs to be set accordingly
+    fields['status'] = 'needs review'
+
+    super(View, self)._editPost(request, entity, fields)
+
+
+  def _public(self, request, entity, context):
+    """See base._public().
+    """
+
+    context['entity_type_url'] = self._params['url_name']
+
+    super(View, self)._public(request, entity, context)
+
+
+  @decorators.merge_params
+  @decorators.check_access
+  def list(self, request, access_type,
+           page_name=None, params=None, filter=None):
+    """Lists all notifications that the current logged in user has stored.
+
+    for parameters see base.list()
+    """
+
+    # get the current user
+    user_entity = user_logic.logic.getForCurrentAccount()
+
+    is_developer = accounts.isDeveloper(user=user_entity)
+
+    filter = {
+        'status': 'needs review',
+        }
+
+    if not is_developer:
+      # only select the applications for this user so construct a filter
+      filter['applicant'] = user_entity
+
+    # get all the pending applications
+
+    pa_params = params.copy() # pending applications
+
+    if is_developer:
+      pa_params['list_description'] = ugettext(
+          "An overview of all pending %(name_plural)s.") % params
+    else:
+      pa_params['list_description'] = ugettext(
+          "An overview of your pending %(name_plural)s.") % params
+
+    pa_list = list_helper.getListContent(
+        request, pa_params, filter, 0)
+
+    # get all the reviewed applications now
+
+    # re-use the old filter, but set to only reviewed and accepted
+    filter['status'] = 'accepted'
+
+    aa_params = params.copy() # accepted applications
+
+    if is_developer:
+      aa_params['list_description'] = ugettext(
+          "An overview of all accepted %(name_plural)s.") % params
+    else:
+      aa_params['list_description'] = ugettext(
+          "An overview of your accepted %(name_plural)s.") % params
+
+    aa_params['url_name'] = params['group_url_name']
+    aa_params['list_action'] = (redirects.getApplicantRedirect, aa_params)
+
+    aa_list = list_helper.getListContent(
+        request, aa_params, filter, 1)
+
+    # get all the reviewed applications that were denied
+
+    # re use the old filter, but this time only for denied apps
+    filter['status'] = 'rejected'
+
+    da_params = params.copy() # denied applications
+
+    if is_developer:
+      da_params['list_description'] = ugettext(
+          "An overview of all denied %(name_plural)s.") % params
+    else:
+      da_params['list_description'] = ugettext(
+          "An overview of your denied %(name_plural)s.") % params
+
+    da_list = list_helper.getListContent(
+        request, da_params, filter, 2)
+
+    contents = [pa_list, aa_list, da_list]
+
+    if is_developer:
+      # re use the old filter, but this time only for ignored apps
+      filter['status'] = 'ignored'
+
+      ia_params = params.copy() # ignored applications
+
+      ia_params['list_description'] = ugettext(
+          "An overview of all ignored %(name_plural)s.") % params
+
+      ia_list = list_helper.getListContent(
+          request, ia_params, filter, 3)
+
+      contents += [ia_list]
+
+    # call the _list method from base to display the list
+    return self._list(request, params, contents, page_name)
+
+
+  @decorators.merge_params
+  @decorators.check_access
+  def review(self, request, access_type,
+             page_name=None, params=None, **kwargs):
+    """Handles the view containing the review of an application.
+
+    accepted (true or false) in the GET data will mark
+    the application accordingly.
+
+
+    For params see base.View.public().
+    """
+
+    # create default template context for use with any templates
+    context = responses.getUniversalContext(request)
+    context['page_name'] = page_name
+    entity = None
+
+    try:
+      key_fields = self._logic.getKeyFieldsFromFields(kwargs)
+      entity = self._logic.getFromKeyFieldsOr404(key_fields)
+    except out_of_band.Error, error:
+      return helper.responses.errorResponse(
+          error, request, template=params['error_public'], context=context)
+
+    get_dict = request.GET
+
+    # check to see if we can make a decision for this application
+    if 'status' in get_dict.keys():
+      status_value = get_dict['status']
+
+      if status_value in ['accepted', 'rejected', 'ignored']:
+        # this application has been properly reviewed update the status
+        fields = {'status' : status_value}
+
+        self._logic.updateEntityProperties(entity, fields)
+
+        if status_value == 'accepted':
+          # the application has been accepted send out a notification
+          notifications.sendNewGroupNotification(entity, params)
+
+        return self.reviewOverview(request, access_type,
+            page_name=page_name, params=params, **kwargs)
+
+    # the application has not been reviewed so show the information
+    # using the appropriate review template
+    params['public_template'] = params['review_template']
+
+    return super(View, self).public(request, access_type,
+        page_name=page_name, params=params, **kwargs)
+
+
+  @decorators.merge_params
+  @decorators.check_access
+  def reviewOverview(self, request, access_type,
+             page_name=None, params=None, **kwargs):
+    """Displays multiple lists of applications that are in a different
+    status of the application process.
+    """
+
+    params = dicts.merge(params, self._params)
+
+    # only select the requests that haven't been reviewed yet
+    filter = {'status' : 'needs review'}
+
+    ur_params = params.copy()
+    ur_params['list_description'] = ugettext('A list of all unhandled '
+        '%(name_plural)s.') % params
+    ur_params ['list_action'] = (redirects.getReviewRedirect, params)
+
+    ur_list = list_helper.getListContent(
+        request, ur_params, filter, 0)
+
+    # only select the requests that haven't been turned into a group yet
+    filter['status'] = 'accepted'
+
+    uh_params = params.copy()
+    uh_params['list_description'] = ugettext('A list of all %(name_plural)s '
+        'that have been accepted but not completed yet') % params
+    uh_params ['list_action'] = (redirects.getReviewRedirect, params)
+
+    uh_list = list_helper.getListContent(
+        request, uh_params, filter, 1)
+
+    # only select the requests the have been rejected
+    filter ['status'] = 'rejected'
+
+    den_params = params.copy()
+    den_params['list_description'] = ugettext('A list of all %(name_plural)s '
+        'that have been rejected') % params
+    den_params ['list_action'] = (redirects.getReviewRedirect, params)
+
+    den_list = list_helper.getListContent(
+        request, den_params, filter, 2)
+
+    # only select the request that have been ignored
+    filter ['status'] = 'ignored'
+
+    ign_params = params.copy()
+    ign_params['list_description'] = ugettext('A list of all %(name_plural)s '
+        'that have been ignored') % params
+    ign_params ['list_action'] = (redirects.getReviewRedirect, params)
+
+    ign_list = list_helper.getListContent(
+        request, ign_params, filter, 3)
+
+    # fill contents with all the needed lists
+    contents = [ur_list, uh_list, den_list, ign_list]
+
+    # call the _list method from base to display the list
+    return self._list(request, params, contents, page_name)
+