mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-03 22:55:43 +00:00 
			
		
		
		
	Added docs on the panel plugin example (#5402)
* added docu and image for panel plugin example * format
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								docs/docs/assets/images/plugin/plugin_dataflow.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/docs/assets/images/plugin/plugin_dataflow.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 26 KiB  | 
@@ -57,14 +57,15 @@ Note : see convention for template directory above.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Refer to the `CustomPanelSample` example class in the `./plugin/samples/integration/` directory, for a fully worked example of how custom UI panels can be implemented.
 | 
					Refer to the `CustomPanelSample` example class in the `./plugin/samples/integration/` directory, for a fully worked example of how custom UI panels can be implemented.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### An example with button
 | 
					### An example with button and parameter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Let's have a look at another example. We like to have a new panel that contains a button.
 | 
					Let's have a look at another example. We like to have a new panel that contains a button.
 | 
				
			||||||
Each time the button is clicked, a python function in our plugin shall be executed and
 | 
					Each time the button is clicked, a python function in our plugin shall be executed and
 | 
				
			||||||
do something useful. The result will look like that:
 | 
					a parameter shall be transferred . The result will look like that:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% with id="mouser", url="plugin/mouser.png", description="Panel example with button" %} {% include "img.html" %} {% endwith %}
 | 
					{% with id="mouser", url="plugin/mouser.png", description="Panel example with button" %} {% include "img.html" %} {% endwith %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
First we need to write the plugin code, similar as in the example above.
 | 
					First we need to write the plugin code, similar as in the example above.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```python
 | 
					```python
 | 
				
			||||||
@@ -99,32 +100,31 @@ class MouserCartPanel(PanelMixin, SettingsMixin, InvenTreePlugin, UrlsMixin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def setup_urls(self):
 | 
					    def setup_urls(self):
 | 
				
			||||||
        return [
 | 
					        return [
 | 
				
			||||||
            url(r'mouser/getcart', self.GetCart, name='get-cart'),
 | 
					            url(r'transfercart/(?P<pk>\d+)/', self.TransferCart, name='get-cart')
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#----------------------------------------------------------------------------
 | 
					#----------------------------------------------------------------------------
 | 
				
			||||||
    def GetCart(self,request):
 | 
					    def TransferCart(self,request,pk):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        print('User:',request.user)
 | 
					        print('User,pk:',request.user,pk)
 | 
				
			||||||
        self.value=self.value+1
 | 
					        self.value=self.value+1
 | 
				
			||||||
        return HttpResponse(f'OK')
 | 
					        return HttpResponse(f'OK')
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The code is simple and really stripped down to the minimum. In the plugin class we first define the plugin metadata.
 | 
					The code is simple and really stripped down to the minimum. In the plugin class we first define the plugin metadata.
 | 
				
			||||||
Afterwards we define the custom panel. Here we use a html template to describe the content of the panel. We need to
 | 
					Afterwards we define the custom panel. Here we use a html template to describe the content of the panel. We need to
 | 
				
			||||||
add the path here because the template resides in the subdirectory templates/mouser.
 | 
					add the path here because the template resides in the subdirectory templates/mouser.
 | 
				
			||||||
Then we setup the url. This is important. The url connects the http request with the function to be executed.
 | 
					Then we setup the url. This is important. The url connects the http request with the function to be executed.
 | 
				
			||||||
 | 
					May be it is worth to leave a few more words on this because the string looks a bit like white noise.
 | 
				
			||||||
 | 
					*transfercart* is the url which can be chosen freely. The ? is well known for parameters. In this case we
 | 
				
			||||||
 | 
					get just one parameter, the orders primary key.* \d+* is a regular expression that limits the parameters
 | 
				
			||||||
 | 
					to a digital number with n digits. Let's have a look on the names and how they belong together:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 * mouser/getcart: Path of the url together with SLUG
 | 
					{% with id="plugin_dataflow", url="plugin/plugin_dataflow.png", description="Dataflow between Javescript and Python" %} {% include "img.html" %} {% endwith %}
 | 
				
			||||||
 * self.GetCart: This is the function to be called. It is defined further down
 | 
					 | 
				
			||||||
 * get-cart: This is the name of the url that needs to be referenced in the html template. We see that later.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Finally we define the function. This is a simple increment of a class value.
 | 
					Finally we define the function. This is a simple increment of a class value.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now lets have a look at the template file mouser.html
 | 
				
			||||||
New lets have a look at the template file mouser.html
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
```html
 | 
					```html
 | 
				
			||||||
{% raw %}
 | 
					{% raw %}
 | 
				
			||||||
@@ -132,7 +132,7 @@ New lets have a look at the template file mouser.html
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
async function JGetCart(){
 | 
					async function JGetCart(){
 | 
				
			||||||
    response = await fetch( '{% url "plugin:mousercart:get-cart" %}');
 | 
					    response = await fetch( '{% url "plugin:mousercart:get-cart" order.pk %}');
 | 
				
			||||||
    location.reload();
 | 
					    location.reload();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
@@ -149,7 +149,7 @@ async function JGetCart(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
We start with a bit of javascript. The function JGetCart just calls the url that has been defined in the python code above.
 | 
					We start with a bit of javascript. The function JGetCart just calls the url that has been defined in the python code above.
 | 
				
			||||||
The url consists of a full path `plugin:plugin-name:url-name`. The plugin-name is the SLUG that was defined in the plugin code.
 | 
					The url consists of a full path `plugin:plugin-name:url-name`. The plugin-name is the SLUG that was defined in the plugin code.
 | 
				
			||||||
Then just a reload.
 | 
					order.pk is the parameter that is passed to python. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The button is defined  with `class="btn btn-info` This is an InvenTree predefined button. There a are lots of others available.
 | 
					The button is defined  with `class="btn btn-info` This is an InvenTree predefined button. There a are lots of others available.
 | 
				
			||||||
Here are some examples of available colors:
 | 
					Here are some examples of available colors:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user