graphql-python / graphql-python/graphene

Interfaces are ignored when define Mutation.

Offen
#1,361 0 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
🐛 bug
Vorherrschende Sprache
Python
Sterne
8.2k
Forks
818
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Hello.
First of all, thanks for all graphene developers and contributors.
* **What is the current behavior?**
Interface is ignored when define mutation. This is my code.
```python
class CreatePlan(Mutation):
class Meta:
interfaces = (PlanInterface, )

class Arguments:
name = String(required=True)
comment = String(default_value='')
goal = String(required=True)
start_date = DateTime(required=True)
end_date = DateTime(required=True)

def mutate(parent, info, **kwargs):
~~~
# this raises AssertionError:
# CreatePlan fields must be a mapping (dict / OrderedDict)
# with field names as keys or a function which returns such a mapping.
```
* **What is the expected behavior?**
I think Mutation should includes all interfaces and fields together.
* **Please tell us about your environment:**
Here is my environment.
- Version: 2.1.9
- Platform: Mac OS

* **Other information** (e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow)
I think removing just a line can resolve this problem.
**branch v2**, graphene/types/mutation.py line 69
```python
@classmethod
def __init_subclass_with_meta__(
cls,
interfaces=(),
resolver=None,
output=None,
arguments=None,
_meta=None,
**options
):
if not _meta:
_meta = MutationOptions(cls)

output = output or getattr(cls, "Output", None)
fields = {}

for interface in interfaces:
assert issubclass(interface, Interface), (
'All interfaces of {} must be a subclass of Interface. Received "{}".'
).format(cls.__name__, interface)
fields.update(interface._meta.fields)

if not output:
# If output is defined, we don't need to get the fields
fields = OrderedDict(). # This ignores interfaces. Remove this.
for base in reversed(cls.__mro__):
fields.update(yank_fields_from_attrs(base.__dict__, _as=Field))
output = cls

```
Also, I found same problem on master branch.
```python
@classmethod
def __init_subclass_with_meta__(
cls,
interfaces=(),
resolver=None,
output=None,
arguments=None,
_meta=None,
**options,
):
if not _meta:
_meta = MutationOptions(cls)
output = output or getattr(cls, "Output", None)
fields = {}

for interface in interfaces:
assert issubclass(
interface, Interface
), f'All interfaces of {cls.__name__} must be a subclass of Interface. Received "{interface}".'
fields.update(interface._meta.fields)
if not output:
# If output is defined, we don't need to get the fields
fields = {}. # This ignores interfaces. Remove this.
for base in reversed(cls.__mro__):
fields.update(yank_fields_from_attrs(base.__dict__, _as=Field))
output = cls
```

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne in graphene/types/mutation.py bei __init_subclass_with_meta__ und reproduziere das gemeldete CreatePlan-Beispiel. Die Behebung ist abgeschlossen, wenn beim Definieren einer Mutation mit Interfaces die Interface-Felder in ihrer Ausgabe erhalten bleiben, anstatt sie zu verwerfen, wenn keine explizite Ausgabe angegeben ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
api, backend
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.