christchurch_django / contacts / admin.py

from django.contrib import admin

from .models import Contact, HomeGroup


CONTACT_VIEWER_GROUP_NAME = 'Contact viewers'

def is_contact_viewer(user):
    return user.groups.filter(name=CONTACT_VIEWER_GROUP_NAME).exists()

class ContactAdmin(admin.ModelAdmin):
    def address(obj):
        return ', '.join(obj.address.strip().split('\n'))
    list_display = ['name', address, 'post_code', 'phone_number', 'mobile_number', 'email']

    # We allow some church people to view admin screens.  Some data is kept
    # private from them, therefore we are careful about list_display,
    # list_filter, fieldsets
    # TODO:
    # Once we move to Django 1.4, can define get_list_display
    # and conditionally add attributes not in church_public_attrs

    church_public_attrs = ['name', 'address', 'post_code', 'phone_number',
                           'mobile_number', 'email']

    def get_fieldsets(self, request, obj=None):
        if  is_contact_viewer(request.user):
           return [('', {'fields': self.church_public_attrs})]
        else:
            return super(ContactAdmin, self).get_fieldsets(request, obj=obj)

    def get_readonly_fields(self, request, obj=None):
        if is_contact_viewer(request.user):
            # All are readonly
            return [f.name for f in Contact._meta.fields if not f.primary_key]
        else:
            return super(ContactAdmin, self).get_readonly_fields(request, obj=obj)

class HomeGroupAdmin(admin.ModelAdmin):
    list_display = ['name', 'group_email']

admin.site.register(Contact, ContactAdmin)
admin.site.register(HomeGroup, HomeGroupAdmin)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.