использовать универсальные типы в Python для рефакторинга кода - PullRequest
0 голосов
/ 10 июня 2018

Я пробовал несколько способов реорганизовать следующий код, так как эти классы повторяются в моем приложении:

class CreateRecord(Mutation):
    record = Field(lambda: Unit)

    class Arguments:
        input = CreateInput(required=True)

    def mutate(self, info, input):
        data = input_to_dictionary(input)
        data['createdAt'] = datetime.utcnow()
        # data['createdBy'] = <user>  # TODO: <user> input

        record = UnitModel(**data)
        db_session.add(record)
        db_session.commit()

        return CreateRecord(record=record)


class UpdateRecord(Mutation):
    record = Field(lambda: Unit)

    class Arguments:
        input = UpdateInput(required=True)

    def mutate(self, info, input):
        data = input_to_dictionary(input)
        data['updatedAt'] = datetime.utcnow()
        # data['updatedBy'] = <user>  # TODO: <user> input

        record = db_session.query(UnitModel).filter_by(id=data['id'])
        record.update(data)
        db_session.commit()

        record = db_session.query(UnitModel).filter_by(id=data['id']).first()

        return UpdateRecord(record=record)


class DeleteRecord(Mutation):
    record = Field(lambda: Unit)

    class Arguments:
        input = DeleteInput(required=True)

    def mutate(self, info, input):
        data = input_to_dictionary(input)
        data['deletedAt'] = datetime.utcnow()
        # data['deletedBy'] = <user>  # TODO: <user> input
        data['isDeleted'] = True

        record = db_session.query(UnitModel).filter_by(id=data['id'])
        record.update(data)
        db_session.commit()

        record = db_session.query(UnitModel).filter_by(id=data['id']).first()

        return DeleteRecord(record=record)

Я думал об использовании универсальных типов, но я как бы застрял в том, как реализоватьЭто.Я пытался создать мастер-класс, и в методе

def mutate:

я бы просто проверил, является ли это действием создания, обновления или удаления, но я все еще хочу работать с универсальными типами, прежде чем сделать это.

Любая помощь высоко ценится.ТИА.

1 Ответ

0 голосов
/ 12 июня 2018

Я решил эту конкретную проблему для себя с помощью класса mixin, который включает следующий метод:

from graphene.utils.str_converters import to_snake_case

class MutationResponseMixin(object):
    @classmethod
    def get_operation_type(cls):
        """
        Determine the CRUD type from the mutation class name.
        Uses mutation's class name to determine correct operation.
        ( create / update / delete )
        """
        return to_snake_case(cls.__name__).split('_')[0]

Это позволяет мне включить метод мутации в mixin, который используется совместно для create, update,и удаляет методы и выполняет условное действие, основанное на значении get_operation_type.

. Мне также нужен был способ определения базовой записи по мутации миксина (которая в вашем случае была бы UnitModel), поэтому в моем случае яв конечном итоге объявили его явно как атрибут каждого класса мутаций.

...