mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-18 04:55:44 +00:00
[Feature] Add RMA support (#4488)
* Adds ReturnOrder and ReturnOrderAttachment models
* Adds new 'role' specific for return orders
* Refactor total_price into a mixin
- Required for PurchaseOrder and SalesOrder
- May not be required for ReturnOrder (remains to be seen)
* Adds API endpoints for ReturnOrder
- Add list endpoint
- Add detail endpoint
- Adds required serializer models
* Adds basic "index" page for Return Order model
* Update API version
* Update navbar text
* Add db migration for new "role"
* Add ContactList and ContactDetail API endpoints
* Adds template and JS code for manipulation of contacts
- Display a table
- Create / edit / delete
* Splits order.js into multiple files
- Javascript files was becoming extremely large
- Hard to debug and find code
- Split into purchase_order / return_order / sales_order
* Fix role name (change 'returns' to 'return_order')
- Similar to existing roles for purchase_order and sales_order
* Adds detail page for ReturnOrder
* URL cleanup
- Use <int:pk> instead of complex regex
* More URL cleanup
* Add "return orders" list to company detail page
* Break JS status codes into new javascript file
- Always difficult to track down where these are rendered
- Enough to warrant their own file now
* Add ability to edit return order from detail page
* Database migrations
- Add new ReturnOrder modeles
- Add new 'contact' field to external orders
* Adds "contact" to ReturnOrder
- Implement check to ensure that the selected "contact" matches the selected "company"
* Adjust filters to limit contact options
* Fix typo
* Expose 'contact' field for PurchaseOrder model
* Render contact information
* Add "contact" for SalesOrder
* Adds setting to enable / disable return order functionality
- Simply hides the navigation elements
- API is not disabled
* Support filtering ReturnOrder by 'status'
- Refactors existing filter into the OrderFilter class
* js linting
* More JS linting
* Adds ReturnOrderReport model
* Add serializer for the ReturnOrderReport model
- A little bit of refactoring along the way
* Admin integration for new report model
* Refactoring for report.api
- Adds generic mixins for filtering queryset (based on updates to label.api)
- Reduces repeated code a *lot*
* Exposes API endpoints for ReturnOrderReport
* Adds default example report file for ReturnOrder
- Requires some more work :)
* Refactor report printing javascript code
- Replace all existing functions with 'printReports'
* Improvements for default StockItem test report template
- Fix bug in template
- Handle potential errors in template tags
- Add more helpers to report tags
- Improve test result rendering
* Reduce logging verbosity from weasyprint
* Refactor javascript for label printing
- Consolidate into a single function
- Similar to refactor of report functions
* Add report print button to return order page
* Record user reference when creating via API
* Refactor order serializers
- Move common code into AbstractOrderSerializer class
* Adds extra line item model for the return order
- Adds serializer and API endpoints as appropriate
* Render extra line table for return order
- Refactor existing functions into a single generic function
- Reduces repeated JS code a lot
* Add ability to create a new extra line item
* Adds button for creating a new lien item
* JS linting
* Update test
* Typo fix
(cherry picked from commit 28ac2be35b
)
* Enable search for return order
* Don't do pricing (yet) for returnorder extra line table
- Fixes an uncaught error
* Error catching for api.js
* Updates for order models:
- Add 'target_date' field to abstract Order model
- Add IN_PROGRESS status code for return order
- Refactor 'overdue' and 'outstanding' API queries
- Refactor OVERDUE_FILTER on order models
- Refactor is_overdue on order models
- More table filters for return order model
* JS cleanup
* Create ReturnOrderLineItem model
- New type of status label
- Add TotalPriceMixin to ReturnOrder model
* Adds an API serializer for the ReturnOrderLineItem model
* Add API endpoints for ReturnOrderLineItem model
- Including some refactoring along the way
* javascript: refactor loadTableFilters function
- Pass enforced query through to the filters
- Call Object.assign() to construct a superset query
- Removes a lot of code duplication
* Refactor hard-coded URLS to use {% url %} lookup
- Forces error if the URL is wrong
- If we ever change the URL, will still work
* Implement creation of new return order line items
* Adds 'part_detail' annotation to ReturnOrderLineItem serializer
- Required for rendering part information
* javascript: refactor method for creating a group of buttons in a table
* javascript: refactor common buttons with helper functions
* Allow edit and delete of return order line items
* Add form option to automatically reload a table on success
- Pass table name to options.refreshTable
* JS linting
* Add common function for createExtraLineItem
* Refactor loading of attachment tables
- Setup drag-and-drop as part of core function
* CI fixes
* Refactoring out some more common API endpoint code
* Update migrations
* Fix permission typo
* Refactor for unit testing code
* Add unit tests for Contact model
* Tests for returnorder list API
* Annotate 'line_items' to ReturnOrder serializer
* Driving the refactor tractor
* More unit tests for the ReturnOrder API endpoints
* Refactor "print orders" button for various order tables
- Move into "setupFilterList" code (generic)
* add generic 'label printing' button to table actions buttons
* Refactor build output table
* Refactoring icon generation for js
* Refactoring for Part API
* Fix database model type for 'received_date'
* Add API endpoint to "issue" a ReturnOrder
* Improvements for stock tracking table
- Add new status codes
- Add rendering for SalesOrder
- Add rendering for ReturnOrder
- Fix status badges
* Adds functionality to receive line items against a return order
* Add endpoints for completing and cancelling orders
* Add option to allow / prevent editing of ReturnOrder after completed
* js linting
* Wrap "add extra line" button in setting check
* Updates to order/admin.py
* Remove inline admin for returnorderline model
* Updates to pass CI
* Serializer fix
* order template fixes
* Unit test fix
* Fixes for ReturnOrder.receive_line_item
* Unit testing for receiving line items against an RMA
* Improve example report for return order
* Extend unit tests for reporting
* Cleanup here and there
* Unit testing for order views
* Clear "sales_order" field when returning against ReturnOrder
* Add 'location' to deltas when returning from customer
* Bug fix for unit test
This commit is contained in:
@ -85,7 +85,7 @@ class RoleGroupAdmin(admin.ModelAdmin): # pragma: no cover
|
||||
]
|
||||
|
||||
list_display = ('name', 'admin', 'part_category', 'part', 'stocktake', 'stock_location',
|
||||
'stock_item', 'build', 'purchase_order', 'sales_order')
|
||||
'stock_item', 'build', 'purchase_order', 'sales_order', 'return_order')
|
||||
|
||||
def get_rule_set(self, obj, rule_set_type):
|
||||
"""Return list of permissions for the given ruleset."""
|
||||
@ -161,6 +161,10 @@ class RoleGroupAdmin(admin.ModelAdmin): # pragma: no cover
|
||||
"""Return the ruleset for the SalesOrder role"""
|
||||
return self.get_rule_set(obj, 'sales_order')
|
||||
|
||||
def return_order(self, obj):
|
||||
"""Return the ruleset ofr the ReturnOrder role"""
|
||||
return self.get_rule_set(obj, 'return_order')
|
||||
|
||||
def get_formsets_with_inlines(self, request, obj=None):
|
||||
"""Return all inline formsets"""
|
||||
for inline in self.get_inline_instances(request, obj):
|
||||
|
18
InvenTree/users/migrations/0007_alter_ruleset_name.py
Normal file
18
InvenTree/users/migrations/0007_alter_ruleset_name.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.2.18 on 2023-03-14 10:07
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0006_alter_ruleset_name'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='ruleset',
|
||||
name='name',
|
||||
field=models.CharField(choices=[('admin', 'Admin'), ('part_category', 'Part Categories'), ('part', 'Parts'), ('stocktake', 'Stocktake'), ('stock_location', 'Stock Locations'), ('stock', 'Stock Items'), ('build', 'Build Orders'), ('purchase_order', 'Purchase Orders'), ('sales_order', 'Sales Orders'), ('return_order', 'Return Orders')], help_text='Permission set', max_length=50),
|
||||
),
|
||||
]
|
@ -42,6 +42,7 @@ class RuleSet(models.Model):
|
||||
('build', _('Build Orders')),
|
||||
('purchase_order', _('Purchase Orders')),
|
||||
('sales_order', _('Sales Orders')),
|
||||
('return_order', _('Return Orders')),
|
||||
]
|
||||
|
||||
RULESET_NAMES = [
|
||||
@ -135,6 +136,7 @@ class RuleSet(models.Model):
|
||||
'purchase_order': [
|
||||
'company_company',
|
||||
'company_companyattachment',
|
||||
'company_contact',
|
||||
'company_manufacturerpart',
|
||||
'company_manufacturerpartparameter',
|
||||
'company_supplierpart',
|
||||
@ -148,6 +150,7 @@ class RuleSet(models.Model):
|
||||
'sales_order': [
|
||||
'company_company',
|
||||
'company_companyattachment',
|
||||
'company_contact',
|
||||
'order_salesorder',
|
||||
'order_salesorderallocation',
|
||||
'order_salesorderattachment',
|
||||
@ -155,6 +158,16 @@ class RuleSet(models.Model):
|
||||
'order_salesorderextraline',
|
||||
'order_salesordershipment',
|
||||
'report_salesorderreport',
|
||||
],
|
||||
'return_order': [
|
||||
'company_company',
|
||||
'company_companyattachment',
|
||||
'company_contact',
|
||||
'order_returnorder',
|
||||
'order_returnorderlineitem',
|
||||
'order_returnorderextraline',
|
||||
'order_returnorderattachment',
|
||||
'report_returnorderreport',
|
||||
]
|
||||
}
|
||||
|
||||
@ -172,7 +185,6 @@ class RuleSet(models.Model):
|
||||
'common_webhookmessage',
|
||||
'common_notificationentry',
|
||||
'common_notificationmessage',
|
||||
'company_contact',
|
||||
'users_owner',
|
||||
|
||||
# Third-party tables
|
||||
@ -505,6 +517,26 @@ def clear_user_role_cache(user):
|
||||
cache.delete(key)
|
||||
|
||||
|
||||
def get_user_roles(user):
|
||||
"""Return all roles available to a given user"""
|
||||
|
||||
roles = set()
|
||||
|
||||
for group in user.groups.all():
|
||||
for rule in group.rule_sets.all():
|
||||
name = rule.name
|
||||
if rule.can_view:
|
||||
roles.add(f'{name}.view')
|
||||
if rule.can_add:
|
||||
roles.add(f'{name}.add')
|
||||
if rule.can_change:
|
||||
roles.add(f'{name}.change')
|
||||
if rule.can_delete:
|
||||
roles.add(f'{name}.delete')
|
||||
|
||||
return roles
|
||||
|
||||
|
||||
def check_user_role(user, role, permission):
|
||||
"""Check if a user has a particular role:permission combination.
|
||||
|
||||
|
Reference in New Issue
Block a user