mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	User token table (#9954)
* Tweak layout of Token dialog * Render user details in API token table * Bump API version
This commit is contained in:
		| @@ -1,12 +1,15 @@ | ||||
| """InvenTree API version information.""" | ||||
|  | ||||
| # InvenTree API version | ||||
| INVENTREE_API_VERSION = 362 | ||||
| INVENTREE_API_VERSION = 363 | ||||
|  | ||||
| """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" | ||||
|  | ||||
| INVENTREE_API_TEXT = """ | ||||
|  | ||||
| v363 -> 2025-07-04 : https://github.com/inventree/InvenTree/pull/9954 | ||||
|     - Adds "user_detail" field to the ApiToken serializer | ||||
|  | ||||
| v362 -> 2025-07-02 : https://github.com/inventree/InvenTree/pull/9939 | ||||
|     - Allow filtering of BuildItem API by "location" of StockItem | ||||
|     - Allow filtering of SalesOrderAllocation API by "location" of StockItem | ||||
|   | ||||
| @@ -134,46 +134,6 @@ def generate_roles_dict(roles) -> dict: | ||||
|     return role_dict | ||||
|  | ||||
|  | ||||
| class ApiTokenSerializer(InvenTreeModelSerializer): | ||||
|     """Serializer for the ApiToken model.""" | ||||
|  | ||||
|     in_use = serializers.SerializerMethodField(read_only=True) | ||||
|     user = serializers.PrimaryKeyRelatedField( | ||||
|         queryset=User.objects.all(), required=False | ||||
|     ) | ||||
|  | ||||
|     def get_in_use(self, token: ApiToken) -> bool: | ||||
|         """Return True if the token is currently used to call the endpoint.""" | ||||
|         from InvenTree.middleware import get_token_from_request | ||||
|  | ||||
|         request = self.context.get('request') | ||||
|         rq_token = get_token_from_request(request) | ||||
|         return token.key == rq_token | ||||
|  | ||||
|     class Meta: | ||||
|         """Meta options for ApiTokenSerializer.""" | ||||
|  | ||||
|         model = ApiToken | ||||
|         fields = [ | ||||
|             'created', | ||||
|             'expiry', | ||||
|             'id', | ||||
|             'last_seen', | ||||
|             'name', | ||||
|             'token', | ||||
|             'active', | ||||
|             'revoked', | ||||
|             'user', | ||||
|             'in_use', | ||||
|         ] | ||||
|  | ||||
|     def validate(self, data): | ||||
|         """Validate the data for the serializer.""" | ||||
|         if 'user' not in data: | ||||
|             data['user'] = self.context['request'].user | ||||
|         return super().validate(data) | ||||
|  | ||||
|  | ||||
| class GetAuthTokenSerializer(serializers.Serializer): | ||||
|     """Serializer for the GetAuthToken API endpoint.""" | ||||
|  | ||||
| @@ -248,6 +208,49 @@ class UserSerializer(InvenTreeModelSerializer): | ||||
|     ) | ||||
|  | ||||
|  | ||||
| class ApiTokenSerializer(InvenTreeModelSerializer): | ||||
|     """Serializer for the ApiToken model.""" | ||||
|  | ||||
|     in_use = serializers.SerializerMethodField(read_only=True) | ||||
|     user = serializers.PrimaryKeyRelatedField( | ||||
|         queryset=User.objects.all(), required=False | ||||
|     ) | ||||
|  | ||||
|     def get_in_use(self, token: ApiToken) -> bool: | ||||
|         """Return True if the token is currently used to call the endpoint.""" | ||||
|         from InvenTree.middleware import get_token_from_request | ||||
|  | ||||
|         request = self.context.get('request') | ||||
|         rq_token = get_token_from_request(request) | ||||
|         return token.key == rq_token | ||||
|  | ||||
|     class Meta: | ||||
|         """Meta options for ApiTokenSerializer.""" | ||||
|  | ||||
|         model = ApiToken | ||||
|         fields = [ | ||||
|             'created', | ||||
|             'expiry', | ||||
|             'id', | ||||
|             'last_seen', | ||||
|             'name', | ||||
|             'token', | ||||
|             'active', | ||||
|             'revoked', | ||||
|             'user', | ||||
|             'user_detail', | ||||
|             'in_use', | ||||
|         ] | ||||
|  | ||||
|     def validate(self, data): | ||||
|         """Validate the data for the serializer.""" | ||||
|         if 'user' not in data: | ||||
|             data['user'] = self.context['request'].user | ||||
|         return super().validate(data) | ||||
|  | ||||
|     user_detail = UserSerializer(source='user', read_only=True) | ||||
|  | ||||
|  | ||||
| class GroupSerializer(InvenTreeModelSerializer): | ||||
|     """Serializer for a 'Group'.""" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user