Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • la-quadrature-du-net/memopol/memopol
  • lnclt/political_memory
  • arthur/political_memory
  • agrausem/political_memory
  • periode/memopol
  • Anthony/memopol
  • Porkepix/memopol
  • jaster/memopol
  • luxcem/memopol
  • TAlone/memopol
10 résultats
Afficher les modifications
Affichage de
avec 81 ajouts et 30208 suppressions
Setup Solr with Memopol
=======================
Solr is used to perform search in the data. Currently, it is used only for
reprensatative search autocomplete.
This howto will be based on the current stable version of Debian (jessie).
Installation on Debian Stable
-----------------------------
Solr is in the official repository of debian, you can install it launching::
# apt install solr-tomcat/stable
Package: solr-tomcat
Source: lucene-solr
Version: 3.6.2+dfsg-5
Installed-Size: 65,5 kB
Maintainer: Debian Java Maintainers <pkg-java-maintainers@lists.alioth.debian.org>
Depends: solr-common (= 3.6.2+dfsg-5), tomcat7
Conflicts: solr-jetty, solr-tomcat6
Homepage: http://lucene.apache.org
Section: java
Priority: optional
Download-Size: 8 598 B
APT-Sources: http://ftp.fr.debian.org/debian/ jessie/main amd64 Packages
Description: Enterprise search server based on Lucene3 - Tomcat integration
Solr is an open source enterprise search server based on the Lucene
Java search library, with XML/HTTP and JSON APIs, hit highlighting,
faceted search, caching, replication, and a web administration
interface. It runs in a Java servlet container such as Tomcat.
.
This package provides the Tomcat integration files for Solr.
By default, the solr server is listen on localhost:8080. Memopol is configured
to use this addess by default, in production. If you install a newer version of
Solr (6.5.1 is the latest release), you should update the settings.py::
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://127.0.0.1:8080/solr',
},
}
Configure Solr
---------------
You can use the default Solr configuration to use it, You just need to generate
the schema.xml file and copy it in `/etc/solr/`. To generate the schema.xml
file::
$ memopol build_solr_schema > schmema.xml
## Copy the schema.xml file into /etc/solr/conf
$ sudo cp schema.xml /etc/solr/conf/
## Restart tomcat
$ sudo /etc/init.d/tomcat7 restart
Last step, you need to build the index by using::
$ memopol rebuild_index
The solr is now setup and production ready.
Populate data in Solr
---------------------
Django-haystack plugin offers two ways to populate data. The first way is by
using a cron job to update the index, the other way is to use `Dango signals to
update / delete datas <https://django-haystack.readthedocs.io/en/v2.6.0/signal_processors.html>`_.
For now, Haystack is not configured to be used with Django signals. It is
necessary to add a cron job to update the index ::
$ memopol update_index
`More informations about cron with Solr <http://django-haystack.readthedocs.io/en/v2.6.0/searchindex_api.html?highlight=cron#keeping-the-index-fresh>`_
from rest_framework import routers
from representatives.api import (
ConstituencyViewSet,
GroupViewSet,
MandateViewSet,
RepresentativeViewSet,
)
from representatives_votes.api import (
DossierViewSet,
ProposalViewSet,
VoteViewSet,
)
from representatives_recommendations.api import (
DossierScoreViewSet,
RecommendationViewSet,
RepresentativeScoreViewSet,
VoteScoreViewSet
)
router = routers.DefaultRouter()
router.register(r'constituencies', ConstituencyViewSet)
router.register(r'dossiers', DossierViewSet)
router.register(r'dossier_scores', DossierScoreViewSet)
router.register(r'groups', GroupViewSet)
router.register(r'mandates', MandateViewSet)
router.register(r'proposals', ProposalViewSet)
router.register(r'recommendations', RecommendationViewSet)
router.register(r'representatives', RepresentativeViewSet)
router.register(r'scores', RepresentativeScoreViewSet)
router.register(r'vote_scores', VoteScoreViewSet)
router.register(r'votes', VoteViewSet)
Ce diff est replié.
Ce diff est replié.
# coding: utf-8
from django import template
from django.utils.safestring import mark_safe
import re
register = template.Library()
link = '<a class="{network}-link" href="{url}" target="_blank">{label}</a>'
@register.filter
def twitter_link(url):
return mark_safe(link.format(network='twitter', url=url,
label=re.sub(r'.*/@?([^/]+)', '@\\1', re.sub(r'/$', '', url.strip()))))
@register.filter
def facebook_link(url):
return mark_safe(link.format(network='facebook', url=url,
label=re.sub(r'.*/([^/]+)', '\\1', re.sub(r'/$', '', url.strip()))))
@register.filter
def website_link(url):
short_url = re.sub(r'^https?://([^/]+).*', '\\1', url)
return mark_safe(link.format(network='website', url=url,
label=short_url))
@register.filter
def email_link(address):
return mark_safe(link.format(network='email', url='mailto:%s' % address,
label=address))
<h2>Mandates</h2>
<table class='table table-condensed mandates'>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Women&#39;s%20Rights%20and%20Gender%20Equality/'>
Committee on Women&#39;s Rights and Gender Equality
FEMM
</a>
</td>
<td>01/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Legal%20Affairs/'>
Committee on Legal Affairs
JURI
</a>
</td>
<td>01/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Culture%20and%20Education/'>
Committee on Culture and Education
CULT
</a>
</td>
<td>08/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20for%20relations%20with%20South%20Africa/'>
Delegation for relations with South Africa
</a>
</td>
<td>14/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20Parliamentary%20Assembly%20of%20the%20Union%20for%20the%20Mediterranean/'>
Delegation to the Parliamentary Assembly of the Union for the Mediterranean
</a>
</td>
<td>14/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20for%20relations%20with%20Palestine/'>
Delegation for relations with Palestine
</a>
</td>
<td>14/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Progressive%20Alliance%20of%20Socialists%20and%20Democrats%20in%20the%20European%20Parliament/'>
Group of the Progressive Alliance of Socialists and Democrats in the European Parliament
SD
</a>
</td>
<td>01/07/2014</td>
<td>present</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td></td>
<td>
<a href='/legislature/representative/country/United%20Kingdom/'>
United Kingdom
GB
</a>
</td>
<td>01/07/2014</td>
<td>present</td>
<td>Labour Party</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Women&#39;s%20Rights%20and%20Gender%20Equality/'>
Committee on Women&#39;s Rights and Gender Equality
FEMM
</a>
</td>
<td>19/01/2012</td>
<td>30/06/2014</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Culture%20and%20Education/'>
Committee on Culture and Education
CULT
</a>
</td>
<td>19/01/2012</td>
<td>30/06/2014</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Legal%20Affairs/'>
Committee on Legal Affairs
JURI
</a>
</td>
<td>19/01/2012</td>
<td>30/06/2014</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20for%20relations%20with%20Canada/'>
Delegation for relations with Canada
</a>
</td>
<td>16/09/2009</td>
<td>30/06/2014</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Progressive%20Alliance%20of%20Socialists%20and%20Democrats%20in%20the%20European%20Parliament/'>
Group of the Progressive Alliance of Socialists and Democrats in the European Parliament
SD
</a>
</td>
<td>14/07/2009</td>
<td>30/06/2014</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td></td>
<td>
<a href='/legislature/representative/country/United%20Kingdom/'>
United Kingdom
GB
</a>
</td>
<td>14/07/2009</td>
<td>30/06/2014</td>
<td>Labour Party</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Women&#39;s%20Rights%20and%20Gender%20Equality/'>
Committee on Women&#39;s Rights and Gender Equality
FEMM
</a>
</td>
<td>16/07/2009</td>
<td>18/01/2012</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Culture%20and%20Education/'>
Committee on Culture and Education
CULT
</a>
</td>
<td>16/07/2009</td>
<td>18/01/2012</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Legal%20Affairs/'>
Committee on Legal Affairs
JURI
</a>
</td>
<td>20/09/2010</td>
<td>18/01/2012</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Regional%20Development/'>
Committee on Regional Development
REGI
</a>
</td>
<td>16/07/2009</td>
<td>19/09/2010</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Industry,%20Research%20and%20Energy/'>
Committee on Industry, Research and Energy
ITRE
</a>
</td>
<td>31/01/2007</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Culture%20and%20Education/'>
Committee on Culture and Education
CULT
</a>
</td>
<td>31/01/2007</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Women&#39;s%20Rights%20and%20Gender%20Equality/'>
Committee on Women&#39;s Rights and Gender Equality
FEMM
</a>
</td>
<td>31/01/2007</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20EU-Former%20Yugoslav%20Republic%20of%20Macedonia%20Joint%20Parliamentary%20Committee/'>
Delegation to the EU-Former Yugoslav Republic of Macedonia Joint Parliamentary Committee
</a>
</td>
<td>15/09/2004</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20EU-Turkey%20Joint%20Parliamentary%20Committee/'>
Delegation to the EU-Turkey Joint Parliamentary Committee
</a>
</td>
<td>15/09/2004</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20Euro-Mediterranean%20Parliamentary%20Assembly/'>
Delegation to the Euro-Mediterranean Parliamentary Assembly
</a>
</td>
<td>15/09/2004</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Socialist%20Group%20in%20the%20European%20Parliament/'>
Socialist Group in the European Parliament
PSE
</a>
</td>
<td>20/07/2004</td>
<td>13/07/2009</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td></td>
<td>
<a href='/legislature/representative/country/United%20Kingdom/'>
United Kingdom
GB
</a>
</td>
<td>20/07/2004</td>
<td>13/07/2009</td>
<td>Labour Party</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20the%20Environment,%20Public%20Health%20and%20Food%20Safety/'>
Committee on the Environment, Public Health and Food Safety
ENVI
</a>
</td>
<td>15/01/2007</td>
<td>30/01/2007</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Women&#39;s%20Rights%20and%20Gender%20Equality/'>
Committee on Women&#39;s Rights and Gender Equality
FEMM
</a>
</td>
<td>15/01/2007</td>
<td>30/01/2007</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Culture%20and%20Education/'>
Committee on Culture and Education
CULT
</a>
</td>
<td>15/01/2007</td>
<td>30/01/2007</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20the%20Environment,%20Public%20Health%20and%20Food%20Safety/'>
Committee on the Environment, Public Health and Food Safety
ENVI
</a>
</td>
<td>21/07/2004</td>
<td>14/01/2007</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Women&#39;s%20Rights%20and%20Gender%20Equality/'>
Committee on Women&#39;s Rights and Gender Equality
FEMM
</a>
</td>
<td>21/07/2004</td>
<td>14/01/2007</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Culture%20and%20Education/'>
Committee on Culture and Education
CULT
</a>
</td>
<td>21/07/2004</td>
<td>14/01/2007</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Economic%20and%20Monetary%20Affairs/'>
Committee on Economic and Monetary Affairs
ECON
</a>
</td>
<td>17/01/2002</td>
<td>19/07/2004</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Party%20of%20European%20Socialists/'>
Group of the Party of European Socialists
PSE
</a>
</td>
<td>17/02/2000</td>
<td>19/07/2004</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td></td>
<td>
<a href='/legislature/representative/country/United%20Kingdom/'>
United Kingdom
GB
</a>
</td>
<td>17/02/2000</td>
<td>19/07/2004</td>
<td>Labour Party</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20EU-Cyprus%20Joint%20Parliamentary%20Committee/'>
Delegation to the EU-Cyprus Joint Parliamentary Committee
</a>
</td>
<td>07/02/2002</td>
<td>30/04/2004</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20EU-Malta%20Joint%20Parliamentary%20Committee/'>
Delegation to the EU-Malta Joint Parliamentary Committee
</a>
</td>
<td>07/02/2002</td>
<td>30/04/2004</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Substitute</td>
<td>
<a href='/legislature/representative/committee/European%20Parliament/Committee%20on%20Employment%20and%20Social%20Affairs/'>
Committee on Employment and Social Affairs
EMPL
</a>
</td>
<td>01/03/2000</td>
<td>14/01/2002</td>
<td>European Parliament</td>
</tr>
<tr class='mandate'>
<td>Member</td>
<td>
<a href='/legislature/representative/delegation/European%20Parliament/Delegation%20to%20the%20EU-Cyprus%20Joint%20Parliamentary%20Committee/'>
Delegation to the EU-Cyprus Joint Parliamentary Committee
</a>
</td>
<td>11/04/2000</td>
<td>14/01/2002</td>
<td>European Parliament</td>
</tr>
</table>
<div class='positions'>
<h2>Public positions</h2>
<table class='table table-condensed'>
<tr class='position'>
<td>24/11/2010</td>
<td>
<a href='/positions/position/2/'>
first-validated
</a>
</td>
<td>
<span class='label label-default'>
acta
</span>
<span class='label label-default'>
bar
</span>
</td>
<td>
<a href='http://example.com/first-validated'>
http://example.com/first-validated
</a>
</td>
</tr>
<tr class='position'>
<td>24/11/2010</td>
<td>
<a href='/positions/position/3/'>
other-validated
</a>
</td>
<td>
<span class='label label-default'>
acta
</span>
</td>
<td>
<a href='http://example.com/second-validated'>
http://example.com/second-validated
</a>
</td>
</tr>
<th>Score</th>
<td>
<span class="label label-danger">-7</span>
</td>
<h2 id='votes'>Votes</h2>
<table class='table table-condensed votes'>
<tr>
<th>Title</th>
<th>Date</th>
<th class='icon-cell'>
Memopol recommendation
</th>
<th class='icon-cell'>
Representative vote
</th>
<th class='icon-cell'>
Score
</th>
</tr>
<tr>
<td>Stop acta !</td>
<td class='date-cell'>Nov.24,2010</td>
<td class='icon-cell'>
<i aria-label="for" class="fa fa-thumbs-up vote_positive" title="for" ></i>
</td>
<td class='icon-cell'>
<i aria-label="against" class="fa fa-thumbs-down vote_negative" title="against" ></i>
</td>
<td class='icon-cell'>
<span class="label label-danger">-6</span>
</td>
</tr>
<tr>
<td>Stop acta !</td>
<td class='date-cell'>Nov.24,2010</td>
<td class='icon-cell'>
<i aria-label="for" class="fa fa-thumbs-up vote_positive" title="for" ></i>
</td>
<td class='icon-cell'>
<i aria-label="against" class="fa fa-thumbs-down vote_negative" title="against" ></i>
</td>
<td class='icon-cell'>
<span class="label label-danger">-5</span>
</td>
</tr>
<tr>
<td>Stop acta !</td>
<td class='date-cell'>Nov.24,2010</td>
<td class='icon-cell'>
<i aria-label="for" class="fa fa-thumbs-up vote_positive" title="for" ></i>
</td>
<td class='icon-cell'>
<i aria-label="for" class="fa fa-thumbs-up vote_positive" title="for" ></i>
</td>
<td class='icon-cell'>
<span class="label label-success">4</span>
</td>
</tr>
</table>
import re
import os.path
from django.test import Client
class UrlGetTestMixin(object):
url = None
def setUp(self):
self.client = Client()
if not hasattr(type(self), 'response'):
# Do it once and for all, note that this also caches content types
# so the contenttype query used by taggit won't be counted in
# test_num_queries.
self.__class__.response = self.client.get(self.url)
self.response = self.__class__.response
def assertHtmlInResult(self, expected):
compare = re.sub('[\s"\']', '', expected)
result = re.sub('[\s"\']', '', self.response.content)
self.assertIn(compare, result)
def assertExpectedHtmlInResult(self):
"""
For test_votes_display, it is:
/positions/tests/test_representatives_detail_test_votes_display_expected.html
"""
expected = os.path.join(
os.path.dirname(__file__),
type(self).__name__,
'%s.html' % self._testMethodName
)
with open(expected, 'r') as f:
self.assertHtmlInResult(f.read())
<!DOCTYPE html>
<html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/png" href="/static/collected/img/favicon.ico" />
<!-- Set the viewport width to device width for mobile -->
<meta name="viewport" content="width=device-width" />
<title>
Home
- The Political Memory of </title>
<link rel="stylesheet" href="/static/collected/libs/bootstrap/dist/css/bootstrap.min.css" type="text/css" /><link rel="stylesheet" href="/static/collected/libs/fontawesome/css/font-awesome.min.css" type="text/css" /><link rel="stylesheet" href="/static/collected/libs/flag-icon-css/css/flag-icon.min.css" type="text/css" /><link rel="stylesheet" href="/static/collected/CACHE/css/base.3c5ffeab3cbf.css" type="text/css" />
<script type="text/javascript" src="/static/collected/libs/jquery/dist/jquery.js"></script>
<script type="text/javascript" src="/static/collected/libs/bootstrap/dist/js/bootstrap.js"></script>
</head>
<body >
<!-- -load memopol_tags cache -->
<div id='header' class='container-fluid'>
<a id='logo' href='/'>
<img src='/static/collected/images/logo.png' />
</a>
<h1>
<a id='header_banner' href='/'>
Political Memory
</a>
</h1>
<p class='organization'>
</p>
</div>
<div id='nav' class='container-fluid'>
<ul class='nav'>
<li>
<a href='/legislature/representative/'>
Representatives
</a>
</li>
<li>
<a href='/legislature/groups/country/'>
Countries
</a>
</li>
<li>
<a href='/legislature/groups/chamber/'>
Chambers
</a>
</li>
<li>
<a href='/legislature/groups/group/'>
Parties
</a>
</li>
<li>
<a href='/legislature/groups/delegation/'>
Delegations
</a>
</li>
<li>
<a href='/legislature/groups/committee/'>
Committees
</a>
</li>
<li>
<a href='/votes/dossier/'>
Dossiers
</a>
</li>
</ul>
</div>
<div class="container-fluid main-container">
<form action='' method='get'>
<label for='search'>
Search
</label>
<input id='search' type='text' name='search' />
<input type='submit' value='Go' />
</form>
<a href='?csv'>
Download data as CSV
</a>
<div class='pagination-block'>
<nav>
<ul class='pagination pagination-sm'>
<li class='active'>
<a href=''>
1
</a>
</li>
<li>
<a href='?&page=2'>
2
</a>
</li>
<li>
<a href='?&page=3'>
3
</a>
</li>
<li>
<a aria-label='Next' href='?&page=2'>
<i aria-hidden="true" class="fa fa-chevron-right"></i>
</a>
</li>
<li>
<a aria-label='Last' href='?&page=3'>
<i aria-hidden="true" class="fa fa-chevron-circle-right"></i>
</a>
</li>
</ul>
</nav>
<div class='count'>
Number of results : 36
<br />
Number of displayed results :
12
(
<a href='?paginate_by=12'>
12
</a>
/
<a href='?paginate_by=24'>
24
</a>
/
<a href='?paginate_by=48'>
48
</a>
/
<a href='?paginate_by=96'>
96
</a>
)
<span class='grid-list-selector'>
<a href='?display=grid'>
<i class="fa fa-th"></i>
</a>
<a href='?display=list'>
<i class="fa fa-th-list"></i>
</a>
</span>
</div>
</div>
<table class='table'>
<tr>
<th>
Photo
</th>
<th>
Name
</th>
<th>
Chamber
</th>
<th>
Country
</th>
<th>
Group
</th>
<th>
Score
</th>
</tr>
<tr>
<td>
<a href='/legislature/representative/zigmantas-balcytis/'>
<img src='http://www.europarl.europa.eu/mepphoto/96680.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/zigmantas-balcytis/'>
Zigmantas BALČYTIS
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Lithuania/'>
Lithuania [LT]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Progressive%20Alliance%20of%20Socialists%20and%20Democrats%20in%20the%20European%20Parliament/'>
<span class="group-icon group-icon-sd"></span> SD
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/vilija-blinkeviciute/'>
<img src='http://www.europarl.europa.eu/mepphoto/96681.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/vilija-blinkeviciute/'>
Vilija BLINKEVIČIŪTĖ
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Lithuania/'>
Lithuania [LT]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Progressive%20Alliance%20of%20Socialists%20and%20Democrats%20in%20the%20European%20Parliament/'>
<span class="group-icon group-icon-sd"></span> SD
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/elmar-brok/'>
<img src='http://www.europarl.europa.eu/mepphoto/1263.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/elmar-brok/'>
Elmar BROK
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Germany/'>
Germany [DE]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20European%20People&#39;s%20Party%20(Christian%20Democrats)/'>
<span class="group-icon group-icon-epp"></span> EPP
</a>
</td>
<td>
<span class="label label-danger">-10</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/cristian-silviu-busoi/'>
<img src='http://www.europarl.europa.eu/mepphoto/38420.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/cristian-silviu-busoi/'>
Cristian-Silviu BUŞOI
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Romania/'>
Romania [RO]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20European%20People&#39;s%20Party%20(Christian%20Democrats)/'>
<span class="group-icon group-icon-epp"></span> EPP
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/david-casa/'>
<img src='http://www.europarl.europa.eu/mepphoto/28122.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/david-casa/'>
David CASA
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Malta/'>
Malta [MT]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20European%20People&#39;s%20Party%20(Christian%20Democrats)/'>
<span class="group-icon group-icon-epp"></span> EPP
</a>
</td>
<td>
<span class="label label-danger">-15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/jean-marie-cavada/'>
<img src='http://www.europarl.europa.eu/mepphoto/28206.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/jean-marie-cavada/'>
Jean-Marie CAVADA
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/France/'>
France [FR]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Alliance%20of%20Liberals%20and%20Democrats%20for%20Europe/'>
<span class="group-icon group-icon-alde"></span> ALDE
</a>
</td>
<td>
<span class="label label-danger">-15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/nikolaos-chountis/'>
<img src='http://www.europarl.europa.eu/mepphoto/26851.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/nikolaos-chountis/'>
Nikolaos CHOUNTIS
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Greece/'>
Greece [GR]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Confederal%20Group%20of%20the%20European%20United%20Left%20-%20Nordic%20Green%20Left/'>
<span class="group-icon group-icon-guengl"></span> GUE/NGL
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/michael-cramer/'>
<img src='http://www.europarl.europa.eu/mepphoto/28238.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/michael-cramer/'>
Michael CRAMER
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Germany/'>
Germany [DE]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Greens/European%20Free%20Alliance/'>
<span class="group-icon group-icon-greensefa"></span> Greens/EFA
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/michel-dantin/'>
<img src='http://www.europarl.europa.eu/mepphoto/97296.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/michel-dantin/'>
Michel DANTIN
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/France/'>
France [FR]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20European%20People&#39;s%20Party%20(Christian%20Democrats)/'>
<span class="group-icon group-icon-epp"></span> EPP
</a>
</td>
<td>
<span class="label label-danger">-15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/tamas-deutsch/'>
<img src='http://www.europarl.europa.eu/mepphoto/96826.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/tamas-deutsch/'>
Tamás DEUTSCH
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Hungary/'>
Hungary [HU]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20European%20People&#39;s%20Party%20(Christian%20Democrats)/'>
<span class="group-icon group-icon-epp"></span> EPP
</a>
</td>
<td>
<span class="label label-danger">-15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/viorica-dancila/'>
<img src='http://www.europarl.europa.eu/mepphoto/95281.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/viorica-dancila/'>
Viorica DĂNCILĂ
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Romania/'>
Romania [RO]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Progressive%20Alliance%20of%20Socialists%20and%20Democrats%20in%20the%20European%20Parliament/'>
<span class="group-icon group-icon-sd"></span> SD
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
<tr>
<td>
<a href='/legislature/representative/bas-eickhout/'>
<img src='http://www.europarl.europa.eu/mepphoto/96725.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/bas-eickhout/'>
Bas EICKHOUT
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/Netherlands/'>
Netherlands [NL]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Greens/European%20Free%20Alliance/'>
<span class="group-icon group-icon-greensefa"></span> Greens/EFA
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
</table>
<div class='pagination-block'>
<nav>
<ul class='pagination pagination-sm'>
<li class='active'>
<a href=''>
1
</a>
</li>
<li>
<a href='?&page=2'>
2
</a>
</li>
<li>
<a href='?&page=3'>
3
</a>
</li>
<li>
<a aria-label='Next' href='?&page=2'>
<i aria-hidden="true" class="fa fa-chevron-right"></i>
</a>
</li>
<li>
<a aria-label='Last' href='?&page=3'>
<i aria-hidden="true" class="fa fa-chevron-circle-right"></i>
</a>
</li>
</ul>
</nav>
<div class='count'>
Number of results : 36
<br />
Number of displayed results :
12
(
<a href='?paginate_by=12'>
12
</a>
/
<a href='?paginate_by=24'>
24
</a>
/
<a href='?paginate_by=48'>
48
</a>
/
<a href='?paginate_by=96'>
96
</a>
)
<span class='grid-list-selector'>
<a href='?display=grid'>
<i class="fa fa-th"></i>
</a>
<a href='?display=list'>
<i class="fa fa-th-list"></i>
</a>
</span>
</div>
</div>
</div>
<div id='footer' class='container-fluid'>
Memopol is free software
<a href="https://github.com/political-memory/political_memory">released</a>
under the terms of the
<a href="http://www.gnu.org/licenses/agpl.html">GNU aGPLV3+</a>
<a href='https://github.com/political-memory/political_memory/issues'>
Bug tracking system
</a>
<a href='https://github.com/political-memory/political_memory/issues/new'>
Report a bug
</a>
<br />
Provided by <a href="http://www.laquadrature.net/">La Quadrature du Net</a>
</div>
</body>
</html>
<!DOCTYPE html>
<html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/png" href="/static/collected/img/favicon.ico" />
<!-- Set the viewport width to device width for mobile -->
<meta name="viewport" content="width=device-width" />
<title>
Home
- The Political Memory of </title>
<link rel="stylesheet" href="/static/collected/libs/bootstrap/dist/css/bootstrap.min.css" type="text/css" /><link rel="stylesheet" href="/static/collected/libs/fontawesome/css/font-awesome.min.css" type="text/css" /><link rel="stylesheet" href="/static/collected/libs/flag-icon-css/css/flag-icon.min.css" type="text/css" /><link rel="stylesheet" href="/static/collected/CACHE/css/base.3c5ffeab3cbf.css" type="text/css" />
<script type="text/javascript" src="/static/collected/libs/jquery/dist/jquery.js"></script>
<script type="text/javascript" src="/static/collected/libs/bootstrap/dist/js/bootstrap.js"></script>
</head>
<body >
<!-- -load memopol_tags cache -->
<div id='header' class='container-fluid'>
<a id='logo' href='/'>
<img src='/static/collected/images/logo.png' />
</a>
<h1>
<a id='header_banner' href='/'>
Political Memory
</a>
</h1>
<p class='organization'>
</p>
</div>
<div id='nav' class='container-fluid'>
<ul class='nav'>
<li>
<a href='/legislature/representative/'>
Representatives
</a>
</li>
<li>
<a href='/legislature/groups/country/'>
Countries
</a>
</li>
<li>
<a href='/legislature/groups/chamber/'>
Chambers
</a>
</li>
<li>
<a href='/legislature/groups/group/'>
Parties
</a>
</li>
<li>
<a href='/legislature/groups/delegation/'>
Delegations
</a>
</li>
<li>
<a href='/legislature/groups/committee/'>
Committees
</a>
</li>
<li>
<a href='/votes/dossier/'>
Dossiers
</a>
</li>
</ul>
</div>
<div class="container-fluid main-container">
<form action='' method='get'>
<label for='search'>
Search
</label>
<input id='search' type='text' name='search' />
<input type='submit' value='Go' />
</form>
<a href='?search=joly&csv'>
Download data as CSV
</a>
<div class='pagination-block'>
<nav>
<ul class='pagination pagination-sm'>
</ul>
</nav>
<div class='count'>
Number of results : 1
<br />
Number of displayed results :
12
(
<a href='?paginate_by=12'>
12
</a>
/
<a href='?paginate_by=24'>
24
</a>
/
<a href='?paginate_by=48'>
48
</a>
/
<a href='?paginate_by=96'>
96
</a>
)
<span class='grid-list-selector'>
<a href='?display=grid'>
<i class="fa fa-th"></i>
</a>
<a href='?display=list'>
<i class="fa fa-th-list"></i>
</a>
</span>
</div>
</div>
<table class='table'>
<tr>
<th>
Photo
</th>
<th>
Name
</th>
<th>
Chamber
</th>
<th>
Country
</th>
<th>
Group
</th>
<th>
Score
</th>
</tr>
<tr>
<td>
<a href='/legislature/representative/eva-joly/'>
<img src='http://www.europarl.europa.eu/mepphoto/96883.jpg' width='80' />
</a>
</td>
<td>
<a href='/legislature/representative/eva-joly/'>
Eva JOLY
</a>
</td>
<td>
<a href='/legislature/representative/chamber/European%20Parliament/'>
European Parliament [EP]
</a>
</td>
<td>
<a href='/legislature/representative/country/France/'>
France [FR]
</a>
</td>
<td>
<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Greens/European%20Free%20Alliance/'>
<span class="group-icon group-icon-greensefa"></span> Greens/EFA
</a>
</td>
<td>
<span class="label label-success">15</span>
</td>
</tr>
</table>
<div class='pagination-block'>
<nav>
<ul class='pagination pagination-sm'>
</ul>
</nav>
<div class='count'>
Number of results : 1
<br />
Number of displayed results :
12
(
<a href='?paginate_by=12'>
12
</a>
/
<a href='?paginate_by=24'>
24
</a>
/
<a href='?paginate_by=48'>
48
</a>
/
<a href='?paginate_by=96'>
96
</a>
)
<span class='grid-list-selector'>
<a href='?display=grid'>
<i class="fa fa-th"></i>
</a>
<a href='?display=list'>
<i class="fa fa-th-list"></i>
</a>
</span>
</div>
</div>
</div>
<div id='footer' class='container-fluid'>
Memopol is free software
<a href="https://github.com/political-memory/political_memory">released</a>
under the terms of the
<a href="http://www.gnu.org/licenses/agpl.html">GNU aGPLV3+</a>
<a href='https://github.com/political-memory/political_memory/issues'>
Bug tracking system
</a>
<a href='https://github.com/political-memory/political_memory/issues/new'>
Report a bug
</a>
<br />
Provided by <a href="http://www.laquadrature.net/">La Quadrature du Net</a>
</div>
</body>
</html>
# -*- coding: utf8 -*-
from django.test import TestCase
from .base import UrlGetTestMixin
class RepresentativeDetailTest(UrlGetTestMixin, TestCase):
fixtures = ['one_representative']
url = '/legislature/representative/mary-honeyball/'
def test_num_queries(self):
# Ensure one-time cached queries occur before the actual test
self.client.get(self.url)
with self.assertNumQueries(10):
"""
- One query for the rep details and foreign key (profile)
- One query for reverse relation on phones
- One query for reverse relation on addresses
- One query for reverse relation on emails
- Two queries for reverse relation on websites (social and other)
- One query for reverse relation on votes
- One query for reverse relation on mandates
- One query for reverse relation positions
- One query for reverse relation tags on positions
"""
self.client.get(self.url)
def test_name_display(self):
# When HAMLPY_ATTR_WRAPPER works, use double quotes in HTML attrs !
self.assertHtmlInResult("<h1 class='name'>Mary HONEYBALL</h1>")
def test_score_display(self):
self.assertExpectedHtmlInResult()
def test_country_display(self):
self.assertHtmlInResult(
'<span class="flag-icon flag-icon-gb"></span> United Kingdom')
def test_current_mandate_display(self):
expected = ''.join((
"<a href='/legislature/representative/group/European%20Parliament/Group%20of%20the%20Progressive%20Alliance%20of%20Socialists%20and%20Democrats%20in%20the%20European%20Parliament/'>", # noqa
"<span class='group-icon group-icon-sd'></span>",
"Member of Group of the Progressive Alliance of Socialists and Democrats in the European Parliament", # noqa
"</a>",
))
self.assertHtmlInResult(expected)
def test_biography_display(self):
self.assertHtmlInResult('Born in Weymouth the 12/11/1952 (F)')
def test_votes_display(self):
self.assertExpectedHtmlInResult()
def test_mandates_display(self):
self.assertExpectedHtmlInResult()
def test_positions_display(self):
self.assertExpectedHtmlInResult()
# -*- coding: utf8 -*-
from django.test import TestCase
from responsediff.response import Response
from .base import UrlGetTestMixin
class RepresentativeListTest(UrlGetTestMixin, TestCase):
fixtures = ['smaller_sample.json']
url = '/legislature/representative/'
def functional_test(self, page, paginate_by, display, search=''):
url = '%s?page=%s&search=%s' % (self.url, page, search)
# Cancel out one-time queries (session)
self.client.get('%s&paginate_by=%s&display=%s' %
(url, paginate_by, display))
with self.assertNumQueries(3):
"""
- A count for pagination
- One query for representative + score
- One query for mandates (including country + main_mandate)
"""
self.response = self.client.get(url)
expected = Response.for_test(self)
expected.assertNoDiff(self.response)
def test_page1_paginateby12_displaylist(self):
self.functional_test(1, 12, 'list')
def test_page1_paginateby24_displaygrid(self):
self.functional_test(1, 24, 'grid')
def test_page2_paginateby24_displaylist(self):
self.functional_test(2, 24, 'list')
def test_page1_paginateby12_displaylist_searchjoly(self):
self.functional_test(1, 12, 'list', 'joly')
def test_page2_paginateby12_displaylist(self):
self.functional_test(2, 12, 'list')
# coding: utf-8
from django.conf.urls import include, url
from django.contrib import admin
from django.views import generic
import views
import api
admin.autodiscover()
urlpatterns = [
# Project-specific overrides
url(
r'^legislature/representative/(?P<group_kind>\w+)/(?P<chamber>.+)/' +
r'(?P<group>.+)/$',
views.RepresentativeList.as_view(),
),
url(
r'^legislature/representative/(?P<group_kind>\w+)/(?P<group>.+)/$',
views.RepresentativeList.as_view(),
),
url(
r'^legislature/representative/(?P<slug>[-\w]+)/$',
views.RepresentativeDetail.as_view(),
),
url(
r'^legislature/representative/$',
views.RepresentativeList.as_view(),
),
url(
r'^votes/dossier/$',
views.DossierList.as_view(),
),
url(r'^admin/', include(admin.site.urls)),
url(r'^legislature/', include('representatives.urls',
namespace='representatives')),
url(r'^votes/', include('representatives_votes.urls',
namespace='representatives_votes')),
url(r'^positions/', include('representatives_positions.urls',
namespace='representatives_positions')),
url(r'^api/', include(api.router.urls)),
url(r'^$', generic.TemplateView.as_view(template_name='home.html')),
]
# Project specific "glue" coupling of all apps
from django.db import models
from django.db.models import Count
from core.views import GridListMixin, PaginationMixin, CSVDownloadMixin
from representatives import views as representatives_views
from representatives.models import (Representative, Address, Phone, WebSite)
from representatives_votes import views as representatives_votes_views
from representatives_votes.models import Dossier, Proposal
from representatives_positions.forms import PositionForm
from representatives_recommendations.models import VoteScore
class RepresentativeList(
CSVDownloadMixin,
GridListMixin,
PaginationMixin,
representatives_views.RepresentativeList
):
csv_name = 'meps.csv'
def get_csv_results(self, context, **kwargs):
qs = super(RepresentativeList, self).get_queryset()
qs = qs.prefetch_related('email_set')
return [self.add_representative_country_and_main_mandate(r)
for r in qs]
def get_csv_row(self, obj):
return (
obj.full_name,
u', '.join([e.email for e in obj.email_set.all()]),
obj.main_mandate.group.abbreviation,
obj.country,
)
queryset = Representative.objects.filter(
active=True).select_related('score')
class RepresentativeDetail(representatives_views.RepresentativeDetail):
queryset = Representative.objects.select_related('score')
def get_queryset(self):
social = ['twitter', 'facebook']
qs = super(RepresentativeDetail, self).get_queryset().prefetch_related(
'email_set',
models.Prefetch(
'website_set',
queryset=WebSite.objects.filter(kind__in=social),
to_attr='social_websites'
),
models.Prefetch(
'website_set',
queryset=WebSite.objects.exclude(kind__in=social),
to_attr='other_websites'
),
models.Prefetch(
'address_set',
queryset=Address.objects.select_related('country')
),
models.Prefetch(
'phone_set',
queryset=Phone.objects.select_related('address__country')
),
models.Prefetch(
'votes',
queryset=VoteScore.objects.filter(
proposal__in=Proposal.objects.exclude(recommendation=None),
).select_related('proposal__recommendation').order_by(
'-proposal__datetime')
)
)
return qs
def get_context_data(self, **kwargs):
c = super(RepresentativeDetail, self).get_context_data(**kwargs)
c['position_form'] = PositionForm(
initial={'representative': self.object.pk})
self.add_representative_country_and_main_mandate(c['object'])
return c
class DossierList(PaginationMixin, representatives_votes_views.DossierList):
queryset = Dossier.objects.prefetch_related(
'proposals',
'proposals__recommendation'
).annotate(
nb_recomm=Count('proposals__recommendation')
).order_by('-nb_recomm', '-reference')
[pytest]
DJANGO_SETTINGS_MODULE=memopol.settings
addopts = --cov=. --create-db
addopts = --cov-config .coveragerc --cov=src --create-db