def _updateField(self, entity, entity_properties, name): """Called when the fields of the mentor are updated When status is changed to invalid, removes the Mentor from all Student Proposals possible mentor lists. """ from soc.logic.models.student_proposal import logic \ as student_proposal_logic value = entity_properties[name] if name == 'status' and value != entity.status and value == 'invalid': fields = {'org': entity.scope} # TODO make this work for more then 1000 entities proposals_query = student_proposal_logic.getQueryForFields(fields) # store all updated proposals changed = [] for proposal in proposals_query: if proposal.possible_mentors.count(entity.key()): # remove from list and add to changed proposal.possible_mentors.remove(entity.key()) changed.append(proposal) # store all changed proposals db.put(changed) return super(Logic, self)._updateField(entity, entity_properties, name)
def convertProposals(org): """Convert all proposals for the specified organization. Args: org: the organization for which all proposals will be converted """ from soc.logic.models.student_proposal import logic as proposal_logic from soc.logic.models.student_project import logic as project_logic proposals = proposal_logic.getProposalsToBeAcceptedForOrg(org) print "accepting %d proposals, with %d slots" % (len(proposals), org.slots) for proposal in proposals: fields = { 'link_id': 't%i' % (int(time.time()*100)), 'scope_path': proposal.org.key().id_or_name(), 'scope': proposal.org, 'program': proposal.program, 'student': proposal.scope, 'title': proposal.title, 'abstract': proposal.abstract, 'mentor': proposal.mentor, } project = project_logic.updateOrCreateFromFields(fields, silent=True) fields = { 'status':'accepted', } proposal_logic.updateEntityProperties(proposal, fields, silent=True) fields = { 'status': ['new', 'pending'], 'org': org, } querygen = lambda: proposal_logic.getQueryForFields(fields) proposals = [i for i in interactive.deepFetch(querygen, batchSize=10)] print "rejecting %d proposals" % len(proposals) fields = { 'status': 'rejected', } for proposal in proposals: proposal_logic.updateEntityProperties(proposal, fields, silent=True)
def convertProposals(org): """Convert all proposals for the specified organization. Args: org: the organization for which all proposals will be converted """ from soc.logic.models.student_proposal import logic as proposal_logic from soc.logic.models.student_project import logic as project_logic proposals = proposal_logic.getProposalsToBeAcceptedForOrg(org) print "accepting %d proposals, with %d slots" % (len(proposals), org.slots) for proposal in proposals: fields = { 'link_id': 't%i' % (int(time.time()*100)), 'scope_path': proposal.org.key().id_or_name(), 'scope': proposal.org, 'program': proposal.program, 'student': proposal.scope, 'title': proposal.title, 'abstract': proposal.abstract, 'mentor': proposal.mentor, } project = project_logic.updateOrCreateFromFields(fields, silent=True) fields = { 'status':'accepted', } proposal_logic.updateEntityProperties(proposal, fields, silent=True) fields = { 'status': ['new', 'pending'], 'org': org, } querygen = lambda: proposal_logic.getQueryForFields(fields) proposals = [i for i in interactive.deepFetch(querygen, batchSize=10)] print "rejecting %d proposals" % len(proposals) fields = { 'status': 'rejected', } for proposal in proposals: proposal_logic.updateEntityProperties(proposal, fields, silent=True)
def checkCanStudentPropose(self, django_args, key_location, check_limit): """Checks if the program for this student accepts proposals. Args: django_args: a dictionary with django's arguments key_location: the key for django_args in which the key_name from the student is stored check_limit: iff true checks if the student reached the apps_tasks_limit for the given program. """ self.checkIsUser(django_args) if django_args.get('seed'): key_name = django_args['seed'][key_location] else: key_name = django_args[key_location] student_entity = student_logic.getFromKeyName(key_name) if not student_entity or student_entity.status == 'invalid': raise out_of_band.AccessViolation( message_fmt=DEF_SIGN_UP_AS_STUDENT_MSG) program_entity = student_entity.scope if not timeline_helper.isActivePeriod(program_entity.timeline, 'student_signup'): raise out_of_band.AccessViolation(message_fmt=DEF_PAGE_INACTIVE_MSG) if check_limit: # count all studentproposals by the student fields = {'scope': student_entity} proposal_query = student_proposal_logic.getQueryForFields(fields) if proposal_query.count() >= program_entity.apps_tasks_limit: # too many proposals access denied raise out_of_band.AccessViolation(message_fmt=DEF_MAX_PROPOSALS_REACHED) return