|
8 | 8 | from graphene.core.types.definitions import List |
9 | 9 | from graphene.core.types.scalars import String, Boolean, Int, Float |
10 | 10 | from graphene.core.types.custom_scalars import JSONString, DateTime |
11 | | -from graphene_gae.ndb.fields import NdbKeyField |
| 11 | +from graphene_gae.ndb.fields import NdbKeyField, NdbKeyStringField |
12 | 12 |
|
13 | 13 | __author__ = 'ekampf' |
14 | 14 |
|
|
17 | 17 | p = inflect.engine() |
18 | 18 |
|
19 | 19 |
|
20 | | -def convert_ndb_scalar_property(graphene_type, ndb_prop): |
| 20 | +def convert_ndb_scalar_property(graphene_type, ndb_prop, **kwargs): |
21 | 21 | description = "%s %s property" % (ndb_prop._name, graphene_type) |
| 22 | + result = graphene_type(description=description, **kwargs) |
22 | 23 | if ndb_prop._repeated: |
23 | | - l = graphene_type(description=description).List |
24 | | - return l if not ndb_prop._required else l.NonNull |
| 24 | + result = result.List |
25 | 25 |
|
26 | 26 | if ndb_prop._required: |
27 | | - return graphene_type(description=description).NonNull |
| 27 | + result = result.NonNull |
28 | 28 |
|
29 | | - return graphene_type(description=description) |
| 29 | + return result |
30 | 30 |
|
31 | 31 |
|
32 | 32 | def convert_ndb_string_property(ndb_prop, meta): |
@@ -54,22 +54,69 @@ def convert_ndb_datetime_property(ndb_prop, meta): |
54 | 54 |
|
55 | 55 |
|
56 | 56 | def convert_ndb_key_propety(ndb_key_prop, meta): |
57 | | - remove_key_suffix = meta.remove_key_property_suffix if meta else True |
| 57 | + """ |
| 58 | + Two conventions for handling KeyProperties: |
| 59 | + #1. |
| 60 | + Given: |
| 61 | + store_key = ndb.KeyProperty(...) |
58 | 62 |
|
| 63 | + Result is 2 fields: |
| 64 | + store_key = graphene.String() -> resolves to store_key.urlsafe() |
| 65 | + store = NdbKeyField() -> resolves to entity |
| 66 | +
|
| 67 | + #2. |
| 68 | + Given: |
| 69 | + store = ndb.KeyProperty(...) |
| 70 | +
|
| 71 | + Result is 2 fields: |
| 72 | + store_key = graphene.String() -> resolves to store_key.urlsafe() |
| 73 | + store = NdbKeyField() -> resolves to entity |
| 74 | +
|
| 75 | + """ |
59 | 76 | name = ndb_key_prop._code_name |
60 | | - if remove_key_suffix: |
61 | | - if name.endswith('_key'): |
62 | | - name = name[:-4] |
63 | 77 |
|
64 | | - if name.endswith('_keys'): |
65 | | - name = name[:-5] |
66 | | - name = p.plural(name) |
| 78 | + if name.endswith('_key') or name.endswith('_keys'): |
| 79 | + # Case #1 - name is of form 'store_key' or 'store_keys' |
| 80 | + string_prop_name = name |
| 81 | + resolved_prop_name = name[:-4] if name.endswith('_key') else p.plural(name[:-5]) |
| 82 | + else: |
| 83 | + # Case #2 - name is of form 'store' |
| 84 | + singular_name = p.singular_noun(name) if p.singular_noun(name) else name |
| 85 | + string_prop_name = singular_name + '_keys' if ndb_key_prop._repeated else singular_name + '_key' |
| 86 | + resolved_prop_name = name |
67 | 87 |
|
68 | | - field = NdbKeyField(ndb_key_prop._code_name, ndb_key_prop._kind) |
69 | | - if ndb_key_prop._repeated: |
70 | | - field = field.List |
| 88 | + string_field = NdbKeyStringField(name) |
| 89 | + resolved_field = NdbKeyField(name, ndb_key_prop._kind) |
71 | 90 |
|
72 | | - return ConversionResult(name=name, field=field) |
| 91 | + if ndb_key_prop._repeated: |
| 92 | + string_field = string_field.List |
| 93 | + resolved_field = resolved_field.List |
| 94 | + |
| 95 | + if ndb_key_prop._required: |
| 96 | + string_field = string_field.NonNull |
| 97 | + resolved_field = resolved_field.NonNull |
| 98 | + |
| 99 | + string_key_field_result = ConversionResult(name=string_prop_name, field=string_field) |
| 100 | + resolve_key_field_result = ConversionResult(name=resolved_prop_name, field=resolved_field) |
| 101 | + |
| 102 | + return [ |
| 103 | + string_key_field_result, |
| 104 | + resolve_key_field_result |
| 105 | + ] |
| 106 | + |
| 107 | + # if remove_key_suffix: |
| 108 | + # if name.endswith('_key'): |
| 109 | + # name = name[:-4] |
| 110 | + # |
| 111 | + # if name.endswith('_keys'): |
| 112 | + # name = name[:-5] |
| 113 | + # name = p.plural(name) |
| 114 | + # |
| 115 | + # field = NdbKeyField(ndb_key_prop._code_name, ndb_key_prop._kind) |
| 116 | + # if ndb_key_prop._repeated: |
| 117 | + # field = field.List |
| 118 | + # |
| 119 | + # return ConversionResult(name=name, field=field) |
73 | 120 |
|
74 | 121 |
|
75 | 122 | def convert_local_structured_property(ndb_structured_prop, meta): |
@@ -114,7 +161,7 @@ def convert_ndb_property(prop, meta=None): |
114 | 161 | if not result: |
115 | 162 | raise Exception("Failed to convert NDB field %s (%s)" % (prop._code_name, prop)) |
116 | 163 |
|
117 | | - if isinstance(result, ConversionResult): |
| 164 | + if isinstance(result, (list, ConversionResult,)): |
118 | 165 | return result |
119 | 166 |
|
120 | 167 | return ConversionResult(name=prop._code_name, field=result) |
0 commit comments