Графен Django - аргументы фильтра доступа в классе соединения - PullRequest
0 голосов
/ 10 февраля 2020

Мне нужно создать PDF-файл из указанного c запроса. Проблема в том, что я хотел бы показать, какие аргументы фильтра были использованы при создании этого файла PDF. Поэтому для лучшего понимания в моем проекте есть модель для транзакций:

class Transaction(Model):
    class Meta:
        db_table = 'transactions'
        app_label = 'core'
        default_permissions = ()

description = models.CharField(max_length=100, null=True)
amount = models.IntegerField(null=False)

Поля модели не заполнены, поскольку в этом нет необходимости. Эта модель имеет Тип и Фильтр классы:

class TransactionType(DjangoObjectType):
    record = graphene.String(source='pk')

    class Meta:
        model = Transaction
        interfaces = (Node,)
        connection_class = TransactionPdfConnector


class TransactionFilter(django_filters.FilterSet):
    record = django_filters.CharFilter(
        field_name='pk',
        lookup_expr='exact'
    )

В моем проекте есть поля PK UUID, названные как записи. Таким образом, этот фильтр фильтрует в соответствии с типизированной строкой UUID как PK. Для лучшего понимания мой запрос выглядит следующим образом:

query{
  transactions(
    record: "52d820fb-8383-4a97-ab26-321b56dedc0"
  ){
    pdfUrl
    edges{
      node{
        record
        amount
      }
      cursor
    }
  }
}

Очень важным полем в запросе является pdfUrl , которое будет возвращать URL в сгенерированный файл PDF. Так вот почему я имею в мета-классе объекта типа класс_соединения . Мне нужно было переопределить класс graphene.Connection , чтобы я мог добавить атрибут pdfUrl на определенном уровне в качестве ребер. Мой пользовательский класс connection_class выглядит так:

class TransactionPdfConnector(PdfConnector):
    pdf_url = graphene.String()

    class Meta:
        abstract = True

    def resolve_pdf_url(self, info, **kwargs) -> str:
        objects = self.iterable
        context = {'items': []}

        for item in objects:
            context['items'].append(
                {
                    'description': item.description if item.description else '',
                    'amount': f'{(item.amount / 100):.2f}',
                }
            )

        content = render_to_string('transaction_list.html', context)
        pdf = HTML(string=content).write_pdf()

        file_name = str(uuid.uuid4())
        file_path = f'{settings.MEDIA_ROOT}pdf/transactions/{file_name}.pdf'
        url = f'{settings.BASE_URL}{settings.MEDIA_URL}pdf/transactions/{file_name}.pdf'

        with open(file_path, 'wb') as pdf_file:
            pdf_file.write(pdf)
        return url

Как вы можете видеть, я рендеринг контента (строка, содержащая визуализированный HTML), который использует переменные, переданные в качестве контекста. И что HTML строка библиотеки weasyprint конвертируется в PDF-байты. Эти байты, представляющие как pdf, я буду сохранять и возвращать этот URL в ответ на запрос. Но мне нужно перейти к контексту используемых аргументов фильтра в запросе. Но я не знаю, как это сделать правильно. У кого-нибудь есть идеи? Определение моего запроса выглядит следующим образом:

class GetTransactions(object):
    transactions = DjangoFilterConnectionField(
        TransactionType,
        filterset_class=TransactionFilter,
    )

Таким образом, класс фильтра передается в DjangoFilterConnectionField , и я не знаю, как передать аргументы фильтра из этого класса в мой класс Connection.

PS: простите за мой плохой Энгли sh.

...