Skip to content
Open
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
9bb41b8
Create a configuration page
CarolineDenis Aug 14, 2025
d3cf165
Start to adapt backend def for system config
CarolineDenis Aug 15, 2025
2012e4a
Fix new discipline def
CarolineDenis Aug 15, 2025
b0fbf0e
Reload page after addition
CarolineDenis Aug 15, 2025
a502f6b
Remove parent id
CarolineDenis Aug 15, 2025
22ca396
Fetch data system after creation
CarolineDenis Aug 15, 2025
4a6da84
Simplify and comment backend defs
CarolineDenis Aug 15, 2025
4396b60
Handle second call on backedn creation def
CarolineDenis Aug 15, 2025
4bace18
efetch all system data after addition
CarolineDenis Aug 15, 2025
d29b9fa
Simplify handle save
CarolineDenis Aug 15, 2025
6f46015
Remove comment from type
CarolineDenis Aug 15, 2025
66bc315
Lint code with ESLint and Prettier
CarolineDenis Aug 15, 2025
f664812
Merge remote-tracking branch 'origin/issue-2931-1' into issue-6213-1
CarolineDenis Aug 18, 2025
44e2dcd
Merge remote-tracking branch 'origin/issue-2931-1' into issue-6213-1
CarolineDenis Aug 19, 2025
710e529
Add webonly view for discipline and div
CarolineDenis Aug 19, 2025
9d031f6
Merge remote-tracking branch 'origin/issue-2931-1' into issue-6213-1
CarolineDenis Sep 2, 2025
b1d29df
Merge branch 'issue-2931-1' into issue-6213-1
acwhite211 Oct 27, 2025
d5cfc5d
Merge remote-tracking branch 'origin/issue-2931-1' into issue-6213-1
CarolineDenis Dec 9, 2025
7dd465c
Feat: Add data check to define if geo is global & if tree def is present
CarolineDenis Dec 9, 2025
4125f19
Feat: Add geo tree config dialog
CarolineDenis Dec 9, 2025
d7f5fdb
Fix: add handleSave
CarolineDenis Dec 9, 2025
7d4f302
Feat: Add taxon and geo config dialog for disciplines
CarolineDenis Dec 10, 2025
112c14e
Fix: fix typos
CarolineDenis Dec 10, 2025
e617fc2
Feat: add collapsible arrows
CarolineDenis Dec 10, 2025
cd030a1
Feat: Add an edit option for each resource
CarolineDenis Dec 10, 2025
54d6186
Refactor: Break the system config tool in smaller component
CarolineDenis Dec 10, 2025
c955403
Refactor: Exctract resource renderer
CarolineDenis Dec 10, 2025
304e647
type
CarolineDenis Dec 10, 2025
23292c9
Import
CarolineDenis Dec 10, 2025
e95d61a
Refactor: Extract add button
CarolineDenis Dec 10, 2025
7755ec2
Fix type
CarolineDenis Dec 10, 2025
d50ed39
Lint code with ESLint and Prettier
CarolineDenis Dec 10, 2025
f10dcb7
Comment
CarolineDenis Dec 10, 2025
11768e9
Fix: Update all info for hierarchy onDelete and onSave
CarolineDenis Dec 12, 2025
3c69936
Feat: Allow to delete empty resources
CarolineDenis Dec 12, 2025
9aa67fa
Fix: typo in api
CarolineDenis Dec 12, 2025
17d9759
Fix: Typo
CarolineDenis Dec 12, 2025
786a204
Lint code with ESLint and Prettier
CarolineDenis Dec 12, 2025
0e8cccd
Comment: Suggestion for userscopeid crash
CarolineDenis Dec 16, 2025
9061ca6
Merge branch 'issue-2931-1' into issue-6213-1
alesan99 Dec 17, 2025
2113fa7
Lint code with ESLint and Prettier
alesan99 Dec 17, 2025
e11707a
Merge branch 'issue-2931-1' into issue-6213-1
alesan99 Dec 17, 2025
904ce4a
Merge remote-tracking branch 'origin/issue-2931-1' into issue-6213-1
CarolineDenis Dec 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions specifyweb/backend/context/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
re_path(r'^user.json$', views.user),
re_path(r'^stats_counts.json$', views.stats_counts),
re_path(r'^system_info.json$', views.system_info),
re_path(r'^all_system_data.json$', views.all_system_data),
re_path(r'^server_time.json$', views.get_server_time),
re_path(r'^domain.json$', views.domain),
re_path(r'^view.json$', views.view),
Expand Down
54 changes: 52 additions & 2 deletions specifyweb/backend/context/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
PermissionTargetAction, \
check_permission_targets, skip_collection_access_check, query_pt, \
CollectionAccessPT
from specifyweb.specify.models import Collection, Collectionobject, Institution, \
from specifyweb.specify.models import Collection, Discipline, Division, Collectionobject, Institution, \
Specifyuser, Spprincipal, Spversion, Collectionobjecttype
from specifyweb.specify.models_utils.schema import base_schema
from specifyweb.specify.models_utils.serialize_datamodel import datamodel_to_json
Expand Down Expand Up @@ -663,10 +663,60 @@ def system_info(request):
collection=collection and collection.collectionname,
collection_guid=collection and collection.guid,
isa_number=collection and collection.isanumber,
discipline_type=discipline and discipline.type
discipline_type=discipline and discipline.type,
geography_is_global=institution.issinglegeographytree
)
return HttpResponse(json.dumps(info), content_type='application/json')

@require_http_methods(["GET"])
@cache_control(max_age=86400, public=True)
@skip_collection_access_check
def all_system_data(request):
"""
Returns all institutions, divisions, disciplines, and collections.
"""
institution = Institution.objects.get()
divisions = list(Division.objects.all())
disciplines = list(Discipline.objects.all())
collections = list(Collection.objects.all())

discipline_map = {}
for discipline in disciplines:
discipline_map[discipline.id] = {
"id": discipline.id,
"name": discipline.name,
"children": [],
"geographytreedef": discipline.geographytreedef_id,
"taxontreedef": discipline.taxontreedef_id
}

for collection in collections:
if collection.discipline_id in discipline_map:
discipline_map[collection.discipline_id]["children"].append({
"id": collection.id,
"name": collection.collectionname
})

division_map = {}
for division in divisions:
division_map[division.id] = {
"id": division.id,
"name": division.name,
"children": []
}

for discipline in disciplines:
if discipline.division_id in division_map:
division_map[discipline.division_id]["children"].append(discipline_map[discipline.id])

institution_data = {
"id": institution.id,
"name": institution.name,
"children": list(division_map.values())
}

return JsonResponse(institution_data, safe=False)

PATH_GROUP_RE = re.compile(r'\(\?P<([^>]+)>[^\)]*\)')
PATH_GROUP_RE_EXTENDED = re.compile(r'<([^:]+):([^>]+)>')

Expand Down
2 changes: 1 addition & 1 deletion specifyweb/backend/setup_tool/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def create_division(data):
data['institution_id'] = institution.id if institution else None

# Remove unwanted keys
for key in ['_tableName', 'success']:
for key in ['_tableName', 'success', '_tablename']:
data.pop(key, None)

# Create new division
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,22 @@ export const webOnlyViews = f.store(() =>
'edit',
['name']
),
[collection]: autoGenerateViewDefinition(
tables.Collection,
'form',
'edit',
['collectionName', 'code', 'catalogNumFormatName']
),
[division]: autoGenerateViewDefinition(tables.Division, 'form', 'edit', [
'name',
'abbrev',
]),
[discipline]: autoGenerateViewDefinition(
tables.Discipline,
'form',
'edit',
['name', 'type']
),
} as const)
);

Expand All @@ -92,3 +108,6 @@ export const attachmentView = 'ObjectAttachment';
export const spAppResourceView = '_SpAppResourceView_name';
export const spViewSetNameView = '_SpViewSetObj_name';
export const recordSetView = '_RecordSet_name';
export const collection = '_Collection_setup';
export const division = '_Division_setup';
export const discipline = '_Discipline_setup';
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ const rawUserTools = ensure<IR<IR<Omit<MenuItem, 'name'>>>>()({
url: '/specify/security/',
icon: icons.fingerPrint,
},
systemConfigurationTool: {
title: userText.systemConfigurationTool(),
url: '/specify/system-configuration/',
icon: icons.fingerPrint,
},
repairTree: {
title: headerText.repairTree(),
url: '/specify/overlay/tree-repair/',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type SystemInfo = {
readonly stats_url: string | null;
readonly stats_2_url: string | null;
readonly discipline_type: string;
readonly geography_is_global: string;
};

type StatsCounts = {
Expand Down Expand Up @@ -80,6 +81,7 @@ export const fetchContext = load<SystemInfo>(
collectionObjectCount: counts?.Collectionobject ?? 0,
collectionCount: counts?.Collection ?? 0,
userCount: counts?.Specifyuser ?? 0,
geographyIsGlobal: systemInfo.geography_is_global,
};

await ping(
Expand Down
8 changes: 8 additions & 0 deletions specifyweb/frontend/js_src/lib/components/Router/Routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,14 @@ export const routes: RA<EnhancedRoute> = [
},
],
},
{
path: 'system-configuration',
title: userText.securityPanel(),
element: () =>
import('../SystemConfigurationTool/SystemConfigTool').then(
({ SystemConfigurationTool }) => SystemConfigurationTool
),
},
{
path: 'attachments',
children: [
Expand Down
Loading