From b643218743ec21423b82e416220904e683a1d5a3 Mon Sep 17 00:00:00 2001 From: Nicolas Joyard Date: Sat, 6 Aug 2016 23:28:50 +0200 Subject: [PATCH] Add theme list and detail pages --- memopol/filters.py | 17 + memopol/fixtures/smaller_sample.json | 27 ++ .../DossiersTest.test_dossier_detail.content | 5 + .../DossiersTest.test_dossier_list.content | 5 + .../DossiersTest.test_dossier_search.content | 5 + ...Test.test_dossier_search_noresults.content | 5 + .../DossiersTest.test_dossier_sorting.content | 5 + ...oupListTest.test_active_committees.content | 5 + ...upListTest.test_active_delegations.content | 5 + .../GroupListTest.test_active_parties.content | 5 + .../GroupListTest.test_all_committees.content | 5 + ...GroupListTest.test_all_delegations.content | 5 + .../GroupListTest.test_all_parties.content | 5 + .../GroupListTest.test_chambers.content | 5 + .../GroupListTest.test_country.content | 5 + ...tativeListTest.test_filter_chamber.content | 5 + ...tativeListTest.test_filter_country.content | 5 + ...entativeListTest.test_filter_group.content | 5 + ...ativeListTest.test_filter_multiple.content | 5 + ...ativeListTest.test_filter_notfound.content | 5 + ...ntativeListTest.test_filter_search.content | 5 + ...e1_paginateby12_active_displaylist.content | 5 + ...page1_paginateby12_all_displaylist.content | 5 + ...aginateby12_displaylist_searchjoly.content | 5 + ...e1_paginateby24_active_displaygrid.content | 5 + ...page1_paginateby24_all_displaygrid.content | 5 + ...est_page2_paginateby12_displaylist.content | 5 + ...est_page2_paginateby24_displaylist.content | 5 + ...epresentativeListTest.test_sorting.content | 5 + .../ThemesTest.test_theme_detail.content | 356 ++++++++++++++++++ .../ThemesTest.test_theme_detail.metadata | 3 + .../ThemesTest.test_theme_list.content | 264 +++++++++++++ .../ThemesTest.test_theme_list.metadata | 3 + .../ThemesTest.test_theme_search.content | 264 +++++++++++++ .../ThemesTest.test_theme_search.metadata | 3 + ...esTest.test_theme_search_noresults.content | 152 ++++++++ ...sTest.test_theme_search_noresults.metadata | 3 + memopol/tests/test_themes.py | 57 +++ memopol/urls.py | 12 + memopol/views/theme_detail.py | 15 + memopol/views/theme_list.py | 30 ++ memopol_themes/migrations/0001_initial.py | 4 +- memopol_themes/models.py | 3 + setup.py | 1 + templates/_header.haml | 3 + templates/memopol_themes/theme_detail.haml | 132 +++++++ templates/memopol_themes/theme_list.haml | 38 ++ 47 files changed, 1521 insertions(+), 1 deletion(-) create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_detail.content create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_detail.metadata create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_list.content create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_list.metadata create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_search.content create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_search.metadata create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.content create mode 100644 memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.metadata create mode 100644 memopol/tests/test_themes.py create mode 100644 memopol/views/theme_detail.py create mode 100644 memopol/views/theme_list.py create mode 100644 templates/memopol_themes/theme_detail.haml create mode 100644 templates/memopol_themes/theme_list.haml diff --git a/memopol/filters.py b/memopol/filters.py index 98774e1..e88575c 100644 --- a/memopol/filters.py +++ b/memopol/filters.py @@ -11,6 +11,7 @@ from django_filters import FilterSet, MethodFilter, ModelChoiceFilter from representatives.models import Chamber, Group, Representative from representatives_votes.models import Dossier +from memopol_themes.models import Theme def rep_chamber_filter(qs, value): @@ -77,3 +78,19 @@ class DossierFilter(FilterSet): return qs.filter(Q(title__icontains=value) | Q(reference__icontains=value)) + + +class ThemeFilter(FilterSet): + + search = MethodFilter(action='search_filter') + + class Meta: + model = Theme + fields = ['search'] + + def search_filter(self, qs, value): + if len(value) == 0: + return qs + + return qs.filter(Q(name__icontains=value) | + Q(description__icontains=value)) diff --git a/memopol/fixtures/smaller_sample.json b/memopol/fixtures/smaller_sample.json index cc46610..12b993c 100644 --- a/memopol/fixtures/smaller_sample.json +++ b/memopol/fixtures/smaller_sample.json @@ -23200,5 +23200,32 @@ }, "model": "representatives_recommendations.recommendation", "pk": 47 +}, +{ + "fields": { + "description": "The Anti-Counterfeiting Trade agreement is a really bad thing, we would like to kill it with fire.", + "positions": [ + ], + "proposals": [ + 5744, 5745, 5746 + ], + "dossiers": [ + 28147 + ], + "slug": "acta", + "name": "acta" + }, + "model": "memopol_themes.theme", + "pk": 1 +}, +{ + "fields": { + "theme": 1, + "datetime": "2008-01-01", + "link": "http://www.laquadrature.net", + "title": "Press release on ACTA from La Quadrature du Net" + }, + "model": "memopol_themes.themelink", + "pk": 1 } ] diff --git a/memopol/tests/response_fixtures/DossiersTest.test_dossier_detail.content b/memopol/tests/response_fixtures/DossiersTest.test_dossier_detail.content index 71cdd4f..6d788cb 100644 --- a/memopol/tests/response_fixtures/DossiersTest.test_dossier_detail.content +++ b/memopol/tests/response_fixtures/DossiersTest.test_dossier_detail.content @@ -65,6 +65,11 @@ Committees +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/DossiersTest.test_dossier_list.content b/memopol/tests/response_fixtures/DossiersTest.test_dossier_list.content index 3d510dc..596ee6b 100644 --- a/memopol/tests/response_fixtures/DossiersTest.test_dossier_list.content +++ b/memopol/tests/response_fixtures/DossiersTest.test_dossier_list.content @@ -69,6 +69,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/DossiersTest.test_dossier_search.content b/memopol/tests/response_fixtures/DossiersTest.test_dossier_search.content index f7bb8d3..65ad739 100644 --- a/memopol/tests/response_fixtures/DossiersTest.test_dossier_search.content +++ b/memopol/tests/response_fixtures/DossiersTest.test_dossier_search.content @@ -69,6 +69,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/DossiersTest.test_dossier_search_noresults.content b/memopol/tests/response_fixtures/DossiersTest.test_dossier_search_noresults.content index 32c24c3..762bad8 100644 --- a/memopol/tests/response_fixtures/DossiersTest.test_dossier_search_noresults.content +++ b/memopol/tests/response_fixtures/DossiersTest.test_dossier_search_noresults.content @@ -69,6 +69,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/DossiersTest.test_dossier_sorting.content b/memopol/tests/response_fixtures/DossiersTest.test_dossier_sorting.content index 88b65ba..cd299a8 100644 --- a/memopol/tests/response_fixtures/DossiersTest.test_dossier_sorting.content +++ b/memopol/tests/response_fixtures/DossiersTest.test_dossier_sorting.content @@ -69,6 +69,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_active_committees.content b/memopol/tests/response_fixtures/GroupListTest.test_active_committees.content index 3d29239..143ad24 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_active_committees.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_active_committees.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_active_delegations.content b/memopol/tests/response_fixtures/GroupListTest.test_active_delegations.content index 18d46b0..0b72c11 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_active_delegations.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_active_delegations.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_active_parties.content b/memopol/tests/response_fixtures/GroupListTest.test_active_parties.content index 05c7990..ea63d76 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_active_parties.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_active_parties.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_all_committees.content b/memopol/tests/response_fixtures/GroupListTest.test_all_committees.content index ea9f710..88e81cf 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_all_committees.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_all_committees.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_all_delegations.content b/memopol/tests/response_fixtures/GroupListTest.test_all_delegations.content index 4cf0594..c2a47ab 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_all_delegations.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_all_delegations.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_all_parties.content b/memopol/tests/response_fixtures/GroupListTest.test_all_parties.content index 444be53..d534920 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_all_parties.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_all_parties.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_chambers.content b/memopol/tests/response_fixtures/GroupListTest.test_chambers.content index 914cf3c..ba28cd9 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_chambers.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_chambers.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/GroupListTest.test_country.content b/memopol/tests/response_fixtures/GroupListTest.test_country.content index a74289b..469fe9b 100644 --- a/memopol/tests/response_fixtures/GroupListTest.test_country.content +++ b/memopol/tests/response_fixtures/GroupListTest.test_country.content @@ -65,6 +65,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_chamber.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_chamber.content index a58b62d..b613a7e 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_chamber.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_chamber.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_country.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_country.content index 3d1e2bf..8d67670 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_country.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_country.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_group.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_group.content index 5588b1e..fbcc928 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_group.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_group.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_multiple.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_multiple.content index 48f7ef6..5ccb5f7 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_multiple.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_multiple.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_notfound.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_notfound.content index 0af709b..f8c0051 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_notfound.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_notfound.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_search.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_search.content index 935136e..b45e416 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_search.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_filter_search.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_active_displaylist.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_active_displaylist.content index 926fd08..e792250 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_active_displaylist.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_active_displaylist.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_all_displaylist.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_all_displaylist.content index d6f0a2f..597f034 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_all_displaylist.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_all_displaylist.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_displaylist_searchjoly.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_displaylist_searchjoly.content index 6b8cf4f..0c72f89 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_displaylist_searchjoly.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby12_displaylist_searchjoly.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_active_displaygrid.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_active_displaygrid.content index 8d9c781..1360a23 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_active_displaygrid.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_active_displaygrid.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_all_displaygrid.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_all_displaygrid.content index 84e9939..79aaab7 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_all_displaygrid.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page1_paginateby24_all_displaygrid.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby12_displaylist.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby12_displaylist.content index 20ec8be..5e55b82 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby12_displaylist.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby12_displaylist.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby24_displaylist.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby24_displaylist.content index bfa6bad..f1f63ea 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby24_displaylist.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_page2_paginateby24_displaylist.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/RepresentativeListTest.test_sorting.content b/memopol/tests/response_fixtures/RepresentativeListTest.test_sorting.content index 96a275b..6ec2b23 100644 --- a/memopol/tests/response_fixtures/RepresentativeListTest.test_sorting.content +++ b/memopol/tests/response_fixtures/RepresentativeListTest.test_sorting.content @@ -74,6 +74,11 @@ Committees
  • +
  • + + Themes + +
  • Dossiers diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_detail.content b/memopol/tests/response_fixtures/ThemesTest.test_theme_detail.content new file mode 100644 index 0000000..acab504 --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_detail.content @@ -0,0 +1,356 @@ + + + + + + + + Home - Political Memory + + + + + + + + + + + + + + + + +
    + + +

    acta

    + +

    + Description + +

    +

    + The Anti-Counterfeiting Trade agreement is a really bad thing, we would like to kill it with fire. + +

    +

    + Links + +

    + + + + + + + + +
    + + Press release on ACTA from La Quadrature du Net + + + Jan. 1, 2008 + +
    +

    + Dossiers + +

    + + + + + + + + + + + + + + +
    + Chambers + + Dossier + + Reference + +
    + + + + + + Resolution on the Anti-Counterfeiting Trade Agreement (ACTA) + + + 2010/2935(RSP)
    +

    + Proposals + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Chambers + + Dossier + + Reference + + Proposal + + Title + + Recommendation + + Status +
    + + + + + + Resolution on the Anti-Counterfeiting Trade Agreement (ACTA) + + + 2010/2935(RSP) + RC-B7-0617/2010 - Accord commercial anti-contrefaçon (ACAC) - Considérant X +
    + + B7-0617/2010 + + +
    Stop acta !adopted32924975
    + + + + + + Resolution on the Anti-Counterfeiting Trade Agreement (ACTA) + + + 2010/2935(RSP) + RC-B7-0617/2010 - Accord commercial anti-contrefaçon (ACAC) - Considérant CC +
    + + B7-0617/2010 + + +
    Stop acta !adopted31531214
    + + + + + + Resolution on the Anti-Counterfeiting Trade Agreement (ACTA) + + + 2010/2935(RSP) + RC-B7-0617/2010 - Accord commercial anti-contrefaçon (ACAC) - Résolution +
    + + B7-0617/2010 + + +
    Stop acta !rejected30632226
    +

    + Positions + +

    + + + + + + + + + +
    + Representative + + Date + + Position + + Link + +
    + +
    + + + + + + diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_detail.metadata b/memopol/tests/response_fixtures/ThemesTest.test_theme_detail.metadata new file mode 100644 index 0000000..a2e0a69 --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_detail.metadata @@ -0,0 +1,3 @@ +{ + "status_code": 200 +} \ No newline at end of file diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_list.content b/memopol/tests/response_fixtures/ThemesTest.test_theme_list.content new file mode 100644 index 0000000..624b22f --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_list.content @@ -0,0 +1,264 @@ + + + + + + + + Home - Political Memory + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    + +
    Filter +
    + +
    + +
    + + + +
    + + + + + + +
    + + +
    +
    + Number of results : 1 + +
    + + +
    + Number of displayed results : + 12 + ( + + 12 + + / + + + 24 + + / + + + 48 + + / + + + 96 + + + ) + +
    +
    +
    + + +

    + Themes + +

    + + + + + + + + + +
    + Name + +
    + + acta + + +
    +
    + + +
    +
    + Number of results : 1 + +
    + + +
    + Number of displayed results : + 12 + ( + + 12 + + / + + + 24 + + / + + + 48 + + / + + + 96 + + + ) + +
    +
    +
    + + + + + +
    + + + + + + diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_list.metadata b/memopol/tests/response_fixtures/ThemesTest.test_theme_list.metadata new file mode 100644 index 0000000..a2e0a69 --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_list.metadata @@ -0,0 +1,3 @@ +{ + "status_code": 200 +} \ No newline at end of file diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_search.content b/memopol/tests/response_fixtures/ThemesTest.test_theme_search.content new file mode 100644 index 0000000..3108048 --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_search.content @@ -0,0 +1,264 @@ + + + + + + + + Home - Political Memory + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    + +
    Filter +
    + +
    + +
    + + + +
    + + + + + + +
    + + +
    +
    + Number of results : 1 + +
    + + +
    + Number of displayed results : + 12 + ( + + 12 + + / + + + 24 + + / + + + 48 + + / + + + 96 + + + ) + +
    +
    +
    + + +

    + Themes + +

    + + + + + + + + + +
    + Name + +
    + + acta + + +
    +
    + + +
    +
    + Number of results : 1 + +
    + + +
    + Number of displayed results : + 12 + ( + + 12 + + / + + + 24 + + / + + + 48 + + / + + + 96 + + + ) + +
    +
    +
    + + + + + +
    + + + + + + diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_search.metadata b/memopol/tests/response_fixtures/ThemesTest.test_theme_search.metadata new file mode 100644 index 0000000..a2e0a69 --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_search.metadata @@ -0,0 +1,3 @@ +{ + "status_code": 200 +} \ No newline at end of file diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.content b/memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.content new file mode 100644 index 0000000..d44a2ac --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.content @@ -0,0 +1,152 @@ + + + + + + + + Home - Political Memory + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    + +
    Filter +
    + +
    + +
    + + + +
    + + + + + + +
    No matching themes found :(
    + + + + +
    + + + + + + diff --git a/memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.metadata b/memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.metadata new file mode 100644 index 0000000..a2e0a69 --- /dev/null +++ b/memopol/tests/response_fixtures/ThemesTest.test_theme_search_noresults.metadata @@ -0,0 +1,3 @@ +{ + "status_code": 200 +} \ No newline at end of file diff --git a/memopol/tests/test_themes.py b/memopol/tests/test_themes.py new file mode 100644 index 0000000..49fb078 --- /dev/null +++ b/memopol/tests/test_themes.py @@ -0,0 +1,57 @@ +# -*- coding: utf8 -*- + +from django.test import TestCase + +from memopol_themes.models import Theme + +from .base import ResponseDiffMixin + + +class ThemesTest(ResponseDiffMixin, TestCase): + fixtures = ['smaller_sample.json'] + + def test_theme_list(self): + # session setup + self.client.get('/theme/') + + # 1 query for theme count + # 1 query for themes + self.responsediff_test('/theme/', 2) + + def test_theme_search(self): + # session setup + self.client.get('/theme/') + + # 1 query for theme count + # 1 query for themes + q = 'acta' + self.responsediff_test('/theme/?search=%s' % q, 2) + + def test_theme_search_noresults(self): + # session setup + self.client.get('/theme/') + + # 1 query for theme count + # nothing else since count = 0 + q = 'no-theme-will-have-that-title-ever' + self.responsediff_test('/theme/?search=%s' % q, 1) + + def test_theme_detail(self): + # Get 1st theme in dataset + theme = Theme.objects.order_by('pk')[0] + + # session setup + self.client.get('/theme/%s/' % theme.pk) + + # 1 query for the theme + # 1 query for links + # 1 query for dossiers + # 1 query for dossier documents + # 1 query for dossier document chambers + # 1 query for proposals + # 1 query for proposals dossiers + # 1 query for proposals dossier documents + # 1 query for proposals dossier document chambers + # 1 query for positions + # 1 query for position representativs + self.responsediff_test('/theme/%s/' % theme.slug, 11) diff --git a/memopol/urls.py b/memopol/urls.py index 848cb76..57d4c11 100644 --- a/memopol/urls.py +++ b/memopol/urls.py @@ -11,6 +11,8 @@ from views.group_list import GroupList from views.representative_detail import RepresentativeDetail from views.representative_list import RepresentativeList from views.redirects import RedirectGroupList, RedirectGroupRepresentativeList +from views.theme_detail import ThemeDetail +from views.theme_list import ThemeList import api @@ -84,6 +86,16 @@ urlpatterns = [ ProposalAutocomplete.as_view(), name='proposal-autocomplete', ), + url( + r'^theme/$', + ThemeList.as_view(), + name='theme-list' + ), + url( + r'^theme/(?P[-\w]+)/$', + ThemeDetail.as_view(), + name='theme-detail' + ), url(r'^admin/', include(admin.site.urls)), url(r'^positions/', include('representatives_positions.urls', diff --git a/memopol/views/theme_detail.py b/memopol/views/theme_detail.py new file mode 100644 index 0000000..bcd074d --- /dev/null +++ b/memopol/views/theme_detail.py @@ -0,0 +1,15 @@ +# coding: utf-8 + +from django.views import generic + +from memopol_themes.models import Theme + + +class ThemeDetail(generic.DetailView): + queryset = Theme.objects.prefetch_related( + 'links', + 'dossiers__documents__chamber', + 'proposals__recommendation', + 'proposals__dossier__documents__chamber', + 'positions__representative', + ) diff --git a/memopol/views/theme_list.py b/memopol/views/theme_list.py new file mode 100644 index 0000000..12b56fc --- /dev/null +++ b/memopol/views/theme_list.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from core.views import PaginationMixin + +from django.views import generic + +from memopol_themes.models import Theme + +from ..filters import ThemeFilter + + +class ThemeList(PaginationMixin, generic.ListView): + + current_filter = None + queryset = Theme.objects.all() + + def theme_filter(self, qs): + f = ThemeFilter(self.request.GET, queryset=qs) + self.current_filter = f + return f.qs + + def get_queryset(self): + qs = super(ThemeList, self).get_queryset() + qs = self.theme_filter(qs) + return qs + + def get_context_data(self, **kwargs): + c = super(ThemeList, self).get_context_data(**kwargs) + c['filter'] = self.current_filter + return c diff --git a/memopol_themes/migrations/0001_initial.py b/memopol_themes/migrations/0001_initial.py index 6c7d37c..410bab8 100644 --- a/memopol_themes/migrations/0001_initial.py +++ b/memopol_themes/migrations/0001_initial.py @@ -2,13 +2,14 @@ from __future__ import unicode_literals from django.db import migrations, models +import autoslug.fields class Migration(migrations.Migration): dependencies = [ ('representatives_votes', '0012_document'), - ('representatives_positions', '0002_increase_link_length'), + ('representatives_positions', '0003_remove_position_tags'), ] operations = [ @@ -17,6 +18,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(unique=True, max_length=255)), + ('slug', autoslug.fields.AutoSlugField(populate_from=b'name', editable=False)), ('description', models.TextField()), ('dossiers', models.ManyToManyField(related_name='themes', to='representatives_votes.Dossier')), ('positions', models.ManyToManyField(related_name='themes', to='representatives_positions.Position')), diff --git a/memopol_themes/models.py b/memopol_themes/models.py index efc62c3..93760fc 100644 --- a/memopol_themes/models.py +++ b/memopol_themes/models.py @@ -1,12 +1,15 @@ from django.db import models from django.utils.encoding import smart_unicode +from autoslug import AutoSlugField + from representatives_votes.models import Dossier, Proposal from representatives_positions.models import Position class Theme(models.Model): name = models.CharField(max_length=255, unique=True) + slug = AutoSlugField(populate_from='name') description = models.TextField() dossiers = models.ManyToManyField(Dossier, related_name='themes') diff --git a/setup.py b/setup.py index a61880c..e75551a 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,7 @@ setup(name='political-memory', url='http://github.com/political-memory/political_memory/', install_requires=[ 'django-autocomplete-light>=3.0,<4.0', + 'django-autoslug>=1.9,<1.10', 'django-bootstrap3>=6,<7', 'django-coffeescript>=0.7,<0.8', 'django-compressor>=1,<2', diff --git a/templates/_header.haml b/templates/_header.haml index ae7cb83..949e931 100644 --- a/templates/_header.haml +++ b/templates/_header.haml @@ -32,6 +32,9 @@ %li %a{href: "{% url 'group-list' kind='committee' %}"} - trans 'Committees' + %li + %a{href: "{% url 'theme-list' %}"} + - trans 'Themes' %li %a{href: "{% url 'dossier-list' %}"} - trans 'Dossiers' diff --git a/templates/memopol_themes/theme_detail.haml b/templates/memopol_themes/theme_detail.haml new file mode 100644 index 0000000..25f2baf --- /dev/null +++ b/templates/memopol_themes/theme_detail.haml @@ -0,0 +1,132 @@ +- extends "base.html" + +- load i18n +- load memopol_tags + +- block content + + %h1 {{ theme.name }} + + %h2 + - trans "Description" + + %p.description + {{ theme.description }} + + %h2 + - trans "Links" + + %table.table + + - for link in theme.links.all + %tr + %td + %a.external{'href': '{{ link.link }}', target:'_blank'} + = link.title + %td + = link.datetime + + %h2 + - trans "Dossiers" + + %table.table + %tr + %th + - trans "Chambers" + %th + - trans "Dossier" + %th + - trans "Reference" + + - for dossier in theme.dossiers.all + %tr + %td + - for chamber in dossier.chambers + = chamber | chamber_small_icon + %td + %a{'href': "{% url 'dossier-detail' dossier.pk %}"} + {{ dossier.title }} + + %td= dossier.reference + + %h2 + - trans "Proposals" + + %table.table + %tr + %th + - trans "Chambers" + %th + - trans "Dossier" + %th + - trans "Reference" + %th + - trans "Proposal" + %th + - trans "Title" + %th + - trans "Recommendation" + %th + - trans "Status" + %th= "for" | position_icon + %th= "against" | position_icon + %th= "abstain" | position_icon + + - for proposal in theme.proposals.all + + %tr + %td + - for chamber in proposal.dossier.chambers + = chamber | chamber_small_icon + %td + %a{'href': "{% url 'dossier-detail' proposal.dossier.pk %}"} + {{ proposal.dossier.title }} + + %td= proposal.dossier.reference + + %td + = proposal.title + %br + %small + {{ proposal.reference }} + + - if proposal.recommendation + + %td= proposal.recommendation.title + %td= proposal.recommendation.recommendation | position_icon + + - else + %td.no-recommendation{colspan:2}= "No recommendation" + + %td= proposal.status + %td= proposal.total_for + %td= proposal.total_against + %td= proposal.total_abstain + + + %h2 + - trans "Positions" + + %table.table + %tr + %th + - trans "Representative" + %th + - trans "Date" + %th + - trans "Position" + %th + - trans "Link" + + - for position in theme.positions.all + + %tr.position + %td + = position.representative + %td= position.datetime + %td + %a{:href => '{{ position.get_absolute_url }}'} + =position.text|truncatewords:8 + %td + %a{:href => '{{ position.link }}'} + = position.link diff --git a/templates/memopol_themes/theme_list.haml b/templates/memopol_themes/theme_list.haml new file mode 100644 index 0000000..c91e6c8 --- /dev/null +++ b/templates/memopol_themes/theme_list.haml @@ -0,0 +1,38 @@ +- extends "base.html" +- load i18n +- load memopol_tags + +- block head + + {{ filter.form.media }} + +- block content + + - block search + + {% url 'theme-list' as action_url %} + - include '_filter_form.html' with action=action_url form=filter.form qs=request.GET.urlencode + + - if object_list|length == 0 + + .no-results="No matching themes found :(" + + - else + + - include 'core/blocks/pagination.html' + + %h1 + - trans "Themes" + + %table.table + %tr + %th + - trans "Name" + + - for theme in object_list + %tr + %td= + %a{'href': "{% url 'theme-detail' theme.slug %}"} + {{ theme.name }} + + - include "core/blocks/pagination.html" -- GitLab