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
Sélectionner une révision Git

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
Sélectionner une révision Git
Afficher les modifications
Affichage de
avec 168 ajouts et 410 suppressions
- load bootstrap3
%form{:action => '{% url "representatives_positions:position-create" %}',
:method => 'post'}
- csrf_token
- bootstrap_form form
- buttons
%button{'type': 'submit', 'class': 'btn btn-primary'}
{% bootstrap_icon "star" %} Submit
- endbuttons
- extends 'base.html'
- load humanize
- block content
- include 'representatives/_representative_block.html' with representative=object.representative
.quote
%p.quote-header
{{object.datetime|naturalday}}, {{object.representative.full_name}} declared :
.long-quote
= object.text|linebreaks
%p.tags
- for tag in object.tags.all
%span.label.label-default
= tag
%p
Source :
%a{:href => '{{object.link}}'}
= object.link
- extends 'base.html'
- block head
{{ form.media }}
- block content
- include 'representatives_positions/_form.html'
import datetime
import copy
from django.core.urlresolvers import reverse
from django.test import TestCase, Client
from representatives.models import Representative
from representatives_positions.models import Position
class PositionTest(TestCase):
fixtures = ['one_representative']
def setUp(self):
self.client = Client()
self.tags = [u'foo', u'bar']
self.create_url = reverse('representatives_positions:position-create')
self.mep = Representative.objects.get(pk=160)
self.fixture = {
'tags': ','.join(self.tags),
'datetime': '2015-12-11',
'text': '%stext' % self.id(),
'link': 'http://example.com/%slink' % self.id(),
'representative': self.mep.pk,
}
def test_create_position(self):
response = self.client.post(self.create_url, self.fixture)
assert response.status_code == 302
expected = 'http://testserver%s' % self.mep.get_absolute_url()
assert response['Location'] == expected
result = Position.objects.get(text='%stext' % self.id())
assert list(result.tags.values_list('name', flat=True)) == self.tags
assert result.datetime == datetime.date(2015, 12, 11)
assert result.link == self.fixture['link']
assert result.representative.pk == self.mep.pk
assert result.published is False
def test_position_publishing(self):
response = self.client.post(self.create_url, self.fixture)
assert response.status_code == 302
position = Position.objects.get(text='%stext' % self.id())
get_response = self.client.get(position.get_absolute_url())
assert get_response.status_code == 404
position.published = True
position.save()
get_response = self.client.get(position.get_absolute_url())
assert get_response.status_code == 200
def test_create_position_without_field(self):
for key in self.fixture.keys():
fixture = copy.copy(self.fixture)
fixture.pop(key)
response = self.client.post(self.create_url, fixture)
assert response.context['form'].is_valid() is False, \
'Could submit form without %s' % key
def test_position_detail(self):
position = Position.objects.create(
published=True,
datetime=self.fixture['datetime'],
text=self.fixture['text'],
link=self.fixture['link'],
representative=self.mep
)
position.tags.add('%stag' % self.id())
# Trigger irrelevant queries that happen only once ie. constance before
# testing actual page queries.
self.client.get(position.get_absolute_url())
with self.assertNumQueries(4):
# One for position and rep and score
# One for rep mandates
# One for rep chamber
# One for position tags
response = self.client.get(position.get_absolute_url())
assert 'Dec. 11, 2015' in response.content
assert '%stag' % self.id() in response.content
assert self.fixture['link'] in response.content
assert self.fixture['text'] in response.content
assert self.mep.full_name in response.content
from django.conf.urls import url
import views
urlpatterns = [
url(
r'^position/create/$',
views.PositionCreate.as_view(),
name='position-create'
),
url(
r'^position/(?P<pk>\d+)/$',
views.PositionDetail.as_view(),
name='position-detail'
),
]
from django.views import generic
from django.db import models
from representatives.views import RepresentativeViewMixin
from representatives.models import Mandate
from .models import Position
from .forms import PositionForm
class PositionCreate(generic.CreateView):
model = Position
form_class = PositionForm
def get_success_url(self):
return self.object.representative.get_absolute_url()
class PositionDetail(RepresentativeViewMixin, generic.DetailView):
queryset = Position.objects.filter(published=True).select_related(
'representative__score')
def get_queryset(self):
qs = super(PositionDetail, self).get_queryset()
qs = qs.prefetch_related(models.Prefetch(
'representative__mandates',
Mandate.objects.select_related('constituency__country', 'group')
))
return qs
def get_object(self):
obj = super(PositionDetail, self).get_object()
self.add_representative_country_and_main_mandate(obj.representative)
return obj
# coding: utf-8
# flake8: noqa
dossier_mappings = {
"Resolution on Anti-Counterfeiting Trade Agreement (ACTA)":
"Resolution on the Anti-Counterfeiting Trade Agreement (ACTA)",
"Rapport Bono on cultural industries in Europe":
"Cultural industries in Europe",
"Rapport Gallo on enforcement of intellectual property rights in the internal market":
"Enforcement of intellectual property rights in the internal market",
"Rapport Lambrinidis on strengthening security and fundamental freedoms on the Internet":
"Strengthening security and fundamental freedoms on the Internet",
"Criminal measures aimed at ensuring the enforcement of intellectual property rights (IPRED 2), 1st reading":
"Criminal measures aimed at ensuring the enforcement of intellectual property rights"
}
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('representatives_recommendations', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='DossierScore',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('score', models.IntegerField(default=0)),
],
options={
'db_table': 'representatives_recommendations_dossierscores',
'managed': False,
},
),
migrations.RunSQL(
"""
CREATE VIEW "representatives_recommendations_dossierscores"
AS SELECT
"representatives_votes_vote"."representative_id" || ':' || "representatives_votes_proposal"."dossier_id" AS "id",
"representatives_votes_vote"."representative_id",
"representatives_votes_proposal"."dossier_id",
SUM(CASE WHEN "representatives_votes_vote"."position" = ("representatives_recommendations_recommendation"."recommendation")
THEN "representatives_recommendations_recommendation"."weight"
ELSE (0 - "representatives_recommendations_recommendation"."weight")
END) AS "score"
FROM "representatives_votes_vote"
INNER JOIN "representatives_votes_proposal"
ON ( "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" )
LEFT OUTER JOIN "representatives_recommendations_recommendation"
ON ( "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" )
WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL
GROUP BY
"representatives_votes_vote"."representative_id",
"representatives_votes_proposal"."dossier_id"
"""
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('representatives_recommendations', '0002_dossierscore'),
]
operations = [
migrations.CreateModel(
name='VoteScore',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('position', models.CharField(max_length=10)),
('score', models.IntegerField(default=0)),
],
options={
'ordering': ['proposal__datetime'],
'db_table': 'representatives_recommendations_votescores',
'managed': False,
},
),
migrations.DeleteModel(
name='ScoredVote',
),
migrations.RunSQL(
"""
CREATE VIEW "representatives_recommendations_votescores"
AS SELECT
"representatives_votes_vote"."id",
"representatives_votes_vote"."position",
"representatives_votes_vote"."proposal_id",
"representatives_votes_vote"."representative_id",
CASE WHEN "representatives_votes_vote"."position" = ("representatives_recommendations_recommendation"."recommendation")
THEN "representatives_recommendations_recommendation"."weight"
ELSE (0 - "representatives_recommendations_recommendation"."weight")
END AS "score"
FROM "representatives_votes_vote"
INNER JOIN "representatives_votes_proposal"
ON ( "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" )
LEFT OUTER JOIN "representatives_recommendations_recommendation"
ON ( "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" )
WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL
"""
)
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('representatives_recommendations', '0003_votescore'),
]
operations = [
migrations.RunSQL(
"""
DROP VIEW "representatives_recommendations_dossierscores"
"""
),
migrations.RunSQL(
"""
CREATE VIEW "representatives_recommendations_dossierscores"
AS SELECT
"representatives_recommendations_votescores"."representative_id" || ':' || "representatives_votes_proposal"."dossier_id" AS "id",
"representatives_recommendations_votescores"."representative_id",
"representatives_votes_proposal"."dossier_id",
SUM("representatives_recommendations_votescores"."score") AS "score"
FROM "representatives_recommendations_votescores"
INNER JOIN "representatives_votes_proposal"
ON ( "representatives_recommendations_votescores"."proposal_id" = "representatives_votes_proposal"."id" )
GROUP BY
"representatives_recommendations_votescores"."representative_id",
"representatives_votes_proposal"."dossier_id"
"""
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('representatives_recommendations', '0004_dossierscore_rewrite'),
]
operations = [
migrations.AlterModelOptions(
name='representativescore',
options={
'managed': False,
'db_table': 'representatives_recommendations_representativescore',
},
),
migrations.RunSQL(
"""
DROP TABLE "representatives_recommendations_representativescore"
"""
),
migrations.RunSQL(
"""
CREATE VIEW "representatives_recommendations_representativescore"
AS SELECT
"representatives_representative"."id" as "representative_id",
COALESCE(SUM("representatives_recommendations_votescores"."score"), 0) AS "score"
FROM
"representatives_representative"
LEFT OUTER JOIN "representatives_recommendations_votescores"
ON "representatives_recommendations_votescores"."representative_id" = "representatives_representative"."id"
GROUP BY "representatives_representative"."id"
"""
)
]
# coding: utf-8
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def score_label(score):
if score > 0:
return mark_safe(
'<span class="label label-success">{}</span>'.format(score))
elif score < 0:
return mark_safe(
'<span class="label label-danger">{}</span>'.format(score))
else:
return mark_safe(
'<span class="label label-default">{}</span>'.format(score))
from setuptools import setup from setuptools import setup, find_packages
setup(name='political-memory', setup(name='memopol',
version='0.0.1', version='0.0.2',
description='OpenShift App', description='Memopol Project',
packages=['political_memory'], packages=find_packages('src'),
package_dir={'political_memory': '.'}, package_dir={'': 'src'},
include_package_data=True,
zip_safe=False,
author='James Pic, Laurent Peuch, Arnaud Fabre, Nicolas Joyard', author='James Pic, Laurent Peuch, Arnaud Fabre, Nicolas Joyard',
author_email='cortex@worlddomination.be', author_email='cortex@worlddomination.be',
url='http://github.com/political-memory/political_memory/', url='https://git.laquadrature.net/memopol/memopol',
install_requires=[ install_requires=[
'django-autocomplete-light>=3.0,<4.0', 'django-autocomplete-light==3.2.0',
'django-bootstrap3>=6.2,<6.3', 'django-autoslug>=1.9,<1.10',
'django-bootstrap3>=6,<7',
'django-coffeescript>=0.7,<0.8', 'django-coffeescript>=0.7,<0.8',
'django-compressor>=1.6,<1.7', 'django-compressor>=1,<2',
'django-datetime-widget>=0.9,<1.0', 'django-datetime-widget>=0.9,<1.0',
'django-filter>=0.11,<0.12', 'django-filter>=0.15,<0.16',
'django-representatives-votes==0.0.15', 'django-fontawesome>=0.2,<0.3',
'django-representatives==0.0.21', 'django-rql-filter>=0.1.3,<0.2',
'django-taggit>=0.17,<0.18', 'django-taggit>=0.17,<0.18',
'django>=1.8,<1.9', 'django>=1.8,<1.9',
'djangorestframework>=3.2.0,<3.3.0', 'djangorestframework>=3,<3.5.1',
'hamlpy>=0.82,<0.83', 'hamlpy>=0.82,<0.83',
'ijson>=2.2,<2.3', 'ijson>=2.2,<2.3',
'lesscpy>=0.10.2,<0.11.0',
'python-dateutil>=2.4,<2.5', 'python-dateutil>=2.4,<2.5',
'unicodecsv==0.14.1', 'unicodecsv>=0.14,<0.15',
'pytz==2015.7', 'pytz', # Always use up-to-date TZ data
'django-suit>=0.2.16,<0.3.0', 'django-suit>=0.2,<0.3',
'sqlparse>=0.1', 'psycopg2>=2,<3',
'django-haystack==2.6.0',
'pysolr==3.6.0',
'Whoosh==2.7.4',
'alabaster==0.7.10',
'django-nested-admin==3.0.17',
], ],
extras_require={ extras_require={
# Full version hardcode for testing dependencies so that # Full version hardcode for testing dependencies so that
# tests don't break on master without any obvious reason. # tests don't break on master without any obvious reason.
'testing': [ 'testing': [
'django-responsediff==0.2.0', 'codecov>=2,<3',
'flake8==2.5.1', 'flake8>=2,<3',
'pep8==1.5.7', 'django-responsediff>=0.7,<0.8',
'pytest==2.8.5', 'pep8>=1,<2',
'pytest-django==2.9.1', 'pytest>=2,<3',
'pytest-cov==2.2.0', 'pytest-django>=2,<3',
'codecov', 'pytest-cov>=2,<3',
'mock==2.0.0',
'tox>=2.3,<3',
] ]
}, },
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [
'parltrack_import_representatives = representatives.contrib.parltrack.import_representatives:main', # noqa
'parltrack_import_dossiers = representatives_votes.contrib.parltrack.import_dossiers:main', # noqa
'parltrack_import_votes = representatives_votes.contrib.parltrack.import_votes:main', # noqa
'francedata_import_representatives = representatives.contrib.francedata.import_representatives:main', # noqa
'francedata_import_dossiers = representatives_votes.contrib.francedata.import_dossiers:main', # noqa
'francedata_import_scrutins = representatives_votes.contrib.francedata.import_scrutins:main', # noqa
'francedata_import_votes = representatives_votes.contrib.francedata.import_votes:main', # noqa
'memopol_import_positions = representatives_positions.contrib.import_positions:main', # noqa 'memopol_import_positions = representatives_positions.contrib.import_positions:main', # noqa
'memopol_import_recommendations = representatives_recommendations.contrib.import_recommendations:main', # noqa 'memopol_import_recommendations = representatives_recommendations.contrib.import_recommendations:main', # noqa
'memopol = memopol.manage:main',
] ]
} }
) )
Fichier déplacé
{% block active %}
Display :
{% if active_only %}
current legislature only /
<a href="{queries.urlencode}&active_only=0">
all data
</a>
{% else %}
<a href="{queries.urlencode}&active_only=1">
current legislature only
</a>
/ all data
{% endif %}
{% endblock %}
%span.grid-list-selector %span.grid-list-selector
%a{:href => '?display=grid'} %a{:href => '?={queries.urlencode}&display=grid'}<
<i class="fa fa-th"></i> <i class="fa fa-th"></i>
%a{:href => '?display=list'} %a{:href => '?={queries.urlencode}&display=list'}<
<i class="fa fa-th-list"></i> <i class="fa fa-th-list"></i>
{% block pagination %}
<nav>
<ul class="pagination pagination-sm">
{% if page_obj.has_previous %}
<li>
<a href="{{queries.urlencode}}&page=1" aria-label="First">
<i aria-hidden="true" class="fa fa-chevron-circle-left"></i>
</a>
</li>
<li>
<a href="{queries.urlencode}&page=={page_obj.previous_page_number}" aria-label="Previous">
<i aria-hidden="true" class="fa fa-chevron-left"></i>
</a>
</li>
{% endif %}
{% for p in page_range %}
{% if p %}
{% if p == page_obj.number %}
<li class="active">
<a href=''>
{{ p }}
</a>
</li>
{% else %}
<li>
<a href="{queries.urlencode}&page=={p}">
{{ p }}
</a>
</li>
{% endif %}
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li>
<a href=""{queries.urlencode}&page=={page_obj.next_page_number}" aria-label="Next">
<i aria-hidden="true" class="fa fa-chevron-right"></i>
</a>
</li>
<li>
<a href="{queries.urlencode}&page=={paginator.num_pages}" aria-label="Last">
<i aria-hidden="true" class="fa fa-chevron-circle-right"></i>
</a>
</li>
{% endif %}
</ul>
</nav>
<div class=".count">
{% block count %}
Number of results : {{ paginator.count }}
{% if active_only != None %}
{% include 'core/blocks/active-filter.html' %}
{% endif %}
{% if sort != None %}
{% include 'core/blocks/sorting.html' %}
{% endif %}
{% endblock %}
{% block page-size %}
Number of displayed results :
{{ paginator.per_page }}
(
{% for limit in pagination_limits %}
<a href="{queries.urlencode}&paginate_by={{ limit }}">
{{ limit }}
</a>
{% if not forloop.last %}
/
{% endif %}
{% endfor %}
)
{% if grid_list %}
{% include 'core/blocks/grid-list.html' %}
{% endif %}
{% endblock %}
</div>
{% endblock %}
- if sort.fields|length > 0
.sorting-block
Order by :
- for field, label in sort.fields.items
- if sort.field == field
{{ label }}
- else
%a{'href': '?={queries.urlencode}&sort_by=={field}'}<
{{ label }}
- if not forloop.last
=" | "
&ndash;
- if sort.dir == 'asc'
ascending |
%a{'href': '?={queries.urlencode}&sort_dir=desc'}<
descending
- else
%a{'href': '?={queries.urlencode}&sort_dir=asc'}<
ascending
="| descending"
Fichier déplacé