From 5c540c394f476487bb69afeeb2ebc6283939968d Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Tue, 23 Jan 2024 12:37:34 -0500 Subject: [PATCH 01/10] Add extra permissions and link permisions with views --- tabbycat/adjallocation/views.py | 20 +++++++++++++++++- tabbycat/availability/views.py | 13 ++++++++++++ tabbycat/draw/views.py | 11 +++++++++- tabbycat/importer/views.py | 5 +++++ tabbycat/motions/views.py | 7 +++++-- tabbycat/options/views.py | 3 +++ tabbycat/participants/views.py | 6 +++++- tabbycat/privateurls/views.py | 5 ++++- tabbycat/results/views.py | 2 ++ tabbycat/standings/views.py | 3 +++ tabbycat/users/permissions.py | 37 ++++++++++++++++++++++----------- tabbycat/venues/views.py | 4 ++++ 12 files changed, 98 insertions(+), 18 deletions(-) diff --git a/tabbycat/adjallocation/views.py b/tabbycat/adjallocation/views.py index fed70adbd48..e89369320ab 100644 --- a/tabbycat/adjallocation/views.py +++ b/tabbycat/adjallocation/views.py @@ -13,7 +13,7 @@ from participants.models import Adjudicator, Region from participants.prefetch import populate_feedback_scores from tournaments.mixins import DebateDragAndDropMixin, TournamentMixin -from users.permissions import has_permission +from users.permissions import Permission, has_permission from utils.misc import ranks_dictionary, redirect_tournament, reverse_tournament from utils.mixins import AdministratorMixin from utils.views import ModelFormSetView @@ -91,6 +91,9 @@ class EditDebateAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView): page_title = gettext_lazy("Edit Allocation") prefetch_adjs = True # Fetched in full as get_serialised + view_permission = Permission.VIEW_DEBATEADJUDICATORS + edit_permission = Permission.EDIT_DEBATEADJUDICATORS + def get_extra_info(self): info = super().get_extra_info() return info @@ -105,6 +108,9 @@ class EditPanelAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView): template_name = "edit_panel_adjudicators.html" page_title = gettext_lazy("Edit Panels") + view_permission = Permission.VIEW_PREFORMEDPANELS + edit_permission = Permission.EDIT_PREFORMEDPANELS + def get_extra_info(self): info = super().get_extra_info() info['backUrl'] = reverse_tournament('panel-adjudicators-index', @@ -187,6 +193,9 @@ def formset_valid(self, formset): class AdjudicatorTeamConflictsView(BaseAdjudicatorConflictsView): + view_permission = Permission.VIEW_ADJ_TEAM_CONFLICTS + edit_permission = Permission.EDIT_ADJ_TEAM_CONFLICTS + action_log_type = ActionLogEntry.ACTION_TYPE_CONFLICTS_ADJ_TEAM_EDIT formset_model = AdjudicatorTeamConflict page_title = gettext_lazy("Adjudicator-Team Conflicts") @@ -231,6 +240,9 @@ def add_message(self, nsaved, ndeleted): class AdjudicatorAdjudicatorConflictsView(BaseAdjudicatorConflictsView): + view_permission = Permission.VIEW_ADJ_ADJ_CONFLICTS + edit_permission = Permission.EDIT_ADJ_ADJ_CONFLICTS + action_log_type = ActionLogEntry.ACTION_TYPE_CONFLICTS_ADJ_ADJ_EDIT formset_model = AdjudicatorAdjudicatorConflict page_title = gettext_lazy("Adjudicator-Adjudicator Conflicts") @@ -271,6 +283,9 @@ def add_message(self, nsaved, ndeleted): class AdjudicatorInstitutionConflictsView(BaseAdjudicatorConflictsView): + view_permission = Permission.VIEW_ADJ_INST_CONFLICTS + edit_permission = Permission.EDIT_ADJ_INST_CONFLICTS + action_log_type = ActionLogEntry.ACTION_TYPE_CONFLICTS_ADJ_INST_EDIT formset_model = AdjudicatorInstitutionConflict page_title = gettext_lazy("Adjudicator-Institution Conflicts") @@ -310,6 +325,9 @@ def add_message(self, nsaved, ndeleted): class TeamInstitutionConflictsView(BaseAdjudicatorConflictsView): + view_permission = Permission.VIEW_TEAM_INST_CONFLICTS + edit_permission = Permission.EDIT_TEAM_INST_CONFLICTS + action_log_type = ActionLogEntry.ACTION_TYPE_CONFLICTS_TEAM_INST_EDIT formset_model = TeamInstitutionConflict page_title = gettext_lazy("Team-Institution Conflicts") diff --git a/tabbycat/availability/views.py b/tabbycat/availability/views.py index 09a4a3e382e..86ec36440bb 100644 --- a/tabbycat/availability/views.py +++ b/tabbycat/availability/views.py @@ -21,6 +21,7 @@ from draw.models import Debate from participants.models import Adjudicator, Team from tournaments.mixins import RoundMixin +from users.permissions import Permission from utils.misc import reverse_round from utils.mixins import AdministratorMixin from utils.tables import TabbycatTableBuilder @@ -206,6 +207,10 @@ def get_table(self): class AvailabilityTypeTeamView(AvailabilityTypeBase): + + view_permission = Permission.VIEW_ROUNDAVAILABILITIES_TEAM + edit_permission = Permission.EDIT_ROUNDAVAILABILITIES_TEAM + page_title = gettext_lazy("Team Availability") page_emoji = '👂' model = Team @@ -225,6 +230,10 @@ def annotate_checkins(queryset, t): class AvailabilityTypeAdjudicatorView(AvailabilityTypeBase): + + view_permission = Permission.VIEW_ROUNDAVAILABILITIES_ADJ + edit_permission = Permission.EDIT_ROUNDAVAILABILITIES_ADJ + page_title = gettext_lazy("Adjudicator Availability") page_emoji = '👂' model = Adjudicator @@ -244,6 +253,10 @@ def annotate_checkins(queryset, t): class AvailabilityTypeVenueView(AvailabilityTypeBase): + + view_permission = Permission.VIEW_ROUNDAVAILABILITIES_VENUE + edit_permission = Permission.EDIT_ROUNDAVAILABILITIES_VENUE + page_title = gettext_lazy("Room Availability") page_emoji = '🎪' model = Venue diff --git a/tabbycat/draw/views.py b/tabbycat/draw/views.py index 4859ae37d5e..717ef15d83f 100644 --- a/tabbycat/draw/views.py +++ b/tabbycat/draw/views.py @@ -34,6 +34,7 @@ TournamentMixin) from tournaments.models import Round from tournaments.utils import get_side_name +from users.permissions import Permission from utils.misc import reverse_round, reverse_tournament from utils.mixins import AdministratorMixin from utils.tables import TabbycatTableBuilder @@ -445,6 +446,8 @@ def get_queryset(self): class AdminDrawView(RoundMixin, AdministratorMixin, AdminDrawUtilitiesMixin, VueTableTemplateView): detailed = False + view_permission = Permission.VIEW_ADMIN_DRAW + def get_page_title(self): round = self.round self.page_emoji = '👀' @@ -571,6 +574,7 @@ class AdminDrawWithDetailsView(AdminDrawView): detailed = True page_emoji = '👀' use_template_subtitle = False # Use the "for Round n" subtitle + view_permission = Permission.VIEW_ADMIN_DRAW def get_page_title(self): return _("Draw with Details") @@ -655,7 +659,7 @@ class DrawStatusEdit(LogActionMixin, AdministratorMixin, RoundMixin, PostOnlyRed class CreateDrawView(DrawStatusEdit): - + edit_permission = Permission.GENERATE_DEBATE action_log_type = ActionLogEntry.ACTION_TYPE_DRAW_CREATE def post(self, request, *args, **kwargs): @@ -741,6 +745,7 @@ class ConfirmDrawRegenerationView(AdministratorMixin, TemplateView): class DrawReleaseView(DrawStatusEdit): + edit_permission = Permission.RELEASE_DRAW action_log_type = ActionLogEntry.ACTION_TYPE_DRAW_RELEASE round_redirect_pattern_name = 'draw-display' @@ -761,6 +766,7 @@ def post(self, request, *args, **kwargs): class DrawUnreleaseView(DrawStatusEdit): + edit_permission = Permission.UNRELEASE_DRAW action_log_type = ActionLogEntry.ACTION_TYPE_DRAW_UNRELEASE round_redirect_pattern_name = 'draw-display' @@ -777,6 +783,7 @@ def post(self, request, *args, **kwargs): class SetRoundStartTimeView(DrawStatusEdit): + edit_permission = Permission.EDIT_STARTTIME action_log_type = ActionLogEntry.ACTION_TYPE_ROUND_START_TIME_SET round_redirect_pattern_name = 'draw-display' @@ -828,6 +835,7 @@ def get_table(self): class SideAllocationsView(AdministratorMixin, BaseSideAllocationsView): + edit_permission = Permission.EDIT_ALLOCATESIDES pass @@ -839,6 +847,7 @@ class EditDebateTeamsView(DebateDragAndDropMixin, AdministratorMixin, TemplateVi template_name = "edit_debate_teams.html" page_title = gettext_lazy("Edit Matchups") prefetch_teams = False # Fetched in full as get_serialised + edit_permission = Permission.EDIT_DEBATETEAMS def get_serialised_allocatable_items(self): # TODO: account for shared teams diff --git a/tabbycat/importer/views.py b/tabbycat/importer/views.py index 12aeacf59c1..ed3b84b1fa4 100644 --- a/tabbycat/importer/views.py +++ b/tabbycat/importer/views.py @@ -22,6 +22,7 @@ from participants.utils import populate_code_names from tournaments.mixins import TournamentMixin from tournaments.models import Tournament +from users.permissions import Permission from utils.misc import redirect_tournament, reverse_tournament from utils.mixins import AdministratorMixin from utils.views import PostOnlyRedirectView @@ -97,6 +98,7 @@ def done(self, form_list, form_dict, **kwargs): class ImportInstitutionsWizardView(BaseImportWizardView): model = Institution + edit_permission = Permission.ADD_INSTS form_list = [ ('raw', ImportInstitutionsRawForm), ('details', modelformset_factory(Institution, fields=('name', 'code'), extra=0)), @@ -112,6 +114,7 @@ def get_message(self, count): class ImportVenuesWizardView(BaseImportWizardView): model = Venue + edit_permission = Permission.ADD_ROOMS form_list = [ ('raw', ImportVenuesRawForm), ('details', modelformset_factory(Venue, form=VenueDetailsForm, extra=0)), @@ -171,6 +174,7 @@ def get_details_instance_initial(self): class ImportTeamsWizardView(BaseImportByInstitutionWizardView): model = Team + edit_permission = Permission.ADD_TEAMS form_list = [ ('numbers', ImportTeamsNumbersForm), ('details', modelformset_factory(Team, form=TeamDetailsForm, formset=TeamDetailsFormSet, extra=0)), @@ -193,6 +197,7 @@ def get_message(self, count): class ImportAdjudicatorsWizardView(BaseImportByInstitutionWizardView): model = Adjudicator + edit_permission = Permission.ADD_ADJS form_list = [ ('numbers', ImportAdjudicatorsNumbersForm), ('details', modelformset_factory(Adjudicator, form=AdjudicatorDetailsForm, extra=0)), diff --git a/tabbycat/motions/views.py b/tabbycat/motions/views.py index aaa6ddebf72..1d20db14c82 100644 --- a/tabbycat/motions/views.py +++ b/tabbycat/motions/views.py @@ -14,6 +14,7 @@ from tournaments.mixins import (CurrentRoundMixin, OptionalAssistantTournamentPageMixin, PublicTournamentPageMixin, RoundMixin, TournamentMixin) from tournaments.models import Round +from users.permissions import Permission from utils.misc import redirect_round from utils.mixins import AdministratorMixin from utils.views import ModelFormSetView, PostOnlyRedirectView @@ -43,7 +44,8 @@ def get_context_data(self, **kwargs): class EditMotionsView(AdministratorMixin, LogActionMixin, RoundMixin, ModelFormSetView): # Django doesn't have a class-based view for formsets, so this implements # the form processing analogously to FormView, with less decomposition. - + view_permission = Permission.VIEW_MOTION + edit_permission = Permission.EDIT_MOTION template_name = 'motions_edit.html' action_log_type = ActionLogEntry.ACTION_TYPE_MOTION_EDIT formset_model = Motion @@ -167,7 +169,7 @@ def post(self, request, *args, **kwargs): class ReleaseMotionsView(BaseReleaseMotionsView): - + edit_permission = Permission.RELEASE_MOTION action_log_type = ActionLogEntry.ACTION_TYPE_MOTIONS_RELEASE motions_released = True @@ -266,6 +268,7 @@ class AdminRoundMotionStatisticsView(AdministratorMixin, RoundMotionStatisticsVi class AdminGlobalMotionStatisticsView(AdministratorMixin, GlobalMotionStatisticsView): + view_permission = Permission.VIEW_MOTIONSTAB pass diff --git a/tabbycat/options/views.py b/tabbycat/options/views.py index 5eeb43b0c3c..f50857fb063 100644 --- a/tabbycat/options/views.py +++ b/tabbycat/options/views.py @@ -12,6 +12,7 @@ from actionlog.mixins import LogActionMixin from actionlog.models import ActionLogEntry from tournaments.mixins import TournamentMixin +from users.permissions import Permission from utils.misc import reverse_tournament from utils.mixins import AdministratorMixin @@ -23,6 +24,8 @@ class TournamentConfigIndexView(AdministratorMixin, TournamentMixin, TemplateView): + view_permission = Permission.VIEW_TOURNAMENTPREFERENCEMODEL + edit_permission = Permission.EDIT_TOURNAMENTPREFERENCEMODEL template_name = "preferences_index.html" def get_preset_options(self): diff --git a/tabbycat/participants/views.py b/tabbycat/participants/views.py index 83ed2561f85..0b51b1a7a19 100644 --- a/tabbycat/participants/views.py +++ b/tabbycat/participants/views.py @@ -22,6 +22,7 @@ from tournaments.mixins import (PublicTournamentPageMixin, SingleObjectFromTournamentMixin, TournamentMixin) from tournaments.models import Round +from users.permissions import Permission from utils.misc import redirect_tournament, reverse_tournament from utils.mixins import AdministratorMixin, AssistantMixin from utils.tables import TabbycatTableBuilder @@ -69,6 +70,7 @@ def get_context_data(self, **kwargs): class AdminParticipantsListView(AdministratorMixin, BaseParticipantsListView): + view_permission = [Permission.VIEW_TEAMS, Permission.VIEW_ADJS] template_name = 'participants_list.html' admin = True @@ -118,6 +120,7 @@ def get_table(self): class AdminInstitutionsListView(AdministratorMixin, BaseInstitutionsListView): + view_permission = Permission.VIEW_INSTS template_name = 'participants_list.html' admin = True @@ -323,7 +326,7 @@ class EditSpeakerCategoriesView(LogActionMixin, AdministratorMixin, TournamentMi # uniqueness checks will work. Since this is a superuser form, they can # access all tournaments anyway, so tournament forgery wouldn't be a # security risk. - + view_permission = Permission.VIEW_SPEAKER_CATEGORIES template_name = 'speaker_categories_edit.html' formset_model = SpeakerCategory action_log_type = ActionLogEntry.ACTION_TYPE_SPEAKER_CATEGORIES_EDIT @@ -386,6 +389,7 @@ class EditSpeakerCategoryEligibilityView(AdministratorMixin, TournamentMixin, Vu template_name = 'edit_speaker_eligibility.html' page_title = _("Speaker Category Eligibility") page_emoji = '🍯' + edit_permission = Permission.EDIT_SPEAKER_CATEGORIES def get_table(self): table = TabbycatTableBuilder(view=self, sort_key='team') diff --git a/tabbycat/privateurls/views.py b/tabbycat/privateurls/views.py index f49ebcc465d..05b2ff96079 100644 --- a/tabbycat/privateurls/views.py +++ b/tabbycat/privateurls/views.py @@ -17,6 +17,7 @@ from participants.views import BaseRecordView from tournaments.mixins import PersonalizablePublicTournamentPageMixin, SingleObjectByRandomisedUrlMixin, TournamentMixin from tournaments.models import Round +from users.permissions import Permission from utils.misc import reverse_tournament from utils.mixins import AdministratorMixin from utils.tables import TabbycatTableBuilder @@ -60,6 +61,7 @@ def get_participants_to_email(self, already_sent: bool = False) -> 'QuerySet[Per class RandomisedUrlsView(RandomisedUrlsMixin, VueTableTemplateView): + view_permission = Permission.VIEW_PRIVATE_URLS template_name = 'private_urls.html' tables_orientation = 'columns' @@ -113,6 +115,7 @@ def get_tables(self) -> List[TabbycatTableBuilder]: class GenerateRandomisedUrlsView(AdministratorMixin, TournamentMixin, PostOnlyRedirectView): tournament_redirect_pattern_name = 'privateurls-list' + edit_permission = Permission.GENERATE_PRIVATE_URLS def post(self, request: 'HttpRequest', *args, **kwargs) -> 'HttpResponseRedirect': tournament = self.tournament @@ -149,7 +152,7 @@ def post(self, request: 'HttpRequest', *args, **kwargs) -> 'HttpResponseRedirect class EmailRandomisedUrlsView(RoleColumnMixin, TournamentTemplateEmailCreateView): page_subtitle = _("Private URLs") - + edit_permission = Permission.SEND_PRIVATE_URLS event = BulkNotification.EventType.URL subject_template = 'url_email_subject' message_template = 'url_email_message' diff --git a/tabbycat/results/views.py b/tabbycat/results/views.py index fb679c70163..479742de3d1 100644 --- a/tabbycat/results/views.py +++ b/tabbycat/results/views.py @@ -31,6 +31,7 @@ RoundMixin, SingleObjectByRandomisedUrlMixin, SingleObjectFromTournamentMixin, TournamentMixin) from tournaments.models import Round +from users.permissions import Permission from utils.misc import get_ip_address, reverse_round, reverse_tournament from utils.mixins import AdministratorMixin, AssistantMixin from utils.tables import TabbycatTableBuilder @@ -378,6 +379,7 @@ def post(self, request, *args, **kwargs): class AdministratorBallotSetMixin(AdministratorMixin): template_name = 'ballot_entry.html' + edit_permission = Permission.ADD_BALLOTSUBMISSIONS tabroom = True def get_success_url(self): diff --git a/tabbycat/standings/views.py b/tabbycat/standings/views.py index b7cdd2dbc33..d40813bb4f4 100644 --- a/tabbycat/standings/views.py +++ b/tabbycat/standings/views.py @@ -18,6 +18,7 @@ from results.models import SpeakerScore, TeamScore from tournaments.mixins import PublicTournamentPageMixin, RoundMixin, SingleObjectFromTournamentMixin, TournamentMixin from tournaments.models import Round +from users.permissions import Permission from utils.misc import reverse_tournament from utils.mixins import AdministratorMixin from utils.tables import TabbycatTableBuilder @@ -483,6 +484,7 @@ def populate_result_missing(self, standings): class TeamStandingsView(AdministratorMixin, BaseTeamStandingsView): + view_permission = Permission.VIEW_TEAMSTANDINGS """Superuser team standings view.""" template_name = 'team_standings.html' # add info alerts rankings = ('rank',) @@ -621,6 +623,7 @@ def get_context_data(self, **kwargs): class DiversityStandingsView(AdministratorMixin, BaseDiversityStandingsView): for_public = False + view_permission = Permission.VIEW_DIVERSITYTAB class PublicDiversityStandingsView(PublicTournamentPageMixin, BaseDiversityStandingsView): diff --git a/tabbycat/users/permissions.py b/tabbycat/users/permissions.py index 9dd7c832de5..98413f0b40c 100644 --- a/tabbycat/users/permissions.py +++ b/tabbycat/users/permissions.py @@ -25,6 +25,12 @@ class Permission(TextChoices): VIEW_TEAMS = 'view.team', _("view teams") ADD_TEAMS = 'add.team', _("add teams") + VIEW_ADJS = 'view.adj', _("view adjudicators") + ADD_ADJS = 'add.adj', _("add adjudicators") + VIEW_ROOMS = 'view.room', _("view rooms") + ADD_ROOMS = 'add.room', _("add rooms") + VIEW_INSTS = 'view.inst', _("view institutions") + ADD_INSTS = 'add.inst', _("add institutions") VIEW_ROUNDAVAILABILITIES_TEAM = 'view.roundavailability.team', _("view round availabilities for teams") VIEW_ROUNDAVAILABILITIES_ADJ = 'view.roundavailability.adjudicator', _("view round availabilities for adjudicators") @@ -33,6 +39,11 @@ class Permission(TextChoices): EDIT_ROUNDAVAILABILITIES_ADJ = 'edit.roundavailability.adjudicator', _("edit round availabilities for adjudicators") EDIT_ROUNDAVAILABILITIES_VENUE = 'edit.roundavailability.venue', _("edit round availabilities for rooms") + VIEW_ROOMCONSTRAINTS = 'view.roomconstraints', _("view room constraints") + VIEW_ROOMCATEGORIES = 'view.roomcategories', _("view room categories") + EDIT_ROOMCONSTRAINTS = 'edit.roomconstraints', _("edit room constraints") + EDIT_ROOMCATEGORIES = 'edit.roomcategories', _("edit room categories") + VIEW_DEBATES = 'view.debate', _("view debates (draw)") VIEW_ADMIN_DRAW = 'view.debate.admin', _("view debates (detailed draw)") GENERATE_DEBATE = 'generate.debate', _("generate debates (draw)") @@ -57,21 +68,18 @@ class Permission(TextChoices): VIEW_MOTION = 'view.roundmotion', _("view motion per round") EDIT_MOTION = 'edit.roundmotion', _("edit motion per round") - EDIT_RELEASEDRAW = 'edit.releasedraw', _("release draw to public") - EDIT_RELEASEMOTION = 'edit.releasemotion', _("release motion to public") + RELEASE_DRAW = 'release.draw', _("release draw to public") + RELEASE_MOTION = 'release.motion', _("release motion to public") + UNRELEASE_DRAW = 'unrelease.draw', _("unrelease draw to public") + UNRELEASE_MOTION = 'unrelease.motion', _("unrelease motion to public") EDIT_STARTTIME = 'edit.starttime', _("add debate start time") - # these permissions are already assigned to the assistants - VIEW_ALLCURRENTDRAWS_ROOM = 'view.allcurrentdrawsroom', _("view all current draws by room") - VIEW_ALLCURRENTDRAWS_TEAM = 'view.allcurrentdrawsteam', _("view all current draws by team") - VIEW_ROUNDDRAW_ROOM = 'view.rounddrawroom', _("view current round draw by room") - VIEW_ROUNDDRAW_TEAM = 'view.rounddrawteam', _("view current round draw by team") - VIEW_DISPLAYMOTION = 'view.displaymotion', _("view display room motion page") + VIEW_DRAW = 'view.draw', _("view draws") VIEW_TOURNAMENTPREFERENCEMODEL = 'view.tournamentpreferencemodel', _("view tournament configuration") EDIT_TOURNAMENTPREFERENCEMODEL = 'edit.tournamentpreferencemodel', _("edit tournament configuration") VIEW_PREFORMEDPANELS = 'view.preformedpanels', _("view existing preformed panels") - EDIT_PREFORMEDPANELS = 'edit.preformedpanels', _("edit existing preformed panels") + EDIT_PREFORMEDPANELS = 'edit.preformedpanels', _("edit preformed panels") # standings tab VIEW_STANDINGS_OVERVIEW = 'view.standingsoverview', _("view the overviews of standings") @@ -82,9 +90,7 @@ class Permission(TextChoices): VIEW_DIVERSITYTAB = 'view.diversitytab', _("view the diversity tab") # Feedback tab - VIEW_FEEDBACK_OVERVIEW = 'view.feedbackoverview', _("view overview of judge feedback scores") - EDIT_FEEDBACK_OVERVIEW = 'edit.feedbackoverview', _("edit overview of judge feedback scores") - # not sure what the right most column of the overview page is called, but I'm calling it comments for now + VIEW_FEEDBACK_OVERVIEW = 'view.feedbackoverview', _("view overview of judge feedback") EDIT_JUDGESCORES_BULK = 'edit.judgescoresbulk', _("bulk update judge scores") EDIT_BASEJUDGESCORES_IND = 'edit.judgescoresind', _("edit base scores of judges") EDIT_SETBREAKING = 'edit.setbreaking', _("edit breaking judges") @@ -94,6 +100,7 @@ class Permission(TextChoices): VIEW_FEEDBACK_UNSUBMITTED = 'view.feedbackunsubmitted', _("view feedback unsubmitted tab") ADD_FEEDBACK = 'add.feedback', _("add feedback") VIEW_ADJ_BREAK = 'view.adj.break', _("view adjudicator break") + EDIT_ADJ_BREAK = 'edit.adj.break', _("edit adjudicator break") # idk if its possible for them to add feedback everywhere, considering there is add feedback on multiple pages # breaks @@ -101,10 +108,16 @@ class Permission(TextChoices): VIEW_BREAK_ELIGIBILITY = 'view.breakeligibility', _("view break eligibility") EDIT_BREAK_CATEGORIES = 'edit.breakcategories', _("edit break categories") VIEW_BREAK_CATEGORIES = 'view.breakcategories', _("view break categories") + VIEW_SPEAKER_CATEGORIES = 'view.speakercategories', _("view speaker categories") + EDIT_SPEAKER_CATEGORIES = 'edit.speakercategories', _("edit speaker categories") VIEW_BREAK_OVERVIEW = 'view.break.overview', _("view break overview") VIEW_BREAK = 'view.break', _("view breaks") GENERATE_BREAK = 'generate.break', _("generate all breaks") + VIEW_PRIVATE_URLS = 'view.privateurls', _("view private urls") + GENERATE_PRIVATE_URLS = 'generate.privateurls', _("generate private urls") + # need to get rid of generate private urls soons + SEND_PRIVATE_URLS = 'send.privateurls', _("send private urls") permission_type = Union[Permission, bool] diff --git a/tabbycat/venues/views.py b/tabbycat/venues/views.py index a64295e62f8..9f66e84e14f 100644 --- a/tabbycat/venues/views.py +++ b/tabbycat/venues/views.py @@ -10,6 +10,7 @@ from actionlog.models import ActionLogEntry from availability.utils import annotate_availability from tournaments.mixins import DebateDragAndDropMixin, TournamentMixin +from users.permissions import Permission from utils.forms import SelectPrepopulated from utils.misc import ranks_dictionary, redirect_tournament, reverse_tournament from utils.mixins import AdministratorMixin @@ -23,6 +24,7 @@ class EditDebateVenuesView(DebateDragAndDropMixin, AdministratorMixin, TemplateView): + edit_permission = Permission.ADD_ROOMS template_name = "edit_debate_venues.html" page_title = gettext_lazy("Edit Rooms") prefetch_venues = False # Fetched in full as get_serialised @@ -50,6 +52,7 @@ def get_extra_info(self): class VenueCategoriesView(LogActionMixin, AdministratorMixin, TournamentMixin, ModelFormSetView): + view_permission = Permission.VIEW_ROOMCATEGORIES template_name = 'venue_categories_edit.html' formset_model = VenueCategory action_log_type = ActionLogEntry.ACTION_TYPE_VENUE_CATEGORIES_EDIT @@ -97,6 +100,7 @@ def get_success_url(self, *args, **kwargs): class VenueConstraintsView(AdministratorMixin, LogActionMixin, TournamentMixin, ModelFormSetView): + view_permission = Permission.VIEW_ROOMCONSTRAINTS template_name = 'venue_constraints_edit.html' formset_model = VenueConstraint action_log_type = ActionLogEntry.ACTION_TYPE_VENUE_CONSTRAINTS_EDIT From c4d125f6d265e51eb49dc0d3caa43defa5780df6 Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Tue, 23 Jan 2024 12:56:01 -0500 Subject: [PATCH 02/10] Add extra permissions and link permisions with views --- tabbycat/adjallocation/views.py | 2 +- tabbycat/users/permissions.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tabbycat/adjallocation/views.py b/tabbycat/adjallocation/views.py index e89369320ab..917f56a2947 100644 --- a/tabbycat/adjallocation/views.py +++ b/tabbycat/adjallocation/views.py @@ -13,7 +13,7 @@ from participants.models import Adjudicator, Region from participants.prefetch import populate_feedback_scores from tournaments.mixins import DebateDragAndDropMixin, TournamentMixin -from users.permissions import Permission, has_permission +from users.permissions import has_permission, Permission from utils.misc import ranks_dictionary, redirect_tournament, reverse_tournament from utils.mixins import AdministratorMixin from utils.views import ModelFormSetView diff --git a/tabbycat/users/permissions.py b/tabbycat/users/permissions.py index 98413f0b40c..a1ff1c9211e 100644 --- a/tabbycat/users/permissions.py +++ b/tabbycat/users/permissions.py @@ -119,6 +119,7 @@ class Permission(TextChoices): # need to get rid of generate private urls soons SEND_PRIVATE_URLS = 'send.privateurls', _("send private urls") + permission_type = Union[Permission, bool] From b0737867c7f437584bd90a900d712d3fe722e341 Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Tue, 23 Jan 2024 13:33:03 -0500 Subject: [PATCH 03/10] Add extra permissions and link permisions with views --- tabbycat/adjallocation/views.py | 2 +- tabbycat/users/permissions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tabbycat/adjallocation/views.py b/tabbycat/adjallocation/views.py index 917f56a2947..b187920986a 100644 --- a/tabbycat/adjallocation/views.py +++ b/tabbycat/adjallocation/views.py @@ -91,7 +91,7 @@ class EditDebateAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView): page_title = gettext_lazy("Edit Allocation") prefetch_adjs = True # Fetched in full as get_serialised - view_permission = Permission.VIEW_DEBATEADJUDICATORS + view_permission = Permission.VIEW_DEBATEADJUDICATORS edit_permission = Permission.EDIT_DEBATEADJUDICATORS def get_extra_info(self): diff --git a/tabbycat/users/permissions.py b/tabbycat/users/permissions.py index a1ff1c9211e..9b31ced43eb 100644 --- a/tabbycat/users/permissions.py +++ b/tabbycat/users/permissions.py @@ -115,7 +115,7 @@ class Permission(TextChoices): GENERATE_BREAK = 'generate.break', _("generate all breaks") VIEW_PRIVATE_URLS = 'view.privateurls', _("view private urls") - GENERATE_PRIVATE_URLS = 'generate.privateurls', _("generate private urls") + GENERATE_PRIVATE_URLS = 'generate.privateurls', _("generate private urls") # need to get rid of generate private urls soons SEND_PRIVATE_URLS = 'send.privateurls', _("send private urls") From 8e0f644fe3546a00bcbcc4c49fc605850a95393a Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Wed, 24 Jan 2024 11:38:54 -0500 Subject: [PATCH 04/10] Adjusting the view/edit permission --- tabbycat/adjallocation/views.py | 8 -------- tabbycat/draw/views.py | 3 +-- tabbycat/options/views.py | 3 --- tabbycat/participants/views.py | 2 +- tabbycat/users/permissions.py | 12 ++++++------ tabbycat/venues/views.py | 2 +- 6 files changed, 9 insertions(+), 21 deletions(-) diff --git a/tabbycat/adjallocation/views.py b/tabbycat/adjallocation/views.py index b187920986a..a07240704c7 100644 --- a/tabbycat/adjallocation/views.py +++ b/tabbycat/adjallocation/views.py @@ -92,7 +92,6 @@ class EditDebateAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView): prefetch_adjs = True # Fetched in full as get_serialised view_permission = Permission.VIEW_DEBATEADJUDICATORS - edit_permission = Permission.EDIT_DEBATEADJUDICATORS def get_extra_info(self): info = super().get_extra_info() @@ -109,7 +108,6 @@ class EditPanelAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView): page_title = gettext_lazy("Edit Panels") view_permission = Permission.VIEW_PREFORMEDPANELS - edit_permission = Permission.EDIT_PREFORMEDPANELS def get_extra_info(self): info = super().get_extra_info() @@ -152,12 +150,6 @@ class BaseAdjudicatorConflictsView(LogActionMixin, AdministratorMixin, Tournamen formset_factory_kwargs = {} - def get_view_permission(self): - return 'view.%s' % (self.formset_model.__name__.lower()) - - def get_edit_permission(self): - return 'edit.%s' % (self.formset_model.__name__.lower()) - def get_formset_factory_kwargs(self): can_edit = has_permission(self.request.user, self.get_edit_permission(), self.tournament) kwargs = super().get_formset_factory_kwargs() diff --git a/tabbycat/draw/views.py b/tabbycat/draw/views.py index 717ef15d83f..d0bba1aff0a 100644 --- a/tabbycat/draw/views.py +++ b/tabbycat/draw/views.py @@ -574,7 +574,6 @@ class AdminDrawWithDetailsView(AdminDrawView): detailed = True page_emoji = '👀' use_template_subtitle = False # Use the "for Round n" subtitle - view_permission = Permission.VIEW_ADMIN_DRAW def get_page_title(self): return _("Draw with Details") @@ -835,7 +834,7 @@ def get_table(self): class SideAllocationsView(AdministratorMixin, BaseSideAllocationsView): - edit_permission = Permission.EDIT_ALLOCATESIDES + view_permission = Permission.EDIT_ALLOCATESIDES pass diff --git a/tabbycat/options/views.py b/tabbycat/options/views.py index f50857fb063..5eeb43b0c3c 100644 --- a/tabbycat/options/views.py +++ b/tabbycat/options/views.py @@ -12,7 +12,6 @@ from actionlog.mixins import LogActionMixin from actionlog.models import ActionLogEntry from tournaments.mixins import TournamentMixin -from users.permissions import Permission from utils.misc import reverse_tournament from utils.mixins import AdministratorMixin @@ -24,8 +23,6 @@ class TournamentConfigIndexView(AdministratorMixin, TournamentMixin, TemplateView): - view_permission = Permission.VIEW_TOURNAMENTPREFERENCEMODEL - edit_permission = Permission.EDIT_TOURNAMENTPREFERENCEMODEL template_name = "preferences_index.html" def get_preset_options(self): diff --git a/tabbycat/participants/views.py b/tabbycat/participants/views.py index 0b51b1a7a19..1c88c033280 100644 --- a/tabbycat/participants/views.py +++ b/tabbycat/participants/views.py @@ -70,7 +70,7 @@ def get_context_data(self, **kwargs): class AdminParticipantsListView(AdministratorMixin, BaseParticipantsListView): - view_permission = [Permission.VIEW_TEAMS, Permission.VIEW_ADJS] + view_permission = Permission.VIEW_TEAMS and Permission.VIEW_ADJS template_name = 'participants_list.html' admin = True diff --git a/tabbycat/users/permissions.py b/tabbycat/users/permissions.py index 9b31ced43eb..14aebd4969e 100644 --- a/tabbycat/users/permissions.py +++ b/tabbycat/users/permissions.py @@ -25,12 +25,12 @@ class Permission(TextChoices): VIEW_TEAMS = 'view.team', _("view teams") ADD_TEAMS = 'add.team', _("add teams") - VIEW_ADJS = 'view.adj', _("view adjudicators") - ADD_ADJS = 'add.adj', _("add adjudicators") + VIEW_ADJUDICATORS = 'view.adj', _("view adjudicators") + ADD_ADJUDICATORS = 'add.adj', _("add adjudicators") VIEW_ROOMS = 'view.room', _("view rooms") ADD_ROOMS = 'add.room', _("add rooms") - VIEW_INSTS = 'view.inst', _("view institutions") - ADD_INSTS = 'add.inst', _("add institutions") + VIEW_INSTITUTIONS = 'view.inst', _("view institutions") + ADD_INSTITUTIONS = 'add.inst', _("add institutions") VIEW_ROUNDAVAILABILITIES_TEAM = 'view.roundavailability.team', _("view round availabilities for teams") VIEW_ROUNDAVAILABILITIES_ADJ = 'view.roundavailability.adjudicator', _("view round availabilities for adjudicators") @@ -115,9 +115,9 @@ class Permission(TextChoices): GENERATE_BREAK = 'generate.break', _("generate all breaks") VIEW_PRIVATE_URLS = 'view.privateurls', _("view private urls") - GENERATE_PRIVATE_URLS = 'generate.privateurls', _("generate private urls") + GENERATE_PRIVATE_URLS = 'generate.privateurls', _("generate private URLs") # need to get rid of generate private urls soons - SEND_PRIVATE_URLS = 'send.privateurls', _("send private urls") + SEND_PRIVATE_URLS = 'send.privateurls', _("send private URLs") permission_type = Union[Permission, bool] diff --git a/tabbycat/venues/views.py b/tabbycat/venues/views.py index 9f66e84e14f..9ca4251114b 100644 --- a/tabbycat/venues/views.py +++ b/tabbycat/venues/views.py @@ -24,7 +24,7 @@ class EditDebateVenuesView(DebateDragAndDropMixin, AdministratorMixin, TemplateView): - edit_permission = Permission.ADD_ROOMS + view_permission = Permission.VIEW_ROOMALLOCATIONS template_name = "edit_debate_venues.html" page_title = gettext_lazy("Edit Rooms") prefetch_venues = False # Fetched in full as get_serialised From fa5689e22bc39dc6b36a32b52aa1c83331250fcd Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Wed, 24 Jan 2024 11:47:50 -0500 Subject: [PATCH 05/10] Fixing short names in importer/views.py --- tabbycat/importer/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tabbycat/importer/views.py b/tabbycat/importer/views.py index ed3b84b1fa4..05e7fe8ca5d 100644 --- a/tabbycat/importer/views.py +++ b/tabbycat/importer/views.py @@ -98,7 +98,7 @@ def done(self, form_list, form_dict, **kwargs): class ImportInstitutionsWizardView(BaseImportWizardView): model = Institution - edit_permission = Permission.ADD_INSTS + edit_permission = Permission.ADD_INSTITUTIONS form_list = [ ('raw', ImportInstitutionsRawForm), ('details', modelformset_factory(Institution, fields=('name', 'code'), extra=0)), @@ -197,7 +197,7 @@ def get_message(self, count): class ImportAdjudicatorsWizardView(BaseImportByInstitutionWizardView): model = Adjudicator - edit_permission = Permission.ADD_ADJS + edit_permission = Permission.ADD_ADJUDICATORS form_list = [ ('numbers', ImportAdjudicatorsNumbersForm), ('details', modelformset_factory(Adjudicator, form=AdjudicatorDetailsForm, extra=0)), From aa7c27c4780b452a336674c99bf08d778d1afcb1 Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Wed, 24 Jan 2024 11:52:44 -0500 Subject: [PATCH 06/10] Fixing short names in participants/views.py, again --- tabbycat/participants/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tabbycat/participants/views.py b/tabbycat/participants/views.py index 1c88c033280..a7fe4c4a125 100644 --- a/tabbycat/participants/views.py +++ b/tabbycat/participants/views.py @@ -70,7 +70,7 @@ def get_context_data(self, **kwargs): class AdminParticipantsListView(AdministratorMixin, BaseParticipantsListView): - view_permission = Permission.VIEW_TEAMS and Permission.VIEW_ADJS + view_permission = Permission.VIEW_TEAMS and Permission.VIEW_ADJUDICATORS template_name = 'participants_list.html' admin = True @@ -120,7 +120,7 @@ def get_table(self): class AdminInstitutionsListView(AdministratorMixin, BaseInstitutionsListView): - view_permission = Permission.VIEW_INSTS + view_permission = Permission.VIEW_INSTITUTIONS template_name = 'participants_list.html' admin = True From 0461ce797fe43370cfd5b23a6433dadbc9704486 Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Wed, 24 Jan 2024 12:29:03 -0500 Subject: [PATCH 07/10] Add permission preset for different targets --- tabbycat/users/groups.py | 74 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/tabbycat/users/groups.py b/tabbycat/users/groups.py index aeee7a0051a..9fad35ff3e3 100644 --- a/tabbycat/users/groups.py +++ b/tabbycat/users/groups.py @@ -19,13 +19,49 @@ class BaseGroup: class Equity(BaseGroup): # Permissions to manage conflicts/constraints, view feedback + participant info name = _("Equity") - permissions = [] + permissions = [ + Permission.EDIT_ROOMCATEGORIES, + Permission.EDIT_ROOMCONSTRAINTS, + Permission.EDIT_ADJ_ADJ_CONFLICTS, + Permission.EDIT_ADJ_INST_CONFLICTS, + Permission.EDIT_ADJ_INST_CONFLICTS, + Permission.EDIT_TEAM_INST_CONFLICTS, + ] class AdjudicationCore(BaseGroup): # Permissions to make [preformed] allocations, view feedback, and create motions name = _("Adjudication Core") - permissions = [] + permissions = [ + Permission.EDIT_BASEJUDGESCORES_IND, + Permission.EDIT_DEBATEADJUDICATORS, + Permission.EDIT_FEEDBACK_CONFIRM, + Permission.EDIT_FEEDBACK_IGNORE, + Permission.EDIT_FEEDBACK_OVERVIEW, + Permission.EDIT_JUDGESCORES_BULK, + Permission.EDIT_MOTION, + Permission.EDIT_RELEASEDRAW, + Permission.EDIT_UNRELEASEDRAW, + Permission.EDIT_SETBREAKING, + Permission.EDIT_STARTTIME, + Permission.EDIT_RELEASEDRAW, + Permission.EDIT_PREFORMEDPANELS, + Permission.EDIT_RELEASEMOTION, + Permission.EDIT_UNRELEASEMOTION, + Permission.EDIT_ROOMALLOCATIONS, + Permission.EDIT_ALLOCATESIDES, + Permission.EDIT_ADJ_BREAK, + Permission.VIEW_BREAK, + Permission.VIEW_BREAK_OVERVIEW, + Permission.VIEW_MOTIONSTAB, + Permission.VIEW_DIVERSITYTAB, + Permission.VIEW_STANDINGS_OVERVIEW, + Permission.VIEW_TEAMSTANDINGS, + Permission.VIEW_SPEAKERSSTANDINGS, + Permission.VIEW_REPLIESSTANDINGS, + Permission.VIEW_FEEDBACK, + Permission.ADD_FEEDBACK, + ] class TabDirector(BaseGroup): @@ -37,4 +73,36 @@ class TabDirector(BaseGroup): class TabAssistant(BaseGroup): # Permissions to match the Assistant interface name = _("Tabulation Assistant") - permissions = [] + permissions = [ + Permission.EDIT_ROUNDAVAILABILITIES_ADJ, + Permission.EDIT_ROUNDAVAILABILITIES_TEAM, + Permission.EDIT_ROUNDAVAILABILITIES_VENUE, + Permission.EDIT_ROOMCATEGORIES, + Permission.EDIT_ROOMCONSTRAINTS, + Permission.VIEW_ADMIN_DRAW, + Permission.EDIT_OLD_BALLOTSUBMISSIONS, + Permission.EDIT_BALLOTSUBMISSIONS, + Permission.ADD_BALLOTSUBMISSIONS, + Permission.MARK_BALLOTSUBMISSIONS, + Permission.MARK_OTHERS_BALLOTSUBMISSIONS, + Permission.VIEW_BALLOTSUBMISSION_GRAPH, + Permission.VIEW_FEEDBACK, + Permission.VIEW_FEEDBACK_OVERVIEW, + Permission.VIEW_FEEDBACK_UNSUBMITTED, + Permission.EDIT_FEEDBACK_CONFIRM, + Permission.EDIT_FEEDBACK_IGNORE, + Permission.ADD_FEEDBACK, + Permission.EDIT_BREAK_ELIGIBILITY, + Permission.EDIT_SPEAKER_CATEGORIES, + Permission.VIEW_PRIVATE_URLS, + Permission.GENERATE_PRIVATE_URLS, + Permission.SEND_PRIVATE_URLS + ] + + +class Language(BaseGroup): + name = _("Language") + permissions = [ + Permission.EDIT_BREAK_ELIGIBILITY, + Permission.EDIT_SPEAKER_CATEGORIES, + ] From 3d75063c96ad63cc71ca868f3263f4b0e5e531de Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Wed, 24 Jan 2024 12:36:39 -0500 Subject: [PATCH 08/10] Add permission preset for different targets, again --- tabbycat/users/groups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tabbycat/users/groups.py b/tabbycat/users/groups.py index 9fad35ff3e3..bd8a1cea31c 100644 --- a/tabbycat/users/groups.py +++ b/tabbycat/users/groups.py @@ -96,7 +96,7 @@ class TabAssistant(BaseGroup): Permission.EDIT_SPEAKER_CATEGORIES, Permission.VIEW_PRIVATE_URLS, Permission.GENERATE_PRIVATE_URLS, - Permission.SEND_PRIVATE_URLS + Permission.SEND_PRIVATE_URLS, ] From 5e2d9e8e342de249b567e99d790d1af8ca403bed Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Sat, 27 Jan 2024 16:57:33 -0500 Subject: [PATCH 09/10] Edit the preset of permission --- tabbycat/adjfeedback/views.py | 2 +- tabbycat/checkins/views.py | 5 +++++ tabbycat/participants/views.py | 2 +- tabbycat/users/groups.py | 31 +++++++++++++++++++++++++++---- tabbycat/users/permissions.py | 5 ++++- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/tabbycat/adjfeedback/views.py b/tabbycat/adjfeedback/views.py index e9617a21553..b2aa5249339 100644 --- a/tabbycat/adjfeedback/views.py +++ b/tabbycat/adjfeedback/views.py @@ -672,7 +672,7 @@ def modify_adjudicator(self, request, adjudicator): class SetAdjudicatorBreakingStatusView(AdministratorMixin, TournamentMixin, LogActionMixin, View): action_log_type = ActionLogEntry.ACTION_TYPE_ADJUDICATOR_BREAK_SET - edit_permission = Permission.EDIT_SETBREAKING + edit_permission = Permission.EDIT_ADJ_BREAK def post(self, request, *args, **kwargs): body = self.request.body.decode('utf-8') diff --git a/tabbycat/checkins/views.py b/tabbycat/checkins/views.py index 43ebd90fb63..a275674a0ca 100644 --- a/tabbycat/checkins/views.py +++ b/tabbycat/checkins/views.py @@ -15,6 +15,7 @@ from participants.models import Person, Speaker from participants.serializers import InstitutionSerializer from tournaments.mixins import PublicTournamentPageMixin, TournamentMixin +from users.permissions import Permission from utils.misc import reverse_tournament from utils.mixins import AdministratorMixin, AssistantMixin from utils.views import PostOnlyRedirectView @@ -63,6 +64,8 @@ class CheckInPeopleStatusView(BaseCheckInStatusView): page_title = _("People's Check-In Statuses") window_preference = 'checkin_window_people' + edit_permission = Permission.EDIT_PARTICIPANT_CHECKIN + def get_context_data(self, **kwargs): team_codes = use_team_code_names(self.tournament, admin=self.for_admin) @@ -120,6 +123,8 @@ class CheckInVenuesStatusView(BaseCheckInStatusView): page_title = _("Rooms' Check-In Statuses") window_preference = 'checkin_window_venues' + edit_permission = Permission.EDIT_ROOM_CHECKIN + def get_context_data(self, **kwargs): venues = [] for venue in self.tournament.relevant_venues.select_related('checkin_identifier').prefetch_related('venuecategory_set').all(): diff --git a/tabbycat/participants/views.py b/tabbycat/participants/views.py index a7fe4c4a125..c93e0ee9dc6 100644 --- a/tabbycat/participants/views.py +++ b/tabbycat/participants/views.py @@ -70,7 +70,7 @@ def get_context_data(self, **kwargs): class AdminParticipantsListView(AdministratorMixin, BaseParticipantsListView): - view_permission = Permission.VIEW_TEAMS and Permission.VIEW_ADJUDICATORS + view_permission = Permission.VIEW_PARTICIPANTS template_name = 'participants_list.html' admin = True diff --git a/tabbycat/users/groups.py b/tabbycat/users/groups.py index bd8a1cea31c..fb4a74913cf 100644 --- a/tabbycat/users/groups.py +++ b/tabbycat/users/groups.py @@ -26,6 +26,11 @@ class Equity(BaseGroup): Permission.EDIT_ADJ_INST_CONFLICTS, Permission.EDIT_ADJ_INST_CONFLICTS, Permission.EDIT_TEAM_INST_CONFLICTS, + Permission.VIEW_PARTICIPANTS, + Permission.VIEW_TEAMS, + Permission.VIEW_ADJUDICATORS, + Permission.VIEW_ROOMS, + Permission.VIEW_INSTITUTIONS, ] @@ -40,11 +45,7 @@ class AdjudicationCore(BaseGroup): Permission.EDIT_FEEDBACK_OVERVIEW, Permission.EDIT_JUDGESCORES_BULK, Permission.EDIT_MOTION, - Permission.EDIT_RELEASEDRAW, - Permission.EDIT_UNRELEASEDRAW, - Permission.EDIT_SETBREAKING, Permission.EDIT_STARTTIME, - Permission.EDIT_RELEASEDRAW, Permission.EDIT_PREFORMEDPANELS, Permission.EDIT_RELEASEMOTION, Permission.EDIT_UNRELEASEMOTION, @@ -61,6 +62,11 @@ class AdjudicationCore(BaseGroup): Permission.VIEW_REPLIESSTANDINGS, Permission.VIEW_FEEDBACK, Permission.ADD_FEEDBACK, + Permission.VIEW_PARTICIPANTS, + Permission.VIEW_TEAMS, + Permission.VIEW_ADJUDICATORS, + Permission.VIEW_ROOMS, + Permission.VIEW_INSTITUTIONS, ] @@ -97,6 +103,18 @@ class TabAssistant(BaseGroup): Permission.VIEW_PRIVATE_URLS, Permission.GENERATE_PRIVATE_URLS, Permission.SEND_PRIVATE_URLS, + Permission.EDIT_PARTICIPANT_CHECKIN, + Permission.EDIT_ROOM_CHECKIN, + Permission.VIEW_TEAMS, + Permission.VIEW_ADJUDICATORS, + Permission.VIEW_ROOMS, + Permission.VIEW_INSTITUTIONS, + Permission.VIEW_PARTICIPANTS, + Permission.VIEW_ADMIN_DRAW, + Permission.VIEW_DEBATES, + Permission.RELEASE_DRAW, + Permission.UNRELEASE_DRAW, + Permission.EDIT_STARTTIME, ] @@ -105,4 +123,9 @@ class Language(BaseGroup): permissions = [ Permission.EDIT_BREAK_ELIGIBILITY, Permission.EDIT_SPEAKER_CATEGORIES, + Permission.VIEW_PARTICIPANTS, + Permission.VIEW_TEAMS, + Permission.VIEW_ADJUDICATORS, + Permission.VIEW_ROOMS, + Permission.VIEW_INSTITUTIONS, ] diff --git a/tabbycat/users/permissions.py b/tabbycat/users/permissions.py index 14aebd4969e..4175eb1e2c0 100644 --- a/tabbycat/users/permissions.py +++ b/tabbycat/users/permissions.py @@ -31,6 +31,7 @@ class Permission(TextChoices): ADD_ROOMS = 'add.room', _("add rooms") VIEW_INSTITUTIONS = 'view.inst', _("view institutions") ADD_INSTITUTIONS = 'add.inst', _("add institutions") + VIEW_PARTICIPANTS = 'view.particpants', _("view participants") VIEW_ROUNDAVAILABILITIES_TEAM = 'view.roundavailability.team', _("view round availabilities for teams") VIEW_ROUNDAVAILABILITIES_ADJ = 'view.roundavailability.adjudicator', _("view round availabilities for adjudicators") @@ -93,7 +94,6 @@ class Permission(TextChoices): VIEW_FEEDBACK_OVERVIEW = 'view.feedbackoverview', _("view overview of judge feedback") EDIT_JUDGESCORES_BULK = 'edit.judgescoresbulk', _("bulk update judge scores") EDIT_BASEJUDGESCORES_IND = 'edit.judgescoresind', _("edit base scores of judges") - EDIT_SETBREAKING = 'edit.setbreaking', _("edit breaking judges") VIEW_FEEDBACK = 'view.feedback', _("view feedback") EDIT_FEEDBACK_IGNORE = 'edit.feedbackignore', _("toggle ignore feedback") EDIT_FEEDBACK_CONFIRM = 'edit.feedbackconfirm', _("toggle confirm feedback") @@ -119,6 +119,9 @@ class Permission(TextChoices): # need to get rid of generate private urls soons SEND_PRIVATE_URLS = 'send.privateurls', _("send private URLs") + EDIT_PARTICIPANT_CHECKIN = 'edit.participantcheckin', _("edit participant check-in") + EDIT_ROOM_CHECKIN = 'edit.roomcheckin', _("edit room check-in") + permission_type = Union[Permission, bool] From 75f7b712d981644205177e876b77dab1f9c57660 Mon Sep 17 00:00:00 2001 From: Tran Trang Linh Date: Sat, 27 Jan 2024 18:21:49 -0500 Subject: [PATCH 10/10] Adjusting permission for assistant account --- tabbycat/draw/views.py | 2 ++ tabbycat/motions/views.py | 1 + tabbycat/privateurls/views.py | 1 + tabbycat/users/groups.py | 36 ++++------------------------------- tabbycat/users/permissions.py | 3 +++ 5 files changed, 11 insertions(+), 32 deletions(-) diff --git a/tabbycat/draw/views.py b/tabbycat/draw/views.py index d0bba1aff0a..b6e294cc629 100644 --- a/tabbycat/draw/views.py +++ b/tabbycat/draw/views.py @@ -251,6 +251,8 @@ class BriefingRoomDrawTableMixin: """Mixin for views that get projected in the briefing room, to be accessed only by admins and assistants.""" + view_permission = Permission.VIEW_BRIEFING_DRAW + def get_context_data(self, **kwargs): kwargs['no_popovers'] = True return super().get_context_data(**kwargs) diff --git a/tabbycat/motions/views.py b/tabbycat/motions/views.py index 1d20db14c82..15432b9d996 100644 --- a/tabbycat/motions/views.py +++ b/tabbycat/motions/views.py @@ -201,6 +201,7 @@ def get_context_data(self, **kwargs): class AdminDisplayMotionsView(AdministratorMixin, BaseDisplayMotionsView): + view_permission = Permission.DISPLAY_MOTION pass diff --git a/tabbycat/privateurls/views.py b/tabbycat/privateurls/views.py index 05b2ff96079..725969d19e9 100644 --- a/tabbycat/privateurls/views.py +++ b/tabbycat/privateurls/views.py @@ -152,6 +152,7 @@ def post(self, request: 'HttpRequest', *args, **kwargs) -> 'HttpResponseRedirect class EmailRandomisedUrlsView(RoleColumnMixin, TournamentTemplateEmailCreateView): page_subtitle = _("Private URLs") + view_permission = Permission.VIEW_PRIVATE_URLS_EMAIL_LIST edit_permission = Permission.SEND_PRIVATE_URLS event = BulkNotification.EventType.URL subject_template = 'url_email_subject' diff --git a/tabbycat/users/groups.py b/tabbycat/users/groups.py index fb4a74913cf..e99d2deee7a 100644 --- a/tabbycat/users/groups.py +++ b/tabbycat/users/groups.py @@ -80,41 +80,16 @@ class TabAssistant(BaseGroup): # Permissions to match the Assistant interface name = _("Tabulation Assistant") permissions = [ - Permission.EDIT_ROUNDAVAILABILITIES_ADJ, - Permission.EDIT_ROUNDAVAILABILITIES_TEAM, - Permission.EDIT_ROUNDAVAILABILITIES_VENUE, - Permission.EDIT_ROOMCATEGORIES, - Permission.EDIT_ROOMCONSTRAINTS, - Permission.VIEW_ADMIN_DRAW, - Permission.EDIT_OLD_BALLOTSUBMISSIONS, - Permission.EDIT_BALLOTSUBMISSIONS, Permission.ADD_BALLOTSUBMISSIONS, - Permission.MARK_BALLOTSUBMISSIONS, Permission.MARK_OTHERS_BALLOTSUBMISSIONS, Permission.VIEW_BALLOTSUBMISSION_GRAPH, - Permission.VIEW_FEEDBACK, - Permission.VIEW_FEEDBACK_OVERVIEW, - Permission.VIEW_FEEDBACK_UNSUBMITTED, - Permission.EDIT_FEEDBACK_CONFIRM, - Permission.EDIT_FEEDBACK_IGNORE, Permission.ADD_FEEDBACK, - Permission.EDIT_BREAK_ELIGIBILITY, - Permission.EDIT_SPEAKER_CATEGORIES, - Permission.VIEW_PRIVATE_URLS, - Permission.GENERATE_PRIVATE_URLS, - Permission.SEND_PRIVATE_URLS, - Permission.EDIT_PARTICIPANT_CHECKIN, - Permission.EDIT_ROOM_CHECKIN, - Permission.VIEW_TEAMS, - Permission.VIEW_ADJUDICATORS, - Permission.VIEW_ROOMS, Permission.VIEW_INSTITUTIONS, Permission.VIEW_PARTICIPANTS, - Permission.VIEW_ADMIN_DRAW, - Permission.VIEW_DEBATES, - Permission.RELEASE_DRAW, - Permission.UNRELEASE_DRAW, - Permission.EDIT_STARTTIME, + Permission.EDIT_PARTICIPANT_CHECKIN, + Permission.EDIT_ROOM_CHECKIN, + Permission.VIEW_BRIEFING_DRAW, + Permission.DISPLAY_MOTION, ] @@ -125,7 +100,4 @@ class Language(BaseGroup): Permission.EDIT_SPEAKER_CATEGORIES, Permission.VIEW_PARTICIPANTS, Permission.VIEW_TEAMS, - Permission.VIEW_ADJUDICATORS, - Permission.VIEW_ROOMS, - Permission.VIEW_INSTITUTIONS, ] diff --git a/tabbycat/users/permissions.py b/tabbycat/users/permissions.py index 4175eb1e2c0..014984046c6 100644 --- a/tabbycat/users/permissions.py +++ b/tabbycat/users/permissions.py @@ -75,6 +75,8 @@ class Permission(TextChoices): UNRELEASE_MOTION = 'unrelease.motion', _("unrelease motion to public") EDIT_STARTTIME = 'edit.starttime', _("add debate start time") VIEW_DRAW = 'view.draw', _("view draws") + VIEW_BRIEFING_DRAW = 'view.briefingdraw', _("view draws (for the briefing room)") + DISPLAY_MOTION = 'display.motion', _("display motion (for the briefing room)") VIEW_TOURNAMENTPREFERENCEMODEL = 'view.tournamentpreferencemodel', _("view tournament configuration") EDIT_TOURNAMENTPREFERENCEMODEL = 'edit.tournamentpreferencemodel', _("edit tournament configuration") @@ -115,6 +117,7 @@ class Permission(TextChoices): GENERATE_BREAK = 'generate.break', _("generate all breaks") VIEW_PRIVATE_URLS = 'view.privateurls', _("view private urls") + VIEW_PRIVATE_URLS_EMAIL_LIST = 'view.privateurls.emaillist', _("view private urls email list") GENERATE_PRIVATE_URLS = 'generate.privateurls', _("generate private URLs") # need to get rid of generate private urls soons SEND_PRIVATE_URLS = 'send.privateurls', _("send private URLs")