# FAQ ## Installation ### Requirements? - Python 3.10+ - Django 4.2+ - All Django-supported databases (PostgreSQL, MySQL, SQLite, Oracle) ### Uninstall? ```bash python manage.py dumpdata django_app_parameter > backup.json # backup optional python manage.py migrate django_app_parameter zero pip uninstall django-app-parameter ``` Remove from `INSTALLED_APPS`. ## Basic Usage ### Create parameter? **Admin**: `/admin/django_app_parameter/parameter/` → Add Parameter **Code**: ```python Parameter.objects.create(name="Site Title", value="My Site", value_type=TYPES.STR) ``` **Command**: ```bash python manage.py dap_load --json '[{"name": "Site Title", "value": "My Site"}]' ``` ### Access parameter? ```python from django_app_parameter import app_parameter title = app_parameter.SITE_TITLE ``` ### `app_parameter.SLUG` vs `param.get()`? - `app_parameter.SLUG`: Auto-converts based on `value_type`, quick access - `param.get()`: Same auto-conversion, but gives access to full parameter object Use `app_parameter` for read-only access, `param.get()` when you need to modify values. ### Check if exists? ```python try: value = app_parameter.MAYBE_EXISTS except ImproperlyConfigured: value = "default" ``` ### Modify parameter? ```python param = Parameter.objects.get(slug="TAX_RATE") param.set(Decimal("19.6")) # Type-safe, validates, saves # Or with auto_cast for string input: param.set("19.6", auto_cast=True) # Converts to Decimal, validates, saves ``` ## Data Types ### Supported types? **Basic (5)**: INTEGER, STRING, FLOAT, DECIMAL, BOOL **Date/Time (4)**: DATE, DATETIME, TIME, DURATION **Validated (3)**: URL, EMAIL, PERCENTAGE **Structured (4)**: JSON, LIST, DICT, PATH **Total**: 16 types ### FLT vs DCL? - **FLT**: Approximate, for scientific calculations - **DCL**: Exact, for financial calculations Use **DCL** for money, prices, tax rates. ### JSN vs DICT vs LIST? - **JSN**: Any JSON structure (dict, list, etc.) - **DICT**: JSON dictionary only (validates type) - **LIST**: Comma-separated strings (no JSON) ### DATE vs DATETIME vs TIME? - **DATE**: Date only (YYYY-MM-DD) → `date` object - **DATETIME**: Date + time (ISO 8601) → `datetime` object - **TIME**: Time only (HH:MM:SS) → `time` object ### DURATION type? Stores duration in seconds, returns `timedelta`: ```python Parameter.objects.create( name="Timeout", value="3600", # 1 hour in seconds value_type=TYPES.DURATION ) timeout = app_parameter.TIMEOUT # timedelta(seconds=3600) ``` ### PERCENTAGE type? Float validated 0-100: ```python discount = app_parameter.DISCOUNT # 15.5 ``` ### PATH type? File path as `pathlib.Path`: ```python log_dir = app_parameter.LOG_DIR # Path("/var/log/myapp") ``` ## Validators ### What are validators? Automatic validation rules attached to parameters. Validate on: - Admin save - `param.set()` call (after `auto_cast` if enabled) - Import via `dap_load` ### Add validator? ```python param.validators.create( validator_type="MinValueValidator", validator_params={"limit_value": 0} ) ``` ### Built-in validators? - MinValueValidator, MaxValueValidator - MinLengthValidator, MaxLengthValidator - RegexValidator - EmailValidator, URLValidator - validate_slug, validate_ipv4_address, validate_ipv6_address - FileExtensionValidator See [utils.py](../django_app_parameter/utils.py). ### Custom validators? Define in settings: ```python DJANGO_APP_PARAMETER = { 'validators': { 'even_number': 'myapp.validators.validate_even_number', } } ``` Use: ```python param.validators.create( validator_type="even_number", validator_params={} ) ``` ### Validators in JSON? ```json { "name": "Tax Rate", "value": "20.0", "validators": [ { "validator_type": "MinValueValidator", "validator_params": {"limit_value": 0} } ] } ``` ### Remove validators? ```python param.validators.all().delete() ``` Or specific: ```python param.validators.filter(validator_type="MinValueValidator").delete() ``` ## Slug System ### What's a slug? Auto-generated identifier from `name`: - `"Blog Title"` → `"BLOG_TITLE"` - `"Sender E-mail"` → `"SENDER_E_MAIL"` Used for code access: `app_parameter.BLOG_TITLE` ### Custom slug? ```python Parameter.objects.create( name="Tax Rate", slug="MY_CUSTOM_SLUG" ) value = app_parameter.MY_CUSTOM_SLUG ``` ### Slug collision? Error raised. Change `name` or set custom `slug`. ### Modify slug after creation? No. `slug` is readonly after creation. Delete and recreate if needed. ## Templates ### Access in templates? Add context processor: ```python # settings.py TEMPLATES = [{ 'OPTIONS': { 'context_processors': [ 'django_app_parameter.context_processors.add_global_parameter_context', ], }, }] ``` Set `is_global=True` on parameter: ```html