Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Página de doadores #400

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions brasilio/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
BASE_DIR = root()
DEBUG = env("DEBUG")
PRODUCTION = env("PRODUCTION", bool)
APOIASE_PROJECT_ID = env("APOIASE_PROJECT_ID")
SECRET_KEY = env("SECRET_KEY")
FERNET_KEY = env("FERNET_KEY")

Expand Down Expand Up @@ -168,7 +169,10 @@
"rest_framework.throttling.AnonRateThrottle",
"rest_framework.throttling.UserRateThrottle",
],
"DEFAULT_THROTTLE_RATES": {"anon": THROTTLING_RATE, "user": THROTTLING_RATE,},
"DEFAULT_THROTTLE_RATES": {
"anon": THROTTLING_RATE,
"user": THROTTLING_RATE,
},
}
)

Expand Down Expand Up @@ -238,7 +242,12 @@ def get_neo4j_config_dict(neo4j_uri):
}

# django-rq config
RQ_QUEUES = {"default": {"URL": REDIS_URL, "DEFAULT_TIMEOUT": 500,}}
RQ_QUEUES = {
"default": {
"URL": REDIS_URL,
"DEFAULT_TIMEOUT": 500,
}
}
RQ = {
"DEFAULT_RESULT_TTL": 60 * 60 * 24, # 24-hours
}
Expand All @@ -263,7 +272,9 @@ def get_neo4j_config_dict(neo4j_uri):
# Sentry config
SENTRY_DSN = env("SENTRY_DSN")
sentry_sdk.init(
SENTRY_DSN, integrations=[DjangoIntegration(), RqIntegration()], send_default_pii=True,
SENTRY_DSN,
integrations=[DjangoIntegration(), RqIntegration()],
send_default_pii=True,
)


Expand Down
5 changes: 3 additions & 2 deletions core/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,9 @@ <h5 class="white-text">Links</h5>
<div class="footer-copyright">
<div class="container left">
O Brasil.io é mantido com muito carinho por
<a href="https://twitter.com/turicas">Álvaro Justen</a> e
<a href="{% url 'core:contributors' %}">contribuidores.</a>
<a href="https://twitter.com/turicas">Álvaro Justen</a>,
<a href="{% url 'core:contributors' %}">contribuidores</a>
e graças ao apoio de nossos <a href="{% url 'core:donors' %}">doadores</a>.
</div>
</div>
</footer>
Expand Down
78 changes: 78 additions & 0 deletions core/templates/donors.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
{% extends 'base.html' %}
{% load static %}
{% block title %}Apoiadores - Brasil.IO{% endblock %}
{% load thumbnail %}
{% load endswith %}
{% block head %}
{{ block.super }}
<!-- Infinte scroll -->
<script src="{% static 'js/noframework.waypoints.min.js' %}"></script>
<script src="{% static 'js/infinite.js' %}"></script>
{% endblock %}

{% block content %}
<div class="section">
<h4>Doadores</h4>
<div class="divider"></div>

<div class="row m-t-5">
<p>
A lista abaixo é de pessoas que <i>apoiam nossa campanha</i> pela plataforma <strong>Apoia.se</strong> de
financiamento coletivo.
<a href="https://apoia.se/brasilio" title="Apoie nossa campanha">Colabore você também clicando aqui.</a>
</p>
<div class="row">
<div class="infinite-container col s12">
{% for donor in donors %}
<div class="col s12 m3 m-t-15 infinite-item center" style="min-height: 170px;">
<span class="fa-stack fa-3x text-center">
<!-- Gravatar default logo changed with defaultimageavatar.jpg -->
{% if donor.image|endswith:"?d=mp" %}
<img class="circle responsive-img" src='{% static "img/defaultimgavatar.jpg" %}' width="200px" height="auto" />
{% else %}
{% thumbnail donor.image "170x170" as im %}
<img class="circle responsive-img" src="{{ im.url }}" width="200px" height="auto" />
{% endthumbnail %}
{% endif %}
</span>
<h6> {{ donor.name }} </h6>
</div>
{% endfor %}
</div>
<div class="loading col s12 center" style="display: none;">
<div class="preloader-wrapper big active">
<div class="spinner-layer spinner-blue-only">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
{% if donors.has_next %}
<a class="infinite-more-link" href="?page={{ donors.next_page_number }}"></a>
{% endif %}
</div>
</div>

<script type="text/javascript">
const defaultImg = function () {$(this).attr('src', '{% static "img/defaultimgavatar.jpg" %}')};
var infinite = new Waypoint.Infinite({
element: $('.infinite-container')[0],
offset: 'bottom-in-view',
onBeforePageLoad: function (element) {
$('.loading').show();
},
onAfterPageLoad: function () {
$('.loading').hide();
$('img').on("error", defaultImg)
}
})
</script>
{% endblock %}
10 changes: 10 additions & 0 deletions core/templatetags/endswith.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()


@register.filter(name="endswith")
@stringfilter
def endswith(value, suffix):
return value.endswith(suffix)
1 change: 1 addition & 0 deletions core/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def limited_dataset_detail(request, slug, tablename):
path("manifesto/", views.manifesto, name="manifesto"),
path("colabore/", views.collaborate, name="collaborate"),
path("doe/", views.donate, name="donate"),
path("apoiadores/", views.donors, name="donors"),
path("contribuidores/", views.contributors, name="contributors"),
# Dataset-specific pages (specials)
path("especiais/", views_special.index, name="specials"),
Expand Down
6 changes: 6 additions & 0 deletions core/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import django.db.models.fields
from cachetools import TTLCache, cached
from django.conf import settings

USER_AGENT = "brasil.io-backend"

Expand Down Expand Up @@ -160,6 +161,11 @@ def get_apoiase_donors(campain_id):
return donors


@cached(cache=TTLCache(maxsize=100, ttl=24 * 3600))
def get_cached_apoiase_donors():
return get_apoiase_donors(settings.APOIASE_PROJECT_ID)


def ratelimit_key(group, request):
ip = request.META.get("HTTP_CF_CONNECTING_IP", "").strip()
if not ip:
Expand Down
24 changes: 17 additions & 7 deletions core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from core.forms import ContactForm, DatasetSearchForm
from core.models import Dataset, Table
from core.templatetags.utils import obfuscate
from core.util import cached_http_get_json
from core.util import cached_http_get_json, get_cached_apoiase_donors
from utils.file_info import human_readable_size


Expand Down Expand Up @@ -105,7 +105,12 @@ def dataset_detail(request, slug, tablename=""):

if not tablename:
tablename = dataset.get_default_table().name
return redirect(reverse("core:dataset-table-detail", kwargs={"slug": slug, "tablename": tablename},))
return redirect(
reverse(
"core:dataset-table-detail",
kwargs={"slug": slug, "tablename": tablename},
)
)

try:
allow_hidden = request.user.is_superuser
Expand Down Expand Up @@ -144,10 +149,7 @@ def dataset_detail(request, slug, tablename=""):
if not any([query, search_query]) or not user_agent or block_agent:
# User trying to download a CSV without custom filters or invalid
# user-agent specified.
context = {
"html_code_snippet": "400-csv-without-filters.html",
"download_url": table.version.download_url,
}
context = {"html_content": "400-csv-without-filters.html", "download_url": table.version.download_url}
return render(request, "404.html", context, status=400)

if all_data.count() > settings.CSV_EXPORT_MAX_ROWS:
Expand All @@ -159,7 +161,8 @@ def dataset_detail(request, slug, tablename=""):
writer = csv.writer(pseudo_buffer, dialect=csv.excel)
csv_rows = queryset_to_csv(all_data, fields)
response = StreamingHttpResponse(
(writer.writerow(row) for row in csv_rows), content_type="text/csv;charset=UTF-8",
(writer.writerow(row) for row in csv_rows),
content_type="text/csv;charset=UTF-8",
)
response["Content-Disposition"] = 'attachment; filename="{}"'.format(filename)
response.encoding = "UTF-8"
Expand Down Expand Up @@ -231,3 +234,10 @@ def dataset_tables_files_detail(request, slug):
"file_list": dataset.tables_files + [sha512sums_file],
}
return render(request, "tables_files_list.html", context)


def donors(request):
page = request.GET.get("page", 1)
paginator = Paginator(get_cached_apoiase_donors(), 25)
data = paginator.page(page)
return render(request, "donors.html", {"donors": data})
1 change: 1 addition & 0 deletions env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ DATA_URL="https://docs.google.com/spreadsheets/d/1-hw07Q7PBGlz2QjOifkwM3T8406Oqs
DEBUG=True
DEBUG_SQL=True
PRODUCTION=False
APOIASE_PROJECT_ID=5ab97be3c3f083c623a26742
SECRET_KEY=012345678901234567890123456789
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=localhost
Expand Down
Binary file added static/img/defaultimgavatar.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
84 changes: 84 additions & 0 deletions static/js/infinite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*!
Waypoints Infinite Scroll Shortcut - 4.0.0
Copyright © 2011-2015 Caleb Troughton
Licensed under the MIT license.
https://github.com/imakewebthings/waypoints/blob/master/licenses.txt
*/
(function() {
'use strict'

var $ = window.jQuery
var Waypoint = window.Waypoint

/* http://imakewebthings.com/waypoints/shortcuts/infinite-scroll */
function Infinite(options) {
this.options = $.extend({}, Infinite.defaults, options)
this.container = this.options.element
if (this.options.container !== 'auto') {
this.container = this.options.container
}
this.$container = $(this.container)
this.$more = $(this.options.more)

if (this.$more.length) {
this.setupHandler()
this.waypoint = new Waypoint(this.options)
}
}

/* Private */
Infinite.prototype.setupHandler = function() {
this.options.handler = $.proxy(function() {
this.options.onBeforePageLoad()
this.destroy()
this.$container.addClass(this.options.loadingClass)

$.get($(this.options.more).attr('href'), $.proxy(function(data) {
var $data = $($.parseHTML(data))
var $newMore = $data.find(this.options.more)

var $items = $data.find(this.options.items)
if (!$items.length) {
$items = $data.filter(this.options.items)
}

this.$container.append($items)
this.$container.removeClass(this.options.loadingClass)

if (!$newMore.length) {
$newMore = $data.filter(this.options.more)
}
if ($newMore.length) {
this.$more.replaceWith($newMore)
this.$more = $newMore
this.waypoint = new Waypoint(this.options)
}
else {
this.$more.remove()
}

this.options.onAfterPageLoad($items)
}, this))
}, this)
}

/* Public */
Infinite.prototype.destroy = function() {
if (this.waypoint) {
this.waypoint.destroy()
}
}

Infinite.defaults = {
container: 'auto',
items: '.infinite-item',
more: '.infinite-more-link',
offset: 'bottom-in-view',
loadingClass: 'infinite-loading',
onBeforePageLoad: $.noop,
onAfterPageLoad: $.noop
}

Waypoint.Infinite = Infinite
}())
;
Loading