From 6238f0ab9ac632b7e3c70fea82b480ca56803ce1 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Wed, 8 May 2013 17:36:04 -0400 Subject: [PATCH] Add summary_fields capability, which for items in a collection gives the names of related fields. { 'summary_fields' : { 'organization' : { 'name' : 'foo', 'description' : 'bar', } } } etc. This is automatic for all field types configured in serializers.py (SUMMARIZABLE_FKs, etc). --- lib/main/models/__init__.py | 5 +++-- lib/main/serializers.py | 33 ++++++++++++++++++++++++++++++--- lib/settings/defaults.py | 2 +- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/lib/main/models/__init__.py b/lib/main/models/__init__.py index 9993400c4f..11462d61dc 100644 --- a/lib/main/models/__init__.py +++ b/lib/main/models/__init__.py @@ -874,5 +874,6 @@ def create_auth_token_for_user(sender, **kwargs): try: Token.objects.get_or_create(user=instance) except DatabaseError: - pass # Only fails when creating a new superuser from syncdb on a - # new database (before migrate has been called). + pass + # Only fails when creating a new superuser from syncdb on a + # new database (before migrate has been called). diff --git a/lib/main/serializers.py b/lib/main/serializers.py index 0d650ca094..c65ce708ef 100644 --- a/lib/main/serializers.py +++ b/lib/main/serializers.py @@ -25,9 +25,10 @@ from rest_framework.templatetags.rest_framework import replace_query_param # Ansible Commander from lib.main.models import * -BASE_FIELDS = ('id', 'url', 'related', 'creation_date', 'name', 'description') +BASE_FIELDS = ('id', 'url', 'related', 'summary_fields', 'creation_date', 'name', 'description') class NextPageField(pagination.NextPageField): + ''' makes the pagination relative URL not full URL ''' def to_native(self, value): if not value.has_next(): @@ -38,6 +39,7 @@ class NextPageField(pagination.NextPageField): return replace_query_param(url, self.page_field, page) class PreviousPageField(pagination.NextPageField): + ''' makes the pagination relative URL not full URL ''' def to_native(self, value): if not value.has_previous(): @@ -56,11 +58,22 @@ class PaginationSerializer(pagination.BasePaginationSerializer): next = NextPageField(source='*') previous = PreviousPageField(source='*') +# objects that if found we should add summary info for them +SUMMARIZABLE_FKS = ( + 'organization', 'host', 'group', 'inventory', 'project', 'team', 'job', 'job_template', + 'credential', 'permission' +) +# fields that should be summarized regardless of object type +SUMMARIZABLE_FIELDS = ( + 'name', 'username', 'first_name', 'last_name', 'description' +) + class BaseSerializer(serializers.ModelSerializer): # add the URL and related resources - url = serializers.SerializerMethodField('get_absolute_url') - related = serializers.SerializerMethodField('get_related') + url = serializers.SerializerMethodField('get_absolute_url') + related = serializers.SerializerMethodField('get_related') + summary_fields = serializers.SerializerMethodField('get_summary_fields') # make certain fields read only creation_date = serializers.SerializerMethodField('get_creation_date') # FIXME: is model Date or DateTime, fix model @@ -78,6 +91,20 @@ class BaseSerializer(serializers.ModelSerializer): res['created_by'] = reverse('main:users_detail', args=(obj.created_by.pk,)) return res + def get_summary_fields(self, obj): + # return the names (at least) for various fields, so we don't have to write this + # method for each object. + summary_fields = {} + for fk in SUMMARIZABLE_FKS: + fkval = getattr(obj, fk, None) + if fkval is not None: + summary_fields[fk] = {} + for field in SUMMARIZABLE_FIELDS: + fval = getattr(fkval, field, None) + if fval is not None: + summary_fields[fk][field] = fval + return summary_fields + def get_creation_date(self, obj): if isinstance(obj, User): return obj.date_joined.date() diff --git a/lib/settings/defaults.py b/lib/settings/defaults.py index 18f50080ae..2e23820cb3 100644 --- a/lib/settings/defaults.py +++ b/lib/settings/defaults.py @@ -221,7 +221,7 @@ LOGGING = { 'handlers': ['console'], }, 'django.request': { - 'handlers': ['mail_admins'], + 'handlers': ['console','mail_admins'], 'level': 'ERROR', 'propagate': False, },