-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: foundation of breaking circular dependencies #17
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewable status: 0 of 38 files reviewed, 5 unresolved discussions
codeforlife/pagination.py
line 9 at r3 (raw file):
class LimitOffsetPagination(_LimitOffsetPagination): default_limit = 50 max_limit = 500
150
codeforlife/tests/api.py
line 208 at r3 (raw file):
): """ Get a different user that is also in a school.
clearer doc strings
codeforlife/user/filters/user.py
line 8 at r3 (raw file):
class UserFilterSet(filters.FilterSet): students_in_class = filters.CharFilter( "new_student__class_field__access_code", "exact"
use new_student__class_field
codeforlife/user/views/user.py
line 16 at r3 (raw file):
user: User = self.request.user if user.teacher is None: return User.objects.filter(id=user.id)
students can read all other students in their class
codeforlife/user/views/user.py
line 21 at r3 (raw file):
new_teacher__school=user.teacher.school_id ) students = User.objects.filter(
if admin, all students in all classes
else, all students in classes teacher owns
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed 5 of 17 files at r1, 1 of 1 files at r2, 32 of 32 files at r3, all commit messages.
Reviewable status: all files reviewed, 41 unresolved discussions (waiting on @SKairinos)
codeforlife/pagination.py
line 9 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
150
Reminder
codeforlife/settings/django.py
line 127 at r3 (raw file):
# Installed Apps # https://docs.djangoproject.com/en/4.2/ref/settings/#installed-apps
Wrong Django version
codeforlife/tests/api.py
line 208 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
clearer doc strings
Reminder
codeforlife/user/models/user.py
line 97 at r3 (raw file):
@property def developer(self): return self.userprofile.developer
Don't think we need this
Code quote:
@property
def developer(self):
return self.userprofile.developer
codeforlife/user/serializers/__init__.py
line 5 at r3 (raw file):
from .teacher import TeacherSerializer from .user import UserSerializer from .school import SchoolSerializer
These aren't ordered it seems
Code quote:
from .klass import ClassSerializer
from .student import StudentSerializer
from .teacher import TeacherSerializer
from .user import UserSerializer
from .school import SchoolSerializer
codeforlife/user/tests/views/test_school.py
line 9 at r3 (raw file):
from ...serializers import SchoolSerializer from ...views import SchoolViewSet from ...models import User, School, Teacher, Student, Class, UserProfile
Organise imports? Does it not order relative imports alphabetically?
Code quote:
import typing as t
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from ....tests import APITestCase, APIClient
from ...serializers import SchoolSerializer
from ...views import SchoolViewSet
from ...models import User, School, Teacher, Student, Class, UserProfile
codeforlife/user/tests/views/test_school.py
line 90 at r3 (raw file):
- student: A school student. - indy_student: A non-school student.
Extra whitespaces
codeforlife/user/tests/views/test_school.py
line 111 at r3 (raw file):
def test_retrieve__indy_student(self): """ Independent student can not retrieve any school.
cannot
codeforlife/user/tests/views/test_school.py
line 144 at r3 (raw file):
def test_retrieve__teacher__not_same_school(self): """ Teacher can not retrieve a school they are not in.
cannot
codeforlife/user/tests/views/test_school.py
line 154 at r3 (raw file):
self._retrieve_school( school, status_code_assertion=status.HTTP_404_NOT_FOUND,
Why is this a 404 and not a 403?
codeforlife/user/tests/views/test_school.py
line 159 at r3 (raw file):
def test_retrieve__student__not_same_school(self): """ Student can not retrieve a school they are not in.
cannot
codeforlife/user/tests/views/test_school.py
line 171 at r3 (raw file):
self._retrieve_school( school, status_code_assertion=status.HTTP_404_NOT_FOUND,
Same question here
codeforlife/user/tests/views/test_user.py
line 179 at r3 (raw file):
def test_retrieve__student__teacher__same_school(self): """ Student can not retrieve a teacher from the same school.
cannot
codeforlife/user/tests/views/test_user.py
line 195 at r3 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
Why not 403
codeforlife/user/tests/views/test_user.py
line 200 at r3 (raw file):
def test_retrieve__student__student__same_school(self): """ Student can not retrieve another student from the same school.
cannot
codeforlife/user/tests/views/test_user.py
line 216 at r3 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
Why not 403?
codeforlife/user/tests/views/test_user.py
line 221 at r3 (raw file):
def test_retrieve__teacher__teacher__not_same_school(self): """ Teacher can not retrieve another teacher from another school.
cannot
codeforlife/user/tests/views/test_user.py
line 237 at r3 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
403?
codeforlife/user/tests/views/test_user.py
line 242 at r3 (raw file):
def test_retrieve__teacher__student__not_same_school(self): """ Teacher can not retrieve a student from another school.
cannot
codeforlife/user/tests/views/test_user.py
line 258 at r3 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
bleh?
codeforlife/user/tests/views/test_user.py
line 263 at r3 (raw file):
def test_retrieve__student__teacher__not_same_school(self): """ Student can not retrieve a teacher from another school.
fuse
codeforlife/user/tests/views/test_user.py
line 279 at r3 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
?
codeforlife/user/tests/views/test_user.py
line 284 at r3 (raw file):
def test_retrieve__student__student__not_same_school(self): """ Student can not retrieve another student from another school.
.
codeforlife/user/tests/views/test_user.py
line 300 at r3 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
xyz
codeforlife/user/tests/views/test_user.py
line 305 at r3 (raw file):
def test_retrieve__indy_student__teacher(self): """ Independent student can not retrieve a teacher.
bonjour
codeforlife/user/tests/views/test_user.py
line 310 at r3 (raw file):
user = self._login_indy_student() self.get_other_school_user(
Why are we using get_other_school_user
instead of retrieve_user
like we've done before?
codeforlife/user/tests/views/test_user.py
line 318 at r3 (raw file):
def test_retrieve__indy_student__student(self): """ Independent student can not retrieve a student.
au revoir
codeforlife/user/tests/views/test_user.py
line 323 at r3 (raw file):
user = self._login_indy_student() self.get_other_school_user(
Same question as above
codeforlife/user/tests/views/test_user.py
line 339 at r3 (raw file):
- student: A school student. - indy_student: A non-school student.
Extra whitespaces
codeforlife/user/tests/views/test_user.py
line 357 at r3 (raw file):
) def test_list__teacher(self):
only admins
codeforlife/user/tests/views/test_user.py
line 369 at r3 (raw file):
new_student__class_field__teacher__school=user.teacher.school ) )
If I understand what this is doing, why not just do user.teacher.school.teacher_school.all()
? 😅
Code quote:
self._list_users(
User.objects.filter(new_teacher__school=user.teacher.school)
| User.objects.filter(
new_student__class_field__teacher__school=user.teacher.school
)
)
codeforlife/user/tests/views/test_user.py
line 371 at r3 (raw file):
) def test_list__teacher__students_in_class(self):
only admins
codeforlife/user/tests/views/test_user.py
line 373 at r3 (raw file):
def test_list__teacher__students_in_class(self): """ Teacher can list all the users in the same school.
This docstring is incorrect
codeforlife/user/tests/views/test_user.py
line 386 at r3 (raw file):
), filters={"students_in_class": access_code}, )
Same as above, we can just get the students from the class reverse field - I think I might be missing the point of these tests & the list function
Code quote:
self._list_users(
User.objects.filter(
new_student__class_field__access_code=access_code
),
filters={"students_in_class": access_code},
)
codeforlife/user/views/__init__.py
line 3 at r3 (raw file):
from .klass import ClassViewSet from .user import UserViewSet from .school import SchoolViewSet
Organise imports?
Code quote:
from .klass import ClassViewSet
from .user import UserViewSet
from .school import SchoolViewSet
codeforlife/user/views/klass.py
line 6 at r3 (raw file):
from ..models import Class, User from ..serializers import ClassSerializer from ..permissions import IsSchoolMember
Imports? Really starting to think it doesn't sort relative imports
Code quote:
from ..models import Class, User
from ..serializers import ClassSerializer
from ..permissions import IsSchoolMember
codeforlife/user/views/klass.py
line 18 at r3 (raw file):
user: User = self.request.user if user.teacher is None: return Class.objects.filter(students=user)
At a quick glance it seems weird to me that user
is passed in to a plural arg called students
- how come that's the case?
codeforlife/user/views/school.py
line 6 at r3 (raw file):
from ..models import User, School from ..serializers import SchoolSerializer from ..permissions import IsSchoolMember
Again
Code quote:
from ..models import User, School
from ..serializers import SchoolSerializer
from ..permissions import IsSchoolMember
codeforlife/user/views/user.py
line 16 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
students can read all other students in their class
Reminder
codeforlife/user/views/user.py
line 21 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
if admin, all students in all classes
else, all students in classes teacher owns
Reminder
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewable status: 27 of 38 files reviewed, 36 unresolved discussions (waiting on @faucomte97)
codeforlife/settings/django.py
line 127 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Wrong Django version
Done.
codeforlife/user/models/user.py
line 97 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Don't think we need this
Done.
codeforlife/user/serializers/__init__.py
line 5 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
These aren't ordered it seems
Done.
codeforlife/user/tests/views/test_school.py
line 9 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Organise imports? Does it not order relative imports alphabetically?
It does. It's my fault - I forgot to enable import sorting.
codeforlife/user/tests/views/test_school.py
line 90 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Extra whitespaces
Done.
codeforlife/user/tests/views/test_school.py
line 111 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_school.py
line 144 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_school.py
line 154 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Why is this a 404 and not a 403?
it's 404 not found because the queryset only contains schools the user has access to. Because this is an indy student, they don't have access to any schools. Therefore the queryset is empty and the school they are requesting is not found in the queryset.
codeforlife/user/tests/views/test_school.py
line 159 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_school.py
line 171 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Same question here
see above
codeforlife/user/tests/views/test_user.py
line 179 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_user.py
line 195 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Why not 403
Done.
codeforlife/user/tests/views/test_user.py
line 200 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_user.py
line 216 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Why not 403?
Done.
codeforlife/user/tests/views/test_user.py
line 221 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_user.py
line 237 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
403?
Done.
codeforlife/user/tests/views/test_user.py
line 242 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cannot
Done.
codeforlife/user/tests/views/test_user.py
line 258 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
bleh?
Done.
codeforlife/user/tests/views/test_user.py
line 263 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
fuse
Done.
codeforlife/user/tests/views/test_user.py
line 279 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
?
Done.
codeforlife/user/tests/views/test_user.py
line 284 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
.
Done.
codeforlife/user/tests/views/test_user.py
line 300 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
xyz
Done.
codeforlife/user/tests/views/test_user.py
line 305 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
bonjour
Done.
codeforlife/user/tests/views/test_user.py
line 310 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Why are we using
get_other_school_user
instead ofretrieve_user
like we've done before?
I forgot to _retrieve_user. Added it now
codeforlife/user/tests/views/test_user.py
line 318 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
au revoir
Done.
codeforlife/user/tests/views/test_user.py
line 323 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Same question as above
see above
codeforlife/user/tests/views/test_user.py
line 339 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Extra whitespaces
Done.
codeforlife/user/tests/views/test_user.py
line 357 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
only admins
Done.
codeforlife/user/tests/views/test_user.py
line 369 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
If I understand what this is doing, why not just do
user.teacher.school.teacher_school.all()
? 😅
That would only get the teachers in that school. We need the school's teachers OR the school's students. This can be achieved with the "|" operator. It translates to "search for the desired user from the school teachers or school students"
codeforlife/user/tests/views/test_user.py
line 371 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
only admins
Done.
codeforlife/user/tests/views/test_user.py
line 373 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
This docstring is incorrect
Done.
codeforlife/user/tests/views/test_user.py
line 386 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Same as above, we can just get the students from the class reverse field - I think I might be missing the point of these tests & the list function
let's discuss in office
codeforlife/user/views/__init__.py
line 3 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Organise imports?
Done.
codeforlife/user/views/klass.py
line 6 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Imports? Really starting to think it doesn't sort relative imports
Done.
codeforlife/user/views/klass.py
line 18 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
At a quick glance it seems weird to me that
user
is passed in to a plural arg calledstudents
- how come that's the case?
codeforlife/user/views/school.py
line 6 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Again
Done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed 12 of 12 files at r4, all commit messages.
Reviewable status: all files reviewed, 16 unresolved discussions (waiting on @SKairinos)
codeforlife/tests/api.py
line 237 at r4 (raw file):
# Cannot assert that 2 teachers are in the same class since a class # can only have 1 teacher. if not (user.teacher is not None and is_teacher):
I find this whole section pretty hard to read 😕
The repeated nots also make it hard to wrap my head around, let alone the other cases below.
Maybe simplify it if you can or add more comments maybe.
codeforlife/user/tests/views/test_school.py
line 154 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
it's 404 not found because the queryset only contains schools the user has access to. Because this is an indy student, they don't have access to any schools. Therefore the queryset is empty and the school they are requesting is not found in the queryset.
I thought the test was meant to test the permission classes no? If so wouldn't it make sense to check that the teacher can't retrieve a class that they shouldn't have permission to access as opposed to trying to retrieve nothing?
codeforlife/user/tests/views/test_school.py
line 171 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
see above
cf comment above
codeforlife/user/tests/views/test_user.py
line 195 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
Done.
Again
codeforlife/user/tests/views/test_user.py
line 216 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
Done.
Again
codeforlife/user/tests/views/test_user.py
line 237 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
Done.
Again
codeforlife/user/tests/views/test_user.py
line 258 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
Done.
Again
codeforlife/user/tests/views/test_user.py
line 279 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
Done.
!
codeforlife/user/tests/views/test_user.py
line 300 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
Done.
abc
codeforlife/user/tests/views/test_user.py
line 369 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
That would only get the teachers in that school. We need the school's teachers OR the school's students. This can be achieved with the "|" operator. It translates to "search for the desired user from the school teachers or school students"
Could we still not replace User.objects.filter(new_teacher__school=user.teacher.school)
with user.teacher.school.teacher_school.all()
at least?
codeforlife/user/tests/views/test_user.py
line 211 at r4 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
Same question here
codeforlife/user/tests/views/test_user.py
line 299 at r4 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
Same question
codeforlife/user/tests/views/test_user.py
line 446 at r4 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
Same question
codeforlife/user/tests/views/test_user.py
line 466 at r4 (raw file):
self._retrieve_user( other_user, status_code_assertion=status.HTTP_404_NOT_FOUND,
Again
codeforlife/user/views/klass.py
line 18 at r3 (raw file):
Previously, SKairinos (Stefan Kairinos) wrote…
I still don't get it. Isn't students
just the reverse of the foreign key so it returns a QuerySet of all Students in that class? So why are we passing in a single user? Are you trying to check if the user is in the class?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewable status: 30 of 38 files reviewed, 16 unresolved discussions (waiting on @faucomte97)
codeforlife/tests/api.py
line 237 at r4 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
I find this whole section pretty hard to read 😕
The repeated nots also make it hard to wrap my head around, let alone the other cases below.Maybe simplify it if you can or add more comments maybe.
used properties
codeforlife/user/tests/views/test_school.py
line 154 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
I thought the test was meant to test the permission classes no? If so wouldn't it make sense to check that the teacher can't retrieve a class that they shouldn't have permission to access as opposed to trying to retrieve nothing?
Done.
codeforlife/user/tests/views/test_school.py
line 171 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
cf comment above
Done.
codeforlife/user/tests/views/test_user.py
line 195 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Again
Done.
codeforlife/user/tests/views/test_user.py
line 216 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Again
Done.
codeforlife/user/tests/views/test_user.py
line 237 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Again
Done.
codeforlife/user/tests/views/test_user.py
line 258 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Again
Done.
codeforlife/user/tests/views/test_user.py
line 279 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
!
Done.
codeforlife/user/tests/views/test_user.py
line 300 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
abc
Done.
codeforlife/user/tests/views/test_user.py
line 369 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Could we still not replace
User.objects.filter(new_teacher__school=user.teacher.school)
withuser.teacher.school.teacher_school.all()
at least?
no. that would get all the teacher objects in that school. we want the user objects.
codeforlife/user/tests/views/test_user.py
line 211 at r4 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Same question here
Done.
codeforlife/user/tests/views/test_user.py
line 299 at r4 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Same question
Done.
codeforlife/user/tests/views/test_user.py
line 446 at r4 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Same question
Done.
codeforlife/user/tests/views/test_user.py
line 466 at r4 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
Again
Done.
codeforlife/user/views/klass.py
line 18 at r3 (raw file):
Previously, faucomte97 (Florian Aucomte) wrote…
I still don't get it. Isn't
students
just the reverse of the foreign key so it returns a QuerySet of all Students in that class? So why are we passing in a single user? Are you trying to check if the user is in the class?
Done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewable status: 30 of 38 files reviewed, 16 unresolved discussions (waiting on @faucomte97)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed 8 of 8 files at r5, all commit messages.
Reviewable status: all files reviewed, 1 unresolved discussion (waiting on @SKairinos)
codeforlife/user/tests/views/test_klass.py
line 36 at r5 (raw file):
- same_school: The class is in the same school as the user. - not_same_school: The class is not in the same school as the user.
Extra whitespaces
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed 1 of 1 files at r6, all commit messages.
Reviewable status: complete! all files reviewed, all discussions resolved (waiting on @SKairinos)
This change is