示例#1
0
  def getWithdrawData(self, request, ap_params, wp_params, program_kwargs):
    """Return data for withdraw.
    """

    program = program_logic.getFromKeyFieldsOr404(program_kwargs)

    fields = {
        'program': program,
        }

    idx = request.GET.get('idx', '')
    idx = int(idx) if idx.isdigit() else -1

    if idx == 0:
      fields['status'] = ['accepted', 'completed']
      params = ap_params
    elif idx == 1:
      fields['status'] = ['withdrawn']
      params = wp_params
    else:
      return responses.jsonErrorResponse(request, "idx not valid")

    contents = lists.getListData(request, params, fields, 'public')
    json = simplejson.dumps(contents)

    return responses.jsonResponse(request, json)
示例#2
0
    def showDuplicates(self,
                       request,
                       access_type,
                       page_name=None,
                       params=None,
                       **kwargs):
        """View in which a host can see which students have been assigned
       multiple slots.

    For params see base.view.Public().
    """

        from google.appengine.api import taskqueue

        from soc.modules.gsoc.logic.models.proposal_duplicates import logic \
            as duplicates_logic
        from soc.modules.gsoc.logic.models.proposal_duplicates_status import \
            logic as ds_logic

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

        context = helper.responses.getUniversalContext(request)
        helper.responses.useJavaScript(context, params['js_uses_all'])
        context['page_name'] = page_name

        fields = {'program': program_entity, 'is_duplicate': True}

        template = 'modules/gsoc/program/show_duplicates.html'

        context['duplicates'] = duplicates_logic.getForFields(fields)
        duplicates_status = ds_logic.getOrCreateForProgram(program_entity)
        context['duplicates_status'] = duplicates_status

        if request.POST:
            post_data = request.POST

            # pass along these params as POST to the new task
            task_params = {'program_key': program_entity.key().id_or_name()}
            task_url = '/tasks/gsoc/proposal_duplicates/start'

            # checks if the task newly added is the first task
            # and must be performed repeatedly every hour or
            # just be performed once right away
            if 'calculate' in post_data:
                task_params['repeat'] = 'yes'
            elif 'recalculate' in post_data:
                task_params['repeat'] = 'no'

            # adds a new task
            new_task = taskqueue.Task(params=task_params, url=task_url)
            new_task.add()

        return helper.responses.respond(request,
                                        template=template,
                                        context=context)
示例#3
0
  def assignSlots(self, request, access_type, page_name=None,
                  params=None, **kwargs):
    """View that allows to assign slots to orgs.
    """

    from soc.modules.gsoc.views.models.organization import view as org_view

    program_entity = program_logic.getFromKeyFieldsOr404(kwargs)
    description = self.DEF_SLOTS_ALLOCATION_MSG

    org_params = org_view.getParams().copy()
    org_params['list_description'] = description
    org_params['list_template'] = "modules/gsoc/program/list/allocation.html"
    org_params['public_field_props'] = {
        "link_id": {
            "hidden": True,
        }
    }
    org_params['public_row_action'] = {}
    org_params['public_row_extra'] = lambda entity: {}
    org_params['public_conf_extra'] = {
        "rowNum": -1,
        "rowList": [],
    }
    org_params['public_field_keys'] = [
        "name", "slots_desired", "nr_applications", "nr_mentors",
        "locked", "slots_ass", "slots", "link_id",
    ]
    org_params['public_field_names'] = [
        "Name", "Desired", "#Proposals", "#Mentors",
        "Locked?", "Slots Assigned", "Slots Visible to Org", "Link ID",
    ]

    fields = {
        'scope': program_entity,
        'status': ['new', 'active', 'inactive']
        }

    return_url =  "http://%(host)s%(index)s" % {
      'host' : system.getHostname(),
      'index': redirects.getSlotsRedirect(program_entity, params)
      }

    context = {
        'total_slots': program_entity.slots,
        'uses_json': True,
        'uses_slot_allocator': True,
        'return_url': return_url,
        }

    return self.list(request, 'allow', page_name=page_name, params=org_params,
                     filter=fields, context=context)
示例#4
0
  def showDuplicates(self, request, access_type, page_name=None,
                     params=None, **kwargs):
    """View in which a host can see which students have been assigned
       multiple slots.

    For params see base.view.Public().
    """

    from google.appengine.api import taskqueue

    from soc.modules.gsoc.logic.models.proposal_duplicates import logic \
        as duplicates_logic
    from soc.modules.gsoc.logic.models.proposal_duplicates_status import \
        logic as ds_logic

    program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

    context = helper.responses.getUniversalContext(request)
    helper.responses.useJavaScript(context, params['js_uses_all'])
    context['page_name'] = page_name

    fields = {'program': program_entity,
              'is_duplicate': True}

    template = 'modules/gsoc/program/show_duplicates.html'

    context['duplicates'] = duplicates_logic.getForFields(fields)
    duplicates_status = ds_logic.getOrCreateForProgram(program_entity)
    context['duplicates_status'] = duplicates_status

    if request.POST:
      post_data = request.POST

      # pass along these params as POST to the new task
      task_params = {'program_key': program_entity.key().id_or_name()}
      task_url = '/tasks/gsoc/proposal_duplicates/start'

      # checks if the task newly added is the first task
      # and must be performed repeatedly every hour or
      # just be performed once right away
      if 'calculate' in post_data:
        task_params['repeat'] = 'yes'
      elif 'recalculate' in post_data:
        task_params['repeat'] = 'no'

      # adds a new task
      new_task = taskqueue.Task(params=task_params, url=task_url)
      new_task.add()

    return helper.responses.respond(request, template=template,
                                    context=context)
示例#5
0
  def overview(self, request, access_type,
               page_name=None, params=None, **kwargs):
    """View that allows Program Admins to see/control all StudentProjects.

    For args see base.View().public()
    """

    program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

    if request.POST:
      return self.overviewPost(request, params, program_entity)
    else: #request.GET
      return self.overviewGet(request, page_name, params, program_entity,
                              **kwargs)
示例#6
0
    def populate(self, redirect, request, args, kwargs):
        """Populates the fields in the RequestData object.

    Args:
      request: Django HTTPRequest object.
      args & kwargs: The args and kwargs django sends along.
    """
        super(RequestData, self).populate(redirect, request, args, kwargs)

        if kwargs.get('sponsor') and kwargs.get('program'):
            program_keyfields = {
                'link_id': kwargs['program'],
                'scope_path': kwargs['sponsor']
            }
            self.program = program_logic.getFromKeyFieldsOr404(
                program_keyfields)
        else:
            self.program = self.site.active_program

        self.program_timeline = self.program.timeline

        org_app_fields = {'scope': self.program}
        self.org_app = org_app_logic.getOneForFields(org_app_fields)

        self.timeline = TimelineHelper(self.program_timeline, self.org_app)

        if kwargs.get('organization'):
            org_keyfields = {
                'link_id': kwargs.get('organization'),
                'scope_path': self.program.key().id_or_name(),
            }
            self.organization = org_logic.getFromKeyFieldsOr404(org_keyfields)

        if self.user:
            key_name = '%s/%s' % (self.program.key().name(), self.user.link_id)
            self.profile = profile.GSoCProfile.get_by_key_name(
                key_name, parent=self.user)

            self.is_host = self.program.scope.key() in self.user.host_for

        if self.profile:
            orgs = set(self.profile.mentor_for + self.profile.org_admin_for)
            org_map = dict((i.key(), i) for i in db.get(orgs))

            self.mentor_for = org_map.values()
            self.org_admin_for = [
                org_map[i] for i in self.profile.org_admin_for
            ]
            self.student_info = self.profile.student_info
示例#7
0
    def overview(self,
                 request,
                 access_type,
                 page_name=None,
                 params=None,
                 **kwargs):
        """View that allows Program Admins to see/control all StudentProjects.

    For args see base.View().public()
    """

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

        if request.POST:
            return self.overviewPost(request, params, program_entity)
        else:  #request.GET
            return self.overviewGet(request, page_name, params, program_entity,
                                    **kwargs)
示例#8
0
  def populate(self, redirect, request, args, kwargs):
    """Populates the fields in the RequestData object.

    Args:
      request: Django HTTPRequest object.
      args & kwargs: The args and kwargs django sends along.
    """
    super(RequestData, self).populate(redirect, request, args, kwargs)

    if kwargs.get('sponsor') and kwargs.get('program'):
      program_keyfields = {'link_id': kwargs['program'],
                           'scope_path': kwargs['sponsor']}
      self.program = program_logic.getFromKeyFieldsOr404(program_keyfields)
    else:
      self.program =  self.site.active_program

    self.program_timeline = self.program.timeline

    org_app_fields = {'scope': self.program}
    self.org_app = org_app_logic.getOneForFields(org_app_fields)

    self.timeline = TimelineHelper(self.program_timeline, self.org_app)

    if kwargs.get('organization'):
      org_keyfields = {
          'link_id': kwargs.get('organization'),
          'scope_path': self.program.key().id_or_name(),
          }
      self.organization = org_logic.getFromKeyFieldsOr404(org_keyfields)

    if self.user:
      key_name = '%s/%s' % (self.program.key().name(), self.user.link_id)
      self.profile = profile.GSoCProfile.get_by_key_name(
          key_name, parent=self.user)

      self.is_host = self.program.scope.key() in self.user.host_for

    if self.profile:
      orgs = set(self.profile.mentor_for + self.profile.org_admin_for)
      org_map = dict((i.key(), i) for i in db.get(orgs))

      self.mentor_for = org_map.values()
      self.org_admin_for = [org_map[i] for i in self.profile.org_admin_for]
      self.student_info = self.profile.student_info
示例#9
0
    def assignSlots(self,
                    request,
                    access_type,
                    page_name=None,
                    params=None,
                    **kwargs):
        """View that allows to assign slots to orgs.
    """

        from soc.modules.gsoc.views.models.organization import view as org_view

        org_params = org_view.getParams().copy()
        org_params['list_template'] = 'soc/program/allocation/allocation.html'
        org_params['list_heading'] = 'soc/program/allocation/heading.html'
        org_params['list_row'] = 'soc/program/allocation/row.html'
        org_params['list_pagination'] = 'soc/list/no_pagination.html'

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

        description = self.DEF_SLOTS_ALLOCATION_MSG

        content = self._getOrgsWithProfilesList(program_entity, org_view,
                                                description, False)
        contents = [content]

        return_url = "http://%(host)s%(index)s" % {
            'host': system.getHostname(),
            'index': redirects.getSlotsRedirect(program_entity, params)
        }

        context = {
            'total_slots': program_entity.slots,
            'uses_json': True,
            'uses_slot_allocator': True,
            'return_url': return_url,
        }

        return self._list(request, org_params, contents, page_name, context)
示例#10
0
    def showDuplicates(self,
                       request,
                       access_type,
                       page_name=None,
                       params=None,
                       **kwargs):
        """View in which a host can see which students have been assigned
       multiple slots.

    For params see base.view.Public().
    """

        from django.utils import simplejson

        from soc.modules.gsoc.logic.models.proposal_duplicates import logic as duplicates_logic

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

        if request.POST and request.POST.get('result'):
            # store result in the datastore
            fields = {
                'link_id': program_entity.link_id,
                'scope': program_entity,
                'scope_path': program_entity.key().id_or_name(),
                'json_representation': request.POST['result']
            }
            key_name = duplicates_logic.getKeyNameFromFields(fields)
            duplicates_logic.updateOrCreateFromKeyName(fields, key_name)

            response = simplejson.dumps({'status': 'done'})
            return http.HttpResponse(response)

        context = helper.responses.getUniversalContext(request)
        helper.responses.useJavaScript(context, params['js_uses_all'])
        context['uses_duplicates'] = True
        context['uses_json'] = True
        context['page_name'] = page_name

        # get all orgs for this program who are active and have slots assigned
        fields = {'scope': program_entity, 'slots >': 0, 'status': 'active'}

        query = org_logic.logic.getQueryForFields(fields)

        to_json = {
            'nr_of_orgs': query.count(),
            'program_key': program_entity.key().id_or_name()
        }
        json = simplejson.dumps(to_json)
        context['info'] = json
        context['offset_length'] = 10

        fields = {'link_id': program_entity.link_id, 'scope': program_entity}
        duplicates = duplicates_logic.getForFields(fields, unique=True)

        if duplicates:
            # we have stored information
            # pylint: disable-msg=E1103
            context['duplicate_cache_content'] = duplicates.json_representation
            context['date_of_calculation'] = duplicates.calculated_on
        else:
            # no information stored
            context['duplicate_cache_content'] = simplejson.dumps({})

        template = 'soc/program/show_duplicates.html'

        return helper.responses.respond(request,
                                        template=template,
                                        context=context)
示例#11
0
    def slots(self,
              request,
              acces_type,
              page_name=None,
              params=None,
              **kwargs):
        """Returns a JSON object with all orgs allocation.

    Args:
      request: the standard Django HTTP request object
      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, not used
    """

        from django.utils import simplejson

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)
        program_slots = program_entity.slots

        filter = {
            'scope': program_entity,
            'status': 'active',
        }

        query = org_logic.logic.getQueryForFields(filter=filter)
        organizations = org_logic.logic.getAll(query)

        locked_slots = adjusted_slots = {}

        if request.method == 'POST' and 'result' in request.POST:
            result = request.POST['result']
            submit = request.GET.get('submit')
            load = request.GET.get('load')
            stored = program_entity.slots_allocation

            if load and stored:
                result = stored

            from_json = simplejson.loads(result)

            locked_slots = dicts.groupDictBy(from_json, 'locked', 'slots')

            if submit:
                program_entity.slots_allocation = result
                program_entity.put()

        orgs = {}
        applications = {}
        max = {}

        for org in organizations:
            orgs[org.link_id] = org
            applications[org.link_id] = org.nr_applications
            max[org.link_id] = min(org.nr_mentors, org.slots_desired)

        max_slots_per_org = program_entity.max_slots
        min_slots_per_org = program_entity.min_slots
        algorithm = 2

        allocator = allocations.Allocator(orgs.keys(), applications, max,
                                          program_slots, max_slots_per_org,
                                          min_slots_per_org, algorithm)

        result = allocator.allocate(locked_slots)

        data = []

        # TODO: remove adjustment here and in the JS
        for link_id, count in result.iteritems():
            org = orgs[link_id]
            data.append({
                'link_id': link_id,
                'slots': count,
                'locked': locked_slots.get(link_id, 0),
                'adjustment': adjusted_slots.get(link_id, 0),
            })

        return self.json(request, data)
示例#12
0
    def assignedProposals(self,
                          request,
                          access_type,
                          page_name=None,
                          params=None,
                          filter=None,
                          **kwargs):
        """Returns a JSON dict containing all the proposals that would have
    a slot assigned for a specific set of orgs.

    The request.GET limit and offset determines how many and which
    organizations should be returned.

    For params see base.View.public().

    Returns: JSON object with a collection of orgs and proposals. Containing
             identification information and contact information.
    """

        get_dict = request.GET

        if not (get_dict.get('limit') and get_dict.get('offset')):
            return self.json(request, {})

        try:
            limit = max(0, int(get_dict['limit']))
            offset = max(0, int(get_dict['offset']))
        except ValueError:
            return self.json(request, {})

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

        fields = {'scope': program_entity, 'slots >': 0, 'status': 'active'}

        org_entities = org_logic.logic.getForFields(fields,
                                                    limit=limit,
                                                    offset=offset)

        orgs_data = {}
        proposals_data = []

        # for each org get the proposals who will be assigned a slot
        for org in org_entities:

            org_data = {'name': org.name}

            fields = {'scope': org, 'status': 'active', 'user': org.founder}

            org_admin = org_admin_logic.getForFields(fields, unique=True)

            if org_admin:
                # pylint: disable-msg=E1103
                org_data['admin_name'] = org_admin.name()
                org_data['admin_email'] = org_admin.email

            proposals = student_proposal_logic.getProposalsToBeAcceptedForOrg(
                org, step_size=program_entity.max_slots)

            if not proposals:
                # nothing to accept, next organization
                continue

            # store information about the org
            orgs_data[org.key().id_or_name()] = org_data

            # store each proposal in the dictionary
            for proposal in proposals:
                student_entity = proposal.scope

                proposals_data.append({
                    'key_name':
                    proposal.key().id_or_name(),
                    'proposal_title':
                    proposal.title,
                    'student_key':
                    student_entity.key().id_or_name(),
                    'student_name':
                    student_entity.name(),
                    'student_contact':
                    student_entity.email,
                    'org_key':
                    org.key().id_or_name()
                })

        # return all the data in JSON format
        data = {'orgs': orgs_data, 'proposals': proposals_data}

        return self.json(request, data)
示例#13
0
    def assignSlots(self,
                    request,
                    access_type,
                    page_name=None,
                    params=None,
                    **kwargs):
        """View that allows to assign slots to orgs.
    """

        from soc.modules.gsoc.views.models.organization import view as org_view

        program_entity = program_logic.getFromKeyFieldsOr404(kwargs)
        description = self.DEF_SLOTS_ALLOCATION_MSG

        org_params = org_view.getParams().copy()
        org_params['list_description'] = description
        org_params[
            'list_template'] = "modules/gsoc/program/list/allocation.html"
        org_params['public_field_props'] = {
            "link_id": {
                "hidden": True,
            }
        }
        org_params['public_row_action'] = {}
        org_params['public_row_extra'] = lambda entity: {}
        org_params['public_conf_extra'] = {
            "rowNum": -1,
            "rowList": [],
        }
        org_params['public_field_keys'] = [
            "name",
            "slots_desired",
            "nr_applications",
            "nr_mentors",
            "locked",
            "slots_ass",
            "slots",
            "link_id",
        ]
        org_params['public_field_names'] = [
            "Name",
            "Desired",
            "#Proposals",
            "#Mentors",
            "Locked?",
            "Slots Assigned",
            "Slots Visible to Org",
            "Link ID",
        ]

        fields = {
            'scope': program_entity,
            'status': ['new', 'active', 'inactive']
        }

        return_url = "http://%(host)s%(index)s" % {
            'host': system.getHostname(),
            'index': redirects.getSlotsRedirect(program_entity, params)
        }

        context = {
            'total_slots': program_entity.slots,
            'uses_json': True,
            'uses_slot_allocator': True,
            'return_url': return_url,
        }

        return self.list(request,
                         'allow',
                         page_name=page_name,
                         params=org_params,
                         filter=fields,
                         context=context)
示例#14
0
  def slots(self, request, acces_type, page_name=None, params=None, **kwargs):
    """Returns a JSON object with all orgs allocation.

    Args:
      request: the standard Django HTTP request object
      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, not used
    """

    program_entity = program_logic.getFromKeyFieldsOr404(kwargs)
    program_slots = program_entity.slots

    filter = {
          'scope': program_entity,
          'status': ['new', 'active', 'inactive'],
          }

    query = org_logic.getQueryForFields(filter=filter)
    organizations = org_logic.getAll(query)

    if request.method == 'POST' and 'result' in request.POST:
      result = request.POST['result']
      submit = request.GET.get('submit')
      load = request.GET.get('load')
      stored = program_entity.slots_allocation

      if load and stored:
        result = stored

      if submit:
        program_entity.slots_allocation = result
        program_entity.put()

    orgs = {}
    applications = {}
    max = {}

    for org in organizations:
      orgs[org.link_id] = org
      applications[org.link_id] = org.nr_applications
      max[org.link_id] = org.slots_desired

    max_slots_per_org = program_entity.max_slots
    min_slots_per_org = program_entity.min_slots
    algorithm = 2

    allocator = allocations.Allocator(orgs.keys(), applications, max,
                                      program_slots, max_slots_per_org,
                                      min_slots_per_org, algorithm)

    from_json = simplejson.loads(program_entity.slots_allocation)
    locked_slots = dicts.groupDictBy(from_json, 'locked', 'slots')

    result = allocator.allocate(locked_slots)

    data = []

    for link_id in orgs.keys():
      data.append({
          'link_id': link_id,
          'slots': result.get(link_id,0),
          'locked': bool(locked_slots.get(link_id))
          })

    return self.json(request, data)
示例#15
0
  def assignedProposals(self, request, access_type, page_name=None,
                        params=None, filter=None, **kwargs):
    """Returns a JSON dict containing all the proposals that would have
    a slot assigned for a specific set of orgs.

    The request.GET limit and offset determines how many and which
    organizations should be returned.

    For params see base.View.public().

    Returns: JSON object with a collection of orgs and proposals. Containing
             identification information and contact information.
    """

    get_dict = request.GET

    if not (get_dict.get('limit') and get_dict.get('offset')):
      return self.json(request, {})

    try:
      limit = max(0, int(get_dict['limit']))
      offset = max(0, int(get_dict['offset']))
    except ValueError:
      return self.json(request, {})

    program_entity = program_logic.getFromKeyFieldsOr404(kwargs)

    fields = {'scope': program_entity,
              'slots >': 0,
              'status': 'active'}

    org_entities = org_logic.getForFields(fields,
        limit=limit, offset=offset)

    orgs_data = {}
    proposals_data = []

    # for each org get the proposals who will be assigned a slot
    for org in org_entities:

      org_data = {'name': org.name}

      fields = {'scope': org,
                'status': 'active',
                'user': org.founder}

      org_admin = org_admin_logic.getForFields(fields, unique=True)

      if org_admin:
        # pylint: disable=E1103
        org_data['admin_name'] = org_admin.name()
        org_data['admin_email'] = org_admin.email

      proposals = student_proposal_logic.getProposalsToBeAcceptedForOrg(
          org, step_size=program_entity.max_slots)

      if not proposals:
        # nothing to accept, next organization
        continue

      # store information about the org
      orgs_data[org.key().id_or_name()] = org_data

      # store each proposal in the dictionary
      for proposal in proposals:
        student_entity = proposal.scope

        proposals_data.append(
            {'key_name': proposal.key().id_or_name(),
            'proposal_title': proposal.title,
            'student_key': student_entity.key().id_or_name(),
            'student_name': student_entity.name(),
            'student_contact': student_entity.email,
            'org_key': org.key().id_or_name()
            })

    # return all the data in JSON format
    data = {'orgs': orgs_data,
            'proposals': proposals_data}

    return self.json(request, data)