diff --git a/Makefile b/Makefile index fa1799dcd32..41273bb1b43 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ webpack_watch: typecheck: $(MYPY) --follow-imports silent \ - specifyweb/permissions specifyweb/workbench specifyweb/backend/accounts \ + specifyweb/backend/permissions specifyweb/workbench specifyweb/backend/accounts \ specifyweb/specify/schema.py specifyweb/specify/load_datamodel.py \ specifyweb/specify/api.py specifyweb/context/user_resources.py diff --git a/specifyweb/attachment_gw/dataset_views.py b/specifyweb/attachment_gw/dataset_views.py index fa596c73c62..48bd6cdb9f7 100644 --- a/specifyweb/attachment_gw/dataset_views.py +++ b/specifyweb/attachment_gw/dataset_views.py @@ -1,5 +1,5 @@ from .models import Spattachmentdataset -from ..permissions.permissions import PermissionTarget, PermissionTargetAction, check_permission_targets +from specifyweb.backend.permissions.permissions import PermissionTarget, PermissionTargetAction, check_permission_targets from django import http import json import datetime diff --git a/specifyweb/backend/accounts/urls.py b/specifyweb/backend/accounts/urls.py index db07f7dd9c8..fe3a75a6e13 100644 --- a/specifyweb/backend/accounts/urls.py +++ b/specifyweb/backend/accounts/urls.py @@ -2,7 +2,7 @@ from django.contrib.auth import views as auth_views from django.urls import path -from specifyweb.permissions.permissions import skip_collection_access_check +from specifyweb.backend.permissions.permissions import skip_collection_access_check from . import views urlpatterns = [ diff --git a/specifyweb/backend/accounts/views.py b/specifyweb/backend/accounts/views.py index 8acab91eb8b..bbeb8b6fb68 100644 --- a/specifyweb/backend/accounts/views.py +++ b/specifyweb/backend/accounts/views.py @@ -23,7 +23,7 @@ from specifyweb.middleware.general import require_GET, require_http_methods -from specifyweb.permissions.permissions import PermissionTarget, \ +from specifyweb.backend.permissions.permissions import PermissionTarget, \ PermissionTargetAction, check_permission_targets from specifyweb.specify import models as spmodels from specifyweb.specify.views import login_maybe_required, openapi diff --git a/specifyweb/permissions/__init__.py b/specifyweb/backend/permissions/__init__.py similarity index 100% rename from specifyweb/permissions/__init__.py rename to specifyweb/backend/permissions/__init__.py diff --git a/specifyweb/permissions/initialize.py b/specifyweb/backend/permissions/initialize.py similarity index 100% rename from specifyweb/permissions/initialize.py rename to specifyweb/backend/permissions/initialize.py diff --git a/specifyweb/permissions/management/__init.py__ b/specifyweb/backend/permissions/management/__init.py__ similarity index 100% rename from specifyweb/permissions/management/__init.py__ rename to specifyweb/backend/permissions/management/__init.py__ diff --git a/specifyweb/permissions/management/commands/__init__.py b/specifyweb/backend/permissions/management/commands/__init__.py similarity index 100% rename from specifyweb/permissions/management/commands/__init__.py rename to specifyweb/backend/permissions/management/commands/__init__.py diff --git a/specifyweb/permissions/management/commands/initialize_permissions.py b/specifyweb/backend/permissions/management/commands/initialize_permissions.py similarity index 90% rename from specifyweb/permissions/management/commands/initialize_permissions.py rename to specifyweb/backend/permissions/management/commands/initialize_permissions.py index 4ad1ae30d8c..06b9e1ce203 100644 --- a/specifyweb/permissions/management/commands/initialize_permissions.py +++ b/specifyweb/backend/permissions/management/commands/initialize_permissions.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand, CommandError -from specifyweb.permissions.initialize import initialize +from specifyweb.backend.permissions.initialize import initialize class Command(BaseCommand): def add_arguments(self, parser) -> None: diff --git a/specifyweb/permissions/middleware.py b/specifyweb/backend/permissions/middleware.py similarity index 100% rename from specifyweb/permissions/middleware.py rename to specifyweb/backend/permissions/middleware.py diff --git a/specifyweb/permissions/migrations/0001_initial.py b/specifyweb/backend/permissions/migrations/0001_initial.py similarity index 100% rename from specifyweb/permissions/migrations/0001_initial.py rename to specifyweb/backend/permissions/migrations/0001_initial.py diff --git a/specifyweb/permissions/migrations/0002_role_rolepolicy_userrole.py b/specifyweb/backend/permissions/migrations/0002_role_rolepolicy_userrole.py similarity index 100% rename from specifyweb/permissions/migrations/0002_role_rolepolicy_userrole.py rename to specifyweb/backend/permissions/migrations/0002_role_rolepolicy_userrole.py diff --git a/specifyweb/permissions/migrations/0003_auto_20220321_1445.py b/specifyweb/backend/permissions/migrations/0003_auto_20220321_1445.py similarity index 100% rename from specifyweb/permissions/migrations/0003_auto_20220321_1445.py rename to specifyweb/backend/permissions/migrations/0003_auto_20220321_1445.py diff --git a/specifyweb/permissions/migrations/0004_auto_20220407_1927.py b/specifyweb/backend/permissions/migrations/0004_auto_20220407_1927.py similarity index 100% rename from specifyweb/permissions/migrations/0004_auto_20220407_1927.py rename to specifyweb/backend/permissions/migrations/0004_auto_20220407_1927.py diff --git a/specifyweb/permissions/migrations/0004_intialize_defaults.py b/specifyweb/backend/permissions/migrations/0004_intialize_defaults.py similarity index 81% rename from specifyweb/permissions/migrations/0004_intialize_defaults.py rename to specifyweb/backend/permissions/migrations/0004_intialize_defaults.py index e2937649a33..5b96aafb8ab 100644 --- a/specifyweb/permissions/migrations/0004_intialize_defaults.py +++ b/specifyweb/backend/permissions/migrations/0004_intialize_defaults.py @@ -3,7 +3,7 @@ from django.db import migrations def initialize(apps, schema_editor): - from specifyweb.permissions.initialize import initialize as init + from specifyweb.backend.permissions.initialize import initialize as init init(wipe=True, apps=apps) class Migration(migrations.Migration): diff --git a/specifyweb/permissions/migrations/0005_merge_20220414_1451.py b/specifyweb/backend/permissions/migrations/0005_merge_20220414_1451.py similarity index 100% rename from specifyweb/permissions/migrations/0005_merge_20220414_1451.py rename to specifyweb/backend/permissions/migrations/0005_merge_20220414_1451.py diff --git a/specifyweb/permissions/migrations/0006_add_dataset_create_recordset_permission.py b/specifyweb/backend/permissions/migrations/0006_add_dataset_create_recordset_permission.py similarity index 100% rename from specifyweb/permissions/migrations/0006_add_dataset_create_recordset_permission.py rename to specifyweb/backend/permissions/migrations/0006_add_dataset_create_recordset_permission.py diff --git a/specifyweb/permissions/migrations/0007_add_stats_edit_permission.py b/specifyweb/backend/permissions/migrations/0007_add_stats_edit_permission.py similarity index 100% rename from specifyweb/permissions/migrations/0007_add_stats_edit_permission.py rename to specifyweb/backend/permissions/migrations/0007_add_stats_edit_permission.py diff --git a/specifyweb/permissions/migrations/0008_attachment_import_role.py b/specifyweb/backend/permissions/migrations/0008_attachment_import_role.py similarity index 100% rename from specifyweb/permissions/migrations/0008_attachment_import_role.py rename to specifyweb/backend/permissions/migrations/0008_attachment_import_role.py diff --git a/specifyweb/permissions/migrations/__init__.py b/specifyweb/backend/permissions/migrations/__init__.py similarity index 100% rename from specifyweb/permissions/migrations/__init__.py rename to specifyweb/backend/permissions/migrations/__init__.py diff --git a/specifyweb/permissions/models.py b/specifyweb/backend/permissions/models.py similarity index 100% rename from specifyweb/permissions/models.py rename to specifyweb/backend/permissions/models.py diff --git a/specifyweb/permissions/permissions.py b/specifyweb/backend/permissions/permissions.py similarity index 100% rename from specifyweb/permissions/permissions.py rename to specifyweb/backend/permissions/permissions.py diff --git a/specifyweb/permissions/tests.py b/specifyweb/backend/permissions/tests.py similarity index 100% rename from specifyweb/permissions/tests.py rename to specifyweb/backend/permissions/tests.py diff --git a/specifyweb/permissions/urls.py b/specifyweb/backend/permissions/urls.py similarity index 100% rename from specifyweb/permissions/urls.py rename to specifyweb/backend/permissions/urls.py diff --git a/specifyweb/permissions/views.py b/specifyweb/backend/permissions/views.py similarity index 100% rename from specifyweb/permissions/views.py rename to specifyweb/backend/permissions/views.py diff --git a/specifyweb/context/views.py b/specifyweb/context/views.py index 184c23074d6..54957ba9f48 100644 --- a/specifyweb/context/views.py +++ b/specifyweb/context/views.py @@ -21,7 +21,7 @@ from django.views.i18n import LANGUAGE_QUERY_PARAMETER from specifyweb.middleware.general import require_http_methods -from specifyweb.permissions.permissions import PermissionTarget, \ +from specifyweb.backend.permissions.permissions import PermissionTarget, \ PermissionTargetAction, \ check_permission_targets, skip_collection_access_check, query_pt, \ CollectionAccessPT diff --git a/specifyweb/export/views.py b/specifyweb/export/views.py index b5e726ee1d6..eda63cd2888 100644 --- a/specifyweb/export/views.py +++ b/specifyweb/export/views.py @@ -19,7 +19,7 @@ from .feed import FEED_DIR, get_feed_resource, update_feed from ..context.app_resource import get_app_resource from ..notifications.models import Message -from ..permissions.permissions import PermissionTarget, PermissionTargetAction, \ +from specifyweb.backend.permissions.permissions import PermissionTarget, PermissionTargetAction, \ check_permission_targets from ..specify.models import Spquery from ..specify.views import login_maybe_required diff --git a/specifyweb/express_search/views.py b/specifyweb/express_search/views.py index 141e6cc300f..da5e654d655 100644 --- a/specifyweb/express_search/views.py +++ b/specifyweb/express_search/views.py @@ -13,7 +13,7 @@ from specifyweb.middleware.general import require_GET from .search_terms import parse_search_str from ..context.app_resource import get_app_resource -from ..permissions.permissions import check_table_permissions +from specifyweb.backend.permissions.permissions import check_table_permissions from ..specify.api import toJson from ..specify.models import datamodel, Collection from ..specify.views import login_maybe_required diff --git a/specifyweb/interactions/views.py b/specifyweb/interactions/views.py index 48b4deaa54f..073b50d00b5 100644 --- a/specifyweb/interactions/views.py +++ b/specifyweb/interactions/views.py @@ -12,7 +12,7 @@ add_consolidated_sibling_co_ids ) from specifyweb.middleware.general import require_GET -from specifyweb.permissions.permissions import check_table_permissions, table_permissions_checker +from specifyweb.backend.permissions.permissions import check_table_permissions, table_permissions_checker from specifyweb.specify.api import get_resource, toJson, strict_uri_to_model from specifyweb.specify.models import Collectionobject, Loan, Loanpreparation, \ Loanreturnpreparation, Preparation, Recordset, Recordsetitem diff --git a/specifyweb/middleware/general.py b/specifyweb/middleware/general.py index 35c32f44ba7..02ce135dc5d 100644 --- a/specifyweb/middleware/general.py +++ b/specifyweb/middleware/general.py @@ -58,7 +58,7 @@ def process_view(self, request, view_func, view_args, view_kwargs): pass def process_exception(self, request, exception) -> Optional[http.HttpResponse]: - from ..permissions.permissions import PermissionsException + from specifyweb.backend.permissions.permissions import PermissionsException if not settings.DEBUG: if isinstance(exception, PermissionsException): return http.JsonResponse(exception.to_json(), status=exception.status_code, safe=False) diff --git a/specifyweb/report_runner/views.py b/specifyweb/report_runner/views.py index f29bd96dbf2..f51c6359e68 100644 --- a/specifyweb/report_runner/views.py +++ b/specifyweb/report_runner/views.py @@ -11,7 +11,7 @@ from django.views.decorators.http import require_POST from specifyweb.middleware.general import require_GET, require_http_methods -from ..permissions.permissions import PermissionTarget, PermissionTargetAction, \ +from specifyweb.backend.permissions.permissions import PermissionTarget, PermissionTargetAction, \ check_permission_targets, check_table_permissions from ..specify.api import obj_to_data, toJson, \ HttpResponseCreated, objs_to_data_, _obj_to_data diff --git a/specifyweb/settings/__init__.py b/specifyweb/settings/__init__.py index 41890128860..1ab7bdcd255 100644 --- a/specifyweb/settings/__init__.py +++ b/specifyweb/settings/__init__.py @@ -201,7 +201,7 @@ def get_sa_db_url(db_name): 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'specifyweb.context.middleware.ContextMiddleware', - 'specifyweb.permissions.middleware.PermissionsMiddleware', + 'specifyweb.backend.permissions.middleware.PermissionsMiddleware', 'specifyweb.middleware.general.GeneralMiddleware', ] @@ -209,7 +209,7 @@ def get_sa_db_url(db_name): SPECIFY_APPS = [ 'specifyweb.specify', - 'specifyweb.permissions', + 'specifyweb.backend.permissions', 'specifyweb.backend.accounts', 'specifyweb.stored_queries', 'specifyweb.businessrules', diff --git a/specifyweb/specify/api.py b/specifyweb/specify/api.py index 3f13c03642f..5ef42af87d0 100644 --- a/specifyweb/specify/api.py +++ b/specifyweb/specify/api.py @@ -28,7 +28,7 @@ from django.core.exceptions import ObjectDoesNotExist, FieldError, FieldDoesNotExist from django.db.models.fields import DateTimeField, FloatField, DecimalField -from specifyweb.permissions.permissions import ( +from specifyweb.backend.permissions.permissions import ( enforce, check_table_permissions, check_field_permissions, diff --git a/specifyweb/specify/models_by_table_id.py b/specifyweb/specify/models_by_table_id.py index ba9c1a6147f..ddb660e5496 100644 --- a/specifyweb/specify/models_by_table_id.py +++ b/specifyweb/specify/models_by_table_id.py @@ -470,8 +470,8 @@ def import_model(model_name): if model_name in model_names: def get_model(): from importlib import import_module - if app_name == 'accounts': - module = import_module("specifyweb.backend.accounts.models") + if app_name in ['accounts', 'permissions']: + module = import_module(f"specifyweb.backend.{app_name}.models") else: module = import_module(f"specifyweb.{app_name}.models") return getattr(module, model_name) diff --git a/specifyweb/specify/tests/test_api.py b/specifyweb/specify/tests/test_api.py index c7f4d4b6a8f..fb81c26b7d2 100644 --- a/specifyweb/specify/tests/test_api.py +++ b/specifyweb/specify/tests/test_api.py @@ -8,7 +8,7 @@ from django.db.models import Max, QuerySet from django.test import TestCase, Client -from specifyweb.permissions.models import UserPolicy +from specifyweb.backend.permissions.models import UserPolicy from specifyweb.specify import api, models, scoping from specifyweb.businessrules.uniqueness_rules import UNIQUENESS_DISPATCH_UID, validate_unique, apply_default_uniqueness_rules from specifyweb.businessrules.rules.cogtype_rules import SYSTEM_COGTYPES_PICKLIST diff --git a/specifyweb/specify/tests/test_check_collection_access_against_agents.py b/specifyweb/specify/tests/test_check_collection_access_against_agents.py index 596f09e3ed0..8bf161b1401 100644 --- a/specifyweb/specify/tests/test_check_collection_access_against_agents.py +++ b/specifyweb/specify/tests/test_check_collection_access_against_agents.py @@ -1,4 +1,4 @@ -from specifyweb.permissions.models import UserPolicy +from specifyweb.backend.permissions.models import UserPolicy from specifyweb.specify.models import Agent, Specifyuser from specifyweb.specify.tests.test_api import ApiTests from specifyweb.specify.views import MissingAgentForAccessibleCollection, check_collection_access_against_agents diff --git a/specifyweb/specify/tests/test_record_merge_requests.py b/specifyweb/specify/tests/test_record_merge_requests.py index 133052e1ef7..fdd2a2452a3 100644 --- a/specifyweb/specify/tests/test_record_merge_requests.py +++ b/specifyweb/specify/tests/test_record_merge_requests.py @@ -2,7 +2,7 @@ from django import http from django.test import Client from specifyweb.notifications.models import Spmerging, Message -from specifyweb.permissions.models import UserPolicy +from specifyweb.backend.permissions.models import UserPolicy from specifyweb.specify.models import Agent from specifyweb.specify.tests.test_api import ApiTests diff --git a/specifyweb/specify/tests/test_utils/test_get_app_model.py b/specifyweb/specify/tests/test_utils/test_get_app_model.py index c2a1a3f4656..de5f2dcfdca 100644 --- a/specifyweb/specify/tests/test_utils/test_get_app_model.py +++ b/specifyweb/specify/tests/test_utils/test_get_app_model.py @@ -8,7 +8,7 @@ from specifyweb.businessrules import models as businessrules_models from specifyweb.context import models as context_models from specifyweb.notifications import models as notifications_models -from specifyweb.permissions import models as permissions_models +from specifyweb.backend.permissions import models as permissions_models from specifyweb.interactions import models as interactions_models from specifyweb.workbench import models as workbench_models from specifyweb.specify import models as spmodels diff --git a/specifyweb/specify/tree_views.py b/specifyweb/specify/tree_views.py index 9baab6064a4..2c9d6e81eaa 100644 --- a/specifyweb/specify/tree_views.py +++ b/specifyweb/specify/tree_views.py @@ -10,7 +10,7 @@ from specifyweb.middleware.general import require_GET from specifyweb.businessrules.exceptions import BusinessRuleException -from specifyweb.permissions.permissions import PermissionTarget, PermissionTargetAction, check_permission_targets, has_table_permission +from specifyweb.backend.permissions.permissions import PermissionTarget, PermissionTargetAction, check_permission_targets, has_table_permission from specifyweb.stored_queries import models as sqlmodels from specifyweb.stored_queries.execution import set_group_concat_max_len diff --git a/specifyweb/specify/utils.py b/specifyweb/specify/utils.py index 6440526ff92..1b7a60ea720 100644 --- a/specifyweb/specify/utils.py +++ b/specifyweb/specify/utils.py @@ -6,7 +6,7 @@ from specifyweb.businessrules import models as businessrules_models from specifyweb.context import models as context_models from specifyweb.notifications import models as notifications_models -from specifyweb.permissions import models as permissions_models +from specifyweb.backend.permissions import models as permissions_models from specifyweb.interactions import models as interactions_models from specifyweb.workbench import models as workbench_models from specifyweb.specify import models as spmodels diff --git a/specifyweb/specify/views.py b/specifyweb/specify/views.py index 19b179481c3..63501551fcb 100644 --- a/specifyweb/specify/views.py +++ b/specifyweb/specify/views.py @@ -23,7 +23,7 @@ from specifyweb.specify.api import get_model from specifyweb.middleware.general import require_GET, require_http_methods -from specifyweb.permissions.permissions import PermissionTarget, \ +from specifyweb.backend.permissions.permissions import PermissionTarget, \ PermissionTargetAction, PermissionsException, check_permission_targets, table_permissions_checker from specifyweb.celery_tasks import app, CELERY_TASK_STATE from specifyweb.specify.record_merging import record_merge_fx, record_merge_task, resolve_record_merge_response diff --git a/specifyweb/stats/views.py b/specifyweb/stats/views.py index cb9c0470cd7..38302510fa2 100644 --- a/specifyweb/stats/views.py +++ b/specifyweb/stats/views.py @@ -1,6 +1,6 @@ from django import http -from specifyweb.permissions.permissions import check_table_permissions +from specifyweb.backend.permissions.permissions import check_table_permissions from specifyweb.specify.views import openapi from django.http import HttpResponse, Http404 diff --git a/specifyweb/stored_queries/batch_edit.py b/specifyweb/stored_queries/batch_edit.py index 6363c7e11c1..126813d00fe 100644 --- a/specifyweb/stored_queries/batch_edit.py +++ b/specifyweb/stored_queries/batch_edit.py @@ -15,7 +15,7 @@ TypedDict, ) -from specifyweb.permissions.permissions import has_target_permission +from specifyweb.backend.permissions.permissions import has_target_permission from specifyweb.specify.filter_by_col import CONCRETE_HIERARCHY from specifyweb.specify.models import datamodel from specifyweb.specify.load_datamodel import Field, Relationship, Table diff --git a/specifyweb/stored_queries/execution.py b/specifyweb/stored_queries/execution.py index 0c9e16c80db..2ed07bfcc38 100644 --- a/specifyweb/stored_queries/execution.py +++ b/specifyweb/stored_queries/execution.py @@ -29,7 +29,7 @@ from .relative_date_utils import apply_absolute_date from .field_spec_maps import apply_specify_user_name from ..notifications.models import Message -from ..permissions.permissions import check_table_permissions +from specifyweb.backend.permissions.permissions import check_table_permissions from ..specify.auditlog import auditlog from ..specify.models import Collectionobjectgroupjoin, Loan, Loanpreparation, Loanreturnpreparation, Taxontreedef from specifyweb.specify.utils import get_cat_num_inheritance_setting, log_sqlalchemy_query diff --git a/specifyweb/stored_queries/views.py b/specifyweb/stored_queries/views.py index ab47909f64e..a7a344b1b08 100644 --- a/specifyweb/stored_queries/views.py +++ b/specifyweb/stored_queries/views.py @@ -18,7 +18,7 @@ from .execution import execute, run_ephemeral_query, do_export, recordset, \ return_loan_preps as rlp from .queryfield import QueryField -from ..permissions.permissions import PermissionTarget, PermissionTargetAction, \ +from specifyweb.backend.permissions.permissions import PermissionTarget, PermissionTargetAction, \ check_permission_targets, check_table_permissions from ..specify.api import toJson, uri_for_model from ..specify.models import Collection, Recordset, Recordsetitem, \ diff --git a/specifyweb/urls.py b/specifyweb/urls.py index ee857d6c746..2be583d9a3f 100644 --- a/specifyweb/urls.py +++ b/specifyweb/urls.py @@ -12,8 +12,8 @@ from .frontend.views import open_search as search_view from .interactions import urls as interaction_urls from .notifications import urls as notification_urls -from .permissions import urls as permissions_urls -from .permissions.permissions import skip_collection_access_check +from specifyweb.backend.permissions import urls as permissions_urls +from specifyweb.backend.permissions.permissions import skip_collection_access_check from .report_runner import urls as report_urls from .specify import urls as api_urls from .specify.views import images, properties diff --git a/specifyweb/workbench/permissions.py b/specifyweb/workbench/permissions.py index 9ad8b20db27..fe23f1be097 100644 --- a/specifyweb/workbench/permissions.py +++ b/specifyweb/workbench/permissions.py @@ -1,4 +1,4 @@ -from specifyweb.permissions.permissions import PermissionTarget, PermissionTargetAction +from specifyweb.backend.permissions.permissions import PermissionTarget, PermissionTargetAction class DataSetPT(PermissionTarget): diff --git a/specifyweb/workbench/upload/auditor.py b/specifyweb/workbench/upload/auditor.py index b47a2bfe9e7..c0d87a9206f 100644 --- a/specifyweb/workbench/upload/auditor.py +++ b/specifyweb/workbench/upload/auditor.py @@ -3,7 +3,7 @@ from specifyweb.specify.auditlog import AuditLog -from specifyweb.permissions.permissions import ( +from specifyweb.backend.permissions.permissions import ( TABLE_ACTION, check_table_permissions, ) diff --git a/specifyweb/workbench/upload/upload.py b/specifyweb/workbench/upload/upload.py index 1f53049c586..35d3cc6fd7a 100644 --- a/specifyweb/workbench/upload/upload.py +++ b/specifyweb/workbench/upload/upload.py @@ -18,7 +18,7 @@ from django.db.utils import OperationalError, IntegrityError from jsonschema import validate # type: ignore -from specifyweb.permissions.permissions import has_target_permission +from specifyweb.backend.permissions.permissions import has_target_permission from specifyweb.specify import models from specifyweb.specify.auditlog import auditlog from specifyweb.specify.datamodel import Table diff --git a/specifyweb/workbench/views.py b/specifyweb/workbench/views.py index fe85c5975a0..d398ff7233c 100644 --- a/specifyweb/workbench/views.py +++ b/specifyweb/workbench/views.py @@ -17,7 +17,7 @@ from specifyweb.specify.views import login_maybe_required, openapi from specifyweb.specify.models import Recordset, Specifyuser from specifyweb.notifications.models import Message -from specifyweb.permissions.permissions import ( +from specifyweb.backend.permissions.permissions import ( check_permission_targets, check_table_permissions, )