def invite_teacher_to_group(request, group_id): """Invite teacher to a group.""" group = get_object_or_404( model.Group.objects.filter(owner=request.user.profile), id=group_id) if request.method == 'POST': form = forms.InviteTeacherForm(request.POST, group=group) if form.is_valid(): with xact.xact(): teacher = form.save() tracking.track( request, 'invited teacher', invitedEmail=teacher.user.email, groupId=group_id, ) return redirect('group', group_id=group.id) else: form = forms.InviteTeacherForm(group=group) return TemplateResponse( request, 'village/invite_elder/teacher_to_group.html', { 'group': group, 'form': form, 'elders': model.contextualized_elders( group.all_elders).order_by('school_staff', 'name'), }, )
def village(request, student_id): """The main chat view for a student/village.""" try: rel = get_relationship_or_404(student_id, request.user.profile) except http.Http404: if not request.user.is_superuser: raise rel = None student = get_object_or_404(model.Profile, pk=student_id) else: student = rel.student group = get_querystring_group(request, student) posts = _get_posts(request.user.profile, student=student) if rel and not request.impersonating: model.unread.mark_village_read(rel.student, rel.elder) return TemplateResponse( request, 'village/post_list/village.html', { 'student': student, 'group': group, 'relationship': rel, 'elders': model.contextualized_elders( student.elder_relationships).order_by('school_staff', 'name'), 'read_only': rel is None, 'posts': posts, 'post_char_limit': model.post_char_limit(rel) if rel else 0, 'posting_url': reverse( 'create_post', kwargs={'student_id': student.id}), }, )
def invite_teacher(request, student_id): """Invite teacher 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.InviteTeacherForm(request.POST, rel=rel) if form.is_valid(): with xact.xact(): teacher = form.save() tracking.track( request, 'invited teacher', invitedEmail=teacher.user.email, studentId=student_id, ) return redirect_to_village(rel.student, group) else: form = forms.InviteTeacherForm(rel=rel) return TemplateResponse( request, 'village/invite_elder/teacher.html', { 'group': group, 'student': rel.student, 'form': form, 'elders': model.contextualized_elders( rel.student.elder_relationships).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 test_can_values_list(self, db): """Can get values_list from contextualized elders.""" rel1 = factories.RelationshipFactory.create() rel2 = factories.RelationshipFactory.create() qs = model.contextualized_elders(model.Relationship.objects.all()) assert set(qs.values_list( 'id', flat=True)) == {rel1.from_profile_id, rel2.from_profile_id}
def test_profiles(self, db): """Given profiles, yields them with role_in_context.""" elder1 = factories.ProfileFactory.create(role='foo') elder2 = factories.ProfileFactory.create(role='bar') qs = model.contextualized_elders(model.Profile.objects.all()) assert set(qs) == {elder1, elder2} assert set([e.role_in_context for e in qs]) == {'foo', 'bar'}
def test_can_values_list(self, db): """Can get values_list from contextualized elders.""" rel1 = factories.RelationshipFactory.create() rel2 = factories.RelationshipFactory.create() qs = model.contextualized_elders(model.Relationship.objects.all()) assert set(qs.values_list('id', flat=True)) == { rel1.from_profile_id, rel2.from_profile_id}
def test_relationships(self, db): """Given relationships, yields elders with role_in_context.""" rel1 = factories.RelationshipFactory.create(from_profile__role='foo') rel2 = factories.RelationshipFactory.create(description='bar') qs = model.contextualized_elders(model.Relationship.objects.all()) assert set(qs) == {rel1.elder, rel2.elder} assert set([e.role_in_context for e in qs]) == {'foo', 'bar'}
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 test_can_order(self, db): """Can order a contextualized queryset of relationships.""" rel1 = factories.RelationshipFactory.create(from_profile__name='B') rel2 = factories.RelationshipFactory.create(from_profile__name='A') qs = model.contextualized_elders(model.Relationship.objects.all()) qs = qs.order_by('name') assert list(qs) == [rel2.elder, rel1.elder]
def test_relationships(self, db): """Given relationships, yields elders with role_in_context.""" rel1 = factories.RelationshipFactory.create( from_profile__role='foo') rel2 = factories.RelationshipFactory.create( description='bar') qs = model.contextualized_elders(model.Relationship.objects.all()) assert set(qs) == {rel1.elder, rel2.elder} assert set([e.role_in_context for e in qs]) == {'foo', 'bar'}
def test_can_filter_exclude(self, db): """Can filter/exclude a contextualized queryset of relationships.""" rel1 = factories.RelationshipFactory.create() rel2 = factories.RelationshipFactory.create() factories.RelationshipFactory.create() qs = model.contextualized_elders(model.Relationship.objects.all()) qs = qs.filter(pk__in=[rel1.elder.pk, rel2.elder.pk]).exclude( pk=rel2.elder.pk) assert set(qs) == {rel1.elder}
def test_can_filter_exclude(self, db): """Can filter/exclude a contextualized queryset of relationships.""" rel1 = factories.RelationshipFactory.create() rel2 = factories.RelationshipFactory.create() factories.RelationshipFactory.create() qs = model.contextualized_elders(model.Relationship.objects.all()) qs = qs.filter( pk__in=[rel1.elder.pk, rel2.elder.pk] ).exclude(pk=rel2.elder.pk) assert set(qs) == {rel1.elder}
def dashboard(request, group_id=None): """Group dashboard.""" if group_id is None: group = model.AllStudentsGroup(request.user.profile) else: group = get_object_or_404( model.Group.objects.filter(owner=request.user.profile), id=group_id, ) return TemplateResponse( request, 'village/dashboard.html', { 'group': group, 'elders': model.contextualized_elders( group.all_elders).order_by('school_staff', 'name'), 'student_count': group.students.count(), 'teacher_count': group.all_elders.filter(school_staff=True).count(), 'family_count': group.all_elders.filter(school_staff=False).count(), }, )
def group(request, group_id=None): """The main chat view for a group.""" if group_id is None: group = model.AllStudentsGroup(request.user.profile) posting_url = reverse('create_post') else: group = get_object_or_404( model.Group.objects.filter(owner=request.user.profile), id=group_id, ) posting_url = reverse('create_post', kwargs={'group_id': group.id}) return TemplateResponse( request, 'village/post_list/group.html', { 'group': group, 'elders': model.contextualized_elders( group.all_elders).order_by('school_staff', 'name'), 'posts': _get_posts(request.user.profile, group=group), 'post_char_limit': model.post_char_limit(request.user.profile), 'posting_url': posting_url, }, )
def test_must_be_profiles_or_relationships(self): """Raises ValueError if given unrecognized queryset.""" with pytest.raises(ValueError): model.contextualized_elders(model.Group.objects.all())