1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

FieldChoicesViewSet should infer field choices from serializer, not model

This commit is contained in:
Jeremy Stretch
2019-03-22 16:24:53 -04:00
parent 7d1ee2e94e
commit fc76c8eb0f
6 changed files with 26 additions and 11 deletions

View File

@ -32,7 +32,9 @@ def get_serializer_for_model(model, prefix=''):
try:
return dynamic_import(serializer_name)
except AttributeError:
return None
raise Exception(
"Could not determine serializer for {}.{} with prefix '{}'".format(app_name, model_name, prefix)
)
#
@ -100,6 +102,10 @@ class ChoiceField(Field):
return data
@property
def choices(self):
return self._choices
class ContentTypeField(RelatedField):
"""
@ -110,10 +116,6 @@ class ContentTypeField(RelatedField):
"invalid": "Invalid value. Specify a content type as '<app_label>.<model_name>'.",
}
# Can't set this as an attribute because it raises an exception when the field is read-only
def get_queryset(self):
return ContentType.objects.all()
def to_internal_value(self, data):
try:
app_label, model = data.split('.')
@ -256,10 +258,14 @@ class FieldChoicesViewSet(ViewSet):
self._fields = OrderedDict()
for cls, field_list in self.fields:
for field_name in field_list:
model_name = cls._meta.verbose_name.lower().replace(' ', '-')
key = ':'.join([model_name, field_name])
serializer = get_serializer_for_model(cls)()
choices = []
for k, v in cls._meta.get_field(field_name).choices:
for k, v in serializer.get_fields()[field_name].choices.items():
if type(v) in [list, tuple]:
for k2, v2 in v:
choices.append({