diff --git a/setup.py b/setup.py index b9a014a4304236ac06a5fd58ed1ca2ca287bb906..f00b7292f548392363f26567f7ef16a8acfb5414 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,8 @@ setup(name='meopol', 'django-haystack==2.6.0', 'pysolr==3.6.0', 'Whoosh==2.7.4', - 'alabaster==0.7.10', + 'alabaster==0.7.10', + 'django-nested-admin', ], extras_require={ # Full version hardcode for testing dependencies so that diff --git a/src/memopol/settings.py b/src/memopol/settings.py index e3f29e44fef36dd5748b95fb8e635f3aea8c9dbe..4d5880926d6e0c9511a1820c13a18e8110fffe96 100644 --- a/src/memopol/settings.py +++ b/src/memopol/settings.py @@ -59,6 +59,7 @@ INSTALLED_APPS = ( 'rest_framework', 'taggit', 'haystack', + 'nested_admin', # memopol apps 'core', diff --git a/src/memopol/urls.py b/src/memopol/urls.py index 35a7dec90df32d4df2bb2c52bc75793d6b93d24a..2992b991c60928eb4e7b4232832bb1f79d44be88 100644 --- a/src/memopol/urls.py +++ b/src/memopol/urls.py @@ -248,4 +248,10 @@ urlpatterns = [ name="representative-search-name-autocomplete" ), + # Nested admin + url( + r'^nested_admin/', + include('nested_admin.urls') + ), + ] + legacy_patterns diff --git a/src/representatives_votes/admin.py b/src/representatives_votes/admin.py index c82849a321e1a4cdaefdee78a0dfc14d3095429a..225fece1c14164c0470257e9b6bde5864ba97d91 100644 --- a/src/representatives_votes/admin.py +++ b/src/representatives_votes/admin.py @@ -2,12 +2,12 @@ from django.contrib import admin -from .models import Dossier, Document, Proposal, Vote +import nested_admin +from representatives_recommendations.models import Recommendation +from representatives_recommendations.forms import RecommendationForm -class DossierAdmin(admin.ModelAdmin): - list_display = ('id', 'reference', 'title') - search_fields = ('reference', 'title') +from .models import Dossier, Document, Proposal, Vote class DocumentAdmin(admin.ModelAdmin): @@ -18,18 +18,52 @@ class DocumentAdmin(admin.ModelAdmin): return obj.dossier.reference -class ProposalAdmin(admin.ModelAdmin): +class RecommendationStackedInline(nested_admin.NestedStackedInline): + model = Recommendation + min_num = 1 + max_num = 1 + fields = ('title', 'description', + 'recommendation', 'weight', + 'id', 'proposal',) + form = RecommendationForm + + +class ProposalAdmin(nested_admin.NestedModelAdmin): list_display = ( 'reference', 'dossier_reference', 'title', 'kind') search_fields = ('reference', 'dossier__reference', 'title') + inlines = [ + RecommendationStackedInline, + ] def dossier_reference(self, obj): return obj.dossier.reference +class ProposalStackedInline(nested_admin.NestedStackedInline): + model = Proposal + extra = 0 + can_delete = False + min_num = 0 + readonly_fields = ('title', 'description',) + fields = ('title', 'description',) + show_change_link = True + inlines = [ + RecommendationStackedInline, + ] + + +class DossierAdmin(nested_admin.NestedModelAdmin): + list_display = ('id', 'reference', 'title') + search_fields = ('reference', 'title') + inlines = [ + ProposalStackedInline, + ] + + class NoneMatchingFilter(admin.SimpleListFilter): title = 'Representative' parameter_name = 'representative'