Improved Owner.get_owner method and fixed tests (try#2)

This commit is contained in:
eeintech 2021-01-12 16:36:29 -05:00
parent 49c954aa68
commit 5ca03af3e2
4 changed files with 86 additions and 39 deletions

View File

@ -154,7 +154,7 @@ def authorized_owners(group):
owners = [] owners = []
try: try:
for owner in group.get_users(include_group=True): for owner in group.get_related_owners(include_group=True):
owners.append(owner.owner) owners.append(owner.owner)
except AttributeError: except AttributeError:
# group is None # group is None

View File

@ -323,11 +323,9 @@ class StockOwnershipTest(StockViewTestCase):
self.assertEqual(location.owner, user_group_owner) self.assertEqual(location.owner, user_group_owner)
# Test item edit # Test item edit
# response = self.client.post(reverse('stock-item-edit', args=(test_item_id,)), response = self.client.post(reverse('stock-item-edit', args=(test_item_id,)),
# {'part': 1, 'status': StockStatus.OK, 'owner': new_user_as_owner.pk}, {'part': 1, 'status': StockStatus.OK, 'owner': new_user_as_owner.pk},
# HTTP_X_REQUESTED_WITH='XMLHttpRequest') HTTP_X_REQUESTED_WITH='XMLHttpRequest')
# print(response.content)
# self.assertContains(response, '"form_valid": false', status_code=200)
# Make sure the item's owner is unchanged # Make sure the item's owner is unchanged
item = StockItem.objects.get(pk=test_item_id) item = StockItem.objects.get(pk=test_item_id)
@ -384,18 +382,19 @@ class StockOwnershipTest(StockViewTestCase):
} }
# Try to create new item with no owner # Try to create new item with no owner
# response = self.client.post(reverse('stock-item-create'), response = self.client.post(reverse('stock-item-create'),
# new_item, HTTP_X_REQUESTED_WITH='XMLHttpRequest') new_item, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
# self.assertContains(response, '"form_valid": false', status_code=200) # print(response.content)
self.assertContains(response, '"form_valid": false', status_code=200)
# Try to create new item with invalid owner # Try to create new item with invalid owner
# new_item['owner'] = user_as_owner new_item['owner'] = user_as_owner.pk
# response = self.client.post(reverse('stock-item-create'), response = self.client.post(reverse('stock-item-create'),
# new_item, HTTP_X_REQUESTED_WITH='XMLHttpRequest') new_item, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
# self.assertContains(response, '"form_valid": false', status_code=200) self.assertContains(response, '"form_valid": false', status_code=200)
# Try to create new item with valid owner # Try to create new item with valid owner
new_item['owner'] = new_user_as_owner new_item['owner'] = new_user_as_owner.pk
response = self.client.post(reverse('stock-item-create'), response = self.client.post(reverse('stock-item-create'),
new_item, HTTP_X_REQUESTED_WITH='XMLHttpRequest') new_item, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertContains(response, '"form_valid": true', status_code=200) self.assertContains(response, '"form_valid": true', status_code=200)

View File

@ -37,6 +37,7 @@ from .models import StockItem, StockLocation, StockItemTracking, StockItemAttach
import common.settings import common.settings
from common.models import InvenTreeSetting from common.models import InvenTreeSetting
from users.models import Owner
from .admin import StockItemResource from .admin import StockItemResource
@ -166,7 +167,7 @@ class StockLocationEdit(AjaxUpdateView):
stock_ownership_control = InvenTreeSetting.get_setting('STOCK_OWNERSHIP_CONTROL') stock_ownership_control = InvenTreeSetting.get_setting('STOCK_OWNERSHIP_CONTROL')
if stock_ownership_control: if stock_ownership_control:
authorized_owners = self.object.owner.get_users() authorized_owners = self.object.owner.get_related_owners()
# Update children locations # Update children locations
children_locations = self.object.get_children() children_locations = self.object.get_children()
@ -1427,9 +1428,10 @@ class StockItemEdit(AjaxUpdateView):
# Check location owner type and filter # Check location owner type and filter
if type(location_owner.owner) is Group: if type(location_owner.owner) is Group:
queryset = location_owner.get_users(include_group=True) user_as_owner = Owner.get_owner(self.request.user)
if self.request.user in queryset: queryset = location_owner.get_related_owners(include_group=True)
form.fields['owner'].initial = self.request.user if user_as_owner in queryset:
form.fields['owner'].initial = user_as_owner
form.fields['owner'].queryset = queryset form.fields['owner'].queryset = queryset
elif type(location_owner.owner) is User: elif type(location_owner.owner) is User:
form.fields['owner'].disabled = True form.fields['owner'].disabled = True
@ -1446,9 +1448,10 @@ class StockItemEdit(AjaxUpdateView):
# Check location owner type and filter # Check location owner type and filter
if type(item_owner.owner) is Group: if type(item_owner.owner) is Group:
queryset = item_owner.get_users(include_group=True) user_as_owner = Owner.get_owner(self.request.user)
if self.request.user in queryset: queryset = item_owner.get_related_owners(include_group=True)
form.fields['owner'].initial = self.request.user if user_as_owner in queryset:
form.fields['owner'].initial = user_as_owner
form.fields['owner'].queryset = queryset form.fields['owner'].queryset = queryset
elif type(item_owner.owner) is User: elif type(item_owner.owner) is User:
form.fields['owner'].disabled = True form.fields['owner'].disabled = True
@ -1727,6 +1730,8 @@ class StockItemCreate(AjaxCreateView):
ForeignKey choices based on other selections ForeignKey choices based on other selections
""" """
print('------------ FORM ------------------')
form = super().get_form() form = super().get_form()
# Hide the "expiry date" field if the feature is not enabled # Hide the "expiry date" field if the feature is not enabled
@ -1797,17 +1802,25 @@ class StockItemCreate(AjaxCreateView):
if not stock_ownership_control: if not stock_ownership_control:
form.fields['owner'].widget = HiddenInput() form.fields['owner'].widget = HiddenInput()
else: else:
print('> Stock ownership is enabled')
try: try:
location_owner = location.owner location_owner = location.owner
except AttributeError: except AttributeError:
location_owner = None location_owner = None
print(f'{location_owner=}')
if location_owner: if location_owner:
# Check location owner type and filter # Check location owner type and filter
if type(location_owner.owner) is Group: if type(location_owner.owner) is Group:
queryset = location_owner.get_users() print(f'{self.request.user=}')
if self.request.user in queryset: user_as_owner = Owner.get_owner(self.request.user)
form.fields['owner'].initial = self.request.user print(f'{user_as_owner=}')
queryset = location_owner.get_related_owners()
print(f'{queryset=}')
if user_as_owner in queryset:
form.fields['owner'].initial = user_as_owner
form.fields['owner'].queryset = queryset form.fields['owner'].queryset = queryset
elif type(location_owner.owner) is User: elif type(location_owner.owner) is User:
form.fields['owner'].disabled = True form.fields['owner'].disabled = True

View File

@ -422,27 +422,62 @@ class Owner(models.Model):
except IntegrityError: except IntegrityError:
return None return None
return existing_owner
@classmethod @classmethod
def get_owner(cls, user_or_group): def get_owner(cls, user_or_group):
# Get corresponding owner owner = None
content_type_id = 0
content_type_id_list = [ContentType.objects.get_for_model(Group).id,
ContentType.objects.get_for_model(User).id]
# If instance type is obvious: set content type
if type(user_or_group) is Group:
content_type_id = content_type_id_list[0]
elif type(user_or_group) is User:
content_type_id = content_type_id_list[1]
if content_type_id:
try: try:
group = Owner.objects.get(owner_id=user_or_group.id, owner = Owner.objects.get(owner_id=user_or_group.id,
owner_type=ContentType.objects.get_for_model(Group).id) owner_type=content_type_id)
return group except Owner.DoesNotExist:
pass
else:
# Check whether user_or_group is a Group instance
try:
group = Group.objects.get(pk=user_or_group.id)
except Group.DoesNotExist:
group = None
if group:
try:
owner = Owner.objects.get(owner_id=user_or_group.id,
owner_type=content_type_id_list[0])
except Owner.DoesNotExist: except Owner.DoesNotExist:
pass pass
return owner
# Check whether user_or_group is a User instance
try: try:
user = Owner.objects.get(owner_id=user_or_group.id, user = User.objects.get(pk=user_or_group.id)
owner_type=ContentType.objects.get_for_model(User).id) except User.DoesNotExist:
return user user = None
if user:
try:
owner = Owner.objects.get(owner_id=user_or_group.id,
owner_type=content_type_id_list[1])
except Owner.DoesNotExist: except Owner.DoesNotExist:
pass pass
return None return owner
def get_users(self, include_group=False): return owner
def get_related_owners(self, include_group=False):
owner_users = None owner_users = None