Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] Custom states #8438

Open
wants to merge 24 commits into
base: master
Choose a base branch
from

Conversation

SchrodingersGat
Copy link
Member

@SchrodingersGat SchrodingersGat commented Nov 6, 2024

This PR is an update to the "custom states" functionality, to improve usability and extend user interface integration

Tasks

  • Improved back-end validation
  • Improved form management for creating / editing a custom state
  • Display proper custom state in PUI for individual detail views
  • Display proper custom state in PUI for tables
  • Ensure matching logical state is set when transitioning to a custom state
  • Check that "custom" state can only be set to appropriate values
  • Look at removing "model" field from CustomState table
  • Add custom states to the demo dataset
  • Extend existing unit testing to ensure that all new validations checks are tested
  • Add playwright tests for custom states (after demo dataset is updated)
  • Ensure table filtering works with custom state values - Custom Stock Status filter does not work #8612

@SchrodingersGat SchrodingersGat added enhancement This is an suggested enhancement or new feature old user interface Issues with Old User interface refactor Platform UI Related to the React based User Interface labels Nov 6, 2024
@SchrodingersGat SchrodingersGat added this to the 1.0.0 milestone Nov 6, 2024
Copy link

netlify bot commented Nov 6, 2024

Deploy Preview for inventree-web-pui-preview ready!

Name Link
🔨 Latest commit a8c6563
🔍 Latest deploy log https://app.netlify.com/sites/inventree-web-pui-preview/deploys/67471f18bea4ef000876d500
😎 Deploy Preview https://deploy-preview-8438--inventree-web-pui-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 100 (no change from production)
Accessibility: 86 (no change from production)
Best Practices: 100 (no change from production)
SEO: 78 (no change from production)
PWA: -
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify site configuration.

@SchrodingersGat
Copy link
Member Author

@matmair I have been looking at the implementation of custom states and there are a few areas which I think can be cleaned up a bit.

One question I have is: what is the value of the model (ContentType) field on the InvenTreeCustomUserStateModel model? We already map to a status group, which implies a given model type. I don't see the value of having a separate field (which the user has to know how to fill in) - which can conflict with the specified statuscode.

I would suggest that we remove the model field and rely on the reference_status field to perform this functionality

@matmair
Copy link
Member

matmair commented Nov 6, 2024

@SchrodingersGat there is only an implicit link between status groups and models. When you start shipping custom models in plugins and using custom states there you need some way to prefilter possible selections.

@SchrodingersGat
Copy link
Member Author

I don't understand the use case here - in what circumstance would you want to make a custom state which overrides a BuildStatus code, but links to a SalesOrderShipment model? (for example)

@matmair
Copy link
Member

matmair commented Nov 6, 2024

The use case is enabling order when you have 40+ state groups and need to filter to manage them. If you see no value you can remove this and I will patch my custom fork for support, it seems anyway like I will never be able to use upstream.

There is no reliable link between a state named "SomeModelStatus" and the model "SomeModel" - especially with possible model name collisions between (3rd party) apps.

@wolflu05
Copy link
Contributor

wolflu05 commented Nov 6, 2024

(Just a question, no opinion here, I just want to understand your design choice)

Do you have any example scenario where custom states and models are in a relationship other than n:1? (E.g. the same custom state is assigned to multiple models. If not, doesn't that say that each custom state has only one model, which implicitly means there is a reliable link between a state and the model.

Copy link

codecov bot commented Nov 8, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 84.57%. Comparing base (a48d23b) to head (a8c6563).

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #8438      +/-   ##
==========================================
- Coverage   84.59%   84.57%   -0.02%     
==========================================
  Files        1182     1182              
  Lines       54004    53905      -99     
  Branches     2030     2026       -4     
==========================================
- Hits        45683    45590      -93     
+ Misses       7818     7814       -4     
+ Partials      503      501       -2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@matmair
Copy link
Member

matmair commented Nov 9, 2024

Implicit is the key here; there is no reliable way to map a custom state to a model, thus automation that needs to make this link will not be able to function anymore if it is removed. I do not rely on implicit mapping in my business-critical LoB
apps.

@SchrodingersGat
Copy link
Member Author

SchrodingersGat commented Nov 24, 2024

Looking into this further, I think that if you want to link a "status group" to a particular database model, that should be done at the class level, rather than linking for each custom status field. Otherwise, you could end up with a (supposedly valid) situation as below:

Status Reference Linked State Custom State Linked Model
PurchaseOrderStatus PENDING AWAITING_APPROVAL PurchaseOrder
PurchaseOrderStatus PENDING OTHER_STATUS_A PurchaseOrder
PurchaseOrderStatus PENDING OTHER_STATUS_B User

There is no validation that custom status values must point to the same model, or that the linked model must be in any way related to the parent "status reference". To me, this does not make much sense. I would suggest that we a get_model_class() method to the StatusCode class - which by deafult returns None. Then, any subclass can reimplement this to point to a given db model class (if required).

It removes the requirement that the user knows what model a custom status needs to point to (currently this must be picked as it is a required field). Unless you can make a case for allowing arbitrary assignment of a DB model to a custom state, I'd like to remove this field and implement as discussed above.

@matmair
Copy link
Member

matmair commented Nov 24, 2024

I really would have liked to discuss these things before the original PR was merged. I built a ton of plugins and integrations around the merged (and thus I thought agreed upon) state and at this point, I am just frustrated when I open up GitHub with the instability of interfaces.

@SchrodingersGat
Copy link
Member Author

@matmair I probably should have reviewed this more closely the first time around. As part of trying to fix #7990 I have identified a number of bugs / shortcomings of the current implementation. I am trying my best to rectify these without too many changes to the existing interface.

One of the outstanding issues is the "model allocation". I would like to understand more about how you are using it, and whether a strict in-code link between the particular StatusCode sub-class and a DB model would be sufficient

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement This is an suggested enhancement or new feature old user interface Issues with Old User interface Platform UI Related to the React based User Interface refactor
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Custom Stock Status cannot be set from Stock Actions
3 participants