# HG changeset patch # User Lennard de Rijk # Date 1256521702 25200 # Node ID 6ca30967d1bb6ad58dbbacced66c694f6ec3d494 # Parent 1dc307cb97d0ffb95fea055ee895b8c89dc083cc Made changes to the Role View to facilitate the use of the ID-based Requests. diff -r 1dc307cb97d0 -r 6ca30967d1bb app/soc/views/models/role.py --- a/app/soc/views/models/role.py Sun Oct 25 18:46:59 2009 -0700 +++ b/app/soc/views/models/role.py Sun Oct 25 18:48:22 2009 -0700 @@ -29,9 +29,8 @@ from soc.logic import cleaning from soc.logic import dicts -from soc.logic.models import request as request_logic from soc.logic.models import user as user_logic -from soc.logic.helper import request as request_helper +from soc.logic.models.request import logic as request_logic from soc.views.helper import decorators from soc.views.helper import redirects from soc.views.helper import responses @@ -65,10 +64,10 @@ """ DEF_INVITE_INSTRUCTION_MSG_FMT = ugettext( - 'Please use this form to invite someone to become a %(name)s.') + 'Please use this form to invite someone to become a %s for %s.') DEF_REQUEST_INSTRUCTION_MSG_FMT = ugettext( - 'Please use this form to request to become a %(name)s') + 'Please use this form to request to become a %s for %s.') DEF_INVITE_ERROR_MSG_FMT = ugettext( 'This user can not receive an invite to become a %(name)s.
' @@ -82,7 +81,8 @@ def __init__(self, params=None): - """ + """Defines the fields and methods required for the base View class + to provide the user with list, public, create, edit and delete views. Args: params: This dictionary should be filled with the parameters @@ -100,10 +100,10 @@ patterns += [(r'^%(url_name)s/(?Pinvite)/%(scope)s$', '%(module_package)s.%(module_name)s.invite', 'Create invite for %(name)s'), - (r'^%(url_name)s/(?Paccept_invite)/%(scope)s/%(lnp)s$', + (r'^%(url_name)s/(?Paccept_invite)/(?P[0-9]*)$', '%(module_package)s.%(module_name)s.accept_invite', 'Accept invite for %(name)s'), - (r'^%(url_name)s/(?Pprocess_request)/%(scope)s/%(lnp)s$', + (r'^%(url_name)s/(?Pprocess_request)/(?P[0-9]*)$', '%(module_package)s.%(module_name)s.process_request', 'Process request'), (r'^%(url_name)s/(?Prequest)/%(scope)s$', @@ -114,7 +114,7 @@ patterns += [(r'^%(url_name)s/(?Pinvite)/%(scope)s$', '%(module_package)s.%(module_name)s.invite', 'Create invite for %(name)s'), - (r'^%(url_name)s/(?Paccept_invite)/%(scope)s/%(lnp)s$', + (r'^%(url_name)s/(?Paccept_invite)/(?P[0-9]*)$', '%(module_package)s.%(module_name)s.accept_invite', 'Accept invite for %(name)s'), (r'^%(url_name)s/(?Pprocess_request)/%(scope)s/%(lnp)s$', @@ -190,11 +190,14 @@ context = responses.getUniversalContext(request) responses.useJavaScript(context, params['js_uses_all']) context['page_name'] = page_name + + group_entity = params['group_logic'].getFromKeyName(kwargs['scope_path']) + context['instruction_message'] = (self.DEF_INVITE_INSTRUCTION_MSG_FMT % - params) + (params['name'], group_entity.name)) if request.method == 'POST': - return self.invitePost(request, context, params, **kwargs) + return self.invitePost(request, context, params, group_entity, **kwargs) else: # request.method == 'GET' return self.inviteGet(request, context, params, **kwargs) @@ -210,18 +213,15 @@ kwargs: the Key Fields for the specified entity """ - # set the role to the right name - fields = {'role': params['logic'].role_name} - - # get the request view parameters and initialize the create form + # get the request view parameters and initialize the invite form request_params = request_view.view.getParams() - form = request_params['invite_form'](initial=fields) + form = request_params['invite_form']() # construct the appropriate response return super(View, self)._constructResponse(request, entity=None, context=context, form=form, params=request_params) - def invitePost(self, request, context, params, **kwargs): + def invitePost(self, request, context, params, group_entity, **kwargs): """Handles the POST request concerning the view that creates an invite for attaining a certain Role. @@ -229,6 +229,7 @@ request: the standard Django HTTP request object page_name: the page name displayed in templates as page and header title params: a dict with params for this View + group_entity: Group entity which this invite is from kwargs: the Key Fields for the specified entity """ @@ -242,58 +243,33 @@ form=form, params=request_params) # collect the cleaned data from the valid form - key_name, form_fields = soc.views.helper.forms.collectCleanedFields(form) - - # get the group entity for which this request is via the scope_path - group = self._logic.getGroupEntityFromScopePath(params['group_logic'], - kwargs['scope_path']) - - # get the request scope path - request_scope_path = self._getRequestScopePathFromGroup(group) + _, form_fields = soc.views.helper.forms.collectCleanedFields(form) # create the fields for the new request entity - request_fields = {'link_id': form_fields['link_id'].link_id, - 'scope': group, - 'scope_path': request_scope_path, + request_fields = { + 'user': form_fields['user_id'], + 'group': group_entity, 'role': params['logic'].role_name, - 'role_verbose': params['name'], 'status': 'group_accepted'} - if not self._isValidNewRequest(request_fields, params): + if not request_logic.isValidNewRequest(request_fields, params['logic']): # not a valid invite context['error_message'] = self.DEF_INVITE_ERROR_MSG_FMT % ( params) - return self.inviteGet(request, context, params, **kwargs) - - # extract the key_name for the new request entity - key_name = request_logic.logic.getKeyNameFromFields(request_fields) + return super(View, self)._constructResponse(request, entity=None, + context=context, form=form, params=request_params) # create the request entity - request_logic.logic.updateOrCreateFromKeyName(request_fields, key_name) + request_logic.updateOrCreateFromFields(request_fields) group_view = params.get('group_view') + if not group_view: return http.HttpResponseRedirect('/') else: # redirect to the requests list return http.HttpResponseRedirect( - redirects.getListRequestsRedirect(group, group_view.getParams())) - - def _getRequestScopePathFromGroup(self, group_entity): - """Returns the scope_path that should be put in a request for a given group. - - Args: - group_entity: The group entity for which the request scope_path should - be returned. - """ - - if group_entity.scope_path: - request_scope_path = '%s/%s' % ( - group_entity.scope_path, group_entity.link_id) - else: - request_scope_path = group_entity.link_id - - return request_scope_path + redirects.getListRequestsRedirect(group_entity, group_view.getParams())) @decorators.merge_params @decorators.check_access @@ -306,21 +282,26 @@ access_type : the name of the access type which should be checked page_name: the page name displayed in templates as page and header title params: a dict with params for this View - kwargs: the Key Fields for the specified entity + kwargs: contains the ID for the Request entity """ + request_entity = request_logic.getFromIDOr404(int(kwargs['id'])) + # get the context for this webpage context = responses.getUniversalContext(request) responses.useJavaScript(context, params['js_uses_all']) context['page_name'] = page_name if request.method == 'POST': - return self.acceptInvitePost(request, context, params, **kwargs) + return self.acceptInvitePost(request, context, params, request_entity, + **kwargs) else: # request.method == 'GET' - return self.acceptInviteGet(request, context, params, **kwargs) + return self.acceptInviteGet(request, context, params, request_entity, + **kwargs) - def acceptInviteGet(self, request, context, params, **kwargs): + def acceptInviteGet(self, request, context, params, request_entity, + **kwargs): """Handles the GET request concerning the creation of a Role via an invite. @@ -328,20 +309,21 @@ request: the standard Django HTTP request object context: dictionary containing the context for this view params: a dict with params for this View - kwargs: the Key Fields for the specified entity + request_entity: Request that is being accepted + kwargs: contains the ID for the Request entity """ # create the form using the scope_path and link_id from kwargs # as initial value - fields = {'link_id': kwargs['link_id'], - 'scope_path': kwargs['scope_path']} + fields = {'link_id': request_entity.user.link_id, + 'scope_path': request_entity.group.key().id_or_name()} form = params['invited_create_form'](initial=fields) # construct the appropriate response return super(View, self)._constructResponse(request, entity=None, context=context, form=form, params=params) - def acceptInvitePost(self, request, context, params, **kwargs): + def acceptInvitePost(self, request, context, params, request_entity, **kwargs): """Handles the POST request concerning the creation of a Role via an invite. @@ -349,7 +331,8 @@ request: the standard Django HTTP request object context: dictionary containing the context for this view params: a dict with params for this View - kwargs: the Key Fields for the specified entity + request_entity: Request that is being accepted + kwargs: contains the ID for the Request entity """ # populate the form using the POST data @@ -363,17 +346,18 @@ # collect the cleaned data from the valid form key_name, fields = soc.views.helper.forms.collectCleanedFields(form) - # call the post process method - self._acceptInvitePost(fields, request, context, params, **kwargs) - - group_logic = params['group_logic'] - group_entity = group_logic.getFromKeyName(fields['scope_path']) - fields['scope'] = group_entity - + # set the user and link_id fields to the right property + fields['user'] = request_entity.user + fields['link_id'] = request_entity.user.link_id + fields['scope'] = request_entity.group + fields['scope_path'] = request_entity.group.key().id_or_name() # make sure that this role becomes active once more in case this user # has been reinvited fields ['status'] = 'active' + # call the post process method + self._acceptInvitePost(fields, request, context, params, **kwargs) + # get the key_name for the new entity key_name = self._logic.getKeyNameFromFields(fields) @@ -381,7 +365,8 @@ entity = self._logic.updateOrCreateFromKeyName(fields, key_name) # mark the request as completed - request_helper.completeRequestForRole(entity, params['logic'].role_name) + request_fields = {'status': 'completed'} + request_logic.updateEntityProperties(request_entity, request_fields) # redirect to the roles overview page return http.HttpResponseRedirect('/user/roles') @@ -476,11 +461,14 @@ context = responses.getUniversalContext(request) responses.useJavaScript(context, params['js_uses_all']) context['page_name'] = page_name + + group_entity = params['group_logic'].getFromKeyName(kwargs['scope_path']) + context['instruction_message'] = (self.DEF_REQUEST_INSTRUCTION_MSG_FMT % - params) + (params['name'], group_entity.name)) if request.method == 'POST': - return self.requestPost(request, context, params, **kwargs) + return self.requestPost(request, context, params, group_entity, **kwargs) else: # request.method == 'GET' return self.requestGet(request, context, params, **kwargs) @@ -496,22 +484,15 @@ kwargs: the Key Fields for the specified entity """ - # set right fields for the request form - user_entity = user_logic.logic.getForCurrentAccount() - # pylint: disable-msg=E1103 - fields = {'link_id' : user_entity.link_id, - 'role' : params['logic'].role_name, - 'group_id' : kwargs['scope_path']} - # get the request view parameters and initialize the create form request_params = request_view.view.getParams() - form = request_params['request_form'](initial=fields) + form = request_params['request_form']() # construct the appropriate response return super(View, self)._constructResponse(request, entity=None, context=context, form=form, params=request_params) - def requestPost(self, request, context, params, **kwargs): + def requestPost(self, request, context, params, group_entity, **kwargs): """Handles the POST request concerning the creation of a request to attain a role. @@ -519,46 +500,40 @@ request: the standard Django HTTP request object context: dictionary containing the context for this view params: a dict with params for this View + group_entity: the Group entity this request is for kwargs: the Key Fields for the specified entity """ # get the request view parameters and populate the form using POST data request_params = request_view.view.getParams() - form = request_params['invite_form'](request.POST) + form = request_params['request_form'](request.POST) if not form.is_valid(): # return the invalid form response return self._constructResponse(request, entity=None, context=context, form=form, params=request_params) - # get the group entity for which this request is via the scope_path - group = self._logic.getGroupEntityFromScopePath(params['group_logic'], - kwargs['scope_path']) + _, fields = soc.views.helper.forms.collectCleanedFields(form) - # get the request scope path - request_scope_path = self._getRequestScopePathFromGroup(group) + # set the fields for the new request + user_entity = user_logic.logic.getForCurrentAccount() - # defensively set the fields we need for this request and set status to new - user_entity = user_logic.logic.getForCurrentAccount() - # pylint: disable-msg=E1103 - request_fields = {'link_id' : user_entity.link_id, - 'scope' : group, - 'scope_path' : request_scope_path, + request_fields = { + 'user': user_entity, + 'group' : group_entity, + 'message': fields['message'], 'role' : params['logic'].role_name, - 'role_verbose' : params['name'], 'status' : 'new'} - if not self._isValidNewRequest(request_fields, params): + if not request_logic.isValidNewRequest(request_fields, params['logic']): # not a valid request context['error_message'] = self.DEF_REQUEST_ERROR_MSG_FMT % ( params) - return self.requestGet(request, context, params, **kwargs) - - # extract the key_name for the new request entity - key_name = request_logic.logic.getKeyNameFromFields(request_fields) + return super(View, self)._constructResponse(request, entity=None, + context=context, form=form, params=request_params) # create the request entity - request_logic.logic.updateOrCreateFromKeyName(request_fields, key_name) + request_logic.updateOrCreateFromFields(request_fields) # redirect to requests overview return http.HttpResponseRedirect('/user/requests') @@ -577,22 +552,15 @@ kwargs: the Key Fields for the specified entity """ - # get the request entity using the information from kwargs - fields = {'link_id': kwargs['link_id'], - 'scope_path': kwargs['scope_path'], - 'role': params['logic'].role_name} - request_entity = request_logic.logic.getForFields(fields, unique=True) + request_entity = request_logic.getFromIDOr404(int(kwargs['id'])) # get the context for this webpage context = responses.getUniversalContext(request) responses.useJavaScript(context, params['js_uses_all']) - # pylint: disable-msg=E1103 - user_entity = user_logic.logic.getFromKeyNameOr404(request_entity.link_id) - context['page_name'] = '%s from %s to become a %s' %( - page_name, user_entity.name, request_entity.role_verbose) + page_name, request_entity.user.name, params['name']) get_dict = request.GET @@ -603,7 +571,7 @@ # only update when the status is changing if request_status != request_entity.status: - request_logic.logic.updateEntityProperties(request_entity, { + request_logic.updateEntityProperties(request_entity, { 'status': get_dict['status']}) group_view = params.get('group_view') @@ -612,47 +580,16 @@ else: # redirect to the requests list return http.HttpResponseRedirect( - redirects.getListRequestsRedirect(request_entity.scope, + redirects.getListRequestsRedirect(request_entity.group, group_view.getParams())) # put the entity in the context context['entity'] = request_entity - context['user_in_request'] = user_entity context['request_status'] = request_entity.status - context['role_name'] = params['logic'].role_name + context['role_verbose'] = params['name'] + context['url_name'] = params['url_name'] #display the request processing page using the appropriate template template = request_view.view.getParams()['request_processing_template'] return responses.respond(request, template, context=context) - - def _isValidNewRequest(self, request_fields, params): - """Checks if this is a valid Request object to make. - - Args: - request_fields: dict containing the fields for the new request entity. - params: parameters for the current view - """ - fields = request_fields.copy() - fields['status'] = ['new', 'group_accepted', 'ignored'] - - request_entity = request_logic.logic.getForFields(fields, unique=True) - - if request_entity: - # already outstanding request - return False - - # check if the role already exists - fields = {'scope': request_fields['scope'], - 'link_id': request_fields['link_id'], - 'status': ['active','inactive'], - } - - role_entity = params['logic'].getForFields(fields, unique=True) - - if role_entity: - # already has this role - return False - - # no oustanding request or a valid role - return True