def edit_elder(request, elder_id, student_id=None, group_id=None): """Edit a village elder.""" elder = get_object_or_404( model.Profile.objects.select_related('user'), id=elder_id) # can't edit the profile of another school staff if elder.school_staff: raise http.Http404 if student_id is not None: teacher_rel = get_relationship_or_404(student_id, request.user.profile) editor = model.elder_in_context(teacher_rel) elder_rel = get_relationship_or_404(student_id, elder) elder = model.elder_in_context(elder_rel) all_elders = elder_rel.student.elder_relationships group = get_querystring_group(request, elder_rel.student) else: elder_rel = None editor = request.user.profile if group_id is not None: group = get_object_or_404(model.Group.objects.filter( owner=request.user.profile), pk=group_id) else: group = model.AllStudentsGroup(request.user.profile) all_elders = group.all_elders if request.method == 'POST': form = forms.EditFamilyForm(request.POST, instance=elder, rel=elder_rel) success = False if elder_rel and request.POST.get('remove', False): with xact.xact(): elder_rel.delete() success = True elif form.is_valid(): with xact.xact(): form.save(editor=editor) messages.success(request, u"Changes saved!") success = True if success: if elder_rel: return redirect('village', student_id=student_id) elif group and not group.is_all: return redirect('group', group_id=group.id) return redirect('all_students') else: form = forms.EditFamilyForm(instance=elder, rel=elder_rel) return TemplateResponse( request, 'village/elder_form/edit_elder.html', { 'form': form, 'group': group, 'student': elder_rel.student if elder_rel else None, 'inviter': editor, 'elder': elder, 'elders': model.contextualized_elders( all_elders).order_by('school_staff', 'name'), }, )
def invite_family(request, student_id): """Invite family member to a student's village.""" rel = get_relationship_or_404(student_id, request.user.profile) group = get_querystring_group(request, rel.student) if request.method == 'POST': form = forms.InviteFamilyForm(request.POST, rel=rel) if form.is_valid(): with xact.xact(): form.save() tracking.track(request, 'invited family') return redirect_to_village(rel.student, group) else: phone = request.GET.get('phone', None) initial = {} if phone is not None: initial['phone'] = phone form = forms.InviteFamilyForm(initial=initial, rel=rel) return TemplateResponse( request, 'village/invite_elder/family.html', { 'group': group, 'student': rel.student, 'inviter': model.elder_in_context(rel), 'elders': model.contextualized_elders( rel.student.elder_relationships).order_by( 'school_staff', 'name'), 'form': form, }, )
def save(self, rel=None): """ Save/return new elder profile & send invite, or return existing. Optionally takes ``rel`` between inviting elder and student. If given will override rel given at initialization time. A rel must be given either at initialization or save time. """ if rel is not None: self.rel = rel inviter = self.rel.elder name = self.cleaned_data.get('name') phone = self.cleaned_data.get('phone') relationship = self.cleaned_data.get('role', u"") if self.instance is None: self.instance = model.Profile.create_with_user( school=inviter.school, name=name, phone=phone, role=relationship, is_active=True, school_staff=False, invited_by=inviter, ) else: # remove other existing relationships with teacher-less students model.Relationship.objects.filter( from_profile=self.instance).exclude( from_profile__school_staff=True).exclude( to_profile=self.rel.student).delete() # send invite SMSes invites.send_invite_sms( self.instance, template_name='sms/invite_elder.txt', extra_context={ 'inviter': model.elder_in_context(self.rel), 'student': self.rel.student, }, ) rel, created = model.Relationship.objects.get_or_create( from_profile=self.instance, to_profile=self.rel.student, defaults={ 'description': relationship, } ) if not created and not rel.direct: rel.direct = True rel.save() return self.instance
def save(self, rel=None): """ Save/return new elder profile & send invite, or return existing. Optionally takes ``rel`` between inviting elder and student. If given will override rel given at initialization time. A rel must be given either at initialization or save time. """ if rel is not None: self.rel = rel inviter = self.rel.elder name = self.cleaned_data.get('name') phone = self.cleaned_data.get('phone') relationship = self.cleaned_data.get('role', u"") if self.instance is None: self.instance = model.Profile.create_with_user( school=inviter.school, name=name, phone=phone, role=relationship, is_active=True, school_staff=False, invited_by=inviter, ) else: # remove other existing relationships with teacher-less students model.Relationship.objects.filter( from_profile=self.instance).exclude( from_profile__school_staff=True).exclude( to_profile=self.rel.student).delete() # send invite SMSes invites.send_invite_sms( self.instance, template_name='sms/invite_elder.txt', extra_context={ 'inviter': model.elder_in_context(self.rel), 'student': self.rel.student, }, ) rel, created = model.Relationship.objects.get_or_create( from_profile=self.instance, to_profile=self.rel.student, defaults={ 'description': relationship, }) if not created and not rel.direct: rel.direct = True rel.save() return self.instance