Skip to content

Update Openspecimen to 6.3RC8 - #1

Open
ChristianMUG wants to merge 3536 commits into
bibbox:masterfrom
krishagni:master
Open

Update Openspecimen to 6.3RC8#1
ChristianMUG wants to merge 3536 commits into
bibbox:masterfrom
krishagni:master

Conversation

@ChristianMUG

Copy link
Copy Markdown

Getting the newest branch from openspecimen

Request managers can now be specified at the catalog or CP level.
… of all the

input objects identified by comma-separated names (labels, ppids, visit names, etc)

The problem with the earlier implementation was the names was fed into the query
but the output were limited to first 100 form records.

The fix is to divide the input names into chunks of 100 names. Iterate through each
chunk to query and fetch all records, append the records to the CSV file.

Care has been taken to ensure the looping does not break if any of the chunks
return no records.
… job.

Earlier approach: A single query computed collected, missed, not collected,
pending specimen counts for every participant in the database. The output
was subsequently used to create a new stats table.

While this approach worked well for databases with smaller number of participants
and specimens, it started failing on larger databases due to large transaction
size and connection timeouts.

Redesign:
In view of the above, the the job is redesigned to populate the stats in chunks.
By default, participants are divided in chunks of 10K. The job iterates through
each chunk to compute and insert the stats sequentially.

While this might not significantly reduce the execution time, it keeps the
transaction sizes in check and avoids connection timeouts.

Users (super admin) can fine tune the right chunk size for their database by
specifying a numeric value in the "Fixed Parameters" text box of the add/edit
job UI form.
specimen stats for every registered participant across all CPs.
1. Added many-to-one association of CP with CPG. Removed the intermediary
   OS_CP_GROUP_CPS table.

2. Fixed CP add/edit APIs to add / remove to / from group

3. Fixed CPG list API to return the CPs list in chunks / pages instead of
   all the CPs.

4. Added APIs to add / remove bulk CPs to / from CPG

5. Updated the CP APIs to update CP - CPG association in bulk using CSV
   import / export

6. Audit association of CP - CPG

7. Modified permissions: Users can add / remove CP to / from group provided
   they have CP update rights. This is different than earlier approach,
   which required users to have update rights on all group CPs.

8. Other access restrictions continue AS IS.

(At no point in time, all CPs of the group are materialised/fetched into
memory unless the selected page size is large)
Replaces the inline save button with a manual modal dialog to ensure
signature is saved. The modal persists until the user explicitly
selects 'Done' or 'Cancel'.

Why auto-save was not implemented?
Auto saving signatures introduces technical and reliability debt:
a) Stroke Detection: Hard to determine when a user is actually finished.
b) Concurrency: Out of sequence HTTP requests
c) Debouncing: Perceived lag and inconsistent state.

Underlying principle is always to keep things simple.
…rm records.

1) Send Survey: Added a button to the record overview that triggers an
   email/SMS link to participants for remote completion.

2) Survey Mode: Provides an UI toggle for users to enter form data using
   the survey interface.
… including the IDs.

This helps the exported JSON to be reusable across multiple DB instances as long as
the names match or remain consistent.
This will ensure the data model is in sync with the object model.
This ensures the same older label generator and print rules work without
any modification.
Replaced error() => catch() for handling errors.
- Move to Spring 7.x (Jakarta/EE 11 baseline)
- Upgrade Hibernate to 7.x
- Fix compile/runtime issues introduced by the upgrade
- Run basic smoke tests
…r optimisations...

(Optimisations will be enabled later... For now getting the platform ready to jump to ...)
which URL placeholders map to the function arguments/parameters.
Replaced row-based field alignment with a column-based layout.

Fields populate the first column, then move to the second and
third, ensuring better organisation for dense data sets.

(A.k.a - newspaper layout for improved readability)
inserts after Hibernate 7 migration.

Positions are persisted via the container side of the relationship.
…lity

Updated permitAll() endpoints to use explicit, absolute paths.

Spring 7.x has removed support for lenient path matching
(That is, suffix matching and certain Ant-style wildcards).

Updated
- /forgot-password to /users/forgot-password
- /reset-password to /users/reset-password
- /sign-up to /users/sign-up
… management

Problem: AbstractDao.saveOrUpdate is restricted to Identifiable types.
The Lock entity (used by Audit Service) lacks this interface, causing a type
mismatch error inspite of being a valid persistent entity.

Solution:
- Added save and update methods in Dao/AbstractDao to allow persistence of
  non-Identifiable entities.

- Updated AuditService to use save() to acquire locks and update() for releasing
  locks after retrieval.

This helps resolve the audit API crash while maintaining the legacy saveOrUpdate
logic for other existing service flows.
Binding between URL placeholders and method parameters is now explicit.

This addresses issues where Spring no longer discovers parameter names
via reflection/debug symbols, a common requirement in Spring 7.x and
Java 17+ envs.
…in Raise Query dialog

Problem: The fields dropdown was appearing empty because the collection & received
events are removed. This resulted in breaking of the data source for rendering the
UI dropdown component.

Solution: Updated the plugin hook properties to pass the collection & received event
dictionaries. This allows the Raise Query dialog to correctly resolve and render the
available fields.
…tion of

positions and enforced slot uniqueness

1) Reduced memory footprint by avoiding eager materialisation of occupiedPositions
   using cached ordinals.

2) Switched add/remove position ops to direct DB writes and also keeping ordinals
   cache in sync.

3) Added queries for occupied ordinals, specific position lookup, reservation lookup,
   and capacity checks.

4) Reworked block/unblock APIs to operate on in‑memory positions for correct bulk
   location updates.

5) Updated empty‑positions report to use cached ordinals instead of full position
   entities.

6) Enforced unique slot occupancy with DB constraints.

7) Refined assignPositions API to use two‑pass vacate/assign with flush, while
   ensuring a single transfer event per specimen by reusing SpecimenTransferEvent.
…d Checkboxes.

Hide the newer PV-based Radio and Checkboxes.

Rename the PV based "Dropdown" to "Permissible Value"

Reason: Having many PV based fields means the query module would have to join
with the PV table for each field appearing in the query either a filter, or
select field, or grouping category. There's a hard limit of 61 joins imposed by
MySQL. In view of this, we are taking one step back to ensure users are not
impacted by this and solve the query problem before moving to PV based fields.
Allow radio buttons, checkboxes, single-select dropdowns, and multi-select
dropdowns to be converted to PV-based dropdown fields.

Users can select an existing PV attribute or create a new form-scoped
attribute using the field's existing options.

Migrate existing data by renaming the value column, creating a new column
for PV IDs, and resolving stored option values to the corresponding PV IDs.

Restore schema changes and delete newly created PV attributes when the
conversion fails.
Set the existing user ID on the updated user instance to prevent a
TransientPropertyValueException while adding the auto login audit log.

Partial updates were unaffected because UserFactory already assigns the
existing user ID to the updated instance.
…rotocol

Report that the collection protocol ID or short title may be missing or
invalid when the domain (CPR/Visit/Specimen) object has no resolved
collection protocol.
Reject checkout when the container is already checked out or has a
blocked checkout position.

This prevents duplicate transfer events and retains the container's
valid checkout state.
1. Repair missing object type and ID values from v12.2.x upgrades

2. Associate legacy form files immediately after MigrateFormFiles
   populates them.
Rename the reserved "file" alias to "dfile" in the Liquibase and Java migration
SQL to prevent the ORA-02012 missing USING keyword error.
Make the renamed legacy value column nullable to allow new records to be
saved after conversion.

Replace the existing unique index with one on the PV value and record ID,
and add a separate index on the record ID for efficient lookups.
…() funcion

for use in queries.

Usage:
To query specimens created in last 15 minutes, use the following calculated
field/filter.

minutes_between(current_timestamp(), Specimen.createdOn) < 15

DE Commit: 7ba58153f9e11628a5976e3a382012e6235c93c8
Update MySQL and Oracle specimen stats procedures to source collection
and received details from OS_SPMN_COLL_RECV_DETAILS using the specimen's
PRIMARY_SPECIMEN_ID.
Update MySQL and Oracle specimen stats procedures to source collection
and received details from OS_SPMN_COLL_RECV_DETAILS using the specimen's
PRIMARY_SPECIMEN_ID.
Ensure ACL rows are inserted and removed from the same database used to
execute the query.

When the reporting database is configured, use it for ACL insertion and
cleanup. Otherwise, use the operational database for all operations.
Read collection and received details from the specimen table and use
the specimen hierarchy to propagate primary specimen details to its
descendants.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants