Developers Guide ================ .. note:: **Disclaimer**: This guide was developed and tested on Ubuntu Linux. While the instructions should work on other operating systems, some commands, package names, or installation steps may differ. If you encounter issues on a different OS, please refer to the specific documentation for your platform or reach out to the community for assistance. .. toctree:: :maxdepth: 3 :caption: Developers Guide Contents: self schema Installing QATrack+ For Development ----------------------------------- Due to the huge volume of tutorials already written on developing software using Python, Django, and git, only a brief high level overview of getting started developing for the QATrack+ project will be given here. That said, there are lots of steps involved which can be intimidating to newcomers (especially git!). Try not to get discouraged and if you get stuck on anything or have questions about using git or contributing code then please post to the :mailinglist:`mailing list <>` so we can help you out! Prerequisites ~~~~~~~~~~~~ QATrack+ is developed using Python 3.12. We recommend using the latest stable version of Python 3.12 for the best development experience and compatibility. Git ~~~ QATrack+ uses the git version control system. While it is possible to download and modify QATrack+ without git, if you want to contribute code back to the QATrack+ project, or keep track of your changes, you will need to learn about git. You can download and install git from https://git-scm.com. After you have git installed it is recommended you go through a git tutorial to learn about git branches, commiting code and pull requests. There are many tutorials available online including a `tutorial by the Django team `__ as well as a tutorial on `GitHub `__. .. _forking-repo: GitHub Account ~~~~~~~~~~~~~~ The QATrack+ project currently uses `GitHub `__ for hosting its source code repository. To contribute code to QATrack+ you will need to create a fork of QATrack+ on GitHub, make your changes, then make a pull request to the main QATrack+ project. Creating a fork of QATrack+ is explained in the `GitHub documentation `__. uv Package Manager ~~~~~~~~~~~~~~~~~~~ The QATrack+ project uses `uv `__, a fast Python package manager. uv handles Python version management, virtual environments, and dependency management. Install uv using the official installer (recommended): .. code-block:: shell # On Linux curl -LsSf https://astral.sh/uv/install.sh | sh .. code-block:: shell # Alternative method using pip pip install uv For other installation methods or troubleshooting, see the full installation guide at https://docs.astral.sh/uv/getting-started/installation/ Setting up your development environment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First create a :ref:`fork ` of the QATrack+ repository on GitHub. Then clone your fork to your local machine: .. code-block:: shell git clone https://github.com/YOUR_USERNAME/qatrackplus.git Selecting an Editor or IDE ~~~~~~~~~~~~~~~~~~~~~~~~~~ You can use a variety of tools to edit and work on the QATrack+ codebase. Some popular options include: - **VS Code**: A free, open-source editor with Python and Django support. - **Cursor**: An AI-powered code editor that integrates with GitHub Copilot and other AI tools. - **PyCharm**: A Python IDE with advanced Django support. - **Vim/Neovim**: Lightweight, keyboard-driven editors. - **Emacs**: Highly customizable editor. Choose the editor or IDE that best fits your workflow. All you need is a text editor and a terminal to get started! Creating a Virtual Environment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Once you have decided on a text editor or IDE, create a virtual environment with Python 3.12 using uv: .. code-block:: shell # Create virtual environment with Python 3.12 uv venv --python 3.12 # Activate the virtual environment: source .venv/bin/activate Install development dependencies: .. code-block:: shell # Install all development dependencies uv sync --dev Creating your development database ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Rather than using a full blown database server for development work, You can use Sqlite3 which is included with Python. Once you have the requirements installed, copy the debug `local_settings.py` and `local_test_settings.py` files from the deploy subdirectory and then create your database: .. code-block:: shell cp deploy/dev/local_settings.dev.py qatrack/local_settings.py cp deploy/dev/local_test_settings.dev.py qatrack/local_test_settings.py mkdir db python manage.py migrate python manage.py createcachetable this will put a database called `default.db` in the `db` subdirectory. Understanding the Settings Files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ QATrack+ uses a layered approach to Django settings, with each file serving a specific purpose. Understanding this hierarchy will help you configure your development and testing environment. **Settings File Hierarchy (Highest to Lowest Precedence):** 1. **`local_test_settings.py`** - Your custom test environment overrides - Contains all essential development and test settings in one place - This is the main file you'll customize for your testing needs 2. **`local_settings.py`** - Your custom development environment overrides - Contains development-specific settings like database configuration 3. **`test_settings.py`** - Default test environment settings - Contains test-specific defaults like password hashers and notification settings 4. **`settings.py`** - Base Django application settings - Contains core Django configuration, installed apps, middleware, etc. Collect Static Files ~~~~~~~~~~~~~~~~~~~ Before running the development server, you need to collect all static files to the STATIC_ROOT directory: .. code-block:: shell python manage.py collectstatic --noinput Loading Default Data (Fixtures) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ QATrack+ comes with pre-configured default data that provides a foundation for development and testing. This includes common QA categories, test frequencies, modalities, vendors, and other essential data structures. To load the default data into your development database: .. code-block:: shell python manage.py loaddata fixtures/defaults/*/* This command will populate your database all default data. You can also load specific fixture categories individually if you only need certain data: .. code-block:: shell # Load only QA-related fixtures python manage.py loaddata fixtures/defaults/qa/* # Load only unit-related fixtures python manage.py loaddata fixtures/defaults/units/* # Load only service log fixtures python manage.py loaddata fixtures/defaults/service_log/* Running the development server ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ After the database is created, create a super user so you can log into QATrack+: .. code-block:: shell python manage.py createsuperuser and then run the development server: .. code-block:: shell python manage.py runserver Once the development server is running you should be able to visit http://127.0.0.1:8000/ in your browser and log into QATrack+. Next Steps ~~~~~~~~~~ Now that you have the development server running, you are ready to begin modifying the code! If you have never used Django before it is highly recommended that you go through the official `Django tutorial `__ which is an excellent introduction to writing Django applications. Once you are happy with your modifications, commit them to your source code repository, push your changes back to your online repository and make a pull request! If those terms mean nothing to you...read a git tutorial! QATrack+ Development Guidelines ------------------------------- The following lists some guidelines to keep in mind when developing for QATrack+. Internationalization & Translation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Please mark all strings and templates in QATrack+ for translation. This will allow for QATrack+ to be made available in multiple languages. For discussion of how to mark templates and strings for translation please read the `Django docs on translation `__. **Adding a New Language to QATrack+** For detailed instructions on adding a new language to QATrack+, including step-by-step workflows and translation automation, please refer to the :ref:`Add Language Tutorial ` in the tutorials section. Tool Tips And User Hints ~~~~~~~~~~~~~~~~~~~~~~~~ Where possible all links, buttons and other "actionable" items should have a tooltip (via a `title` attribute or using one of the bootstrap tool tip libraries) which provides a concise description of what clicking the item will do. For example: .. code-block:: html Foo Other areas where tooltips are very useful is e.g. badges and labels where wording is abbreviated for display. For example: .. code-block:: html 7 Foo baz qux Formatting & Style Guide ------------------------ General formatting ~~~~~~~~~~~~~~~~~~ In general, any code you write should be `PEP 8 compatible `__ with a few exceptions. It is *highly* recommended that you use flake8 to check your code for pep8 violations. A QATrack+ flake8 config file is included with QATrack+, to view any flake8 violations run: .. code-block:: python make flake8 # or flake8 . You may also want to use `yapf `__ which can automatically format your code to conform with QATrack+'s style guide. A yapf configuration sections is included in the setup.cfg file. To run yapf: .. code-block:: python make yapf Using Make Commands ~~~~~~~~~~~~~~~~~~ QATrack+ includes a Makefile with convenient shortcuts for common development tasks like running tests, formatting code, and building documentation. You can see all available commands by running: .. code-block:: shell make help For detailed information about using make and understanding Makefiles, refer to the `GNU Make Manual `_. Import Order ~~~~~~~~~~~~ Imports in your Python code should be split in three sections: 1. Standard library imports 2. Third party imports 3. QATrack+ specific imports and each section should be in alphabetical order. For example: .. code-block:: python import math import re import sys from django.apps import apps from django.conf import settings from django.contrib.auth.models import Group, User from django.contrib.contenttypes.fields import ( GenericForeignKey, GenericRelation, ) from django_comments.models import Comment import matplotlib from matplotlib.backends.backend_agg import FigureCanvasAgg import numpy import scipy from qatrack.qa import utils from qatrack.units.models import Unit `isort `__ is a simple tool for automatically ordering your imports and an `isort` configuration is included in the setup.cfg file. Indentation ~~~~~~~~~~~ Python code for QATrack+ use 4 spaces for indentation. Django templates (and other html files) should use 2 spaces for indentation. Javascript code should use 4 spaces for indentation. Setting Up Selenium Browser Testing ---------------------------------- QATrack+ includes Selenium tests that simulate user interactions with the web interface and are marked with the `@pytest.mark.selenium` decorator. **This setup should be completed before running the test suite if you want to see the Selenium tests in action.** **Browser Requirements** You will need to have both a browser and its corresponding driver installed on your system: * Option 1. **Firefox + geckodriver** * Option 2. **Chromium + chromedriver** If you are unsure whether or not you have both a browser and its corresponding driver installed, you can run the following commands to check: **Finding Browser and Driver Paths:** .. code-block:: shell # Check for Firefox browser which firefox # Check for geckodriver which geckodriver # Check for Chromium browser which chromium # Check for chromedriver which chromedriver **Example Output:** .. code-block:: /usr/bin/firefox /snap/bin/geckodriver /snap/bin/chromium /usr/bin/chromedriver **Installing Missing Components** If you do not have both firefox and geckodriver or both chromium and chromedriver, you can install either pair using the following commands: .. code-block:: shell # Option 1: Install Firefox and geckodriver sudo apt install firefox geckodriver # Option 2: Install Chromium and chromedriver sudo apt install chromium-browser chromium-chromedriver **Manual Downloads (Alternative Installation)** If the package manager installation doesn't work or you need a specific version, you can download the drivers manually: * **geckodriver**: Download from the `official Mozilla website `_ * **chromedriver**: Download from the `official Chrome releases `_ After downloading, make the driver executable and verify the path. **Configuring Selenium Tests** You'll need to configure your browser settings in two files. First, update the Selenium configuration in `qatrack/settings.py`: .. code-block:: # Selenium Browser Configuration # Options: 'firefox', 'chromium' SELENIUM_BROWSER = '' # Browser Driver Paths SELENIUM_FIREFOX_DRIVER_PATH = '' # Path to geckodriver as shown above SELENIUM_CHROMIUM_DRIVER_PATH = '' # Path to chromedriver as shown above # Headless Mode # Set to True to run browsers in headless mode (no visible browser window) # Set to False to see the browser during test execution SELENIUM_VIRTUAL_DISPLAY = True Then also update `SELENIUM_VIRTUAL_DISPLAY` in `qatrack/test_settings.py`: .. code-block:: # In qatrack/test_settings.py: SELENIUM_VIRTUAL_DISPLAY = False # Set to True to use headless browser for testing (requires xvfb) **Configuration Examples** **Firefox with visible browser:** .. code-block:: # In qatrack/settings.py: SELENIUM_BROWSER = 'firefox' SELENIUM_VIRTUAL_DISPLAY = False SELENIUM_FIREFOX_DRIVER_PATH = '/snap/bin/geckodriver' # In qatrack/test_settings.py: SELENIUM_VIRTUAL_DISPLAY = False **Chromium with visible browser:** .. code-block:: # In qatrack/settings.py: SELENIUM_BROWSER = 'chromium' SELENIUM_VIRTUAL_DISPLAY = False SELENIUM_CHROMIUM_DRIVER_PATH = '/usr/bin/chromedriver' # In qatrack/test_settings.py: SELENIUM_VIRTUAL_DISPLAY = False **Headless mode** .. code-block:: # In qatrack/settings.py: SELENIUM_BROWSER = '' # This can either be filled in or left blank SELENIUM_VIRTUAL_DISPLAY = True # In qatrack/test_settings.py: SELENIUM_VIRTUAL_DISPLAY = True Running The Test Suite ---------------------- Once you have QATrack+ and its dependencies installed (and optionally configured Selenium browser testing above), you can run the test suite from the root QATrack+ directory using the `py.test` command: .. code-block:: sh ./qatrackplus> py.test Test session starts (platform: linux, Python 3.6.5, pytest 3.5.0, pytest-sugar 0.9.1) Django settings: qatrack.settings (from ini file) rootdir: /home/dev/projects/qatrackplus, inifile: pytest.ini plugins: django-4.5.2, cov-3.0.0 qatrack/accounts/tests.py ✓✓✓ **Running Different Types of Tests** Run all tests (including Selenium): .. code-block:: shell py.test Run only Selenium tests: .. code-block:: shell pytest -m selenium Run only non-Selenium tests (faster): .. code-block:: shell pytest -m "not selenium" For more information on using py.test, refer to the `py.test documentation `__. .. important:: All new code you write should have tests written for it. Any non trivial code you wish to contribute back to QATrack+ will require you to write tests for the code providing as high a code coverage as possible. You can measure code coverage in the following way: .. code-block:: shell make cover Customizing Organization Logos ----------------------------- QATrack+ reports include an option to display your organization's logo. **Adding Your Organization Logo** 1. **Prepare your logo file:** - Use a PNG format for best compatibility - Recommended size: 200x60 pixels or similar aspect ratio - Keep file size reasonable (under 100KB) 2. **Replace the placeholder logo:** - Navigate to ``qatrack/reports/static/reports/img/`` - Replace the existing ``logo.png`` file with your own logo - Keep the same filename (``logo.png``) to avoid template changes 3. **Alternative: Use a different filename:** - If you prefer a different filename, edit ``qatrack/reports/templates/reports/_header.html`` - Update all references from ``logo.png`` to your preferred filename - Update the alt text and fallback messages as needed 4. **Collect static files:** After making changes, run: .. code-block:: shell python manage.py collectstatic --noinput **Logo Display Options** - **HTML Reports:** Logo is displayed using Django's static file handling - **PDF Reports:** Logo uses file:// paths for compatibility with PDF generation - **Error Handling:** If the logo fails to load, nothing is displayed (no fallback message) - **Visibility Control:** Users can toggle logo display on/off in report settings **Customizing Logo Text** To change the alt text: - Edit ``qatrack/reports/templates/reports/_header.html`` - Update the translation strings for "Organization Logo" - Add translations to your locale files if using multiple languages **Note:** The logo functionality is designed to be easily customizable without requiring code changes to the core application. Writing Documentation ~~~~~~~~~~~~~~~~~~~~~ As well as writing tests for your new code, it will be extremely helpful for you to include documenation for the features you have built. The documentation for QATrack+ is located in the `docs/` folder and is seperated into the following sections: #. **User guide:** Documentation for normal users of the QATrack+ installation. #. **Admin guide:** Documentation for users of QATrack+ who are responsible for configuring and maintaining Test Lists, Units etc. #. **Tutorials:** Complete examples of how to make use of QATrack+ features. #. **Install:** Documentation for the people responsible for installing, upgrading, and otherwise maintaining the QATrack+ server. #. **Developers guide:** You are reading it :) Please browse through the docs and decide where is the most appropriate place to document your new feature. While writing documentation, you can view the documentation locally in your web browser (at http://127.0.0.1:8008) by running one of the following commands: .. code-block:: shell make docs-autobuild # -or- sphinx-autobuild docs docs/_build/html --port 8008 Version Naming Convention ~~~~~~~~~~~~~~~~~~~~~~~~~ QATrack+ uses **Eff Ver (Effort Versioning)** for its version naming convention. Eff Ver is a versioning strategy that focuses on the effort required to upgrade rather than semantic meaning. This approach prioritizes the practical impact on users and developers when considering version changes. For more information about Eff Ver, see the `Eff Ver documentation `__. **Version Number Structure** The version number follows the format `X.Y.Z` where: - **X (Major)**: Corresponds to the Django LTS release version - Currently at 4.0.0 (Django 4.2 LTS) - When upgrading to Django 5.2 LTS, version will become 5.0.0 - This ensures compatibility and upgrade path alignment with Django - **Y (Minor)**: Feature releases within the same Django LTS cycle - **Z (Patch)**: Bug fixes and minor improvements **Examples:** - 4.0.0: Initial release on Django 4.2 LTS - 4.1.0: Major feature release while staying on Django 4.2 LTS - 4.1.1: Bug fix release - 5.0.0: Upgrade to Django 5.2 LTS Copyright & Licensing --------------------- The author of the code (or potentially their employer) retains the copyright of their work even when contributing code to QATrack+. However, unless specified otherwies, by submitting code to the QATrack+ project you agree to have it distributed using the same `MIT license `__ as QATrack+ uses. I'm not a developer, how can I help out? ---------------------------------------- Not everyone has development experience or the desire to contribute code to QATrack+ but still wants to help the project out. Here are a couple of ways that you can contribute to the QATrack+ project without doing any software development: * **Translations:** QATrack+ supports multiple languages through its internationalization infrastructure. We welcome community contributions for translation files in different languages. Use the translation manager script to help automate translations, then refine them manually for accuracy. See the "Internationalization & Translation" section above for detailed commands. * **Tutorials:** :ref:`Tutorials ` are a great way for newcomers to learn their way around QATrack+. If you have an idea for a tutorial, we would love to include it in our tutorials section! * **Mailing List:** QATrack+ has a :mailinglist:`mailing list <>` which QATrack+ users and administrators may find useful for getting support and discussing bugs and/or features. Join the list and chime in! * **Spread the word:** The QATrack+ community has grown primarily through word of mouth. Please let others know about QATrack+ when discussing QA/QC software :) * **Other:** Have any ideas for acquiring development funding for the QATrack+ project? We'd love to hear them!