Skip to content
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-26 00:45
from __future__ import unicode_literals
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-08 22:00
from __future__ import unicode_literals
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-08 22:07
from __future__ import unicode_literals
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-27 18:55
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
def add_default_permissions(apps, schema_editor):
from course.models import add_default_roles_and_permissions
Course = apps.get_model("course", "Course") # noqa
ParticipationRole = apps.get_model("course", "ParticipationRole") # noqa
ParticipationRolePermission = apps.get_model("course", "ParticipationRolePermission") # noqa
Participation = apps.get_model("course", "Participation") # noqa
ParticipationPreapproval = apps.get_model("course", "ParticipationPreapproval") # noqa
Course = apps.get_model("course", "Course")
ParticipationRole = apps.get_model("course", "ParticipationRole")
ParticipationRolePermission = apps.get_model("course", "ParticipationRolePermission")
Participation = apps.get_model("course", "Participation")
ParticipationPreapproval = apps.get_model("course", "ParticipationPreapproval")
for course in Course.objects.all():
add_default_roles_and_permissions(
......@@ -21,9 +19,9 @@ def add_default_permissions(apps, schema_editor):
ParticipationRole,
ParticipationRolePermission)
roles = dict(
(role.identifier, role)
for role in ParticipationRole.objects.filter(course=course))
roles = {
role.identifier: role
for role in ParticipationRole.objects.filter(course=course)}
roles["auditor"] = roles["student"]
roles["observer"] = roles["instructor"]
......@@ -114,15 +112,15 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='participationrolepermission',
unique_together=set([('role', 'permission', 'argument')]),
unique_together={('role', 'permission', 'argument')},
),
migrations.AlterUniqueTogether(
name='participationrole',
unique_together=set([('course', 'identifier')]),
unique_together={('course', 'identifier')},
),
migrations.AlterUniqueTogether(
name='participationpermission',
unique_together=set([('participation', 'permission', 'argument')]),
unique_together={('participation', 'permission', 'argument')},
),
migrations.RunPython(add_default_permissions),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-09-02 23:50
from __future__ import unicode_literals
from django.db import migrations, models
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-09-03 18:12
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-09-03 18:13
from __future__ import unicode_literals
from django.db import migrations, models
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-09-12 20:04
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-10-28 08:13
from __future__ import unicode_literals
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-10-29 02:26
from __future__ import unicode_literals
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
......
# Generated by Django 1.10.3 on 2016-11-21 22:43
from django.db import migrations, models
def set_exam_listed_default(apps, schema_editor):
Exam = apps.get_model("course", "Exam")
for exam in Exam.objects.all():
exam.listed = exam.active
exam.save()
class Migration(migrations.Migration):
dependencies = [
('course', '0099_alter_gradingopportunity_identifier'),
]
operations = [
migrations.AddField(
model_name='exam',
name='listed',
field=models.BooleanField(default=True, verbose_name="Listed", help_text='Shown in the list of current exams'),
),
migrations.AlterField(
model_name='exam',
name='active',
field=models.BooleanField(default=True, verbose_name="Active", help_text='Currently active, i.e. may be used to log in via an exam ticket'),
),
migrations.RunPython(set_exam_listed_default),
]
# Generated by Django 1.10.3 on 2016-11-27 20:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0100_add_exam_listed'),
]
operations = [
migrations.AddField(
model_name='examticket',
name='restrict_to_facility',
field=models.CharField(blank=True, help_text='If not blank, this exam ticket may only be used in the given facility', max_length=200, null=True, verbose_name='Restrict to facility'),
),
migrations.AddField(
model_name='examticket',
name='valid_end_time',
field=models.DateTimeField(blank=True, help_text='If not blank, date and time at which this exam ticket stops being valid/usable', null=True, verbose_name='End valid period'),
),
migrations.AddField(
model_name='examticket',
name='valid_start_time',
field=models.DateTimeField(blank=True, help_text='If not blank, date and time at which this exam ticket starts being valid/usable', null=True, verbose_name='End valid period'),
),
migrations.AlterField(
model_name='examticket',
name='usage_time',
field=models.DateTimeField(blank=True, help_text='Date and time of first usage of ticket', null=True, verbose_name='Usage time'),
),
]
# Generated by Django 1.10.4 on 2017-04-14 00:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0101_add_ticket_facility_and_validity'),
]
operations = [
migrations.AlterField(
model_name='participationpermission',
name='permission',
field=models.CharField(choices=[('edit_course', 'Edit course'), ('use_admin_interface', 'Use admin interface'), ('impersonate_role', 'Impersonate role'), ('set_fake_time', 'Set fake time'), ('set_pretend_facility', 'Pretend to be in facility'), ('edit_course_permissions', 'Edit course permissions'), ('view_hidden_course_page', 'View hidden course page'), ('view_calendar', 'View calendar'), ('send_instant_message', 'Send instant message'), ('access_files_for', 'Access files for'), ('included_in_grade_statistics', 'Included in grade statistics'), ('edit_exam', 'Edit exam'), ('issue_exam_ticket', 'Issue exam ticket'), ('batch_issue_exam_ticket', 'Batch issue exam ticket'), ('view_participant_masked_profile', "View participants' marksed profile only"), ('view_flow_sessions_from_role', 'View flow sessions from role'), ('view_gradebook', 'View gradebook'), ('edit_grading_opportunity', 'Edit grading opportunity'), ('assign_grade', 'Assign grade'), ('view_grader_stats', 'View grader stats'), ('batch_import_grade', 'Batch-import grades'), ('batch_export_grade', 'Batch-export grades'), ('batch_download_submission', 'Batch-download submissions'), ('impose_flow_session_deadline', 'Impose flow session deadline'), ('batch_impose_flow_session_deadline', 'Batch-impose flow session deadline'), ('end_flow_session', 'End flow session'), ('batch_end_flow_session', 'Batch-end flow sessions'), ('regrade_flow_session', 'Regrade flow session'), ('batch_regrade_flow_session', 'Batch-regrade flow sessions'), ('recalculate_flow_session_grade', 'Recalculate flow session grade'), ('batch_recalculate_flow_session_grade', 'Batch-recalculate flow sesssion grades'), ('reopen_flow_session', 'Reopen flow session'), ('grant_exception', 'Grant exception'), ('view_analytics', 'View analytics'), ('preview_content', 'Preview content'), ('update_content', 'Update content'), ('use_markup_sandbox', 'Use markup sandbox'), ('use_page_sandbox', 'Use page sandbox'), ('test_flow', 'Test flow'), ('edit_events', 'Edit events'), ('query_participation', 'Query participation'), ('edit_participation', 'Edit participation'), ('preapprove_participation', 'Preapprove participation'), ('manage_instant_flow_requests', 'Manage instant flow requests')], db_index=True, max_length=200, verbose_name='Permission'),
),
migrations.AlterField(
model_name='participationrolepermission',
name='permission',
field=models.CharField(choices=[('edit_course', 'Edit course'), ('use_admin_interface', 'Use admin interface'), ('impersonate_role', 'Impersonate role'), ('set_fake_time', 'Set fake time'), ('set_pretend_facility', 'Pretend to be in facility'), ('edit_course_permissions', 'Edit course permissions'), ('view_hidden_course_page', 'View hidden course page'), ('view_calendar', 'View calendar'), ('send_instant_message', 'Send instant message'), ('access_files_for', 'Access files for'), ('included_in_grade_statistics', 'Included in grade statistics'), ('edit_exam', 'Edit exam'), ('issue_exam_ticket', 'Issue exam ticket'), ('batch_issue_exam_ticket', 'Batch issue exam ticket'), ('view_participant_masked_profile', "View participants' marksed profile only"), ('view_flow_sessions_from_role', 'View flow sessions from role'), ('view_gradebook', 'View gradebook'), ('edit_grading_opportunity', 'Edit grading opportunity'), ('assign_grade', 'Assign grade'), ('view_grader_stats', 'View grader stats'), ('batch_import_grade', 'Batch-import grades'), ('batch_export_grade', 'Batch-export grades'), ('batch_download_submission', 'Batch-download submissions'), ('impose_flow_session_deadline', 'Impose flow session deadline'), ('batch_impose_flow_session_deadline', 'Batch-impose flow session deadline'), ('end_flow_session', 'End flow session'), ('batch_end_flow_session', 'Batch-end flow sessions'), ('regrade_flow_session', 'Regrade flow session'), ('batch_regrade_flow_session', 'Batch-regrade flow sessions'), ('recalculate_flow_session_grade', 'Recalculate flow session grade'), ('batch_recalculate_flow_session_grade', 'Batch-recalculate flow sesssion grades'), ('reopen_flow_session', 'Reopen flow session'), ('grant_exception', 'Grant exception'), ('view_analytics', 'View analytics'), ('preview_content', 'Preview content'), ('update_content', 'Update content'), ('use_markup_sandbox', 'Use markup sandbox'), ('use_page_sandbox', 'Use page sandbox'), ('test_flow', 'Test flow'), ('edit_events', 'Edit events'), ('query_participation', 'Query participation'), ('edit_participation', 'Edit participation'), ('preapprove_participation', 'Preapprove participation'), ('manage_instant_flow_requests', 'Manage instant flow requests')], db_index=True, max_length=200, verbose_name='Permission'),
),
]
# Generated by Django 1.10.7 on 2017-07-14 15:32
from django.db import migrations, models
def add_skip_during_manual_grading_permission(apps, schema_editor):
from course.constants import participation_permission as pperm
ParticipationPermission = apps.get_model("course", "ParticipationPermission")
Participation = apps.get_model("course", "Participation")
target_participations = Participation.objects.filter(
roles__permissions__permission=(
pperm.assign_grade)
)
for participation in target_participations:
pp = ParticipationPermission(
participation=participation,
permission=pperm.skip_during_manual_grading)
pp.save()
class Migration(migrations.Migration):
dependencies = [
('course', '0102_add_view_participant_masked_profile_permission'),
]
operations = [
migrations.AlterField(
model_name='participationpermission',
name='permission',
field=models.CharField(choices=[('edit_course', 'Edit course'), ('use_admin_interface', 'Use admin interface'), ('impersonate_role', 'Impersonate role'), ('set_fake_time', 'Set fake time'), ('set_pretend_facility', 'Pretend to be in facility'), ('edit_course_permissions', 'Edit course permissions'), ('view_hidden_course_page', 'View hidden course page'), ('view_calendar', 'View calendar'), ('send_instant_message', 'Send instant message'), ('access_files_for', 'Access files for'), ('included_in_grade_statistics', 'Included in grade statistics'), ('skip_during_manual_grading', 'Skip during manual grading'), ('edit_exam', 'Edit exam'), ('issue_exam_ticket', 'Issue exam ticket'), ('batch_issue_exam_ticket', 'Batch issue exam ticket'), ('view_participant_masked_profile', "View participants' masked profile only"), ('view_flow_sessions_from_role', 'View flow sessions from role'), ('view_gradebook', 'View gradebook'), ('edit_grading_opportunity', 'Edit grading opportunity'), ('assign_grade', 'Assign grade'), ('view_grader_stats', 'View grader stats'), ('batch_import_grade', 'Batch-import grades'), ('batch_export_grade', 'Batch-export grades'), ('batch_download_submission', 'Batch-download submissions'), ('impose_flow_session_deadline', 'Impose flow session deadline'), ('batch_impose_flow_session_deadline', 'Batch-impose flow session deadline'), ('end_flow_session', 'End flow session'), ('batch_end_flow_session', 'Batch-end flow sessions'), ('regrade_flow_session', 'Regrade flow session'), ('batch_regrade_flow_session', 'Batch-regrade flow sessions'), ('recalculate_flow_session_grade', 'Recalculate flow session grade'), ('batch_recalculate_flow_session_grade', 'Batch-recalculate flow sesssion grades'), ('reopen_flow_session', 'Reopen flow session'), ('grant_exception', 'Grant exception'), ('view_analytics', 'View analytics'), ('preview_content', 'Preview content'), ('update_content', 'Update content'), ('use_markup_sandbox', 'Use markup sandbox'), ('use_page_sandbox', 'Use page sandbox'), ('test_flow', 'Test flow'), ('edit_events', 'Edit events'), ('query_participation', 'Query participation'), ('edit_participation', 'Edit participation'), ('preapprove_participation', 'Preapprove participation'), ('manage_instant_flow_requests', 'Manage instant flow requests')], db_index=True, max_length=200, verbose_name='Permission'),
),
migrations.AlterField(
model_name='participationrolepermission',
name='permission',
field=models.CharField(choices=[('edit_course', 'Edit course'), ('use_admin_interface', 'Use admin interface'), ('impersonate_role', 'Impersonate role'), ('set_fake_time', 'Set fake time'), ('set_pretend_facility', 'Pretend to be in facility'), ('edit_course_permissions', 'Edit course permissions'), ('view_hidden_course_page', 'View hidden course page'), ('view_calendar', 'View calendar'), ('send_instant_message', 'Send instant message'), ('access_files_for', 'Access files for'), ('included_in_grade_statistics', 'Included in grade statistics'), ('skip_during_manual_grading', 'Skip during manual grading'), ('edit_exam', 'Edit exam'), ('issue_exam_ticket', 'Issue exam ticket'), ('batch_issue_exam_ticket', 'Batch issue exam ticket'), ('view_participant_masked_profile', "View participants' masked profile only"), ('view_flow_sessions_from_role', 'View flow sessions from role'), ('view_gradebook', 'View gradebook'), ('edit_grading_opportunity', 'Edit grading opportunity'), ('assign_grade', 'Assign grade'), ('view_grader_stats', 'View grader stats'), ('batch_import_grade', 'Batch-import grades'), ('batch_export_grade', 'Batch-export grades'), ('batch_download_submission', 'Batch-download submissions'), ('impose_flow_session_deadline', 'Impose flow session deadline'), ('batch_impose_flow_session_deadline', 'Batch-impose flow session deadline'), ('end_flow_session', 'End flow session'), ('batch_end_flow_session', 'Batch-end flow sessions'), ('regrade_flow_session', 'Regrade flow session'), ('batch_regrade_flow_session', 'Batch-regrade flow sessions'), ('recalculate_flow_session_grade', 'Recalculate flow session grade'), ('batch_recalculate_flow_session_grade', 'Batch-recalculate flow sesssion grades'), ('reopen_flow_session', 'Reopen flow session'), ('grant_exception', 'Grant exception'), ('view_analytics', 'View analytics'), ('preview_content', 'Preview content'), ('update_content', 'Update content'), ('use_markup_sandbox', 'Use markup sandbox'), ('use_page_sandbox', 'Use page sandbox'), ('test_flow', 'Test flow'), ('edit_events', 'Edit events'), ('query_participation', 'Query participation'), ('edit_participation', 'Edit participation'), ('preapprove_participation', 'Preapprove participation'), ('manage_instant_flow_requests', 'Manage instant flow requests')], db_index=True, max_length=200, verbose_name='Permission'),
),
migrations.RunPython(add_skip_during_manual_grading_permission)
]
from django.db import migrations
def remove_mistakenly_added_individual_pperm(apps, schema_editor):
from course.constants import participation_permission as pperm
ParticipationPermission = apps.get_model("course", "ParticipationPermission")
Participation = apps.get_model("course", "Participation")
target_participations = Participation.objects.filter(
individual_permissions__permission=(
pperm.skip_during_manual_grading)
)
for participation in target_participations:
ParticipationPermission.objects.filter(
participation=participation,
permission=pperm.skip_during_manual_grading).delete()
def add_skip_during_manual_grading_permission_to_roles(apps, schema_editor):
from course.constants import participation_permission as pperm
ParticipationRolePermission = apps.get_model("course", "ParticipationRolePermission")
roles_pks = (
ParticipationRolePermission.objects.filter(
permission=pperm.assign_grade)
.values_list("role", flat=True)
)
if roles_pks.count():
for pk in roles_pks:
ParticipationRolePermission.objects.get_or_create(
role_id=pk,
permission=pperm.skip_during_manual_grading
)
class Migration(migrations.Migration):
dependencies = [
('course', '0103_skip_during_manual_grading_permission'),
]
operations = [
migrations.RunPython(remove_mistakenly_added_individual_pperm),
migrations.RunPython(add_skip_during_manual_grading_permission_to_roles)
]
# Generated by Django 1.11.5 on 2017-09-21 03:50
import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('course', '0104_add_skip_during_manual_grading_permission_to_roles'),
]
operations = [
migrations.CreateModel(
name='AuthenticationToken',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('description', models.CharField(max_length=200, verbose_name='Description')),
('creation_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Creation time')),
('last_use_time', models.DateTimeField(blank=True, null=True, verbose_name='Last use time')),
('valid_until', models.DateTimeField(blank=True, default=None, null=True, verbose_name='Valid until')),
('revocation_time', models.DateTimeField(blank=True, default=None, null=True, verbose_name='Revocation time')),
('token_hash', models.CharField(blank=True, help_text='A hash of the authentication token to be used for direct git access.', max_length=200, null=True, unique=True, verbose_name='Hash of git authentication token')),
('participation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Participation', verbose_name='Participation')),
('restrict_to_participation_role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='course.ParticipationRole', verbose_name='Restrict to role')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User ID')),
],
),
]
from django.db import migrations
def add_manage_auth_tokens_permission(apps, schema_editor):
from course.constants import participation_permission as pperm
ParticipationRolePermission = apps.get_model("course", "ParticipationRolePermission")
roles_pks = (
ParticipationRolePermission.objects.filter(
permission=pperm.edit_course)
.values_list("role", flat=True)
)
if roles_pks.count():
for pk in roles_pks:
ParticipationRolePermission.objects.get_or_create(
role_id=pk,
permission=pperm.manage_authentication_tokens
)
class Migration(migrations.Migration):
dependencies = [
('course', '0105_authenticationtoken'),
]
operations = [
migrations.RunPython(add_manage_auth_tokens_permission)
]
# Generated by Django 1.10.7 on 2017-12-19 02:37
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('course', '0106_add_auth_tokens_permission'),
]
operations = [
migrations.RenameField(
model_name='flowpagedata',
old_name='ordinal',
new_name='page_ordinal',
),
]
# Generated by Django 1.10.7 on 2017-12-19 02:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0107_rename_flowpagedata_ordinal_to_page_ordinal'),
]
operations = [
migrations.AlterField(
model_name='flowpagedata',
name='page_ordinal',
field=models.IntegerField(blank=True, null=True, verbose_name='Page ordinal'),
),
]
# Generated by Django 1.10.7 on 2017-12-19 02:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0108_alter_page_ordinal_verbose_name'),
]
operations = [
migrations.AlterField(
model_name='participationpermission',
name='permission',
field=models.CharField(choices=[('edit_course', 'Edit course'), ('use_admin_interface', 'Use admin interface'), ('manage_authentication_tokens', 'Manage authentication tokens'), ('impersonate_role', 'Impersonate role'), ('set_fake_time', 'Set fake time'), ('set_pretend_facility', 'Pretend to be in facility'), ('edit_course_permissions', 'Edit course permissions'), ('view_hidden_course_page', 'View hidden course page'), ('view_calendar', 'View calendar'), ('send_instant_message', 'Send instant message'), ('access_files_for', 'Access files for'), ('included_in_grade_statistics', 'Included in grade statistics'), ('skip_during_manual_grading', 'Skip during manual grading'), ('edit_exam', 'Edit exam'), ('issue_exam_ticket', 'Issue exam ticket'), ('batch_issue_exam_ticket', 'Batch issue exam ticket'), ('view_participant_masked_profile', "View participants' masked profile only"), ('view_flow_sessions_from_role', 'View flow sessions from role'), ('view_gradebook', 'View gradebook'), ('edit_grading_opportunity', 'Edit grading opportunity'), ('assign_grade', 'Assign grade'), ('view_grader_stats', 'View grader stats'), ('batch_import_grade', 'Batch-import grades'), ('batch_export_grade', 'Batch-export grades'), ('batch_download_submission', 'Batch-download submissions'), ('impose_flow_session_deadline', 'Impose flow session deadline'), ('batch_impose_flow_session_deadline', 'Batch-impose flow session deadline'), ('end_flow_session', 'End flow session'), ('batch_end_flow_session', 'Batch-end flow sessions'), ('regrade_flow_session', 'Regrade flow session'), ('batch_regrade_flow_session', 'Batch-regrade flow sessions'), ('recalculate_flow_session_grade', 'Recalculate flow session grade'), ('batch_recalculate_flow_session_grade', 'Batch-recalculate flow sesssion grades'), ('reopen_flow_session', 'Reopen flow session'), ('grant_exception', 'Grant exception'), ('view_analytics', 'View analytics'), ('preview_content', 'Preview content'), ('update_content', 'Update content'), ('use_markup_sandbox', 'Use markup sandbox'), ('use_page_sandbox', 'Use page sandbox'), ('test_flow', 'Test flow'), ('edit_events', 'Edit events'), ('query_participation', 'Query participation'), ('edit_participation', 'Edit participation'), ('preapprove_participation', 'Preapprove participation'), ('manage_instant_flow_requests', 'Manage instant flow requests')], db_index=True, max_length=200, verbose_name='Permission'),
),
migrations.AlterField(
model_name='participationrolepermission',
name='permission',
field=models.CharField(choices=[('edit_course', 'Edit course'), ('use_admin_interface', 'Use admin interface'), ('manage_authentication_tokens', 'Manage authentication tokens'), ('impersonate_role', 'Impersonate role'), ('set_fake_time', 'Set fake time'), ('set_pretend_facility', 'Pretend to be in facility'), ('edit_course_permissions', 'Edit course permissions'), ('view_hidden_course_page', 'View hidden course page'), ('view_calendar', 'View calendar'), ('send_instant_message', 'Send instant message'), ('access_files_for', 'Access files for'), ('included_in_grade_statistics', 'Included in grade statistics'), ('skip_during_manual_grading', 'Skip during manual grading'), ('edit_exam', 'Edit exam'), ('issue_exam_ticket', 'Issue exam ticket'), ('batch_issue_exam_ticket', 'Batch issue exam ticket'), ('view_participant_masked_profile', "View participants' masked profile only"), ('view_flow_sessions_from_role', 'View flow sessions from role'), ('view_gradebook', 'View gradebook'), ('edit_grading_opportunity', 'Edit grading opportunity'), ('assign_grade', 'Assign grade'), ('view_grader_stats', 'View grader stats'), ('batch_import_grade', 'Batch-import grades'), ('batch_export_grade', 'Batch-export grades'), ('batch_download_submission', 'Batch-download submissions'), ('impose_flow_session_deadline', 'Impose flow session deadline'), ('batch_impose_flow_session_deadline', 'Batch-impose flow session deadline'), ('end_flow_session', 'End flow session'), ('batch_end_flow_session', 'Batch-end flow sessions'), ('regrade_flow_session', 'Regrade flow session'), ('batch_regrade_flow_session', 'Batch-regrade flow sessions'), ('recalculate_flow_session_grade', 'Recalculate flow session grade'), ('batch_recalculate_flow_session_grade', 'Batch-recalculate flow sesssion grades'), ('reopen_flow_session', 'Reopen flow session'), ('grant_exception', 'Grant exception'), ('view_analytics', 'View analytics'), ('preview_content', 'Preview content'), ('update_content', 'Update content'), ('use_markup_sandbox', 'Use markup sandbox'), ('use_page_sandbox', 'Use page sandbox'), ('test_flow', 'Test flow'), ('edit_events', 'Edit events'), ('query_participation', 'Query participation'), ('edit_participation', 'Edit participation'), ('preapprove_participation', 'Preapprove participation'), ('manage_instant_flow_requests', 'Manage instant flow requests')], db_index=True, max_length=200, verbose_name='Permission'),
),
]