<h1 align="center">Virtual Interface for Production & Experimental Research</h1>
<p align="center">
<picture>
<source srcset="https://raw.githubusercontent.com/JackLawrenceCRISPR/VIPER_LIMS/main/VIPER_Client/Sources/VIPER/Viper_Icon_Small.ico">
<img src="https://raw.githubusercontent.com/JackLawrenceCRISPR/VIPER_LIMS/main/VIPER_Client/Sources/VIPER/Viper_Icon_Small.ico">
</picture>
</p>
<h3 align="center">Easy | Modular | Lightweight</h3>
<p align="center">A simple, highly scalable & adaptable LIMS system for rapidly evolving laboratory teams.</p>
# Features
- **Customisable clientside:** Build your own VIPER modules in Python and help from Boa Constructor
- **Boa Constructor:** Make new HTML-Javascript-Python front-end modules with simple drag and drop
- **Client Scripting:** Beginner friendly code with complete control for advanced programmers
- **Client Commands:** Scriptable client to server requests passed through Server Methods
- **Server Methods:** Programmable permission authenticated serverside functions
- **Security:** OAuth2 user verification and encrypted HTTP requests
- **SQL:** Intrinsic support for MySQL, PostgreSQL and SQLite
- **OAuth2:** Intrinsic support for Github and LinkedIn OAuth2 Apps
### The Vision
- Lightweight plug-and-play framework
- Power for beginner programmers
- Freedom for advanced programmers
- Competency based permissions
# Installation
### Desktop Installation
[Requires Python (>=3.7)](https://www.python.org/downloads/)
Operating System terminal:
```
pip install VIPER_LIMS
```
Python terminal or script:
```python
import VIPER_LIMS
VIPER_LIMS.Install()
```
Please see the Server Installation Guide or Client Installation Guide below.
_Alternatively: download this repository and run VIPER_Installer/VIPER_LIMS/VIPER_Installer.py_
### Android Installation
Only the VIPER_Client is available for Android; it is not advised to run a VIPER_Server from Android devices.
1. Install Termux from [Github](https://github.com/termux/termux-app/releases) or [FDroid](https://f-droid.org/en/packages/com.termux/)
2. In the Termux app run the following commands in order, whilst reading and accepting appropraite requests:
```pkg install python```
```apt update```
```apt upgrade```
```pkg install python-cryptography```
```pip install VIPER_LIMS```
```python3```
```import VIPER_LIMS```
```VIPER_LIMS.Install()```
Please see the Client Installation Guide below and type ```exit()``` when you are finished.
Once the installation is complete you can run the VIPER_Client through Termux with the command:
```python3 VIPER_Client/VIPER_Client.py```
# Server Installation Guide
[Server Install Tutorial](VIPER_Videos/VIPER_Server_Install_Compressed.mp4)
Store the *VIPER_Server will need:* information from the *SQL Database* and *OAuth 2.0 Service* sections below
Run the following command and provide the requested information:
```VIPER_LIMS.Install("Server")```
## Server IP Address:
Before you start you should know the **local IP of your VIPER_Server**.
Use ```ipconfig``` on Windows or ```ifconfig``` on Unix based systems and get your IPV4 local IP address (usually 192.168.X.X)
If you do not intend to host your VIPER_Server online then your VIPER_Server IP Address will be this local IP
If you want your VIPER_Server to be accessible through the internet you need to **Port Forward TCP 8000** on your router to the local IP of your VIPER_Server
[Afterwards use your public IP Address](https://whatismyipaddress.com/)
You will use this IP address for the OAuth2 service callback URL.
**If your IP Address changes you must update the callback URL.**
## SQL Database
The database which your LIMS requests will access.
[MySQL is recommended](https://dev.mysql.com/downloads/workbench/) but PostgreSQL or SQLite should be compatible
*The VIPER_Server will need:*
- Username
- Password
- IP Address of SQL Server
- Port of SQL Server (default is 3306 for MySQL)
## OAuth 2.0 Service
The service which hosts your users accounts, pick ONE:
- [LinkedIn OAuth2](https://www.linkedin.com/developers/secure/developer)
- [Github OAuth2](https://github.com/settings/applications/new)
- [Other available services which require manual configuration](https://requests-oauthlib.readthedocs.io/en/latest/examples/examples.html)
- [Further reading if you want to set up your own](https://github.com/topics/oauth2-server?l=python)
*The VIPER_Server will need:*
- Client ID
- Client Secret
- Callback URL
# Client Installation Guide
[Client Install Tutorial](VIPER_Videos/VIPER_Client_Install_Compressed.mp4)
1. ```VIPER_LIMS.Install("Client")```
2. Paste the desired deployment folder directory
3. Paste the VIPER_Server SDump (or "none" if you do not have one yet)
4. To connect to a new Server go to Settings_Panel -> Local_Settings, then Paste an SDump -> Click *Autosetup SDump*
5. Type *off* or *on* and click *Set ServerURL* to disable or enable online mode
**To Logout go to Settings_Panel/Logout AND Logout of your OAuth2 Service**
[Client Tour Tutorial](VIPER_Videos/VIPER_Client_Tour.mp4)
# Applications
## Boa Constructor
Build your own modules:
[Boa Constructor Tutorial](VIPER_Videos/VIPER_Boa_Constructor_Compressed.mp4)
Highly modular, simple, completely customisable scripts for rapidly evolving teams
1. Launch the Client
2. Assemble an HTML page using Boa Constructor
3. See **Coding a *Module_Script.py***
4. Activate your module in Settings_Panel/Module_Toggler
5. Restart VIPER_Client
## Coding a *Module_Script.py*:
```python
Expired_Ethanol_List = LIMSQuery(False, "Reagents", ["Ethanol","Expired"], "fetchall_criteria")) #Access the LIMS SQL Database
```
Which could execute the following on the server through a fetchall_criteria Method:
```sql
SELECT * FROM Ethanol WHERE Expired = True
```
In this example we are fetching all Expired Reagents:
**LIMSQuery(**
**False**: Initiates LIMSQuery's Third Party App support,
**Database**: The database within which to execute the SQL process,
**Command**: The data necessary to perform the request,
**Method**: The VIPER_Server method through which the Command will be processed,
**)**
```python
#Example Boa Constructed module script:
def Process_User_Request(request): #Runs when the user clicks a button on your Boa Constructed VIPER Module
try:
ButtonPressed = request.form['SubmitButtonPressed'] #Which action button has the user pressed?
if ButtonPressed == "Button 0": #If the user pressed Action button 0 run the following
##YOUR CODE: ##
Textbox_2 = request.form.get("Textbox 2") #Input: The user's Textbox 2 input (e.g "Ethanol")
Textbox_3 = request.form.get("Textbox 3") #Input: The user's Textbox 3 input (e.g "Expired")
##Process the input however you want!##
Expired_Ethanol_List = LIMSQuery(request,"Reagents", [Textbox_2,Textbox_3], "fetchall_expired")
SubmissionResponse = {"Label 4":Expired_Ethanol_List} #Output: Change the text in Label 4
elif ButtonPressed == "Button 1": #if the user pressed a different button...
#etc
##END OF YOUR CODE##
except:
return 'An error has occured.', 400 #If nothing happens, return nothing
finally:
return jsonify(Info=SubmissionResponse)
```
## Jupyter Notebook integration:
Enable Third Party App Integration in Settings_Panel/Local_Settings
```python
import sys, requests #required imports
VIPERFolder = requests.post("http://127.0.0.1:7800/RefreshLogin", data="locate") #get VIPER_Utility folder
print(f"VIPER Folder: {VIPERFolder.text}")
sys.path.insert(0, VIPERFolder.text) #Prepare VIPER folder for importation
from VIPER_Utility import LIMSQuery #Import VIPER_Utility from VIPER_Client
print( LIMSQuery(request,"Reagents", [Textbox_2,Textbox_3], "fetchall_expired") )
```
Raw data
{
"_id": null,
"home_page": "https://github.com/JackLawrenceCRISPR/VIPER-LIMS",
"name": "VIPER-LIMS",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "python,installer,lims,science",
"author": "VIPER-LIMS (Jack Lawrence)",
"author_email": "<JackLawrenceCRISPR@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/d2/af/2dfdf8707fd2de22f10002cc8c3bdc2e9cf062f190a2f36420c650671139/VIPER-LIMS-0.1.3.tar.gz",
"platform": null,
"description": "\r\n<h1 align=\"center\">Virtual Interface for Production & Experimental Research</h1>\r\n<p align=\"center\">\r\n <picture>\r\n <source srcset=\"https://raw.githubusercontent.com/JackLawrenceCRISPR/VIPER_LIMS/main/VIPER_Client/Sources/VIPER/Viper_Icon_Small.ico\"> \r\n <img src=\"https://raw.githubusercontent.com/JackLawrenceCRISPR/VIPER_LIMS/main/VIPER_Client/Sources/VIPER/Viper_Icon_Small.ico\">\r\n </picture>\r\n</p>\r\n<h3 align=\"center\">Easy | Modular | Lightweight</h3>\r\n\r\n<p align=\"center\">A simple, highly scalable & adaptable LIMS system for rapidly evolving laboratory teams.</p>\r\n\r\n# Features\r\n- **Customisable clientside:** Build your own VIPER modules in Python and help from Boa Constructor\r\n- **Boa Constructor:** Make new HTML-Javascript-Python front-end modules with simple drag and drop\r\n- **Client Scripting:** Beginner friendly code with complete control for advanced programmers\r\n- **Client Commands:** Scriptable client to server requests passed through Server Methods\r\n- **Server Methods:** Programmable permission authenticated serverside functions\r\n- **Security:** OAuth2 user verification and encrypted HTTP requests\r\n- **SQL:** Intrinsic support for MySQL, PostgreSQL and SQLite \r\n- **OAuth2:** Intrinsic support for Github and LinkedIn OAuth2 Apps\r\n\r\n### The Vision\r\n- Lightweight plug-and-play framework\r\n- Power for beginner programmers\r\n- Freedom for advanced programmers\r\n- Competency based permissions\r\n\r\n# Installation\r\n### Desktop Installation\r\n[Requires Python (>=3.7)](https://www.python.org/downloads/)\r\n\r\nOperating System terminal: \r\n```\r\npip install VIPER_LIMS\r\n```\r\n\r\nPython terminal or script: \r\n```python\r\nimport VIPER_LIMS\r\nVIPER_LIMS.Install()\r\n```\r\nPlease see the Server Installation Guide or Client Installation Guide below.\r\n\r\n_Alternatively: download this repository and run VIPER_Installer/VIPER_LIMS/VIPER_Installer.py_\r\n\r\n\r\n### Android Installation\r\nOnly the VIPER_Client is available for Android; it is not advised to run a VIPER_Server from Android devices.\r\n1. Install Termux from [Github](https://github.com/termux/termux-app/releases) or [FDroid](https://f-droid.org/en/packages/com.termux/)\r\n2. In the Termux app run the following commands in order, whilst reading and accepting appropraite requests: \r\n```pkg install python``` \r\n```apt update``` \r\n```apt upgrade``` \r\n```pkg install python-cryptography``` \r\n```pip install VIPER_LIMS``` \r\n```python3``` \r\n```import VIPER_LIMS``` \r\n```VIPER_LIMS.Install()``` \r\nPlease see the Client Installation Guide below and type ```exit()``` when you are finished.\r\n\r\nOnce the installation is complete you can run the VIPER_Client through Termux with the command: \r\n```python3 VIPER_Client/VIPER_Client.py```\r\n\r\n# Server Installation Guide\r\n[Server Install Tutorial](VIPER_Videos/VIPER_Server_Install_Compressed.mp4)\r\n\r\nStore the *VIPER_Server will need:* information from the *SQL Database* and *OAuth 2.0 Service* sections below \r\nRun the following command and provide the requested information:\r\n```VIPER_LIMS.Install(\"Server\")```\r\n\r\n## Server IP Address: \r\nBefore you start you should know the **local IP of your VIPER_Server**. \r\nUse ```ipconfig``` on Windows or ```ifconfig``` on Unix based systems and get your IPV4 local IP address (usually 192.168.X.X) \r\nIf you do not intend to host your VIPER_Server online then your VIPER_Server IP Address will be this local IP \r\n\r\nIf you want your VIPER_Server to be accessible through the internet you need to **Port Forward TCP 8000** on your router to the local IP of your VIPER_Server \r\n[Afterwards use your public IP Address](https://whatismyipaddress.com/) \r\n\r\nYou will use this IP address for the OAuth2 service callback URL.\r\n**If your IP Address changes you must update the callback URL.**\r\n\r\n## SQL Database\r\nThe database which your LIMS requests will access. \r\n[MySQL is recommended](https://dev.mysql.com/downloads/workbench/) but PostgreSQL or SQLite should be compatible \r\n\r\n*The VIPER_Server will need:*\r\n- Username\r\n- Password\r\n- IP Address of SQL Server \r\n- Port of SQL Server (default is 3306 for MySQL)\r\n\r\n## OAuth 2.0 Service\r\nThe service which hosts your users accounts, pick ONE: \r\n- [LinkedIn OAuth2](https://www.linkedin.com/developers/secure/developer) \r\n- [Github OAuth2](https://github.com/settings/applications/new) \r\n- [Other available services which require manual configuration](https://requests-oauthlib.readthedocs.io/en/latest/examples/examples.html) \r\n- [Further reading if you want to set up your own](https://github.com/topics/oauth2-server?l=python) \r\n\r\n*The VIPER_Server will need:*\r\n- Client ID\r\n- Client Secret\r\n- Callback URL\r\n\r\n\r\n# Client Installation Guide\r\n[Client Install Tutorial](VIPER_Videos/VIPER_Client_Install_Compressed.mp4)\r\n1. ```VIPER_LIMS.Install(\"Client\")```\r\n2. Paste the desired deployment folder directory\r\n3. Paste the VIPER_Server SDump (or \"none\" if you do not have one yet)\r\n4. To connect to a new Server go to Settings_Panel -> Local_Settings, then Paste an SDump -> Click *Autosetup SDump*\r\n5. Type *off* or *on* and click *Set ServerURL* to disable or enable online mode \r\n**To Logout go to Settings_Panel/Logout AND Logout of your OAuth2 Service**\r\n[Client Tour Tutorial](VIPER_Videos/VIPER_Client_Tour.mp4)\r\n\r\n\r\n# Applications\r\n## Boa Constructor\r\nBuild your own modules:\r\n[Boa Constructor Tutorial](VIPER_Videos/VIPER_Boa_Constructor_Compressed.mp4)\r\n\r\nHighly modular, simple, completely customisable scripts for rapidly evolving teams\r\n1. Launch the Client \r\n2. Assemble an HTML page using Boa Constructor \r\n3. See **Coding a *Module_Script.py***\r\n4. Activate your module in Settings_Panel/Module_Toggler\r\n5. Restart VIPER_Client\r\n\r\n## Coding a *Module_Script.py*:\r\n```python\r\nExpired_Ethanol_List = LIMSQuery(False, \"Reagents\", [\"Ethanol\",\"Expired\"], \"fetchall_criteria\")) #Access the LIMS SQL Database\r\n```\r\nWhich could execute the following on the server through a fetchall_criteria Method:\r\n```sql\r\nSELECT * FROM Ethanol WHERE Expired = True\r\n```\r\n\r\nIn this example we are fetching all Expired Reagents: \r\n**LIMSQuery(** \r\n**False**: Initiates LIMSQuery's Third Party App support, \r\n**Database**: The database within which to execute the SQL process, \r\n**Command**: The data necessary to perform the request, \r\n**Method**: The VIPER_Server method through which the Command will be processed, \r\n**)** \r\n\r\n```python\r\n#Example Boa Constructed module script:\r\ndef Process_User_Request(request): #Runs when the user clicks a button on your Boa Constructed VIPER Module\r\n try:\r\n ButtonPressed = request.form['SubmitButtonPressed'] #Which action button has the user pressed?\r\n if ButtonPressed == \"Button 0\": #If the user pressed Action button 0 run the following\r\n##YOUR CODE: ##\r\n Textbox_2 = request.form.get(\"Textbox 2\") #Input: The user's Textbox 2 input (e.g \"Ethanol\")\r\n Textbox_3 = request.form.get(\"Textbox 3\") #Input: The user's Textbox 3 input (e.g \"Expired\")\r\n\r\n ##Process the input however you want!##\r\n Expired_Ethanol_List = LIMSQuery(request,\"Reagents\", [Textbox_2,Textbox_3], \"fetchall_expired\") \r\n SubmissionResponse = {\"Label 4\":Expired_Ethanol_List} #Output: Change the text in Label 4\r\n\r\n elif ButtonPressed == \"Button 1\": #if the user pressed a different button...\r\n #etc\r\n##END OF YOUR CODE##\r\n except:\r\n return 'An error has occured.', 400 #If nothing happens, return nothing\r\n finally: \r\n return jsonify(Info=SubmissionResponse) \r\n```\r\n\r\n## Jupyter Notebook integration: \r\nEnable Third Party App Integration in Settings_Panel/Local_Settings \r\n```python\r\nimport sys, requests #required imports\r\nVIPERFolder = requests.post(\"http://127.0.0.1:7800/RefreshLogin\", data=\"locate\") #get VIPER_Utility folder\r\nprint(f\"VIPER Folder: {VIPERFolder.text}\")\r\nsys.path.insert(0, VIPERFolder.text) #Prepare VIPER folder for importation\r\nfrom VIPER_Utility import LIMSQuery #Import VIPER_Utility from VIPER_Client\r\n\r\nprint( LIMSQuery(request,\"Reagents\", [Textbox_2,Textbox_3], \"fetchall_expired\") )\r\n```\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A free and open-source LIMS software with scriptable modules.",
"version": "0.1.3",
"project_urls": {
"Homepage": "https://github.com/JackLawrenceCRISPR/VIPER-LIMS"
},
"split_keywords": [
"python",
"installer",
"lims",
"science"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2f8b29b8fa2d1e09a8f8adbd4fdc01c37789a1fd4d4682688515f88bcb447423",
"md5": "e7693f3b0f63accd25a58c45c630bb81",
"sha256": "b9d95f5d9887d410475c4789440c44ac29ee0402e625b4821be322f0ecbcc1bc"
},
"downloads": -1,
"filename": "VIPER_LIMS-0.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e7693f3b0f63accd25a58c45c630bb81",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 10452,
"upload_time": "2024-02-21T15:16:38",
"upload_time_iso_8601": "2024-02-21T15:16:38.186407Z",
"url": "https://files.pythonhosted.org/packages/2f/8b/29b8fa2d1e09a8f8adbd4fdc01c37789a1fd4d4682688515f88bcb447423/VIPER_LIMS-0.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d2af2dfdf8707fd2de22f10002cc8c3bdc2e9cf062f190a2f36420c650671139",
"md5": "92a8a0525c35845f4ad8b8e83945ca5c",
"sha256": "5547703e8c058bec22b7ab77c91710060bcdb2707d45852a3c6e749f491e172d"
},
"downloads": -1,
"filename": "VIPER-LIMS-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "92a8a0525c35845f4ad8b8e83945ca5c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 13770,
"upload_time": "2024-02-21T15:16:39",
"upload_time_iso_8601": "2024-02-21T15:16:39.319222Z",
"url": "https://files.pythonhosted.org/packages/d2/af/2dfdf8707fd2de22f10002cc8c3bdc2e9cf062f190a2f36420c650671139/VIPER-LIMS-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-21 15:16:39",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "JackLawrenceCRISPR",
"github_project": "VIPER-LIMS",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "viper-lims"
}