Skip to content

Commit

Permalink
Merge branch 'feature-floats'
Browse files Browse the repository at this point in the history
Conflicts:
	docs/configuration.rst
  • Loading branch information
george.whewell committed Jan 22, 2015
2 parents 13a05ac + 7b67cb0 commit dbef935
Show file tree
Hide file tree
Showing 11 changed files with 298 additions and 82 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ docs/_build

# Coverage
/htmlcov
.DS_Store
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
language: python

install:
- pip install tox
- pip install tox coveralls

script:
- tox
Expand Down
50 changes: 34 additions & 16 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,52 @@
django-sheets
=============================

Use Google Sheets as context variables in Django templates

.. image:: https://badge.fury.io/py/django-sheets.png
:target: https://badge.fury.io/py/django-sheets

.. image:: https://travis-ci.org/georgewhewell/django-sheets.png?branch=master
:target: https://travis-ci.org/georgewhewell/django-sheets

.. image:: https://coveralls.io/repos/georgewhewell/django-sheets/badge.png
:target: https://coveralls.io/r/georgewhewell/django-sheets

Use Google Sheets as context variables in Django templates
.. image:: https://coveralls.io/repos/georgewhewell/django-sheets/badge.png?branch=master
:target: https://coveralls.io/r/georgewhewell/django-sheets?branch=master

.. image:: https://requires.io/github/georgewhewell/django-sheets/requirements.svg?branch=master
:target: https://requires.io/github/georgewhewell/django-sheets/requirements/?branch=master
:alt: Requirements Status

Documentation
-------------
Usage
_____________

The full documentation is at https://django-sheets.readthedocs.org.
In your template::

Quickstart
----------
{% load sheets %}
{% csv "1uPsdcGUnUsf3d2xGHRGUUb7_k5IQPtBvfQY61u8Z8wE" as csv_data %}
<table>
{% for row in csv_data %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</td>
</table>
{% endfor %}

Install django-sheets::
View the output, you should see

pip install django-sheets
================================= ======================= =============== =======================
Origin (English) Name (English) Origin (Native) Name (Native)
Australia Nicole Kidman Australia Nicole Kidman
Austria Johann Strauss Österreich Johann Strauß
Belgium (Flemish) Rene Magritte België René Magritte
Belgium (French) Rene Magritte Belgique René Magritte
Belgium (German) Rene Magritte Belgien René Magritte
================================= ======================= =============== =======================

Then use it in a project::

import django-sheets

Features
--------
Documentation
-------------

* TODO
Documentation is available at https://django-sheets.readthedocs.org.
5 changes: 1 addition & 4 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@
Welcome to django-sheets's documentation!
=================================================================

Contents:

.. toctree::
:maxdepth: 2

readme
installation
configuration
usage
contributing
authors
history
52 changes: 35 additions & 17 deletions docs/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ Usage

To use django-sheets, you need to have a key to a publically-accessible
Google Sheets spreadsheet. To find it, open your sheet and select
File -> Publish to the web.
*File* -> *Share*.
Click *Get sharable link* from the dialog. You'll find the 44-character key as
part of the URL.

Press Share, and select the link. You'll find the 44-character key as
part of the link. For example, the sample link:

https://docs.google.com/spreadsheets/d/**1bJNR7SLqpzWJNvstNcFR4gtS-M7Bmn0D1X2lGTJPvGM**/pubhtml
For example, the sample link ``https://docs.google.com/spreadsheets/d/1bJNR7SLqpzWJNvstNcFR4gtS-M7Bmn0D1X2lGTJPvGM/pubhtml``
has key ``1bJNR7SLqpzWJNvstNcFR4gtS-M7Bmn0D1X2lGTJPvGM``

Load the django-sheets template tags in your template::

Expand All @@ -22,16 +22,34 @@ Assign the CSV data to a variable using the ``{% csv %}`` tag::
Try it using the sample key above::

{% load sheets %}
{% csv "1bJNR7SLqpzWJNvstNcFR4gtS-M7Bmn0D1X2lGTJPvGM" as uk500 %}
{% csv "1uPsdcGUnUsf3d2xGHRGUUb7_k5IQPtBvfQY61u8Z8wE" as csv_data %}
<table>
{% for row in uk500 %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</td>
{% endfor %}

View the output, you should see::

bleh
<thead>
<tr>
{% for header in data.headers %}
<th>{{ header }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in data.rows %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>

View the output, you should see

================================= ======================= ==================== =======================
**Origin (English)** **Name (English)** **Origin (Native)** **Name (Native)**
Australia Nicole Kidman Australia Nicole Kidman
Austria Johann Strauss Österreich Johann Strauß
Belgium (Flemish) Rene Magritte België René Magritte
Belgium (French) Rene Magritte Belgique René Magritte
Belgium (German) Rene Magritte Belgien René Magritte
================================= ======================= ==================== =======================
1 change: 0 additions & 1 deletion requirements-test.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
coverage
coveralls
mock>=1.0.1
nose>=1.3.0
django-nose>=1.3
Expand Down
86 changes: 64 additions & 22 deletions sheets/templatetags/sheets.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
from __future__ import unicode_literals

from django import template
from django.conf import settings
from django.core.cache import cache
from django.utils.encoding import force_str, force_text
from django.utils.functional import cached_property

import csv
import logging
Expand All @@ -11,33 +16,70 @@
gdocs_format = \
'https://docs.google.com/spreadsheets/d/{key}/export?format=csv&id={key}'

CACHE_TIMEOUT = getattr(settings, 'SHEETS_CACHE_TIMEOUT', 300)
CACHE_KEY = 'django-sheets-{key}'

def get_sheet(key):
try:
response = requests.get(gdocs_format.format(key=key))
response.raise_for_status()
return response
except requests.exceptions.RequestException as error:
logger.error("Error fetching url: %s" % error)

class Sheet(object):

def read_csv(csv_content):
return csv.reader(
csv_content.splitlines(),
delimiter=str(','),
quotechar=str('"'),
quoting=csv.QUOTE_MINIMAL,
)
def __init__(self, key):
if not key:
raise RuntimeError('Sheet key not supplied')
self.key = key

def __len__(self):
return len(self.data)

@register.assignment_tag(name='csv')
def csv_tag(key):
if not key:
raise RuntimeError('Sheet key not supplied')
def __iter__(self):
return iter(self.data)

def headers(self):
return self.data[0] if self.data else []

def rows(self):
return self.data[1:] if len(self) > 1 else []

def _fetch_sheet(self, key):
try:
response = requests.get(gdocs_format.format(key=key))
response.raise_for_status()
return force_str(response.content)
except requests.HTTPError as exp:
logger.error('Error fetching spreadsheet: %s' % exp)
return force_str('')

def fetch_sheet(self, key):
cache_enabled = not getattr(settings, 'SHEETS_CACHE_DISABLED', False)
if cache_enabled:
cache_key = CACHE_KEY.format(key=key)
cached_output = cache.get(cache_key)

if cached_output is not None:
return cached_output

response_data = get_sheet(key)
sheet = self._fetch_sheet(key)

if response_data is None:
return None
if cache_enabled:
cache.set(cache_key, sheet, CACHE_TIMEOUT)

return read_csv(response_data.text)
return sheet

@cached_property
def data(self):
sheet = self.fetch_sheet(self.key)
reader = csv.reader(
sheet.splitlines(),
delimiter=str(','),
quotechar=str('"'),
quoting=csv.QUOTE_MINIMAL,
)
return [[force_text(cell) for cell in row] for row in reader]


class ExplicitNone:
pass


@register.assignment_tag(name='csv')
def csv_tag(key):
return Sheet(key)
2 changes: 1 addition & 1 deletion tests/sample_output.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<table><tr><td>first_name</td><td>last_name</td><td>company_name</td><td>address</td><td>city</td><td>county</td><td>postal</td><td>phone1</td><td>phone2</td><td>email</td><td>web</td></tr><tr><td>Aleshia</td><td>Tomkiewicz</td><td>Alan D Rosenburg Cpa Pc</td><td>14 Taylor St</td><td>St. Stephens Ward</td><td>Kent</td><td>CT2 7PP</td><td>01835-703597</td><td>01944-369967</td><td>atomkiewicz@hotmail.com</td><td>http://www.alandrosenburgcpapc.co.uk</td></tr><tr><td>Evan</td><td>Zigomalas</td><td>Cap Gemini America</td><td>5 Binney St</td><td>Abbey Ward</td><td>Buckinghamshire</td><td>HP11 2AX</td><td>01937-864715</td><td>01714-737668</td><td>evan.zigomalas@gmail.com</td><td>http://www.capgeminiamerica.co.uk</td></tr><tr><td>France</td><td>Andrade</td><td>Elliott, John W Esq</td><td>8 Moor Place</td><td>East Southbourne and Tuckton W</td><td>Bournemouth</td><td>BH6 3BE</td><td>01347-368222</td><td>01935-821636</td><td>france.andrade@hotmail.com</td><td>http://www.elliottjohnwesq.co.uk</td></tr><tr><td>Ulysses</td><td>Mcwalters</td><td>Mcmahan, Ben L</td><td>505 Exeter Rd</td><td>Hawerby cum Beesby</td><td>Lincolnshire</td><td>DN36 5RP</td><td>01912-771311</td><td>01302-601380</td><td>ulysses@hotmail.com</td><td>http://www.mcmahanbenl.co.uk</td></tr><tr><td>Tyisha</td><td>Veness</td><td>Champagne Room</td><td>5396 Forth Street</td><td>Greets Green and Lyng Ward</td><td>West Midlands</td><td>B70 9DT</td><td>01547-429341</td><td>01290-367248</td><td>tyisha.veness@hotmail.com</td><td>http://www.champagneroom.co.uk</td></tr><tr><td>Eric</td><td>Rampy</td><td>Thompson, Michael C Esq</td><td>9472 Lind St</td><td>Desborough</td><td>Northamptonshire</td><td>NN14 2GH</td><td>01969-886290</td><td>01545-817375</td><td>erampy@rampy.co.uk</td><td>http://www.thompsonmichaelcesq.co.uk</td></tr><tr><td>Marg</td><td>Grasmick</td><td>Wrangle Hill Auto Auct &amp; Slvg</td><td>7457 Cowl St #70</td><td>Bargate Ward</td><td>Southampton</td><td>SO14 3TY</td><td>01865-582516</td><td>01362-620532</td><td>marg@hotmail.com</td><td>http://www.wranglehillautoauctslvg.co.uk</td></tr><tr><td>Laquita</td><td>Hisaw</td><td>In Communications Inc</td><td>20 Gloucester Pl #96</td><td>Chirton Ward</td><td>Tyne &amp; Wear</td><td>NE29 7AD</td><td>01746-394243</td><td>01590-982428</td><td>laquita@yahoo.com</td><td>http://www.incommunicationsinc.co.uk</td></tr><tr><td>Lura</td><td>Manzella</td><td>Bizerba Usa Inc</td><td>929 Augustine St</td><td>Staple Hill Ward</td><td>South Gloucestershire</td><td>BS16 4LL</td><td>01907-538509</td><td>01340-713951</td><td>lura@hotmail.com</td><td>http://www.bizerbausainc.co.uk</td></tr></table>
<html><head><meta charset="utf-8"></head><table><thead><tr><th>Origin (English)</th><th>Name (English)</th><th>Origin (Native)</th><th>Name (Native)</th></tr></thead><tbody><tr><td>Australia</td><td>Nicole Kidman</td><td>Australia</td><td>Nicole Kidman</td></tr><tr><td>Austria</td><td>Johann Strauss</td><td>Österreich</td><td>Johann Strauß</td></tr><tr><td>Belgium (Flemish)</td><td>Rene Magritte</td><td>België</td><td>René Magritte</td></tr><tr><td>Belgium (French)</td><td>Rene Magritte</td><td>Belgique</td><td>René Magritte</td></tr><tr><td>Belgium (German)</td><td>Rene Magritte</td><td>Belgien</td><td>René Magritte</td></tr><tr><td>Bhutan</td><td>Gonpo Dorji</td><td>འབྲུག་ཡུལ།</td><td>མགོན་པོ་རྡོ་རྗེ།</td></tr><tr><td>Canada</td><td>Celine Dion</td><td>Canada</td><td>Céline Dion</td></tr><tr><td>Canada - Nunavut (Inuktitut)</td><td>Susan Aglukark</td><td>ᓄᓇᕗᒻᒥᐅᑦ</td><td>ᓱᓴᓐ ᐊᒡᓗᒃᑲᖅ</td></tr><tr><td>Democratic People&#39;s Rep. of Korea</td><td>LEE Sol-Hee</td><td>조선 민주주의 인민 공화국</td><td>이설희</td></tr><tr><td>Denmark</td><td>Soren Hauch-Fausboll</td><td>Danmark</td><td>Søren Hauch-Fausbøll</td></tr><tr><td>Denmark</td><td>Soren Kierkegaard</td><td>Danmark</td><td>Søren Kierkegård</td></tr><tr><td>Egypt</td><td>Abdel Halim Hafez</td><td>ﻣﺼﺮ</td><td>ﻋﺑﺪﺍﻠﺣﻟﻳﻢ ﺤﺎﻓﻅ</td></tr><tr><td>Egypt</td><td>Om Kolthoum</td><td>ﻣﺼﺮ</td><td>ﺃﻡ ﻛﻟﺛﻭﻡ</td></tr><tr><td>Eritrea</td><td>Berhane Zeray</td><td>ብርሃነ ዘርኣይ</td><td>ኤርትራ</td></tr><tr><td>Ethiopia</td><td>Haile Gebreselassie</td><td>ኃይሌ ገብረሥላሴ</td><td>ኢትዮጵያ</td></tr><tr><td>France</td><td>Gerard Depardieu</td><td>France</td><td>Gérard Depardieu</td></tr><tr><td>France</td><td>Jean Reno</td><td>France</td><td>Jean Réno</td></tr><tr><td>France</td><td>Camille Saint-Saens</td><td>France</td><td>Camille Saint-Saëns</td></tr><tr><td>France</td><td>Mylene Demongeot</td><td>France</td><td>Mylène Demongeot</td></tr><tr><td>France</td><td>Francois Truffaut</td><td>France</td><td>François Truffaut</td></tr><tr><td>France (Braille)</td><td>Louis Braille</td><td>⠋⠗⠁⠝⠉⠑</td><td>⠇⠕⠥⠊⠎⠀&lt;BR&gt;⠃⠗⠁⠊⠇⠇⠑</td></tr><tr><td>Georgia</td><td>Eduard Shevardnadze</td><td>საქართველო</td><td>ედუარდ შევარდნაძე</td></tr><tr><td>Germany</td><td>Rudi Voeller</td><td>Deutschland</td><td>Rudi Völler</td></tr><tr><td>Germany</td><td>Walter Schultheiss</td><td>Deutschland</td><td>Walter Schultheiß</td></tr><tr><td>Greece</td><td>Giorgos Dalaras</td><td>Ελλάς</td><td>Γιώργος Νταλάρας</td></tr><tr><td>Iceland</td><td>Bjork Gudmundsdottir</td><td>Ísland</td><td>Björk Guðmundsdóttir</td></tr><tr><td>India (Hindi)</td><td>Madhuri Dixit</td><td>भारत</td><td>माधुरी दिछित</td></tr><tr><td>Ireland</td><td>Sinead O&#39;Connor</td><td>Éire</td><td>Sinéad O&#39;Connor</td></tr><tr><td>Israel</td><td>Yehoram Gaon</td><td>ישראל</td><td>יהורם גאון</td></tr><tr><td>Italy</td><td>Fabrizio DeAndre</td><td>Italia</td><td>Fabrizio De André</td></tr><tr><td>Japan</td><td>KUBOTA Toshinobu</td><td>日本</td><td>久保田    利伸</td></tr><tr><td>Japan</td><td>HAYASHIBARA Megumi</td><td>日本</td><td>林原 めぐみ</td></tr><tr><td>Japan</td><td>Mori Ogai</td><td>日本</td><td>森鷗外</td></tr><tr><td>Japan</td><td>Tex Texin</td><td>日本</td><td>テクス テクサン</td></tr><tr><td>Norway</td><td>Tor Age Bringsvaerd</td><td>Noreg</td><td>Tor Åge Bringsværd</td></tr><tr><td>Pakistan (Urdu)</td><td>Nusrat Fatah Ali Khan</td><td>پاکستان</td><td>نصرت فتح علی خان</td></tr><tr><td>People&#39;s Rep. of China</td><td>ZHANG Ziyi</td><td>中国</td><td>章子怡</td></tr><tr><td>People&#39;s Rep. of China</td><td>WONG Faye</td><td>中国</td><td>王菲</td></tr><tr><td>Poland</td><td>Lech Walesa</td><td>Polska</td><td>Lech Wałęsa</td></tr><tr><td>Puerto Rico</td><td>Olga Tanon</td><td>Puerto Rico</td><td>Olga Tañón</td></tr><tr><td>Rep. of China</td><td>Hsu Chi</td><td>臺灣</td><td>舒淇</td></tr><tr><td>Rep. of China</td><td>Ang Lee</td><td>臺灣</td><td>李安</td></tr><tr><td>Rep. of Korea</td><td>AHN Sung-Gi</td><td>한민국</td><td>안성기</td></tr><tr><td>Rep. of Korea</td><td>SHIM Eun-Ha</td><td>한민국</td><td>심은하</td></tr><tr><td>Russia</td><td>Mikhail Gorbachev</td><td>Россия</td><td>Михаил Горбачёв</td></tr><tr><td>Russia</td><td>Boris Grebenshchikov</td><td>Россия</td><td>Борис Гребенщиков</td></tr><tr><td>Slovenia</td><td>Frane &quot;Jezek&quot; Milcinski</td><td>Slovenija</td><td>Frane Milčinski - Ježek</td></tr><tr><td>Syracuse (Sicily)</td><td>Archimedes</td><td>Συρακούσα</td><td>Ἀρχιμήδης</td></tr><tr><td>Thailand</td><td>Thongchai McIntai</td><td>ประเทศไทย</td><td>ธงไชย แม็คอินไตย์</td></tr><tr><td>U.S.A.</td><td>Brad Pitt</td><td>U.S.A.</td><td>Brad Pitt</td></tr><tr><td>Yugoslavia (Cyrillic)</td><td>Djordje Balasevic</td><td>Југославија</td><td>Ђорђе Балашевић</td></tr><tr><td>Yugoslavia (Latin)</td><td>Djordje Balasevic</td><td>Jugoslavija</td><td>Đorđe Balašević</td></tr></table></html>

0 comments on commit dbef935

Please sign in to comment.