Metadata-Version: 2.4
Name: strawberry-django-phonenumber
Version: 0.2.2
Summary: A strawberry + Django integration for phone numbers
License: MIT
License-File: LICENSE.md
Keywords: strawberry,django,phonenumber,phone,number,phonenumber-field,graphql,strawberry_django
Author: Paul Craciunoiu
Author-email: paul@craciunoiu.net
Requires-Python: >=3.10,<4
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Provides-Extra: psycopg
Provides-Extra: psycopg2
Requires-Dist: django (>=3)
Requires-Dist: django-phonenumber-field[phonenumberslite] (>=7)
Requires-Dist: psycopg2-binary ; extra == "psycopg2"
Requires-Dist: psycopg[binary] (>=3) ; extra == "psycopg"
Requires-Dist: strawberry-graphql
Requires-Dist: strawberry-graphql-django (>=0.17)
Project-URL: Repository, https://github.com/UpliftAgency/strawberry-django-phonenumber
Description-Content-Type: text/markdown

# strawberry-django-phonenumber

![build status](https://github.com/UpliftAgency/strawberry-django-phonenumber/actions/workflows/pythonpackage.yml/badge.svg)

## Introduction

GraphQL types for Phone Numbers with Strawberry Django. If you use `django`, `strawberry`, and `django-phonenumber-field`, this library is for you.

Supported on:

* Python 3.10+
* Django 3+
* strawberry-graphql-django 0.17+
* django-phonenumber-field 7+

CI tests Python **3.10** (minimum supported) and **3.14** (latest).

Here's how it works. Automagically get this query:

```graphql
query User {
  phoneNumber {
    ...phoneNumberFragment
  }
}

fragment phoneNumberFragment on PhoneNumber {
    asInternational  # +1 415-418-3420
    asNational  # (415) 418-3420
    asE164
    asRfc3966
    countryCode  # 1
    nationalNumber
    extension
    rawInput
}
```

With this code:

```python
# yourapp/models.py
from django.contrib.auth.models import AbstractUser
from phonenumber_field.modelfields import PhoneNumberField


class User(AbstractUser):
    phone_number = PhoneNumberField(blank=True)

# yourapp/graphql/types.py
from typing import Optional, cast

import strawberry
import strawberry_django
from strawberry.types import Info
from strawberry_django_phonenumber import PhoneNumber

from yourapp import models


@strawberry_django.type(models.User, fields=["first_name", "last_name"])
class User(strawberry.relay.Node):
    """GraphQL type for the User model."""

    @strawberry_django.field
    async def phone_number(root, info: Info) -> Optional[PhoneNumber]:
        if not root.phone_number:
            return None
        return cast(PhoneNumber, root.phone_number)

# yourapp/graphql/__init__.py
from typing import Optional

import strawberry
import strawberry_django
from asgiref.sync import sync_to_async
from strawberry.types import Info

from .types import User


@sync_to_async
def aget_user_from_request(request):
    return request.user if request.user.is_authenticated else None


@strawberry.type
class Queries:
    @strawberry_django.field
    async def me(self, info: Info) -> Optional[User]:
        user = await aget_user_from_request(info.context.request)
        return user


schema = strawberry.Schema(query=Queries)

# yourapp/urls.py

from django.urls import path
from django.views.decorators.csrf import csrf_exempt
from strawberry.django.views import AsyncGraphQLView

from .graphql import schema

urlpatterns = [
    path(
        "graphql/",
        csrf_exempt(
            AsyncGraphQLView.as_view(
                schema=schema,
                graphql_ide="graphiql",
            )
        ),
    ),
]

```

## Installation

```bash
pip install strawberry-django-phonenumber
```

### Changelog

**0.2.2**

    - Replace Safety with pip-audit; refresh lockfile and dependency versions
    - CI tests Python 3.10 and 3.14; consolidated lint job; updated GitHub Actions
    - Dependabot with grouped minor/patch updates; optional pre-commit hook
    - Docs: Python 3.10+; `graphql_ide` instead of deprecated `graphiql` on `AsyncGraphQLView`

**0.2.1**

    - Remove deprecated strawberry-graphql debug-server extra

**0.2.0**

    - Remove psycopg2-binary dependency, allow psycopg>=3

**0.1.0**

    - Initial release


## Contributing

Install dependencies and run tests (requires PostgreSQL; CI uses `postgres` / `postgres` on port 5432):

```bash
./poetry-install.sh
export PG_PASSWORD=postgres
poetry run pytest
```

Lint and security checks (same as CI):

```bash
./lint.sh --check
```

Format/fix locally:

```bash
./lint.sh
```

Optional [pre-commit](https://pre-commit.com/) hook (runs `./lint.sh --check`):

```bash
poetry run pre-commit install
```

Please open a pull request or issue.

